summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp80
-rw-r--r--apex/jobscheduler/OWNERS6
-rw-r--r--apex/jobscheduler/README_js-mainline.md63
-rw-r--r--apex/jobscheduler/framework/Android.bp29
-rw-r--r--apex/jobscheduler/framework/java/android/app/JobSchedulerImpl.java (renamed from core/java/android/app/JobSchedulerImpl.java)7
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/IJobCallback.aidl (renamed from core/java/android/app/job/IJobCallback.aidl)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/IJobScheduler.aidl (renamed from core/java/android/app/job/IJobScheduler.aidl)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/IJobService.aidl (renamed from core/java/android/app/job/IJobService.aidl)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobInfo.aidl (renamed from core/java/android/app/job/JobInfo.aidl)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobInfo.java (renamed from core/java/android/app/job/JobInfo.java)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobParameters.aidl (renamed from core/java/android/app/job/JobParameters.aidl)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobParameters.java (renamed from core/java/android/app/job/JobParameters.java)5
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobScheduler.java (renamed from core/java/android/app/job/JobScheduler.java)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java (renamed from core/java/android/app/job/JobSchedulerFrameworkInitializer.java)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobService.java (renamed from core/java/android/app/job/JobService.java)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobServiceEngine.java (renamed from core/java/android/app/job/JobServiceEngine.java)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobSnapshot.aidl (renamed from core/java/android/app/job/JobSnapshot.aidl)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobSnapshot.java (renamed from core/java/android/app/job/JobSnapshot.java)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobWorkItem.aidl (renamed from core/java/android/app/job/JobWorkItem.aidl)0
-rw-r--r--apex/jobscheduler/framework/java/android/app/job/JobWorkItem.java (renamed from core/java/android/app/job/JobWorkItem.java)0
-rw-r--r--apex/jobscheduler/framework/java/com/android/server/job/JobSchedulerInternal.java (renamed from core/java/com/android/server/job/JobSchedulerInternal.java)0
-rw-r--r--api/current.txt1
-rw-r--r--cmds/bootanimation/bootanim.rc1
-rw-r--r--cmds/statsd/src/atoms.proto70
-rw-r--r--config/boot-profile.txt1781
-rw-r--r--core/java/android/accessibilityservice/AccessibilityService.java51
-rw-r--r--core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl2
-rw-r--r--core/java/android/app/ActivityThread.java135
-rw-r--r--core/java/android/app/Instrumentation.java7
-rw-r--r--core/java/android/app/UiAutomation.java2
-rw-r--r--core/java/android/app/slice/SliceProvider.java20
-rw-r--r--core/java/android/content/pm/UserInfo.java71
-rw-r--r--core/java/android/net/util/MultinetworkPolicyTracker.java35
-rw-r--r--core/java/android/os/Debug.java62
-rw-r--r--core/java/android/os/UserManagerInternal.java7
-rw-r--r--core/java/android/provider/Settings.java80
-rw-r--r--core/java/android/provider/SettingsValidators.java46
-rw-r--r--core/java/android/provider/TEST_MAPPING12
-rw-r--r--core/java/android/widget/AbsListView.java6
-rw-r--r--core/java/com/android/internal/content/PackageHelper.java87
-rw-r--r--core/java/com/android/internal/os/AtomicDirectory.java165
-rw-r--r--core/jni/Android.bp1
-rw-r--r--core/jni/AndroidRuntime.cpp2
-rwxr-xr-xcore/jni/android/graphics/Bitmap.cpp7
-rw-r--r--core/jni/com_android_internal_os_AtomicDirectory.cpp66
-rw-r--r--core/proto/android/server/activitymanagerservice.proto18
-rw-r--r--core/proto/android/stats/otaupdate/updateengine_enums.proto82
-rw-r--r--core/tests/coretests/src/android/provider/SettingsBackupTest.java13
-rw-r--r--core/tests/coretests/src/android/provider/SettingsValidatorsTest.java49
-rw-r--r--data/etc/privapp-permissions-platform.xml2
-rw-r--r--libs/hostgraphics/Android.bp7
-rw-r--r--libs/hostgraphics/Fence.cpp23
-rw-r--r--libs/hostgraphics/HostBufferQueue.cpp69
-rw-r--r--libs/hostgraphics/PublicFormat.cpp33
-rw-r--r--libs/hostgraphics/gui/BufferItem.h65
-rw-r--r--libs/hostgraphics/gui/BufferItemConsumer.h75
-rw-r--r--libs/hostgraphics/gui/BufferQueue.h37
-rw-r--r--libs/hostgraphics/gui/ConsumerBase.h37
-rw-r--r--libs/hostgraphics/gui/IGraphicBufferConsumer.h65
-rw-r--r--libs/hostgraphics/gui/IGraphicBufferProducer.h2
-rw-r--r--libs/hostgraphics/ui/Fence.h72
-rw-r--r--libs/hostgraphics/ui/GraphicBuffer.h64
-rw-r--r--location/lib/Android.bp2
-rw-r--r--media/java/android/media/Metadata.java13
-rw-r--r--media/lib/signer/Android.bp2
-rw-r--r--packages/SettingsProvider/Android.bp16
-rw-r--r--packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java205
-rw-r--r--packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java272
-rw-r--r--packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java188
-rw-r--r--packages/SystemUI/src/com/android/systemui/SystemUIFactory.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java30
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java5
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java21
-rw-r--r--packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java13
-rw-r--r--packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java122
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java29
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java210
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java10
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java97
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java7
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java25
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java14
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java6
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/util/Utils.java14
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java8
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java15
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java8
-rw-r--r--services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java74
-rw-r--r--services/art-profile-boot1046
-rw-r--r--services/autofill/java/com/android/server/autofill/Session.java22
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java13
-rw-r--r--services/autofill/java/com/android/server/autofill/ui/SaveUi.java37
-rw-r--r--services/backup/java/com/android/server/backup/BackupManagerService.java57
-rw-r--r--services/backup/java/com/android/server/backup/Trampoline.java71
-rw-r--r--services/backup/java/com/android/server/backup/UserBackupManagerService.java3
-rw-r--r--services/core/java/com/android/server/GraphicsStatsService.java2
-rw-r--r--services/core/java/com/android/server/SystemService.java79
-rw-r--r--services/core/java/com/android/server/SystemServiceManager.java39
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java228
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java15
-rw-r--r--services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java6
-rw-r--r--services/core/java/com/android/server/media/MediaSessionService.java20
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java119
-rw-r--r--services/core/java/com/android/server/pm/DumpState.java1
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java7
-rw-r--r--services/core/java/com/android/server/pm/Settings.java7
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java67
-rw-r--r--services/core/java/com/android/server/tv/TvRemoteProviderProxy.java22
-rw-r--r--services/core/java/com/android/server/tv/TvRemoteService.java16
-rw-r--r--services/core/java/com/android/server/tv/UinputBridge.java12
-rw-r--r--services/core/java/com/android/server/wm/ActivityStack.java28
-rw-r--r--services/core/jni/com_android_server_tv_TvUinputBridge.cpp18
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java6
-rw-r--r--services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java460
-rw-r--r--services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java175
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowEnvironment.java50
-rw-r--r--services/robotests/src/com/android/server/testing/shadows/ShadowUserManager.java33
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java43
-rw-r--r--services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java63
-rw-r--r--telecomm/java/android/telecom/Logging/Session.java70
-rw-r--r--telephony/java/android/provider/Telephony.java2
-rwxr-xr-xtelephony/java/android/telephony/CarrierConfigManager.java25
-rw-r--r--telephony/java/android/telephony/ims/ImsException.java6
-rw-r--r--telephony/java/android/telephony/ims/aidl/IImsRcsFeature.aidl30
-rw-r--r--telephony/java/android/telephony/ims/aidl/IRcsFeatureListener.aidl42
-rw-r--r--telephony/java/android/telephony/ims/feature/ImsFeature.java117
-rw-r--r--telephony/java/android/telephony/ims/feature/MmTelFeature.java22
-rw-r--r--telephony/java/android/telephony/ims/feature/RcsFeature.java253
-rw-r--r--telephony/java/android/telephony/ims/stub/RcsCapabilityExchange.java37
-rw-r--r--telephony/java/android/telephony/ims/stub/RcsPresenceExchangeImplBase.java111
-rw-r--r--telephony/java/android/telephony/ims/stub/RcsSipOptionsImplBase.java48
-rw-r--r--test-mock/Android.bp2
-rw-r--r--tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java7
144 files changed, 6068 insertions, 2575 deletions
diff --git a/Android.bp b/Android.bp
index 4ef6c5e82a5d..fe0d5dd82940 100644
--- a/Android.bp
+++ b/Android.bp
@@ -26,7 +26,35 @@
// READ ME: ########################################################
java_defaults {
+ name: "framework-aidl-export-defaults",
+
+ aidl: {
+ export_include_dirs: [
+ // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
+ "core/java",
+ "graphics/java",
+ "location/java",
+ "lowpan/java",
+ "media/java",
+ "media/apex/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",
+ "keystore/java",
+ "rs/java",
+ ],
+ },
+}
+
+java_defaults {
name: "framework-defaults",
+ defaults: ["framework-aidl-export-defaults"],
installable: true,
srcs: [
@@ -78,9 +106,6 @@ java_defaults {
"core/java/android/app/ISearchManagerCallback.aidl",
"core/java/android/app/IServiceConnection.aidl",
"core/java/android/app/IStopUserCallback.aidl",
- "core/java/android/app/job/IJobCallback.aidl",
- "core/java/android/app/job/IJobScheduler.aidl",
- "core/java/android/app/job/IJobService.aidl",
"core/java/android/app/ITransientNotification.aidl",
"core/java/android/app/IUidObserver.aidl",
"core/java/android/app/IUiAutomationConnection.aidl",
@@ -566,6 +591,7 @@ java_defaults {
"telephony/java/android/telephony/ims/aidl/IImsServiceControllerListener.aidl",
"telephony/java/android/telephony/ims/aidl/IImsSmsListener.aidl",
"telephony/java/android/telephony/ims/aidl/IRcsMessage.aidl",
+ "telephony/java/android/telephony/ims/aidl/IRcsFeatureListener.aidl",
"telephony/java/android/telephony/mbms/IMbmsDownloadSessionCallback.aidl",
"telephony/java/android/telephony/mbms/IMbmsStreamingSessionCallback.aidl",
"telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl",
@@ -695,34 +721,10 @@ java_defaults {
"core/java/com/android/server/DropboxLogTags.logtags",
"core/java/org/chromium/arc/EventLogTags.logtags",
- ":apex-properties",
- ":platform-properties",
-
":framework-statslog-gen",
],
aidl: {
- export_include_dirs: [
- // From build/make/core/pathmap.mk FRAMEWORK_BASE_SUBDIRS
- "core/java",
- "graphics/java",
- "location/java",
- "lowpan/java",
- "media/java",
- "media/apex/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",
- "keystore/java",
- "rs/java",
- ],
-
include_dirs: [
"system/update_engine/binder_bindings",
"frameworks/native/aidl/binder",
@@ -786,6 +788,9 @@ java_defaults {
"android.hardware.vibrator-V1.3-java",
"android.hardware.wifi-V1.0-java-constants",
"devicepolicyprotosnano",
+
+ "com.android.sysprop.apex",
+ "PlatformProperties",
],
required: [
@@ -838,7 +843,7 @@ filegroup {
}
java_library {
- name: "framework",
+ name: "framework-minus-apex",
defaults: ["framework-defaults"],
javac_shard_size: 150,
required: [
@@ -848,6 +853,17 @@ java_library {
}
java_library {
+ name: "framework",
+ defaults: ["framework-aidl-export-defaults"],
+ installable: true,
+ static_libs: [
+ "framework-minus-apex",
+ "jobscheduler-framework",
+ ],
+ sdk_version: "core_platform",
+}
+
+java_library {
name: "framework-annotation-proc",
defaults: ["framework-defaults"],
installable: false,
@@ -1371,8 +1387,9 @@ stubs_defaults {
":updatable-media-srcs-without-aidls",
"test-mock/src/**/*.java",
"test-runner/src/**/*.java",
+ ":jobscheduler-framework-source",
],
- srcs_lib: "framework",
+ srcs_lib: "framework-minus-apex",
srcs_lib_whitelist_dirs: frameworks_base_subdirs,
srcs_lib_whitelist_pkgs: packages_to_document,
libs: framework_docs_only_libs,
@@ -1428,8 +1445,9 @@ stubs_defaults {
":opt-net-voip-srcs",
":core_public_api_files",
":updatable-media-srcs-without-aidls",
+ ":jobscheduler-framework-source",
],
- srcs_lib: "framework",
+ srcs_lib: "framework-minus-apex",
srcs_lib_whitelist_dirs: frameworks_base_subdirs,
srcs_lib_whitelist_pkgs: packages_to_document,
local_sourcepaths: frameworks_base_subdirs,
@@ -1810,6 +1828,7 @@ droidstubs {
last_released: {
api_file: ":last-released-public-api",
removed_api_file: "api/removed.txt",
+ baseline_file: ":public-api-incompatibilities-with-last-released",
},
},
jdiff_enabled: true,
@@ -1835,6 +1854,7 @@ droidstubs {
last_released: {
api_file: ":last-released-system-api",
removed_api_file: "api/system-removed.txt",
+ baseline_file: ":system-api-incompatibilities-with-last-released"
},
},
jdiff_enabled: true,
diff --git a/apex/jobscheduler/OWNERS b/apex/jobscheduler/OWNERS
new file mode 100644
index 000000000000..d004eed2a0db
--- /dev/null
+++ b/apex/jobscheduler/OWNERS
@@ -0,0 +1,6 @@
+yamasani@google.com
+omakoto@google.com
+ctate@android.com
+ctate@google.com
+kwekua@google.com
+suprabh@google.com \ No newline at end of file
diff --git a/apex/jobscheduler/README_js-mainline.md b/apex/jobscheduler/README_js-mainline.md
index b5fea5e0a4df..c1ad666e3e05 100644
--- a/apex/jobscheduler/README_js-mainline.md
+++ b/apex/jobscheduler/README_js-mainline.md
@@ -6,46 +6,33 @@ See also:
- http://go/moving-js-code-for-mainline
- http://go/jobscheduler-code-dependencies-2019-07
-- [ ] Move client code
- - [ ] Move code
- - [ ] Make build file
- - [ ] "m jobscheduler-framework" pass
- - [ ] "m framework" pass
- - [ ] "m service" pass
-- [ ] Move proto
- - No, couldn't do it, because it's referred to by incidentd_proto
-- [ ] Move service
- - [X] Move code (done, but it won't compile yet)
- - [X] Make build file
- - [X] "m service" pass
- - [X] "m jobscheduler-service" pass
- - To make it pass, jobscheduler-service has to link services.jar too. Many dependencies.
- [ ] Move this into `frameworks/apex/jobscheduler/...`. Currently it's in `frameworks/base/apex/...`
because `frameworks/apex/` is not a part of any git projects. (and also working on multiple
projects is a pain.)
+## Current structure
-## Problems
-- Couldn't move dumpsys proto files. They are used by incidentd_proto, which is in the platform
- (not updatable).
- - One idea is *not* to move the proto files into apex but keep them in the platform.
- Then we make sure to extend the proto files in a backward-compat way (which we do anyway)
- and always use the latest file from the JS apex.
-
-- There are a lot of build tasks that use "framework.jar". (Examples: hiddenapi-greylist.txt check,
- update-api / public API check and SDK stub (android.jar) creation)
- To make the downstream build modules buildable, we need to include js-framework.jar in
- framework.jar. However it turned out to be tricky because soong has special logic for "framework"
- and "framework.jar".
- i.e. Conceptually, we can do it by renaming `framework` to `framework-minus-jobscheduler`, build
- `jobscheduler-framework` with `framework-minus-jobscheduler`, and create `framework` by merging
- `framework-minus-jobscheduler` and `jobscheduler-framework`.
- However it didn't quite work because of the special casing.
-
-- JS-service uses a lot of other code in `services`, so it needs to link services.core.jar e.g.
- - Common system service code, e.g. `com.android.server.SystemService`
- - Common utility code, e.g. `FgThread` and `IoThread`
- - Other system services such as `DeviceIdleController` and `ActivityManagerService`
- - Server side singleton. `AppStateTracker`
- - `DeviceIdleController.LocalService`, which is a local service but there's no interface class.
- - `XxxInternal` interfaces that are not in the framework side. -> We should be able to move them.
+- JS service side classes are put in `jobscheduler-service.jar`.
+It's *not* included in services.jar, and instead it's put in the system server classpath,
+which currently looks like the following:
+`SYSTEMSERVERCLASSPATH=/system/framework/services.jar:/system/framework/jobscheduler-service.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jar:/system/framework/com.android.location.provider.jar`
+
+ (Note `jobscheduler-service.jar` will be put at the end in http://ag/9128109)
+
+ `SYSTEMSERVERCLASSPATH` is generated from `PRODUCT_SYSTEM_SERVER_JARS`.
+
+- JS framework side classes are put in `jobscheduler-framework.jar`,
+and the rest of the framework code is put in `framework-minus-apex.jar`,
+as of http://ag/9145619.
+
+ However these jar files are *not* put on the device. We still generate
+ `framework.jar` merging the two jar files, and this jar file is what's
+ put on the device and loaded by Zygote.
+
+
+This is *not* the final design. From a gerrit comment on http://ag/9145619:
+
+> This CL is just the first step, and the current state isn't not really the final form. For now we just want to have two separate jars, which makes it easier for us to analyze dependencies between them, and I wanted to minimize the change to the rest of the system. So, for example, zygote will still only have "framework.jar" in its classpath, instead of the two jars for now.
+> But yes, eventually, we won't even be able to have the monolithic "framework.jar" file because of mainline, so we need to figure out how to build the system without creating it. At that point zygote will have the two separate jar files in its classpath.
+> When we reach that point, we should revisit the naming of it, and yes, maybe the simple "framework.jar" is a good option.
+> But again, for now, I want to make this change as transparent as possible to the rest of the world.
diff --git a/apex/jobscheduler/framework/Android.bp b/apex/jobscheduler/framework/Android.bp
new file mode 100644
index 000000000000..bdb5248afcee
--- /dev/null
+++ b/apex/jobscheduler/framework/Android.bp
@@ -0,0 +1,29 @@
+filegroup {
+ name: "jobscheduler-framework-source",
+ srcs: [
+ "java/**/*.java",
+ "java/android/app/job/IJobCallback.aidl",
+ "java/android/app/job/IJobScheduler.aidl",
+ "java/android/app/job/IJobService.aidl",
+ ],
+ path: "java",
+}
+
+java_library {
+ name: "jobscheduler-framework",
+ installable: true,
+ sdk_version: "core_platform",
+
+ srcs: [
+ ":jobscheduler-framework-source",
+ ],
+
+ aidl: {
+ export_include_dirs: [
+ "java",
+ ],
+ },
+ libs: [
+ "framework-minus-apex",
+ ],
+}
diff --git a/core/java/android/app/JobSchedulerImpl.java b/apex/jobscheduler/framework/java/android/app/JobSchedulerImpl.java
index 924a70809747..f59e7a4ae6ec 100644
--- a/core/java/android/app/JobSchedulerImpl.java
+++ b/apex/jobscheduler/framework/java/android/app/JobSchedulerImpl.java
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-// in android.app so ContextImpl has package access
package android.app;
import android.app.job.IJobScheduler;
@@ -27,10 +26,12 @@ import android.os.RemoteException;
import java.util.List;
-// APEX NOTE: Class path referred to by robolectric, so can't move it.
-
/**
* Concrete implementation of the JobScheduler interface
+ *
+ * Note android.app.job is the better package to put this class, but we can't move it there
+ * because that'd break robolectric. Grr.
+ *
* @hide
*/
public class JobSchedulerImpl extends JobScheduler {
diff --git a/core/java/android/app/job/IJobCallback.aidl b/apex/jobscheduler/framework/java/android/app/job/IJobCallback.aidl
index d281da037fde..d281da037fde 100644
--- a/core/java/android/app/job/IJobCallback.aidl
+++ b/apex/jobscheduler/framework/java/android/app/job/IJobCallback.aidl
diff --git a/core/java/android/app/job/IJobScheduler.aidl b/apex/jobscheduler/framework/java/android/app/job/IJobScheduler.aidl
index 3006f50e54fc..3006f50e54fc 100644
--- a/core/java/android/app/job/IJobScheduler.aidl
+++ b/apex/jobscheduler/framework/java/android/app/job/IJobScheduler.aidl
diff --git a/core/java/android/app/job/IJobService.aidl b/apex/jobscheduler/framework/java/android/app/job/IJobService.aidl
index 22ad252b9639..22ad252b9639 100644
--- a/core/java/android/app/job/IJobService.aidl
+++ b/apex/jobscheduler/framework/java/android/app/job/IJobService.aidl
diff --git a/core/java/android/app/job/JobInfo.aidl b/apex/jobscheduler/framework/java/android/app/job/JobInfo.aidl
index 7b198a8ab14d..7b198a8ab14d 100644
--- a/core/java/android/app/job/JobInfo.aidl
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.aidl
diff --git a/core/java/android/app/job/JobInfo.java b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
index 8b3b3a28f2bc..8b3b3a28f2bc 100644
--- a/core/java/android/app/job/JobInfo.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobInfo.java
diff --git a/core/java/android/app/job/JobParameters.aidl b/apex/jobscheduler/framework/java/android/app/job/JobParameters.aidl
index e7551b9ab9f2..e7551b9ab9f2 100644
--- a/core/java/android/app/job/JobParameters.aidl
+++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.aidl
diff --git a/core/java/android/app/job/JobParameters.java b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
index ecc859d8320c..150cdbc3cacf 100644
--- a/core/java/android/app/job/JobParameters.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobParameters.java
@@ -52,6 +52,11 @@ public class JobParameters implements Parcelable {
/**
* All the stop reason codes. This should be regarded as an immutable array at runtime.
+ *
+ * Note the order of these values will affect "dumpsys batterystats", and we do not want to
+ * change the order of existing fields, so adding new fields is okay but do not remove or
+ * change existing fields. When deprecating a field, just replace that with "-1" in this array.
+ *
* @hide
*/
public static final int[] JOB_STOP_REASON_CODES = {
diff --git a/core/java/android/app/job/JobScheduler.java b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
index 08b1c2b9f548..08b1c2b9f548 100644
--- a/core/java/android/app/job/JobScheduler.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobScheduler.java
diff --git a/core/java/android/app/job/JobSchedulerFrameworkInitializer.java b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
index c90b8728bf4a..c90b8728bf4a 100644
--- a/core/java/android/app/job/JobSchedulerFrameworkInitializer.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobSchedulerFrameworkInitializer.java
diff --git a/core/java/android/app/job/JobService.java b/apex/jobscheduler/framework/java/android/app/job/JobService.java
index 61afadab9b0c..61afadab9b0c 100644
--- a/core/java/android/app/job/JobService.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobService.java
diff --git a/core/java/android/app/job/JobServiceEngine.java b/apex/jobscheduler/framework/java/android/app/job/JobServiceEngine.java
index ab94da843635..ab94da843635 100644
--- a/core/java/android/app/job/JobServiceEngine.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobServiceEngine.java
diff --git a/core/java/android/app/job/JobSnapshot.aidl b/apex/jobscheduler/framework/java/android/app/job/JobSnapshot.aidl
index d40f4e39ea2e..d40f4e39ea2e 100644
--- a/core/java/android/app/job/JobSnapshot.aidl
+++ b/apex/jobscheduler/framework/java/android/app/job/JobSnapshot.aidl
diff --git a/core/java/android/app/job/JobSnapshot.java b/apex/jobscheduler/framework/java/android/app/job/JobSnapshot.java
index 2c58908a6064..2c58908a6064 100644
--- a/core/java/android/app/job/JobSnapshot.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobSnapshot.java
diff --git a/core/java/android/app/job/JobWorkItem.aidl b/apex/jobscheduler/framework/java/android/app/job/JobWorkItem.aidl
index e8fe47d07865..e8fe47d07865 100644
--- a/core/java/android/app/job/JobWorkItem.aidl
+++ b/apex/jobscheduler/framework/java/android/app/job/JobWorkItem.aidl
diff --git a/core/java/android/app/job/JobWorkItem.java b/apex/jobscheduler/framework/java/android/app/job/JobWorkItem.java
index c6631fa76494..c6631fa76494 100644
--- a/core/java/android/app/job/JobWorkItem.java
+++ b/apex/jobscheduler/framework/java/android/app/job/JobWorkItem.java
diff --git a/core/java/com/android/server/job/JobSchedulerInternal.java b/apex/jobscheduler/framework/java/com/android/server/job/JobSchedulerInternal.java
index eefb9fafd286..eefb9fafd286 100644
--- a/core/java/com/android/server/job/JobSchedulerInternal.java
+++ b/apex/jobscheduler/framework/java/com/android/server/job/JobSchedulerInternal.java
diff --git a/api/current.txt b/api/current.txt
index e11fca8c2063..9473a8403dfd 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2826,6 +2826,7 @@ package android.accessibilityservice {
method public final boolean dispatchGesture(@NonNull android.accessibilityservice.GestureDescription, @Nullable android.accessibilityservice.AccessibilityService.GestureResultCallback, @Nullable android.os.Handler);
method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
method @NonNull public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController();
+ method @NonNull public final android.accessibilityservice.AccessibilityButtonController getAccessibilityButtonController(int);
method @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) @NonNull public final android.accessibilityservice.FingerprintGestureController getFingerprintGestureController();
method @NonNull public final android.accessibilityservice.AccessibilityService.MagnificationController getMagnificationController();
method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
diff --git a/cmds/bootanimation/bootanim.rc b/cmds/bootanimation/bootanim.rc
index 469c9646a4aa..9f4f314a4324 100644
--- a/cmds/bootanimation/bootanim.rc
+++ b/cmds/bootanimation/bootanim.rc
@@ -4,4 +4,5 @@ service bootanim /system/bin/bootanimation
group graphics audio
disabled
oneshot
+ ioprio rt 0
writepid /dev/stune/top-app/tasks
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 35c4cebdcf6c..663cd55834cf 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -57,6 +57,7 @@ import "frameworks/base/core/proto/android/telephony/enums.proto";
import "frameworks/base/core/proto/android/view/enums.proto";
import "frameworks/base/core/proto/android/wifi/enums.proto";
import "frameworks/base/core/proto/android/stats/textclassifier/textclassifier_enums.proto";
+import "frameworks/base/core/proto/android/stats/otaupdate/updateengine_enums.proto";
/**
* The master atom class. This message defines all of the available
@@ -330,6 +331,8 @@ message Atom {
222 [(log_from_module) = "textclassifier"];
ExclusionRectStateChanged exclusion_rect_state_changed = 223;
BackGesture back_gesture_reported_reported = 224;
+ UpdateEngineUpdateAttemptReported update_engine_update_attempt_reported = 225;
+ UpdateEngineSuccessfulUpdateReported update_engine_successful_update_reported = 226;
}
// Pulled events will start at field 10000.
@@ -6969,3 +6972,70 @@ message LanguageDetectionEvent {
// Position of this action.
optional int32 action_index = 7;
}
+
+/**
+ * Information about an OTA update attempt by update_engine.
+ * Logged from platform/system/update_engine/metrics_reporter_android.cc
+ */
+message UpdateEngineUpdateAttemptReported {
+ // The number of attempts for the update engine to apply a given payload.
+ optional int32 attempt_number = 1;
+
+ optional android.stats.otaupdate.PayloadType payload_type = 2;
+
+ // The total time in minutes for the update engine to apply a given payload.
+ // The time is calculated by calling clock_gettime() / CLOCK_BOOTTIME; and
+ // it's increased when the system is sleeping.
+ optional int32 duration_boottime_in_minutes = 3;
+
+ // The total time in minutes for the update engine to apply a given payload.
+ // The time is calculated by calling clock_gettime() / CLOCK_MONOTONIC_RAW;
+ // and it's not increased when the system is sleeping.
+ optional int32 duration_monotonic_in_minutes = 4;
+
+ // The size of the payload in MiBs.
+ optional int32 payload_size_mib = 5;
+
+ // The attempt result reported by the update engine for an OTA update.
+ optional android.stats.otaupdate.AttemptResult attempt_result = 6;
+
+ // The error code reported by the update engine after an OTA update attempt
+ // on A/B devices.
+ optional android.stats.otaupdate.ErrorCode error_code = 7;
+
+ // The build fingerprint of the source system. The value is read from a
+ // system property when the device takes the update. e.g.
+ // Android/aosp_sailfish/sailfish:10/QP1A.190425.004/5507117:userdebug/test-keys
+ optional string source_fingerprint = 8;
+}
+
+/**
+ * Information about all the attempts the device make before finishing the
+ * successful update.
+ * Logged from platform/system/update_engine/metrics_reporter_android.cc
+ */
+message UpdateEngineSuccessfulUpdateReported {
+ // The number of attempts for the update engine to apply the payload for a
+ // successful update.
+ optional int32 attempt_count = 1;
+
+ optional android.stats.otaupdate.PayloadType payload_type = 2;
+
+ optional int32 payload_size_mib = 3;
+
+ // The total number of bytes downloaded by update_engine since the last
+ // successful update.
+ optional int32 total_bytes_downloaded_mib = 4;
+
+ // The ratio in percentage of the over-downloaded bytes compared to the
+ // total bytes needed to successfully install the update. e.g. 200 if we
+ // download 200MiB in total for a 100MiB package.
+ optional int32 download_overhead_percentage = 5;
+
+ // The total time in minutes for the update engine to apply the payload for a
+ // successful update.
+ optional int32 total_duration_minutes = 6;
+
+ // The number of reboot of the device during a successful update.
+ optional int32 reboot_count = 7;
+}
diff --git a/config/boot-profile.txt b/config/boot-profile.txt
index 57e06c23b7ec..e0e9164b3f90 100644
--- a/config/boot-profile.txt
+++ b/config/boot-profile.txt
@@ -1,642 +1,1221 @@
-Lcom/android/internal/os/RuntimeInit$MethodAndArgsCaller;->run()V
-Lcom/android/internal/os/ZygoteInit;->main([Ljava/lang/String;)V
-Lcom/android/internal/util/ConcurrentUtils$1$1;->run()V
-Lcom/android/server/SystemConfig;->getInstance()Lcom/android/server/SystemConfig;
-Lcom/android/server/SystemConfig;-><init>()V
-Lcom/android/server/SystemConfig;->readPermissions(Ljava/io/File;I)V
-Lcom/android/server/SystemConfig;->readPermissionsFromXml(Ljava/io/File;I)V
-Lcom/android/internal/os/ProcessCpuTracker;->update()V
-Lcom/android/internal/os/ProcessCpuTracker;->init()V
-Lcom/android/internal/os/ProcessCpuTracker;->collectStats(Ljava/lang/String;IZ[ILjava/util/ArrayList;)[I
-Landroid/content/pm/PackageParser$SigningDetails$Builder;->build()Landroid/content/pm/PackageParser$SigningDetails;
-Landroid/content/pm/PackageParser$SigningDetails;-><init>(Landroid/content/pm/PackageParser$SigningDetails;)V
-Landroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;I)V
-Landroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;ILandroid/util/ArraySet;[Landroid/content/pm/Signature;)V
-Landroid/content/pm/PackageParser$SigningDetails;-><init>([Landroid/content/pm/Signature;I[Landroid/content/pm/Signature;)V
+Landroid/os/Trace;->isTagEnabled(J)Z
+Lcom/android/internal/os/ZygoteInit;->preloadClasses()V
+Landroid/os/Trace;->traceBegin(JLjava/lang/String;)V
+Landroid/os/Trace;->traceEnd(J)V
+Landroid/graphics/FontListParser;->readFamily(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/text/FontConfig$Family;
+Landroid/graphics/FontListParser;->readFont(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/text/FontConfig$Font;
+Landroid/graphics/FontListParser;->readFamilies(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Landroid/text/FontConfig;
+Landroid/text/FontConfig$Font;-><init>(Ljava/lang/String;I[Landroid/graphics/fonts/FontVariationAxis;IZLjava/lang/String;)V
+Landroid/util/ContainerHelpers;->binarySearch([III)I
+Landroid/graphics/fonts/SystemFonts;->pushFamilyToFallback(Landroid/text/FontConfig$Family;Landroid/util/ArrayMap;Ljava/util/Map;Ljava/util/ArrayList;)V
+Landroid/util/ArrayMap;->indexOf(Ljava/lang/Object;I)I
+Lcom/android/internal/util/Preconditions;->checkArgument(ZLjava/lang/Object;)V
+Lcom/android/internal/util/Preconditions;->checkNotNull(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+Landroid/graphics/fonts/Font;->getStyle()Landroid/graphics/fonts/FontStyle;
Landroid/util/ArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;
Landroid/util/ArrayMap;->indexOfKey(Ljava/lang/Object;)I
-Landroid/content/pm/Signature;->getPublicKey()Ljava/security/PublicKey;
-Landroid/util/ArrayMap;->indexOf(Ljava/lang/Object;I)I
-Landroid/util/ArrayMap;->indexOfNull()I
-Landroid/util/ArrayMap;->indexOfValue(Ljava/lang/Object;)I
-Lcom/android/internal/os/ProcessCpuTracker;->getName(Lcom/android/internal/os/ProcessCpuTracker$Stats;Ljava/lang/String;)V
-Lcom/android/internal/os/ProcStatsUtil;->readTerminatedProcFile(Ljava/lang/String;B)Ljava/lang/String;
-Lcom/android/internal/os/BatteryStatsImpl;->writeAsyncLocked()V
-Lcom/android/internal/os/BatteryStatsImpl;->writeStatsLocked(Z)V
-Lcom/android/internal/os/BatteryStatsImpl;->writeSummaryToParcel(Landroid/os/Parcel;Z)V
-Landroid/util/SparseArray;->get(I)Ljava/lang/Object;
-Landroid/util/SparseArray;->get(ILjava/lang/Object;)Ljava/lang/Object;
-Lcom/android/internal/os/BatteryStatsImpl;->readLocked()V
-Lcom/android/internal/os/BatteryStatsImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V
+Landroid/util/ArrayMap;->size()I
+Landroid/util/ArrayMap;->keyAt(I)Ljava/lang/Object;
+Landroid/util/ArrayMap;->valueAt(I)Ljava/lang/Object;
Landroid/util/ArrayMap;->binarySearchHashes([III)I
-Landroid/util/ContainerHelpers;->binarySearch([III)I
-Lcom/android/internal/os/BatteryStatsImpl;->updateCpuTimeLocked(ZZ)V
-Lcom/android/internal/os/KernelCpuUidTimeReader;->readDelta(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
-Landroid/util/ArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V
-Landroid/util/ArrayMap;->putAll(Ljava/util/Map;)V
-Landroid/util/SparseArray;-><init>()V
-Landroid/util/SparseArray;-><init>(I)V
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
-Lcom/android/server/SystemConfig;->readPrivAppPermissions(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
-Landroid/content/pm/Signature;-><init>(Ljava/lang/String;)V
-Landroid/content/pm/Signature;-><init>([B)V
-Landroid/content/pm/Signature;-><init>([Ljava/security/cert/Certificate;)V
-Lcom/android/internal/os/ProcessCpuTracker$Stats;-><init>(IIZ)V
-Lcom/android/internal/os/KernelCpuProcStringReader;->asLongs(Ljava/nio/CharBuffer;[J)I
-Lcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/internal/util/XmlUtils;->nextElementWithin(Lorg/xmlpull/v1/XmlPullParser;I)Z
-Lcom/android/internal/util/ArrayUtils;->newUnpaddedObjectArray(I)[Ljava/lang/Object;
-Landroid/util/SparseArray;->put(ILjava/lang/Object;)V
-Lcom/android/internal/os/BatteryStatsImpl;->updateKernelWakelocksLocked()V
-Landroid/util/ArraySet;->add(Ljava/lang/Object;)Z
-Landroid/util/ArraySet;->addAll(Landroid/util/ArraySet;)V
-Landroid/util/ArraySet;->addAll(Ljava/util/Collection;)Z
-Lcom/android/internal/os/KernelWakelockReader;->readKernelWakelockStats(Lcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
+Landroid/text/FontConfig$Family;->getName()Ljava/lang/String;
+Landroid/graphics/fonts/SystemFonts;->createFontFamily(Ljava/lang/String;Ljava/util/List;Ljava/lang/String;ILjava/util/Map;Ljava/util/ArrayList;)Landroid/graphics/fonts/FontFamily;
+Landroid/graphics/fonts/FontFamily$Builder;->build(Ljava/lang/String;IZ)Landroid/graphics/fonts/FontFamily;
+Landroid/graphics/fonts/Font$Builder;->build()Landroid/graphics/fonts/Font;
+Landroid/text/FontConfig$Font;->getFontName()Ljava/lang/String;
+Landroid/graphics/fonts/Font$Builder;-><init>(Ljava/nio/ByteBuffer;Ljava/io/File;Ljava/lang/String;)V
+Landroid/graphics/fonts/Font$Builder;-><init>(Ljava/nio/ByteBuffer;)V
+Landroid/text/FontConfig$Font;->getWeight()I
+Landroid/graphics/fonts/Font$Builder;->setWeight(I)Landroid/graphics/fonts/Font$Builder;
+Lcom/android/internal/util/Preconditions;->checkArgument(Z)V
+Landroid/text/FontConfig$Font;->isItalic()Z
+Landroid/graphics/fonts/Font$Builder;->setSlant(I)Landroid/graphics/fonts/Font$Builder;
+Landroid/text/FontConfig$Font;->getTtcIndex()I
+Landroid/graphics/fonts/Font$Builder;->setTtcIndex(I)Landroid/graphics/fonts/Font$Builder;
+Landroid/text/FontConfig$Font;->getAxes()[Landroid/graphics/fonts/FontVariationAxis;
+Landroid/graphics/fonts/Font$Builder;->setFontVariationSettings([Landroid/graphics/fonts/FontVariationAxis;)Landroid/graphics/fonts/Font$Builder;
+Landroid/graphics/fonts/FontStyle;-><init>(II)V
+Landroid/graphics/fonts/Font;-><init>(JLjava/nio/ByteBuffer;Ljava/io/File;Landroid/graphics/fonts/FontStyle;I[Landroid/graphics/fonts/FontVariationAxis;Ljava/lang/String;Landroid/graphics/fonts/Font$1;)V
+Landroid/graphics/fonts/Font;-><init>(JLjava/nio/ByteBuffer;Ljava/io/File;Landroid/graphics/fonts/FontStyle;I[Landroid/graphics/fonts/FontVariationAxis;Ljava/lang/String;)V
+Landroid/graphics/fonts/FontFamily$Builder;->makeStyleIdentifier(Landroid/graphics/fonts/Font;)I
+Landroid/graphics/fonts/FontStyle;->getWeight()I
+Landroid/graphics/fonts/FontStyle;->getSlant()I
+Landroid/graphics/fonts/Font;->getNativePtr()J
+Landroid/graphics/fonts/SystemFonts;->buildSystemFallback(Ljava/lang/String;Ljava/lang/String;Landroid/graphics/fonts/FontCustomizationParser$Result;Landroid/util/ArrayMap;Ljava/util/ArrayList;)[Landroid/text/FontConfig$Alias;
+Landroid/graphics/fonts/SystemFonts;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+Landroid/graphics/fonts/SystemFonts;->mmap(Ljava/lang/String;)Ljava/nio/ByteBuffer;
+Landroid/graphics/Typeface;->createFromFamilies([Landroid/graphics/fonts/FontFamily;)Landroid/graphics/Typeface;
+Landroid/graphics/fonts/FontFamily;->getNativePtr()J
+Landroid/content/pm/ActivityInfo;->activityInfoConfigNativeToJava(I)I
+Landroid/content/res/TypedArray;->getChangingConfigurations()I
+Landroid/content/res/TypedArray;->extractThemeAttrs([I)[I
+Landroid/util/ContainerHelpers;->binarySearch([JIJ)I
+Landroid/util/Pools$SimplePool;->isInPool(Ljava/lang/Object;)Z
+Landroid/content/res/ResourcesImpl;->getAssets()Landroid/content/res/AssetManager;
+Landroid/content/res/XmlBlock$Parser;->next()I
+Landroid/content/res/XmlBlock$Parser;->getDepth()I
+Landroid/content/res/StringBlock;->get(I)Ljava/lang/CharSequence;
+Landroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;
+Landroid/content/res/ResourcesImpl;->getDisplayMetrics()Landroid/util/DisplayMetrics;
+Landroid/content/res/TypedArray;->length()I
+Landroid/content/res/AssetManager;->ensureValidLocked()V
+Landroid/content/res/TypedArray;->getFloat(IF)F
+Landroid/content/res/ResourcesImpl;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser;
+Landroid/content/res/XmlBlock$Parser;->getName()Ljava/lang/String;
+Landroid/content/res/Resources;->getAssets()Landroid/content/res/AssetManager;
+Landroid/content/res/TypedArray;->obtain(Landroid/content/res/Resources;I)Landroid/content/res/TypedArray;
+Landroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;
+Landroid/util/Pools$SimplePool;->acquire()Ljava/lang/Object;
+Landroid/content/res/TypedArray;->resize(I)V
+Landroid/content/res/Resources;->obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
+Landroid/content/res/AssetManager;->retrieveAttributes(Landroid/content/res/XmlBlock$Parser;[I[I[I)Z
+Landroid/content/res/TypedArray;->recycle()V
+Landroid/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z
+Landroid/util/Pools$SimplePool;->release(Ljava/lang/Object;)Z
+Landroid/graphics/drawable/Drawable;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
+Landroid/graphics/drawable/VectorDrawable$VGroup;->setTree(Lcom/android/internal/util/VirtualRefBasePtr;)V
+Landroid/graphics/drawable/VectorDrawable$VGroup;->getNativeSize()I
+Landroid/graphics/Rect;-><init>()V
+Landroid/graphics/drawable/VectorDrawable$VObject;->setTree(Lcom/android/internal/util/VirtualRefBasePtr;)V
Lcom/android/internal/util/GrowingArrayUtils;->insert([IIII)[I
-Lcom/android/internal/util/GrowingArrayUtils;->insert([JIIJ)[J
Lcom/android/internal/util/GrowingArrayUtils;->insert([Ljava/lang/Object;IILjava/lang/Object;)[Ljava/lang/Object;
-Lcom/android/internal/util/GrowingArrayUtils;->insert([ZIIZ)[Z
-HPLcom/android/internal/app/procstats/ProcessStats;-><init>(Landroid/os/Parcel;)V
-Lcom/android/internal/app/procstats/ProcessStats;-><init>(Z)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;-><init>(Lcom/android/internal/os/BatteryStatsImpl;I)V
-Lcom/android/internal/os/KernelWakelockReader;->parseProcWakelocks([BIZLcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
-Landroid/content/pm/PackageParser;->getCachedResult(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/PackageParser;->parsePackageItemInfo(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageItemInfo;[Ljava/lang/String;Ljava/lang/String;Landroid/content/res/TypedArray;ZIIIIII)Z
-Landroid/content/pm/PackageParser;->parsePackageList(Ljava/lang/String;)Ljava/util/Set;
-Landroid/content/pm/PackageParser;->parsePackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
-Landroid/content/pm/PackageParser;->parsePackageSplitNames(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;)Landroid/util/Pair;
-Lcom/android/internal/os/BatteryStatsImpl$DualTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
-Landroid/content/pm/Signature;->parseHexDigit(I)I
-Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->readWakeSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
-Landroid/util/ArraySet;->iterator()Ljava/util/Iterator;
-Landroid/content/pm/PackageParser;->fromCacheEntryStatic([B)Landroid/content/pm/PackageParser$Package;
-Landroid/content/pm/PackageParser;->fromCacheEntry([B)Landroid/content/pm/PackageParser$Package;
-Lcom/android/internal/os/BatteryStatsImpl$Timer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
-Landroid/os/FileUtils;->bytesToFile(Ljava/lang/String;[B)V
-Landroid/os/StrictMode;->allowThreadDiskReads()Landroid/os/StrictMode$ThreadPolicy;
-Landroid/os/StrictMode;->allowThreadDiskReadsMask()I
-Landroid/content/pm/PackageParser$Package;-><init>(Landroid/os/Parcel;)V
-Landroid/content/pm/PackageParser$Package;-><init>(Ljava/lang/String;)V
-Lcom/android/server/SystemConfig;->addFeature(Ljava/lang/String;I)V
-Landroid/os/StrictMode;->setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V
-Landroid/os/StrictMode;->setThreadPolicyMask(I)V
-Landroid/content/pm/FallbackCategoryProvider;->loadFallbacks()V
-Landroid/os/Parcel$ReadWriteHelper;->writeString(Landroid/os/Parcel;Ljava/lang/String;)V
-Landroid/os/Parcel;->writeString(Ljava/lang/String;)V
-Landroid/os/Parcel;->writeStringArray([Ljava/lang/String;)V
-Landroid/os/Parcel;->writeStringList(Ljava/util/List;)V
-Lcom/android/internal/os/BatteryStatsImpl$Timer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;ILcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
-Lcom/android/internal/os/BatteryStatsImpl$Timer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;ILcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->add(Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
-Landroid/os/Parcel;->writeInt(I)V
-Landroid/os/Parcel;->writeIntArray([I)V
-Landroid/os/Parcel;->writeInterfaceToken(Ljava/lang/String;)V
-Landroid/content/pm/PackageParser;->parsePublicKey(Ljava/lang/String;)Ljava/security/PublicKey;
-Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;->nextLine()Ljava/nio/CharBuffer;
-Landroid/util/Xml;->newPullParser()Lorg/xmlpull/v1/XmlPullParser;
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readFreqs(Lcom/android/internal/os/PowerProfile;)[J
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readFreqs(Ljava/lang/String;)[J
-Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
-Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
-Landroid/os/HandlerThread;->run()V
-Landroid/os/Looper;->loop()V
-Landroid/util/SparseArray;->size()I
+Landroid/graphics/drawable/Drawable;->resolveDensity(Landroid/content/res/Resources;I)I
+Landroid/graphics/drawable/VectorDrawable$VObject;-><init>()V
+Landroid/util/ArrayMap;->freeArrays([I[Ljava/lang/Object;I)V
+Landroid/content/res/TypedArray;->extractThemeAttrs()[I
+Landroid/content/res/TypedArray;->getDimensionPixelSize(II)I
+Landroid/graphics/drawable/Drawable$ConstantState;-><init>()V
+Landroid/content/res/TypedArray;->getValueAt(ILandroid/util/TypedValue;)Z
+Landroid/content/res/ColorStateList;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V
+Landroid/content/res/XmlBlock$Parser;->getAttributeNameResource(I)I
+Landroid/content/res/XmlBlock;->access$1200(JI)I
+Landroid/util/LongSparseArray;->put(JLjava/lang/Object;)V
+Lcom/android/internal/util/GrowingArrayUtils;->append([Ljava/lang/Object;ILjava/lang/Object;)[Ljava/lang/Object;
+Landroid/content/res/XmlBlock;->decOpenCountLocked()V
+Landroid/content/res/XmlBlock$Parser;->close()V
+Landroid/content/res/XmlBlock;->close()V
Landroid/util/ArrayMap;-><init>()V
-Landroid/util/ArrayMap;-><init>(I)V
Landroid/util/ArrayMap;-><init>(IZ)V
-Landroid/util/ArrayMap;-><init>(Landroid/util/ArrayMap;)V
-Landroid/os/Parcel;->writeLong(J)V
-Landroid/os/Parcel;->writeLongArray([J)V
-Landroid/os/Parcel;->readParcelable(Ljava/lang/ClassLoader;)Landroid/os/Parcelable;
-Landroid/os/Parcel;->readParcelableArray(Ljava/lang/ClassLoader;Ljava/lang/Class;)[Landroid/os/Parcelable;
-Landroid/os/Parcel;->readParcelableCreator(Ljava/lang/ClassLoader;)Landroid/os/Parcelable$Creator;
-Landroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List;
-Lcom/android/internal/os/BatteryStatsImpl$DualTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
-Landroid/os/SystemProperties;->getBoolean(Ljava/lang/String;Z)Z
-Landroid/content/pm/IntentFilterVerificationInfo;-><init>(Lorg/xmlpull/v1/XmlPullParser;)V
-Landroid/util/ArrayMap;->allocArrays(I)V
+Landroid/util/ArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+Lcom/android/internal/util/XmlUtils;->nextElementWithin(Lorg/xmlpull/v1/XmlPullParser;I)Z
+Landroid/util/ArraySet;->indexOf(Ljava/lang/Object;I)I
+Landroid/util/ArraySet;->add(Ljava/lang/Object;)Z
+Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z
+Lcom/android/server/SystemConfig;->readPrivAppPermissions(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V
+Lcom/android/internal/util/XmlUtils;->nextElement(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/SystemConfig;->readPermissionsFromXml(Ljava/io/File;I)V
+Lcom/android/server/SystemConfig;->addFeature(Ljava/lang/String;I)V
+Lcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullParser;)V
Landroid/os/Parcel;->readInt()I
-Landroid/os/Parcel;->readIntArray([I)V
-Landroid/content/pm/IntentFilterVerificationInfo;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/internal/util/ArrayUtils;->appendInt([II)[I
-Lcom/android/internal/util/ArrayUtils;->appendInt([IIZ)[I
-Landroid/util/TimingsTraceLog;->traceEnd()V
+Landroid/os/Parcel;->readLong()J
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->add(Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
+Lcom/android/internal/os/BatteryStatsImpl$Timer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;ILcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+Landroid/os/BatteryStats$Timer;-><init>()V
Lcom/android/internal/os/BatteryStatsImpl$Timer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Lcom/android/internal/os/BatteryStatsImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V
+Landroid/os/Parcel;->access$000(Landroid/os/Parcel;)J
Landroid/os/Parcel;->readString()Ljava/lang/String;
-Landroid/os/Parcel;->readStringArray()[Ljava/lang/String;
-Landroid/os/Parcel;->readStringList(Ljava/util/List;)V
-Lcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->add(Ljava/lang/String;Ljava/lang/Object;)V
-Lcom/android/internal/os/BatteryStatsImpl;->getKernelWakelockTimerLocked(Ljava/lang/String;)Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;
-Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$DualTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
-Landroid/os/storage/StorageManager;->hasAdoptable()Z
Landroid/os/Parcel$ReadWriteHelper;->readString(Landroid/os/Parcel;)Ljava/lang/String;
-Landroid/os/Handler;->dispatchMessage(Landroid/os/Message;)V
-Lcom/android/internal/os/BatteryStatsImpl$5;->run()V
-Lcom/android/internal/os/BatteryStatsImpl;->commitPendingDataToDisk(Landroid/os/Parcel;Lcom/android/internal/os/AtomicFile;)V
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->isRunning()Z
+Lcom/android/internal/os/BatteryStatsImpl;->getKernelWakelockTimerLocked(Ljava/lang/String;)Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;
+Landroid/util/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V
+Landroid/util/ArraySet;->allocArrays(I)V
+Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
-Landroid/util/ArraySet;->indexOf(Ljava/lang/Object;)I
-Landroid/util/ArraySet;->indexOf(Ljava/lang/Object;I)I
-Landroid/util/ArraySet;->indexOfNull()I
-Landroid/os/Parcel;->readLong()J
-Landroid/os/Parcel;->readLongArray([J)V
-Lcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->getServiceStatsLocked(Ljava/lang/String;Ljava/lang/String;)Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;
-Landroid/os/StrictMode;->setBlockGuardPolicy(I)V
-Landroid/util/TimingsTraceLog;->logDuration(Ljava/lang/String;J)V
-Landroid/util/Base64;->decode(Ljava/lang/String;I)[B
-Landroid/util/Base64;->decode([BI)[B
-Landroid/util/Base64;->decode([BIII)[B
-Landroid/util/ArrayMap;->valueAt(I)Ljava/lang/Object;
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWakelockTimerLocked(Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;I)Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;
-Landroid/util/ArraySet;-><init>()V
-Landroid/util/ArraySet;-><init>(I)V
-Landroid/util/ArraySet;-><init>(Landroid/util/ArraySet;)V
-Landroid/util/ArraySet;-><init>(Ljava/util/Collection;)V
-Lcom/android/internal/os/KernelCpuProcStringReader;->open(Z)Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;
-Landroid/content/pm/ApplicationInfo;-><init>()V
-Landroid/content/pm/ApplicationInfo;-><init>(Landroid/content/pm/ApplicationInfo;)V
-Landroid/content/pm/ApplicationInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/util/ArraySet;->remove(Ljava/lang/Object;)Z
-Landroid/util/ArraySet;->removeAll(Ljava/util/Collection;)Z
-Landroid/util/ArraySet;->removeAt(I)Ljava/lang/Object;
-Landroid/util/ArraySet;->removeAll(Landroid/util/ArraySet;)Z
-Landroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ApplicationInfo;
-Landroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-Landroid/os/ServiceManagerProxy;->addService(Ljava/lang/String;Landroid/os/IBinder;ZI)V
-Lcom/android/internal/os/PowerProfile;-><init>(Landroid/content/Context;)V
-Lcom/android/internal/os/PowerProfile;-><init>(Landroid/content/Context;Z)V
-Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
-Landroid/os/ServiceManager;->addService(Ljava/lang/String;Landroid/os/IBinder;)V
-Landroid/os/ServiceManager;->addService(Ljava/lang/String;Landroid/os/IBinder;ZI)V
-Lcom/android/internal/os/PowerProfile;->readPowerValuesFromXml(Landroid/content/Context;Z)V
-Lcom/android/server/SystemConfig;->readPermission(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
-Landroid/content/res/ResourcesImpl;-><init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;Landroid/view/DisplayAdjustments;)V
-Landroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
-Landroid/os/ServiceManager;->getServiceOrThrow(Ljava/lang/String;)Landroid/os/IBinder;
-Landroid/util/Base64$Decoder;->process([BIIZ)Z
-Lcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)J
-Lcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+Lcom/android/internal/os/BatteryStatsImpl;->detachIfNotNull(Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
+Lcom/android/internal/os/BatteryStatsImpl;->detachIfNotNull([Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;-><init>(Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+Landroid/os/BatteryStats$LongCounter;-><init>()V
+Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Landroid/util/ArrayMap;->allocArrays(I)V
+Lcom/android/internal/os/BatteryStatsImpl$DualTimer;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Lcom/android/internal/os/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
+Lcom/android/internal/os/BatteryStatsImpl$DualTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Landroid/util/SparseArray;->put(ILjava/lang/Object;)V
+Lcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;-><init>(Lcom/android/internal/os/BatteryStatsImpl;I)V
+Lcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->add(Ljava/lang/String;Ljava/lang/Object;)V
Lcom/android/internal/os/BatteryStatsImpl$Uid;->getPackageStatsLocked(Ljava/lang/String;)Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;
-Lcom/android/internal/app/procstats/ProcessStats;->resetCommon()V
-HPLcom/android/internal/app/procstats/ProcessStats;->resetSafely()V
-Landroid/content/res/ResourcesImpl;->updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V
-Landroid/content/res/Resources;-><init>()V
-Landroid/content/res/Resources;-><init>(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;)V
-Landroid/content/res/Resources;-><init>(Ljava/lang/ClassLoader;)V
-Landroid/os/ServiceManager;->rawGetService(Ljava/lang/String;)Landroid/os/IBinder;
-Landroid/util/LongSparseArray;->put(JLjava/lang/Object;)V
-Landroid/util/ArrayMap;->freeArrays([I[Ljava/lang/Object;I)V
-Landroid/util/ArrayMap;->keyAt(I)Ljava/lang/Object;
-Landroid/content/pm/PackageParser$Activity$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Activity;
-Landroid/content/pm/PackageParser$Activity$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-Landroid/content/pm/PackageParser$Activity;-><init>(Landroid/content/pm/PackageParser$ParseComponentArgs;Landroid/content/pm/ActivityInfo;)V
-Landroid/content/pm/PackageParser$Activity;-><init>(Landroid/os/Parcel;)V
-Landroid/content/res/AssetManager;->setConfiguration(IILjava/lang/String;IIIIIIIIIIIIIII)V
+Lcom/android/internal/util/ArrayUtils;->newUnpaddedObjectArray(I)[Ljava/lang/Object;
+Landroid/util/SparseArray;-><init>(I)V
+Landroid/util/SparseArray;-><init>()V
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->readWakeSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Lcom/android/internal/os/BatteryStatsImpl$Uid;)V
+Landroid/os/BatteryStats$Uid$Wakelock;-><init>()V
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getWakelockTimerLocked(Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;I)Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;
Lcom/android/internal/os/BatteryStatsImpl$Counter;-><init>(Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
-Lcom/android/internal/os/BatteryStatsImpl$Counter;-><init>(Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
-Landroid/util/ArraySet;->allocArrays(I)V
-Landroid/os/storage/StorageManager;->isFileEncryptedNativeOnly()Z
-Lcom/android/internal/os/BatteryStatsImpl$Counter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl;->updateRailStatsLocked()V
-Landroid/os/ServiceManagerProxy;->getService(Ljava/lang/String;)Landroid/os/IBinder;
-Landroid/util/SparseIntArray;-><init>()V
-Landroid/util/SparseIntArray;-><init>(I)V
-Lcom/android/internal/util/XmlUtils;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)I
-Lcom/android/internal/util/XmlUtils;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;-><init>(Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)V
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;-><init>(Lcom/android/internal/os/BatteryStatsImpl$TimeBase;Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl;-><init>(Lcom/android/internal/os/BatteryStatsImpl$Clocks;Ljava/io/File;Landroid/os/Handler;Lcom/android/internal/os/BatteryStatsImpl$PlatformIdleStateCallback;Lcom/android/internal/os/BatteryStatsImpl$RailEnergyDataCallback;Lcom/android/internal/os/BatteryStatsImpl$UserInfoProvider;)V
-Lcom/android/internal/os/BatteryStatsImpl;-><init>(Ljava/io/File;Landroid/os/Handler;Lcom/android/internal/os/BatteryStatsImpl$PlatformIdleStateCallback;Lcom/android/internal/os/BatteryStatsImpl$RailEnergyDataCallback;Lcom/android/internal/os/BatteryStatsImpl$UserInfoProvider;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->readJobSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
-Lcom/android/internal/app/procstats/ProcessStats;->updateFragmentation()V
-Landroid/os/Parcel;->readTypedObject(Landroid/os/Parcelable$Creator;)Ljava/lang/Object;
-Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getTotalDurationMsLocked(J)J
-Landroid/os/Parcel;->createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object;
-Landroid/os/Parcel;->createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList;
-Landroid/os/Parcel;->createTypedArrayMap(Landroid/os/Parcelable$Creator;)Landroid/util/ArrayMap;
-Landroid/content/pm/PackageParserCacheHelper$ReadHelper;->readString(Landroid/os/Parcel;)Ljava/lang/String;
-Lcom/android/server/LocalServices;->addService(Ljava/lang/Class;Ljava/lang/Object;)V
-Landroid/util/Slog;->d(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/util/TimingsTraceLog;->traceBegin(Ljava/lang/String;)V
-Landroid/content/res/AssetManager;-><init>()V
-Landroid/content/res/AssetManager;->getResourceValue(IILandroid/util/TypedValue;Z)Z
-Landroid/util/LongSparseLongArray;->put(JJ)V
+Landroid/os/BatteryStats$Counter;-><init>()V
+Lcom/android/internal/os/BatteryStatsImpl$Counter;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;-><init>(Z)V
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->init(JJ)V
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->getUptime(J)J
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->getRealtime(J)J
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->readSummaryFromParcel(Landroid/os/Parcel;)V
Lcom/android/internal/os/BatteryStatsImpl$SystemClocks;->uptimeMillis()J
-Landroid/content/res/AssetManager;->setApkAssets([Landroid/content/res/ApkAssets;Z)V
+Lcom/android/internal/os/BatteryStatsImpl$SystemClocks;->elapsedRealtime()J
Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->readSummaryFromParcelLocked(Landroid/os/Parcel;Lcom/android/internal/os/BatteryStatsImpl$TimeBase;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;
-Lcom/android/internal/util/XmlUtils;->readBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Z
-Lcom/android/internal/util/XmlUtils;->readBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Z)Z
-Landroid/os/StrictMode$ThreadPolicy;-><init>(ILandroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;)V
-Lcom/android/internal/os/KernelCpuSpeedReader;->readDelta()[J
-Lcom/android/internal/os/AtomicFile;->startWrite()Ljava/io/FileOutputStream;
-Landroid/app/ContextImpl;->createSystemUiContext(Landroid/app/ContextImpl;I)Landroid/app/ContextImpl;
-Landroid/app/ActivityThread;->getSystemUiContext()Landroid/app/ContextImpl;
-Landroid/os/Parcel;->recycle()V
-Landroid/util/Slog;->i(Ljava/lang/String;Ljava/lang/String;)I
-Landroid/os/Binder;-><init>()V
-Landroid/os/Binder;-><init>(Ljava/lang/String;)V
-Landroid/content/Context;->getSystemService(Ljava/lang/Class;)Ljava/lang/Object;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getServiceStatsLocked(Ljava/lang/String;Ljava/lang/String;)Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;->newServiceStatsLocked()Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;-><init>(Lcom/android/internal/os/BatteryStatsImpl;)V
+Landroid/os/BatteryStats$Uid$Pkg$Serv;-><init>()V
+Lcom/android/internal/app/procstats/ProcessStats;->splitAndParseNumbers(Ljava/lang/String;)[I
+Lcom/android/internal/os/KernelCpuProcStringReader;->isNumber(C)Z
+Lcom/android/internal/os/KernelCpuProcStringReader;->access$000(Lcom/android/internal/os/KernelCpuProcStringReader;)[C
+Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;->nextLine()Ljava/nio/CharBuffer;
+Lcom/android/internal/os/KernelCpuProcStringReader;->asLongs(Ljava/nio/CharBuffer;[J)I
+Landroid/util/SparseArray;->get(I)Ljava/lang/Object;
+Landroid/util/SparseArray;->get(ILjava/lang/Object;)Ljava/lang/Object;
+Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->copyToCurTimes()V
+Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
+Lcom/android/internal/os/KernelWakelockReader;->readKernelWakelockStats(Lcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
+Lcom/android/internal/util/GrowingArrayUtils;->insert([JIIJ)[J
+Lcom/android/internal/util/XmlUtils;->readIntAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+Lcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+Landroid/os/Parcel;->dataPosition()I
+Landroid/util/LongSparseLongArray;->put(JJ)V
Lcom/android/internal/util/ArrayUtils;->newUnpaddedLongArray(I)[J
-Landroid/content/res/ResourcesImpl;->getValue(ILandroid/util/TypedValue;Z)V
-Landroid/content/res/ResourcesImpl;->getValueForDensity(IILandroid/util/TypedValue;Z)V
+Lcom/android/internal/os/KernelWakelockReader;->parseProcWakelocks([BIZLcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
+Landroid/util/SparseArray;->valueAt(I)Ljava/lang/Object;
Landroid/util/LongSparseLongArray;-><init>()V
Landroid/util/LongSparseLongArray;-><init>(I)V
-Landroid/os/BatteryStats$Timer;-><init>()V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->createAggregatedPartialWakelockTimerLocked()Lcom/android/internal/os/BatteryStatsImpl$DualTimer;
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->access$2300(Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->readJobCompletionsFromParcelLocked(Landroid/os/Parcel;)V
-Landroid/util/MapCollections$KeySet;->iterator()Ljava/util/Iterator;
-Landroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->writeSummaryToParcel(Landroid/os/Parcel;JJ)V
+Landroid/app/AppOpsManager;->makeKey(II)J
+Landroid/app/AppOpsManager;->opToDefaultMode(I)I
+Lcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)J
+Landroid/app/AppOpsManager;->extractFlagsFromKey(J)I
+Landroid/app/AppOpsManager;->extractUidStateFromKey(J)I
+Lcom/android/internal/util/XmlUtils;->readStringAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/internal/os/KernelWakelockStats$Entry;-><init>(IJI)V
+Lcom/android/internal/os/KernelWakelockReader;->removeOldStats(Lcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
+Lcom/android/internal/os/BatteryStatsImpl;->updateKernelWakelocksLocked()V
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->update(JI)V
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->setUpdateVersion(I)V
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->getUpdateVersion()I
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->endSample()V
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->computeRunTimeLocked(J)J
+Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->computeCurrentCountLocked()I
+Landroid/os/Parcel;->writeInt(I)V
+Landroid/os/Parcel;->writeLong(J)V
+Lcom/android/internal/os/BatteryStatsImpl$Timer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
+Lcom/android/internal/os/BatteryStatsImpl;->writeSummaryToParcel(Landroid/os/Parcel;Z)V
+Landroid/os/Parcel;->writeString(Ljava/lang/String;)V
+Landroid/os/Parcel$ReadWriteHelper;->writeString(Landroid/os/Parcel;Ljava/lang/String;)V
+Landroid/os/StrictMode;->setThreadPolicyMask(I)V
+Landroid/os/StrictMode;->setBlockGuardPolicy(I)V
+Lcom/android/internal/os/ProcStatsUtil;->readTerminatedProcFile(Ljava/lang/String;B)Ljava/lang/String;
+Landroid/os/StrictMode$ThreadPolicy;-><init>(ILandroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;Landroid/os/StrictMode$1;)V
+Landroid/os/StrictMode$ThreadPolicy;-><init>(ILandroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;)V
+Landroid/os/StrictMode;->setThreadPolicy(Landroid/os/StrictMode$ThreadPolicy;)V
+Landroid/os/StrictMode;->allowThreadDiskReadsMask()I
+Landroid/os/StrictMode;->getThreadPolicyMask()I
+Landroid/os/StrictMode;->allowThreadDiskReads()Landroid/os/StrictMode$ThreadPolicy;
+Lcom/android/internal/os/ProcessCpuTracker;->collectStats(Ljava/lang/String;IZ[ILjava/util/ArrayList;)[I
+Lcom/android/internal/os/ProcessCpuTracker$Stats;-><init>(IIZ)V
+Lcom/android/internal/os/ProcessCpuTracker$Stats;->getUid(Ljava/lang/String;)I
+Lcom/android/internal/os/ProcessCpuTracker;->getName(Lcom/android/internal/os/ProcessCpuTracker$Stats;Ljava/lang/String;)V
+Lcom/android/internal/os/ProcessCpuTracker;->onMeasureProcessName(Ljava/lang/String;)I
Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->computeRunTimeLocked(J)J
-Landroid/bluetooth/BluetoothAdapter;->getDefaultAdapter()Landroid/bluetooth/BluetoothAdapter;
-Landroid/content/pm/PackageParserCacheHelper$ReadHelper;->startAndInstall()V
-Landroid/content/pm/PackageItemInfo;-><init>(Landroid/content/pm/PackageItemInfo;)V
-Landroid/content/pm/PackageItemInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/content/pm/ActivityInfo;-><init>()V
-Landroid/content/pm/ActivityInfo;-><init>(Landroid/content/pm/ActivityInfo;)V
-Landroid/content/pm/ActivityInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ActivityInfo;
-Landroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
-Landroid/os/BinderProxy;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
-Landroid/os/HandlerThread;->getLooper()Landroid/os/Looper;
-Landroid/os/FileUtils;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
-Landroid/os/SystemProperties;->digestOf([Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/internal/util/ArrayUtils;->isEmpty(Ljava/util/Collection;)Z
-Lcom/android/internal/util/ArrayUtils;->isEmpty([Ljava/lang/Object;)Z
-Landroid/util/AtomicFile;-><init>(Ljava/io/File;)V
-Landroid/util/AtomicFile;-><init>(Ljava/io/File;Ljava/lang/String;)V
-Landroid/util/LongSparseArray;-><init>()V
-Landroid/util/LongSparseArray;-><init>(I)V
-Landroid/content/res/Resources;->obtainTypedArray(I)Landroid/content/res/TypedArray;
-Landroid/util/AtomicFile;->openRead()Ljava/io/FileInputStream;
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;-><init>(Z)V
-Lcom/android/internal/os/BatteryStatsImpl$Counter;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->makeProcessState(ILandroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid$3;->instantiateObject()Lcom/android/internal/os/BatteryStatsImpl$DualTimer;
-Lcom/android/internal/os/BatteryStatsImpl$Uid$3;->instantiateObject()Ljava/lang/Object;
-Landroid/content/pm/PackageUserState;-><init>()V
-Landroid/app/ActivityManager;->isLowRamDeviceStatic()Z
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
-Lcom/android/internal/os/BatteryStatsImpl;->updateRpmStatsLocked()V
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V
-Lcom/android/internal/os/KernelMemoryBandwidthStats;->updateStats()V
-Landroid/content/pm/PackageParser;->isCacheUpToDate(Ljava/io/File;Ljava/io/File;)Z
-Landroid/os/StrictMode;->initThreadDefaults(Landroid/content/pm/ApplicationInfo;)V
-Landroid/app/ResourcesManager;->getOrCreateResources(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Ljava/lang/ClassLoader;)Landroid/content/res/Resources;
-Landroid/app/ResourcesManager;->getOrCreateResourcesForActivityLocked(Landroid/os/IBinder;Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
-Landroid/app/ResourcesManager;->getOrCreateResourcesLocked(Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
-Landroid/app/ResourcesManager;->getResources(Landroid/os/IBinder;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;Ljava/lang/ClassLoader;)Landroid/content/res/Resources;
-Landroid/app/ContextImpl;->createResources(Landroid/os/IBinder;Landroid/app/LoadedApk;Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;[Ljava/lang/String;)Landroid/content/res/Resources;
-Landroid/app/ContextImpl;->createResources(Landroid/os/IBinder;Landroid/app/LoadedApk;Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
-Landroid/app/ContextImpl;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
-Landroid/app/ContextImpl;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;
-Landroid/app/SystemServiceRegistry$CachedServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-Landroid/util/TimingsTraceLog;->assertSameThread()V
-Landroid/os/HandlerThread;-><init>(Ljava/lang/String;)V
-Landroid/os/HandlerThread;-><init>(Ljava/lang/String;I)V
-Lcom/android/internal/util/ArrayUtils;->newUnpaddedIntArray(I)[I
-Landroid/content/res/Configuration;-><init>()V
-Landroid/content/res/Configuration;-><init>(Landroid/content/res/Configuration;)V
-Landroid/view/SurfaceControl;->getInternalDisplayToken()Landroid/os/IBinder;
-Landroid/view/SurfaceControl;->getPhysicalDisplayToken(J)Landroid/os/IBinder;
-Landroid/content/res/Resources;->getInteger(I)I
-Landroid/os/Handler;->sendMessageAtTime(Landroid/os/Message;J)Z
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->init(JJ)V
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->readSummaryFromParcel(Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg;-><init>(Lcom/android/internal/os/BatteryStatsImpl;)V
-Landroid/util/ArraySet;->freeArrays([I[Ljava/lang/Object;I)V
-Landroid/util/ArrayMap;->entrySet()Ljava/util/Set;
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;->readDeltaImpl(Lcom/android/internal/os/KernelCpuUidTimeReader$Callback;)V
-Landroid/telephony/TelephonyManager;->getITelephony()Lcom/android/internal/telephony/ITelephony;
-Landroid/telephony/TelephonyManager;->requestModemActivityInfo(Landroid/os/ResultReceiver;)V
+Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->computeCurrentCountLocked()I
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getMaxDurationMsLocked(J)J
-Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->endSample()V
-Lcom/android/internal/os/BatteryStatsImpl;->updateKernelMemoryBandwidthLocked()V
-Landroid/content/pm/ComponentInfo;-><init>()V
-Landroid/content/pm/ComponentInfo;-><init>(Landroid/content/pm/ComponentInfo;)V
-Landroid/content/pm/ComponentInfo;-><init>(Landroid/os/Parcel;)V
-Landroid/view/SurfaceControl;->getDisplayConfigs(Landroid/os/IBinder;)[Landroid/view/SurfaceControl$PhysicalDisplayInfo;
-Lcom/android/internal/os/AtomicFile;->finishWrite(Ljava/io/FileOutputStream;)V
-Landroid/app/ResourcesManager;->createResourcesImpl(Landroid/content/res/ResourcesKey;)Landroid/content/res/ResourcesImpl;
-Landroid/app/ContextImpl;->updateDisplay(I)V
-Landroid/hardware/display/DisplayManagerGlobal;->getInstance()Landroid/hardware/display/DisplayManagerGlobal;
-Landroid/app/ResourcesManager;->getAdjustedDisplay(ILandroid/content/res/Resources;)Landroid/view/Display;
-Landroid/app/ResourcesManager;->getAdjustedDisplay(ILandroid/view/DisplayAdjustments;)Landroid/view/Display;
-Landroid/os/Parcel;->readStrongBinder()Landroid/os/IBinder;
-Landroid/app/ContextImpl;->setTheme(I)V
-Landroid/content/IntentFilter;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
-Landroid/text/TextUtils;->getLayoutDirectionFromLocale(Ljava/util/Locale;)I
-Landroid/os/Handler;-><init>()V
-Landroid/os/Handler;-><init>(Landroid/os/Handler$Callback;)V
-Landroid/os/Handler;-><init>(Landroid/os/Handler$Callback;Z)V
-Landroid/os/Handler;-><init>(Landroid/os/Looper;)V
-Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;)V
-Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
-Landroid/os/Handler;-><init>(Z)V
-Landroid/os/Binder;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;
-Landroid/content/pm/PackageParser;->isApkFile(Ljava/io/File;)Z
-Landroid/util/SparseIntArray;->put(II)V
-Landroid/content/pm/ApplicationInfo;->initForUser(I)V
-Landroid/os/BinderProxy;->getInstance(JJ)Landroid/os/BinderProxy;
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getTotalDurationMsLocked(J)J
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getCurrentDurationMsLocked(J)J
+Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Lcom/android/internal/os/BatteryStatsImpl$DualTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V
+Lcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->getMap()Landroid/util/ArrayMap;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->access$2400(Lcom/android/internal/os/BatteryStatsImpl$Uid;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->access$2500(Lcom/android/internal/os/BatteryStatsImpl$Uid;)Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;
+Lcom/android/internal/os/BatteryStatsImpl$Counter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->writeSummaryToParcel(Landroid/os/Parcel;JJ)V
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->computeUptime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->computeRealtime(JI)J
+Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->writeSummaryToParcelLocked(Landroid/os/Parcel;Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;)V
+Lcom/android/internal/os/BatteryStatsImpl$Uid$Pkg$Serv;->getStartTimeToNowLocked(J)J
+Landroid/util/MapCollections$ArrayIterator;->hasNext()Z
+Landroid/util/SparseArray;->size()I
+Landroid/content/pm/Signature;->parseHexDigit(I)I
+Landroid/content/pm/Signature;-><init>(Ljava/lang/String;)V
+Landroid/content/pm/FallbackCategoryProvider;->loadFallbacks()V
+Landroid/content/pm/PermissionInfo;->fixProtectionLevel(I)I
+Lcom/android/internal/util/ArrayUtils;->isEmpty([I)Z
+Lcom/android/internal/util/ArrayUtils;->appendInt([IIZ)[I
+Landroid/util/ArraySet;-><init>(IZ)V
+Landroid/content/pm/IntentFilterVerificationInfo;->readFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
Landroid/content/pm/IntentFilterVerificationInfo;->getStringFromXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Landroid/os/PowerManager;
-Landroid/app/SystemServiceRegistry$35;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object;
-Landroid/util/ArrayMap;->containsKey(Ljava/lang/Object;)Z
-Landroid/app/WindowConfiguration;->setToDefaults()V
-Lcom/android/internal/util/MemInfoReader;->readMemInfo()V
+Landroid/content/pm/PackageParser;->toSigningKeys([Landroid/content/pm/Signature;)Landroid/util/ArraySet;
+Landroid/util/ArraySet;-><init>(I)V
+Landroid/util/Base64$Decoder;->process([BIIZ)Z
Landroid/util/LongSparseArray;->get(J)Ljava/lang/Object;
Landroid/util/LongSparseArray;->get(JLjava/lang/Object;)Ljava/lang/Object;
-Landroid/util/Spline;->createSpline([F[F)Landroid/util/Spline;
-Landroid/os/PowerManager;->getDefaultScreenBrightnessSetting()I
-Landroid/view/Display;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILandroid/view/DisplayInfo;Landroid/content/res/Resources;)V
-Landroid/view/Display;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILandroid/view/DisplayInfo;Landroid/view/DisplayAdjustments;)V
-Landroid/view/Display;-><init>(Landroid/hardware/display/DisplayManagerGlobal;ILandroid/view/DisplayInfo;Landroid/view/DisplayAdjustments;Landroid/content/res/Resources;)V
-Landroid/net/Uri;->withAppendedPath(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri;
-Landroid/content/res/TypedArray;->obtain(Landroid/content/res/Resources;I)Landroid/content/res/TypedArray;
-Landroid/provider/Settings$System;->getUriFor(Ljava/lang/String;)Landroid/net/Uri;
+Landroid/util/ArraySet;-><init>()V
+Lcom/android/internal/util/XmlUtils;->readBooleanAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Z)Z
+Landroid/util/ArrayMap$1;->colGetEntry(II)Ljava/lang/Object;
Landroid/util/MapCollections$ArrayIterator;->next()Ljava/lang/Object;
-Landroid/view/DisplayAdjustments;-><init>()V
-Landroid/view/DisplayAdjustments;-><init>(Landroid/content/res/Configuration;)V
-Landroid/view/DisplayAdjustments;-><init>(Landroid/view/DisplayAdjustments;)V
-Landroid/hardware/display/DisplayManager;->getOrCreateDisplayLocked(IZ)Landroid/view/Display;
-Landroid/content/res/Resources;->getIntArray(I)[I
-Landroid/content/res/StringBlock;->get(I)Ljava/lang/CharSequence;
-Landroid/content/res/XmlBlock$Parser;->getText()Ljava/lang/String;
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounter;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid$Wakelock;-><init>(Lcom/android/internal/os/BatteryStatsImpl;Lcom/android/internal/os/BatteryStatsImpl$Uid;)V
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->readSyncSummaryFromParcelLocked(Ljava/lang/String;Landroid/os/Parcel;)V
-Landroid/hardware/display/DisplayManagerGlobal;->getDisplayInfo(I)Landroid/view/DisplayInfo;
-Landroid/os/FileUtils;->readTextFile(Ljava/io/File;ILjava/lang/String;)Ljava/lang/String;
-Lcom/android/internal/app/procstats/ProcessStats;->buildTimePeriodStartClockStr()V
-Landroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;J)Ljava/lang/CharSequence;
-Landroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;Ljava/util/Calendar;)Ljava/lang/CharSequence;
-Landroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;Ljava/util/Date;)Ljava/lang/CharSequence;
-Landroid/telephony/TelephonyManager;->from(Landroid/content/Context;)Landroid/telephony/TelephonyManager;
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->getRealtime(J)J
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->writeSummaryToParcelLocked(Landroid/os/Parcel;Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;)V
-Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;->access$2600(Lcom/android/internal/os/BatteryStatsImpl$LongSamplingCounterArray;Landroid/os/Parcel;)V
-Landroid/os/Parcel;->unmarshall([BII)V
+Landroid/content/pm/PackageParserCacheHelper$ReadHelper;->readString(Landroid/os/Parcel;)Ljava/lang/String;
+Landroid/util/ArraySet;->indexOf(Ljava/lang/Object;)I
+Landroid/util/MapCollections$MapIterator;->hasNext()Z
+Landroid/os/Parcel;->readStringList(Ljava/util/List;)V
+Landroid/content/pm/Signature;->equals(Ljava/lang/Object;)Z
+Lcom/android/internal/util/ArrayUtils;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I
+Landroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List;
+Landroid/os/Parcel;->readStringArray()[Ljava/lang/String;
+Landroid/content/pm/PackageParser$SigningDetails;->hasCertificateInternal(Landroid/content/pm/Signature;I)Z
+Landroid/content/pm/PackageParser$SigningDetails;->hasPastSigningCertificates()Z
+Landroid/util/MapCollections$MapIterator;->getValue()Ljava/lang/Object;
Landroid/content/pm/PackageParser$Package;->fixupOwner(Ljava/util/List;)V
-Landroid/content/res/Resources;->getBoolean(I)Z
-Landroid/content/res/AssetManager;->getResourceText(I)Ljava/lang/CharSequence;
-Landroid/content/res/AssetManager;->getResourceTextArray(I)[Ljava/lang/CharSequence;
-Landroid/content/res/Resources;->getText(I)Ljava/lang/CharSequence;
-HPLandroid/content/res/Resources;->getText(ILjava/lang/CharSequence;)Ljava/lang/CharSequence;
-Landroid/content/res/Resources;->getTextArray(I)[Ljava/lang/CharSequence;
-Landroid/os/MessageQueue;->next()Landroid/os/Message;
-Landroid/os/Parcel;->marshall()[B
-Lcom/android/internal/logging/EventLogTags;->writeCommitSysConfigFile(Ljava/lang/String;J)V
-Landroid/os/ThreadLocalWorkSource;->restore(J)V
-Landroid/os/Looper;->prepare()V
-Landroid/os/Looper;->prepareMainLooper()V
-Lcom/android/internal/app/procstats/ProcessStats;->splitAndParseNumbers(Ljava/lang/String;)[I
-Landroid/os/Trace;->traceEnd(J)V
-Landroid/os/Parcel;->readExceptionCode()I
-Landroid/os/Parcel;->readException()V
-Landroid/os/Parcel;->readException(ILjava/lang/String;)V
-Lcom/android/internal/util/StatLogger;->logDurationStat(IJ)J
-Landroid/content/res/ResourcesImpl$ThemeImpl;->applyStyle(IZ)V
-Landroid/content/res/Resources$Theme;->applyStyle(IZ)V
-Landroid/content/res/AssetManager;->applyStyleToTheme(JIZ)V
-Landroid/os/Trace;->isTagEnabled(J)Z
-Lcom/android/internal/util/ArrayUtils;->containsAll([Ljava/lang/Object;[Ljava/lang/Object;)Z
-Landroid/os/Trace;->traceBegin(JLjava/lang/String;)V
-Landroid/hardware/display/DisplayManager;-><init>(Landroid/content/Context;)V
-Landroid/os/Bundle;-><init>()V
-Landroid/os/Bundle;-><init>(I)V
-Landroid/os/Bundle;-><init>(Landroid/os/Bundle;)V
-Landroid/os/Bundle;-><init>(Landroid/os/PersistableBundle;)V
-Landroid/content/pm/PackageBackwardCompatibility;->updatePackage(Landroid/content/pm/PackageParser$Package;)V
-Landroid/content/pm/PackageBackwardCompatibility;->modifySharedLibraries(Landroid/content/pm/PackageParser$Package;)V
+Landroid/util/MapCollections$MapIterator;->next()Ljava/lang/Object;
+Landroid/util/MapCollections$MapIterator;->next()Ljava/util/Map$Entry;
+Landroid/util/MapCollections$MapIterator;->getKey()Ljava/lang/Object;
Landroid/content/pm/Signature;->areExactMatch([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)Z
-Lcom/android/internal/util/ArrayUtils;->contains(Ljava/util/Collection;Ljava/lang/Object;)Z
-Lcom/android/internal/util/ArrayUtils;->contains([II)Z
+Lcom/android/internal/util/ArrayUtils;->containsAll([Ljava/lang/Object;[Ljava/lang/Object;)Z
Lcom/android/internal/util/ArrayUtils;->contains([Ljava/lang/Object;Ljava/lang/Object;)Z
-Lcom/android/internal/util/ConcurrentUtils$1;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread;
-Landroid/os/PowerManager;-><init>(Landroid/content/Context;Landroid/os/IPowerManager;Landroid/os/Handler;)V
-Landroid/content/res/AssetManager;->getResourceArray(I[I)I
-Landroid/content/res/AssetManager;->getResourceArraySize(I)I
-Landroid/app/WindowConfiguration;-><init>()V
-Landroid/view/SurfaceControl;->getPhysicalDisplayIds()[J
-Lcom/android/internal/os/BackgroundThread;->getHandler()Landroid/os/Handler;
-Landroid/net/Uri$StringUri;->buildUpon()Landroid/net/Uri$Builder;
-Lcom/android/internal/os/AtomicFile;->readFully()[B
-Lcom/android/internal/util/ArrayUtils;->indexOf([Ljava/lang/Object;Ljava/lang/Object;)I
-Landroid/content/res/ResourcesImpl;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser;
-Landroid/content/res/Resources;->loadXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;
-Landroid/content/res/Resources;->getXml(I)Landroid/content/res/XmlResourceParser;
-Landroid/content/res/XmlBlock$Parser;->next()I
-Landroid/content/res/XmlBlock$Parser;->nextTag()I
-Landroid/content/res/XmlBlock$Parser;->nextText()Ljava/lang/String;
-Lcom/google/android/collect/Sets;->newArraySet()Landroid/util/ArraySet;
-Lcom/google/android/collect/Sets;->newArraySet([Ljava/lang/Object;)Landroid/util/ArraySet;
-Landroid/util/ArraySet;->contains(Ljava/lang/Object;)Z
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->getSensorTimerLocked(IZ)Lcom/android/internal/os/BatteryStatsImpl$DualTimer;
Landroid/content/pm/PackageParser$SigningDetails;->hasCertificate(Landroid/content/pm/Signature;)Z
-Landroid/content/pm/PackageParser$SigningDetails;->hasCertificateInternal(Landroid/content/pm/Signature;I)Z
-Landroid/content/res/XmlBlock$Parser;->getAttributeValue(I)Ljava/lang/String;
-Landroid/content/res/XmlBlock$Parser;->getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/internal/os/BatteryStatsImpl;->detachIfNotNull(Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
-Lcom/android/internal/os/BatteryStatsImpl;->detachIfNotNull([Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
-Lcom/android/internal/os/BatteryStatsImpl;->detachIfNotNull([[Lcom/android/internal/os/BatteryStatsImpl$TimeBaseObs;)V
-Landroid/util/Spline$MonotoneCubicSpline;-><init>([F[F)V
-Landroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;)V
-Landroid/content/res/Configuration;->setToDefaults()V
-Lcom/android/server/SystemConfig;->readSplitPermission(Lorg/xmlpull/v1/XmlPullParser;Ljava/io/File;)V
-Lcom/android/internal/os/RpmStats;->getSubsystem(Ljava/lang/String;)Lcom/android/internal/os/RpmStats$PowerStateSubsystem;
-Lcom/android/internal/os/BatteryStatsImpl$TimeBase;->computeRealtime(JI)J
-Landroid/os/Parcel;->dataPosition()I
-Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->getCurrentDurationMsLocked(J)J
-Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;->checkPrecondition(Lcom/android/internal/os/KernelCpuProcStringReader$ProcFileIterator;)Z
-Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->computeRunTimeLocked(J)J
-Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->computeCurrentCountLocked()I
-Lcom/android/internal/os/KernelMemoryBandwidthStats;->parseStats(Ljava/io/BufferedReader;)V
-Landroid/util/MapCollections;->getEntrySet()Ljava/util/Set;
-Landroid/util/MapCollections$EntrySet;->iterator()Ljava/util/Iterator;
-Lcom/android/internal/os/BatteryStatsImpl$Uid;->writeJobCompletionsToParcelLocked(Landroid/os/Parcel;)V
+Landroid/util/ArrayMap;->putAll(Ljava/util/Map;)V
+Landroid/os/Parcel;->createStringArrayList()Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Package;->internStringArrayList(Ljava/util/List;)V
+Lcom/android/internal/util/ArrayUtils;->contains(Ljava/util/Collection;Ljava/lang/Object;)Z
+Landroid/util/ArraySet;->size()I
+Landroid/util/SparseArray;->keyAt(I)I
+Landroid/content/pm/PackageParser;->isApkFile(Ljava/io/File;)Z
+Landroid/content/pm/PackageParser;->isApkPath(Ljava/lang/String;)Z
+Landroid/os/Parcel;->readParcelableCreator(Ljava/lang/ClassLoader;)Landroid/os/Parcelable$Creator;
+Landroid/os/Parcel;->readParcelable(Ljava/lang/ClassLoader;)Landroid/os/Parcelable;
Landroid/os/Parcel;->readBundle()Landroid/os/Bundle;
Landroid/os/Parcel;->readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle;
-Landroid/content/res/Resources;->getString(I)Ljava/lang/String;
-Landroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;
-Landroid/content/res/Resources;->getStringArray(I)[Ljava/lang/String;
-Landroid/os/ThreadLocalWorkSource;->setUid(I)J
-Landroid/content/pm/PackageParser;->parseClusterPackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
-Landroid/content/pm/PackageParser;->parseClusterPackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
-Landroid/content/pm/split/DefaultSplitAssetLoader;->getBaseAssetManager()Landroid/content/res/AssetManager;
-Landroid/content/pm/PackageParser;->parseBaseApk(Ljava/io/File;Landroid/content/res/AssetManager;I)Landroid/content/pm/PackageParser$Package;
-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;->parseBaseApkCommon(Landroid/content/pm/PackageParser$Package;Ljava/util/Set;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
-Landroid/content/pm/PackageParser;->cacheResult(Ljava/io/File;ILandroid/content/pm/PackageParser$Package;)V
-Landroid/content/pm/PackageParser;->parseMonolithicPackage(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
-Landroid/content/pm/PackageParser;->parseMonolithicPackageLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$PackageLite;
-Landroid/content/pm/PackageParser;->parseApkLite(Ljava/io/File;I)Landroid/content/pm/PackageParser$ApkLite;
-Landroid/content/pm/PackageParser;->parseApkLite(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/pm/PackageParser$SigningDetails;)Landroid/content/pm/PackageParser$ApkLite;
-Landroid/content/pm/PackageParser;->parseApkLiteInner(Ljava/io/File;Ljava/io/FileDescriptor;Ljava/lang/String;I)Landroid/content/pm/PackageParser$ApkLite;
-Landroid/content/pm/PackageParser;->toCacheEntry(Landroid/content/pm/PackageParser$Package;)[B
-Landroid/content/pm/PackageParser;->parseBaseApplication(Landroid/content/pm/PackageParser$Package;Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;I[Ljava/lang/String;)Z
-Landroid/os/Parcel;->writeParcelable(Landroid/os/Parcelable;I)V
-Landroid/os/Parcel;->writeParcelableArray([Landroid/os/Parcelable;I)V
-Landroid/os/Parcel;->writeParcelableCreator(Landroid/os/Parcelable;)V
-Landroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V
-Landroid/content/pm/PackageParser$Package;->writeToParcel(Landroid/os/Parcel;I)V
-Landroid/content/res/Resources;->obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
-Landroid/content/res/Resources;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;
-Landroid/content/pm/split/DefaultSplitAssetLoader;->close()V
-Landroid/content/res/AssetManager;->openXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser;
-Landroid/content/res/AssetManager;->close()V
-Landroid/content/res/AssetManager;->openXmlBlockAsset(ILjava/lang/String;)Landroid/content/res/XmlBlock;
-Landroid/content/pm/PackageParser;->generateAppDetailsHiddenActivity(Landroid/content/pm/PackageParser$Package;I[Ljava/lang/String;Z)Landroid/content/pm/PackageParser$Activity;
-Landroid/content/pm/split/DefaultSplitAssetLoader;->loadApkAssets(Ljava/lang/String;I)Landroid/content/res/ApkAssets;
-Landroid/content/pm/PackageParser$Activity;->writeToParcel(Landroid/os/Parcel;I)V
-Landroid/os/FileUtils;->trimFilename(Ljava/lang/StringBuilder;I)V
-Landroid/content/res/ApkAssets;->openXml(Ljava/lang/String;)Landroid/content/res/XmlResourceParser;
-Landroid/content/res/Configuration;->setLocales(Landroid/os/LocaleList;)V
-Landroid/content/pm/PackageParser;->buildTaskAffinityName(Ljava/lang/String;Ljava/lang/String;Ljava/lang/CharSequence;[Ljava/lang/String;)Ljava/lang/String;
-Landroid/content/res/AssetManager;->retrieveAttributes(Landroid/content/res/XmlBlock$Parser;[I[I[I)Z
-Landroid/content/pm/PackageParser;->buildCompoundName(Ljava/lang/String;Ljava/lang/CharSequence;Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String;
-Landroid/content/pm/ActivityInfo;->writeToParcel(Landroid/os/Parcel;I)V
-Landroid/content/res/XmlBlock$Parser;->close()V
-Landroid/content/pm/PackageParser;->validateName(Ljava/lang/String;ZZ)Ljava/lang/String;
-Landroid/util/ArraySet;->equals(Ljava/lang/Object;)Z
-Landroid/content/pm/PackageItemInfo;->writeToParcel(Landroid/os/Parcel;I)V
-Landroid/content/pm/PackageParserCacheHelper$WriteHelper;->finishAndUninstall()V
-Landroid/content/res/TypedArray;->loadStringValueAt(I)Ljava/lang/CharSequence;
-Landroid/content/pm/ApplicationInfo;->writeToParcel(Landroid/os/Parcel;I)V
-Landroid/os/FileUtils;->isValidExtFilename(Ljava/lang/String;)Z
-Landroid/content/res/AssetManager;->findCookieForPath(Ljava/lang/String;)I
-Landroid/content/res/TypedArray;->getNonConfigurationString(II)Ljava/lang/String;
-Landroid/content/res/TypedArray;->peekValue(I)Landroid/util/TypedValue;
-Landroid/app/ActivityThread;->attach(ZJ)V
-Landroid/content/res/TypedArray;->getValueAt(ILandroid/util/TypedValue;)Z
-Landroid/content/res/XmlBlock$Parser;->getAttributeName(I)Ljava/lang/String;
-Landroid/content/res/XmlBlock$Parser;->getAttributeNameResource(I)I
-Landroid/content/pm/PackageParser$ApkLite;-><init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ZIIIILjava/util/List;Landroid/content/pm/PackageParser$SigningDetails;ZZZZZZZII)V
-Landroid/app/ResourcesManager;->createAssetManager(Landroid/content/res/ResourcesKey;)Landroid/content/res/AssetManager;
-Landroid/content/res/AssetManager$Builder;->build()Landroid/content/res/AssetManager;
-Landroid/os/FileUtils;->deleteContents(Ljava/io/File;)Z
-Landroid/os/FileUtils;->deleteContentsAndDir(Ljava/io/File;)Z
-Landroid/content/res/ResourcesImpl;->adjustLanguageTag(Ljava/lang/String;)Ljava/lang/String;
-Landroid/sysprop/DisplayProperties;->tryParseBoolean(Ljava/lang/String;)Ljava/lang/Boolean;
-Landroid/content/pm/PackageParserCacheHelper$WriteHelper;-><init>(Landroid/os/Parcel;)V
+Landroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/CharSequence;
+Landroid/content/pm/PackageItemInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PackageParser$Component;->createIntentsList(Landroid/os/Parcel;)Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Component;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PackageParser$Permission$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/PackageParser$Permission$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Permission;
+Landroid/content/pm/PackageParser$Permission;-><init>(Landroid/os/Parcel;Landroid/content/pm/PackageParser$1;)V
+Landroid/content/pm/PackageParser$Permission;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PermissionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/PermissionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PermissionInfo;
+Landroid/content/pm/PermissionInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/PermissionInfo$1;)V
+Landroid/content/pm/PermissionInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/os/Parcel;->readBoolean()Z
+Landroid/util/ArrayMap;->indexOfNull()I
+Landroid/util/MapCollections$ArrayIterator;-><init>(Landroid/util/MapCollections;I)V
+Landroid/util/ArrayMap$1;->colGetSize()I
+Landroid/util/ArrayMap;->getCollection()Landroid/util/MapCollections;
+Landroid/util/MapCollections;->getValues()Ljava/util/Collection;
+Landroid/util/MapCollections$ValuesCollection;->iterator()Ljava/util/Iterator;
+Landroid/util/ArrayMap;->values()Ljava/util/Collection;
+Landroid/os/Parcel;->readFloat()F
+Landroid/content/pm/PackageBackwardCompatibility;->updatePackage(Landroid/content/pm/PackageParser$Package;)V
+Landroid/os/Parcel;->setDataPosition(I)V
+Landroid/content/pm/PackageParser$Activity;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/ComponentInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/util/SparseArray;->clear()V
+Lcom/android/internal/util/ArrayUtils;->remove(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$Activity$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/PackageParser$Activity$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Activity;
+Landroid/content/pm/PackageParser$Activity;-><init>(Landroid/os/Parcel;Landroid/content/pm/PackageParser$1;)V
+Landroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ActivityInfo;
+Landroid/content/pm/ActivityInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ActivityInfo$1;)V
+Landroid/content/pm/ActivityInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/ComponentName;->hashCode()I
+Landroid/content/pm/PackageParser$Component;->getComponentName()Landroid/content/ComponentName;
+Landroid/os/Parcel;->createIntArray()[I
+Landroid/content/ComponentName;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/util/ArraySet;->contains(Ljava/lang/Object;)Z
+Landroid/os/Parcel;->createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList;
+Landroid/os/Parcel;->obtain()Landroid/os/Parcel;
+Landroid/os/UserHandle;->getAppId(I)I
+Landroid/util/ArrayMap;->clear()V
+Landroid/util/ArraySet;->remove(Ljava/lang/Object;)Z
+Landroid/content/IntentFilter;->actionsIterator()Ljava/util/Iterator;
+Landroid/content/IntentFilter;-><init>(Landroid/os/Parcel;)V
+Landroid/os/Parcel;->updateNativeSize(J)V
+Landroid/content/IntentFilter;->setAutoVerify(Z)V
+Landroid/content/IntentFilter;->setVisibilityToInstantApp(I)V
+Landroid/os/Parcel;->readCharSequence()Ljava/lang/CharSequence;
+Landroid/content/pm/PackageParser$IntentInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/os/SystemProperties;->getBoolean(Ljava/lang/String;Z)Z
+Landroid/os/Parcel;->recycle()V
+Landroid/util/ArraySet;->valueAt(I)Ljava/lang/Object;
+Landroid/util/ArraySet;->valueAtUnchecked(I)Ljava/lang/Object;
+Landroid/content/pm/PackageParser$Package;->isPrivileged()Z
+Landroid/content/pm/ApplicationInfo;->isPrivilegedApp()Z
+Landroid/content/IntentFilter;->schemesIterator()Ljava/util/Iterator;
+Landroid/content/IntentFilter;->typesIterator()Ljava/util/Iterator;
+Landroid/content/IntentFilter;->debugCheck()Z
+Landroid/util/ArrayMap;-><init>(I)V
+Landroid/util/ArrayMap;->containsKey(Ljava/lang/Object;)Z
+Landroid/content/IntentFilter;->getOrder()I
+Landroid/content/pm/PackageSharedLibraryUpdater;->isLibraryPresent(Ljava/util/ArrayList;Ljava/util/ArrayList;Ljava/lang/String;)Z
Landroid/content/pm/PackageParser$Package;->getLongVersionCode()J
-Lcom/android/internal/util/function/pooled/OmniFunction;->run()V
-Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/os/SystemProperties;->get(Ljava/lang/String;)Ljava/lang/String;
-Landroid/os/SystemProperties;->get(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
-Landroid/os/SystemProperties;->getInt(Ljava/lang/String;I)I
-Landroid/os/SystemProperties;->getLong(Ljava/lang/String;J)J
-Landroid/content/res/ThemedResourceCache;->onConfigurationChange(I)V
-Landroid/content/res/TypedArray;->recycle()V
-Landroid/content/res/Configuration;->fixUpLocaleList()V
-Landroid/content/res/XmlBlock;->newParser(I)Landroid/content/res/XmlResourceParser;
-Landroid/content/pm/ComponentInfo;->writeToParcel(Landroid/os/Parcel;I)V
-Landroid/content/res/ApkAssets;->getAssetPath()Ljava/lang/String;
-Landroid/util/MapCollections$MapIterator;->next()Ljava/lang/Object;
-Landroid/content/res/ResourcesImpl;->flushLayoutCache()V
-Landroid/os/FileUtils;->buildValidExtFilename(Ljava/lang/String;)Ljava/lang/String;
-Landroid/content/res/ApkAssets;->getStringFromPool(I)Ljava/lang/CharSequence;
-Landroid/content/pm/Signature;->equals(Ljava/lang/Object;)Z
+Landroid/content/pm/PackageInfo;->composeLongVersionCode(II)J
+Lcom/android/internal/util/ArrayUtils;->isEmpty(Ljava/util/Collection;)Z
+Landroid/content/pm/ApplicationInfo;->isStaticSharedLibrary()Z
+Landroid/content/pm/ApplicationInfo;->getCodePath()Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->getResourcePath()Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->isSystemApp()Z
+Landroid/util/ArraySet;->equals(Ljava/lang/Object;)Z
+Landroid/os/Environment;->getDataDirectory(Ljava/lang/String;)Ljava/io/File;
+Landroid/content/pm/PackageParser$ActivityIntentInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PackageSharedLibraryUpdater;->prefixImplicitDependency(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Service;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PackageSharedLibraryUpdater;->removeLibrary(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Service$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Service;
+Landroid/content/pm/ServiceInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ServiceInfo$1;)V
+Landroid/content/pm/ServiceInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PackageParser$Service$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/PackageParser$Service;-><init>(Landroid/os/Parcel;Landroid/content/pm/PackageParser$1;)V
+Landroid/content/pm/ServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ServiceInfo;
+Landroid/content/pm/ServiceInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/os/Parcel;->readArrayMapInternal(Landroid/util/ArrayMap;ILjava/lang/ClassLoader;)V
+Landroid/os/Parcel;->readValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;
+Landroid/util/ArrayMap;->append(Ljava/lang/Object;Ljava/lang/Object;)V
+Landroid/util/ArrayMap;->validate()V
Landroid/content/pm/PackageUserState;->equals(Ljava/lang/Object;)Z
-Landroid/util/ArrayMap$1;->colGetEntry(II)Ljava/lang/Object;
-Lcom/android/internal/os/BackgroundThread;->ensureThreadLocked()V
-Landroid/app/ActivityThread;-><init>()V
-Landroid/app/ActivityThread;->getSystemContext()Landroid/app/ContextImpl;
-Landroid/app/ContextImpl;->createSystemContext(Landroid/app/ActivityThread;)Landroid/app/ContextImpl;
-Landroid/app/ContextImpl;-><init>(Landroid/app/ContextImpl;Landroid/app/ActivityThread;Landroid/app/LoadedApk;Ljava/lang/String;Landroid/os/IBinder;Landroid/os/UserHandle;ILjava/lang/ClassLoader;Ljava/lang/String;)V
-Landroid/app/ResourcesManager;->getDisplayMetrics()Landroid/util/DisplayMetrics;
-Landroid/app/ResourcesManager;->getDisplayMetrics(ILandroid/view/DisplayAdjustments;)Landroid/util/DisplayMetrics;
+Landroid/content/IntentFilter;->getPriority()I
+Landroid/os/Parcel;->createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object;
+Landroid/os/BaseBundle;->readFromParcelInner(Landroid/os/Parcel;I)V
+Landroid/os/Parcel;->hasReadWriteHelper()Z
+Landroid/os/BaseBundle;->initializeFromParcelLocked(Landroid/os/Parcel;ZZ)V
+Landroid/os/BaseBundle;->isEmptyParcel(Landroid/os/Parcel;)Z
+Landroid/content/pm/PackageParser$ServiceIntentInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PackageParser$Provider;-><init>(Landroid/os/Parcel;)V
+Landroid/os/Parcel;->freeBuffer()V
+Landroid/content/IntentFilter$AuthorityEntry;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/PackageParser$Provider$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/PackageParser$Provider$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$Provider;
+Landroid/content/pm/PackageParser$Provider;-><init>(Landroid/os/Parcel;Landroid/content/pm/PackageParser$1;)V
+Landroid/content/pm/ProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/ProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ProviderInfo;
+Landroid/content/pm/ProviderInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ProviderInfo$1;)V
+Landroid/content/pm/ProviderInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/util/MapCollections;->getEntrySet()Ljava/util/Set;
+Landroid/content/pm/PackageParser$SigningDetails;->checkCapability(Landroid/content/pm/PackageParser$SigningDetails;I)Z
+Landroid/content/IntentFilter;->countActions()I
+Landroid/content/IntentFilter;->countCategories()I
+Landroid/content/IntentFilter;->getAction(I)Ljava/lang/String;
+Landroid/content/IntentFilter;->hasAction(Ljava/lang/String;)Z
+Landroid/content/pm/PackageParser$SigningDetails;->hasCertificate(Landroid/content/pm/Signature;I)Z
+Landroid/content/pm/PackageItemInfo;-><init>()V
+Landroid/util/DisplayMetrics;-><init>()V
+Landroid/content/pm/FeatureInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/FeatureInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/FeatureInfo;
+Landroid/content/pm/FeatureInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/FeatureInfo$1;)V
+Landroid/content/pm/FeatureInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/util/DisplayMetrics;->setToDefaults()V
+Landroid/os/Parcel;->unmarshall([BII)V
+Landroid/content/pm/PackageParser$Package;-><init>(Landroid/os/Parcel;)V
+Landroid/content/pm/ApplicationInfo;-><init>()V
+Landroid/content/pm/PackageParser;->setCallback(Landroid/content/pm/PackageParser$Callback;)V
+Landroid/content/pm/PackageParser;->getCachedResult(Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
+Landroid/os/Parcel;->setReadWriteHelper(Landroid/os/Parcel$ReadWriteHelper;)V
+Landroid/content/pm/PackageParser;->setSeparateProcesses([Ljava/lang/String;)V
+Landroid/content/pm/PackageParser;->setOnlyCoreApps(Z)V
+Landroid/content/pm/PackageParser;->setDisplayMetrics(Landroid/util/DisplayMetrics;)V
+Landroid/content/pm/PackageParser;->setCacheDir(Ljava/io/File;)V
+Landroid/content/pm/PackageParser;->parsePackage(Ljava/io/File;IZ)Landroid/content/pm/PackageParser$Package;
+Landroid/content/pm/PackageParser;->getCacheKey(Ljava/io/File;I)Ljava/lang/String;
+Landroid/content/pm/PackageParser;-><init>()V
+Landroid/content/pm/PackageSharedLibraryUpdater;->prefixRequiredLibrary(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)V
+Landroid/content/pm/PackageSharedLibraryUpdater;->prefix(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList;
+Landroid/content/pm/PackageParser$SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/PackageParser$SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageParser$SigningDetails;
+Landroid/os/Parcel;->readArraySet(Ljava/lang/ClassLoader;)Landroid/util/ArraySet;
+Landroid/content/pm/PackageParser$Package;->readKeySetMapping(Landroid/os/Parcel;)Landroid/util/ArrayMap;
+Landroid/os/Parcel;->createByteArray()[B
+Landroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ApplicationInfo;
+Landroid/content/pm/ApplicationInfo;-><init>(Landroid/os/Parcel;Landroid/content/pm/ApplicationInfo$1;)V
+Landroid/content/pm/ApplicationInfo;-><init>(Landroid/os/Parcel;)V
+Landroid/util/ArraySet$1;->colGetEntry(II)Ljava/lang/Object;
+Landroid/content/IntentFilter;->getCategory(I)Ljava/lang/String;
+Landroid/content/IntentFilter;->hasCategory(Ljava/lang/String;)Z
+Landroid/content/pm/ApplicationInfo;->isUpdatedSystemApp()Z
+Landroid/content/IntentFilter;->countDataSchemes()I
+Landroid/content/IntentFilter;->countDataTypes()I
+Landroid/content/IntentFilter;->countDataAuthorities()I
Landroid/content/pm/PackageParser$Package;->setApplicationVolumeUuid(Ljava/lang/String;)V
+Landroid/os/storage/StorageManager;->convert(Ljava/lang/String;)Ljava/util/UUID;
+Landroid/content/pm/PackageParser$Package;->setApplicationInfoCodePath(Ljava/lang/String;)V
+Landroid/content/pm/ApplicationInfo;->setCodePath(Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Package;->setApplicationInfoBaseCodePath(Ljava/lang/String;)V
+Landroid/content/pm/ApplicationInfo;->setBaseCodePath(Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Package;->setApplicationInfoSplitCodePaths([Ljava/lang/String;)V
+Landroid/content/pm/ApplicationInfo;->setSplitCodePaths([Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Package;->setApplicationInfoResourcePath(Ljava/lang/String;)V
+Landroid/content/pm/ApplicationInfo;->setResourcePath(Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Package;->setApplicationInfoBaseResourcePath(Ljava/lang/String;)V
+Landroid/content/pm/ApplicationInfo;->setBaseResourcePath(Ljava/lang/String;)V
+Landroid/content/pm/PackageParser$Package;->setApplicationInfoSplitResourcePaths([Ljava/lang/String;)V
+Landroid/content/pm/ApplicationInfo;->setSplitResourcePaths([Ljava/lang/String;)V
Landroid/content/pm/AndroidHidlUpdater;->updatePackage(Landroid/content/pm/PackageParser$Package;)V
-Landroid/content/res/ApkAssets;->close()V
-Landroid/content/res/XmlBlock$Parser;->getAttributeBooleanValue(IZ)Z
-Landroid/content/res/XmlBlock$Parser;->getAttributeBooleanValue(Ljava/lang/String;Ljava/lang/String;Z)Z
-Landroid/content/pm/PackageParser;->setMaxAspectRatio(Landroid/content/pm/PackageParser$Package;)V
-Landroid/content/pm/PackageParserCacheHelper$WriteHelper;->writeString(Landroid/os/Parcel;Ljava/lang/String;)V
-Landroid/os/Parcel;->writeTypedList(Ljava/util/List;)V
-Landroid/os/Parcel;->writeTypedList(Ljava/util/List;I)V
-Landroid/content/res/Configuration;->getLocales()Landroid/os/LocaleList;
-Landroid/view/DisplayEventReceiver;-><init>(Landroid/os/Looper;I)V
-Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->doInvoke()Ljava/lang/Object;
-Landroid/content/pm/PackageSharedLibraryUpdater;->prefixImplicitDependency(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;Ljava/lang/String;)V
-Landroid/util/MapCollections$MapIterator;->getKey()Ljava/lang/Object;
-Landroid/util/MapCollections$ValuesCollection;->iterator()Ljava/util/Iterator;
-Lcom/android/internal/os/BatteryStatsImpl$SystemClocks;->elapsedRealtime()J
-Landroid/app/LoadedApk;->makeApplication(ZLandroid/app/Instrumentation;)Landroid/app/Application;
-Landroid/content/pm/IntentFilterVerificationInfo;->getIntFromXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
-Landroid/content/res/ResourcesImpl;->calcConfigChanges(Landroid/content/res/Configuration;)I
-Landroid/content/pm/PackageBackwardCompatibility$AndroidTestRunnerSplitUpdater;->updatePackage(Landroid/content/pm/PackageParser$Package;)V
-Landroid/util/SparseArray;->valueAt(I)Ljava/lang/Object;
+Landroid/content/pm/PackageParser$Package;->getChildPackageNames()Ljava/util/List;
+Landroid/content/pm/SELinuxUtil;->assignSeinfoUser(Landroid/content/pm/PackageUserState;)Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->initForUser(I)V
+Landroid/os/UserHandle;->getUid(II)I
+Landroid/os/Environment;->getDataUserDePackageDirectory(Ljava/lang/String;ILjava/lang/String;)Ljava/io/File;
+Landroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;I)Ljava/io/File;
+Landroid/os/Environment;->getDataUserDeDirectory(Ljava/lang/String;)Ljava/io/File;
+Landroid/os/Environment;->getDataUserCePackageDirectory(Ljava/lang/String;ILjava/lang/String;)Ljava/io/File;
+Landroid/os/Environment;->getDataUserCeDirectory(Ljava/lang/String;I)Ljava/io/File;
+Landroid/os/Environment;->getDataUserCeDirectory(Ljava/lang/String;)Ljava/io/File;
+Landroid/content/pm/SharedLibraryInfo;->getPath()Ljava/lang/String;
+Landroid/content/pm/ApplicationInfo;->isInstantApp()Z
+Landroid/permission/PermissionManager$SplitPermissionInfo;->getNewPermissions()Ljava/util/List;
+Landroid/permission/PermissionManager$SplitPermissionInfo;->getSplitPermission()Ljava/lang/String;
+Landroid/content/pm/PackageParser$SigningDetails;->hasAncestorOrSelf(Landroid/content/pm/PackageParser$SigningDetails;)Z
+Landroid/content/pm/PackageParser$Package;->isVendor()Z
+Landroid/content/pm/ApplicationInfo;->isVendor()Z
+Landroid/util/ArraySet;->iterator()Ljava/util/Iterator;
+Landroid/util/ArraySet;->getCollection()Landroid/util/MapCollections;
+Landroid/util/MapCollections;->getKeySet()Ljava/util/Set;
+Landroid/util/MapCollections$KeySet;->iterator()Ljava/util/Iterator;
+Landroid/util/ArraySet$1;->colGetSize()I
+Lcom/android/server/SystemConfig;->getInstance()Lcom/android/server/SystemConfig;
+Landroid/content/pm/PackageParser$Package;->isProduct()Z
+Landroid/content/pm/ApplicationInfo;->isProduct()Z
+Landroid/content/pm/PackageParser$Package;->isSystem()Z
+Landroid/content/pm/PackageParser$Package;->isUpdatedSystemApp()Z
+Lcom/android/server/SystemConfig;->getProductPrivAppPermissions(Ljava/lang/String;)Landroid/util/ArraySet;
+Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z
+Lcom/android/internal/util/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V
+Lcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;II)V
+Lcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;)V
+Lcom/android/internal/util/FastXmlSerializer;->append(C)V
+Lcom/android/internal/util/FastXmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
+Lcom/android/internal/util/FastXmlSerializer;->appendIndent(I)V
+Lcom/android/internal/util/FastXmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
+Lcom/android/internal/util/FastXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;
+Landroid/content/pm/Signature;->toChars([C[I)[C
+Landroid/content/pm/Signature;->hashCode()I
+Landroid/content/pm/IntentFilterVerificationInfo;->writeToXml(Lorg/xmlpull/v1/XmlSerializer;)V
+Landroid/util/ArrayMap;->entrySet()Ljava/util/Set;
+Landroid/util/MapCollections$EntrySet;->iterator()Ljava/util/Iterator;
+Landroid/util/MapCollections$MapIterator;-><init>(Landroid/util/MapCollections;)V
+Landroid/util/MapCollections$EntrySet;-><init>(Landroid/util/MapCollections;)V
+Lcom/android/internal/util/ArrayUtils;->isEmpty([Ljava/lang/Object;)Z
+Landroid/util/Base64$Encoder;->process([BIIZ)Z
+Landroid/os/FileUtils;->bytesToFile(Ljava/lang/String;[B)V
+Landroid/os/FileUtils;->$closeResource(Ljava/lang/Throwable;Ljava/lang/AutoCloseable;)V
+Landroid/util/ArraySet;->removeAt(I)Ljava/lang/Object;
+Landroid/util/ArraySet;->shouldShrink()Z
+Landroid/util/MapCollections;-><init>()V
+Landroid/content/IntentFilter;->getAutoVerify()Z
+Landroid/content/IntentFilter;->match(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;Ljava/util/Set;Ljava/lang/String;)I
+Landroid/content/IntentFilter;->matchAction(Ljava/lang/String;)Z
+Landroid/content/pm/ApplicationInfo;->setVersionCode(J)V
+Landroid/os/Process;->isIsolated(I)Z
+Landroid/content/pm/PackageUserState;->isAvailable(I)Z
+Landroid/content/pm/PackageParser;->checkUseInstalledOrHidden(ILandroid/content/pm/PackageUserState;Landroid/content/pm/ApplicationInfo;)Z
+Landroid/content/pm/PackageParser$Package;->isMatch(I)Z
+Landroid/content/pm/PackageParser;->copyNeeded(ILandroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageUserState;Landroid/os/Bundle;I)Z
+Landroid/content/pm/PackageParser;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;ILandroid/content/pm/PackageUserState;)V
+Landroid/content/pm/PackageParser;->generateApplicationInfo(Landroid/content/pm/PackageParser$Package;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ApplicationInfo;
+Landroid/content/pm/FallbackCategoryProvider;->getFallbackCategory(Ljava/lang/String;)I
+Landroid/os/storage/StorageManager;->isFileEncryptedNativeOnly()Z
+Landroid/os/storage/StorageManager;->isEncrypted()Z
+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/PackageInfo;-><init>()V
+Landroid/os/Parcel;->writeInterfaceToken(Ljava/lang/String;)V
+Landroid/os/BinderProxy;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Landroid/os/Binder;->checkParcel(Landroid/os/IBinder;ILandroid/os/Parcel;Ljava/lang/String;)V
+Landroid/os/Binder;->isTracingEnabled()Z
+Landroid/os/Parcel;->readException()V
+Landroid/os/Parcel;->readExceptionCode()I
+Landroid/os/UserHandle;->getUserId(I)I
+Landroid/util/proto/ProtoInputStream;->fillBuffer()V
+Landroid/util/proto/ProtoInputStream;->getOffset()I
+Landroid/util/proto/ProtoStream;->getOffsetFromToken(J)I
+Landroid/util/proto/ProtoInputStream;->incOffset(I)V
+Landroid/util/proto/ProtoInputStream;->readVarint()J
+Landroid/util/proto/ProtoInputStream;->nextField()I
+Landroid/util/proto/ProtoInputStream;->readTag()V
+Landroid/util/proto/ProtoInputStream;->assertFreshData()V
+Landroid/util/proto/ProtoInputStream;->assertFieldNumber(J)V
+Landroid/util/proto/ProtoInputStream;->assertWireType(I)V
+Landroid/util/proto/ProtoInputStream;->getFieldNumber()I
+Landroid/util/proto/ProtoInputStream;->checkPacked(J)V
+Lcom/android/internal/util/ArrayUtils;->newUnpaddedIntArray(I)[I
+Landroid/util/proto/ProtoInputStream;->readLong(J)J
+Landroid/util/SparseIntArray;-><init>(I)V
+Landroid/util/SparseIntArray;-><init>()V
+Landroid/util/proto/ProtoInputStream;->readInt(J)I
+Landroid/util/proto/ProtoInputStream;->start(J)J
+Landroid/util/proto/ProtoStream;->makeToken(IZIII)J
+Landroid/util/proto/ProtoInputStream;->end(J)V
+Landroid/util/proto/ProtoInputStream;->readString(J)Ljava/lang/String;
+Landroid/util/proto/ProtoInputStream;->readRawString(I)Ljava/lang/String;
+Landroid/util/ArraySet;->addAll(Ljava/util/Collection;)Z
+Landroid/app/usage/UsageStats;-><init>()V
+Landroid/content/res/Configuration;->readFromProto(Landroid/util/proto/ProtoInputStream;J)V
+Landroid/util/proto/ProtoInputStream;->nextField(J)Z
+Lcom/android/internal/util/Preconditions;->checkNotNull(Ljava/lang/Object;)Ljava/lang/Object;
+Landroid/net/Uri;->access$300()Ljava/lang/String;
+Landroid/net/UriCodec;->appendDecoded(Ljava/lang/StringBuilder;Ljava/lang/String;ZLjava/nio/charset/Charset;Z)V
+Landroid/net/UriCodec;->flushDecodingByteAccumulator(Ljava/lang/StringBuilder;Ljava/nio/charset/CharsetDecoder;Ljava/nio/ByteBuffer;Z)V
+Landroid/net/Uri$PathPart;->getPathSegments()Landroid/net/Uri$PathSegments;
+Landroid/net/Uri$Part;->nonNull(Landroid/net/Uri$Part;)Landroid/net/Uri$Part;
+Landroid/net/Uri$HierarchicalUri;->getPathSegments()Ljava/util/List;
+Landroid/os/UserHandle;->getCallingUserId()I
+Lcom/android/internal/util/FastPrintWriter;->appendLocked(Ljava/lang/String;II)V
+Landroid/net/Uri;->decode(Ljava/lang/String;)Ljava/lang/String;
+Landroid/net/UriCodec;->decode(Ljava/lang/String;ZLjava/nio/charset/Charset;Z)Ljava/lang/String;
+Landroid/text/TextUtils;->safeIntern(Ljava/lang/String;)Ljava/lang/String;
+Landroid/view/animation/PathInterpolator;->initPath(Landroid/graphics/Path;)V
+Landroid/app/WindowConfiguration;->setAppBounds(Landroid/graphics/Rect;)V
+Landroid/app/WindowConfiguration;->setBounds(Landroid/graphics/Rect;)V
+Landroid/app/WindowConfiguration;->setWindowingMode(I)V
+Landroid/app/WindowConfiguration;->setActivityType(I)V
+Landroid/app/WindowConfiguration;->setAlwaysOnTop(I)V
+Landroid/app/WindowConfiguration;->setRotation(I)V
+Landroid/app/WindowConfiguration;->setDisplayWindowingMode(I)V
+Landroid/os/LocaleList;->isEmpty()Z
+Landroid/content/res/AssetManager;->getResourceValue(IILandroid/util/TypedValue;Z)Z
+Landroid/content/res/Configuration;->fixUpLocaleList()V
+Landroid/content/res/Resources;->obtainTempTypedValue()Landroid/util/TypedValue;
+Landroid/content/res/Resources;->releaseTempTypedValue(Landroid/util/TypedValue;)V
+Landroid/graphics/Rect;->setEmpty()V
+Landroid/net/UriCodec;->getNextCharacter(Ljava/lang/String;IILjava/lang/String;)C
+Landroid/net/UriCodec;->hexCharToValue(C)I
+Landroid/net/Uri$AbstractPart;->getDecoded()Ljava/lang/String;
+Landroid/net/Uri$PathSegments;->size()I
+Landroid/app/WindowConfiguration;->setToDefaults()V
+Lcom/android/internal/util/LineBreakBufferedWriter;->write(Ljava/lang/String;II)V
+Landroid/net/Uri;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+Landroid/net/Uri;->isAllowed(CLjava/lang/String;)Z
+Landroid/os/BaseBundle;->unparcel()V
+Landroid/content/Intent;->getAction()Ljava/lang/String;
+Landroid/os/Process;->myUid()I
+Landroid/content/res/ResourcesImpl;->getValue(ILandroid/util/TypedValue;Z)V
+Landroid/graphics/Rect;->set(Landroid/graphics/Rect;)V
+Landroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;)V
+Landroid/app/WindowConfiguration;->setTo(Landroid/app/WindowConfiguration;)V
+Landroid/util/ArrayMap;->ensureCapacity(I)V
+Landroid/util/TypedValue;->complexToFloat(I)F
+Landroid/content/res/ThemedResourceCache;->pruneEntriesLocked(Landroid/util/LongSparseArray;I)Z
+Landroid/util/TypedValue;->applyDimension(IFLandroid/util/DisplayMetrics;)F
+Landroid/os/MessageQueue;->enqueueMessage(Landroid/os/Message;J)Z
+Landroid/os/Message;->markInUse()V
+Landroid/os/Binder;-><init>()V
+Landroid/os/Binder;-><init>(Ljava/lang/String;)V
+Landroid/os/UserHandle;->isSameApp(II)Z
+Landroid/app/WindowConfiguration;-><init>()V
+Landroid/app/WindowConfiguration;->unset()V
+Landroid/content/Intent;->getPackage()Ljava/lang/String;
+Lcom/android/internal/util/ArrayUtils;->unstableRemoveIf(Ljava/util/ArrayList;Ljava/util/function/Predicate;)I
+Landroid/util/TypedValue;->complexToDimensionPixelSize(ILandroid/util/DisplayMetrics;)I
+Landroid/net/Uri$HierarchicalUri;->getAuthority()Ljava/lang/String;
+Landroid/app/IApplicationThread$Stub;->asBinder()Landroid/os/IBinder;
+Landroid/os/UserHandle;->getIdentifier()I
+Landroid/util/MemoryIntArray;->enforceNotClosed()V
+Landroid/util/MemoryIntArray;->isClosed()Z
+Landroid/os/MessageQueue;->next()Landroid/os/Message;
+Landroid/app/ContextImpl;->getResources()Landroid/content/res/Resources;
+Landroid/net/Uri$Builder;->path(Landroid/net/Uri$PathPart;)Landroid/net/Uri$Builder;
+Landroid/util/Singleton;->get()Ljava/lang/Object;
+Lcom/android/internal/util/MessageUtils;->findMessageNames([Ljava/lang/Class;[Ljava/lang/String;)Landroid/util/SparseArray;
+Landroid/app/ActivityManager;->getService()Landroid/app/IActivityManager;
+Landroid/content/ContentProvider;->access$100(Landroid/content/ContentProvider;Ljava/lang/String;)Ljava/lang/String;
+Landroid/content/ContentProvider;->setCallingPackage(Ljava/lang/String;)Ljava/lang/String;
+Landroid/content/ContentProvider;->onCallingPackageChanged()V
+Landroid/app/ContextImpl;->getUserId()I
+Landroid/util/TimingsTraceLog;->assertSameThread()V
+Landroid/net/Uri$StringUri;->getAuthorityPart()Landroid/net/Uri$Part;
+Landroid/os/Binder;->attachInterface(Landroid/os/IInterface;Ljava/lang/String;)V
+Landroid/net/Uri$Builder;->authority(Landroid/net/Uri$Part;)Landroid/net/Uri$Builder;
+Landroid/app/NotificationChannel;->safeInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;I)I
+Landroid/app/NotificationChannel;->tryParseInt(Ljava/lang/String;I)I
+Landroid/app/NotificationChannel;->safeBool(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Z)Z
+Landroid/net/Uri;-><init>(Landroid/net/Uri$1;)V
+Landroid/net/Uri;-><init>()V
+Landroid/net/Uri$AbstractHierarchicalUri;-><init>(Landroid/net/Uri$1;)V
+Landroid/net/Uri$AbstractHierarchicalUri;-><init>()V
+Landroid/app/NotificationChannel;->getTrimmedString(Ljava/lang/String;)Ljava/lang/String;
+Landroid/app/ActivityManager;->isLowRamDeviceStatic()Z
+Landroid/content/IntentFilter;->matchCategories(Ljava/util/Set;)Ljava/lang/String;
Landroid/util/ArraySet;->ensureCapacity(I)V
-Landroid/os/storage/StorageManager;->convert(Ljava/lang/String;)Ljava/util/UUID;
-Landroid/os/storage/StorageManager;->convert(Ljava/util/UUID;)Ljava/lang/String;
-Landroid/content/pm/PackageParser;->checkOverlayRequiredSystemProperty(Ljava/lang/String;Ljava/lang/String;)Z
+Landroid/util/ArraySet$1;-><init>(Landroid/util/ArraySet;)V
+Landroid/util/MapCollections$KeySet;-><init>(Landroid/util/MapCollections;)V
+Landroid/provider/Settings$GenerationTracker;->getCurrentGeneration()I
+Landroid/app/NotificationChannel;->getAudioAttributes()Landroid/media/AudioAttributes;
+Landroid/app/NotificationChannel;->getName()Ljava/lang/CharSequence;
+Landroid/app/NotificationChannel;->getImportance()I
+Landroid/app/NotificationChannel;->getOriginalImportance()I
+Lcom/android/internal/util/ArrayUtils;->size([Ljava/lang/Object;)I
+Landroid/app/NotificationChannel;->canShowBadge()Z
+Landroid/app/NotificationChannel;->getGroup()Ljava/lang/String;
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->setIfInBounds([Ljava/lang/Object;ILjava/lang/Object;)V
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->mask(II)I
+Landroid/os/Message;->obtain()Landroid/os/Message;
+Landroid/os/Handler;->enqueueMessage(Landroid/os/MessageQueue;Landroid/os/Message;J)Z
+Landroid/os/ThreadLocalWorkSource;->getUid()I
+Landroid/os/Handler;->sendMessageAtTime(Landroid/os/Message;J)Z
+Landroid/app/NotificationChannel;->isBlockableSystem()Z
+Landroid/app/NotificationChannel;->getId()Ljava/lang/String;
+Landroid/app/NotificationChannel;->getDescription()Ljava/lang/String;
+Landroid/app/NotificationChannel;->shouldVibrate()Z
+Landroid/app/NotificationChannel;->getUserLockedFields()I
+Landroid/app/NotificationChannel;->shouldShowLights()Z
+Landroid/app/NotificationChannel;->isDeleted()Z
+Landroid/app/NotificationChannel;->isFgServiceShown()Z
+Landroid/app/NotificationChannel;->writeXml(Lorg/xmlpull/v1/XmlSerializer;)V
+Landroid/app/NotificationChannel;->writeXml(Lorg/xmlpull/v1/XmlSerializer;ZLandroid/content/Context;)V
+Landroid/app/NotificationChannel;->canBypassDnd()Z
+Landroid/app/NotificationChannel;->getLockscreenVisibility()I
+Landroid/app/NotificationChannel;->getSound()Landroid/net/Uri;
+Landroid/media/AudioAttributes;->getUsage()I
+Landroid/media/AudioAttributes;->getContentType()I
+Landroid/media/AudioAttributes;->getFlags()I
+Landroid/app/NotificationChannel;->getLightColor()I
+Landroid/app/NotificationChannel;->getVibrationPattern()[J
+Landroid/app/NotificationChannel;->canBubble()Z
+Landroid/net/Uri$StringUri;->toString()Ljava/lang/String;
+Landroid/os/Handler;->sendMessageDelayed(Landroid/os/Message;J)Z
+Landroid/os/Message;->recycleUnchecked()V
+Landroid/net/Uri$PathPart;->getEncoded()Ljava/lang/String;
+Landroid/net/Uri$PathSegments;->get(I)Ljava/lang/Object;
+Landroid/net/Uri$PathSegments;->get(I)Ljava/lang/String;
+Landroid/net/Uri$PathSegmentsBuilder;->add(Ljava/lang/String;)V
+Landroid/content/ContentProvider;->getAuthorityWithoutUserId(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/UserHandle;->myUserId()I
+Landroid/provider/Settings$NameValueCache;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/net/Uri$StringUri;->getAuthority()Ljava/lang/String;
+Landroid/os/BaseBundle;->getString(Ljava/lang/String;)Ljava/lang/String;
+Landroid/os/Bundle;->setDefusable(Landroid/os/Bundle;Z)Landroid/os/Bundle;
+Landroid/provider/Settings$ContentProviderHolder;->getProvider(Landroid/content/ContentResolver;)Landroid/content/IContentProvider;
+Landroid/content/ContentResolver;->getPackageName()Ljava/lang/String;
+Landroid/provider/Settings$ContentProviderHolder;->access$000(Landroid/provider/Settings$ContentProviderHolder;)Landroid/net/Uri;
+Landroid/content/ContentProvider$Transport;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
+Landroid/content/ContentProvider;->access$200(Landroid/content/ContentProvider;Ljava/lang/String;)V
+Landroid/content/ContentProvider;->validateIncomingAuthority(Ljava/lang/String;)V
+Landroid/content/ContentProvider;->matchesOurAuthorities(Ljava/lang/String;)Z
+Landroid/content/ContentProvider;->call(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;
+Landroid/provider/Settings;->isInSystemServer()Z
+Landroid/os/BaseBundle;-><init>(Ljava/lang/ClassLoader;I)V
+Landroid/os/BaseBundle;->putInt(Ljava/lang/String;I)V
+Landroid/os/Bundle;-><init>()V
+Landroid/os/BaseBundle;-><init>()V
+Landroid/os/BaseBundle;->getInt(Ljava/lang/String;I)I
+Landroid/os/Bundle;->setDefusable(Z)V
+Landroid/os/BaseBundle;->containsKey(Ljava/lang/String;)Z
+Landroid/app/ActivityManager;->handleIncomingUser(IIIZZLjava/lang/String;Ljava/lang/String;)I
+Landroid/provider/Settings$System;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/provider/Settings$System;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)I
+Landroid/media/AudioSystem;->getOutputDeviceName(I)Ljava/lang/String;
+Landroid/app/ContextImpl;->getContentResolver()Landroid/content/ContentResolver;
+Landroid/content/IntentFilter;->matchData(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)I
+Landroid/content/Intent;->getFlags()I
+Landroid/util/Slog;->i(Ljava/lang/String;Ljava/lang/String;)I
+Lcom/android/server/LocalServices;->getService(Ljava/lang/Class;)Ljava/lang/Object;
+Lcom/android/internal/util/BitUtils;->unpackBits(J)[I
+Landroid/util/SparseIntArray;->get(II)I
+Landroid/os/BaseBundle;->copyInternal(Landroid/os/BaseBundle;Z)V
+Landroid/app/ActivityThread;->getPackageManager()Landroid/content/pm/IPackageManager;
+Landroid/app/AppGlobals;->getPackageManager()Landroid/content/pm/IPackageManager;
+Landroid/os/BaseBundle;-><init>(Z)V
+Lcom/android/internal/util/XmlUtils;->readThisArrayMapXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;)Landroid/util/ArrayMap;
+Landroid/os/BaseBundle;->deepCopyValue(Ljava/lang/Object;)Ljava/lang/Object;
+Lcom/android/internal/util/XmlUtils;->readThisValueXml(Lorg/xmlpull/v1/XmlPullParser;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;Z)Ljava/lang/Object;
+Landroid/os/PersistableBundle;-><init>(Landroid/util/ArrayMap;)V
+Lcom/android/internal/util/BitUtils;->packBits([I)J
+Landroid/os/PersistableBundle;->isValidType(Ljava/lang/Object;)Z
+Lcom/android/internal/util/XmlUtils;->readThisPrimitiveValueXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/Object;
+Landroid/net/UidRange;->hashCode()I
+Landroid/util/Pair;-><init>(Ljava/lang/Object;Ljava/lang/Object;)V
+Landroid/os/LocaleList;->hashCode()I
+Landroid/content/IIntentReceiver$Stub;->asBinder()Landroid/os/IBinder;
+Landroid/app/job/JobInfo;->getRequiredNetwork()Landroid/net/NetworkRequest;
+Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V
+Lcom/android/internal/os/ProcTimeInStateReader;->initializeTimeInStateFormat(Ljava/nio/file/Path;)V
+Landroid/net/Uri$AbstractPart;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;ILjava/lang/Object;)V
+Landroid/os/ServiceManager;->getIServiceManager()Landroid/os/IServiceManager;
+Landroid/util/Slog;->d(Ljava/lang/String;Ljava/lang/String;)I
+Lcom/android/internal/util/StatLogger;->getTime()J
+Landroid/util/TimingsTraceLog;->traceBegin(Ljava/lang/String;)V
+Landroid/util/TimingsTraceLog;->traceEnd()V
+Landroid/util/TimingsTraceLog;->logDuration(Ljava/lang/String;J)V
+Landroid/net/Uri$HierarchicalUri;-><init>(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$PathPart;Landroid/net/Uri$Part;Landroid/net/Uri$Part;Landroid/net/Uri$1;)V
+Landroid/net/Uri$HierarchicalUri;-><init>(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$PathPart;Landroid/net/Uri$Part;Landroid/net/Uri$Part;)V
+Landroid/net/Uri$Builder;-><init>()V
+Landroid/net/Uri$Builder;->scheme(Ljava/lang/String;)Landroid/net/Uri$Builder;
+Landroid/net/Uri$Builder;->query(Landroid/net/Uri$Part;)Landroid/net/Uri$Builder;
+Landroid/net/Uri$Builder;->fragment(Landroid/net/Uri$Part;)Landroid/net/Uri$Builder;
+Landroid/net/Uri$Builder;->build()Landroid/net/Uri;
+Landroid/net/Uri$Builder;->hasSchemeOrAuthority()Z
+Landroid/net/Uri$PathPart;->makeAbsolute(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart;
+Landroid/app/ContextImpl;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;
+Landroid/app/SystemServiceRegistry;->getSystemService(Landroid/app/ContextImpl;Ljava/lang/String;)Ljava/lang/Object;
+Landroid/util/ArrayMap;->isEmpty()Z
+Landroid/app/SystemServiceRegistry$CachedServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;
+Lcom/android/internal/util/StateMachine$SmHandler;->completeConstruction()V
+Landroid/os/SystemProperties;->getInt(Ljava/lang/String;I)I
+Landroid/os/ThreadLocalWorkSource;->setUid(I)J
+Landroid/os/ThreadLocalWorkSource;->getToken()J
+Landroid/os/ThreadLocalWorkSource;->restore(J)V
+Landroid/os/ThreadLocalWorkSource;->parseUidFromToken(J)I
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->fillInArg(Ljava/lang/Object;)Z
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->access$000(II)I
+Landroid/os/Handler;->dispatchMessage(Landroid/os/Message;)V
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->invoke(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+Lcom/android/internal/util/ArrayUtils;->contains([II)Z
+Landroid/os/Handler;-><init>(Landroid/os/Looper;Landroid/os/Handler$Callback;Z)V
+Landroid/os/UserHandle;->isIsolated(I)Z
+Landroid/app/ContextImpl;->checkPermission(Ljava/lang/String;II)I
+Landroid/app/ContextImpl;->checkCallingOrSelfPermission(Ljava/lang/String;)I
+Landroid/net/Uri$StringUri;->findSchemeSeparator()I
+Landroid/content/pm/PackageUserState;->isMatch(Landroid/content/pm/ComponentInfo;I)Z
+Landroid/content/pm/PackageUserState;->isEnabled(Landroid/content/pm/ComponentInfo;I)Z
+Landroid/content/pm/PackageUserState;->reportIfDebug(ZI)Z
+Landroid/content/pm/PackageParser$Package;->isExternal()Z
+Landroid/content/pm/ApplicationInfo;->isExternal()Z
+Landroid/content/pm/ApplicationInfo;->isSystemExt()Z
+Landroid/util/Spline$MonotoneCubicSpline;->interpolate(F)F
+Landroid/app/job/JobInfo;->getId()I
+Landroid/util/Spline$MonotoneCubicSpline;-><init>([F[F)V
+Landroid/content/res/ApkAssets;->getStringFromPool(I)Ljava/lang/CharSequence;
+Landroid/util/MemoryIntArray;->size()I
+Landroid/os/Process;->myTid()I
+Landroid/app/-$$Lambda$ResourcesManager$QJ7UiVk_XS90KuXAsIjIEym1DnM;->test(Ljava/lang/Object;)Z
+Landroid/app/ResourcesManager;->lambda$static$0(Ljava/lang/ref/WeakReference;)Z
+Landroid/app/ResourcesManager;->getOrCreateResourcesLocked(Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;
+Landroid/graphics/Rect;->isEmpty()Z
+Landroid/content/res/ResourcesImpl;->flushLayoutCache()V
+Landroid/os/LocaleList;->get(I)Ljava/util/Locale;
+Landroid/content/res/ThemedResourceCache;->onConfigurationChange(I)V
Landroid/content/res/ThemedResourceCache;->prune(I)Z
-Landroid/content/res/ThemedResourceCache;->pruneEntriesLocked(Landroid/util/LongSparseArray;I)Z
-Landroid/util/Pools$SynchronizedPool;->acquire()Ljava/lang/Object;
-Landroid/content/res/XmlBlock$Parser;->getAttributeCount()I
-Landroid/content/pm/PackageParser;->parseMetaData(Landroid/content/res/Resources;Landroid/content/res/XmlResourceParser;Landroid/os/Bundle;[Ljava/lang/String;)Landroid/os/Bundle;
-Landroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;
-Landroid/text/TextUtils;->writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V
-Landroid/view/DisplayAdjustments;->setCompatibilityInfo(Landroid/content/res/CompatibilityInfo;)V
-Landroid/content/res/CompatibilityInfo;->applyToDisplayMetrics(Landroid/util/DisplayMetrics;)V
+Landroid/content/res/Configuration;->compareTo(Landroid/content/res/Configuration;)I
+Landroid/content/res/Resources;->getClassLoader()Ljava/lang/ClassLoader;
+Lcom/android/internal/os/CachedDeviceState;->access$200(Lcom/android/internal/os/CachedDeviceState;)Z
+Landroid/graphics/Rect;->equals(Ljava/lang/Object;)Z
+Landroid/content/res/Configuration;->equals(Landroid/content/res/Configuration;)Z
+Lcom/android/internal/os/CachedDeviceState$Readonly;->isCharging()Z
+Landroid/util/MemoryIntArray;->enforceValidIndex(I)V
+Landroid/util/MemoryIntArray;->get(I)I
+Lcom/android/internal/os/LooperStats;->deviceStateAllowsCollection()Z
+Landroid/content/res/AssetManager;->isUpToDate()Z
+Landroid/content/res/ApkAssets;->isUpToDate()Z
+Landroid/content/res/Resources;->getImpl()Landroid/content/res/ResourcesImpl;
+Landroid/util/SparseBooleanArray;->put(IZ)V
+Lcom/android/internal/util/GrowingArrayUtils;->insert([ZIIZ)[Z
+Landroid/os/Parcel;->readLongArray([J)V
+Landroid/os/Handler;->sendMessage(Landroid/os/Message;)Z
+Landroid/app/ActivityThread;->getApplicationThread()Landroid/app/ActivityThread$ApplicationThread;
+Landroid/content/res/TypedArray;->getBoolean(IZ)Z
+Landroid/content/res/TypedArray;->getInt(II)I
+Landroid/content/res/TypedArray;->getResourceId(II)I
Landroid/content/res/TypedArray;->getString(I)Ljava/lang/String;
-Lcom/android/internal/os/BatteryStatsImpl$SamplingTimer;->getUpdateVersion()I
-Landroid/os/ResultReceiver;->send(ILandroid/os/Bundle;)V
-Lcom/android/internal/os/ProcessCpuTracker;->getCpuTimeForPid(I)J
-Landroid/os/FileUtils;->contains(Ljava/io/File;Ljava/io/File;)Z
-Landroid/os/FileUtils;->contains(Ljava/lang/String;Ljava/lang/String;)Z
-Landroid/content/pm/PackageParser$SigningDetails;->checkCapability(Landroid/content/pm/PackageParser$SigningDetails;I)Z
-Landroid/util/MapCollections$MapIterator;->getValue()Ljava/lang/Object;
-Landroid/os/BinderProxy$ProxyMap;->get(J)Landroid/os/BinderProxy;
-Landroid/util/TimingsTraceLog;-><init>(Ljava/lang/String;J)V
-Landroid/os/PowerManager;->newWakeLock(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;
-Landroid/content/ComponentName;->hashCode()I
-Landroid/util/MapCollections$ArrayIterator;->hasNext()Z
-Landroid/app/IActivityTaskManager$Stub;-><init>()V
-Lcom/android/internal/os/ProcessCpuTracker;-><init>(Z)V
-Lcom/android/internal/util/RingBuffer;-><init>(Ljava/lang/Class;I)V
-Lcom/android/server/LocalServices;->getService(Ljava/lang/Class;)Ljava/lang/Object;
-Lcom/android/internal/util/XmlUtils;->readStringAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/internal/os/BatteryStatsImpl;->setPowerProfileLocked(Lcom/android/internal/os/PowerProfile;)V
-Lcom/android/internal/os/BatteryStatsImpl;->readDailyStatsLocked()V
-Lcom/android/internal/widget/LockPatternUtils;-><init>(Landroid/content/Context;)V
-Landroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;)Landroid/text/Editable;
-Landroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;
-Landroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;
-Landroid/content/res/Resources;->newTheme()Landroid/content/res/Resources$Theme;
-Landroid/os/Parcel;->obtain()Landroid/os/Parcel;
-Landroid/os/Parcel;->obtain(J)Landroid/os/Parcel;
+Landroid/content/res/TypedArray;->loadStringValueAt(I)Ljava/lang/CharSequence;
+Landroid/content/res/XmlBlock$Parser;->getPooledString(I)Ljava/lang/CharSequence;
+Landroid/view/inputmethod/InputMethodInfo;-><init>(Landroid/content/Context;Landroid/content/pm/ResolveInfo;Ljava/util/List;)V
+Landroid/view/inputmethod/InputMethodInfo;->getSubtypeAt(I)Landroid/view/inputmethod/InputMethodSubtype;
+Landroid/view/inputmethod/InputMethodSubtypeArray;->get(I)Landroid/view/inputmethod/InputMethodSubtype;
+Landroid/view/inputmethod/InputMethodSubtype;->hashCode()I
+Landroid/provider/Settings$GenerationTracker;->readCurrentGeneration()I
+Landroid/text/TextUtils$SimpleStringSplitter;->next()Ljava/lang/String;
+Landroid/view/inputmethod/InputMethodSubtype;->sort(Landroid/content/Context;ILandroid/view/inputmethod/InputMethodInfo;Ljava/util/List;)Ljava/util/List;
Landroid/content/res/Configuration;->updateFrom(Landroid/content/res/Configuration;)I
-Landroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;)Landroid/app/ContextImpl;
-Landroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Ljava/lang/String;)Landroid/app/ContextImpl;
-Landroid/util/SparseArray;->clear()V
-Landroid/util/ArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
-Landroid/util/ArrayMap;->removeAt(I)Ljava/lang/Object;
-Landroid/os/Parcel;->writeBundle(Landroid/os/Bundle;)V
-Landroid/content/pm/PackageParser;->hasDomainURLs(Landroid/content/pm/PackageParser$Package;)Z
-Landroid/util/Pools$SynchronizedPool;->release(Ljava/lang/Object;)Z
-Landroid/os/Parcel;->setDataPosition(I)V
-Landroid/os/LocaleList;->getDefault()Landroid/os/LocaleList;
+Landroid/app/WindowConfiguration;->updateFrom(Landroid/app/WindowConfiguration;)I
+Landroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I
+Landroid/util/SparseIntArray;->put(II)V
+Landroid/app/AppOpsManager;->opToSwitch(I)I
+Landroid/app/ApplicationPackageManager;->updateFlagsForPackage(II)I
+Landroid/app/ContextImpl;->getOpPackageName()Ljava/lang/String;
+Landroid/content/pm/PermissionInfo;->isHardRestricted()Z
+Landroid/app/ContextImpl;->getPackageManager()Landroid/content/pm/PackageManager;
+Landroid/content/pm/PermissionInfo;->isSoftRestricted()Z
+Landroid/app/ApplicationPackageManager;->getUserId()I
+Landroid/app/ApplicationPackageManager;->getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
+Landroid/content/pm/PackageParser;->generatePermissionInfo(Landroid/content/pm/PackageParser$Permission;I)Landroid/content/pm/PermissionInfo;
+Landroid/content/pm/PermissionInfo;->isRestricted()Z
+Landroid/app/ApplicationPackageManager;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)I
+Landroid/os/Process;->myPid()I
+Lcom/android/internal/util/IntPair;->of(II)J
+Landroid/util/SparseIntArray;->indexOfKey(I)I
+Landroid/util/SparseBooleanArray;->get(IZ)Z
+Landroid/util/SparseBooleanArray;->get(I)Z
+Landroid/app/ApplicationPackageManager;->getPackageInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
+Landroid/os/Binder;->getInterfaceDescriptor()Ljava/lang/String;
+Landroid/os/Binder;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;
+Landroid/content/ContentResolver;->getUserId()I
+Landroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLong(Ljava/io/DataInputStream;)J
+Landroid/content/pm/PackageItemInfo;-><init>(Landroid/content/pm/PackageItemInfo;)V
+Landroid/system/suspend/WakeLockInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/system/suspend/WakeLockInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/system/suspend/WakeLockInfo;
+Landroid/system/suspend/WakeLockInfo;-><init>()V
+Landroid/system/suspend/WakeLockInfo;->readFromParcel(Landroid/os/Parcel;)V
+Lcom/android/internal/os/KernelWakelockReader;->updateWakelockStats([Landroid/system/suspend/WakeLockInfo;Lcom/android/internal/os/KernelWakelockStats;)Lcom/android/internal/os/KernelWakelockStats;
+Landroid/net/NetworkStatsHistory$DataStreamUtils;->readVarLongArray(Ljava/io/DataInputStream;)[J
+Landroid/net/NetworkStatsHistory;->setLong([JIJ)V
+Landroid/net/NetworkStatsHistory;->addLong([JIJ)V
+Landroid/net/NetworkStatsHistory;->getLong([JIJ)J
+Lcom/android/internal/util/ProcFileReader;->finishLine()V
+Landroid/content/res/Resources;->getText(I)Ljava/lang/CharSequence;
+Landroid/content/res/AssetManager;->getResourceText(I)Ljava/lang/CharSequence;
+Landroid/util/TypedValue;->coerceToString()Ljava/lang/CharSequence;
+Landroid/util/SparseIntArray;->valueAt(I)I
+Landroid/content/res/Resources;->getString(I)Ljava/lang/String;
+Lcom/android/internal/os/LooperStats;->messageDispatchStarting()Ljava/lang/Object;
+Lcom/android/internal/os/LooperStats;->messageDispatched(Ljava/lang/Object;Landroid/os/Message;)V
+Landroid/os/storage/StorageManager;->convert(Ljava/util/UUID;)Ljava/lang/String;
+Landroid/os/Parcel;->readSparseArray(Ljava/lang/ClassLoader;)Landroid/util/SparseArray;
+Landroid/util/SparseIntArray;->get(I)I
+Landroid/content/pm/ApplicationInfo;-><init>(Landroid/content/pm/ApplicationInfo;)V
+Landroid/os/UserHandle;->isApp(I)Z
+Landroid/util/SparseIntArray;->delete(I)V
+Landroid/util/SparseIntArray;->size()I
+Landroid/util/SparseIntArray;->keyAt(I)I
+Lcom/android/internal/util/ArrayUtils;->convertToIntArray(Ljava/util/List;)[I
+Landroid/os/Parcel;->writeIntArray([I)V
+Landroid/os/Parcel;->obtain(J)Landroid/os/Parcel;
+Landroid/app/ContextImpl;->getOuterContext()Landroid/content/Context;
+Landroid/content/pm/PackageParser;->generateProviderInfo(Landroid/content/pm/PackageParser$Provider;ILandroid/content/pm/PackageUserState;I)Landroid/content/pm/ProviderInfo;
+Landroid/view/DisplayAdjustments;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo;
+Landroid/net/Uri$StringUri;->getScheme()Ljava/lang/String;
+Landroid/net/Uri$StringUri;->getPathPart()Landroid/net/Uri$PathPart;
+Landroid/app/WindowConfiguration;->compareTo(Landroid/app/WindowConfiguration;)I
+Landroid/content/res/Configuration;->hashCode()I
+Landroid/content/res/Configuration;->setToDefaults()V
+Landroid/os/LocaleList;->getEmptyLocaleList()Landroid/os/LocaleList;
+Landroid/content/res/Configuration;-><init>(Landroid/content/res/Configuration;)V
+Landroid/os/Parcel;->readStrongBinder()Landroid/os/IBinder;
+Landroid/util/Pair;->create(Ljava/lang/Object;Ljava/lang/Object;)Landroid/util/Pair;
+Landroid/os/UserHandle;->isCore(I)Z
+Landroid/app/ContextImpl;->enforce(Ljava/lang/String;IZILjava/lang/String;)V
+Landroid/app/ContextImpl;->enforceCallingOrSelfPermission(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/content/res/CompatibilityInfo;->supportsScreen()Z
+Landroid/content/res/CompatibilityInfo;->isScalingRequired()Z
+Landroid/app/job/JobInfo;->getFlags()I
+Landroid/content/SyncAdapterType;->equals(Ljava/lang/Object;)Z
+Landroid/content/pm/RegisteredServicesCache;->containsType(Ljava/util/ArrayList;Ljava/lang/Object;)Z
+Landroid/os/Looper;->showSlowLog(JJJLjava/lang/String;Landroid/os/Message;)Z
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->setFlags(II)V
+Landroid/os/Parcel;->init(J)V
+Landroid/content/res/Resources;->getInteger(I)I
+Landroid/net/Uri$StringUri;->isHierarchical()Z
+Landroid/net/Uri$StringUri;->getQueryPart()Landroid/net/Uri$Part;
+Landroid/net/Uri$PathPart;->from(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$PathPart;
+Landroid/net/Uri$PathPart;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/net/Uri$PathPart;->fromEncoded(Ljava/lang/String;)Landroid/net/Uri$PathPart;
+Landroid/content/IntentFilter;-><init>(Landroid/content/IntentFilter;)V
+Landroid/util/proto/EncodedBuffer;->writeRawByte(B)V
+Landroid/content/Intent;->getComponent()Landroid/content/ComponentName;
+Landroid/util/proto/EncodedBuffer;->writeRawVarint32(I)V
+Landroid/util/proto/EncodedBuffer;->writeRawFixed32(I)V
+Landroid/util/proto/ProtoOutputStream;->assertNotCompacted()V
+Landroid/util/proto/ProtoOutputStream;->writeTag(II)V
+Landroid/util/proto/ProtoOutputStream;->write(JLjava/lang/String;)V
+Landroid/util/proto/ProtoOutputStream;->writeStringImpl(ILjava/lang/String;)V
+Landroid/os/Parcel;->dataSize()I
+Landroid/util/proto/EncodedBuffer;->writeRawBuffer([BII)V
+Landroid/util/proto/ProtoOutputStream;->writeUtf8String(ILjava/lang/String;)V
+Landroid/util/proto/ProtoOutputStream;->writeKnownLengthHeader(II)V
+Landroid/util/proto/EncodedBuffer;->writeRawBuffer([B)V
+Landroid/util/proto/ProtoStream;->getRepeatedFromToken(J)Z
+Landroid/util/proto/EncodedBuffer;->getWritePos()I
+Landroid/util/proto/EncodedBuffer;->getRawFixed32At(I)I
+Landroid/util/proto/EncodedBuffer;->editRawFixed32(II)V
+Landroid/util/proto/EncodedBuffer;->writeRawVarint64(J)V
+Landroid/os/StrictMode;->onBinderStrictModePolicyChange(I)V
+Landroid/util/proto/EncodedBuffer;->getRawVarint32Size(I)I
+Landroid/util/proto/EncodedBuffer;->readRawByte()B
+Landroid/util/proto/EncodedBuffer;->getReadPos()I
+Landroid/util/proto/ProtoOutputStream;->editEncodedSize(I)I
+Landroid/util/proto/EncodedBuffer;->readRawFixed32()I
+Landroid/util/proto/EncodedBuffer;->getReadableSize()I
+Landroid/util/proto/ProtoOutputStream;->readRawTag()I
+Landroid/util/proto/EncodedBuffer;->readRawUnsigned()J
+Landroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;)V
+Landroid/net/Uri$PathSegmentsBuilder;->build()Landroid/net/Uri$PathSegments;
+Landroid/net/Uri$PathSegments;-><init>([Ljava/lang/String;I)V
+Landroid/util/proto/EncodedBuffer;->skipRead(I)V
+Landroid/app/IApplicationThread$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+Landroid/app/ApplicationPackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo;
+Landroid/util/proto/ProtoOutputStream;->compactSizes(I)V
+Landroid/util/proto/EncodedBuffer;->writeFromThisBuffer(II)V
+Landroid/app/WindowConfiguration;->getWindowingMode()I
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->unmask(II)I
+Landroid/app/ContextImpl;->registerReceiverInternal(Landroid/content/BroadcastReceiver;ILandroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;Landroid/content/Context;I)Landroid/content/Intent;
+Landroid/app/ActivityThread;->getInstrumentation()Landroid/app/Instrumentation;
+Landroid/app/LoadedApk;->getReceiverDispatcher(Landroid/content/BroadcastReceiver;Landroid/content/Context;Landroid/os/Handler;Landroid/app/Instrumentation;Z)Landroid/content/IIntentReceiver;
+Landroid/app/LoadedApk$ReceiverDispatcher;->getIIntentReceiver()Landroid/content/IIntentReceiver;
+Landroid/util/SparseArray;->gc()V
+Landroid/net/Uri$StringUri;->buildUpon()Landroid/net/Uri$Builder;
+Landroid/net/Uri$StringUri;->getFragmentPart()Landroid/net/Uri$Part;
+Landroid/net/Uri$PathPart;->appendEncodedSegment(Landroid/net/Uri$PathPart;Ljava/lang/String;)Landroid/net/Uri$PathPart;
+Landroid/content/ContentResolver;->getContentService()Landroid/content/IContentService;
+Lcom/android/internal/os/BinderDeathDispatcher;->linkToDeath(Landroid/os/IInterface;Landroid/os/IBinder$DeathRecipient;)I
+Landroid/net/NetworkCapabilities;->appendStringRepresentationOfBitMaskToStringBuilder(Ljava/lang/StringBuilder;JLandroid/net/NetworkCapabilities$NameOf;Ljava/lang/String;)V
+Landroid/os/Parcel;->writeStringArray([Ljava/lang/String;)V
+Lcom/android/internal/util/StatLogger;->logDurationStat(IJ)J
+Lcom/android/internal/util/CollectionUtils;->size(Ljava/util/Collection;)I
+Landroid/content/ComponentName;->getPackageName()Ljava/lang/String;
+Landroid/os/MessageQueue;->removeCallbacksAndMessages(Landroid/os/Handler;Ljava/lang/Object;)V
+Lcom/android/internal/util/GrowingArrayUtils;->append([III)[I
+Landroid/content/pm/ApplicationInfo;->isDirectBootAware()Z
+Landroid/content/res/Configuration;->unset()V
+Landroid/util/FastImmutableArraySet$FastIterator;->hasNext()Z
+Landroid/util/FastImmutableArraySet;->iterator()Ljava/util/Iterator;
+Landroid/util/FastImmutableArraySet$FastIterator;->next()Ljava/lang/Object;
+Landroid/app/WindowConfiguration;->getActivityType()I
+Landroid/app/WindowConfiguration;->getBounds()Landroid/graphics/Rect;
+Landroid/content/res/Configuration;-><init>()V
+Landroid/util/proto/ProtoOutputStream;->write(JI)V
+Landroid/util/proto/ProtoOutputStream;->writeInt32Impl(II)V
+Landroid/os/Parcel;->writeStrongBinder(Landroid/os/IBinder;)V
+Landroid/os/Parcel;->writeValue(Ljava/lang/Object;)V
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->popArg(I)Ljava/lang/Object;
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->isInvocationArgAtIndex(I)Z
+Landroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V
+Landroid/os/Looper;->myLooper()Landroid/os/Looper;
+Landroid/net/NetworkScoreManager;->getActiveScorerPackage()Ljava/lang/String;
+Landroid/appwidget/AppWidgetManager;->isBoundWidgetPackage(Ljava/lang/String;I)Z
+Landroid/os/SystemProperties;->get(Ljava/lang/String;)Ljava/lang/String;
+Landroid/content/res/Configuration;->getLocales()Landroid/os/LocaleList;
Landroid/content/res/ConfigurationBoundResourceCache;->onConfigurationChange(I)V
-Landroid/util/DisplayMetrics;->setToDefaults()V
-Landroid/content/pm/PackageParser;->computeMinSdkVersion(ILjava/lang/String;I[Ljava/lang/String;[Ljava/lang/String;)I
-Lcom/android/internal/os/ProcessCpuTracker;->onMeasureProcessName(Ljava/lang/String;)I
-Lcom/android/server/SystemConfig$SharedLibraryEntry;-><init>(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
-Landroid/util/MapCollections;->getKeySet()Ljava/util/Set;
-Landroid/content/ComponentName;->unflattenFromString(Ljava/lang/String;)Landroid/content/ComponentName;
-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/os/SynchronousResultReceiver;->awaitResult(J)Landroid/os/SynchronousResultReceiver$Result;
-Landroid/os/SynchronousResultReceiver;->onReceiveResult(ILandroid/os/Bundle;)V
-Landroid/view/SurfaceControl;->getHdrCapabilities(Landroid/os/IBinder;)Landroid/view/Display$HdrCapabilities;
+Landroid/content/Intent;->getCategories()Ljava/util/Set;
+Landroid/os/LocaleList;->equals(Ljava/lang/Object;)Z
+Landroid/content/res/CompatibilityInfo;->hashCode()I
+Landroid/os/Message;->sendToTarget()V
+Landroid/os/Handler;->getPostMessage(Ljava/lang/Runnable;)Landroid/os/Message;
+Landroid/app/ApplicationPackageManager;->getPackagesForUid(I)[Ljava/lang/String;
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType;->encode(II)I
+Landroid/os/BinderProxy$ProxyMap;->hash(J)I
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->getFlags(I)I
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType;->decodeArgCount(I)I
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->isRecycled()Z
+Landroid/os/Handler;->post(Ljava/lang/Runnable;)Z
+Landroid/os/SystemClock$2;->millis()J
+Landroid/os/Binder;->execTransact(IJJI)Z
+Landroid/os/Binder;->execTransactInternal(IJJII)Z
+Landroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V
+Landroid/database/IContentObserver$Stub;->asBinder()Landroid/os/IBinder;
+Landroid/os/StrictMode;->clearGatheredViolations()V
+Landroid/os/Binder;->linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V
+Landroid/os/Parcel;->writeNoException()V
+Landroid/os/StrictMode;->hasGatheredViolations()Z
+Landroid/os/Handler;->obtainMessage(IIILjava/lang/Object;)Landroid/os/Message;
+Landroid/os/Message;->obtain(Landroid/os/Handler;IIILjava/lang/Object;)Landroid/os/Message;
+Landroid/os/StrictMode$AndroidBlockGuardPolicy;->setThreadPolicyMask(I)V
+Landroid/os/Looper;->loop()V
+Landroid/app/usage/UsageEvents$Event;->getClassName()Ljava/lang/String;
+Landroid/app/usage/UsageStats;->update(Ljava/lang/String;JII)V
+Lcom/android/internal/os/BinderCallsStats;->callStarted(Landroid/os/Binder;II)Lcom/android/internal/os/BinderInternal$CallSession;
+Landroid/os/Parcel;->readCallingWorkSourceUid()I
+Lcom/android/internal/os/BinderCallsStats;->callEnded(Lcom/android/internal/os/BinderInternal$CallSession;III)V
+Landroid/os/Parcel;->writeParcelable(Landroid/os/Parcelable;I)V
+Landroid/os/Parcel;->writeFloat(F)V
+Landroid/view/DisplayCutout;->getSafeInsetTop()I
+Landroid/content/res/Resources;->getDimensionPixelSize(I)I
+Landroid/os/Parcel;->writeParcelableCreator(Landroid/os/Parcelable;)V
+Landroid/content/Intent;->getScheme()Ljava/lang/String;
+Landroid/os/Handler;-><init>(Landroid/os/Looper;)V
+Landroid/os/BaseBundle;->putString(Ljava/lang/String;Ljava/lang/String;)V
+Landroid/content/SyncAdaptersCache;->getSyncAdapterPackagesForAuthority(Ljava/lang/String;I)[Ljava/lang/String;
+Landroid/view/Display;->hasAccess(IIII)Z
+Landroid/view/DisplayInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/view/DisplayInfo;->hasAccess(I)Z
+Landroid/os/BinderProxy$ProxyMap;->get(J)Landroid/os/BinderProxy;
+Landroid/os/Parcel;->writeArrayMapInternal(Landroid/util/ArrayMap;)V
+Landroid/content/Intent;->getData()Landroid/net/Uri;
+Landroid/util/ArraySet;->addAll(Landroid/util/ArraySet;)V
+Landroid/os/Binder$PropagateWorkSourceTransactListener;->onTransactStarted(Landroid/os/IBinder;I)Ljava/lang/Object;
+Landroid/os/Binder$PropagateWorkSourceTransactListener;->onTransactEnded(Ljava/lang/Object;)V
+Landroid/os/RemoteCallbackList;->beginBroadcast()I
+Landroid/os/BinderProxy;->getInstance(JJ)Landroid/os/BinderProxy;
+Landroid/content/Intent;->setAction(Ljava/lang/String;)Landroid/content/Intent;
+Landroid/view/Display$HdrCapabilities;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/graphics/Rect;->set(IIII)V
+Landroid/content/res/Configuration;->equals(Ljava/lang/Object;)Z
+Landroid/os/Message;->obtain(Landroid/os/Handler;ILjava/lang/Object;)Landroid/os/Message;
+Landroid/util/proto/ProtoOutputStream;->start(J)J
+Landroid/util/proto/ProtoOutputStream;->startObjectImpl(IZ)J
+Landroid/util/proto/ProtoOutputStream;->getTagSize(I)I
+Landroid/util/proto/ProtoOutputStream;->end(J)V
+Landroid/util/proto/ProtoOutputStream;->endObjectImpl(JZ)V
+Landroid/util/proto/ProtoStream;->getDepthFromToken(J)I
+Landroid/util/proto/ProtoOutputStream;->writeUnsignedVarintFromSignedInt(I)V
+Landroid/os/Handler;->obtainMessage(ILjava/lang/Object;)Landroid/os/Message;
+Landroid/graphics/Rect;->width()I
+Landroid/app/ApplicationPackageManager;->updateFlagsForApplication(II)I
+Lcom/android/internal/os/ZygoteArguments;->parseArgs([Ljava/lang/String;)V
+Landroid/os/RemoteCallbackList;->finishBroadcast()V
+Landroid/os/BinderProxy;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface;
+Landroid/content/Intent;-><init>(Landroid/content/Intent;I)V
+Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;
+Landroid/content/ContentResolver;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/ContentObserver;I)V
+Landroid/database/ContentObserver;->getContentObserver()Landroid/database/IContentObserver;
+Landroid/net/Uri$StringUri;->parsePath(Ljava/lang/String;I)Ljava/lang/String;
+Landroid/content/Intent;-><init>(Ljava/lang/String;)V
+Landroid/graphics/Rect;->height()I
+Landroid/provider/Settings$Global;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;
+Landroid/util/LongSparseArray;->valueAt(I)Ljava/lang/Object;
+Landroid/os/Handler;->removeMessages(I)V
+Landroid/net/Uri$Part;->from(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$Part;
+Landroid/os/Parcel;->writeBundle(Landroid/os/Bundle;)V
+Landroid/os/BaseBundle;->getBoolean(Ljava/lang/String;Z)Z
+Landroid/os/BinderProxy$ProxyMap;->set(JLandroid/os/BinderProxy;)V
+Landroid/provider/Settings$Global;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;
+Landroid/util/ArraySet;->isEmpty()Z
+Landroid/app/ActivityManager;->checkComponentPermission(Ljava/lang/String;IIZ)I
+Landroid/database/IContentObserver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+Landroid/os/Parcel;->writeTypedArray([Landroid/os/Parcelable;I)V
+Landroid/os/BinderProxy;-><init>(J)V
+Landroid/content/IIntentReceiver$Stub$Proxy;->asBinder()Landroid/os/IBinder;
+Landroid/os/Parcel;->writeTypedList(Ljava/util/List;I)V
+Landroid/app/ApplicationPackageManager;->getApplicationInfoAsUser(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
+Landroid/app/ApplicationPackageManager;->maybeAdjustApplicationInfo(Landroid/content/pm/ApplicationInfo;)Landroid/content/pm/ApplicationInfo;
+Landroid/app/ContextImpl;->getUser()Landroid/os/UserHandle;
+Landroid/content/pm/PackageManager;->getApplicationInfoAsUser(Ljava/lang/String;ILandroid/os/UserHandle;)Landroid/content/pm/ApplicationInfo;
+Landroid/app/AppOpsManager;->strOpToOp(Ljava/lang/String;)I
+Landroid/app/AppOpsManager;->opToPublicName(I)Ljava/lang/String;
+Landroid/app/AppOpsManager;->unsafeCheckOpRaw(Ljava/lang/String;ILjava/lang/String;)I
+Landroid/database/sqlite/SQLiteClosable;->releaseReference()V
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->acquire(Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;Ljava/lang/Object;IIILjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lcom/android/internal/util/function/pooled/PooledLambda;
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->acquire(Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;)Lcom/android/internal/util/function/pooled/PooledLambdaImpl;
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->recycleOnUse()Lcom/android/internal/util/function/pooled/PooledRunnable;
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->recycleOnUse()Lcom/android/internal/util/function/pooled/OmniFunction;
+Landroid/os/Message;->setCallback(Ljava/lang/Runnable;)Landroid/os/Message;
+Landroid/util/LongSparseLongArray;->indexOfKey(J)I
+Lcom/android/internal/util/function/pooled/OmniFunction;->run()V
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->doInvoke()Ljava/lang/Object;
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl$LambdaType;->decodeReturnType(I)I
+Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->access$100(II)I
Lcom/android/internal/util/function/pooled/PooledLambdaImpl;->doRecycle()V
-Landroid/os/Handler;->postAtFrontOfQueue(Ljava/lang/Runnable;)Z
+Landroid/util/Pair;->hashCode()I
+Landroid/content/pm/ApplicationInfo;->hasRequestedLegacyExternalStorage()Z
+Landroid/util/ArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object;
+Landroid/util/ArraySet;->clear()V
+Landroid/app/IActivityManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Landroid/text/TextUtils;->writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V
+Landroid/os/Parcel;->writeMapInternal(Ljava/util/Map;)V
+Landroid/os/RemoteCallbackList;->getBroadcastItem(I)Landroid/os/IInterface;
+Landroid/app/WindowConfiguration;->canReceiveKeys()Z
+Landroid/graphics/Point;->offset(II)V
+Landroid/content/Intent;-><init>(Landroid/content/Intent;)V
+Landroid/os/Binder;->allowBlocking(Landroid/os/IBinder;)Landroid/os/IBinder;
+Landroid/os/Bundle;->hasFileDescriptors()Z
+Lcom/android/internal/app/procstats/ProcessStats;->updateTrackingAssociationsLocked(IJ)V
+Lcom/android/internal/app/procstats/SparseMappingTable$Table;->assertConsistency()V
+Lcom/android/internal/app/procstats/SparseMappingTable;->access$100(Lcom/android/internal/app/procstats/SparseMappingTable;)Ljava/util/ArrayList;
+Landroid/os/RemoteCallbackList;->getBroadcastCookie(I)Ljava/lang/Object;
+Landroid/net/Uri$StringUri;->parseAuthority(Ljava/lang/String;I)Ljava/lang/String;
+Landroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/ServiceManager;->rawGetService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/ServiceManagerProxy;->getService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/os/IServiceManager$Stub$Proxy;->checkService(Ljava/lang/String;)Landroid/os/IBinder;
+Landroid/content/pm/PackageItemInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/net/Uri$Part$EmptyPart;->isEmpty()Z
+Landroid/os/BaseBundle;-><init>(Landroid/os/BaseBundle;)V
+Landroid/os/Bundle;-><init>(Landroid/os/Bundle;)V
+Landroid/net/Uri$Part;->readFrom(Landroid/os/Parcel;)Landroid/net/Uri$Part;
+Landroid/content/ComponentName;->equals(Ljava/lang/Object;)Z
+Landroid/util/ArraySet;-><init>(Landroid/util/ArraySet;)V
+Landroid/os/Parcel;->createStringArray()[Ljava/lang/String;
+Landroid/os/Message;->setAsynchronous(Z)V
+Landroid/os/Parcel;->writeTypedList(Ljava/util/List;)V
+Landroid/os/Message;->obtain(Landroid/os/Handler;I)Landroid/os/Message;
+Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->refreshTimersLocked(JLjava/util/ArrayList;Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;)J
+Landroid/os/Handler;->obtainMessage(I)Landroid/os/Message;
+Landroid/os/storage/StorageManager;->isUserKeyUnlocked(I)Z
+Landroid/hardware/display/IDisplayManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Landroid/os/Bundle;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/os/Parcel;->pushAllowFds(Z)Z
+Landroid/os/BaseBundle;->writeToParcelInner(Landroid/os/Parcel;I)V
+Landroid/os/Parcel;->restoreAllowFds(Z)V
+Landroid/content/pm/ApplicationInfo;->isEncryptionAware()Z
+Lcom/android/internal/app/procstats/ProcessState;->setCombinedState(IJ)V
+Landroid/os/Message;->obtain(Landroid/os/Handler;III)Landroid/os/Message;
+Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;->isBrightOrDim()Z
+Landroid/content/pm/ParceledListSlice;-><init>(Ljava/util/List;)V
+Landroid/content/pm/BaseParceledListSlice;-><init>(Ljava/util/List;)V
+Lcom/android/internal/app/procstats/AssociationState$SourceState;->trackProcState(IIJ)V
+Landroid/content/Intent;->resolveTypeIfNeeded(Landroid/content/ContentResolver;)Ljava/lang/String;
+Landroid/net/Uri$Part;->fromEncoded(Ljava/lang/String;)Landroid/net/Uri$Part;
+Landroid/os/MessageQueue;->hasMessages(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;)Z
+Lcom/android/internal/app/procstats/AssociationState$SourceState;->getAssociationState()Lcom/android/internal/app/procstats/AssociationState;
+Lcom/android/internal/app/procstats/AssociationState;->getProcess()Lcom/android/internal/app/procstats/ProcessState;
+Lcom/android/internal/app/procstats/ProcessState;->getCombinedState()I
+Lcom/android/internal/app/procstats/AssociationState$SourceState;->startActive(J)V
+Landroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;
+Landroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/Uri;
+Landroid/content/Intent;->getSelector()Landroid/content/Intent;
+Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->startRunningLocked(J)V
+Lcom/android/internal/app/ProcessMap;->get(Ljava/lang/String;I)Ljava/lang/Object;
+Landroid/app/IApplicationThread$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/IApplicationThread;
+Landroid/app/IApplicationThread$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->startRunningLocked(J)V
+Lcom/android/internal/os/BatteryStatsImpl$StopwatchTimer;->stopRunningLocked(J)V
+Landroid/net/Uri$Part;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+Lcom/android/internal/os/BatteryStatsImpl$DurationTimer;->stopRunningLocked(J)V
+Lcom/android/internal/os/BatteryStatsImpl;->mapUid(I)I
+Landroid/content/Intent;->hasFileDescriptors()Z
+Landroid/content/pm/ComponentInfo;-><init>(Landroid/content/pm/ComponentInfo;)V
+Landroid/os/ZygoteProcess;->zygoteSendArgsAndGetResult(Landroid/os/ZygoteProcess$ZygoteState;ZLjava/util/ArrayList;)Landroid/os/Process$ProcessStartResult;
+Landroid/os/Handler;->obtainMessage(III)Landroid/os/Message;
+Landroid/os/BaseBundle;->getBoolean(Ljava/lang/String;)Z
+Landroid/view/DisplayCutout$ParcelableWrapper;->writeCutoutToParcel(Landroid/view/DisplayCutout;Landroid/os/Parcel;I)V
+Landroid/view/DisplayAddress$Physical;->writeToParcel(Landroid/os/Parcel;I)V
+Lcom/android/internal/os/BatteryStatsImpl;->getUidStatsLocked(I)Lcom/android/internal/os/BatteryStatsImpl$Uid;
+Landroid/content/pm/ResolveInfo;-><init>()V
+Landroid/util/KeyValueListParser$IntValue;->getValue()I
+Landroid/os/Parcel;->writeList(Ljava/util/List;)V
+Landroid/view/SurfaceControl;->checkNotReleased()V
+Landroid/content/pm/IPackageManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Landroid/os/IPowerManager$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Landroid/graphics/Rect;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/content/pm/ParceledListSlice;->getList()Ljava/util/List;
+Landroid/content/pm/BaseParceledListSlice;->getList()Ljava/util/List;
+Landroid/os/Parcel;->writeBoolean(Z)V
+Landroid/telecom/PhoneAccount;->hasCapabilities(I)Z
+Landroid/content/IIntentReceiver$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/IIntentReceiver;
+Landroid/os/BaseBundle;->isParcelled()Z
+Landroid/os/PowerSaveState$Builder;-><init>()V
+Landroid/os/PowerSaveState$Builder;->setGlobalBatterySaverEnabled(Z)Landroid/os/PowerSaveState$Builder;
+Landroid/os/PowerSaveState$Builder;->setBatterySaverEnabled(Z)Landroid/os/PowerSaveState$Builder;
+Landroid/os/PowerSaveState$Builder;->build()Landroid/os/PowerSaveState;
+Landroid/os/PowerSaveState;-><init>(Landroid/os/PowerSaveState$Builder;)V
+Landroid/os/PowerSaveState$Builder;->access$000(Landroid/os/PowerSaveState$Builder;)Z
+Landroid/os/PowerSaveState$Builder;->access$100(Landroid/os/PowerSaveState$Builder;)I
+Landroid/os/PowerSaveState$Builder;->access$200(Landroid/os/PowerSaveState$Builder;)F
+Landroid/os/PowerSaveState$Builder;->access$300(Landroid/os/PowerSaveState$Builder;)Z
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->createAggregatedPartialWakelockTimerLocked()Lcom/android/internal/os/BatteryStatsImpl$DualTimer;
+Landroid/content/pm/ApplicationInfo;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/os/Parcel;->writeSparseArray(Landroid/util/SparseArray;)V
+Landroid/os/PowerSaveState$Builder;->setBrightnessFactor(F)Landroid/os/PowerSaveState$Builder;
+Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;->equals(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;)Z
+Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;->floatEquals(FF)Z
+Landroid/view/Choreographer;->doCallbacks(IJ)V
+Lcom/android/internal/os/BatteryStatsImpl$DualTimer;->startRunningLocked(J)V
+Landroid/graphics/Point;->set(II)V
+Landroid/view/SurfaceControl;->access$800(Landroid/view/SurfaceControl;)V
+Landroid/graphics/Point;->equals(Ljava/lang/Object;)Z
+Lcom/android/internal/os/BatteryStatsImpl;->getPowerManagerWakeLockLevel(I)I
+Landroid/content/Context;->getSystemService(Ljava/lang/Class;)Ljava/lang/Object;
+Landroid/app/ContextImpl;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;
+Landroid/app/SystemServiceRegistry;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;
+Lcom/android/internal/os/BatteryStatsImpl$DualTimer;->stopRunningLocked(J)V
+Landroid/app/AppOpsManager;->getToken(Lcom/android/internal/app/IAppOpsService;)Landroid/os/IBinder;
+Landroid/os/Bundle;->forPair(Ljava/lang/String;Ljava/lang/String;)Landroid/os/Bundle;
+Landroid/os/Bundle;-><init>(I)V
+Landroid/os/BaseBundle;-><init>(I)V
+Landroid/os/HwParcel;-><init>()V
+Landroid/view/SurfaceControl$Transaction;->merge(Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl$Transaction;
+Landroid/view/SurfaceControl;->access$4100(JJ)V
+Landroid/view/Choreographer$CallbackQueue;->extractDueCallbacksLocked(J)Landroid/view/Choreographer$CallbackRecord;
+Landroid/graphics/Rect;->offset(II)V
+Landroid/os/PowerManager;->validateWakeLockParameters(ILjava/lang/String;)V
+Landroid/app/AppOpsManager;->checkPackage(ILjava/lang/String;)V
+Landroid/util/SparseArray;->indexOfKey(I)I
+Landroid/content/Intent;->resolveType(Landroid/content/ContentResolver;)Ljava/lang/String;
+Lcom/android/internal/os/BatteryStatsImpl;->noteStartWakeLocked(IILandroid/os/WorkSource$WorkChain;Ljava/lang/String;Ljava/lang/String;IZJJ)V
+Lcom/android/internal/os/BatteryStatsImpl;->aggregateLastWakeupUptimeLocked(J)V
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->noteStartWakeLocked(ILjava/lang/String;IJ)V
+Lcom/android/internal/os/BatteryStatsImpl$OverflowArrayMap;->startObject(Ljava/lang/String;)Ljava/lang/Object;
+Lcom/android/internal/os/BatteryStatsImpl$Uid;->getPidStatsLocked(I)Landroid/os/BatteryStats$Uid$Pid;
+Landroid/content/ComponentName;->writeToParcel(Landroid/content/ComponentName;Landroid/os/Parcel;)V
+Landroid/content/ContextWrapper;->getContentResolver()Landroid/content/ContentResolver;
+Landroid/content/Intent;->writeToParcel(Landroid/os/Parcel;I)V
+Landroid/content/res/Resources;->getBoolean(I)Z
+Landroid/net/Uri;->writeToParcel(Landroid/os/Parcel;Landroid/net/Uri;)V
+Landroid/view/InsetsSource;->getType()I
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java
index 827e5408403a..4730bd0880a3 100644
--- a/core/java/android/accessibilityservice/AccessibilityService.java
+++ b/core/java/android/accessibilityservice/AccessibilityService.java
@@ -391,7 +391,8 @@ public abstract class AccessibilityService extends Service {
void onPerformGestureResult(int sequence, boolean completedSuccessfully);
void onFingerprintCapturingGesturesChanged(boolean active);
void onFingerprintGesture(int gesture);
- void onAccessibilityButtonClicked();
+ /** Accessbility button clicked callbacks for different displays */
+ void onAccessibilityButtonClicked(int displayId);
void onAccessibilityButtonAvailabilityChanged(boolean available);
}
@@ -459,7 +460,8 @@ public abstract class AccessibilityService extends Service {
private final SparseArray<MagnificationController> mMagnificationControllers =
new SparseArray<>(0);
private SoftKeyboardController mSoftKeyboardController;
- private AccessibilityButtonController mAccessibilityButtonController;
+ private final SparseArray<AccessibilityButtonController> mAccessibilityButtonControllers =
+ new SparseArray<>(0);
private int mGestureStatusCallbackSequence;
@@ -1521,17 +1523,40 @@ public abstract class AccessibilityService extends Service {
*/
@NonNull
public final AccessibilityButtonController getAccessibilityButtonController() {
+ return getAccessibilityButtonController(Display.DEFAULT_DISPLAY);
+ }
+
+ /**
+ * Returns the controller of specified logical display for the accessibility button within the
+ * system's navigation area. This instance may be used to query the accessibility button's
+ * state and register listeners for interactions with and state changes for the accessibility
+ * button when {@link AccessibilityServiceInfo#FLAG_REQUEST_ACCESSIBILITY_BUTTON} is set.
+ * <p>
+ * <strong>Note:</strong> Not all devices are capable of displaying the accessibility button
+ * within a navigation area, and as such, use of this class should be considered only as an
+ * optional feature or shortcut on supported device implementations.
+ * </p>
+ *
+ * @param displayId The logic display id, use {@link Display#DEFAULT_DISPLAY} for default
+ * display.
+ * @return the accessibility button controller for this {@link AccessibilityService}
+ */
+ @NonNull
+ public final AccessibilityButtonController getAccessibilityButtonController(int displayId) {
synchronized (mLock) {
- if (mAccessibilityButtonController == null) {
- mAccessibilityButtonController = new AccessibilityButtonController(
+ AccessibilityButtonController controller = mAccessibilityButtonControllers.get(
+ displayId);
+ if (controller == null) {
+ controller = new AccessibilityButtonController(
AccessibilityInteractionClient.getInstance().getConnection(mConnectionId));
+ mAccessibilityButtonControllers.put(displayId, controller);
}
- return mAccessibilityButtonController;
+ return controller;
}
}
- private void onAccessibilityButtonClicked() {
- getAccessibilityButtonController().dispatchAccessibilityButtonClicked();
+ private void onAccessibilityButtonClicked(int displayId) {
+ getAccessibilityButtonController(displayId).dispatchAccessibilityButtonClicked();
}
private void onAccessibilityButtonAvailabilityChanged(boolean available) {
@@ -1737,8 +1762,8 @@ public abstract class AccessibilityService extends Service {
}
@Override
- public void onAccessibilityButtonClicked() {
- AccessibilityService.this.onAccessibilityButtonClicked();
+ public void onAccessibilityButtonClicked(int displayId) {
+ AccessibilityService.this.onAccessibilityButtonClicked(displayId);
}
@Override
@@ -1852,8 +1877,10 @@ public abstract class AccessibilityService extends Service {
mCaller.sendMessage(mCaller.obtainMessageI(DO_ON_FINGERPRINT_GESTURE, gesture));
}
- public void onAccessibilityButtonClicked() {
- final Message message = mCaller.obtainMessage(DO_ACCESSIBILITY_BUTTON_CLICKED);
+ /** Accessibility button clicked callbacks for different displays */
+ public void onAccessibilityButtonClicked(int displayId) {
+ final Message message = mCaller.obtainMessageI(DO_ACCESSIBILITY_BUTTON_CLICKED,
+ displayId);
mCaller.sendMessage(message);
}
@@ -1987,7 +2014,7 @@ public abstract class AccessibilityService extends Service {
case (DO_ACCESSIBILITY_BUTTON_CLICKED): {
if (mConnectionId != AccessibilityInteractionClient.NO_ID) {
- mCallback.onAccessibilityButtonClicked();
+ mCallback.onAccessibilityButtonClicked(message.arg1);
}
} return;
diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
index 407ba59c3297..e0d5e4438f23 100644
--- a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
+++ b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl
@@ -52,7 +52,7 @@ import android.view.KeyEvent;
void onFingerprintGesture(int gesture);
- void onAccessibilityButtonClicked();
+ void onAccessibilityButtonClicked(int displayId);
void onAccessibilityButtonAvailabilityChanged(boolean available);
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 50f945b095cb..553ef69fe8e2 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2492,13 +2492,15 @@ public final class ActivityThread extends ClientTransactionHandler {
}
}
- private static final String HEAP_FULL_COLUMN
- = "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s";
- private static final String HEAP_COLUMN
- = "%13s %8s %8s %8s %8s %8s %8s %8s";
+ private static final String HEAP_FULL_COLUMN =
+ "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s";
+ private static final String HEAP_COLUMN =
+ "%13s %8s %8s %8s %8s %8s %8s %8s %8s";
private static final String ONE_COUNT_COLUMN = "%21s %8d";
private static final String TWO_COUNT_COLUMNS = "%21s %8d %21s %8d";
- private static final String ONE_COUNT_COLUMN_HEADER = "%21s %8s";
+ private static final String THREE_COUNT_COLUMNS = "%21s %8d %21s %8s %21s %8d";
+ private static final String TWO_COUNT_COLUMN_HEADER = "%21s %8s %21s %8s";
+ private static final String ONE_ALT_COUNT_COLUMN = "%21s %8s %21s %8d";
// Formatting for checkin service - update version if row format changes
private static final int ACTIVITY_THREAD_CHECKIN_VERSION = 4;
@@ -2619,43 +2621,43 @@ public final class ActivityThread extends ClientTransactionHandler {
if (dumpFullInfo) {
printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private",
"Shared", "Private", memInfo.hasSwappedOutPss ? "SwapPss" : "Swap",
- "Heap", "Heap", "Heap");
+ "Rss", "Heap", "Heap", "Heap");
printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty",
- "Clean", "Clean", "Dirty",
+ "Clean", "Clean", "Dirty", "Total",
"Size", "Alloc", "Free");
printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------",
- "------", "------", "------", "------", "------", "------");
+ "------", "------", "------", "------", "------", "------", "------");
printRow(pw, HEAP_FULL_COLUMN, "Native Heap", memInfo.nativePss,
memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
memInfo.nativePrivateClean, memInfo.hasSwappedOutPss ?
memInfo.nativeSwappedOutPss : memInfo.nativeSwappedOut,
- nativeMax, nativeAllocated, nativeFree);
+ memInfo.nativeRss, nativeMax, nativeAllocated, nativeFree);
printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
memInfo.dalvikPrivateClean, memInfo.hasSwappedOutPss ?
memInfo.dalvikSwappedOutPss : memInfo.dalvikSwappedOut,
- dalvikMax, dalvikAllocated, dalvikFree);
+ memInfo.dalvikRss, dalvikMax, dalvikAllocated, dalvikFree);
} else {
printRow(pw, HEAP_COLUMN, "", "Pss", "Private",
"Private", memInfo.hasSwappedOutPss ? "SwapPss" : "Swap",
- "Heap", "Heap", "Heap");
+ "Rss", "Heap", "Heap", "Heap");
printRow(pw, HEAP_COLUMN, "", "Total", "Dirty",
- "Clean", "Dirty", "Size", "Alloc", "Free");
+ "Clean", "Dirty", "Total", "Size", "Alloc", "Free");
printRow(pw, HEAP_COLUMN, "", "------", "------", "------",
- "------", "------", "------", "------", "------");
+ "------", "------", "------", "------", "------", "------");
printRow(pw, HEAP_COLUMN, "Native Heap", memInfo.nativePss,
memInfo.nativePrivateDirty,
memInfo.nativePrivateClean,
memInfo.hasSwappedOutPss ? memInfo.nativeSwappedOutPss :
- memInfo.nativeSwappedOut,
+ memInfo.nativeSwappedOut, memInfo.nativeRss,
nativeMax, nativeAllocated, nativeFree);
printRow(pw, HEAP_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
memInfo.dalvikPrivateDirty,
memInfo.dalvikPrivateClean,
memInfo.hasSwappedOutPss ? memInfo.dalvikSwappedOutPss :
- memInfo.dalvikSwappedOut,
+ memInfo.dalvikSwappedOut, memInfo.dalvikRss,
dalvikMax, dalvikAllocated, dalvikFree);
}
@@ -2667,6 +2669,7 @@ public final class ActivityThread extends ClientTransactionHandler {
int otherPrivateClean = memInfo.otherPrivateClean;
int otherSwappedOut = memInfo.otherSwappedOut;
int otherSwappedOutPss = memInfo.otherSwappedOutPss;
+ int otherRss = memInfo.otherRss;
for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
final int myPss = memInfo.getOtherPss(i);
@@ -2677,21 +2680,22 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
- || mySharedClean != 0 || myPrivateClean != 0
+ || mySharedClean != 0 || myPrivateClean != 0 || myRss != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
if (dumpFullInfo) {
printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
} else {
printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
myPss, myPrivateDirty,
myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
}
otherPss -= myPss;
otherSwappablePss -= mySwappablePss;
@@ -2701,6 +2705,7 @@ public final class ActivityThread extends ClientTransactionHandler {
otherPrivateClean -= myPrivateClean;
otherSwappedOut -= mySwappedOut;
otherSwappedOutPss -= mySwappedOutPss;
+ otherRss -= myRss;
}
}
@@ -2708,25 +2713,25 @@ public final class ActivityThread extends ClientTransactionHandler {
printRow(pw, HEAP_FULL_COLUMN, "Unknown", otherPss, otherSwappablePss,
otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean,
memInfo.hasSwappedOutPss ? otherSwappedOutPss : otherSwappedOut,
- "", "", "");
+ otherRss, "", "", "");
printRow(pw, HEAP_FULL_COLUMN, "TOTAL", memInfo.getTotalPss(),
memInfo.getTotalSwappablePss(),
memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(),
memInfo.hasSwappedOutPss ? memInfo.getTotalSwappedOutPss() :
- memInfo.getTotalSwappedOut(),
+ memInfo.getTotalSwappedOut(), memInfo.getTotalRss(),
nativeMax+dalvikMax, nativeAllocated+dalvikAllocated,
nativeFree+dalvikFree);
} else {
printRow(pw, HEAP_COLUMN, "Unknown", otherPss,
otherPrivateDirty, otherPrivateClean,
memInfo.hasSwappedOutPss ? otherSwappedOutPss : otherSwappedOut,
- "", "", "");
+ otherRss, "", "", "");
printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(),
memInfo.getTotalPrivateDirty(),
memInfo.getTotalPrivateClean(),
memInfo.hasSwappedOutPss ? memInfo.getTotalSwappedOutPss() :
- memInfo.getTotalSwappedOut(),
+ memInfo.getTotalSwappedOut(), memInfo.getTotalPss(),
nativeMax+dalvikMax,
nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);
}
@@ -2745,6 +2750,7 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
|| mySharedClean != 0 || myPrivateClean != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
@@ -2753,13 +2759,13 @@ public final class ActivityThread extends ClientTransactionHandler {
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
} else {
printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
myPss, myPrivateDirty,
myPrivateClean,
memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
- "", "", "");
+ myRss, "", "", "");
}
}
}
@@ -2768,31 +2774,36 @@ public final class ActivityThread extends ClientTransactionHandler {
pw.println(" ");
pw.println(" App Summary");
- printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "Pss(KB)");
- printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "------");
- printRow(pw, ONE_COUNT_COLUMN,
- "Java Heap:", memInfo.getSummaryJavaHeap());
+ printRow(pw, TWO_COUNT_COLUMN_HEADER, "", "Pss(KB)", "", "Rss(KB)");
+ printRow(pw, TWO_COUNT_COLUMN_HEADER, "", "------", "", "------");
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Java Heap:", memInfo.getSummaryJavaHeap(), "", memInfo.getSummaryJavaHeapRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Native Heap:", memInfo.getSummaryNativeHeap(), "",
+ memInfo.getSummaryNativeHeapRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Code:", memInfo.getSummaryCode(), "", memInfo.getSummaryCodeRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Stack:", memInfo.getSummaryStack(), "", memInfo.getSummaryStackRss());
+ printRow(pw, TWO_COUNT_COLUMNS,
+ "Graphics:", memInfo.getSummaryGraphics(), "", memInfo.getSummaryGraphicsRss());
printRow(pw, ONE_COUNT_COLUMN,
- "Native Heap:", memInfo.getSummaryNativeHeap());
+ "Private Other:", memInfo.getSummaryPrivateOther());
printRow(pw, ONE_COUNT_COLUMN,
- "Code:", memInfo.getSummaryCode());
- printRow(pw, ONE_COUNT_COLUMN,
- "Stack:", memInfo.getSummaryStack());
- printRow(pw, ONE_COUNT_COLUMN,
- "Graphics:", memInfo.getSummaryGraphics());
- printRow(pw, ONE_COUNT_COLUMN,
- "Private Other:", memInfo.getSummaryPrivateOther());
- printRow(pw, ONE_COUNT_COLUMN,
- "System:", memInfo.getSummarySystem());
+ "System:", memInfo.getSummarySystem());
+ printRow(pw, ONE_ALT_COUNT_COLUMN,
+ "Unknown:", "", "", memInfo.getSummaryUnknownRss());
pw.println(" ");
if (memInfo.hasSwappedOutPss) {
- printRow(pw, TWO_COUNT_COLUMNS,
- "TOTAL:", memInfo.getSummaryTotalPss(),
- "TOTAL SWAP PSS:", memInfo.getSummaryTotalSwapPss());
+ printRow(pw, THREE_COUNT_COLUMNS,
+ "TOTAL PSS:", memInfo.getSummaryTotalPss(),
+ "TOTAL RSS:", memInfo.getTotalRss(),
+ "TOTAL SWAP PSS:", memInfo.getSummaryTotalSwapPss());
} else {
- printRow(pw, TWO_COUNT_COLUMNS,
- "TOTAL:", memInfo.getSummaryTotalPss(),
- "TOTAL SWAP (KB):", memInfo.getSummaryTotalSwap());
+ printRow(pw, THREE_COUNT_COLUMNS,
+ "TOTAL PSS:", memInfo.getSummaryTotalPss(),
+ "TOTAL RSS:", memInfo.getTotalRss(),
+ "TOTAL SWAP (KB):", memInfo.getSummaryTotalSwap());
}
}
@@ -2804,7 +2815,7 @@ public final class ActivityThread extends ClientTransactionHandler {
private static void dumpMemoryInfo(ProtoOutputStream proto, long fieldId, String name,
int pss, int cleanPss, int sharedDirty, int privateDirty,
int sharedClean, int privateClean,
- boolean hasSwappedOutPss, int dirtySwap, int dirtySwapPss) {
+ boolean hasSwappedOutPss, int dirtySwap, int dirtySwapPss, int rss) {
final long token = proto.start(fieldId);
proto.write(MemInfoDumpProto.ProcessMemory.MemoryInfo.NAME, name);
@@ -2819,6 +2830,7 @@ public final class ActivityThread extends ClientTransactionHandler {
} else {
proto.write(MemInfoDumpProto.ProcessMemory.MemoryInfo.DIRTY_SWAP_KB, dirtySwap);
}
+ proto.write(MemInfoDumpProto.ProcessMemory.MemoryInfo.TOTAL_RSS_KB, rss);
proto.end(token);
}
@@ -2837,7 +2849,8 @@ public final class ActivityThread extends ClientTransactionHandler {
memInfo.nativePss, memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
memInfo.nativePrivateClean, memInfo.hasSwappedOutPss,
- memInfo.nativeSwappedOut, memInfo.nativeSwappedOutPss);
+ memInfo.nativeSwappedOut, memInfo.nativeSwappedOutPss,
+ memInfo.nativeRss);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_SIZE_KB, nativeMax);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_ALLOC_KB, nativeAllocated);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_FREE_KB, nativeFree);
@@ -2848,7 +2861,8 @@ public final class ActivityThread extends ClientTransactionHandler {
memInfo.dalvikPss, memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
memInfo.dalvikPrivateClean, memInfo.hasSwappedOutPss,
- memInfo.dalvikSwappedOut, memInfo.dalvikSwappedOutPss);
+ memInfo.dalvikSwappedOut, memInfo.dalvikSwappedOutPss,
+ memInfo.dalvikRss);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_SIZE_KB, dalvikMax);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_ALLOC_KB, dalvikAllocated);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_FREE_KB, dalvikFree);
@@ -2862,6 +2876,7 @@ public final class ActivityThread extends ClientTransactionHandler {
int otherPrivateClean = memInfo.otherPrivateClean;
int otherSwappedOut = memInfo.otherSwappedOut;
int otherSwappedOutPss = memInfo.otherSwappedOutPss;
+ int otherRss = memInfo.otherRss;
for (int i = 0; i < Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
final int myPss = memInfo.getOtherPss(i);
@@ -2872,14 +2887,15 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
- || mySharedClean != 0 || myPrivateClean != 0
+ || mySharedClean != 0 || myPrivateClean != 0 || myRss != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
dumpMemoryInfo(proto, MemInfoDumpProto.ProcessMemory.OTHER_HEAPS,
Debug.MemoryInfo.getOtherLabel(i),
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
- memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss);
+ memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss, myRss);
otherPss -= myPss;
otherSwappablePss -= mySwappablePss;
@@ -2889,20 +2905,21 @@ public final class ActivityThread extends ClientTransactionHandler {
otherPrivateClean -= myPrivateClean;
otherSwappedOut -= mySwappedOut;
otherSwappedOutPss -= mySwappedOutPss;
+ otherRss -= myRss;
}
}
dumpMemoryInfo(proto, MemInfoDumpProto.ProcessMemory.UNKNOWN_HEAP, "Unknown",
otherPss, otherSwappablePss,
otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean,
- memInfo.hasSwappedOutPss, otherSwappedOut, otherSwappedOutPss);
+ memInfo.hasSwappedOutPss, otherSwappedOut, otherSwappedOutPss, otherRss);
final long tToken = proto.start(MemInfoDumpProto.ProcessMemory.TOTAL_HEAP);
dumpMemoryInfo(proto, MemInfoDumpProto.ProcessMemory.HeapInfo.MEM_INFO, "TOTAL",
memInfo.getTotalPss(), memInfo.getTotalSwappablePss(),
memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(),
memInfo.hasSwappedOutPss, memInfo.getTotalSwappedOut(),
- memInfo.getTotalSwappedOutPss());
+ memInfo.getTotalSwappedOutPss(), memInfo.getTotalRss());
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_SIZE_KB,
nativeMax + dalvikMax);
proto.write(MemInfoDumpProto.ProcessMemory.HeapInfo.HEAP_ALLOC_KB,
@@ -2923,6 +2940,7 @@ public final class ActivityThread extends ClientTransactionHandler {
final int myPrivateClean = memInfo.getOtherPrivateClean(i);
final int mySwappedOut = memInfo.getOtherSwappedOut(i);
final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
+ final int myRss = memInfo.getOtherRss(i);
if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
|| mySharedClean != 0 || myPrivateClean != 0
|| (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
@@ -2930,7 +2948,7 @@ public final class ActivityThread extends ClientTransactionHandler {
Debug.MemoryInfo.getOtherLabel(i),
myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
mySharedClean, myPrivateClean,
- memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss);
+ memInfo.hasSwappedOutPss, mySwappedOut, mySwappedOutPss, myRss);
}
}
}
@@ -2958,6 +2976,19 @@ public final class ActivityThread extends ClientTransactionHandler {
proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.TOTAL_SWAP_PSS,
memInfo.getSummaryTotalSwap());
}
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.JAVA_HEAP_RSS_KB,
+ memInfo.getSummaryJavaHeapRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.NATIVE_HEAP_RSS_KB,
+ memInfo.getSummaryNativeHeapRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.CODE_RSS_KB,
+ memInfo.getSummaryCodeRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.STACK_RSS_KB,
+ memInfo.getSummaryStackRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.GRAPHICS_RSS_KB,
+ memInfo.getSummaryGraphicsRss());
+ proto.write(MemInfoDumpProto.ProcessMemory.AppSummary.UNKNOWN_RSS_KB,
+ memInfo.getSummaryUnknownRss());
+
proto.end(asToken);
}
diff --git a/core/java/android/app/Instrumentation.java b/core/java/android/app/Instrumentation.java
index 41733b3af058..9720e9f47f83 100644
--- a/core/java/android/app/Instrumentation.java
+++ b/core/java/android/app/Instrumentation.java
@@ -50,6 +50,7 @@ import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.MotionEvent;
+import android.view.SurfaceControl;
import android.view.ViewConfiguration;
import android.view.Window;
import android.view.WindowManagerGlobal;
@@ -528,6 +529,12 @@ public class Instrumentation {
} while (mWaitingActivities.contains(aw));
waitForEnterAnimationComplete(aw.activity);
+
+ // Apply an empty transaction to ensure SF has a chance to update before
+ // the Activity is ready (b/138263890).
+ try (SurfaceControl.Transaction t = new SurfaceControl.Transaction()) {
+ t.apply(true);
+ }
return aw.activity;
}
}
diff --git a/core/java/android/app/UiAutomation.java b/core/java/android/app/UiAutomation.java
index 2b74b99c8071..ed2b99187b95 100644
--- a/core/java/android/app/UiAutomation.java
+++ b/core/java/android/app/UiAutomation.java
@@ -1289,7 +1289,7 @@ public final class UiAutomation {
}
@Override
- public void onAccessibilityButtonClicked() {
+ public void onAccessibilityButtonClicked(int displayId) {
/* do nothing */
}
diff --git a/core/java/android/app/slice/SliceProvider.java b/core/java/android/app/slice/SliceProvider.java
index 0ccd49f2e028..5e530eedd818 100644
--- a/core/java/android/app/slice/SliceProvider.java
+++ b/core/java/android/app/slice/SliceProvider.java
@@ -355,7 +355,8 @@ public abstract class SliceProvider extends ContentProvider {
@Override
public Bundle call(String method, String arg, Bundle extras) {
if (method.equals(METHOD_SLICE)) {
- Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
+ Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
+ extras.getParcelable(EXTRA_BIND_URI)));
List<SliceSpec> supportedSpecs = extras.getParcelableArrayList(EXTRA_SUPPORTED_SPECS);
String callingPackage = getCallingPackage();
@@ -369,7 +370,7 @@ public abstract class SliceProvider extends ContentProvider {
} else if (method.equals(METHOD_MAP_INTENT)) {
Intent intent = extras.getParcelable(EXTRA_INTENT);
if (intent == null) return null;
- Uri uri = onMapIntentToUri(intent);
+ Uri uri = validateIncomingUriOrNull(onMapIntentToUri(intent));
List<SliceSpec> supportedSpecs = extras.getParcelableArrayList(EXTRA_SUPPORTED_SPECS);
Bundle b = new Bundle();
if (uri != null) {
@@ -383,24 +384,27 @@ public abstract class SliceProvider extends ContentProvider {
} else if (method.equals(METHOD_MAP_ONLY_INTENT)) {
Intent intent = extras.getParcelable(EXTRA_INTENT);
if (intent == null) return null;
- Uri uri = onMapIntentToUri(intent);
+ Uri uri = validateIncomingUriOrNull(onMapIntentToUri(intent));
Bundle b = new Bundle();
b.putParcelable(EXTRA_SLICE, uri);
return b;
} else if (method.equals(METHOD_PIN)) {
- Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
+ Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
+ extras.getParcelable(EXTRA_BIND_URI)));
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Only the system can pin/unpin slices");
}
handlePinSlice(uri);
} else if (method.equals(METHOD_UNPIN)) {
- Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
+ Uri uri = getUriWithoutUserId(validateIncomingUriOrNull(
+ extras.getParcelable(EXTRA_BIND_URI)));
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Only the system can pin/unpin slices");
}
handleUnpinSlice(uri);
} else if (method.equals(METHOD_GET_DESCENDANTS)) {
- Uri uri = getUriWithoutUserId(extras.getParcelable(EXTRA_BIND_URI));
+ Uri uri = getUriWithoutUserId(
+ validateIncomingUriOrNull(extras.getParcelable(EXTRA_BIND_URI)));
Bundle b = new Bundle();
b.putParcelableArrayList(EXTRA_SLICE_DESCENDANTS,
new ArrayList<>(handleGetDescendants(uri)));
@@ -416,6 +420,10 @@ public abstract class SliceProvider extends ContentProvider {
return super.call(method, arg, extras);
}
+ private Uri validateIncomingUriOrNull(Uri uri) {
+ return uri == null ? null : validateIncomingUri(uri);
+ }
+
private Collection<Uri> handleGetDescendants(Uri uri) {
mCallback = "onGetSliceDescendants";
return onGetSliceDescendants(uri);
diff --git a/core/java/android/content/pm/UserInfo.java b/core/java/android/content/pm/UserInfo.java
index 7865d75d839c..fcdc81cf7533 100644
--- a/core/java/android/content/pm/UserInfo.java
+++ b/core/java/android/content/pm/UserInfo.java
@@ -16,14 +16,32 @@
package android.content.pm;
+import android.annotation.IntDef;
import android.annotation.UnsupportedAppUsage;
+import android.annotation.UserIdInt;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.UserHandle;
import android.os.UserManager;
+import android.util.DebugUtils;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
/**
* Per-user information.
+ *
+ * <p>There are 3 base properties of users: {@link #FLAG_SYSTEM}, {@link #FLAG_FULL}, and
+ * {@link #FLAG_MANAGED_PROFILE}. Every user must have one of the following combination of these
+ * flags:
+ * <ul>
+ * <li>FLAG_SYSTEM (user {@link UserHandle#USER_SYSTEM} on a headless-user-0 device)</li>
+ * <li>FLAG_SYSTEM and FLAG_FULL (user {@link UserHandle#USER_SYSTEM} on a regular device)</li>
+ * <li>FLAG_FULL (non-profile secondary user)</li>
+ * <li>FLAG_MANAGED_PROFILE (profile users)</li>
+ * </ul>
+ * Users can have also have additional flags (such as FLAG_GUEST) as appropriate.
+ *
* @hide
*/
public class UserInfo implements Parcelable {
@@ -93,10 +111,45 @@ public class UserInfo implements Parcelable {
*/
public static final int FLAG_DEMO = 0x00000200;
+ /**
+ * Indicates that this user is a non-profile human user.
+ *
+ * <p>When creating a new (non-system) user, this flag will always be forced true unless the
+ * user is a {@link #FLAG_MANAGED_PROFILE}. If user {@link UserHandle#USER_SYSTEM} is also a
+ * human user, it must also be flagged as FULL.
+ */
+ public static final int FLAG_FULL = 0x00000400;
+
+ /**
+ * Indicates that this user is {@link UserHandle#USER_SYSTEM}. Not applicable to created users.
+ */
+ public static final int FLAG_SYSTEM = 0x00000800;
+
+ /**
+ * @hide
+ */
+ @IntDef(flag = true, prefix = "FLAG_", value = {
+ FLAG_PRIMARY,
+ FLAG_ADMIN,
+ FLAG_GUEST,
+ FLAG_RESTRICTED,
+ FLAG_INITIALIZED,
+ FLAG_MANAGED_PROFILE,
+ FLAG_DISABLED,
+ FLAG_QUIET_MODE,
+ FLAG_EPHEMERAL,
+ FLAG_DEMO,
+ FLAG_FULL,
+ FLAG_SYSTEM
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface UserInfoFlag {
+ }
+
public static final int NO_PROFILE_GROUP_ID = UserHandle.USER_NULL;
@UnsupportedAppUsage
- public int id;
+ public @UserIdInt int id;
@UnsupportedAppUsage
public int serialNumber;
@UnsupportedAppUsage
@@ -104,7 +157,7 @@ public class UserInfo implements Parcelable {
@UnsupportedAppUsage
public String iconPath;
@UnsupportedAppUsage
- public int flags;
+ public @UserInfoFlag int flags;
@UnsupportedAppUsage
public long creationTime;
@UnsupportedAppUsage
@@ -188,6 +241,10 @@ public class UserInfo implements Parcelable {
return (flags & FLAG_DEMO) == FLAG_DEMO;
}
+ public boolean isFull() {
+ return (flags & FLAG_FULL) == FLAG_FULL;
+ }
+
/**
* Returns true if the user is a split system user.
* <p>If {@link UserManager#isSplitSystemUser split system user mode} is not enabled,
@@ -264,13 +321,23 @@ public class UserInfo implements Parcelable {
@Override
public String toString() {
+ // NOTE: do not change this string, it's used by 'pm list users', which in turn is
+ // used and parsed by TestDevice. In other words, if you change it, you'd have to change
+ // TestDevice, TestDeviceTest, and possibly others....
return "UserInfo{" + id + ":" + name + ":" + Integer.toHexString(flags) + "}";
}
+ /** @hide */
+ public static String flagsToString(int flags) {
+ return DebugUtils.flagsToString(UserInfo.class, "FLAG_", flags);
+ }
+
+ @Override
public int describeContents() {
return 0;
}
+ @Override
public void writeToParcel(Parcel dest, int parcelableFlags) {
dest.writeInt(id);
dest.writeString(name);
diff --git a/core/java/android/net/util/MultinetworkPolicyTracker.java b/core/java/android/net/util/MultinetworkPolicyTracker.java
index 30c5cd98b719..f7e494d830ac 100644
--- a/core/java/android/net/util/MultinetworkPolicyTracker.java
+++ b/core/java/android/net/util/MultinetworkPolicyTracker.java
@@ -16,28 +16,31 @@
package android.net.util;
+import static android.provider.Settings.Global.NETWORK_AVOID_BAD_WIFI;
+import static android.provider.Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE;
+
+import android.annotation.NonNull;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.res.Resources;
import android.database.ContentObserver;
-import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.Handler;
-import android.os.Message;
import android.os.UserHandle;
import android.provider.Settings;
+import android.telephony.PhoneStateListener;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import android.util.Slog;
-import java.util.Arrays;
-import java.util.List;
-
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.R;
+import com.android.internal.annotations.VisibleForTesting;
-import static android.provider.Settings.Global.NETWORK_AVOID_BAD_WIFI;
-import static android.provider.Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE;
+import java.util.Arrays;
+import java.util.List;
/**
* A class to encapsulate management of the "Smart Networking" capability of
@@ -69,6 +72,7 @@ public class MultinetworkPolicyTracker {
private volatile boolean mAvoidBadWifi = true;
private volatile int mMeteredMultipathPreference;
+ private int mActiveSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
public MultinetworkPolicyTracker(Context ctx, Handler handler) {
this(ctx, handler, null);
@@ -95,6 +99,14 @@ public class MultinetworkPolicyTracker {
}
};
+ TelephonyManager.from(ctx).listen(new PhoneStateListener() {
+ @Override
+ public void onActiveDataSubscriptionIdChanged(int subId) {
+ mActiveSubId = subId;
+ reevaluate();
+ }
+ }, PhoneStateListener.LISTEN_ACTIVE_DATA_SUBSCRIPTION_ID_CHANGE);
+
updateAvoidBadWifi();
updateMeteredMultipathPreference();
}
@@ -131,7 +143,12 @@ public class MultinetworkPolicyTracker {
* Whether the device or carrier configuration disables avoiding bad wifi by default.
*/
public boolean configRestrictsAvoidBadWifi() {
- return (mContext.getResources().getInteger(R.integer.config_networkAvoidBadWifi) == 0);
+ return (getResourcesForActiveSubId().getInteger(R.integer.config_networkAvoidBadWifi) == 0);
+ }
+
+ @NonNull
+ private Resources getResourcesForActiveSubId() {
+ return SubscriptionManager.getResourcesForSubId(mContext, mActiveSubId);
}
/**
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 1213eeaa747d..3cc28197503a 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -787,6 +787,68 @@ public final class Debug
}
/**
+ * Rss of Java Heap bytes in KB due to the application.
+ * @hide
+ */
+ public int getSummaryJavaHeapRss() {
+ return dalvikRss + getOtherRss(OTHER_ART);
+ }
+
+ /**
+ * Rss of Native Heap bytes in KB due to the application.
+ * @hide
+ */
+ public int getSummaryNativeHeapRss() {
+ return nativeRss;
+ }
+
+ /**
+ * Rss of code and other static resource bytes in KB due to
+ * the application.
+ * @hide
+ */
+ public int getSummaryCodeRss() {
+ return getOtherRss(OTHER_SO)
+ + getOtherRss(OTHER_JAR)
+ + getOtherRss(OTHER_APK)
+ + getOtherRss(OTHER_TTF)
+ + getOtherRss(OTHER_DEX)
+ + getOtherRss(OTHER_OAT);
+ }
+
+ /**
+ * Rss in KB of the stack due to the application.
+ * @hide
+ */
+ public int getSummaryStackRss() {
+ return getOtherRss(OTHER_STACK);
+ }
+
+ /**
+ * Rss in KB of graphics due to the application.
+ * @hide
+ */
+ public int getSummaryGraphicsRss() {
+ return getOtherRss(OTHER_GL_DEV)
+ + getOtherRss(OTHER_GRAPHICS)
+ + getOtherRss(OTHER_GL);
+ }
+
+ /**
+ * Rss in KB due to either the application or system that haven't otherwise been
+ * accounted for.
+ * @hide
+ */
+ public int getSummaryUnknownRss() {
+ return getTotalRss()
+ - getSummaryJavaHeapRss()
+ - getSummaryNativeHeapRss()
+ - getSummaryCodeRss()
+ - getSummaryStackRss()
+ - getSummaryGraphicsRss();
+ }
+
+ /**
* Total Pss in KB.
* @hide
*/
diff --git a/core/java/android/os/UserManagerInternal.java b/core/java/android/os/UserManagerInternal.java
index 2e3b000f2b39..f302263f23ce 100644
--- a/core/java/android/os/UserManagerInternal.java
+++ b/core/java/android/os/UserManagerInternal.java
@@ -16,6 +16,7 @@
package android.os;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.content.Context;
import android.content.pm.UserInfo;
import android.graphics.Bitmap;
@@ -224,4 +225,10 @@ public abstract class UserManagerInternal {
/** @return a specific user restriction that's in effect currently. */
public abstract boolean hasUserRestriction(String restriction, int userId);
+
+ /**
+ * Gets an {@link UserInfo} for the given {@code userId}, or {@code null} if not
+ * found.
+ */
+ public abstract @Nullable UserInfo getUserInfo(@UserIdInt int userId);
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 7df1ebe15d44..9abb64f15e99 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7030,6 +7030,8 @@ public final class Settings {
*/
public static final String DISPLAY_DENSITY_FORCED = "display_density_forced";
+ static final Validator DISPLAY_DENSITY_FORCED_VALIDATOR = NON_NEGATIVE_INTEGER_VALIDATOR;
+
/**
* Setting to always use the default text-to-speech settings regardless
* of the application settings.
@@ -7110,24 +7112,8 @@ public final class Settings {
*/
public static final String TTS_DEFAULT_LOCALE = "tts_default_locale";
- private static final Validator TTS_DEFAULT_LOCALE_VALIDATOR = new Validator() {
- @Override
- public boolean validate(@Nullable String value) {
- if (value == null || value.length() == 0) {
- return false;
- }
- String[] ttsLocales = value.split(",");
- boolean valid = true;
- for (String ttsLocale : ttsLocales) {
- String[] parts = ttsLocale.split(":");
- valid |= ((parts.length == 2)
- && (parts[0].length() > 0)
- && ANY_STRING_VALIDATOR.validate(parts[0])
- && LOCALE_VALIDATOR.validate(parts[1]));
- }
- return valid;
- }
- };
+ private static final Validator TTS_DEFAULT_LOCALE_VALIDATOR =
+ new SettingsValidators.TTSListValidator();
/**
* Space delimited list of plugin packages that are enabled.
@@ -8647,25 +8633,13 @@ public final class Settings {
/**
* Holds comma separated list of ordering of QS tiles.
+ *
* @hide
*/
public static final String QS_TILES = "sysui_qs_tiles";
- private static final Validator QS_TILES_VALIDATOR = new Validator() {
- @Override
- public boolean validate(@Nullable String value) {
- if (value == null) {
- return false;
- }
- String[] tiles = value.split(",");
- boolean valid = true;
- for (String tile : tiles) {
- // tile can be any non-empty string as specified by OEM
- valid |= ((tile.length() > 0) && ANY_STRING_VALIDATOR.validate(tile));
- }
- return valid;
- }
- };
+ private static final Validator QS_TILES_VALIDATOR =
+ new SettingsValidators.TileListValidator();
/**
* Specifies whether the web action API is enabled.
@@ -8731,21 +8705,8 @@ public final class Settings {
*/
public static final String QS_AUTO_ADDED_TILES = "qs_auto_tiles";
- private static final Validator QS_AUTO_ADDED_TILES_VALIDATOR = new Validator() {
- @Override
- public boolean validate(@Nullable String value) {
- if (value == null) {
- return false;
- }
- String[] tiles = value.split(",");
- boolean valid = true;
- for (String tile : tiles) {
- // tile can be any non-empty string as specified by OEM
- valid |= ((tile.length() > 0) && ANY_STRING_VALIDATOR.validate(tile));
- }
- return valid;
- }
- };
+ private static final Validator QS_AUTO_ADDED_TILES_VALIDATOR =
+ new SettingsValidators.TileListValidator();
/**
* Whether the Lockdown button should be shown in the power menu.
@@ -9083,8 +9044,22 @@ public final class Settings {
};
/**
- * All settings in {@link SETTINGS_TO_BACKUP} array *must* have a non-null validator,
- * otherwise they won't be restored.
+ * The settings values which should only be restored if the target device is the
+ * same as the source device
+ *
+ * NOTE: Settings are backed up and restored in the order they appear
+ * in this array. If you have one setting depending on another,
+ * make sure that they are ordered appropriately.
+ *
+ * @hide
+ */
+ public static final String[] DEVICE_SPECIFIC_SETTINGS_TO_BACKUP = {
+ DISPLAY_DENSITY_FORCED,
+ };
+
+ /**
+ * All settings in {@link SETTINGS_TO_BACKUP} and {@link DEVICE_SPECIFIC_SETTINGS_TO_BACKUP}
+ * array *must* have a non-null validator, otherwise they won't be restored.
*
* @hide
*/
@@ -9276,6 +9251,7 @@ public final class Settings {
VALIDATORS.put(UI_NIGHT_MODE, UI_NIGHT_MODE_VALIDATOR);
VALIDATORS.put(GLOBAL_ACTIONS_PANEL_ENABLED, GLOBAL_ACTIONS_PANEL_ENABLED_VALIDATOR);
VALIDATORS.put(AWARE_LOCK_ENABLED, AWARE_LOCK_ENABLED_VALIDATOR);
+ VALIDATORS.put(DISPLAY_DENSITY_FORCED, DISPLAY_DENSITY_FORCED_VALIDATOR);
}
/**
@@ -13819,6 +13795,9 @@ public final class Settings {
* in this array. If you have one setting depending on another,
* make sure that they are ordered appropriately.
*
+ * NOTE: This table should only be used for settings which should be restored
+ * between different types of devices {@see #DEVICE_SPECIFIC_SETTINGS_TO_BACKUP}
+ *
* @hide
*/
public static final String[] SETTINGS_TO_BACKUP = {
@@ -13863,6 +13842,7 @@ public final class Settings {
* @hide
*/
public static final Map<String, Validator> VALIDATORS = new ArrayMap<>();
+
static {
VALIDATORS.put(APPLY_RAMPING_RINGER, APPLY_RAMPING_RINGER_VALIDATOR);
VALIDATORS.put(BUGREPORT_IN_POWER_MENU, BUGREPORT_IN_POWER_MENU_VALIDATOR);
diff --git a/core/java/android/provider/SettingsValidators.java b/core/java/android/provider/SettingsValidators.java
index 405121378d1f..e4cf9fd6aaee 100644
--- a/core/java/android/provider/SettingsValidators.java
+++ b/core/java/android/provider/SettingsValidators.java
@@ -283,4 +283,50 @@ public class SettingsValidators {
return true;
}
}
+
+ private abstract static class ListValidator implements Validator {
+ public boolean validate(@Nullable String value) {
+ if (!isEntryValid(value)) {
+ return false;
+ }
+ String[] items = value.split(",");
+ for (String item : items) {
+ if (!isItemValid(item)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected abstract boolean isEntryValid(String entry);
+
+ protected abstract boolean isItemValid(String item);
+ }
+
+ /** Ensure a restored value is a string in the format the text-to-speech system handles */
+ public static final class TTSListValidator extends ListValidator {
+ protected boolean isEntryValid(String entry) {
+ return entry != null && entry.length() > 0;
+ }
+
+ protected boolean isItemValid(String item) {
+ String[] parts = item.split(":");
+ // Replaces any old language separator (-) with the new one (_)
+ return ((parts.length == 2)
+ && (parts[0].length() > 0)
+ && ANY_STRING_VALIDATOR.validate(parts[0])
+ && LOCALE_VALIDATOR.validate(parts[1].replace('-', '_')));
+ }
+ }
+
+ /** Ensure a restored value is suitable to be used as a tile name */
+ public static final class TileListValidator extends ListValidator {
+ protected boolean isEntryValid(String entry) {
+ return entry != null;
+ }
+
+ protected boolean isItemValid(String item) {
+ return item.length() > 0 && ANY_STRING_VALIDATOR.validate(item);
+ }
+ }
}
diff --git a/core/java/android/provider/TEST_MAPPING b/core/java/android/provider/TEST_MAPPING
new file mode 100644
index 000000000000..52a6a4585581
--- /dev/null
+++ b/core/java/android/provider/TEST_MAPPING
@@ -0,0 +1,12 @@
+{
+ "presubmit": [
+ {
+ "name": "CtsProviderTestCases",
+ "options": [
+ {
+ "include-annotation": "android.platform.test.annotations.Presubmit"
+ }
+ ]
+ }
+ ]
+}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 85e9e4950cba..fe88a9140b37 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -2550,12 +2550,10 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
return;
}
- final boolean isItemEnabled;
+ boolean isItemEnabled = view.isEnabled() && isEnabled();
final ViewGroup.LayoutParams lp = view.getLayoutParams();
if (lp instanceof AbsListView.LayoutParams) {
- isItemEnabled = ((AbsListView.LayoutParams) lp).isEnabled && isEnabled();
- } else {
- isItemEnabled = false;
+ isItemEnabled &= ((AbsListView.LayoutParams) lp).isEnabled;
}
info.setEnabled(isItemEnabled);
diff --git a/core/java/com/android/internal/content/PackageHelper.java b/core/java/com/android/internal/content/PackageHelper.java
index 1d81c59a8f89..152d699f5e6b 100644
--- a/core/java/com/android/internal/content/PackageHelper.java
+++ b/core/java/com/android/internal/content/PackageHelper.java
@@ -35,7 +35,7 @@ import android.os.storage.StorageManager;
import android.os.storage.StorageVolume;
import android.os.storage.VolumeInfo;
import android.provider.Settings;
-import android.util.ArraySet;
+import android.util.ArrayMap;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -166,6 +166,23 @@ public class PackageHelper {
params.sizeBytes, testableInterface);
}
+ private static boolean checkFitOnVolume(StorageManager storageManager, String volumePath,
+ SessionParams params) throws IOException {
+ if (volumePath == null) {
+ return false;
+ }
+ final int installFlags = translateAllocateFlags(params.installFlags);
+ final UUID target = storageManager.getUuidForPath(new File(volumePath));
+ final long availBytes = storageManager.getAllocatableBytes(target,
+ installFlags | StorageManager.FLAG_ALLOCATE_NON_CACHE_ONLY);
+ if (params.sizeBytes <= availBytes) {
+ return true;
+ }
+ final long cacheClearable = storageManager.getAllocatableBytes(target,
+ installFlags | StorageManager.FLAG_ALLOCATE_CACHE_ONLY);
+ return params.sizeBytes <= availBytes + cacheClearable;
+ }
+
@VisibleForTesting
public static String resolveInstallVolume(Context context, SessionParams params,
TestableInterface testInterface) throws IOException {
@@ -178,35 +195,23 @@ public class PackageHelper {
ApplicationInfo existingInfo = testInterface.getExistingAppInfo(context,
params.appPackageName);
- // Figure out best candidate volume, and also if we fit on internal
- final ArraySet<String> allCandidates = new ArraySet<>();
- boolean fitsOnInternal = false;
- VolumeInfo bestCandidate = null;
- long bestCandidateAvailBytes = Long.MIN_VALUE;
+ final ArrayMap<String, String> volumePaths = new ArrayMap<>();
+ String internalVolumePath = null;
for (VolumeInfo vol : storageManager.getVolumes()) {
if (vol.type == VolumeInfo.TYPE_PRIVATE && vol.isMountedWritable()) {
final boolean isInternalStorage = ID_PRIVATE_INTERNAL.equals(vol.id);
- final UUID target = storageManager.getUuidForPath(new File(vol.path));
- final long availBytes = storageManager.getAllocatableBytes(target,
- translateAllocateFlags(params.installFlags));
if (isInternalStorage) {
- fitsOnInternal = (params.sizeBytes <= availBytes);
+ internalVolumePath = vol.path;
}
if (!isInternalStorage || allow3rdPartyOnInternal) {
- if (availBytes >= params.sizeBytes) {
- allCandidates.add(vol.fsUuid);
- }
- if (availBytes >= bestCandidateAvailBytes) {
- bestCandidate = vol;
- bestCandidateAvailBytes = availBytes;
- }
+ volumePaths.put(vol.fsUuid, vol.path);
}
}
}
// System apps always forced to internal storage
if (existingInfo != null && existingInfo.isSystemApp()) {
- if (fitsOnInternal) {
+ if (checkFitOnVolume(storageManager, internalVolumePath, params)) {
return StorageManager.UUID_PRIVATE_INTERNAL;
} else {
throw new IOException("Not enough space on existing volume "
@@ -228,7 +233,7 @@ public class PackageHelper {
throw new IOException("Not allowed to install non-system apps on internal storage");
}
- if (fitsOnInternal) {
+ if (checkFitOnVolume(storageManager, internalVolumePath, params)) {
return StorageManager.UUID_PRIVATE_INTERNAL;
} else {
throw new IOException("Requested internal only, but not enough space");
@@ -237,10 +242,14 @@ public class PackageHelper {
// If app already exists somewhere, we must stay on that volume
if (existingInfo != null) {
- if (Objects.equals(existingInfo.volumeUuid, StorageManager.UUID_PRIVATE_INTERNAL)
- && fitsOnInternal) {
- return StorageManager.UUID_PRIVATE_INTERNAL;
- } else if (allCandidates.contains(existingInfo.volumeUuid)) {
+ String existingVolumePath = null;
+ if (Objects.equals(existingInfo.volumeUuid, StorageManager.UUID_PRIVATE_INTERNAL)) {
+ existingVolumePath = internalVolumePath;
+ } else if (volumePaths.containsKey(existingInfo.volumeUuid)) {
+ existingVolumePath = volumePaths.get(existingInfo.volumeUuid);
+ }
+
+ if (checkFitOnVolume(storageManager, existingVolumePath, params)) {
return existingInfo.volumeUuid;
} else {
throw new IOException("Not enough space on existing volume "
@@ -250,12 +259,36 @@ public class PackageHelper {
// We're left with new installations with either preferring external or auto, so just pick
// volume with most space
- if (bestCandidate != null) {
- return bestCandidate.fsUuid;
+ if (volumePaths.size() == 1) {
+ if (checkFitOnVolume(storageManager, volumePaths.valueAt(0), params)) {
+ return volumePaths.keyAt(0);
+ }
} else {
- throw new IOException("No special requests, but no room on allowed volumes. "
- + " allow3rdPartyOnInternal? " + allow3rdPartyOnInternal);
+ String bestCandidate = null;
+ long bestCandidateAvailBytes = Long.MIN_VALUE;
+ for (String vol : volumePaths.keySet()) {
+ final String volumePath = volumePaths.get(vol);
+ final UUID target = storageManager.getUuidForPath(new File(volumePath));
+
+ // We need to take into account freeable cached space, because we're choosing the
+ // best candidate amongst a list, not just checking if we fit at all.
+ final long availBytes = storageManager.getAllocatableBytes(target,
+ translateAllocateFlags(params.installFlags));
+
+ if (availBytes >= bestCandidateAvailBytes) {
+ bestCandidate = vol;
+ bestCandidateAvailBytes = availBytes;
+ }
+ }
+
+ if (bestCandidateAvailBytes >= params.sizeBytes) {
+ return bestCandidate;
+ }
+
}
+
+ throw new IOException("No special requests, but no room on allowed volumes. "
+ + " allow3rdPartyOnInternal? " + allow3rdPartyOnInternal);
}
public static boolean fitsOnInternal(Context context, SessionParams params) throws IOException {
diff --git a/core/java/com/android/internal/os/AtomicDirectory.java b/core/java/com/android/internal/os/AtomicDirectory.java
index f24d12e0c3af..8ca7a7186cb4 100644
--- a/core/java/com/android/internal/os/AtomicDirectory.java
+++ b/core/java/com/android/internal/os/AtomicDirectory.java
@@ -17,13 +17,17 @@
package com.android.internal.os;
import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.os.FileUtils;
+import android.system.ErrnoException;
+import android.system.Os;
+import android.system.OsConstants;
import android.util.ArrayMap;
+import android.util.Log;
import com.android.internal.util.Preconditions;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
@@ -46,12 +50,13 @@ import java.util.Arrays;
* backing directory when checking existence, making changes, and deleting.
*/
public final class AtomicDirectory {
- private final @NonNull ArrayMap<File, FileOutputStream> mOpenFiles = new ArrayMap<>();
+
+ private static final String LOG_TAG = AtomicDirectory.class.getSimpleName();
+
private final @NonNull File mBaseDirectory;
private final @NonNull File mBackupDirectory;
- private int mBaseDirectoryFd = -1;
- private int mBackupDirectoryFd = -1;
+ private final @NonNull ArrayMap<File, FileOutputStream> mOpenFiles = new ArrayMap<>();
/**
* Creates a new instance.
@@ -65,15 +70,16 @@ public final class AtomicDirectory {
}
/**
- * Gets the backup directory if present. This could be useful if you are
- * writing new state to the dir but need to access the last persisted state
- * at the same time. This means that this call is useful in between
- * {@link #startWrite()} and {@link #finishWrite()} or {@link #failWrite()}.
- * You should not modify the content returned by this method.
+ * Gets the backup directory which may or may not exist. This could be
+ * useful if you are writing new state to the directory but need to access
+ * the last persisted state at the same time. This means that this call is
+ * useful in between {@link #startWrite()} and {@link #finishWrite()} or
+ * {@link #failWrite()}. You should not modify the content returned by this
+ * method.
*
* @see #startRead()
*/
- public @Nullable File getBackupDirectory() {
+ public @NonNull File getBackupDirectory() {
return mBackupDirectory;
}
@@ -88,7 +94,8 @@ public final class AtomicDirectory {
*/
public @NonNull File startRead() throws IOException {
restore();
- return getOrCreateBaseDirectory();
+ ensureBaseDirectory();
+ return mBaseDirectory;
}
/**
@@ -97,10 +104,7 @@ public final class AtomicDirectory {
* @see #startRead()
* @see #startWrite()
*/
- public void finishRead() {
- mBaseDirectoryFd = -1;
- mBackupDirectoryFd = -1;
- }
+ public void finishRead() {}
/**
* Starts editing this directory. After calling this method you should
@@ -119,7 +123,8 @@ public final class AtomicDirectory {
*/
public @NonNull File startWrite() throws IOException {
backup();
- return getOrCreateBaseDirectory();
+ ensureBaseDirectory();
+ return mBaseDirectory;
}
/**
@@ -133,13 +138,14 @@ public final class AtomicDirectory {
* @see #closeWrite(FileOutputStream)
*/
public @NonNull FileOutputStream openWrite(@NonNull File file) throws IOException {
- if (file.isDirectory() || !file.getParentFile().equals(getOrCreateBaseDirectory())) {
- throw new IllegalArgumentException("Must be a file in " + getOrCreateBaseDirectory());
+ if (file.isDirectory() || !file.getParentFile().equals(mBaseDirectory)) {
+ throw new IllegalArgumentException("Must be a file in " + mBaseDirectory);
}
- final FileOutputStream destination = new FileOutputStream(file);
- if (mOpenFiles.put(file, destination) != null) {
- throw new IllegalArgumentException("Already open file" + file.getCanonicalPath());
+ if (mOpenFiles.containsKey(file)) {
+ throw new IllegalArgumentException("Already open file " + file.getAbsolutePath());
}
+ final FileOutputStream destination = new FileOutputStream(file);
+ mOpenFiles.put(file, destination);
return destination;
}
@@ -152,20 +158,21 @@ public final class AtomicDirectory {
*/
public void closeWrite(@NonNull FileOutputStream destination) {
final int indexOfValue = mOpenFiles.indexOfValue(destination);
- if (mOpenFiles.removeAt(indexOfValue) == null) {
+ if (indexOfValue < 0) {
throw new IllegalArgumentException("Unknown file stream " + destination);
}
+ mOpenFiles.removeAt(indexOfValue);
FileUtils.sync(destination);
- try {
- destination.close();
- } catch (IOException ignored) {}
+ FileUtils.closeQuietly(destination);
}
public void failWrite(@NonNull FileOutputStream destination) {
final int indexOfValue = mOpenFiles.indexOfValue(destination);
- if (indexOfValue >= 0) {
- mOpenFiles.removeAt(indexOfValue);
+ if (indexOfValue < 0) {
+ throw new IllegalArgumentException("Unknown file stream " + destination);
}
+ mOpenFiles.removeAt(indexOfValue);
+ FileUtils.closeQuietly(destination);
}
/**
@@ -173,15 +180,15 @@ public final class AtomicDirectory {
*
* @see #startWrite()
*
- * @throws IllegalStateException is some files are not closed.
+ * @throws IllegalStateException if some files are not closed.
*/
public void finishWrite() {
throwIfSomeFilesOpen();
- fsyncDirectoryFd(mBaseDirectoryFd);
+
+ syncDirectory(mBaseDirectory);
+ syncParentDirectory();
deleteDirectory(mBackupDirectory);
- fsyncDirectoryFd(mBackupDirectoryFd);
- mBaseDirectoryFd = -1;
- mBackupDirectoryFd = -1;
+ syncParentDirectory();
}
/**
@@ -191,11 +198,12 @@ public final class AtomicDirectory {
*/
public void failWrite() {
throwIfSomeFilesOpen();
+
try{
restore();
- } catch (IOException ignored) {}
- mBaseDirectoryFd = -1;
- mBackupDirectoryFd = -1;
+ } catch (IOException e) {
+ Log.e(LOG_TAG, "Failed to restore in failWrite()", e);
+ }
}
/**
@@ -209,29 +217,28 @@ public final class AtomicDirectory {
* Deletes this directory.
*/
public void delete() {
+ boolean deleted = false;
if (mBaseDirectory.exists()) {
- deleteDirectory(mBaseDirectory);
- fsyncDirectoryFd(mBaseDirectoryFd);
+ deleted |= deleteDirectory(mBaseDirectory);
}
if (mBackupDirectory.exists()) {
- deleteDirectory(mBackupDirectory);
- fsyncDirectoryFd(mBackupDirectoryFd);
+ deleted |= deleteDirectory(mBackupDirectory);
+ }
+ if (deleted) {
+ syncParentDirectory();
}
}
- private @NonNull File getOrCreateBaseDirectory() throws IOException {
- if (!mBaseDirectory.exists()) {
- if (!mBaseDirectory.mkdirs()) {
- throw new IOException("Couldn't create directory " + mBaseDirectory);
- }
- FileUtils.setPermissions(mBaseDirectory.getPath(),
- FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH,
- -1, -1);
+ private void ensureBaseDirectory() throws IOException {
+ if (mBaseDirectory.exists()) {
+ return;
}
- if (mBaseDirectoryFd < 0) {
- mBaseDirectoryFd = getDirectoryFd(mBaseDirectory.getCanonicalPath());
+
+ if (!mBaseDirectory.mkdirs()) {
+ throw new IOException("Failed to create directory " + mBaseDirectory);
}
- return mBaseDirectory;
+ FileUtils.setPermissions(mBaseDirectory.getPath(),
+ FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IXOTH, -1, -1);
}
private void throwIfSomeFilesOpen() {
@@ -245,50 +252,56 @@ public final class AtomicDirectory {
if (!mBaseDirectory.exists()) {
return;
}
- if (mBaseDirectoryFd < 0) {
- mBaseDirectoryFd = getDirectoryFd(mBaseDirectory.getCanonicalPath());
- }
+
if (mBackupDirectory.exists()) {
deleteDirectory(mBackupDirectory);
}
if (!mBaseDirectory.renameTo(mBackupDirectory)) {
- throw new IOException("Couldn't backup " + mBaseDirectory
- + " to " + mBackupDirectory);
+ throw new IOException("Failed to backup " + mBaseDirectory + " to " + mBackupDirectory);
}
- mBackupDirectoryFd = mBaseDirectoryFd;
- mBaseDirectoryFd = -1;
- fsyncDirectoryFd(mBackupDirectoryFd);
+ syncParentDirectory();
}
private void restore() throws IOException {
if (!mBackupDirectory.exists()) {
return;
}
- if (mBackupDirectoryFd == -1) {
- mBackupDirectoryFd = getDirectoryFd(mBackupDirectory.getCanonicalPath());
- }
+
if (mBaseDirectory.exists()) {
deleteDirectory(mBaseDirectory);
}
if (!mBackupDirectory.renameTo(mBaseDirectory)) {
- throw new IOException("Couldn't restore " + mBackupDirectory
- + " to " + mBaseDirectory);
+ throw new IOException("Failed to restore " + mBackupDirectory + " to "
+ + mBaseDirectory);
}
- mBaseDirectoryFd = mBackupDirectoryFd;
- mBackupDirectoryFd = -1;
- fsyncDirectoryFd(mBaseDirectoryFd);
+ syncParentDirectory();
}
- private static void deleteDirectory(@NonNull File file) {
- final File[] children = file.listFiles();
- if (children != null) {
- for (File child : children) {
- deleteDirectory(child);
- }
- }
- file.delete();
+ private static boolean deleteDirectory(@NonNull File directory) {
+ return FileUtils.deleteContentsAndDir(directory);
}
- private static native int getDirectoryFd(String path);
- private static native void fsyncDirectoryFd(int fd);
+ private void syncParentDirectory() {
+ syncDirectory(mBaseDirectory.getParentFile());
+ }
+
+ // Standard Java IO doesn't allow opening a directory (will throw a FileNotFoundException
+ // instead), so we have to do it manually.
+ private static void syncDirectory(@NonNull File directory) {
+ String path = directory.getAbsolutePath();
+ FileDescriptor fd;
+ try {
+ fd = Os.open(path, OsConstants.O_RDONLY, 0);
+ } catch (ErrnoException e) {
+ Log.e(LOG_TAG, "Failed to open " + path, e);
+ return;
+ }
+ try {
+ Os.fsync(fd);
+ } catch (ErrnoException e) {
+ Log.e(LOG_TAG, "Failed to fsync " + path, e);
+ } finally {
+ FileUtils.closeQuietly(fd);
+ }
+ }
}
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index a54247572b80..fb68bc762245 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -195,7 +195,6 @@ cc_library_shared {
"android_content_res_ObbScanner.cpp",
"android_content_res_Configuration.cpp",
"android_security_Scrypt.cpp",
- "com_android_internal_os_AtomicDirectory.cpp",
"com_android_internal_os_ClassLoaderFactory.cpp",
"com_android_internal_os_FuseAppLoop.cpp",
"com_android_internal_os_Zygote.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 533f403034a9..a3fd915c29b2 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -227,7 +227,6 @@ extern int register_android_content_res_Configuration(JNIEnv* env);
extern int register_android_animation_PropertyValuesHolder(JNIEnv *env);
extern int register_android_security_Scrypt(JNIEnv *env);
extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env);
-extern int register_com_android_internal_os_AtomicDirectory(JNIEnv *env);
extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
extern int register_com_android_internal_os_Zygote(JNIEnv *env);
@@ -1602,7 +1601,6 @@ static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_animation_PropertyValuesHolder),
REG_JNI(register_android_security_Scrypt),
REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
- REG_JNI(register_com_android_internal_os_AtomicDirectory),
REG_JNI(register_com_android_internal_os_FuseAppLoop),
};
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 78e8e1322db2..18a1b43d3f5f 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -237,10 +237,6 @@ Bitmap& toBitmap(jlong bitmapHandle) {
}
void imageInfo(JNIEnv* env, jobject bitmap, AndroidBitmapInfo* info) {
- SkASSERT(info);
- SkASSERT(env);
- SkASSERT(bitmap);
- SkASSERT(env->IsInstanceOf(bitmap, gBitmap_class));
jlong bitmapHandle = env->GetLongField(bitmap, gBitmap_nativePtr);
LocalScopedBitmap localBitmap(bitmapHandle);
@@ -262,6 +258,9 @@ void imageInfo(JNIEnv* env, jobject bitmap, AndroidBitmapInfo* info) {
case kAlpha_8_SkColorType:
info->format = ANDROID_BITMAP_FORMAT_A_8;
break;
+ case kRGBA_F16_SkColorType:
+ info->format = ANDROID_BITMAP_FORMAT_RGBA_F16;
+ break;
default:
info->format = ANDROID_BITMAP_FORMAT_NONE;
break;
diff --git a/core/jni/com_android_internal_os_AtomicDirectory.cpp b/core/jni/com_android_internal_os_AtomicDirectory.cpp
deleted file mode 100644
index 76b0fc167264..000000000000
--- a/core/jni/com_android_internal_os_AtomicDirectory.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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 <nativehelper/ScopedUtfChars.h>
-#include "jni.h"
-
-#include "core_jni_helpers.h"
-
-namespace android {
-
-static jint com_android_internal_os_AtomicDirectory_getDirectoryFd(JNIEnv* env,
- jobject /*clazz*/, jstring path) {
- ScopedUtfChars path8(env, path);
- if (path8.c_str() == NULL) {
- ALOGE("Invalid path: %s", path8.c_str());
- return -1;
- }
- int fd;
- if ((fd = TEMP_FAILURE_RETRY(open(path8.c_str(), O_DIRECTORY | O_RDONLY | O_CLOEXEC))) == -1) {
- ALOGE("Cannot open directory %s, error: %s\n", path8.c_str(), strerror(errno));
- return -1;
- }
- return fd;
-}
-
-static void com_android_internal_os_AtomicDirectory_fsyncDirectoryFd(JNIEnv* env,
- jobject /*clazz*/, jint fd) {
- if (TEMP_FAILURE_RETRY(fsync(fd)) == -1) {
- ALOGE("Cannot fsync directory %d, error: %s\n", fd, strerror(errno));
- }
-}
-
-/*
- * JNI registration.
- */
-static const JNINativeMethod gRegisterMethods[] = {
- /* name, signature, funcPtr */
- { "fsyncDirectoryFd",
- "(I)V",
- (void*) com_android_internal_os_AtomicDirectory_fsyncDirectoryFd
- },
- { "getDirectoryFd",
- "(Ljava/lang/String;)I",
- (void*) com_android_internal_os_AtomicDirectory_getDirectoryFd
- },
-};
-
-int register_com_android_internal_os_AtomicDirectory(JNIEnv* env) {
- return RegisterMethodsOrDie(env, "com/android/internal/os/AtomicDirectory",
- gRegisterMethods, NELEM(gRegisterMethods));
-}
-
-}; // namespace android
diff --git a/core/proto/android/server/activitymanagerservice.proto b/core/proto/android/server/activitymanagerservice.proto
index 7fb6f98ab662..a1ff9b94123f 100644
--- a/core/proto/android/server/activitymanagerservice.proto
+++ b/core/proto/android/server/activitymanagerservice.proto
@@ -261,6 +261,8 @@ message MemInfoDumpProto {
// The dirty the pages that have been swapped out, proportional.
int32 dirty_swap_pss_kb = 9;
}
+ // The rss set size for the heap.
+ optional int32 total_rss_kb = 10;
}
message HeapInfo {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -294,6 +296,12 @@ message MemInfoDumpProto {
int32 total_swap_pss = 8;
int32 total_swap_kb = 9;
}
+ optional int32 java_heap_rss_kb = 10;
+ optional int32 native_heap_rss_kb = 11;
+ optional int32 code_rss_kb = 12;
+ optional int32 stack_rss_kb = 13;
+ optional int32 graphics_rss_kb = 14;
+ optional int32 unknown_rss_kb = 15;
}
optional AppSummary app_summary = 9;
}
@@ -359,10 +367,16 @@ message MemInfoDumpProto {
optional int32 id = 3;
optional bool is_proc = 4;
optional bool has_activities = 5;
- optional int64 pss_kb = 6;
+ oneof ss_kb {
+ int64 pss_kb = 6;
+ int64 rss_kb = 9;
+ }
optional int64 swap_pss_kb = 7;
repeated MemItem sub_items = 8;
}
+ repeated MemItem total_rss_by_process = 29;
+ repeated MemItem total_rss_by_oom_adjustment = 30;
+ repeated MemItem total_rss_by_category = 31;
repeated MemItem total_pss_by_process = 5;
repeated MemItem total_pss_by_oom_adjustment = 6;
repeated MemItem total_pss_by_category = 7;
@@ -414,6 +428,8 @@ message MemInfoDumpProto {
optional bool is_low_ram_device = 27;
optional bool is_high_end_gfx = 28;
+
+ // Next Tag: 32
}
message StickyBroadcastProto {
diff --git a/core/proto/android/stats/otaupdate/updateengine_enums.proto b/core/proto/android/stats/otaupdate/updateengine_enums.proto
new file mode 100644
index 000000000000..a6e9919ba606
--- /dev/null
+++ b/core/proto/android/stats/otaupdate/updateengine_enums.proto
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+package android.stats.otaupdate;
+
+// The payload type of an OTA update attempt on A/B devices.
+enum PayloadType {
+ FULL = 10000;
+ DELTA = 10001;
+}
+
+// The attempt result reported by the update engine for an OTA update.
+enum AttemptResult {
+ UPDATE_SUCCEEDED = 10000;
+ INTERNAL_ERROR = 10001;
+ PAYLOAD_DOWNLOAD_ERROR = 10002;
+ METADATA_MALFORMED = 10003;
+ OPERATION_MALFORMED = 10004;
+ OPERATION_EXECUTION_ERROR = 10005;
+ METADATA_VERIFICATION_FAILED = 10006;
+ PAYLOAD_VERIFICATION_FAILED = 10007;
+ VERIFICATION_FAILED = 10008;
+ POSTINSTALL_FAILED = 10009;
+ ABNORMAL_TERMINATION = 10010;
+ UPDATE_CANCELED = 10011;
+ UPDATE_SUCCEEDED_NOT_ACTIVE = 10012;
+}
+
+// The error code reported by the update engine after an OTA update attempt
+// on A/B devices. More details in system/update_engine/common/error_code.h
+enum ErrorCode {
+ SUCCESS = 10000;
+ ERROR = 10001;
+ FILESYSTEM_COPIER_ERROR = 10004;
+ POST_INSTALL_RUNNER_ERROR = 10005;
+ PAYLOAD_MISMATCHED_TYPE_ERROR = 10006;
+ INSTALL_DEVICE_OPEN_ERROR = 10007;
+ KERNEL_DEVICE_OPEN_ERROR = 10008;
+ DOWNLOAD_TRANSFER_ERROR = 10009;
+ PAYLOAD_HASH_MISMATCH_ERROR = 10010;
+ PAYLOAD_SIZE_MISMATCH_ERROR = 10011;
+ DOWNLOAD_PAYLOAD_VERIFICATION_ERROR = 10012;
+ DOWNLOAD_NEW_PARTITION_INFO_ERROR = 10013;
+ DOWNLOAD_WRITE_ERROR = 10014;
+ NEW_ROOTFS_VERIFICATION_ERROR = 10015;
+ SIGNED_DELTA_PAYLOAD_EXPECTED_ERROR = 10017;
+ DOWNLOAD_PAYLOAD_PUB_KEY_VERIFICATION_ERROR = 10018;
+ DOWNLOAD_STATE_INITIALIZATION_ERROR = 10020;
+ DOWNLOAD_INVALID_METADATA_MAGIC_STRING = 10021;
+ DOWNLOAD_SIGNATURE_MISSING_IN_MANIFEST = 10022;
+ DOWNLOAD_MANIFEST_PARSE_ERROR = 10023;
+ DOWNLOAD_METADATA_SIGNATURE_ERROR = 10024;
+ DOWNLOAD_METADATA_SIGNATURE_VERIFICATION_ERROR = 10025;
+ DOWNLOAD_METADATA_SIGNATURE_MISMATCH = 10026;
+ DOWNLOAD_OPERATION_HASH_VERIFICATION_ERROR = 10027;
+ DOWNLOAD_OPERATION_EXECUTION_ERROR = 10028;
+ DOWNLOAD_OPERATION_HASH_MISMATCH = 10029;
+ DOWNLOAD_INVALID_METADATA_SIZE = 10032;
+ DOWNLOAD_INVALID_METADATA_SIGNATURE = 10033;
+ DOWNLOAD_OPERATION_HASH_MISSING_ERROR = 10038;
+ DOWNLOAD_METADATA_SIGNATURE_MISSING_ERROR = 10039;
+ UNSUPPORTED_MAJOR_PAYLOAD_VERSION = 10044;
+ UNSUPPORTED_MINOR_PAYLOAD_VERSION = 10045;
+ FILESYSTEM_VERIFIER_ERROR = 10047;
+ USER_CANCELED = 10048;
+ PAYLOAD_TIMESTAMP_ERROR = 10051;
+ UPDATED_BUT_NOT_ACTIVE = 10052;
+}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 89ba3df287b4..bdbf36881741 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -35,6 +35,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.lang.reflect.Field;
+import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@@ -625,7 +626,6 @@ public class SettingsBackupTest {
Settings.Secure.DIALER_DEFAULT_APPLICATION,
Settings.Secure.DISABLED_PRINT_SERVICES,
Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
- Settings.Secure.DISPLAY_DENSITY_FORCED,
Settings.Secure.DOCKED_CLOCK_FACE,
Settings.Secure.DOZE_PULSE_ON_LONG_PRESS,
Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION,
@@ -742,9 +742,12 @@ public class SettingsBackupTest {
@Test
public void secureSettingsBackedUpOrBlacklisted() {
+ HashSet<String> keys = new HashSet<String>();
+ Collections.addAll(keys, Settings.Secure.SETTINGS_TO_BACKUP);
+ Collections.addAll(keys, Settings.Secure.DEVICE_SPECIFIC_SETTINGS_TO_BACKUP);
checkSettingsBackedUpOrBlacklisted(
getCandidateSettings(Settings.Secure.class),
- newHashSet(Settings.Secure.SETTINGS_TO_BACKUP),
+ keys,
BACKUP_BLACKLISTED_SECURE_SETTINGS);
}
@@ -758,9 +761,9 @@ public class SettingsBackupTest {
is(empty()));
assertThat(
- "blacklisted settings backed up",
- intersect(settingsToBackup, blacklist),
- is(empty()));
+ "blacklisted settings backed up",
+ intersect(settingsToBackup, blacklist),
+ is(empty()));
}
private static Set<String> getCandidateSettings(Class<? extends Settings.NameValueTable> clazz) {
diff --git a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
index 8081e9e6c67b..eea8c83e036b 100644
--- a/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsValidatorsTest.java
@@ -255,6 +255,55 @@ public class SettingsValidatorsTest {
}
@Test
+ public void testTTSListValidator_withValidInput_returnsTrue() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertTrue(v.validate("com.foo.ttsengine:en-US,com.bar.ttsengine:es_ES"));
+ }
+
+ @Test
+ public void testTTSListValidator_withInvalidInput_returnsFalse() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertFalse(v.validate("com.foo.ttsengine:eng-USA,INVALID"));
+ }
+
+ @Test
+ public void testTTSListValidator_withEmptyInput_returnsFalse() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertFalse(v.validate(""));
+ }
+
+ @Test
+ public void testTTSListValidator_withNullInput_returnsFalse() {
+ Validator v = new SettingsValidators.TTSListValidator();
+
+ assertFalse(v.validate(null));
+ }
+
+ @Test
+ public void testTileListValidator_withValidInput_returnsTrue() {
+ Validator v = new SettingsValidators.TileListValidator();
+
+ assertTrue(v.validate("1,2,3,4"));
+ }
+
+ @Test
+ public void testTileListValidator_withMissingValue_returnsFalse() {
+ Validator v = new SettingsValidators.TileListValidator();
+
+ assertFalse(v.validate("1,,3"));
+ }
+
+ @Test
+ public void testTileListValidator_withNullInput_returnsFalse() {
+ Validator v = new SettingsValidators.TileListValidator();
+
+ assertFalse(v.validate(null));
+ }
+
+ @Test
public void ensureAllBackedUpGlobalSettingsHaveValidators() {
String offenders = getOffenders(concat(Settings.Global.SETTINGS_TO_BACKUP,
Settings.Global.LEGACY_RESTORE_SETTINGS), Settings.Global.VALIDATORS);
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 1b4867efbc58..226c26900d17 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -86,6 +86,7 @@ applications that come with the platform
</privapp-permissions>
<privapp-permissions package="com.android.mtp">
+ <permission name="android.permission.ACCESS_MTP"/>
<permission name="android.permission.MANAGE_USB"/>
</privapp-permissions>
@@ -192,7 +193,6 @@ applications that come with the platform
</privapp-permissions>
<privapp-permissions package="com.android.providers.media">
- <permission name="android.permission.ACCESS_MTP"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.USE_RESERVED_DISK"/>
diff --git a/libs/hostgraphics/Android.bp b/libs/hostgraphics/Android.bp
index aedb7522ab08..e713b98b867e 100644
--- a/libs/hostgraphics/Android.bp
+++ b/libs/hostgraphics/Android.bp
@@ -1,8 +1,15 @@
cc_library_host_static {
name: "libhostgraphics",
+ cflags: [
+ "-Wno-unused-parameter",
+ ],
+
srcs: [
":libui_host_common",
+ "Fence.cpp",
+ "HostBufferQueue.cpp",
+ "PublicFormat.cpp",
],
include_dirs: [
diff --git a/libs/hostgraphics/Fence.cpp b/libs/hostgraphics/Fence.cpp
new file mode 100644
index 000000000000..9e54816651c4
--- /dev/null
+++ b/libs/hostgraphics/Fence.cpp
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ui/Fence.h>
+
+namespace android {
+
+const sp<Fence> Fence::NO_FENCE = sp<Fence>(new Fence);
+
+} // namespace android \ No newline at end of file
diff --git a/libs/hostgraphics/HostBufferQueue.cpp b/libs/hostgraphics/HostBufferQueue.cpp
new file mode 100644
index 000000000000..ec304378c6c4
--- /dev/null
+++ b/libs/hostgraphics/HostBufferQueue.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gui/BufferQueue.h>
+
+namespace android {
+
+class HostBufferQueue : public IGraphicBufferProducer, public IGraphicBufferConsumer {
+public:
+ HostBufferQueue() : mWidth(0), mHeight(0) { }
+
+ virtual status_t setConsumerIsProtected(bool isProtected) { return OK; }
+
+ virtual status_t detachBuffer(int slot) { return OK; }
+
+ virtual status_t getReleasedBuffers(uint64_t* slotMask) { return OK; }
+
+ virtual status_t setDefaultBufferSize(uint32_t w, uint32_t h) {
+ mWidth = w;
+ mHeight = h;
+ mBuffer = sp<GraphicBuffer>(new GraphicBuffer(mWidth, mHeight));
+ return OK;
+ }
+
+ virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat) { return OK; }
+
+ virtual status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace) { return OK; }
+
+ virtual status_t discardFreeBuffers() { return OK; }
+
+ virtual status_t acquireBuffer(BufferItem* buffer, nsecs_t presentWhen,
+ uint64_t maxFrameNumber = 0) {
+ buffer->mGraphicBuffer = mBuffer;
+ buffer->mSlot = 0;
+ return OK;
+ }
+
+ virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) { return OK; }
+
+ virtual status_t setConsumerUsageBits(uint64_t usage) { return OK; }
+private:
+ sp<GraphicBuffer> mBuffer;
+ uint32_t mWidth;
+ uint32_t mHeight;
+};
+
+void BufferQueue::createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
+ sp<IGraphicBufferConsumer>* outConsumer) {
+
+ sp<HostBufferQueue> obj(new HostBufferQueue());
+
+ *outProducer = obj;
+ *outConsumer = obj;
+}
+
+} // namespace android
diff --git a/libs/hostgraphics/PublicFormat.cpp b/libs/hostgraphics/PublicFormat.cpp
new file mode 100644
index 000000000000..af6d2738c801
--- /dev/null
+++ b/libs/hostgraphics/PublicFormat.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <ui/PublicFormat.h>
+
+namespace android {
+
+android_dataspace mapPublicFormatToHalDataspace(PublicFormat f) {
+ return static_cast<android_dataspace>(0);
+}
+
+int mapPublicFormatToHalFormat(PublicFormat f) {
+ return static_cast<int>(f);
+}
+
+PublicFormat mapHalFormatDataspaceToPublicFormat(int format, android_dataspace dataSpace) {
+ return static_cast<PublicFormat>(format);
+}
+
+} // namespace android \ No newline at end of file
diff --git a/libs/hostgraphics/gui/BufferItem.h b/libs/hostgraphics/gui/BufferItem.h
new file mode 100644
index 000000000000..01409e19c715
--- /dev/null
+++ b/libs/hostgraphics/gui/BufferItem.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_GUI_BUFFERITEM_H
+#define ANDROID_GUI_BUFFERITEM_H
+
+#include <ui/Fence.h>
+#include <ui/Rect.h>
+
+#include <system/graphics.h>
+
+#include <utils/StrongPointer.h>
+
+namespace android {
+
+class Fence;
+class GraphicBuffer;
+
+// The only thing we need here for layoutlib is mGraphicBuffer. The rest of the fields are added
+// just to satisfy the calls from the android_media_ImageReader.h
+
+class BufferItem {
+public:
+ enum { INVALID_BUFFER_SLOT = -1 };
+
+ BufferItem() : mGraphicBuffer(nullptr), mFence(Fence::NO_FENCE) {}
+ ~BufferItem() {}
+
+ sp<GraphicBuffer> mGraphicBuffer;
+
+ sp<Fence> mFence;
+
+ Rect mCrop;
+
+ uint32_t mTransform;
+
+ uint32_t mScalingMode;
+
+ int64_t mTimestamp;
+
+ android_dataspace mDataSpace;
+
+ uint64_t mFrameNumber;
+
+ int mSlot;
+
+ bool mTransformToDisplayInverse;
+};
+
+}
+
+#endif // ANDROID_GUI_BUFFERITEM_H
diff --git a/libs/hostgraphics/gui/BufferItemConsumer.h b/libs/hostgraphics/gui/BufferItemConsumer.h
new file mode 100644
index 000000000000..707b313eb102
--- /dev/null
+++ b/libs/hostgraphics/gui/BufferItemConsumer.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_GUI_BUFFERITEMCONSUMER_H
+#define ANDROID_GUI_BUFFERITEMCONSUMER_H
+
+#include <utils/RefBase.h>
+
+#include <gui/ConsumerBase.h>
+#include <gui/IGraphicBufferConsumer.h>
+
+namespace android {
+
+class BufferItemConsumer : public ConsumerBase {
+public:
+ BufferItemConsumer(
+ const sp<IGraphicBufferConsumer>& consumer,
+ uint64_t consumerUsage,
+ int bufferCount,
+ bool controlledByApp) : mConsumer(consumer) {
+ }
+
+ status_t acquireBuffer(BufferItem *item, nsecs_t presentWhen, bool waitForFence = true) {
+ return mConsumer->acquireBuffer(item, presentWhen, 0);
+ }
+
+ status_t releaseBuffer(
+ const BufferItem &item, const sp<Fence>& releaseFence = Fence::NO_FENCE) { return OK; }
+
+ void setName(const String8& name) { }
+
+ void setFrameAvailableListener(const wp<FrameAvailableListener>& listener) { }
+
+ status_t setDefaultBufferSize(uint32_t width, uint32_t height) {
+ return mConsumer->setDefaultBufferSize(width, height);
+ }
+
+ status_t setDefaultBufferFormat(PixelFormat defaultFormat) {
+ return mConsumer->setDefaultBufferFormat(defaultFormat);
+ }
+
+ status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace) {
+ return mConsumer->setDefaultBufferDataSpace(defaultDataSpace);
+ }
+
+ void abandon() { }
+
+ status_t detachBuffer(int slot) { return OK; }
+
+ status_t discardFreeBuffers() { return OK; }
+
+ void freeBufferLocked(int slotIndex) { }
+
+ status_t addReleaseFenceLocked(
+ int slot, const sp<GraphicBuffer> graphicBuffer, const sp<Fence>& fence) { return OK; }
+private:
+ sp<IGraphicBufferConsumer> mConsumer;
+};
+
+} // namespace android
+
+#endif // ANDROID_GUI_BUFFERITEMCONSUMER_H
diff --git a/libs/hostgraphics/gui/BufferQueue.h b/libs/hostgraphics/gui/BufferQueue.h
new file mode 100644
index 000000000000..aa3e7268e11c
--- /dev/null
+++ b/libs/hostgraphics/gui/BufferQueue.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_GUI_BUFFERQUEUE_H
+#define ANDROID_GUI_BUFFERQUEUE_H
+
+#include <gui/BufferItem.h>
+#include <gui/IGraphicBufferConsumer.h>
+#include <gui/IGraphicBufferProducer.h>
+
+namespace android {
+
+class BufferQueue {
+public:
+ enum { INVALID_BUFFER_SLOT = BufferItem::INVALID_BUFFER_SLOT };
+ enum { NO_BUFFER_AVAILABLE = IGraphicBufferConsumer::NO_BUFFER_AVAILABLE };
+
+ static void createBufferQueue(sp<IGraphicBufferProducer>* outProducer,
+ sp<IGraphicBufferConsumer>* outConsumer);
+};
+
+} // namespace android
+
+#endif // ANDROID_GUI_BUFFERQUEUE_H
diff --git a/libs/hostgraphics/gui/ConsumerBase.h b/libs/hostgraphics/gui/ConsumerBase.h
new file mode 100644
index 000000000000..9002953c0848
--- /dev/null
+++ b/libs/hostgraphics/gui/ConsumerBase.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_GUI_CONSUMERBASE_H
+#define ANDROID_GUI_CONSUMERBASE_H
+
+#include <gui/BufferItem.h>
+
+#include <utils/RefBase.h>
+
+namespace android {
+
+class ConsumerBase : public virtual RefBase {
+public:
+ struct FrameAvailableListener : public virtual RefBase {
+ // See IConsumerListener::onFrame{Available,Replaced}
+ virtual void onFrameAvailable(const BufferItem& item) = 0;
+ virtual void onFrameReplaced(const BufferItem& /* item */) {}
+ };
+};
+
+} // namespace android
+
+#endif // ANDROID_GUI_CONSUMERBASE_H \ No newline at end of file
diff --git a/libs/hostgraphics/gui/IGraphicBufferConsumer.h b/libs/hostgraphics/gui/IGraphicBufferConsumer.h
new file mode 100644
index 000000000000..9eb67b218800
--- /dev/null
+++ b/libs/hostgraphics/gui/IGraphicBufferConsumer.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <utils/RefBase.h>
+
+#include <ui/PixelFormat.h>
+
+#include <utils/Errors.h>
+
+namespace android {
+
+class BufferItem;
+class Fence;
+class GraphicBuffer;
+
+class IGraphicBufferConsumer : virtual public RefBase {
+public:
+ enum {
+ // Returned by releaseBuffer, after which the consumer must free any references to the
+ // just-released buffer that it might have.
+ STALE_BUFFER_SLOT = 1,
+ // Returned by dequeueBuffer if there are no pending buffers available.
+ NO_BUFFER_AVAILABLE,
+ // Returned by dequeueBuffer if it's too early for the buffer to be acquired.
+ PRESENT_LATER,
+ };
+
+ virtual status_t acquireBuffer(BufferItem* buffer, nsecs_t presentWhen,
+ uint64_t maxFrameNumber = 0) = 0;
+
+ virtual status_t detachBuffer(int slot) = 0;
+
+ virtual status_t getReleasedBuffers(uint64_t* slotMask) = 0;
+
+ virtual status_t setDefaultBufferSize(uint32_t w, uint32_t h) = 0;
+
+ virtual status_t setMaxAcquiredBufferCount(int maxAcquiredBuffers) = 0;
+
+ virtual status_t setDefaultBufferFormat(PixelFormat defaultFormat) = 0;
+
+ virtual status_t setDefaultBufferDataSpace(android_dataspace defaultDataSpace) = 0;
+
+ virtual status_t setConsumerUsageBits(uint64_t usage) = 0;
+
+ virtual status_t setConsumerIsProtected(bool isProtected) = 0;
+
+ virtual status_t discardFreeBuffers() = 0;
+};
+
+} // namespace android \ No newline at end of file
diff --git a/libs/hostgraphics/gui/IGraphicBufferProducer.h b/libs/hostgraphics/gui/IGraphicBufferProducer.h
index 00422136ff76..a1efd0bcfa4c 100644
--- a/libs/hostgraphics/gui/IGraphicBufferProducer.h
+++ b/libs/hostgraphics/gui/IGraphicBufferProducer.h
@@ -19,6 +19,8 @@
#include <utils/RefBase.h>
+#include <ui/GraphicBuffer.h>
+
namespace android {
class IGraphicBufferProducer : virtual public RefBase {
diff --git a/libs/hostgraphics/ui/Fence.h b/libs/hostgraphics/ui/Fence.h
new file mode 100644
index 000000000000..04d535c3a211
--- /dev/null
+++ b/libs/hostgraphics/ui/Fence.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_FENCE_H
+#define ANDROID_FENCE_H
+
+#include <utils/String8.h>
+#include <utils/RefBase.h>
+
+typedef int64_t nsecs_t;
+
+namespace android {
+
+class Fence : public LightRefBase<Fence> {
+public:
+ Fence() { }
+ Fence(int) { }
+ static const sp<Fence> NO_FENCE;
+ static constexpr nsecs_t SIGNAL_TIME_PENDING = INT64_MAX;
+ static constexpr nsecs_t SIGNAL_TIME_INVALID = -1;
+ static sp<Fence> merge(const char* name, const sp<Fence>& f1, const sp<Fence>& f2) {
+ return NO_FENCE;
+ }
+
+ static sp<Fence> merge(const String8& name, const sp<Fence>& f1, const sp<Fence>& f2) {
+ return NO_FENCE;
+ }
+
+ enum class Status {
+ Invalid, // Fence is invalid
+ Unsignaled, // Fence is valid but has not yet signaled
+ Signaled, // Fence is valid and has signaled
+ };
+
+ status_t wait(int timeout) { return OK; }
+
+ status_t waitForever(const char* logname) { return OK; }
+
+ int dup() const { return 0; }
+
+ inline Status getStatus() {
+ // The sync_wait call underlying wait() has been measured to be
+ // significantly faster than the sync_fence_info call underlying
+ // getSignalTime(), which might otherwise appear to be the more obvious
+ // way to check whether a fence has signaled.
+ switch (wait(0)) {
+ case NO_ERROR:
+ return Status::Signaled;
+ case -ETIME:
+ return Status::Unsignaled;
+ default:
+ return Status::Invalid;
+ }
+ }
+};
+
+} // namespace android
+
+#endif // ANDROID_FENCE_H
diff --git a/libs/hostgraphics/ui/GraphicBuffer.h b/libs/hostgraphics/ui/GraphicBuffer.h
new file mode 100644
index 000000000000..ac88e44dbc65
--- /dev/null
+++ b/libs/hostgraphics/ui/GraphicBuffer.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_GRAPHIC_BUFFER_H
+#define ANDROID_GRAPHIC_BUFFER_H
+
+#include <stdint.h>
+#include <sys/types.h>
+
+#include <vector>
+
+#include <ui/PixelFormat.h>
+#include <ui/Rect.h>
+
+#include <utils/RefBase.h>
+
+namespace android {
+
+class GraphicBuffer : virtual public RefBase {
+public:
+ GraphicBuffer(uint32_t w, uint32_t h):width(w),height(h) {
+ data.resize(w*h);
+ }
+ uint32_t getWidth() const { return static_cast<uint32_t>(width); }
+ uint32_t getHeight() const { return static_cast<uint32_t>(height); }
+ uint32_t getStride() const { return static_cast<uint32_t>(width); }
+ uint64_t getUsage() const { return 0; }
+ PixelFormat getPixelFormat() const { return PIXEL_FORMAT_RGBA_8888; }
+ //uint32_t getLayerCount() const { return static_cast<uint32_t>(layerCount); }
+ Rect getBounds() const { return Rect(width, height); }
+
+ status_t lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,
+ android_ycbcr *ycbcr, int fenceFd) { return OK; }
+
+ status_t lockAsync(uint32_t inUsage, const Rect& rect, void** vaddr, int fenceFd,
+ int32_t* outBytesPerPixel = nullptr, int32_t* outBytesPerStride = nullptr) {
+ *vaddr = data.data();
+ return OK;
+ }
+
+ status_t unlockAsync(int *fenceFd) { return OK; }
+
+private:
+ uint32_t width;
+ uint32_t height;
+ std::vector<uint32_t> data;
+};
+
+}; // namespace android
+
+#endif // ANDROID_GRAPHIC_BUFFER_H
diff --git a/location/lib/Android.bp b/location/lib/Android.bp
index 16f1428d2ee2..ab01ddbe4e60 100644
--- a/location/lib/Android.bp
+++ b/location/lib/Android.bp
@@ -21,7 +21,7 @@ java_sdk_library {
"androidx.annotation_annotation",
],
api_packages: ["com.android.location.provider"],
- srcs_lib: "framework",
+ srcs_lib: "framework-minus-apex",
srcs_lib_whitelist_dirs: ["location/java"],
srcs_lib_whitelist_pkgs: ["com.android.internal.location"],
}
diff --git a/media/java/android/media/Metadata.java b/media/java/android/media/Metadata.java
index 792a2ba678fd..be0d966fa075 100644
--- a/media/java/android/media/Metadata.java
+++ b/media/java/android/media/Metadata.java
@@ -272,6 +272,15 @@ import java.util.TimeZone;
@UnsupportedAppUsage
public Metadata() { }
+ // Have to declare protected for finalize() since it is protected
+ // in the base class Object.
+ @Override
+ protected void finalize() throws Throwable {
+ if (mParcel != null) {
+ mParcel.recycle();
+ }
+ }
+
/**
* Go over all the records, collecting metadata keys and records'
* type field offset in the Parcel. These are stored in
@@ -418,6 +427,10 @@ import java.util.TimeZone;
parcel.setDataPosition(pin);
return false;
}
+
+ if (mParcel != null) {
+ mParcel.recycle();
+ }
mParcel = parcel;
return true;
}
diff --git a/media/lib/signer/Android.bp b/media/lib/signer/Android.bp
index 44f8725ec6f5..f320397bc84b 100644
--- a/media/lib/signer/Android.bp
+++ b/media/lib/signer/Android.bp
@@ -18,7 +18,7 @@ java_sdk_library {
name: "com.android.mediadrm.signer",
srcs: ["java/**/*.java"],
api_packages: ["com.android.mediadrm.signer"],
- srcs_lib: "framework",
+ srcs_lib: "framework-minus-apex",
srcs_lib_whitelist_dirs: ["media/java"],
srcs_lib_whitelist_pkgs: ["android.media"],
}
diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp
index 1c97fc37cf50..e54b847f167d 100644
--- a/packages/SettingsProvider/Android.bp
+++ b/packages/SettingsProvider/Android.bp
@@ -9,7 +9,10 @@ android_app {
"telephony-common",
"ims-common",
],
- static_libs: ["junit"],
+ static_libs: [
+ "junit",
+ "SettingsLib",
+ ],
platform_apis: true,
certificate: "platform",
privileged: true,
@@ -21,11 +24,18 @@ android_test {
// because this test is not an instrumentation test. (because the target runs in the system process.)
srcs: [
"test/**/*.java",
+ "src/com/android/providers/settings/SettingsBackupAgent.java",
"src/com/android/providers/settings/SettingsState.java",
"src/com/android/providers/settings/SettingsHelper.java",
],
- static_libs: ["androidx.test.rules"],
- libs: ["android.test.base"],
+ static_libs: [
+ "androidx.test.rules",
+ "SettingsLib",
+ ],
+ libs: [
+ "android.test.base",
+ "android.test.mock",
+ ],
resource_dirs: ["res"],
aaptflags: [
"--auto-add-overlay",
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index 7d56868d0ce8..2286f4c80a81 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -39,9 +39,13 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.BackupUtils;
import android.util.Log;
+import android.util.Slog;
+import android.view.Display;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.widget.LockPatternUtils;
+import com.android.settingslib.display.DisplayDensityUtils;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
@@ -52,11 +56,14 @@ import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.time.DateTimeException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.zip.CRC32;
/**
@@ -78,10 +85,11 @@ public class SettingsBackupAgent extends BackupAgentHelper {
private static final String KEY_SOFTAP_CONFIG = "softap_config";
private static final String KEY_NETWORK_POLICIES = "network_policies";
private static final String KEY_WIFI_NEW_CONFIG = "wifi_new_config";
+ private static final String KEY_DEVICE_SPECIFIC_CONFIG = "device_specific_config";
// Versioning of the state file. Increment this version
// number any time the set of state items is altered.
- private static final int STATE_VERSION = 7;
+ private static final int STATE_VERSION = 8;
// Versioning of the Network Policies backup payload.
private static final int NETWORK_POLICIES_BACKUP_VERSION = 1;
@@ -99,8 +107,9 @@ public class SettingsBackupAgent extends BackupAgentHelper {
private static final int STATE_SOFTAP_CONFIG = 7;
private static final int STATE_NETWORK_POLICIES = 8;
private static final int STATE_WIFI_NEW_CONFIG = 9;
+ private static final int STATE_DEVICE_CONFIG = 10;
- private static final int STATE_SIZE = 10; // The current number of state items
+ private static final int STATE_SIZE = 11; // The current number of state items
// Number of entries in the checksum array at various version numbers
private static final int STATE_SIZES[] = {
@@ -111,17 +120,19 @@ public class SettingsBackupAgent extends BackupAgentHelper {
7, // version 4 added STATE_LOCK_SETTINGS
8, // version 5 added STATE_SOFTAP_CONFIG
9, // version 6 added STATE_NETWORK_POLICIES
- STATE_SIZE // version 7 added STATE_WIFI_NEW_CONFIG
+ 10, // version 7 added STATE_WIFI_NEW_CONFIG
+ STATE_SIZE // version 8 added STATE_DEVICE_CONFIG
};
- // Versioning of the 'full backup' format
- // Increment this version any time a new item is added
- private static final int FULL_BACKUP_VERSION = 6;
private static final int FULL_BACKUP_ADDED_GLOBAL = 2; // added the "global" entry
private static final int FULL_BACKUP_ADDED_LOCK_SETTINGS = 3; // added the "lock_settings" entry
private static final int FULL_BACKUP_ADDED_SOFTAP_CONF = 4; //added the "softap_config" entry
private static final int FULL_BACKUP_ADDED_NETWORK_POLICIES = 5; //added "network_policies"
private static final int FULL_BACKUP_ADDED_WIFI_NEW = 6; // added "wifi_new_config" entry
+ private static final int FULL_BACKUP_ADDED_DEVICE_SPECIFIC = 7; // added "device specific" entry
+ // Versioning of the 'full backup' format
+ // Increment this version any time a new item is added
+ private static final int FULL_BACKUP_VERSION = FULL_BACKUP_ADDED_DEVICE_SPECIFIC;
private static final int INTEGER_BYTE_COUNT = Integer.SIZE / Byte.SIZE;
@@ -129,11 +140,17 @@ public class SettingsBackupAgent extends BackupAgentHelper {
private static final String TAG = "SettingsBackupAgent";
- private static final String[] PROJECTION = {
+ @VisibleForTesting
+ static final String[] PROJECTION = {
Settings.NameValueTable.NAME,
Settings.NameValueTable.VALUE
};
+ // Versioning of the 'device specific' section of a backup
+ // Increment this any time the format is changed or data added.
+ @VisibleForTesting
+ static final int DEVICE_SPECIFIC_VERSION = 1;
+
// the key to store the WIFI data under, should be sorted as last, so restore happens last.
// use very late unicode character to quasi-guarantee last sort position.
private static final String KEY_WIFI_SUPPLICANT = "\uffedWIFI";
@@ -161,7 +178,8 @@ public class SettingsBackupAgent extends BackupAgentHelper {
KEY_GLOBAL,
}));
- private SettingsHelper mSettingsHelper;
+ @VisibleForTesting
+ SettingsHelper mSettingsHelper;
private WifiManager mWifiManager;
@@ -190,6 +208,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
byte[] softApConfigData = getSoftAPConfiguration();
byte[] netPoliciesData = getNetworkPolicies();
byte[] wifiFullConfigData = getNewWifiConfigData();
+ byte[] deviceSpecificInformation = getDeviceSpecificConfiguration();
long[] stateChecksums = readOldChecksums(oldState);
@@ -215,6 +234,9 @@ public class SettingsBackupAgent extends BackupAgentHelper {
stateChecksums[STATE_WIFI_NEW_CONFIG] =
writeIfChanged(stateChecksums[STATE_WIFI_NEW_CONFIG], KEY_WIFI_NEW_CONFIG,
wifiFullConfigData, data);
+ stateChecksums[STATE_DEVICE_CONFIG] =
+ writeIfChanged(stateChecksums[STATE_DEVICE_CONFIG], KEY_DEVICE_SPECIFIC_CONFIG,
+ deviceSpecificInformation, data);
writeNewChecksums(stateChecksums, newState);
}
@@ -313,6 +335,12 @@ public class SettingsBackupAgent extends BackupAgentHelper {
restoreNewWifiConfigData(restoredWifiNewConfigData);
break;
+ case KEY_DEVICE_SPECIFIC_CONFIG:
+ byte[] restoredDeviceSpecificConfig = new byte[size];
+ data.readEntityData(restoredDeviceSpecificConfig, 0, size);
+ restoreDeviceSpecificConfig(restoredDeviceSpecificConfig);
+ break;
+
default :
data.skipEntityData();
@@ -591,6 +619,11 @@ public class SettingsBackupAgent extends BackupAgentHelper {
private void restoreSettings(byte[] settings, int bytes, Uri contentUri,
HashSet<String> movedToGlobal, Set<String> movedToSecure) {
+ restoreSettings(settings, 0, bytes, contentUri, movedToGlobal, movedToSecure);
+ }
+
+ private void restoreSettings(byte[] settings, int pos, int bytes, Uri contentUri,
+ HashSet<String> movedToGlobal, Set<String> movedToSecure) {
if (DEBUG) {
Log.i(TAG, "restoreSettings: " + contentUri);
}
@@ -601,7 +634,8 @@ public class SettingsBackupAgent extends BackupAgentHelper {
Map<String, Validator> validators = null;
if (contentUri.equals(Settings.Secure.CONTENT_URI)) {
whitelist = ArrayUtils.concatElements(String.class, Settings.Secure.SETTINGS_TO_BACKUP,
- Settings.Secure.LEGACY_RESTORE_SETTINGS);
+ Settings.Secure.LEGACY_RESTORE_SETTINGS,
+ Settings.Secure.DEVICE_SPECIFIC_SETTINGS_TO_BACKUP);
validators = Settings.Secure.VALIDATORS;
} else if (contentUri.equals(Settings.System.CONTENT_URI)) {
whitelist = ArrayUtils.concatElements(String.class, Settings.System.SETTINGS_TO_BACKUP,
@@ -616,7 +650,6 @@ public class SettingsBackupAgent extends BackupAgentHelper {
}
// Restore only the white list data.
- int pos = 0;
final ArrayMap<String, String> cachedEntries = new ArrayMap<>();
ContentValues contentValues = new ContentValues(2);
SettingsHelper settingsHelper = mSettingsHelper;
@@ -940,6 +973,150 @@ public class SettingsBackupAgent extends BackupAgentHelper {
}
}
+ @VisibleForTesting
+ byte[] getDeviceSpecificConfiguration() throws IOException {
+ try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+ writeHeader(os);
+ os.write(getDeviceSpecificSettings());
+ return os.toByteArray();
+ }
+ }
+
+ @VisibleForTesting
+ void writeHeader(OutputStream os) throws IOException {
+ os.write(toByteArray(DEVICE_SPECIFIC_VERSION));
+ os.write(toByteArray(Build.MANUFACTURER));
+ os.write(toByteArray(Build.PRODUCT));
+ }
+
+ private byte[] getDeviceSpecificSettings() {
+ try (Cursor cursor =
+ getContentResolver()
+ .query(Settings.Secure.CONTENT_URI, PROJECTION, null, null, null)) {
+ return extractRelevantValues(
+ cursor, Settings.Secure.DEVICE_SPECIFIC_SETTINGS_TO_BACKUP);
+ }
+ }
+
+ /**
+ * Restore the device specific settings.
+ *
+ * @param data The byte array holding a backed up version of another devices settings.
+ * @return true if the restore succeeded, false if it was stopped.
+ */
+ @VisibleForTesting
+ boolean restoreDeviceSpecificConfig(byte[] data) {
+ // We're using an AtomicInteger to wrap the position int and allow called methods to
+ // modify it.
+ AtomicInteger pos = new AtomicInteger(0);
+ if (!isSourceAcceptable(data, pos)) {
+ return false;
+ }
+
+ Integer originalDensity = getPreviousDensity();
+
+ int dataStart = pos.get();
+ restoreSettings(
+ data, dataStart, data.length, Settings.Secure.CONTENT_URI, null, null);
+
+ updateWindowManagerIfNeeded(originalDensity);
+
+ return true;
+ }
+
+ private void updateWindowManagerIfNeeded(Integer previousDensity) {
+ int newDensity;
+ try {
+ newDensity = getForcedDensity();
+ } catch (Settings.SettingNotFoundException e) {
+ // If there's not density setting we can't perform a change.
+ return;
+ }
+
+ if (previousDensity == null || previousDensity != newDensity) {
+ // From nothing to something is a change.
+ DisplayDensityUtils.setForcedDisplayDensity(Display.DEFAULT_DISPLAY, newDensity);
+ }
+ }
+
+ private Integer getPreviousDensity() {
+ try {
+ return getForcedDensity();
+ } catch (Settings.SettingNotFoundException e) {
+ return null;
+ }
+ }
+
+ private int getForcedDensity() throws Settings.SettingNotFoundException {
+ return Settings.Secure.getInt(getContentResolver(), Settings.Secure.DISPLAY_DENSITY_FORCED);
+ }
+
+ @VisibleForTesting
+ boolean isSourceAcceptable(byte[] data, AtomicInteger pos) {
+ int version = readInt(data, pos);
+ if (version > DEVICE_SPECIFIC_VERSION) {
+ Slog.w(TAG, "Unable to restore device specific information; Backup is too new");
+ return false;
+ }
+
+ String sourceManufacturer = readString(data, pos);
+ if (!Objects.equals(Build.MANUFACTURER, sourceManufacturer)) {
+ Log.w(
+ TAG,
+ "Unable to restore device specific information; Manufacturer mismatch "
+ + "(\'"
+ + Build.MANUFACTURER
+ + "\' and \'"
+ + sourceManufacturer
+ + "\')");
+ return false;
+ }
+
+ String sourceProduct = readString(data, pos);
+ if (!Objects.equals(Build.PRODUCT, sourceProduct)) {
+ Log.w(
+ TAG,
+ "Unable to restore device specific information; Product mismatch (\'"
+ + Build.PRODUCT
+ + "\' and \'"
+ + sourceProduct
+ + "\')");
+ return false;
+ }
+
+ return true;
+ }
+
+ @VisibleForTesting
+ static byte[] toByteArray(String value) {
+ if (value == null) {
+ return toByteArray(NULL_SIZE);
+ }
+
+ byte[] stringBytes = value.getBytes();
+ byte[] sizeAndString = new byte[stringBytes.length + INTEGER_BYTE_COUNT];
+ writeInt(sizeAndString, 0, stringBytes.length);
+ writeBytes(sizeAndString, INTEGER_BYTE_COUNT, stringBytes);
+ return sizeAndString;
+ }
+
+ @VisibleForTesting
+ static byte[] toByteArray(int value) {
+ byte[] result = new byte[INTEGER_BYTE_COUNT];
+ writeInt(result, 0, value);
+ return result;
+ }
+
+ private String readString(byte[] data, AtomicInteger pos) {
+ int byteCount = readInt(data, pos);
+ if (byteCount == NULL_SIZE) {
+ return null;
+ }
+
+ int stringStart = pos.getAndAdd(byteCount);
+ return new String(data, stringStart, byteCount);
+ }
+
/**
* Write an int in BigEndian into the byte array.
* @param out byte array
@@ -947,7 +1124,7 @@ public class SettingsBackupAgent extends BackupAgentHelper {
* @param value integer to write
* @return the index after adding the size of an int (4) in bytes.
*/
- private int writeInt(byte[] out, int pos, int value) {
+ private static int writeInt(byte[] out, int pos, int value) {
out[pos + 0] = (byte) ((value >> 24) & 0xFF);
out[pos + 1] = (byte) ((value >> 16) & 0xFF);
out[pos + 2] = (byte) ((value >> 8) & 0xFF);
@@ -955,11 +1132,15 @@ public class SettingsBackupAgent extends BackupAgentHelper {
return pos + INTEGER_BYTE_COUNT;
}
- private int writeBytes(byte[] out, int pos, byte[] value) {
+ private static int writeBytes(byte[] out, int pos, byte[] value) {
System.arraycopy(value, 0, out, pos, value.length);
return pos + value.length;
}
+ private int readInt(byte[] in, AtomicInteger pos) {
+ return readInt(in, pos.getAndAdd(INTEGER_BYTE_COUNT));
+ }
+
private int readInt(byte[] in, int pos) {
int result = ((in[pos] & 0xFF) << 24)
| ((in[pos + 1] & 0xFF) << 16)
diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java
new file mode 100644
index 000000000000..cf8e1a5c2b14
--- /dev/null
+++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsBackupAgentTest.java
@@ -0,0 +1,272 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.providers.settings;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.junit.Assert.assertArrayEquals;
+
+import android.content.ContentResolver;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.os.Build;
+import android.provider.Settings;
+import android.test.mock.MockContentProvider;
+import android.test.mock.MockContentResolver;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/** Tests for the SettingsHelperTest */
+@RunWith(AndroidJUnit4.class)
+public class SettingsBackupAgentTest extends BaseSettingsProviderTest {
+
+ private static final String TEST_DISPLAY_DENSITY_FORCED = "123";
+ private static final Map<String, String> TEST_VALUES = new HashMap<>();
+
+ static {
+ TEST_VALUES.put(Settings.Secure.DISPLAY_DENSITY_FORCED, TEST_DISPLAY_DENSITY_FORCED);
+ }
+
+ private TestFriendlySettingsBackupAgent mAgentUnderTest;
+ private Context mContext;
+
+ @Before
+ public void setUp() {
+ mContext = new ContextWithMockContentResolver(getContext());
+
+ mAgentUnderTest = new TestFriendlySettingsBackupAgent();
+ mAgentUnderTest.attach(mContext);
+ }
+
+ @Test
+ public void testRoundTripDeviceSpecificSettings() throws IOException {
+ TestSettingsHelper helper = new TestSettingsHelper(mContext);
+ mAgentUnderTest.mSettingsHelper = helper;
+
+ byte[] settingsBackup = mAgentUnderTest.getDeviceSpecificConfiguration();
+
+ assertEquals("Not all values backed up.", TEST_VALUES.keySet(), helper.mReadEntries);
+
+ mAgentUnderTest.restoreDeviceSpecificConfig(settingsBackup);
+
+ assertEquals("Not all values were restored.", TEST_VALUES, helper.mWrittenValues);
+ }
+
+ @Test
+ public void testGeneratedHeaderMatchesCurrentDevice() throws IOException {
+ mAgentUnderTest.mSettingsHelper = new TestSettingsHelper(mContext);
+
+ byte[] header = generateUncorruptedHeader();
+
+ AtomicInteger pos = new AtomicInteger(0);
+ assertTrue(
+ "Generated header is not correct for device.",
+ mAgentUnderTest.isSourceAcceptable(header, pos));
+ }
+
+ @Test
+ public void testTestHeaderGeneratorIsAccurate() throws IOException {
+ byte[] classGeneratedHeader = generateUncorruptedHeader();
+ byte[] testGeneratedHeader = generateCorruptedHeader(false, false, false);
+
+ assertArrayEquals(
+ "Difference in header generation", classGeneratedHeader, testGeneratedHeader);
+ }
+
+ @Test
+ public void testNewerHeaderVersionFailsMatch() throws IOException {
+ byte[] header = generateCorruptedHeader(true, false, false);
+
+ AtomicInteger pos = new AtomicInteger(0);
+ assertFalse(
+ "Newer header does not fail match",
+ mAgentUnderTest.isSourceAcceptable(header, pos));
+ }
+
+ @Test
+ public void testWrongManufacturerFailsMatch() throws IOException {
+ byte[] header = generateCorruptedHeader(false, true, false);
+
+ AtomicInteger pos = new AtomicInteger(0);
+ assertFalse(
+ "Wrong manufacturer does not fail match",
+ mAgentUnderTest.isSourceAcceptable(header, pos));
+ }
+
+ @Test
+ public void testWrongProductFailsMatch() throws IOException {
+ byte[] header = generateCorruptedHeader(false, false, true);
+
+ AtomicInteger pos = new AtomicInteger(0);
+ assertFalse(
+ "Wrong product does not fail match",
+ mAgentUnderTest.isSourceAcceptable(header, pos));
+ }
+
+ @Test
+ public void checkAcceptTestFailingBlockRestore() {
+ mAgentUnderTest.setForcedDeviceInfoRestoreAcceptability(false);
+ byte[] data = new byte[0];
+
+ assertFalse(
+ "Blocking isSourceAcceptable did not stop restore",
+ mAgentUnderTest.restoreDeviceSpecificConfig(data));
+ }
+
+ private byte[] generateUncorruptedHeader() throws IOException {
+ try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+ mAgentUnderTest.writeHeader(os);
+ return os.toByteArray();
+ }
+ }
+
+ private byte[] generateCorruptedHeader(
+ boolean corruptVersion, boolean corruptManufacturer, boolean corruptProduct)
+ throws IOException {
+ try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
+ int version = SettingsBackupAgent.DEVICE_SPECIFIC_VERSION;
+ if (corruptVersion) {
+ version++;
+ }
+ os.write(SettingsBackupAgent.toByteArray(version));
+
+ String manufacturer = Build.MANUFACTURER;
+ if (corruptManufacturer) {
+ manufacturer = manufacturer == null ? "X" : manufacturer + "X";
+ }
+ os.write(SettingsBackupAgent.toByteArray(manufacturer));
+
+ String product = Build.PRODUCT;
+ if (corruptProduct) {
+ product = product == null ? "X" : product + "X";
+ }
+ os.write(SettingsBackupAgent.toByteArray(product));
+
+ return os.toByteArray();
+ }
+ }
+
+ private static class TestFriendlySettingsBackupAgent extends SettingsBackupAgent {
+ private Boolean mForcedDeviceInfoRestoreAcceptability = null;
+
+ void setForcedDeviceInfoRestoreAcceptability(boolean value) {
+ mForcedDeviceInfoRestoreAcceptability = value;
+ }
+
+ @VisibleForTesting
+ boolean isSourceAcceptable(byte[] data, AtomicInteger pos) {
+ return mForcedDeviceInfoRestoreAcceptability == null
+ ? super.isSourceAcceptable(data, pos)
+ : mForcedDeviceInfoRestoreAcceptability;
+ }
+ }
+
+ /** The TestSettingsHelper tracks which values have been backed up and/or restored. */
+ private static class TestSettingsHelper extends SettingsHelper {
+ private Set<String> mReadEntries;
+ private Map<String, String> mWrittenValues;
+
+ TestSettingsHelper(Context context) {
+ super(context);
+ mReadEntries = new HashSet<>();
+ mWrittenValues = new HashMap<>();
+ }
+
+ @Override
+ public String onBackupValue(String key, String value) {
+ mReadEntries.add(key);
+ String readValue = TEST_VALUES.get(key);
+ assert readValue != null;
+ return readValue;
+ }
+
+ @Override
+ public void restoreValue(
+ Context context,
+ ContentResolver cr,
+ ContentValues contentValues,
+ Uri destination,
+ String name,
+ String value,
+ int restoredFromSdkInt) {
+ mWrittenValues.put(name, value);
+ }
+ }
+
+ /**
+ * ContextWrapper which allows us to return a MockContentResolver to code which uses it to
+ * access settings. This allows us to override the ContentProvider for the Settings URIs to
+ * return known values.
+ */
+ private static class ContextWithMockContentResolver extends ContextWrapper {
+ private MockContentResolver mContentResolver;
+
+ ContextWithMockContentResolver(Context targetContext) {
+ super(targetContext);
+
+ mContentResolver = new MockContentResolver();
+ mContentResolver.addProvider(
+ Settings.AUTHORITY, new DeviceSpecificInfoMockContentProvider());
+ }
+
+ @Override
+ public ContentResolver getContentResolver() {
+ return mContentResolver;
+ }
+ }
+
+ /** ContentProvider which returns a set of known test values. */
+ private static class DeviceSpecificInfoMockContentProvider extends MockContentProvider {
+ private static final Object[][] RESULT_ROWS = {
+ {Settings.Secure.DISPLAY_DENSITY_FORCED, TEST_DISPLAY_DENSITY_FORCED},
+ };
+
+ @Override
+ public Cursor query(
+ Uri uri,
+ String[] projection,
+ String selection,
+ String[] selectionArgs,
+ String sortOrder) {
+ MatrixCursor result = new MatrixCursor(SettingsBackupAgent.PROJECTION);
+ for (Object[] resultRow : RESULT_ROWS) {
+ result.addRow(resultRow);
+ }
+ return result;
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
index 1a5a60c0d393..de20972347d5 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -345,7 +345,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
Trace.endSection();
break;
case MSG_FACE_UNLOCK_STATE_CHANGED:
- Trace.beginSection("KeyguardUpdateMonitor#handler MSG_FACE_UNLOCK_STATE_CHANGED");
+ Trace.beginSection(
+ "KeyguardUpdateMonitor#handler MSG_FACE_UNLOCK_STATE_CHANGED");
handleFaceUnlockStateChanged(msg.arg1 != 0, msg.arg2);
Trace.endSection();
break;
@@ -395,15 +396,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private BiometricManager mBiometricManager;
private IBiometricEnabledOnKeyguardCallback mBiometricEnabledCallback =
new IBiometricEnabledOnKeyguardCallback.Stub() {
- @Override
- public void onChanged(BiometricSourceType type, boolean enabled, int userId)
- throws RemoteException {
- if (type == BiometricSourceType.FACE) {
- mFaceSettingEnabledForUser.put(userId, enabled);
- updateFaceListeningState();
- }
- }
- };
+ @Override
+ public void onChanged(BiometricSourceType type, boolean enabled, int userId)
+ throws RemoteException {
+ if (type == BiometricSourceType.FACE) {
+ mFaceSettingEnabledForUser.put(userId, enabled);
+ updateFaceListeningState();
+ }
+ }
+ };
private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@Override
@@ -414,11 +415,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
private OnSubscriptionsChangedListener mSubscriptionListener =
new OnSubscriptionsChangedListener() {
- @Override
- public void onSubscriptionsChanged() {
- mHandler.sendEmptyMessage(MSG_SIM_SUBSCRIPTION_INFO_CHANGED);
- }
- };
+ @Override
+ public void onSubscriptionsChanged() {
+ mHandler.sendEmptyMessage(MSG_SIM_SUBSCRIPTION_INFO_CHANGED);
+ }
+ };
private SparseBooleanArray mUserHasTrust = new SparseBooleanArray();
private SparseBooleanArray mUserTrustIsManaged = new SparseBooleanArray();
@@ -459,6 +460,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleSimSubscriptionInfoChanged() {
+ checkIsHandlerThread();
if (DEBUG_SIM_STATES) {
Log.v(TAG, "onSubscriptionInfoChanged()");
List<SubscriptionInfo> sil = mSubscriptionManager.getActiveSubscriptionInfoList(false);
@@ -492,17 +494,17 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
}
}
- for (int j = 0; j < mCallbacks.size(); j++) {
- KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
- if (cb != null) {
- cb.onRefreshCarrierInfo();
- }
- }
+ callbacksRefreshCarrierInfo();
}
private void handleAirplaneModeChanged() {
- for (int j = 0; j < mCallbacks.size(); j++) {
- KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
+ callbacksRefreshCarrierInfo();
+ }
+
+ private void callbacksRefreshCarrierInfo() {
+ checkIsHandlerThread();
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onRefreshCarrierInfo();
}
@@ -528,7 +530,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
public void onTrustManagedChanged(boolean managed, int userId) {
checkIsHandlerThread();
mUserTrustIsManaged.put(userId, managed);
-
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -539,7 +540,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Updates KeyguardUpdateMonitor's internal state to know if keyguard is goingAway
- * @param goingAway
*/
public void setKeyguardGoingAway(boolean goingAway) {
mKeyguardGoingAway = goingAway;
@@ -548,7 +548,6 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Updates KeyguardUpdateMonitor's internal state to know if keyguard is occluded
- * @param occluded
*/
public void setKeyguardOccluded(boolean occluded) {
mKeyguardOccluded = occluded;
@@ -585,6 +584,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
@VisibleForTesting
protected void onFingerprintAuthenticated(int userId) {
+ checkIsHandlerThread();
Trace.beginSection("KeyGuardUpdateMonitor#onFingerPrintAuthenticated");
mUserFingerprintAuthenticated.put(userId, true);
// Update/refresh trust state only if user can skip bouncer
@@ -610,6 +610,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFingerprintAuthFailed() {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -621,6 +622,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFingerprintAcquired(int acquireInfo) {
+ checkIsHandlerThread();
if (acquireInfo != FingerprintManager.FINGERPRINT_ACQUIRED_GOOD) {
return;
}
@@ -658,6 +660,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFingerprintHelp(int msgId, String helpString) {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -676,6 +679,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
};
private void handleFingerprintError(int msgId, String errString) {
+ checkIsHandlerThread();
if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED && mHandler.hasCallbacks(
mCancelNotReceived)) {
mHandler.removeCallbacks(mCancelNotReceived);
@@ -741,6 +745,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
@VisibleForTesting
protected void onFaceAuthenticated(int userId) {
Trace.beginSection("KeyGuardUpdateMonitor#onFaceAuthenticated");
+ checkIsHandlerThread();
mUserFaceAuthenticated.put(userId, true);
// Update/refresh trust state only if user can skip bouncer
if (getUserCanSkipBouncer(userId)) {
@@ -766,6 +771,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFaceAuthFailed() {
+ checkIsHandlerThread();
setFaceRunningState(BIOMETRIC_STATE_STOPPED);
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -778,6 +784,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFaceAcquired(int acquireInfo) {
+ checkIsHandlerThread();
if (acquireInfo != FaceManager.FACE_ACQUIRED_GOOD) {
return;
}
@@ -821,6 +828,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleFaceHelp(int msgId, String helpString) {
+ checkIsHandlerThread();
if (DEBUG_FACE) Log.d(TAG, "Face help received: " + helpString);
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -840,6 +848,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
};
private void handleFaceError(int msgId, String errString) {
+ checkIsHandlerThread();
if (DEBUG_FACE) Log.d(TAG, "Face error received: " + errString);
if (msgId == FaceManager.FACE_ERROR_CANCELED && mHandler.hasCallbacks(mCancelNotReceived)) {
mHandler.removeCallbacks(mCancelNotReceived);
@@ -894,6 +903,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void notifyFaceRunningStateChanged() {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -938,7 +948,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
final DevicePolicyManager dpm =
(DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
return dpm != null && (dpm.getKeyguardDisabledFeatures(null, userId)
- & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0
+ & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) != 0
|| isSimPinSecure();
}
@@ -1013,6 +1023,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void dispatchErrorMessage(CharSequence message) {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -1092,8 +1103,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
if (DEBUG_SIM_STATES) {
Log.v(TAG, "action " + action
- + " state: " + intent.getStringExtra(IccCardConstants.INTENT_KEY_ICC_STATE)
- + " slotId: " + args.slotId + " subid: " + args.subId);
+ + " state: " + intent.getStringExtra(
+ IccCardConstants.INTENT_KEY_ICC_STATE)
+ + " slotId: " + args.slotId + " subid: " + args.subId);
}
mHandler.obtainMessage(MSG_SIM_STATE_CHANGE, args.subId, args.slotId, args.simState)
.sendToTarget();
@@ -1138,7 +1150,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_INFO_CHANGED,
intent.getIntExtra(Intent.EXTRA_USER_HANDLE, getSendingUserId()), 0));
} else if (ACTION_FACE_UNLOCK_STARTED.equals(action)) {
- Trace.beginSection("KeyguardUpdateMonitor.mBroadcastAllReceiver#onReceive ACTION_FACE_UNLOCK_STARTED");
+ Trace.beginSection(
+ "KeyguardUpdateMonitor.mBroadcastAllReceiver#onReceive "
+ + "ACTION_FACE_UNLOCK_STARTED");
mHandler.sendMessage(mHandler.obtainMessage(MSG_FACE_UNLOCK_STATE_CHANGED, 1,
getSendingUserId()));
Trace.endSection();
@@ -1267,7 +1281,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
if (IccCardConstants.INTENT_VALUE_ICC_ABSENT.equals(stateExtra)) {
final String absentReason = intent
- .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
+ .getStringExtra(IccCardConstants.INTENT_KEY_LOCKED_REASON);
if (IccCardConstants.INTENT_VALUE_ABSENT_ON_PERM_DISABLED.equals(
absentReason)) {
@@ -1292,7 +1306,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
} else if (IccCardConstants.INTENT_VALUE_ICC_CARD_IO_ERROR.equals(stateExtra)) {
state = IccCardConstants.State.CARD_IO_ERROR;
} else if (IccCardConstants.INTENT_VALUE_ICC_LOADED.equals(stateExtra)
- || IccCardConstants.INTENT_VALUE_ICC_IMSI.equals(stateExtra)) {
+ || IccCardConstants.INTENT_VALUE_ICC_IMSI.equals(stateExtra)) {
// This is required because telephony doesn't return to "READY" after
// these state transitions. See bug 7197471.
state = IccCardConstants.State.READY;
@@ -1319,6 +1333,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
public final int plugged;
public final int health;
public final int maxChargingWattage;
+
public BatteryStatus(int status, int level, int plugged, int health,
int maxChargingWattage) {
this.status = status;
@@ -1330,6 +1345,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Determine whether the device is plugged in (USB, power, or wireless).
+ *
* @return true if the device is plugged in.
*/
public boolean isPluggedIn() {
@@ -1340,6 +1356,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Determine whether the device is plugged in (USB, power).
+ *
* @return true if the device is plugged in wired (as opposed to wireless)
*/
public boolean isPluggedInWired() {
@@ -1351,6 +1368,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Whether or not the device is charged. Note that some devices never return 100% for
* battery level, so this allows either battery level or status to determine if the
* battery is charged.
+ *
* @return true if the device is charged
*/
public boolean isCharged() {
@@ -1359,6 +1377,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Whether battery is low and needs to be charged.
+ *
* @return true if battery is low
*/
public boolean isBatteryLow() {
@@ -1368,8 +1387,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
public final int getChargingSpeed(int slowThreshold, int fastThreshold) {
return maxChargingWattage <= 0 ? CHARGING_UNKNOWN :
maxChargingWattage < slowThreshold ? CHARGING_SLOWLY :
- maxChargingWattage > fastThreshold ? CHARGING_FAST :
- CHARGING_REGULAR;
+ maxChargingWattage > fastThreshold ? CHARGING_FAST :
+ CHARGING_REGULAR;
}
@Override
@@ -1414,9 +1433,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
protected void handleStartedWakingUp() {
Trace.beginSection("KeyguardUpdateMonitor#handleStartedWakingUp");
+ checkIsHandlerThread();
updateBiometricListeningState();
- final int count = mCallbacks.size();
- for (int i = 0; i < count; i++) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onStartedWakingUp();
@@ -1426,9 +1445,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
protected void handleStartedGoingToSleep(int arg1) {
+ checkIsHandlerThread();
clearBiometricRecognized();
- final int count = mCallbacks.size();
- for (int i = 0; i < count; i++) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onStartedGoingToSleep(arg1);
@@ -1439,9 +1458,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
protected void handleFinishedGoingToSleep(int arg1) {
+ checkIsHandlerThread();
mGoingToSleep = false;
- final int count = mCallbacks.size();
- for (int i = 0; i < count; i++) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onFinishedGoingToSleep(arg1);
@@ -1451,8 +1470,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleScreenTurnedOn() {
- final int count = mCallbacks.size();
- for (int i = 0; i < count; i++) {
+ checkIsHandlerThread();
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onScreenTurnedOn();
@@ -1461,11 +1480,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleScreenTurnedOff() {
+ checkIsHandlerThread();
mLockIconPressed = false;
mHardwareFingerprintUnavailableRetryCount = 0;
mHardwareFaceUnavailableRetryCount = 0;
- final int count = mCallbacks.size();
- for (int i = 0; i < count; i++) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onScreenTurnedOff();
@@ -1474,9 +1493,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleDreamingStateChanged(int dreamStart) {
- final int count = mCallbacks.size();
+ checkIsHandlerThread();
mIsDreaming = dreamStart == 1;
- for (int i = 0; i < count; i++) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onDreamingStateChanged(mIsDreaming);
@@ -1486,6 +1505,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleUserInfoChanged(int userId) {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -1495,6 +1515,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
private void handleUserUnlocked() {
+ checkIsHandlerThread();
mNeedsSlowUnlockTransition = resolveNeedsSlowUnlockTransition();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -1559,6 +1580,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCHING,
newUserId, 0, reply));
}
+
@Override
public void onUserSwitchComplete(int newUserId) throws RemoteException {
mHandler.sendMessage(mHandler.obtainMessage(MSG_USER_SWITCH_COMPLETE,
@@ -1644,6 +1666,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Called whenever passive authentication is requested or aborted by a sensor.
+ *
* @param active If the interrupt started or ended.
*/
public void onAuthInterruptDetected(boolean active) {
@@ -1898,7 +1921,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
checkIsHandlerThread();
if (hasLockscreenWallpaper != mHasLockscreenWallpaper) {
mHasLockscreenWallpaper = hasLockscreenWallpaper;
- for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onHasLockscreenWallpaperChanged(hasLockscreenWallpaper);
@@ -1918,8 +1941,9 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_DPM_STATE_CHANGED}
*/
private void handleDevicePolicyManagerStateChanged() {
+ checkIsHandlerThread();
updateFingerprintListeningState();
- for (int i = mCallbacks.size() - 1; i >= 0; i--) {
+ for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onDevicePolicyManagerStateChanged();
@@ -1931,6 +1955,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_USER_SWITCHING}
*/
private void handleUserSwitching(int userId, IRemoteCallback reply) {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -1947,6 +1972,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_USER_SWITCH_COMPLETE}
*/
private void handleUserSwitchComplete(int userId) {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -1969,6 +1995,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_BOOT_COMPLETED}
*/
private void handleBootCompleted() {
+ checkIsHandlerThread();
if (mBootCompleted) return;
mBootCompleted = true;
for (int i = 0; i < mCallbacks.size(); i++) {
@@ -1991,6 +2018,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_DEVICE_PROVISIONED}
*/
private void handleDeviceProvisioned() {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -2008,6 +2036,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_PHONE_STATE_CHANGED}
*/
private void handlePhoneStateChanged(String newState) {
+ checkIsHandlerThread();
if (DEBUG) Log.d(TAG, "handlePhoneStateChanged(" + newState + ")");
if (TelephonyManager.EXTRA_STATE_IDLE.equals(newState)) {
mPhoneState = TelephonyManager.CALL_STATE_IDLE;
@@ -2028,6 +2057,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_RINGER_MODE_CHANGED}
*/
private void handleRingerModeChange(int mode) {
+ checkIsHandlerThread();
if (DEBUG) Log.d(TAG, "handleRingerModeChange(" + mode + ")");
mRingMode = mode;
for (int i = 0; i < mCallbacks.size(); i++) {
@@ -2042,6 +2072,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_TIME_UPDATE}
*/
private void handleTimeUpdate() {
+ checkIsHandlerThread();
if (DEBUG) Log.d(TAG, "handleTimeUpdate");
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -2055,6 +2086,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle (@line #MSG_TIMEZONE_UPDATE}
*/
private void handleTimeZoneUpdate(String timeZone) {
+ checkIsHandlerThread();
if (DEBUG) Log.d(TAG, "handleTimeZoneUpdate");
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -2070,6 +2102,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_BATTERY_UPDATE}
*/
private void handleBatteryUpdate(BatteryStatus status) {
+ checkIsHandlerThread();
if (DEBUG) Log.d(TAG, "handleBatteryUpdate");
final boolean batteryUpdateInteresting = isBatteryUpdateInteresting(mBatteryStatus, status);
mBatteryStatus = status;
@@ -2087,13 +2120,14 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle Telephony status during Boot for CarrierText display policy
*/
@VisibleForTesting
- void updateTelephonyCapable(boolean capable){
+ void updateTelephonyCapable(boolean capable) {
+ checkIsHandlerThread();
if (capable == mTelephonyCapable) {
return;
}
mTelephonyCapable = capable;
- for (WeakReference<KeyguardUpdateMonitorCallback> ref : mCallbacks) {
- KeyguardUpdateMonitorCallback cb = ref.get();
+ for (int i = 0; i < mCallbacks.size(); i++) {
+ KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
cb.onTelephonyCapable(mTelephonyCapable);
}
@@ -2108,7 +2142,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
checkIsHandlerThread();
if (DEBUG_SIM_STATES) {
Log.d(TAG, "handleSimStateChange(subId=" + subId + ", slotId="
- + slotId + ", state=" + state +")");
+ + slotId + ", state=" + state + ")");
}
boolean becameAbsent = false;
@@ -2176,12 +2210,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
mServiceStates.put(subId, serviceState);
- for (int j = 0; j < mCallbacks.size(); j++) {
- KeyguardUpdateMonitorCallback cb = mCallbacks.get(j).get();
- if (cb != null) {
- cb.onRefreshCarrierInfo();
- }
- }
+ callbacksRefreshCarrierInfo();
}
public boolean isKeyguardVisible() {
@@ -2233,9 +2262,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Handle {@link #MSG_KEYGUARD_BOUNCER_CHANGED}
+ *
* @see #sendKeyguardBouncerChanged(boolean)
*/
private void handleKeyguardBouncerChanged(int bouncer) {
+ checkIsHandlerThread();
if (DEBUG) Log.d(TAG, "handleKeyguardBouncerChanged(" + bouncer + ")");
boolean isBouncer = (bouncer == 1);
mBouncer = isBouncer;
@@ -2261,6 +2292,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
* Handle {@link #MSG_REPORT_EMERGENCY_CALL_ACTION}
*/
private void handleReportEmergencyCallAction() {
+ checkIsHandlerThread();
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
@@ -2273,7 +2305,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
final boolean nowPluggedIn = current.isPluggedIn();
final boolean wasPluggedIn = old.isPluggedIn();
final boolean stateChangedWhilePluggedIn = wasPluggedIn && nowPluggedIn
- && (old.status != current.status);
+ && (old.status != current.status);
// change in plug state is always interesting
if (wasPluggedIn != nowPluggedIn || stateChangedWhilePluggedIn) {
@@ -2300,31 +2332,34 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
*/
public void removeCallback(KeyguardUpdateMonitorCallback callback) {
checkIsHandlerThread();
- if (DEBUG) Log.v(TAG, "*** unregister callback for " + callback);
- for (int i = mCallbacks.size() - 1; i >= 0; i--) {
- if (mCallbacks.get(i).get() == callback) {
- mCallbacks.remove(i);
- }
+ if (DEBUG) {
+ Log.v(TAG, "*** unregister callback for " + callback);
}
+
+ mCallbacks.removeIf(el -> el.get() == callback);
}
/**
* Register to receive notifications about general keyguard information
* (see {@link InfoCallback}.
+ *
* @param callback The callback to register
*/
public void registerCallback(KeyguardUpdateMonitorCallback callback) {
checkIsHandlerThread();
if (DEBUG) Log.v(TAG, "*** register callback for " + callback);
// Prevent adding duplicate callbacks
+
for (int i = 0; i < mCallbacks.size(); i++) {
if (mCallbacks.get(i).get() == callback) {
- if (DEBUG) Log.e(TAG, "Object tried to add another callback",
- new Exception("Called by"));
+ if (DEBUG) {
+ Log.e(TAG, "Object tried to add another callback",
+ new Exception("Called by"));
+ }
return;
}
}
- mCallbacks.add(new WeakReference<KeyguardUpdateMonitorCallback>(callback));
+ mCallbacks.add(new WeakReference<>(callback));
removeCallback(null); // remove unused references
sendUpdates(callback);
}
@@ -2395,7 +2430,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
*
* @param bypassHandler runs immediately.
*
- * NOTE: Must be called from UI thread if bypassHandler == true.
+ * NOTE: Must be called from UI thread if bypassHandler == true.
*/
public void reportEmergencyCallAction(boolean bypassHandler) {
if (!bypassHandler) {
@@ -2408,7 +2443,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* @return Whether the device is provisioned (whether they have gone through
- * the setup wizard)
+ * the setup wizard)
*/
public boolean isDeviceProvisioned() {
return mDeviceProvisioned;
@@ -2419,6 +2454,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
public void clearBiometricRecognized() {
+ checkIsHandlerThread();
mUserFingerprintAuthenticated.clear();
mUserFaceAuthenticated.clear();
mTrustManager.clearAllBiometricRecognized(BiometricSourceType.FINGERPRINT);
@@ -2439,6 +2475,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* If any SIM cards are currently secure.
+ *
* @see #isSimPinSecure(State)
*/
public boolean isSimPinSecure() {
@@ -2485,11 +2522,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
// need IccCardConstants, but TelephonyManager would only give us
// TelephonyManager.SIM_STATE*, so we retrieve it manually.
final TelephonyManager tele = TelephonyManager.from(mContext);
- int simState = tele.getSimState(slotId);
+ int simState = tele.getSimState(slotId);
State state;
try {
state = State.intToState(simState);
- } catch(IllegalArgumentException ex) {
+ } catch (IllegalArgumentException ex) {
Log.w(TAG, "Unknown sim state: " + simState);
state = State.UNKNOWN;
}
@@ -2533,7 +2570,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
public void dispatchFinishedGoingToSleep(int why) {
- synchronized(this) {
+ synchronized (this) {
mDeviceInteractive = false;
}
mHandler.sendMessage(mHandler.obtainMessage(MSG_FINISHED_GOING_TO_SLEEP, why, 0));
@@ -2547,7 +2584,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
}
public void dispatchScreenTurnedOff() {
- synchronized(this) {
+ synchronized (this) {
mScreenOn = false;
}
mHandler.sendEmptyMessage(MSG_SCREEN_TURNED_OFF);
@@ -2571,7 +2608,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
/**
* Find the next SubscriptionId for a SIM in the given state, favoring lower slot numbers first.
- * @param state
+ *
* @return subid or {@link SubscriptionManager#INVALID_SUBSCRIPTION_ID} if none found
*/
public int getNextSubIdForState(State state) {
@@ -2582,7 +2619,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
final SubscriptionInfo info = list.get(i);
final int id = info.getSubscriptionId();
int slotId = SubscriptionManager.getSlotIndex(id);
- if (state == getSimState(id) && bestSlotId > slotId ) {
+ if (state == getSimState(id) && bestSlotId > slotId) {
resultId = id;
bestSlotId = slotId;
}
@@ -2611,6 +2648,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
boolean logoutEnabled = mDevicePolicyManager.isLogoutEnabled();
if (mLogoutEnabled != logoutEnabled) {
mLogoutEnabled = logoutEnabled;
+
for (int i = 0; i < mCallbacks.size(); i++) {
KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
if (cb != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
index 311ed8a913f1..7e3b42389637 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIFactory.java
@@ -66,6 +66,7 @@ import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.UnlockMethodCache;
import com.android.systemui.statusbar.policy.DeviceProvisionedController;
+import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.util.AsyncSensorManager;
import com.android.systemui.volume.VolumeDialogComponent;
@@ -150,9 +151,9 @@ public class SystemUIFactory {
LockscreenWallpaper lockscreenWallpaper,
TriConsumer<ScrimState, Float, GradientColors> scrimStateListener,
Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
- AlarmManager alarmManager) {
+ AlarmManager alarmManager, KeyguardMonitor keyguardMonitor) {
return new ScrimController(scrimBehind, scrimInFront, scrimStateListener,
- scrimVisibleListener, dozeParameters, alarmManager);
+ scrimVisibleListener, dozeParameters, alarmManager, keyguardMonitor);
}
public NotificationIconAreaController createNotificationIconAreaController(Context context,
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
index 128cc614fd08..ee79e6b973de 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManagerProxy.java
@@ -26,6 +26,7 @@ import android.provider.DeviceConfig;
import android.view.MotionEvent;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.classifier.brightline.BrightLineFalsingManager;
import com.android.systemui.classifier.brightline.FalsingDataProvider;
@@ -102,7 +103,8 @@ public class FalsingManagerProxy implements FalsingManager {
} else {
mInternalFalsingManager = new BrightLineFalsingManager(
new FalsingDataProvider(context.getResources().getDisplayMetrics()),
- Dependency.get(AsyncSensorManager.class)
+ Dependency.get(AsyncSensorManager.class),
+ KeyguardUpdateMonitor.getInstance(context)
);
}
diff --git a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
index ce82bbfb1512..9e0b7025ddf8 100644
--- a/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
+++ b/packages/SystemUI/src/com/android/systemui/classifier/brightline/BrightLineFalsingManager.java
@@ -23,11 +23,14 @@ import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
+import android.hardware.biometrics.BiometricSourceType;
import android.net.Uri;
import android.util.Log;
import android.view.MotionEvent;
import com.android.internal.logging.MetricsLogger;
+import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.systemui.classifier.Classifier;
import com.android.systemui.plugins.FalsingManager;
@@ -47,11 +50,13 @@ public class BrightLineFalsingManager implements FalsingManager {
private final SensorManager mSensorManager;
private final FalsingDataProvider mDataProvider;
+ private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
private boolean mSessionStarted;
private MetricsLogger mMetricsLogger;
private int mIsFalseTouchCalls;
private boolean mShowingAod;
private boolean mScreenOn;
+ private boolean mJustUnlockedWithFace;
private final ExecutorService mBackgroundExecutor = Executors.newSingleThreadExecutor();
@@ -68,10 +73,27 @@ public class BrightLineFalsingManager implements FalsingManager {
}
};
- public BrightLineFalsingManager(FalsingDataProvider falsingDataProvider,
- SensorManager sensorManager) {
+ private final KeyguardUpdateMonitorCallback mKeyguardUpdateCallback =
+ new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onBiometricAuthenticated(int userId,
+ BiometricSourceType biometricSourceType) {
+ if (userId == KeyguardUpdateMonitor.getCurrentUser()
+ && biometricSourceType == BiometricSourceType.FACE) {
+ mJustUnlockedWithFace = true;
+ }
+ }
+ };
+
+ public BrightLineFalsingManager(
+ FalsingDataProvider falsingDataProvider,
+ SensorManager sensorManager,
+ KeyguardUpdateMonitor keyguardUpdateMonitor) {
+ mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mDataProvider = falsingDataProvider;
mSensorManager = sensorManager;
+ mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateCallback);
+
mMetricsLogger = new MetricsLogger();
mClassifiers = new ArrayList<>();
DistanceClassifier distanceClassifier = new DistanceClassifier(mDataProvider);
@@ -110,6 +132,7 @@ public class BrightLineFalsingManager implements FalsingManager {
if (!mSessionStarted && !mShowingAod && mScreenOn) {
logDebug("Starting Session");
mSessionStarted = true;
+ mJustUnlockedWithFace = false;
registerSensors();
mClassifiers.forEach(FalsingClassifier::onSessionStarted);
}
@@ -141,7 +164,7 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public boolean isFalseTouch() {
- boolean r = mClassifiers.stream().anyMatch(falsingClassifier -> {
+ boolean r = !mJustUnlockedWithFace && mClassifiers.stream().anyMatch(falsingClassifier -> {
boolean result = falsingClassifier.isFalseTouch();
if (result) {
logInfo(falsingClassifier.getClass().getName() + ": true");
@@ -335,6 +358,7 @@ public class BrightLineFalsingManager implements FalsingManager {
@Override
public void cleanup() {
unregisterSensors();
+ mKeyguardUpdateMonitor.removeCallback(mKeyguardUpdateCallback);
}
static void logDebug(String msg) {
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java b/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java
index e6a9e47be71c..e5a54b816ec6 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeAuthRemover.java
@@ -25,7 +25,7 @@ import com.android.keyguard.KeyguardUpdateMonitor;
*/
public class DozeAuthRemover implements DozeMachine.Part {
- KeyguardUpdateMonitor mKeyguardUpdateMonitor;
+ private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
public DozeAuthRemover(Context context) {
mKeyguardUpdateMonitor = KeyguardUpdateMonitor.getInstance(context);
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
index 1bc7e635f9ed..86d4a48d3d59 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeFactory.java
@@ -30,6 +30,7 @@ import com.android.systemui.R;
import com.android.systemui.SystemUIApplication;
import com.android.systemui.dock.DockManager;
import com.android.systemui.plugins.FalsingManager;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.statusbar.phone.BiometricUnlockController;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.AsyncSensorManager;
@@ -47,6 +48,7 @@ public class DozeFactory {
SensorManager sensorManager = Dependency.get(AsyncSensorManager.class);
AlarmManager alarmManager = context.getSystemService(AlarmManager.class);
DockManager dockManager = Dependency.get(DockManager.class);
+ WakefulnessLifecycle wakefulnessLifecycle = Dependency.get(WakefulnessLifecycle.class);
DozeHost host = getHost(dozeService);
AmbientDisplayConfiguration config = new AmbientDisplayConfiguration(context);
@@ -61,7 +63,8 @@ public class DozeFactory {
wrappedService = DozeSuspendScreenStatePreventingAdapter.wrapIfNeeded(wrappedService,
params);
- DozeMachine machine = new DozeMachine(wrappedService, config, wakeLock);
+ DozeMachine machine = new DozeMachine(wrappedService, config, wakeLock,
+ wakefulnessLifecycle);
machine.setParts(new DozeMachine.Part[]{
new DozePauser(handler, machine, alarmManager, params.getPolicy()),
new DozeFalsingManagerAdapter(falsingManager),
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
index 8bf2256a4f80..93a51cc20db2 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeMachine.java
@@ -24,6 +24,8 @@ import android.util.Log;
import android.view.Display;
import com.android.internal.util.Preconditions;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
+import com.android.systemui.keyguard.WakefulnessLifecycle.Wakefulness;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.Assert;
import com.android.systemui.util.wakelock.WakeLock;
@@ -118,6 +120,7 @@ public class DozeMachine {
private final Service mDozeService;
private final WakeLock mWakeLock;
private final AmbientDisplayConfiguration mConfig;
+ private final WakefulnessLifecycle mWakefulnessLifecycle;
private Part[] mParts;
private final ArrayList<State> mQueuedRequests = new ArrayList<>();
@@ -126,9 +129,10 @@ public class DozeMachine {
private boolean mWakeLockHeldForCurrentState = false;
public DozeMachine(Service service, AmbientDisplayConfiguration config,
- WakeLock wakeLock) {
+ WakeLock wakeLock, WakefulnessLifecycle wakefulnessLifecycle) {
mDozeService = service;
mConfig = config;
+ mWakefulnessLifecycle = wakefulnessLifecycle;
mWakeLock = wakeLock;
}
@@ -334,9 +338,18 @@ public class DozeMachine {
switch (state) {
case INITIALIZED:
case DOZE_PULSE_DONE:
- transitionTo(mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)
- ? DozeMachine.State.DOZE_AOD : DozeMachine.State.DOZE,
- DozeLog.PULSE_REASON_NONE);
+ final State nextState;
+ @Wakefulness int wakefulness = mWakefulnessLifecycle.getWakefulness();
+ if (wakefulness == WakefulnessLifecycle.WAKEFULNESS_AWAKE
+ || wakefulness == WakefulnessLifecycle.WAKEFULNESS_WAKING) {
+ nextState = State.FINISH;
+ } else if (mConfig.alwaysOnEnabled(UserHandle.USER_CURRENT)) {
+ nextState = State.DOZE_AOD;
+ } else {
+ nextState = State.DOZE;
+ }
+
+ transitionTo(nextState, DozeLog.PULSE_REASON_NONE);
break;
default:
break;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index f79bb3ae5b90..026a62528c8d 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -288,6 +288,7 @@ public class DozeSensors {
final AlarmTimeout mCooldownTimer;
final AlwaysOnDisplayPolicy mPolicy;
final Sensor mSensor;
+ final boolean mUsingBrightnessSensor;
public ProxSensor(AlwaysOnDisplayPolicy policy) {
mPolicy = policy;
@@ -298,6 +299,7 @@ public class DozeSensors {
// if available.
Sensor sensor = DozeSensors.findSensorWithType(mSensorManager,
mContext.getString(R.string.doze_brightness_sensor_type));
+ mUsingBrightnessSensor = sensor != null;
if (sensor == null) {
sensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
}
@@ -327,8 +329,7 @@ public class DozeSensors {
return;
}
if (register) {
- mRegistered = mSensorManager.registerListener(this,
- mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY),
+ mRegistered = mSensorManager.registerListener(this, mSensor,
SensorManager.SENSOR_DELAY_NORMAL, mHandler);
} else {
mSensorManager.unregisterListener(this);
@@ -341,7 +342,13 @@ public class DozeSensors {
public void onSensorChanged(android.hardware.SensorEvent event) {
if (DEBUG) Log.d(TAG, "onSensorChanged " + event);
- mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange();
+ if (mUsingBrightnessSensor) {
+ // The custom brightness sensor is gated by the proximity sensor and will return 0
+ // whenever prox is covered.
+ mCurrentlyFar = event.values[0] > 0;
+ } else {
+ mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange();
+ }
mProxCallback.accept(mCurrentlyFar);
long now = SystemClock.elapsedRealtime();
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java b/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java
index 52a0214c492c..d17f2f621ec8 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/WakefulnessLifecycle.java
@@ -16,12 +16,15 @@
package com.android.systemui.keyguard;
+import android.annotation.IntDef;
import android.os.Trace;
import com.android.systemui.Dumpable;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import javax.inject.Inject;
import javax.inject.Singleton;
@@ -33,6 +36,15 @@ import javax.inject.Singleton;
public class WakefulnessLifecycle extends Lifecycle<WakefulnessLifecycle.Observer> implements
Dumpable {
+ @IntDef(prefix = { "WAKEFULNESS_" }, value = {
+ WAKEFULNESS_ASLEEP,
+ WAKEFULNESS_WAKING,
+ WAKEFULNESS_AWAKE,
+ WAKEFULNESS_GOING_TO_SLEEP,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Wakefulness {}
+
public static final int WAKEFULNESS_ASLEEP = 0;
public static final int WAKEFULNESS_WAKING = 1;
public static final int WAKEFULNESS_AWAKE = 2;
@@ -44,7 +56,7 @@ public class WakefulnessLifecycle extends Lifecycle<WakefulnessLifecycle.Observe
public WakefulnessLifecycle() {
}
- public int getWakefulness() {
+ public @Wakefulness int getWakefulness() {
return mWakefulness;
}
@@ -86,7 +98,7 @@ public class WakefulnessLifecycle extends Lifecycle<WakefulnessLifecycle.Observe
pw.println(" mWakefulness=" + mWakefulness);
}
- private void setWakefulness(int wakefulness) {
+ private void setWakefulness(@Wakefulness int wakefulness) {
mWakefulness = wakefulness;
Trace.traceCounter(Trace.TRACE_TAG_APP, "wakefulness", wakefulness);
}
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 c209b315b197..83b000dca83b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/QSCustomizer.java
@@ -296,10 +296,13 @@ public class QSCustomizer extends LinearLayout implements OnMenuItemClickListene
mY = y - containerLocation[1];
}
- private final Callback mKeyguardCallback = () -> {
- if (!isAttachedToWindow()) return;
- if (Dependency.get(KeyguardMonitor.class).isShowing() && !mOpening) {
- hide();
+ private final Callback mKeyguardCallback = new Callback() {
+ @Override
+ public void onKeyguardShowingChanged() {
+ if (!isAttachedToWindow()) return;
+ if (Dependency.get(KeyguardMonitor.class).isShowing() && !mOpening) {
+ hide();
+ }
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
index 822a6669bd5c..0383dee4f9c3 100644
--- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
+++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java
@@ -27,32 +27,29 @@ import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
+import android.graphics.Point;
import android.graphics.drawable.Icon;
import android.hardware.display.DisplayManager;
import android.hardware.display.VirtualDisplay;
import android.media.MediaRecorder;
-import android.media.ThumbnailUtils;
import android.media.projection.MediaProjection;
import android.media.projection.MediaProjectionManager;
import android.net.Uri;
-import android.os.Environment;
import android.os.IBinder;
import android.provider.MediaStore;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Log;
+import android.util.Size;
import android.view.Surface;
import android.widget.Toast;
-import androidx.core.content.FileProvider;
-
import com.android.systemui.R;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
-import java.nio.file.Path;
import java.text.SimpleDateFormat;
import java.util.Date;
@@ -79,12 +76,10 @@ public class RecordingService extends Service {
private static final String ACTION_DELETE = "com.android.systemui.screenrecord.DELETE";
private static final int TOTAL_NUM_TRACKS = 1;
- private static final String RECORD_DIR = "Captures"; // TODO: use a translatable string
private static final int VIDEO_BIT_RATE = 6000000;
private static final int VIDEO_FRAME_RATE = 30;
private static final int AUDIO_BIT_RATE = 16;
private static final int AUDIO_SAMPLE_RATE = 44100;
- private static final String FILE_PROVIDER = "com.android.systemui.fileprovider";
private MediaProjectionManager mMediaProjectionManager;
private MediaProjection mMediaProjection;
@@ -120,11 +115,11 @@ public class RecordingService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
- Log.d(TAG, "RecordingService is starting");
if (intent == null) {
return Service.START_NOT_STICKY;
}
String action = intent.getAction();
+ Log.d(TAG, "onStartCommand " + action);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
@@ -160,41 +155,7 @@ public class RecordingService extends Service {
case ACTION_STOP:
stopRecording();
-
- String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'")
- .format(new Date());
-
- ContentValues values = new ContentValues();
- values.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);
- values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
- values.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis());
- values.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
-
- ContentResolver resolver = getContentResolver();
- Uri collectionUri = MediaStore.Video.Media.getContentUri(
- MediaStore.VOLUME_EXTERNAL_PRIMARY);
- Uri itemUri = resolver.insert(collectionUri, values);
-
- File recordDir = new File(getExternalFilesDir(Environment.DIRECTORY_MOVIES),
- RECORD_DIR);
- recordDir.mkdirs();
- Path path = new File(recordDir, fileName).toPath();
- try {
- // Move file out of temp directory
- Files.move(mTempFile.toPath(), path);
-
- // Add to the mediastore
- OutputStream os = resolver.openOutputStream(itemUri, "w");
- Files.copy(path, os);
- os.close();
-
- Notification notification = createSaveNotification(itemUri, path);
- notificationManager.notify(NOTIFICATION_ID, notification);
- } catch (IOException e) {
- e.printStackTrace();
- Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG)
- .show();
- }
+ saveRecording(notificationManager);
break;
case ACTION_PAUSE:
@@ -208,8 +169,7 @@ public class RecordingService extends Service {
break;
case ACTION_SHARE:
- File shareFile = new File(intent.getStringExtra(EXTRA_PATH));
- Uri shareUri = FileProvider.getUriForFile(this, FILE_PROVIDER, shareFile);
+ Uri shareUri = Uri.parse(intent.getStringExtra(EXTRA_PATH));
Intent shareIntent = new Intent(Intent.ACTION_SEND)
.setType("video/mp4")
@@ -229,20 +189,18 @@ public class RecordingService extends Service {
// Close quick shade
sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
- File file = new File(intent.getStringExtra(EXTRA_PATH));
- if (file.delete()) {
- Toast.makeText(
- this,
- R.string.screenrecord_delete_description,
- Toast.LENGTH_LONG).show();
+ ContentResolver resolver = getContentResolver();
+ Uri uri = Uri.parse(intent.getStringExtra(EXTRA_PATH));
+ resolver.delete(uri, null, null);
- // Remove notification
- notificationManager.cancel(NOTIFICATION_ID);
- } else {
- Log.e(TAG, "Error deleting screen recording!");
- Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG)
- .show();
- }
+ Toast.makeText(
+ this,
+ R.string.screenrecord_delete_description,
+ Toast.LENGTH_LONG).show();
+
+ // Remove notification
+ notificationManager.cancel(NOTIFICATION_ID);
+ Log.d(TAG, "Deleted recording " + uri);
break;
}
return Service.START_STICKY;
@@ -313,6 +271,7 @@ public class RecordingService extends Service {
mMediaRecorder.start();
} catch (IOException e) {
+ Log.e(TAG, "Error starting screen recording: " + e.getMessage());
e.printStackTrace();
throw new RuntimeException(e);
}
@@ -370,9 +329,7 @@ public class RecordingService extends Service {
notificationManager.notify(NOTIFICATION_ID, mRecordingNotificationBuilder.build());
}
- private Notification createSaveNotification(Uri uri, Path path) {
- Log.d(TAG, "Screen recording saved to " + uri.toString() + ", " + path.toString());
-
+ private Notification createSaveNotification(Uri uri) {
Intent viewIntent = new Intent(Intent.ACTION_VIEW)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION)
.setDataAndType(uri, "video/mp4");
@@ -411,8 +368,15 @@ public class RecordingService extends Service {
.setAutoCancel(true);
// Add thumbnail if available
- Bitmap thumbnailBitmap = ThumbnailUtils.createVideoThumbnail(path.toString(),
- MediaStore.Video.Thumbnails.MINI_KIND);
+ Bitmap thumbnailBitmap = null;
+ try {
+ ContentResolver resolver = getContentResolver();
+ Size size = Point.convert(MediaStore.ThumbnailConstants.MINI_SIZE);
+ thumbnailBitmap = resolver.loadThumbnail(uri, size, null);
+ } catch (IOException e) {
+ Log.e(TAG, "Error creating thumbnail: " + e.getMessage());
+ e.printStackTrace();
+ }
if (thumbnailBitmap != null) {
Notification.BigPictureStyle pictureStyle = new Notification.BigPictureStyle()
.bigPicture(thumbnailBitmap)
@@ -434,6 +398,38 @@ public class RecordingService extends Service {
stopSelf();
}
+ private void saveRecording(NotificationManager notificationManager) {
+ String fileName = new SimpleDateFormat("'screen-'yyyyMMdd-HHmmss'.mp4'")
+ .format(new Date());
+
+ ContentValues values = new ContentValues();
+ values.put(MediaStore.Video.Media.DISPLAY_NAME, fileName);
+ values.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
+ values.put(MediaStore.Video.Media.DATE_ADDED, System.currentTimeMillis());
+ values.put(MediaStore.Video.Media.DATE_TAKEN, System.currentTimeMillis());
+
+ ContentResolver resolver = getContentResolver();
+ Uri collectionUri = MediaStore.Video.Media.getContentUri(
+ MediaStore.VOLUME_EXTERNAL_PRIMARY);
+ Uri itemUri = resolver.insert(collectionUri, values);
+
+ try {
+ // Add to the mediastore
+ OutputStream os = resolver.openOutputStream(itemUri, "w");
+ Files.copy(mTempFile.toPath(), os);
+ os.close();
+
+ Notification notification = createSaveNotification(itemUri);
+ notificationManager.notify(NOTIFICATION_ID, notification);
+
+ mTempFile.delete();
+ } catch (IOException e) {
+ Log.e(TAG, "Error saving screen recording: " + e.getMessage());
+ Toast.makeText(this, R.string.screenrecord_delete_error, Toast.LENGTH_LONG)
+ .show();
+ }
+ }
+
private void setTapsVisible(boolean turnOn) {
int value = turnOn ? 1 : 0;
Settings.System.putInt(getApplicationContext().getContentResolver(),
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
index 6a7477945cdd..3314e67857e2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/EdgeBackGestureHandler.java
@@ -34,6 +34,7 @@ import android.os.SystemClock;
import android.os.SystemProperties;
import android.util.Log;
import android.util.MathUtils;
+import android.util.StatsLog;
import android.view.Gravity;
import android.view.IPinnedStackController;
import android.view.IPinnedStackListener;
@@ -107,7 +108,11 @@ public class EdgeBackGestureHandler implements DisplayListener {
public void onSystemGestureExclusionChanged(int displayId,
Region systemGestureExclusion, Region unrestrictedOrNull) {
if (displayId == mDisplayId) {
- mMainExecutor.execute(() -> mExcludeRegion.set(systemGestureExclusion));
+ mMainExecutor.execute(() -> {
+ mExcludeRegion.set(systemGestureExclusion);
+ mUnrestrictedExcludeRegion.set(unrestrictedOrNull != null
+ ? unrestrictedOrNull : systemGestureExclusion);
+ });
}
}
};
@@ -121,6 +126,8 @@ public class EdgeBackGestureHandler implements DisplayListener {
private final Executor mMainExecutor;
private final Region mExcludeRegion = new Region();
+ private final Region mUnrestrictedExcludeRegion = new Region();
+
// The edge width where touch down is allowed
private int mEdgeWidth;
// The slop to distinguish between horizontal and vertical motion
@@ -139,6 +146,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
private final PointF mDownPoint = new PointF();
private boolean mThresholdCrossed = false;
private boolean mAllowGesture = false;
+ private boolean mInRejectedExclusion = false;
private boolean mIsOnLeftEdge;
private int mImeHeight = 0;
@@ -297,6 +305,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
return mSamplingRect;
}
});
+ mRegionSamplingHelper.setWindowVisible(true);
}
}
@@ -318,6 +327,12 @@ public class EdgeBackGestureHandler implements DisplayListener {
if (isInExcludedRegion) {
mOverviewProxyService.notifyBackAction(false /* completed */, -1, -1,
false /* isButton */, !mIsOnLeftEdge);
+ StatsLog.write(StatsLog.BACK_GESTURE_REPORTED_REPORTED,
+ StatsLog.BACK_GESTURE__TYPE__INCOMPLETE_EXCLUDED, y,
+ mIsOnLeftEdge ? StatsLog.BACK_GESTURE__X_LOCATION__LEFT :
+ StatsLog.BACK_GESTURE__X_LOCATION__RIGHT);
+ } else {
+ mInRejectedExclusion = mUnrestrictedExcludeRegion.contains(x, y);
}
return !isInExcludedRegion;
}
@@ -325,6 +340,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
private void cancelGesture(MotionEvent ev) {
// Send action cancel to reset all the touch events
mAllowGesture = false;
+ mInRejectedExclusion = false;
MotionEvent cancelEv = MotionEvent.obtain(ev);
cancelEv.setAction(MotionEvent.ACTION_CANCEL);
mEdgePanel.handleTouch(cancelEv);
@@ -338,6 +354,7 @@ public class EdgeBackGestureHandler implements DisplayListener {
// either the bouncer is showing or the notification panel is hidden
int stateFlags = mOverviewProxyService.getSystemUiStateFlags();
mIsOnLeftEdge = ev.getX() <= mEdgeWidth + mLeftInset;
+ mInRejectedExclusion = false;
mAllowGesture = !QuickStepContract.isBackGestureDisabled(stateFlags)
&& isWithinTouchRegion((int) ev.getX(), (int) ev.getY());
if (mAllowGesture) {
@@ -392,6 +409,14 @@ public class EdgeBackGestureHandler implements DisplayListener {
}
mOverviewProxyService.notifyBackAction(performAction, (int) mDownPoint.x,
(int) mDownPoint.y, false /* isButton */, !mIsOnLeftEdge);
+ int backtype = performAction ? (mInRejectedExclusion
+ ? StatsLog.BACK_GESTURE__TYPE__COMPLETED_REJECTED :
+ StatsLog.BACK_GESTURE__TYPE__COMPLETED) :
+ StatsLog.BACK_GESTURE__TYPE__INCOMPLETE;
+ StatsLog.write(StatsLog.BACK_GESTURE_REPORTED_REPORTED, backtype,
+ (int) mDownPoint.y, mIsOnLeftEdge
+ ? StatsLog.BACK_GESTURE__X_LOCATION__LEFT :
+ StatsLog.BACK_GESTURE__X_LOCATION__RIGHT);
}
if (isUp || action == MotionEvent.ACTION_CANCEL) {
mRegionSamplingHelper.stop();
@@ -463,7 +488,9 @@ public class EdgeBackGestureHandler implements DisplayListener {
pw.println("EdgeBackGestureHandler:");
pw.println(" mIsEnabled=" + mIsEnabled);
pw.println(" mAllowGesture=" + mAllowGesture);
+ pw.println(" mInRejectedExclusion" + mInRejectedExclusion);
pw.println(" mExcludeRegion=" + mExcludeRegion);
+ pw.println(" mUnrestrictedExcludeRegion=" + mUnrestrictedExcludeRegion);
pw.println(" mImeHeight=" + mImeHeight);
pw.println(" mIsAttached=" + mIsAttached);
pw.println(" mEdgeWidth=" + mEdgeWidth);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java
deleted file mode 100644
index 8bb8ca2550e3..000000000000
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavBarTintController.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT 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.phone;
-
-import static android.view.Display.DEFAULT_DISPLAY;
-import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.os.Handler;
-import android.view.CompositionSamplingListener;
-import android.view.View;
-
-import com.android.systemui.R;
-import com.android.systemui.shared.system.QuickStepContract;
-
-import java.io.PrintWriter;
-
-/**
- * Updates the nav bar tint based on the color of the content behind the nav bar.
- */
-public class NavBarTintController implements View.OnAttachStateChangeListener,
- View.OnLayoutChangeListener {
-
- public static final int MIN_COLOR_ADAPT_TRANSITION_TIME = 400;
- public static final int DEFAULT_COLOR_ADAPT_TRANSITION_TIME = 1700;
-
- private final Handler mHandler = new Handler();
- private final NavigationBarView mNavigationBarView;
- private final LightBarTransitionsController mLightBarController;
- private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
- private boolean mWindowVisible;
-
- private final CompositionSamplingListener mSamplingListener;
- private final Runnable mUpdateSamplingListener = this::updateSamplingListener;
- private final Rect mSamplingBounds = new Rect();
- private boolean mSamplingEnabled = false;
- private boolean mSamplingListenerRegistered = false;
-
- private float mLastMedianLuma;
- private float mCurrentMedianLuma;
- private boolean mUpdateOnNextDraw;
-
- private final int mNavBarHeight;
- private final int mNavColorSampleMargin;
-
- // Passing the threshold of this luminance value will make the button black otherwise white
- private final float mLuminanceThreshold;
- private final float mLuminanceChangeThreshold;
-
- public NavBarTintController(NavigationBarView navigationBarView,
- LightBarTransitionsController lightBarController) {
- mSamplingListener = new CompositionSamplingListener(
- navigationBarView.getContext().getMainExecutor()) {
- @Override
- public void onSampleCollected(float medianLuma) {
- updateTint(medianLuma);
- }
- };
- mNavigationBarView = navigationBarView;
- mNavigationBarView.addOnAttachStateChangeListener(this);
- mNavigationBarView.addOnLayoutChangeListener(this);
- mLightBarController = lightBarController;
-
- final Resources res = navigationBarView.getResources();
- mNavBarHeight = res.getDimensionPixelSize(R.dimen.navigation_bar_height);
- mNavColorSampleMargin =
- res.getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
- mLuminanceThreshold = res.getFloat(R.dimen.navigation_luminance_threshold);
- mLuminanceChangeThreshold = res.getFloat(R.dimen.navigation_luminance_change_threshold);
- }
-
- void onDraw() {
- if (mUpdateOnNextDraw) {
- mUpdateOnNextDraw = false;
- requestUpdateSamplingListener();
- }
- }
-
- void start() {
- if (!isEnabled(mNavigationBarView.getContext(), mNavBarMode)) {
- return;
- }
- mSamplingEnabled = true;
- // Defer calling updateSamplingListener since we may have just reinflated prior to this
- requestUpdateSamplingListener();
- }
-
- void stop() {
- mSamplingEnabled = false;
- requestUpdateSamplingListener();
- }
-
- @Override
- public void onViewAttachedToWindow(View view) {
- requestUpdateSamplingListener();
- }
-
- @Override
- public void onViewDetachedFromWindow(View view) {
- // Defer calling updateSamplingListener the attach info has not yet been reset
- requestUpdateSamplingListener();
- }
-
- @Override
- public void onLayoutChange(View v, int left, int top, int right, int bottom,
- int oldLeft, int oldTop, int oldRight, int oldBottom) {
- mSamplingBounds.setEmpty();
- // TODO: Extend this to 2/3 button layout as well
- View view = mNavigationBarView.getHomeHandle().getCurrentView();
- if (view != null) {
- int[] pos = new int[2];
- view.getLocationOnScreen(pos);
- Point displaySize = new Point();
- view.getContext().getDisplay().getRealSize(displaySize);
- final Rect samplingBounds = new Rect(pos[0] - mNavColorSampleMargin,
- displaySize.y - mNavBarHeight, pos[0] + view.getWidth() + mNavColorSampleMargin,
- displaySize.y);
- if (!samplingBounds.equals(mSamplingBounds)) {
- mSamplingBounds.set(samplingBounds);
- requestUpdateSamplingListener();
- }
- }
- }
-
- private void requestUpdateSamplingListener() {
- mHandler.removeCallbacks(mUpdateSamplingListener);
- mHandler.post(mUpdateSamplingListener);
- }
-
- private void updateSamplingListener() {
- if (mSamplingListenerRegistered) {
- mSamplingListenerRegistered = false;
- CompositionSamplingListener.unregister(mSamplingListener);
- }
- if (mSamplingEnabled && mWindowVisible && !mSamplingBounds.isEmpty()
- && mNavigationBarView.isAttachedToWindow()) {
- if (!mNavigationBarView.getViewRootImpl().getSurfaceControl().isValid()) {
- // The view may still be attached, but the surface backing the window can be
- // destroyed, so wait until the next draw to update the listener again
- mUpdateOnNextDraw = true;
- return;
- }
- mSamplingListenerRegistered = true;
- CompositionSamplingListener.register(mSamplingListener, DEFAULT_DISPLAY,
- mNavigationBarView.getViewRootImpl().getSurfaceControl(),
- mSamplingBounds);
- }
- }
-
- private void updateTint(float medianLuma) {
- mLastMedianLuma = medianLuma;
-
- // If the difference between the new luma and the current luma is larger than threshold
- // then apply the current luma, this is to prevent small changes causing colors to flicker
- if (Math.abs(mCurrentMedianLuma - mLastMedianLuma) > mLuminanceChangeThreshold) {
- if (medianLuma > mLuminanceThreshold) {
- // Black
- mLightBarController.setIconsDark(true /* dark */, true /* animate */);
- } else {
- // White
- mLightBarController.setIconsDark(false /* dark */, true /* animate */);
- }
- mCurrentMedianLuma = medianLuma;
- }
- }
-
- public void setWindowVisible(boolean visible) {
- mWindowVisible = visible;
- requestUpdateSamplingListener();
- }
-
- public void onNavigationModeChanged(int mode) {
- mNavBarMode = mode;
- }
-
- void dump(PrintWriter pw) {
- pw.println("NavBarTintController:");
- pw.println(" navBar isAttached: " + mNavigationBarView.isAttachedToWindow());
- pw.println(" navBar isScValid: " + (mNavigationBarView.isAttachedToWindow()
- ? mNavigationBarView.getViewRootImpl().getSurfaceControl().isValid()
- : "false"));
- pw.println(" mSamplingListenerRegistered: " + mSamplingListenerRegistered);
- pw.println(" mSamplingBounds: " + mSamplingBounds);
- pw.println(" mLastMedianLuma: " + mLastMedianLuma);
- pw.println(" mCurrentMedianLuma: " + mCurrentMedianLuma);
- pw.println(" mWindowVisible: " + mWindowVisible);
- }
-
- public static boolean isEnabled(Context context, int navBarMode) {
- return context.getDisplayId() == DEFAULT_DISPLAY
- && QuickStepContract.isGesturalMode(navBarMode);
- }
-}
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 e9731c521308..5d3f3ac52395 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -1063,16 +1063,7 @@ public class NavigationBarFragment extends LifecycleFragment implements Callback
if (Intent.ACTION_SCREEN_OFF.equals(action)
|| Intent.ACTION_SCREEN_ON.equals(action)) {
notifyNavigationBarScreenOn();
-
- if (Intent.ACTION_SCREEN_ON.equals(action)) {
- // Enabled and screen is on, start it again if enabled
- if (NavBarTintController.isEnabled(getContext(), mNavBarMode)) {
- mNavigationBarView.getTintController().start();
- }
- } else {
- // Screen off disable it
- mNavigationBarView.getTintController().stop();
- }
+ mNavigationBarView.onScreenStateChanged(Intent.ACTION_SCREEN_ON.equals(action));
}
if (Intent.ACTION_USER_SWITCHED.equals(action)) {
// The accessibility settings may be different for the new user
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
index 23cc0fc51ec0..3b590315a5ca 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarTransitions.java
@@ -18,8 +18,7 @@ package com.android.systemui.statusbar.phone;
import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
-import static com.android.systemui.statusbar.phone.NavBarTintController.DEFAULT_COLOR_ADAPT_TRANSITION_TIME;
-import static com.android.systemui.statusbar.phone.NavBarTintController.MIN_COLOR_ADAPT_TRANSITION_TIME;
+import static com.android.systemui.util.Utils.isGesturalModeOnDefaultDisplay;
import android.content.Context;
import android.graphics.Rect;
@@ -42,6 +41,9 @@ import java.util.List;
public final class NavigationBarTransitions extends BarTransitions implements
LightBarTransitionsController.DarkIntensityApplier {
+ public static final int MIN_COLOR_ADAPT_TRANSITION_TIME = 400;
+ public static final int DEFAULT_COLOR_ADAPT_TRANSITION_TIME = 1700;
+
/**
* Notified when the color of nav bar elements changes.
*/
@@ -124,7 +126,7 @@ public final class NavigationBarTransitions extends BarTransitions implements
@Override
public void setAutoDim(boolean autoDim) {
// Ensure we aren't in gestural nav if we are triggering auto dim
- if (autoDim && NavBarTintController.isEnabled(mView.getContext(), mNavBarMode)) return;
+ if (autoDim && isGesturalModeOnDefaultDisplay(mView.getContext(), mNavBarMode)) return;
if (mAutoDim == autoDim) return;
mAutoDim = autoDim;
applyLightsOut(true, false);
@@ -201,7 +203,7 @@ public final class NavigationBarTransitions extends BarTransitions implements
@Override
public int getTintAnimationDuration() {
- if (NavBarTintController.isEnabled(mView.getContext(), mNavBarMode)) {
+ if (isGesturalModeOnDefaultDisplay(mView.getContext(), mNavBarMode)) {
return Math.max(DEFAULT_COLOR_ADAPT_TRANSITION_TIME, MIN_COLOR_ADAPT_TRANSITION_TIME);
}
return LightBarTransitionsController.DEFAULT_TINT_ANIMATION_DURATION;
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 f689a3eadf58..fdee278e76ac 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -16,8 +16,6 @@
package com.android.systemui.statusbar.phone;
-import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_3BUTTON;
-
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_NOTIFICATION_PANEL_EXPANDED;
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_OVERVIEW_DISABLED;
@@ -26,6 +24,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_S
import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SEARCH_DISABLED;
import static com.android.systemui.shared.system.QuickStepContract.isGesturalMode;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
+import static com.android.systemui.util.Utils.isGesturalModeOnDefaultDisplay;
import android.animation.LayoutTransition;
import android.animation.LayoutTransition.TransitionListener;
@@ -89,6 +88,8 @@ public class NavigationBarView extends FrameLayout implements
final static boolean SLIPPERY_WHEN_DISABLED = true;
final static boolean ALTERNATE_CAR_MODE_UI = false;
+ private final RegionSamplingHelper mRegionSamplingHelper;
+ private final int mNavColorSampleMargin;
View mCurrentView = null;
private View mVertical;
@@ -101,7 +102,7 @@ public class NavigationBarView extends FrameLayout implements
boolean mLongClickableAccessibilityButton;
int mDisabledFlags = 0;
int mNavigationIconHints = 0;
- private int mNavBarMode = NAV_BAR_MODE_3BUTTON;
+ private int mNavBarMode;
private Rect mHomeButtonBounds = new Rect();
private Rect mBackButtonBounds = new Rect();
@@ -143,14 +144,13 @@ public class NavigationBarView extends FrameLayout implements
private FloatingRotationButton mFloatingRotationButton;
private RotationButtonController mRotationButtonController;
- private NavBarTintController mTintController;
-
/**
* 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 Rect mSamplingBounds = new Rect();
private class NavTransitionListener implements TransitionListener {
private boolean mBackTransitioning;
@@ -305,12 +305,30 @@ public class NavigationBarView extends FrameLayout implements
mButtonDispatchers.put(R.id.menu_container, mContextualButtonGroup);
mDeadZone = new DeadZone(this);
- mEdgeBackGestureHandler = new EdgeBackGestureHandler(context, mOverviewProxyService);
- mTintController = new NavBarTintController(this, getLightTransitionsController());
- }
+ mNavColorSampleMargin =
+ getResources()
+ .getDimensionPixelSize(R.dimen.navigation_handle_sample_horizontal_margin);
- public NavBarTintController getTintController() {
- return mTintController;
+ mEdgeBackGestureHandler = new EdgeBackGestureHandler(context, mOverviewProxyService);
+ mRegionSamplingHelper = new RegionSamplingHelper(this,
+ new RegionSamplingHelper.SamplingCallback() {
+ @Override
+ public void onRegionDarknessChanged(boolean isRegionDark) {
+ getLightTransitionsController().setIconsDark(!isRegionDark ,
+ true /* animate */);
+ }
+
+ @Override
+ public Rect getSampledRegion(View sampledView) {
+ updateSamplingRect();
+ return mSamplingBounds;
+ }
+
+ @Override
+ public boolean isSamplingEnabled() {
+ return isGesturalModeOnDefaultDisplay(getContext(), mNavBarMode);
+ }
+ });
}
public NavigationBarTransitions getBarTransitions() {
@@ -326,12 +344,6 @@ public class NavigationBarView extends FrameLayout implements
updatePanelSystemUiStateFlags();
}
- @Override
- protected void dispatchDraw(Canvas canvas) {
- super.dispatchDraw(canvas);
- mTintController.onDraw();
- }
-
public void setOnVerticalChangedListener(OnVerticalChangedListener onVerticalChangedListener) {
mOnVerticalChangedListener = onVerticalChangedListener;
notifyVerticalChangedListener(mIsVertical);
@@ -352,10 +364,10 @@ public class NavigationBarView extends FrameLayout implements
if (newMode == MODE_OPAQUE) {
// If the nav bar background is opaque, stop auto tinting since we know the icons are
// showing over a dark background
- mTintController.stop();
+ mRegionSamplingHelper.stop();
getLightTransitionsController().setIconsDark(false /* dark */, true /* animate */);
} else {
- mTintController.start();
+ mRegionSamplingHelper.start(mSamplingBounds);
}
}
@@ -535,8 +547,19 @@ public class NavigationBarView extends FrameLayout implements
return KeyButtonDrawable.create(mContext, icon, hasShadow);
}
+ /** To be called when screen lock/unlock state changes */
+ public void onScreenStateChanged(boolean isScreenOn) {
+ if (isScreenOn) {
+ if (isGesturalModeOnDefaultDisplay(getContext(), mNavBarMode)) {
+ mRegionSamplingHelper.start(mSamplingBounds);
+ }
+ } else {
+ mRegionSamplingHelper.stop();
+ }
+ }
+
public void setWindowVisible(boolean visible) {
- mTintController.setWindowVisible(visible);
+ mRegionSamplingHelper.setWindowVisible(visible);
mRotationButtonController.onNavigationBarWindowVisibilityChange(visible);
}
@@ -799,13 +822,7 @@ public class NavigationBarView extends FrameLayout implements
mRecentsOnboarding.onNavigationModeChanged(mNavBarMode);
getRotateSuggestionButton().onNavigationModeChanged(mNavBarMode);
- // Color adaption is tied with showing home handle, only avaliable if visible
- mTintController.onNavigationModeChanged(mNavBarMode);
- if (isGesturalMode(mNavBarMode)) {
- mTintController.start();
- } else {
- mTintController.stop();
- }
+ mRegionSamplingHelper.start(mSamplingBounds);
}
public void setAccessibilityButtonState(final boolean visible, final boolean longClickable) {
@@ -836,6 +853,24 @@ public class NavigationBarView extends FrameLayout implements
super.onDraw(canvas);
}
+ private void updateSamplingRect() {
+ mSamplingBounds.setEmpty();
+ // TODO: Extend this to 2/3 button layout as well
+ View view = getHomeHandle().getCurrentView();
+
+ if (view != null) {
+ int[] pos = new int[2];
+ view.getLocationOnScreen(pos);
+ Point displaySize = new Point();
+ view.getContext().getDisplay().getRealSize(displaySize);
+ final Rect samplingBounds = new Rect(pos[0] - mNavColorSampleMargin,
+ displaySize.y - getNavBarHeight(),
+ pos[0] + view.getWidth() + mNavColorSampleMargin,
+ displaySize.y);
+ mSamplingBounds.set(samplingBounds);
+ }
+ }
+
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
@@ -984,6 +1019,14 @@ public class NavigationBarView extends FrameLayout implements
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
+ private int getNavBarHeight() {
+ return mIsVertical
+ ? getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.navigation_bar_height_landscape)
+ : getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.navigation_bar_height);
+ }
+
private void notifyVerticalChangedListener(boolean newVertical) {
if (mOnVerticalChangedListener != null) {
mOnVerticalChangedListener.onVerticalChanged(newVertical);
@@ -1130,7 +1173,7 @@ public class NavigationBarView extends FrameLayout implements
mContextualButtonGroup.dump(pw);
mRecentsOnboarding.dump(pw);
- mTintController.dump(pw);
+ mRegionSamplingHelper.dump(pw);
mEdgeBackGestureHandler.dump(pw);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
index 9988c85361bb..5d8044f37c38 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationPrototypeController.java
@@ -16,7 +16,7 @@
package com.android.systemui.statusbar.phone;
-import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL;
+import static android.view.Display.DEFAULT_DISPLAY;
import android.annotation.IntDef;
import android.content.ComponentCallbacks;
@@ -29,8 +29,6 @@ import android.net.Uri;
import android.os.Handler;
import android.provider.Settings;
-import com.android.systemui.shared.system.QuickStepContract;
-
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -120,8 +118,7 @@ public class NavigationPrototypeController extends ContentObserver implements Co
} else if (path.endsWith(HIDE_HOME_BUTTON_SETTING)) {
mListener.onHomeButtonVisibilityChanged(!hideHomeButton());
} else if (path.endsWith(NAV_COLOR_ADAPT_ENABLE_SETTING)) {
- mListener.onColorAdaptChanged(
- NavBarTintController.isEnabled(mContext, NAV_BAR_MODE_GESTURAL));
+ mListener.onColorAdaptChanged(mContext.getDisplayId() == DEFAULT_DISPLAY);
} else if (path.endsWith(SHOW_HOME_HANDLE_SETTING)) {
mListener.onHomeHandleVisiblilityChanged(showHomeHandle());
} else if (path.endsWith(ENABLE_ASSISTANT_GESTURE)) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
index 8026f654414c..c1ff572bb210 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/RegionSamplingHelper.java
@@ -29,6 +29,8 @@ import android.view.ViewTreeObserver;
import com.android.systemui.R;
+import java.io.PrintWriter;
+
/**
* A helper class to sample regions on the screen and inspect its luminosity.
*/
@@ -62,6 +64,7 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener,
private final float mLuminanceThreshold;
private final float mLuminanceChangeThreshold;
private boolean mFirstSamplingAfterStart;
+ private boolean mWindowVisible;
private SurfaceControl mRegisteredStopLayer = null;
private ViewTreeObserver.OnDrawListener mUpdateOnDraw = new ViewTreeObserver.OnDrawListener() {
@Override
@@ -148,7 +151,9 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener,
}
private void updateSamplingListener() {
- boolean isSamplingEnabled = mSamplingEnabled && !mSamplingRequestBounds.isEmpty()
+ boolean isSamplingEnabled = mSamplingEnabled
+ && !mSamplingRequestBounds.isEmpty()
+ && mWindowVisible
&& (mSampledView.isAttachedToWindow() || mFirstSamplingAfterStart);
if (isSamplingEnabled) {
ViewRootImpl viewRootImpl = mSampledView.getViewRootImpl();
@@ -216,6 +221,24 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener,
}
}
+ void setWindowVisible(boolean visible) {
+ mWindowVisible = visible;
+ updateSamplingListener();
+ }
+
+ void dump(PrintWriter pw) {
+ pw.println("RegionSamplingHelper:");
+ pw.println(" sampleView isAttached: " + mSampledView.isAttachedToWindow());
+ pw.println(" sampleView isScValid: " + (mSampledView.isAttachedToWindow()
+ ? mSampledView.getViewRootImpl().getSurfaceControl().isValid()
+ : "false"));
+ pw.println(" mSamplingListenerRegistered: " + mSamplingListenerRegistered);
+ pw.println(" mSamplingRequestBounds: " + mSamplingRequestBounds);
+ pw.println(" mLastMedianLuma: " + mLastMedianLuma);
+ pw.println(" mCurrentMedianLuma: " + mCurrentMedianLuma);
+ pw.println(" mWindowVisible: " + mWindowVisible);
+ }
+
public interface SamplingCallback {
/**
* Called when the darkness of the sampled region changes
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 b12bf5c39970..a7262cfcfefb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -47,6 +47,7 @@ import com.android.systemui.R;
import com.android.systemui.colorextraction.SysuiColorExtractor;
import com.android.systemui.statusbar.ScrimView;
import com.android.systemui.statusbar.notification.stack.ViewState;
+import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.util.AlarmTimeout;
import com.android.systemui.util.wakelock.DelayedWakeLock;
import com.android.systemui.util.wakelock.WakeLock;
@@ -177,7 +178,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
TriConsumer<ScrimState, Float, GradientColors> scrimStateListener,
Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
- AlarmManager alarmManager) {
+ AlarmManager alarmManager, KeyguardMonitor keyguardMonitor) {
mScrimBehind = scrimBehind;
mScrimInFront = scrimInFront;
mScrimStateListener = scrimStateListener;
@@ -197,6 +198,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
// to make sure that text on top of it is legible.
mScrimBehindAlpha = mScrimBehindAlphaResValue;
mDozeParameters = dozeParameters;
+ keyguardMonitor.addCallback(new KeyguardMonitor.Callback() {
+ @Override
+ public void onKeyguardFadingAwayChanged() {
+ setKeyguardFadingAway(keyguardMonitor.isKeyguardFadingAway(),
+ keyguardMonitor.getKeyguardFadingAwayDuration());
+ }
+ });
mColorExtractor = Dependency.get(SysuiColorExtractor.class);
mColorExtractor.addOnColorsChangedListener(this);
@@ -948,9 +956,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo
}
}
- public void setUnlockIsFading(boolean unlockFading) {
+ private void setKeyguardFadingAway(boolean fadingAway, long duration) {
for (ScrimState state : ScrimState.values()) {
- state.setUnlockIsFading(unlockFading);
+ state.setKeyguardFadingAway(fadingAway, duration);
}
}
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 b45914b2e83d..9fdd3b88e9d0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java
@@ -156,8 +156,8 @@ public enum ScrimState {
public void prepare(ScrimState previousState) {
mCurrentBehindAlpha = 0;
mCurrentInFrontAlpha = 0;
- mAnimationDuration = mUnlockIsFading
- ? KeyguardBypassController.BYPASS_PANEL_FADE_DURATION
+ mAnimationDuration = mKeyguardFadingAway
+ ? mKeyguardFadingAwayDuration
: StatusBar.FADE_KEYGUARD_DURATION;
mAnimateChange = !mLaunchingAffordanceWithPreview;
@@ -209,7 +209,8 @@ public enum ScrimState {
boolean mHasBackdrop;
boolean mLaunchingAffordanceWithPreview;
boolean mWakeLockScreenSensorActive;
- boolean mUnlockIsFading;
+ boolean mKeyguardFadingAway;
+ long mKeyguardFadingAwayDuration;
ScrimState(int index) {
mIndex = index;
@@ -298,7 +299,8 @@ public enum ScrimState {
mWakeLockScreenSensorActive = active;
}
- public void setUnlockIsFading(boolean unlockIsFading) {
- mUnlockIsFading = unlockIsFading;
+ public void setKeyguardFadingAway(boolean fadingAway, long duration) {
+ mKeyguardFadingAway = fadingAway;
+ mKeyguardFadingAwayDuration = duration;
}
} \ No newline at end of file
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 90aba879f510..f158ca1eaf5b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -948,7 +948,8 @@ public class StatusBar extends SystemUI implements DemoMode,
mStatusBarWindow.onScrimVisibilityChanged(scrimsVisible);
}
}, DozeParameters.getInstance(mContext),
- mContext.getSystemService(AlarmManager.class));
+ mContext.getSystemService(AlarmManager.class),
+ mKeyguardMonitor);
mNotificationPanel.initDependencies(this, mGroupManager, mNotificationShelf,
mHeadsUpManager, mNotificationIconAreaController, mScrimController);
mDozeScrimController = new DozeScrimController(DozeParameters.getInstance(context));
@@ -3874,7 +3875,6 @@ public class StatusBar extends SystemUI implements DemoMode,
public void notifyBiometricAuthModeChanged() {
updateDozing();
- mScrimController.setUnlockIsFading(mBiometricUnlockController.isUnlockFading());
updateScrimController();
mStatusBarWindow.onBiometricAuthModeChanged(mBiometricUnlockController.isWakeAndUnlock(),
mBiometricUnlockController.isBiometricUnlock());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java
index 070136ec94c1..e1ef809a883c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitor.java
@@ -76,7 +76,7 @@ public interface KeyguardMonitor extends CallbackController<Callback> {
}
interface Callback {
- void onKeyguardShowingChanged();
+ default void onKeyguardShowingChanged() {}
default void onKeyguardFadingAwayChanged() {}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
index 8829be4ee0f8..87ed14a9eeec 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java
@@ -142,10 +142,10 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback
}
public void notifyKeyguardFadingAway(long delay, long fadeoutDuration, boolean isBypassFading) {
- setKeyguardFadingAway(true);
mKeyguardFadingAwayDelay = delay;
mKeyguardFadingAwayDuration = fadeoutDuration;
mBypassFadingAnimation = isBypassFading;
+ setKeyguardFadingAway(true);
}
private void setKeyguardFadingAway(boolean keyguardFadingAway) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index 45627631efe1..e75365e66f81 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -216,10 +216,14 @@ public class MobileSignalController extends SignalController<
MobileIconGroup hGroup = TelephonyIcons.THREE_G;
MobileIconGroup hPlusGroup = TelephonyIcons.THREE_G;
- if (mConfig.hspaDataDistinguishable) {
+ if (mConfig.show4gFor3g) {
+ hGroup = TelephonyIcons.FOUR_G;
+ hPlusGroup = TelephonyIcons.FOUR_G;
+ } else if (mConfig.hspaDataDistinguishable) {
hGroup = TelephonyIcons.H;
hPlusGroup = TelephonyIcons.H_PLUS;
}
+
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSDPA, hGroup);
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSUPA, hGroup);
mNetworkToIconLookup.put(TelephonyManager.NETWORK_TYPE_HSPA, hGroup);
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 b338f511dda8..04f96a46bbf7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -1118,6 +1118,7 @@ public class NetworkControllerImpl extends BroadcastReceiver
Map<Integer, MobileIconGroup> nr5GIconMap = new HashMap<>();
boolean showAtLeast3G = false;
+ boolean show4gFor3g = false;
boolean alwaysShowCdmaRssi = false;
boolean show4gForLte = false;
boolean hideLtePlus = false;
@@ -1162,6 +1163,8 @@ public class NetworkControllerImpl extends BroadcastReceiver
CarrierConfigManager.KEY_ALWAYS_SHOW_DATA_RAT_ICON_BOOL);
config.show4gForLte = b.getBoolean(
CarrierConfigManager.KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL);
+ config.show4gFor3g = b.getBoolean(
+ CarrierConfigManager.KEY_SHOW_4G_FOR_3G_DATA_ICON_BOOL);
config.hideLtePlus = b.getBoolean(
CarrierConfigManager.KEY_HIDE_LTE_PLUS_DATA_ICON_BOOL);
config.patternOfCarrierSpecificDataIcon = b.getString(
diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java
index 1102bb7e690e..92a8d8482e87 100644
--- a/packages/SystemUI/src/com/android/systemui/util/Utils.java
+++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java
@@ -14,12 +14,16 @@
package com.android.systemui.util;
+import static android.view.Display.DEFAULT_DISPLAY;
+
import android.Manifest;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.view.View;
import com.android.systemui.SysUiServiceProvider;
+import com.android.systemui.shared.system.QuickStepContract;
import com.android.systemui.statusbar.CommandQueue;
import java.util.List;
@@ -110,4 +114,14 @@ public class Utils {
return pm.queryIntentActivities(homeIntent, 0).isEmpty();
}
+ /**
+ * Returns {@code true} if the navMode is that of
+ * {@link android.view.WindowManagerPolicyConstants#NAV_BAR_MODE_GESTURAL} AND
+ * the context is that of the default display
+ */
+ public static boolean isGesturalModeOnDefaultDisplay(Context context, int navMode) {
+ return context.getDisplayId() == DEFAULT_DISPLAY
+ && QuickStepContract.isGesturalMode(navMode);
+ }
+
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index 6dfb19ea075a..1e18e51bc079 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -45,11 +45,14 @@ import android.testing.UiThreadTest;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.util.wakelock.WakeLockFake;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -58,6 +61,8 @@ public class DozeMachineTest extends SysuiTestCase {
DozeMachine mMachine;
+ @Mock
+ private WakefulnessLifecycle mWakefulnessLifecycle;
private DozeServiceFake mServiceFake;
private WakeLockFake mWakeLockFake;
private AmbientDisplayConfiguration mConfigMock;
@@ -65,12 +70,13 @@ public class DozeMachineTest extends SysuiTestCase {
@Before
public void setUp() {
+ MockitoAnnotations.initMocks(this);
mServiceFake = new DozeServiceFake();
mWakeLockFake = new WakeLockFake();
mConfigMock = mock(AmbientDisplayConfiguration.class);
mPartMock = mock(DozeMachine.Part.class);
- mMachine = new DozeMachine(mServiceFake, mConfigMock, mWakeLockFake);
+ mMachine = new DozeMachine(mServiceFake, mConfigMock, mWakeLockFake, mWakefulnessLifecycle);
mMachine.setParts(new DozeMachine.Part[]{mPartMock});
}
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 0dbf30881ffe..97ad47ec3f0c 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
@@ -47,6 +47,7 @@ import com.android.internal.colorextraction.ColorExtractor.GradientColors;
import com.android.internal.util.function.TriConsumer;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ScrimView;
+import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.utils.os.FakeHandler;
@@ -96,7 +97,8 @@ public class ScrimControllerTest extends SysuiTestCase {
mScrimBehindAlpha = scrimBehindAlpha;
mScrimInFrontColor = scrimInFrontColor;
},
- visible -> mScrimVisibility = visible, mDozeParamenters, mAlarmManager);
+ visible -> mScrimVisibility = visible, mDozeParamenters, mAlarmManager,
+ mock(KeyguardMonitor.class));
mScrimController.setHasBackdrop(false);
mScrimController.setWallpaperSupportsAmbientMode(false);
mScrimController.transitionTo(ScrimState.KEYGUARD);
@@ -681,9 +683,9 @@ public class ScrimControllerTest extends SysuiTestCase {
SynchronousScrimController(ScrimView scrimBehind, ScrimView scrimInFront,
TriConsumer<ScrimState, Float, GradientColors> scrimStateListener,
Consumer<Integer> scrimVisibleListener, DozeParameters dozeParameters,
- AlarmManager alarmManager) {
+ AlarmManager alarmManager, KeyguardMonitor keyguardMonitor) {
super(scrimBehind, scrimInFront, scrimStateListener, scrimVisibleListener,
- dozeParameters, alarmManager);
+ dozeParameters, alarmManager, keyguardMonitor);
}
@Override
diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
index 6b88f5a9a6d7..135615708037 100644
--- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java
@@ -1186,8 +1186,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
mInvocationHandler.notifySoftKeyboardShowModeChangedLocked(showState);
}
- public void notifyAccessibilityButtonClickedLocked() {
- mInvocationHandler.notifyAccessibilityButtonClickedLocked();
+ public void notifyAccessibilityButtonClickedLocked(int displayId) {
+ mInvocationHandler.notifyAccessibilityButtonClickedLocked(displayId);
}
public void notifyAccessibilityButtonAvailabilityChangedLocked(boolean available) {
@@ -1226,11 +1226,11 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
}
}
- private void notifyAccessibilityButtonClickedInternal() {
+ private void notifyAccessibilityButtonClickedInternal(int displayId) {
final IAccessibilityServiceClient listener = getServiceInterfaceSafely();
if (listener != null) {
try {
- listener.onAccessibilityButtonClicked();
+ listener.onAccessibilityButtonClicked(displayId);
} catch (RemoteException re) {
Slog.e(LOG_TAG, "Error sending accessibility button click to " + mService, re);
}
@@ -1484,7 +1484,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
} break;
case MSG_ON_ACCESSIBILITY_BUTTON_CLICKED: {
- notifyAccessibilityButtonClickedInternal();
+ final int displayId = (int) message.arg1;
+ notifyAccessibilityButtonClickedInternal(displayId);
} break;
case MSG_ON_ACCESSIBILITY_BUTTON_AVAILABILITY_CHANGED: {
@@ -1546,8 +1547,8 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ
mIsSoftKeyboardCallbackEnabled = enabled;
}
- public void notifyAccessibilityButtonClickedLocked() {
- final Message msg = obtainMessage(MSG_ON_ACCESSIBILITY_BUTTON_CLICKED);
+ public void notifyAccessibilityButtonClickedLocked(int displayId) {
+ final Message msg = obtainMessage(MSG_ON_ACCESSIBILITY_BUTTON_CLICKED, displayId, 0);
msg.sendToTarget();
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index b5b3cd2fe530..d058b9a15b41 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1085,9 +1085,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
for (int i = state.mBoundServices.size() - 1; i >= 0; i--) {
final AccessibilityServiceConnection service = state.mBoundServices.get(i);
if (service.mRequestAccessibilityButton) {
- // TODO(b/120762691): Need to notify each accessibility service if
- // accessibility button is clicked per display.
- service.notifyAccessibilityButtonClickedLocked();
+ service.notifyAccessibilityButtonClickedLocked(displayId);
return;
}
}
@@ -1109,9 +1107,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
final AccessibilityServiceConnection service = state.mBoundServices.get(i);
if (service.mRequestAccessibilityButton && (service.mComponentName.equals(
state.mServiceAssignedToAccessibilityButton))) {
- // TODO(b/120762691): Need to notify each accessibility service if
- // accessibility button is clicked per display.
- service.notifyAccessibilityButtonClickedLocked();
+ service.notifyAccessibilityButtonClickedLocked(displayId);
return;
}
}
diff --git a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
index 10c32ee87c13..d8b7e3a25e04 100644
--- a/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/gestures/TouchExplorer.java
@@ -27,8 +27,6 @@ import android.os.Handler;
import android.util.Slog;
import android.view.InputDevice;
import android.view.MotionEvent;
-import android.view.MotionEvent.PointerCoords;
-import android.view.MotionEvent.PointerProperties;
import android.view.ViewConfiguration;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -129,15 +127,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
// Context in which this explorer operates.
private final Context mContext;
- // The long pressing pointer id if coordinate remapping is needed.
- private int mLongPressingPointerId = -1;
-
- // The long pressing pointer X if coordinate remapping is needed.
- private int mLongPressingPointerDeltaX;
-
- // The long pressing pointer Y if coordinate remapping is needed.
- private int mLongPressingPointerDeltaY;
-
/**
* Creates a new instance.
@@ -231,10 +220,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
mGestureDetector.clear();
// Go to initial state.
mState.clear();
- // Clear the long pressing pointer remap data.
- mLongPressingPointerId = -1;
- mLongPressingPointerDeltaX = 0;
- mLongPressingPointerDeltaY = 0;
mAms.onTouchInteractionEnd();
}
@@ -705,17 +690,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
return;
}
case MotionEvent.ACTION_UP: {
- // Offset the event if we are doing a long press as the
- // target is not necessarily under the user's finger.
- if (mLongPressingPointerId >= 0) {
- event = offsetEvent(event, - mLongPressingPointerDeltaX,
- - mLongPressingPointerDeltaY);
- // Clear the long press state.
- mLongPressingPointerId = -1;
- mLongPressingPointerDeltaX = 0;
- mLongPressingPointerDeltaY = 0;
- }
-
// Deliver the event.
sendMotionEvent(event, event.getAction(), ALL_POINTER_ID_BITS, policyFlags);
@@ -865,18 +839,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
} else {
event.setDownTime(mInjectedPointerTracker.getLastInjectedDownEventTime());
}
-
- // If the user is long pressing but the long pressing pointer
- // was not exactly over the accessibility focused item we need
- // to remap the location of that pointer so the user does not
- // have to explicitly touch explore something to be able to
- // long press it, or even worse to avoid the user long pressing
- // on the wrong item since click and long press behave differently.
- if (mLongPressingPointerId >= 0) {
- event = offsetEvent(event, - mLongPressingPointerDeltaX,
- - mLongPressingPointerDeltaY);
- }
-
if (DEBUG) {
Slog.d(LOG_TAG, "Injecting event: " + event + ", policyFlags=0x"
+ Integer.toHexString(policyFlags));
@@ -897,39 +859,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
}
/**
- * Offsets all pointers in the given event by adding the specified X and Y
- * offsets.
- *
- * @param event The event to offset.
- * @param offsetX The X offset.
- * @param offsetY The Y offset.
- * @return An event with the offset pointers or the original event if both
- * offsets are zero.
- */
- private MotionEvent offsetEvent(MotionEvent event, int offsetX, int offsetY) {
- if (offsetX == 0 && offsetY == 0) {
- return event;
- }
- final int remappedIndex = event.findPointerIndex(mLongPressingPointerId);
- final int pointerCount = event.getPointerCount();
- PointerProperties[] props = PointerProperties.createArray(pointerCount);
- PointerCoords[] coords = PointerCoords.createArray(pointerCount);
- for (int i = 0; i < pointerCount; i++) {
- event.getPointerProperties(i, props[i]);
- event.getPointerCoords(i, coords[i]);
- if (i == remappedIndex) {
- coords[i].x += offsetX;
- coords[i].y += offsetY;
- }
- }
- return MotionEvent.obtain(event.getDownTime(),
- event.getEventTime(), event.getAction(), event.getPointerCount(),
- props, coords, event.getMetaState(), event.getButtonState(),
- 1.0f, 1.0f, event.getDeviceId(), event.getEdgeFlags(),
- event.getSource(), event.getDisplayId(), event.getFlags());
- }
-
- /**
* Computes the action for an injected event based on a masked action
* and a pointer index.
*
@@ -1189,9 +1118,6 @@ public class TouchExplorer extends BaseEventStreamTransformation
+ ", mDetermineUserIntentTimeout: " + mDetermineUserIntentTimeout
+ ", mDoubleTapSlop: " + mDoubleTapSlop
+ ", mDraggingPointerId: " + mDraggingPointerId
- + ", mLongPressingPointerId: " + mLongPressingPointerId
- + ", mLongPressingPointerDeltaX: " + mLongPressingPointerDeltaX
- + ", mLongPressingPointerDeltaY: " + mLongPressingPointerDeltaY
+ ", mTempPoint: " + mTempPoint
+ " }";
}
diff --git a/services/art-profile-boot b/services/art-profile-boot
index 23d709099cc0..e09424bc261c 100644
--- a/services/art-profile-boot
+++ b/services/art-profile-boot
@@ -1,326 +1,760 @@
-Lcom/android/server/SystemServer;->run()V
-Lcom/android/server/SystemServer;->main([Ljava/lang/String;)V
-Lcom/android/server/SystemServer;->startBootstrapServices()V
-Lcom/android/server/pm/PackageManagerService;->main(Landroid/content/Context;Lcom/android/server/pm/Installer;ZZ)Lcom/android/server/pm/PackageManagerService;
-Lcom/android/server/pm/PackageManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/Installer;ZZ)V
-Lcom/android/server/pm/Settings;->readLPw(Ljava/util/List;)Z
-Lcom/android/server/pm/Settings;->readPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/appop/AppOpsService;->readUidOps(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/appop/AppOpsService;->readOp(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;Z)V
+Lcom/android/server/appop/AppOpsService$UidState;->evalForegroundOps(Landroid/util/SparseArray;)V
+Lcom/android/server/appop/AppOpsService;->readUid(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
+Lcom/android/server/appop/AppOpsService$Op;->updateProxyState(JILjava/lang/String;)V
+Lcom/android/server/appop/AppOpsService$Op;->accessed(JILjava/lang/String;II)V
+Lcom/android/server/pm/permission/PermissionSettings;->readPermissions(Landroid/util/ArrayMap;Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/pm/permission/BasePermission;-><init>(Ljava/lang/String;Ljava/lang/String;I)V
+Lcom/android/server/pm/permission/BasePermission;->readInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/BasePermission;->readLPw(Ljava/util/Map;Lorg/xmlpull/v1/XmlPullParser;)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->isInstallPermission()Z
+Lcom/android/server/pm/permission/BasePermission;->getName()Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->access$100(Lcom/android/server/pm/permission/PermissionsState$PermissionState;)I
+Lcom/android/server/pm/permission/PermissionsState;->enforceValidUserId(I)V
+Lcom/android/server/pm/permission/PermissionsState;->hasPermission(Ljava/lang/String;I)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->isGranted(I)Z
+Lcom/android/server/pm/permission/BasePermission;->computeGids(I)[I
+Lcom/android/server/pm/permission/PermissionsState;->appendInts([I[I)[I
+Lcom/android/server/pm/permission/PermissionsState;->computeGids(I)[I
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->access$000(Lcom/android/server/pm/permission/PermissionsState$PermissionState;)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->computeGids(I)[I
Lcom/android/server/pm/Settings;->readInstallPermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/permission/PermissionsState;)V
-Lcom/android/server/pm/permission/PermissionsState;->grantPermission(Lcom/android/server/pm/permission/BasePermission;I)I
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->isCompatibleUserId(I)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->isDefault()Z
+Lcom/android/server/pm/permission/PermissionSettings;->getPermissionLocked(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+Lcom/android/server/pm/permission/PermissionSettings;->getPermission(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
Lcom/android/server/pm/permission/PermissionsState;->grantInstallPermission(Lcom/android/server/pm/permission/BasePermission;)I
-Lcom/android/server/-$$Lambda$YWiwiKm_Qgqb55C6tTuq_n2JzdY;->run()V
-Lcom/android/server/pm/PackageSignatures;->readXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/ArrayList;)V
-Lcom/android/server/pm/permission/PermissionsState;->computeGids(I)[I
-Lcom/android/server/am/-$$Lambda$BatteryExternalStatsWorker$ddVY5lmqswnSjXppAxPTOHbuzzQ;->run()V
-Lcom/android/server/SystemServiceManager;->startService(Lcom/android/server/SystemService;)V
-Lcom/android/server/SystemServiceManager;->startService(Ljava/lang/Class;)Lcom/android/server/SystemService;
-Lcom/android/server/SystemServiceManager;->startService(Ljava/lang/String;)Lcom/android/server/SystemService;
-Lcom/android/server/pm/permission/PermissionsState;->hasPermission(Ljava/lang/String;I)Z
-Lcom/android/server/pm/permission/PermissionsState;->hasPermissionRequiringReview(I)Z
-Lcom/android/server/am/ActivityManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
-Lcom/android/server/am/ActivityManagerService;-><init>(Landroid/content/Context;Lcom/android/server/wm/ActivityTaskManagerService;)V
-Lcom/android/server/pm/Settings;->readSharedUserLPw(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/pm/permission/PermissionsState;->updatePermissionFlags(Lcom/android/server/pm/permission/BasePermission;III)Z
+Lcom/android/server/pm/permission/PermissionsState;->grantPermission(Lcom/android/server/pm/permission/BasePermission;I)I
Lcom/android/server/pm/permission/PermissionsState;->ensurePermissionData(Lcom/android/server/pm/permission/BasePermission;)Lcom/android/server/pm/permission/PermissionsState$PermissionData;
-Lcom/android/server/am/BatteryExternalStatsWorker$1;->run()V
-Lcom/android/server/am/BatteryExternalStatsWorker;->updateExternalStatsLocked(Ljava/lang/String;IZZZ)V
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/permission/BasePermission;)V
Lcom/android/server/pm/permission/PermissionsState$PermissionData;->grant(I)Z
-Lcom/android/server/am/BatteryExternalStatsWorker$2;->run()V
-Lcom/android/server/pm/permission/PermissionSettings;->getPermission(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
-Lcom/android/server/pm/permission/PermissionSettings;->getPermissionLocked(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
-Lcom/android/server/pm/permission/PermissionSettings;->getPermissionTreeLocked(Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
-Lcom/android/server/pm/Settings;->readDisabledSysPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;-><init>(Ljava/lang/String;)V
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->access$002(Lcom/android/server/pm/permission/PermissionsState$PermissionState;Z)Z
+Lcom/android/server/pm/permission/PermissionsState;->updatePermissionFlags(Lcom/android/server/pm/permission/BasePermission;III)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->getFlags(I)I
Lcom/android/server/pm/permission/PermissionsState$PermissionData;->updateFlags(III)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->isInstallPermissionKey(I)Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->access$102(Lcom/android/server/pm/permission/PermissionsState$PermissionState;I)I
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->isDefault()Z
+Lcom/android/server/pm/Settings;->readPackageLPw(Lorg/xmlpull/v1/XmlPullParser;)V
Lcom/android/server/pm/PackageSignatures;->readCertsListXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/util/ArrayList;Ljava/util/ArrayList;IZLandroid/content/pm/PackageParser$SigningDetails$Builder;)I
-Lcom/android/server/pm/permission/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/permission/PermissionsState$PermissionData;)V
-Lcom/android/server/pm/permission/PermissionSettings;->readPermissions(Landroid/util/ArrayMap;Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/pm/permission/PermissionSettings;->readPermissions(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->readStateForUserSyncLPr(I)V
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->parseRuntimePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;I)V
-Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->parsePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/permission/PermissionsState;I)V
-Lcom/android/server/pm/permission/BasePermission;->readLPw(Ljava/util/Map;Lorg/xmlpull/v1/XmlPullParser;)Z
-Lcom/android/server/pm/Settings;->writeKernelMappingLPr()V
-Lcom/android/server/pm/Settings;->writeKernelMappingLPr(Lcom/android/server/pm/PackageSetting;)V
-Lcom/android/server/pm/Settings;->writeKernelMappingLPr(Ljava/lang/String;I[I)V
-Lcom/android/server/pm/Settings;->readPackageRestrictionsLPr(I)V
-Lcom/android/server/am/ActivityManagerService$Injector;->getAppOpsService(Ljava/io/File;Landroid/os/Handler;)Lcom/android/server/appop/AppOpsService;
-Lcom/android/server/appop/AppOpsService;-><init>(Ljava/io/File;Landroid/os/Handler;)V
-Lcom/android/server/appop/AppOpsService;->readState()V
-Lcom/android/server/am/ProcessStatsService;-><init>(Lcom/android/server/am/ActivityManagerService;Ljava/io/File;)V
-Lcom/android/server/pm/PackageManagerService;->scanDirTracedLI(Ljava/io/File;IIJ)V
-Lcom/android/server/pm/PackageManagerService;->scanDirLI(Ljava/io/File;IIJ)V
-Lcom/android/server/pm/PackageManagerService;->addForInitLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
-Lcom/android/server/pm/PackageManagerService;->scanPackageChildLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
-Lcom/android/server/pm/KeySetManagerService;->readKeySetsLPw(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;)V
-Lcom/android/server/pm/ParallelPackageParser;->lambda$submit$0$ParallelPackageParser(Ljava/io/File;I)V
-Lcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;->run()V
-Lcom/android/server/pm/ParallelPackageParser;->parsePackage(Landroid/content/pm/PackageParser;Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
-Lcom/android/server/appop/AppOpsService;->readPackage(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/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;
-Lcom/android/server/appop/AppOpsService;->readUid(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)V
-Lcom/android/server/appop/AppOpsService;->readUidOps(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/pm/PackageSetting;-><init>(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/Settings;->registerExistingAppIdLPw(ILcom/android/server/pm/SettingBase;Ljava/lang/Object;)Z
+Lcom/android/server/pm/Settings;->readLPw(Ljava/util/List;)Z
+Lcom/android/server/pm/SettingBase;-><init>(II)V
+Lcom/android/server/pm/SettingBase;->setFlags(I)V
+Lcom/android/server/pm/SettingBase;->setPrivateFlags(I)V
+Lcom/android/server/pm/permission/PermissionsState;-><init>()V
+Lcom/android/server/pm/PackageSignatures;-><init>()V
Lcom/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
-Lcom/android/server/pm/SELinuxMMAC;->readInstallPolicy()Z
-Lcom/android/server/pm/KeySetManagerService;->readKeysLPw(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/pm/Settings;->writeIntToFile(Ljava/io/File;I)V
Lcom/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
-Lcom/android/server/appop/AppOpsService;->readOp(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;Z)V
-Lcom/android/server/pm/SELinuxMMAC;->readSignerOrThrow(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/pm/Policy;
-Lcom/android/server/pm/Settings;->readComponentsLPr(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/ArraySet;
-Lcom/android/server/pm/KeySetManagerService;->readPublicKeyLPw(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/pm/PackageManagerService;->scanPackageNewLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Lcom/android/server/pm/PackageManagerService$ScanResult;
-Lcom/android/server/pm/permission/PermissionsState;->grantRuntimePermission(Lcom/android/server/pm/permission/BasePermission;I)I
-Lcom/android/server/pm/Policy$PolicyBuilder;->addSignature(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
-Lcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;)V
-Lcom/android/server/display/DisplayManagerService;-><init>(Landroid/content/Context;Lcom/android/server/display/DisplayManagerService$Injector;)V
-Lcom/android/server/am/ActivityManagerService;->start()V
-Lcom/android/server/am/ActivityManagerService;->startAssociationLocked(ILjava/lang/String;IIJLandroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/am/ActivityManagerService$Association;
-Lcom/android/server/am/ActivityManagerService;->startIsolatedProcess(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Runnable;)Z
-Lcom/android/server/am/ActivityManagerService;->startObservingNativeCrashes()V
-Lcom/android/server/am/ActivityManagerService;->startPersistentApps(I)V
-Lcom/android/server/am/ActivityManagerService;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILjava/lang/String;Landroid/content/ComponentName;ZZZ)Lcom/android/server/am/ProcessRecord;
-Lcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;I)Landroid/content/ComponentName;
-PLcom/android/server/am/ActivityManagerService;->startUserInBackgroundWithListener(ILandroid/os/IProgressListener;)Z
-Lcom/android/server/am/ActivityManagerService$Lifecycle;->onStart()V
-Lcom/android/server/pm/PackageManagerService;->scanPackageOnlyLI(Lcom/android/server/pm/PackageManagerService$ScanRequest;ZJ)Lcom/android/server/pm/PackageManagerService$ScanResult;
-Lcom/android/server/pm/PackageSettingBase;->modifyUserState(I)Landroid/content/pm/PackageUserState;
-Lcom/android/server/pm/PackageSettingBase;->modifyUserStateComponents(IZZ)Landroid/content/pm/PackageUserState;
-Lcom/android/server/pm/Settings;->readDomainVerificationLPw(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/PackageSettingBase;)V
-Lcom/android/server/pm/PackageSettingBase;->setEnabled(IILjava/lang/String;)V
-Lcom/android/server/am/BatteryStatsService;-><init>(Landroid/content/Context;Ljava/io/File;Landroid/os/Handler;)V
-Lcom/android/server/pm/PackageManagerService;->commitReconciledScanResultLocked(Lcom/android/server/pm/PackageManagerService$ReconciledPackage;)V
-Lcom/android/server/pm/KeySetManagerService;->readKeySetListLPw(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/appop/AppOpsService$Op;->accessed(JILjava/lang/String;II)V
-Lcom/android/server/wm/ActivityTaskManagerService;->initialize(Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/am/PendingIntentController;Landroid/os/Looper;)V
-Lcom/android/server/pm/SettingBase;-><init>(II)V
-Lcom/android/server/pm/PackageManagerService;->locationIsPrivileged(Ljava/lang/String;)Z
-Lcom/android/server/power/PowerManagerService;-><init>(Landroid/content/Context;)V
-Lcom/android/server/power/PowerManagerService;-><init>(Landroid/content/Context;Lcom/android/server/power/PowerManagerService$Injector;)V
-Lcom/android/server/pm/permission/PermissionsState;->enforceValidUserId(I)V
-Lcom/android/server/Watchdog;->getInstance()Lcom/android/server/Watchdog;
-Lcom/android/server/Watchdog;-><init>()V
-Lcom/android/server/pm/PackageManagerService;->commitPackageSettings(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;IZLcom/android/server/pm/PackageManagerService$ReconciledPackage;)V
-Lcom/android/server/pm/PackageSetting;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
-Lcom/android/server/pm/Settings;->registerExistingAppIdLPw(ILcom/android/server/pm/SettingBase;Ljava/lang/Object;)Z
-Lcom/android/server/pm/permission/PermissionManagerService;->create(Landroid/content/Context;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrantedCallback;Ljava/lang/Object;)Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
-Lcom/android/server/pm/Settings;->addSharedUserLPw(Ljava/lang/String;III)Lcom/android/server/pm/SharedUserSetting;
-Lcom/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
-Lcom/android/server/appop/AppOpsService$Op;->updateProxyState(JILjava/lang/String;)V
-Lcom/android/server/display/DisplayManagerService$DisplayAdapterListener;->onDisplayDeviceEvent(Lcom/android/server/display/DisplayDevice;I)V
-Lcom/android/server/wm/ActivityTaskManagerService;->onActivityManagerInternalAdded()V
-Lcom/android/server/SystemService;->publishBinderService(Ljava/lang/String;Landroid/os/IBinder;)V
-Lcom/android/server/am/ActivityManagerService;->initPowerManagement()V
-Lcom/android/server/wm/ActivityTaskManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
-Lcom/android/server/display/DisplayManagerService;->onStart()V
-Lcom/android/server/pm/Settings;->readPreferredActivitiesLPw(Lorg/xmlpull/v1/XmlPullParser;I)V
Lcom/android/server/pm/PackageKeySetData;-><init>()V
-Lcom/android/server/display/DisplayManagerService;->registerDefaultDisplayAdapters()V
-Lcom/android/server/display/LocalDisplayAdapter;->registerLocked()V
-Lcom/android/server/ServiceThread;->run()V
-Lcom/android/server/display/DisplayModeDirector;-><init>(Landroid/content/Context;Landroid/os/Handler;)V
-Lcom/android/server/pm/Settings;->addPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;)V
-Lcom/android/server/pm/permission/PermissionManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DefaultPermissionGrantedCallback;Ljava/lang/Object;)V
-Lcom/android/server/appop/AppOpsService;->getUidStateLocked(IZ)Lcom/android/server/appop/AppOpsService$UidState;
-Lcom/android/server/am/BatteryStatsService;->fillRailDataStats(Lcom/android/internal/os/RailStats;)V
-Lcom/android/server/pm/SELinuxMMAC;->getSeInfo(Landroid/content/pm/PackageParser$Package;ZII)Ljava/lang/String;
-Lcom/android/server/pm/PackageManagerService;->collectCertificatesLI(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;ZZ)V
-Lcom/android/server/pm/PackageManagerService;->reconcilePackagesLocked(Lcom/android/server/pm/PackageManagerService$ReconcileRequest;Lcom/android/server/pm/KeySetManagerService;)Ljava/util/Map;
-Lcom/android/server/pm/permission/BasePermission;->readInt(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/lang/String;I)I
-Lcom/android/server/pm/UserManagerService;-><init>(Landroid/content/Context;Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/UserDataPreparer;Ljava/lang/Object;)V
-Lcom/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
-Lcom/android/server/display/LocalDisplayAdapter;->tryConnectDisplayLocked(J)V
-Lcom/android/server/pm/PreferredActivity;-><init>(Landroid/content/IntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;Z)V
-Lcom/android/server/pm/PackageManagerService;->preparePackageParserCache()Ljava/io/File;
-Lcom/android/server/pm/Policy$PolicyBuilder;->build()Lcom/android/server/pm/Policy;
-Lcom/android/server/LockGuard;->installLock(Ljava/lang/Object;I)Ljava/lang/Object;
-Lcom/android/server/LockGuard;->installLock(Ljava/lang/Object;IZ)Ljava/lang/Object;
-Lcom/android/server/SystemServiceManager;->startBootPhase(I)V
-Lcom/android/server/display/PersistentDataStore;->load()V
-Lcom/android/server/display/PersistentDataStore;->loadDisplaysFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/display/PersistentDataStore;->loadFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/display/PersistentDataStore;->loadRememberedWifiDisplaysFromXml(Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/wm/AppWarnings;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/Context;Landroid/os/Handler;Landroid/os/Handler;Ljava/io/File;)V
-Lcom/android/server/pm/PreferredComponent;-><init>(Lcom/android/server/pm/PreferredComponent$Callbacks;I[Landroid/content/ComponentName;Landroid/content/ComponentName;Z)V
-Lcom/android/server/pm/PreferredComponent;-><init>(Lcom/android/server/pm/PreferredComponent$Callbacks;Lorg/xmlpull/v1/XmlPullParser;)V
-Lcom/android/server/display/DisplayManagerService;->handleDisplayDeviceAdded(Lcom/android/server/display/DisplayDevice;)V
-Lcom/android/server/display/DisplayManagerService;->handleDisplayDeviceAddedLocked(Lcom/android/server/display/DisplayDevice;)V
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;
-Lcom/android/server/pm/PackageSettingBase;->setUserState(IJIZZZZIZLjava/lang/String;Landroid/content/pm/SuspendDialogInfo;Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;ZZLjava/lang/String;Landroid/util/ArraySet;Landroid/util/ArraySet;IIILjava/lang/String;)V
-Lcom/android/server/pm/Installer;->onStart()V
-Lcom/android/server/pm/Installer;->connect()V
-Lcom/android/server/lights/LightsService$LightImpl;-><init>(Lcom/android/server/lights/LightsService;Landroid/content/Context;I)V
-Lcom/android/server/pm/PackageManagerService;->addBuiltInSharedLibraryLocked(Ljava/lang/String;Ljava/lang/String;)Z
-Lcom/android/server/LockGuard;->findOrCreateLockInfo(Ljava/lang/Object;)Lcom/android/server/LockGuard$LockInfo;
-Lcom/android/server/lights/LightsService;-><init>(Landroid/content/Context;)V
-Lcom/android/server/pm/Policy;->getMatchedSeInfo(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
-Lcom/android/server/ServiceThread;-><init>(Ljava/lang/String;IZ)V
-Lcom/android/server/wm/ActivityTaskManagerService;->createStackSupervisor()Lcom/android/server/wm/ActivityStackSupervisor;
-Lcom/android/server/Watchdog;->addMonitor(Lcom/android/server/Watchdog$Monitor;)V
-Lcom/android/server/wm/ActivityStackSupervisor;->initPowerManagement()V
-Lcom/android/server/wm/ActivityTaskManagerService;->onInitPowerManagement()V
-Lcom/android/server/pm/KeySetManagerService;->addScannedPackageLPw(Landroid/content/pm/PackageParser$Package;)V
-Lcom/android/server/am/BatteryStatsService;->initPowerManagement()V
-Lcom/android/server/wm/ActivityTaskManagerService;-><init>(Landroid/content/Context;)V
-Lcom/android/server/am/ProcessList;-><init>()V
-Lcom/android/server/pm/PackageManagerService;->commitSharedLibraryInfoLocked(Landroid/content/pm/SharedLibraryInfo;)V
-Lcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Landroid/content/pm/PackageParser$Package;)J
-Lcom/android/server/am/ProcessStatsService;->updateFile()V
-Lcom/android/server/pm/Policy$PolicyBuilder;->setGlobalSeinfoOrThrow(Ljava/lang/String;)Lcom/android/server/pm/Policy$PolicyBuilder;
-Lcom/android/server/wm/AppWarnings;->readConfigFromFileAmsThread()V
-Lcom/android/server/am/BatteryStatsService;->fillLowPowerStats(Lcom/android/internal/os/RpmStats;)V
-Lcom/android/server/display/DisplayManagerService;->handleDisplayDeviceChanged(Lcom/android/server/display/DisplayDevice;)V
-Lcom/android/server/firewall/IntentFirewall;-><init>(Lcom/android/server/firewall/IntentFirewall$AMSInterface;Landroid/os/Handler;)V
+Lcom/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
+Lcom/android/server/pm/KeySetManagerService;->readKeySetListLPw(Lorg/xmlpull/v1/XmlPullParser;)V
+Lcom/android/server/pm/PackageSettingBase;->modifyUserState(I)Landroid/content/pm/PackageUserState;
+Lcom/android/server/pm/Settings;->readComponentsLPr(Lorg/xmlpull/v1/XmlPullParser;)Landroid/util/ArraySet;
+Lcom/android/server/pm/Settings;->readPackageRestrictionsLPr(I)V
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->parsePermissionsLPr(Lorg/xmlpull/v1/XmlPullParser;Lcom/android/server/pm/permission/PermissionsState;I)V
+Lcom/android/server/pm/SettingBase;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+Lcom/android/server/pm/Settings;->writeKernelMappingLPr()V
Lcom/android/server/pm/PackageSettingBase;->getNotInstalledUserIds()[I
-Lcom/android/server/appop/AppOpsService$UidState;->evalForegroundOps(Landroid/util/SparseArray;)V
-Lcom/android/server/SystemServerInitThreadPool;->submit(Ljava/lang/Runnable;Ljava/lang/String;)Ljava/util/concurrent/Future;
-Lcom/android/server/pm/KeySetManagerService;->addSigningKeySetToPackageLPw(Lcom/android/server/pm/PackageSetting;Landroid/util/ArraySet;)V
-Lcom/android/server/pm/ComponentResolver;->addAllComponents(Landroid/content/pm/PackageParser$Package;Z)V
-Lcom/android/server/appop/AppOpsService;->publish(Landroid/content/Context;)V
-Lcom/android/server/power/PowerManagerService;->onStart()V
-Lcom/android/server/os/DeviceIdentifiersPolicyService;->onStart()V
-Lcom/android/server/uri/UriGrantsManagerService$Lifecycle;-><init>(Landroid/content/Context;)V
-Lcom/android/server/pm/PackageManagerService;->applyPolicy(Landroid/content/pm/PackageParser$Package;IILandroid/content/pm/PackageParser$Package;)V
-Lcom/android/server/pm/KeySetManagerService;->addRefCountsFromSavedPackagesLPw(Landroid/util/ArrayMap;)V
-Lcom/android/server/am/OomAdjuster;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessList;Lcom/android/server/am/ActiveUids;)V
-Lcom/android/server/am/ProcessList;->init(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActiveUids;)V
-Lcom/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
-Lcom/android/server/pm/Settings;->writeUserRestrictionsLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)V
-PLcom/android/server/pm/permission/PermissionsState;-><init>(Lcom/android/server/pm/permission/PermissionsState;)V
-Lcom/android/server/pm/UserManagerService;->readUserListLP()V
-Lcom/android/server/RescueParty;->isUsbActive()Z
-Lcom/android/server/RescueParty;->isDisabled()Z
-Lcom/android/server/pm/SharedUserSetting;->addPackage(Lcom/android/server/pm/PackageSetting;)V
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;-><init>(Lcom/android/server/display/LocalDisplayAdapter;Landroid/os/IBinder;J[Landroid/view/SurfaceControl$PhysicalDisplayInfo;I[I[IIZ)V
-Lcom/android/server/am/BatteryStatsService$WakeupReasonThread;->run()V
+Lcom/android/server/pm/PackageManagerService;-><init>(Lcom/android/server/pm/PackageManagerService$Injector;ZZ)V
+Lcom/android/server/pm/AppsFilter;->addPackage(Landroid/content/pm/PackageParser$Package;Ljava/util/Map;)V
+Lcom/android/server/pm/AppsFilter;->canQuery(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;)Z
+Lcom/android/server/pm/SELinuxMMAC;->getSeInfo(Landroid/content/pm/PackageParser$Package;ZI)Ljava/lang/String;
+Lcom/android/server/pm/Policy;->getMatchedSeInfo(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+Lcom/android/server/pm/PackageSettingBase;->readUserState(I)Landroid/content/pm/PackageUserState;
+Lcom/android/server/pm/permission/PermissionsState;->copyFrom(Lcom/android/server/pm/permission/PermissionsState;)V
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;-><init>(Lcom/android/server/pm/permission/PermissionsState$PermissionData;)V
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;-><init>(Lcom/android/server/pm/permission/PermissionsState$PermissionState;)V
+Lcom/android/server/pm/permission/BasePermission;->findPermissionTree(Ljava/util/Collection;Ljava/lang/String;)Lcom/android/server/pm/permission/BasePermission;
+Lcom/android/server/pm/permission/PermissionManagerService;->addAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/pm/permission/PermissionSettings;->putPermissionLocked(Ljava/lang/String;Lcom/android/server/pm/permission/BasePermission;)V
+Lcom/android/server/pm/permission/PermissionSettings;->getAllPermissionTreesLocked()Ljava/util/Collection;
+Lcom/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;
+Lcom/android/server/pm/PackageManagerService;->commitPackageSettings(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Lcom/android/server/pm/PackageSetting;IZLcom/android/server/pm/PackageManagerService$ReconciledPackage;)V
+Lcom/android/server/IntentResolver;->register_intent_filter(Landroid/content/IntentFilter;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I
+Lcom/android/server/pm/PackageManagerService;->fixProcessName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->isPackageRenamed(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Z
Lcom/android/server/pm/PackageSettingBase;->doCopy(Lcom/android/server/pm/PackageSettingBase;)V
-Lcom/android/server/SystemServerInitThreadPool;->get()Lcom/android/server/SystemServerInitThreadPool;
-Lcom/android/server/pm/PreferredActivity;->onReadTag(Ljava/lang/String;Lorg/xmlpull/v1/XmlPullParser;)Z
-Lcom/android/server/FgThread;->getHandler()Landroid/os/Handler;
-Lcom/android/server/FgThread;->ensureThreadLocked()V
-Lcom/android/server/IntentResolver;->addFilter(Landroid/content/IntentFilter;)V
+Lcom/android/server/pm/PackageSettingBase;->setTimeStamp(J)V
+Lcom/android/server/pm/PackageManagerService;->scanDirLI(Ljava/io/File;IIJ)V
+Lcom/android/server/pm/PackageManagerService$PackageParserCallback;->getStaticOverlayPackages(Ljava/util/Collection;Ljava/lang/String;)Ljava/util/List;
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->addActivity(Landroid/content/pm/PackageParser$Activity;Ljava/lang/String;Ljava/util/List;)V
Lcom/android/server/IntentResolver;->addFilter(Landroid/util/ArrayMap;Ljava/lang/String;Landroid/content/IntentFilter;)V
-Lcom/android/server/pm/PackageManagerService;->assertPackageIsValid(Landroid/content/pm/PackageParser$Package;II)V
-Lcom/android/server/pm/PackageManagerService;->getSettingsVersionForPackage(Landroid/content/pm/PackageParser$Package;)Lcom/android/server/pm/Settings$VersionInfo;
-Lcom/android/server/pm/KeySetManagerService;->getPublicKeysFromKeySetLPr(J)Landroid/util/ArraySet;
+Lcom/android/server/pm/PackageManagerService;->applyPolicy(Landroid/content/pm/PackageParser$Package;IILandroid/content/pm/PackageParser$Package;)V
Lcom/android/server/pm/ComponentResolver;->addActivitiesLocked(Landroid/content/pm/PackageParser$Package;Ljava/util/List;Z)V
-Lcom/android/server/pm/PackageManagerServiceCompilerMapping;->checkProperties()V
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->access$600(Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;Landroid/content/pm/PackageParser$Activity;Ljava/lang/String;Ljava/util/List;)V
+Lcom/android/server/pm/Settings;->getDisabledSystemPkgLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/IntentResolver;->register_mime_types(Landroid/content/IntentFilter;Ljava/lang/String;)I
+Lcom/android/server/pm/Settings;->getPackageLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/pm/SettingBase;->doCopy(Lcom/android/server/pm/SettingBase;)V
+Lcom/android/server/pm/PackageManagerService;->reconcilePackagesLocked(Lcom/android/server/pm/PackageManagerService$ReconcileRequest;Lcom/android/server/pm/KeySetManagerService;)Ljava/util/Map;
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->newArray(I)[Landroid/content/IntentFilter;
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->newArray(I)[Landroid/content/pm/PackageParser$ActivityIntentInfo;
+Lcom/android/server/IntentResolver;->addFilter(Landroid/content/IntentFilter;)V
Lcom/android/server/pm/Settings;->getSettingLPr(I)Lcom/android/server/pm/SettingBase;
-Lcom/android/server/uri/UriGrantsManagerService;-><init>(Landroid/content/Context;)V
-Lcom/android/server/pm/Settings;-><init>(Ljava/io/File;Lcom/android/server/pm/permission/PermissionSettings;Ljava/lang/Object;)V
-Lcom/android/server/uri/UriGrantsManagerService$Lifecycle;->onStart()V
-Lcom/android/server/wm/ActivityTaskManagerService$Lifecycle;->onStart()V
-Lcom/android/server/pm/PackageSetting;->updateFrom(Lcom/android/server/pm/PackageSetting;)V
-Lcom/android/server/display/DisplayModeDirector$SettingsObserver;-><init>(Lcom/android/server/display/DisplayModeDirector;Landroid/content/Context;Landroid/os/Handler;)V
-Lcom/android/server/power/batterysaver/BatterySaverController;-><init>(Ljava/lang/Object;Landroid/content/Context;Landroid/os/Looper;Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySavingStats;)V
-Lcom/android/server/wm/ActivityStackSupervisor;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/os/Looper;)V
-Lcom/android/server/PackageWatchdog;-><init>(Landroid/content/Context;)V
-Lcom/android/server/PackageWatchdog;->getInstance(Landroid/content/Context;)Lcom/android/server/PackageWatchdog;
-Lcom/android/server/pm/Settings;->getAllUsers(Lcom/android/server/pm/UserManagerService;)Ljava/util/List;
-Lcom/android/server/Watchdog;->addThread(Landroid/os/Handler;)V
-Lcom/android/server/Watchdog;->addThread(Landroid/os/Handler;J)V
-Lcom/android/server/wm/RecentTasks;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityStackSupervisor;)V
-Lcom/android/server/pm/PackageSettingBase;->updateFrom(Lcom/android/server/pm/PackageSettingBase;)Lcom/android/server/pm/PackageSettingBase;
+Lcom/android/server/pm/ComponentResolver;->addAllComponents(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/pm/ComponentResolver;->addServicesLocked(Landroid/content/pm/PackageParser$Package;Z)V
Lcom/android/server/pm/UserManagerService;->getUsers(Z)Ljava/util/List;
-Lcom/android/server/firewall/IntentFirewall;->readRulesDir(Ljava/io/File;)V
-Lcom/android/server/wm/TaskChangeNotificationController;-><init>(Ljava/lang/Object;Lcom/android/server/wm/ActivityStackSupervisor;Landroid/os/Handler;)V
-Lcom/android/server/am/BatteryExternalStatsWorker;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;
-Lcom/android/server/display/DisplayManagerService;->addLogicalDisplayLocked(Lcom/android/server/display/DisplayDevice;)Lcom/android/server/display/LogicalDisplay;
-Lcom/android/server/display/DisplayManagerService;->updateLogicalDisplaysLocked()Z
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->updatePhysicalDisplayInfoLocked([Landroid/view/SurfaceControl$PhysicalDisplayInfo;I[I[II)Z
-Lcom/android/server/display/DisplayDeviceInfo;->toString()Ljava/lang/String;
-Lcom/android/server/UiThread;->run()V
-Lcom/android/server/pm/PackageKeySetData;->setProperSigningKeySet(J)V
-Lcom/android/server/UiThread;->ensureThreadLocked()V
-Lcom/android/server/UiThread;->getHandler()Landroid/os/Handler;
-Lcom/android/server/pm/Settings;->getPackageLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
-Lcom/android/server/IoThread;->ensureThreadLocked()V
-Lcom/android/server/IoThread;->getHandler()Landroid/os/Handler;
Lcom/android/server/pm/Settings;->getInternalVersion()Lcom/android/server/pm/Settings$VersionInfo;
-Lcom/android/server/appop/AppOpsService$Op;->running(JJII)V
-Lcom/android/server/appop/AppOpsService$Op;->updateAccessTimeAndDuration(JJII)V
-Lcom/android/server/appop/AppOpsService$Op;->rejected(JILjava/lang/String;II)V
-Lcom/android/server/DisplayThread;->ensureThreadLocked()V
-Lcom/android/server/DisplayThread;->getHandler()Landroid/os/Handler;
-Lcom/android/server/am/UserController;-><init>(Lcom/android/server/am/UserController$Injector;)V
-Lcom/android/server/AnimationThread;->ensureThreadLocked()V
-Lcom/android/server/AnimationThread;->getHandler()Landroid/os/Handler;
-Lcom/android/server/wm/SurfaceAnimationThread;->ensureThreadLocked()V
-Lcom/android/server/wm/SurfaceAnimationThread;->getHandler()Landroid/os/Handler;
-Lcom/android/server/wm/ActivityStackSupervisor;->initialize()V
-Lcom/android/server/pm/PackageSettingBase;->readUserState(I)Landroid/content/pm/PackageUserState;
+Lcom/android/server/pm/Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->getRealPackageName(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->getOriginalPackageLocked(Landroid/content/pm/PackageParser$Package;Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;
+Lcom/android/server/pm/PackageSetting;-><init>(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/PackageSettingBase;-><init>(Lcom/android/server/pm/PackageSettingBase;Ljava/lang/String;)V
+Lcom/android/server/pm/SettingBase;-><init>(Lcom/android/server/pm/SettingBase;)V
+Lcom/android/server/pm/PackageSetting;->doCopy(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/PackageManagerService;->isSystemApp(Landroid/content/pm/PackageParser$Package;)Z
+Lcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Landroid/content/pm/PackageParser$Package;)J
+Lcom/android/server/pm/PackageManagerService;->getSettingsVersionForPackage(Landroid/content/pm/PackageParser$Package;)Lcom/android/server/pm/Settings$VersionInfo;
+Lcom/android/server/pm/PackageManagerService;->isExternal(Landroid/content/pm/PackageParser$Package;)Z
+Lcom/android/server/pm/PackageManagerService;->isCompatSignatureUpdateNeeded(Lcom/android/server/pm/Settings$VersionInfo;)Z
+Lcom/android/server/pm/PackageManagerService;->isRecoverSignatureUpdateNeeded(Lcom/android/server/pm/Settings$VersionInfo;)Z
+Lcom/android/server/pm/PackageSettingBase;->updateFrom(Lcom/android/server/pm/PackageSettingBase;)Lcom/android/server/pm/PackageSettingBase;
+Lcom/android/server/pm/UserManagerService;->getInstance()Lcom/android/server/pm/UserManagerService;
+Lcom/android/server/pm/Settings;->writeUserRestrictionsLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/KeySetManagerService;->getPublicKeysFromKeySetLPr(J)Landroid/util/ArraySet;
+Lcom/android/server/pm/PackageSettingBase;->getInstantApp(I)Z
+Lcom/android/server/pm/ComponentResolver;->addReceiversLocked(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/pm/ComponentResolver;->addProvidersLocked(Landroid/content/pm/PackageParser$Package;Z)V
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->addService(Landroid/content/pm/PackageParser$Service;)V
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getDisabledSystemPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/pm/ComponentResolver;->adjustPriority(Ljava/util/List;Landroid/content/pm/PackageParser$ActivityIntentInfo;Ljava/lang/String;)V
+Lcom/android/server/pm/ComponentResolver;->isProtectedAction(Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+Lcom/android/server/pm/Settings;->addPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;)V
+Lcom/android/server/pm/PackageInstallerService;->isStageName(Ljava/lang/String;)Z
+Lcom/android/server/pm/ParallelPackageParser;->submit(Ljava/io/File;I)V
+Lcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;-><init>(Lcom/android/server/pm/ParallelPackageParser;Ljava/io/File;I)V
+Lcom/android/server/IntentResolver;->filterEquals(Landroid/content/IntentFilter;Landroid/content/IntentFilter;)Z
+Lcom/android/server/IntentResolver;->collectFilters([Landroid/content/IntentFilter;Landroid/content/IntentFilter;)Ljava/util/ArrayList;
+Lcom/android/server/pm/-$$Lambda$ParallelPackageParser$FTtinPrp068lVeI7K6bC1tNE3iM;->run()V
+Lcom/android/server/pm/ParallelPackageParser;->lambda$submit$0$ParallelPackageParser(Ljava/io/File;I)V
+Lcom/android/server/pm/ParallelPackageParser$ParseResult;-><init>()V
+Lcom/android/server/pm/ParallelPackageParser;->parsePackage(Landroid/content/pm/PackageParser;Ljava/io/File;I)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/pm/PackageManagerService$PackageParserCallback;->getOverlayApks(Ljava/lang/String;)[Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService$ParallelPackageParserCallback;->getStaticOverlayPaths(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String;
+Lcom/android/server/IntentResolver;->findFilters(Landroid/content/IntentFilter;)Ljava/util/ArrayList;
+Lcom/android/server/pm/ComponentResolver;->findMatchingActivity(Ljava/util/List;Landroid/content/pm/ActivityInfo;)Landroid/content/pm/PackageParser$Activity;
+Lcom/android/server/pm/ComponentResolver$ProviderIntentResolver;->addProvider(Landroid/content/pm/PackageParser$Provider;)V
+Lcom/android/server/pm/PackageManagerService$Injector$Singleton;->get(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;
+Lcom/android/server/pm/ParallelPackageParser;->take()Lcom/android/server/pm/ParallelPackageParser$ParseResult;
+Lcom/android/server/pm/PackageManagerService;->scanPackageOnlyLI(Lcom/android/server/pm/PackageManagerService$ScanRequest;Lcom/android/server/pm/PackageManagerService$Injector;ZJ)Lcom/android/server/pm/PackageManagerService$ScanResult;
+Lcom/android/server/pm/PackageManagerService$Injector;->getUserManagerService()Lcom/android/server/pm/UserManagerService;
+Lcom/android/server/pm/ComponentResolver;->getIntentListSubset(Ljava/util/List;Lcom/android/server/pm/ComponentResolver$IterGenerator;Ljava/util/Iterator;)V
+Lcom/android/server/pm/PackageManagerService;->scanPackageChildLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/pm/PackageManagerService;->addForInitLI(Landroid/content/pm/PackageParser$Package;IIJLandroid/os/UserHandle;)Landroid/content/pm/PackageParser$Package;
Lcom/android/server/pm/PackageManagerServiceUtils;->getCompressedFiles(Ljava/lang/String;)[Ljava/io/File;
-Lcom/android/server/pm/Settings;->insertPackageSettingLPw(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;)V
-Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->addActivity(Landroid/content/pm/PackageParser$Activity;Ljava/lang/String;Ljava/util/List;)V
-Lcom/android/server/pm/Installer;->invalidateMounts()V
-Lcom/android/server/power/PowerManagerService$NativeWrapper;->nativeInit(Lcom/android/server/power/PowerManagerService;)V
-Lcom/android/server/power/ThermalManagerService;->onStart()V
-Lcom/android/server/am/OomAdjProfiler;-><init>()V
-Lcom/android/server/pm/PackageManagerService;->maybeClearProfilesForUpgradesLI(Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$Package;)V
-Lcom/android/server/am/ActivityManagerConstants;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;)V
-Lcom/android/server/IntentResolver;-><init>()V
+Lcom/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
+Lcom/android/server/pm/PackageManagerService$Injector;->getAbiHelper()Lcom/android/server/pm/PackageAbiHelper;
+Lcom/android/server/pm/PackageManagerService$Injector;->getUserManagerInternal()Landroid/os/UserManagerInternal;
+Lcom/android/server/pm/UserManagerService;->getInternalForInjectorOnly()Landroid/os/UserManagerInternal;
Lcom/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
-Lcom/android/server/PackageWatchdog;->loadFromFile()V
-Lcom/android/server/power/batterysaver/BatterySaverPolicy;-><init>(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySavingStats;)V
-Lcom/android/server/power/AttentionDetector;-><init>(Ljava/lang/Runnable;Ljava/lang/Object;)V
-Lcom/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;)V
-Lcom/android/server/appop/AppOpsService$Op;-><init>(Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;I)V
-Lcom/android/server/pm/UserManagerService;->readUserLP(I)Lcom/android/server/pm/UserManagerService$UserData;
-Lcom/android/server/pm/UserManagerService;->readUserLP(ILjava/io/InputStream;)Lcom/android/server/pm/UserManagerService$UserData;
-Lcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lorg/xmlpull/v1/XmlPullParser;)Landroid/os/Bundle;
-Lcom/android/server/pm/UserRestrictionsUtils;->readRestrictions(Lorg/xmlpull/v1/XmlPullParser;Landroid/os/Bundle;)V
-Lcom/android/server/pm/PackageManagerService;->adjustScanFlags(ILcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/os/UserHandle;Landroid/content/pm/PackageParser$Package;)I
-Lcom/android/server/pm/SettingBase;->setFlags(I)V
-Lcom/android/server/display/LogicalDisplay;->updateLocked(Ljava/util/List;)V
-Lcom/android/server/Watchdog$HandlerChecker;->run()V
-Lcom/android/server/Watchdog;->run()V
-Lcom/android/server/display/DisplayAdapter$1;->run()V
-Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler;->handleMessage(Landroid/os/Message;)V
-Lcom/android/server/pm/PackageManagerServiceCompilerMapping;->getAndCheckValidity(I)Ljava/lang/String;
-Lcom/android/server/pm/ParallelPackageParser;->take()Lcom/android/server/pm/ParallelPackageParser$ParseResult;
-Lcom/android/server/pm/KeySetManagerService;->assertScannedPackageValid(Landroid/content/pm/PackageParser$Package;)V
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->run()V
-Lcom/android/server/pm/PackageManagerServiceUtils;->verifySignatures(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageParser$SigningDetails;ZZ)Z
-Lcom/android/server/pm/PackageManagerService;->getSharedLibLatestVersionSetting(Lcom/android/server/pm/PackageManagerService$ScanResult;)Lcom/android/server/pm/PackageSetting;
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayBrightness(I)V
-Lcom/android/server/pm/PackageManagerService;->getLatestSharedLibraVersionLPr(Landroid/content/pm/PackageParser$Package;)Landroid/content/pm/SharedLibraryInfo;
-Lcom/android/server/pm/PackageManagerServiceCompilerMapping;->getSystemPropertyName(I)Ljava/lang/String;
-Lcom/android/server/lights/LightsService$LightImpl;->setLightLocked(IIIII)V
-Lcom/android/server/lights/LightsService$LightImpl;->setBrightness(I)V
-Lcom/android/server/lights/LightsService$LightImpl;->setBrightness(II)V
-Lcom/android/server/Watchdog$HandlerChecker;->scheduleCheckLocked()V
-Lcom/android/server/pm/permission/PermissionsState;->copyFrom(Lcom/android/server/pm/permission/PermissionsState;)V
-Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->addAllPermissionGroups(Landroid/content/pm/PackageParser$Package;Z)V
-Lcom/android/server/RecoverySystemService;->onStart()V
-Lcom/android/server/display/DisplayManagerService;->onBootPhase(I)V
-Lcom/android/server/am/ProcessList;->updateOomLevels(IIZ)V
-Lcom/android/server/am/OomAdjProfiler;->batteryPowerChanged(Z)V
+Lcom/android/server/pm/PackageManagerService;->setInstantAppForUser(Lcom/android/server/pm/PackageManagerService$Injector;Lcom/android/server/pm/PackageSetting;IZZ)V
+Lcom/android/server/pm/PackageManagerServiceUtils;->deriveAbiOverride(Ljava/lang/String;Lcom/android/server/pm/PackageSetting;)Ljava/lang/String;
+Lcom/android/server/pm/PackageAbiHelperImpl;->getNativeLibraryPaths(Landroid/content/pm/PackageParser$Package;Ljava/io/File;)Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;
+Lcom/android/server/pm/PackageAbiHelper$Abis;-><init>(Landroid/content/pm/PackageParser$Package;)V
+Lcom/android/server/pm/PackageAbiHelper$Abis;-><init>(Ljava/lang/String;Ljava/lang/String;)V
+Lcom/android/server/pm/PackageAbiHelperImpl;->getNativeLibraryPaths(Lcom/android/server/pm/PackageAbiHelper$Abis;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;ZZ)Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;
+Lcom/android/server/pm/InstructionSets;->getPrimaryInstructionSet(Lcom/android/server/pm/PackageAbiHelper$Abis;)Ljava/lang/String;
+Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;-><init>(Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;)V
+Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;->applyTo(Landroid/content/pm/PackageParser$Package;)V
+Lcom/android/server/pm/PackageManagerService$ScanResult;-><init>(Lcom/android/server/pm/PackageManagerService$ScanRequest;ZLcom/android/server/pm/PackageSetting;Ljava/util/List;ZLandroid/content/pm/SharedLibraryInfo;Ljava/util/List;)V
+Lcom/android/server/pm/PackageSetting;->updateFrom(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/SettingBase;->copyFrom(Lcom/android/server/pm/SettingBase;)V
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ActivityIntentInfo;Ljava/util/List;)Z
+Lcom/android/server/pm/PackageManagerService;->executeSharedLibrariesUpdateLPr(Landroid/content/pm/PackageParser$Package;Landroid/content/pm/PackageParser$Package;Ljava/util/ArrayList;)V
+Lcom/android/server/pm/PackageManagerService;->collectSharedLibraryInfos(Ljava/util/List;[J[[Ljava/lang/String;Ljava/lang/String;ZILjava/util/ArrayList;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)Ljava/util/ArrayList;
+Lcom/android/server/pm/PackageManagerService;->getSharedLibraryInfo(Ljava/lang/String;JLjava/util/Map;Ljava/util/Map;)Landroid/content/pm/SharedLibraryInfo;
+Lcom/android/server/pm/PackageManagerService;->addSharedLibraryLPr(Landroid/content/pm/PackageParser$Package;Ljava/util/Set;Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/PackageParser$Package;)V
+Lcom/android/server/pm/PackageUsage;->readToken(Ljava/io/InputStream;Ljava/lang/StringBuffer;C)Ljava/lang/String;
+Lcom/android/server/pm/PackageUsage;->readVersion1LP(Ljava/util/Map;Ljava/io/InputStream;Ljava/lang/StringBuffer;)V
+Lcom/android/server/pm/PackageUsage;->parseAsLong(Ljava/lang/String;)J
+Lcom/android/server/pm/CompilerStats;->read(Ljava/io/Reader;)Z
+Lcom/android/server/pm/permission/BasePermission;->getSourcePackageSetting()Lcom/android/server/pm/PackageSettingBase;
+Lcom/android/server/pm/permission/PermissionManagerService;->updatePermissionSourcePackage(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;)Z
+Lcom/android/server/pm/permission/BasePermission;->isDynamic()Z
+Lcom/android/server/pm/permission/PermissionManagerService;->cacheBackgroundToForegoundPermissionMapping()V
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getKnownPackageName(II)Ljava/lang/String;
+Lcom/android/server/pm/PackageSetting;->isSystem()Z
+Lcom/android/server/pm/permission/PermissionsState;->hasInstallPermission(Ljava/lang/String;)Z
+Lcom/android/server/pm/permission/PermissionsState;->getPermissions(I)Ljava/util/Set;
+Lcom/android/server/pm/permission/PermissionManagerService;->revokePermissionsNoLongerImplicitLocked(Lcom/android/server/pm/permission/PermissionsState;Landroid/content/pm/PackageParser$Package;[I)[I
+Lcom/android/server/pm/PackageSetting;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+Lcom/android/server/pm/permission/PermissionsState;->grantRuntimePermission(Lcom/android/server/pm/permission/BasePermission;I)I
+Lcom/android/server/pm/permission/PermissionManagerService;->restorePermissionState(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;)V
+Lcom/android/server/pm/permission/PermissionsState;->getPermissionState(Ljava/lang/String;I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+Lcom/android/server/pm/permission/PermissionsState$PermissionData;->getPermissionState(I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+Lcom/android/server/pm/PackageSettingBase;->getPermissionsState()Lcom/android/server/pm/permission/PermissionsState;
+Lcom/android/server/pm/permission/PermissionsState;->getRuntimePermissionState(Ljava/lang/String;I)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+Lcom/android/server/pm/permission/PermissionsState;->hasRequestedPermission(Ljava/lang/String;)Z
+Lcom/android/server/pm/permission/BasePermission;->isRuntimeOnly()Z
+Lcom/android/server/pm/permission/BasePermission;->isAppOp()Z
+Lcom/android/server/pm/permission/BasePermission;->isNormal()Z
+Lcom/android/server/pm/permission/PermissionManagerService;->setInitialGrantForNewImplicitPermissionsLocked(Lcom/android/server/pm/permission/PermissionsState;Lcom/android/server/pm/permission/PermissionsState;Landroid/content/pm/PackageParser$Package;Landroid/util/ArraySet;[I)[I
+Lcom/android/server/pm/UserManagerService;->getUserIds()[I
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->getFlags()I
+Lcom/android/server/pm/permission/BasePermission;->isRuntime()Z
+Lcom/android/server/pm/permission/PermissionsState;->hasRuntimePermission(Ljava/lang/String;I)Z
+Lcom/android/server/pm/PackageSettingBase;->getSigningDetails()Landroid/content/pm/PackageParser$SigningDetails;
+Lcom/android/server/pm/permission/BasePermission;->isVendorPrivileged()Z
+Lcom/android/server/pm/permission/BasePermission;->isSignature()Z
+Lcom/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
+Lcom/android/server/pm/permission/BasePermission;->isOEM()Z
+Lcom/android/server/pm/permission/BasePermission;->isPrivileged()Z
+Lcom/android/server/pm/permission/BasePermission;->getSourcePackageName()Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackage(Ljava/lang/String;)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/pm/PackageManagerService;->access$5700(Lcom/android/server/pm/PackageManagerService;Ljava/lang/String;J)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->resolveInternalPackageNameLPr(Ljava/lang/String;J)Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionsState;->getPermissionFlags(Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/PermissionsState;->getInstallPermissionState(Ljava/lang/String;)Lcom/android/server/pm/permission/PermissionsState$PermissionState;
+Lcom/android/server/pm/permission/PermissionManagerService;->hasPrivappWhitelistEntry(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;)Z
+Lcom/android/server/pm/permission/BasePermission;->isHardRestricted()Z
+Lcom/android/server/pm/permission/BasePermission;->isSoftRestricted()Z
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->isGranted()Z
+Lcom/android/server/pm/PackageManagerService;->reconcileAppsDataLI(Ljava/lang/String;IIZZ)Ljava/util/List;
+Lcom/android/server/pm/permission/BasePermission;->writeLPr(Lorg/xmlpull/v1/XmlSerializer;)V
+Lcom/android/server/pm/permission/PermissionSettings;->writePermissions(Lorg/xmlpull/v1/XmlSerializer;)V
+Lcom/android/server/pm/permission/PermissionsState;->getPermissionStatesInternal(I)Ljava/util/List;
+Lcom/android/server/pm/Settings;->writePermissionsLPr(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+Lcom/android/server/pm/permission/PermissionsState$PermissionState;->getName()Ljava/lang/String;
+Lcom/android/server/pm/PackageKeySetData;->getProperSigningKeySet()J
+Lcom/android/server/pm/PackageSignatures;->writeCertsListXml(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/ArrayList;[Landroid/content/pm/Signature;Z)V
+Lcom/android/server/pm/Settings;->writeLPr()V
+Lcom/android/server/pm/Settings;->writeUsesStaticLibLPw(Lorg/xmlpull/v1/XmlSerializer;[Ljava/lang/String;[J)V
+Lcom/android/server/pm/Settings;->writeChildPackagesLPw(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+Lcom/android/server/pm/permission/PermissionsState;->getInstallPermissionStates()Ljava/util/List;
+Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle;->getKey()Ljava/security/PublicKey;
+Lcom/android/server/pm/Settings;->writeKernelMappingLPr(Ljava/lang/String;I[I)V
+Lcom/android/server/pm/Settings;->writeIntToFile(Ljava/io/File;I)V
+Lcom/android/server/pm/Settings;->writeKernelMappingLPr(Lcom/android/server/pm/PackageSetting;)V
+Lcom/android/server/pm/Settings;->writePackageListLPrInternal(I)V
+Lcom/android/server/pm/permission/PermissionsState;->computeGids([I)[I
+Lcom/android/server/pm/Settings;->writePackageRestrictionsLPr(I)V
+Lcom/android/server/IntentResolver;->buildResolveList(Landroid/content/Intent;Landroid/util/FastImmutableArraySet;ZZLjava/lang/String;Ljava/lang/String;[Landroid/content/IntentFilter;Ljava/util/List;I)V
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;I)Ljava/util/List;
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/pm/PackageParser$ActivityIntentInfo;)Z
+Lcom/android/server/pm/PackageSettingBase;->getInstalled(I)Z
+Lcom/android/server/pm/PackageManagerService;->getInstantAppPackageName(I)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->shouldFilterApplicationLocked(Lcom/android/server/pm/PackageSetting;II)Z
+Lcom/android/server/pm/PackageManagerService;->shouldFilterApplicationLocked(Lcom/android/server/pm/PackageSetting;ILandroid/content/ComponentName;II)Z
+Lcom/android/server/pm/PackageManagerService;->isCallerSameApp(Ljava/lang/String;I)Z
+Lcom/android/server/pm/AppsFilter;->shouldFilterApplication(ILcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;I)Z
+Lcom/android/server/pm/UserManagerService$LocalService;->exists(I)Z
+Lcom/android/server/pm/UserManagerService;->access$2900(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;
+Lcom/android/server/pm/UserManagerService;->getUserInfoNoChecks(I)Landroid/content/pm/UserInfo;
+Lcom/android/server/pm/UserManagerService;->exists(I)Z
+Lcom/android/server/pm/dex/DexManager;->putIfAbsent(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+Lcom/android/server/pm/dex/DexManager;->cachePackageCodeLocation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;I)V
+Lcom/android/server/pm/dex/DexManager$PackageCodeLocations;->mergeAppDataDirs(Ljava/lang/String;I)V
+Lcom/android/server/pm/dex/DexManager;->access$300(Ljava/util/Map;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
+Lcom/android/server/pm/dex/DexManager$PackageCodeLocations;->updateCodeLocation(Ljava/lang/String;[Ljava/lang/String;)V
+Lcom/android/server/appop/AppOpsService$Op;->access$100(Lcom/android/server/appop/AppOpsService$Op;)I
+Lcom/android/server/pm/PackageManagerService;->generatePackageInfo(Lcom/android/server/pm/PackageSetting;II)Landroid/content/pm/PackageInfo;
+Lcom/android/server/pm/PackageManagerService;->resolveExternalPackageNameLPr(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissionsSync(I)V
+Lcom/android/server/pm/Settings$RuntimePermissionPersistence;->writePermissions(Lorg/xmlpull/v1/XmlSerializer;Ljava/util/List;)V
+Lcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1600(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I
+Lcom/android/server/pm/PackageManagerService;->filterSharedLibPackageLPr(Lcom/android/server/pm/PackageSetting;III)Z
+Lcom/android/server/om/OverlayManagerSettings;->select(Ljava/lang/String;I)I
+Lcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1100(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerServiceUtils;->compareSignatures([Landroid/content/pm/Signature;[Landroid/content/pm/Signature;)I
+Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$Fjt465P6G89HQZERZFsOEjMbtXI;->test(Ljava/lang/Object;)Z
+Lcom/android/server/om/OverlayManagerSettings;->lambda$selectWhereUser$10(ILcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+Lcom/android/server/om/OverlayManagerSettings$SettingsItem;->access$1000(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Ljava/lang/String;
+Lcom/android/server/om/OverlayManagerSettings$SettingsItem;->getTargetPackageName()Ljava/lang/String;
+Lcom/android/server/om/-$$Lambda$OverlayManagerSettings$L_Sj43p2Txm_KH-wT0lseBTVzh8;->test(Ljava/lang/Object;)Z
+Lcom/android/server/om/OverlayManagerSettings;->lambda$selectWhereTarget$11(Ljava/lang/String;Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)Z
+Lcom/android/server/om/OverlayManagerService;->updateOverlayPaths(ILjava/util/List;)V
+Lcom/android/server/usage/UsageStatsProto;->loadUsageStats(Landroid/util/proto/ProtoInputStream;JLcom/android/server/usage/IntervalStats;Ljava/util/List;)V
+Lcom/android/server/usage/UsageStatsProto;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;)V
+Lcom/android/server/usage/UsageStatsProto;->readStringPool(Landroid/util/proto/ProtoInputStream;)Ljava/util/List;
+Lcom/android/server/usage/IntervalStats;->getOrCreateUsageStats(Ljava/lang/String;)Landroid/app/usage/UsageStats;
+Lcom/android/server/usage/IntervalStats;->getCachedStringRef(Ljava/lang/String;)Ljava/lang/String;
+Lcom/android/server/pm/ComponentResolver$ProviderIntentResolver;->access$400(Lcom/android/server/pm/ComponentResolver$ProviderIntentResolver;)Landroid/util/ArrayMap;
+Lcom/android/server/pm/ComponentResolver;->queryProviders(Ljava/lang/String;Ljava/lang/String;III)Ljava/util/List;
+Lcom/android/server/pm/PackageManagerService;->getInstalledPackages(II)Landroid/content/pm/ParceledListSlice;
+Lcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZLjava/lang/Object;III)V
+Lcom/android/server/am/ActivityManagerService;->registerReceiver(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;
+Lcom/android/server/appop/AppOpsService;->evalAllForegroundOpsLocked()V
+Lcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Ljava/lang/Object;)I
+Lcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Lcom/android/server/DropBoxManagerService$EntryFile;)I
+Lcom/android/server/DropBoxManagerService$EntryFile;->hasFile()Z
+Lcom/android/server/DropBoxManagerService;->init()V
+Lcom/android/server/DropBoxManagerService$EntryFile;-><init>(Ljava/io/File;I)V
+Lcom/android/server/DropBoxManagerService;->enrollEntry(Lcom/android/server/DropBoxManagerService$EntryFile;)V
+Lcom/android/server/ThreadPriorityBooster;->boost()V
+Lcom/android/server/ThreadPriorityBooster;->reset()V
+Lcom/android/server/wm/DisplayPolicy;->hasNavigationBar()Z
+Lcom/android/server/wm/DisplayPolicy;->navigationBarPosition(III)I
+Lcom/android/server/wm/DisplayPolicy;->navigationBarCanMove()Z
+Lcom/android/server/PersistentDataBlockService;->computeDigestLocked([B)[B
+Lcom/android/server/am/ActivityManagerService;->boostPriorityForLockedSection()V
+Lcom/android/server/am/ActivityManagerService;->resetPriorityAfterLockedSection()V
+Lcom/android/server/PinnerService;->clamp(III)I
+Lcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIZ)I
+Lcom/android/server/notification/PreferencesHelper;->readXml(Lorg/xmlpull/v1/XmlPullParser;ZI)V
+Lcom/android/server/pm/PackageManagerService;->updateFlags(II)I
+Lcom/android/server/pm/UserManagerService;->access$2800(Lcom/android/server/pm/UserManagerService;)Landroid/util/SparseIntArray;
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->queryIntentForPackage(Landroid/content/Intent;Ljava/lang/String;ILjava/util/List;I)Ljava/util/List;
+Lcom/android/server/IntentResolver;->queryIntentFromList(Landroid/content/Intent;Ljava/lang/String;ZLjava/util/ArrayList;I)Ljava/util/List;
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Landroid/content/pm/PackageParser$ServiceIntentInfo;Ljava/util/List;)Z
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Landroid/content/IntentFilter;Ljava/util/List;)Z
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/IntentFilter;)Z
+Lcom/android/server/pm/ComponentResolver$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/content/pm/PackageParser$ServiceIntentInfo;)Z
+Lcom/android/server/notification/PreferencesHelper;->writeXml(Lorg/xmlpull/v1/XmlSerializer;ZI)V
+Lcom/android/server/am/UserController;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I
+Lcom/android/server/am/UserController;->unsafeConvertIncomingUser(I)I
+Lcom/android/server/audio/AudioService$VolumeStreamState;->hasValidSettingsName()Z
+Lcom/android/server/audio/AudioService$VolumeStreamState;->readSettings()V
+Lcom/android/server/am/ActivityManagerService;->handleIncomingUser(IIIZZLjava/lang/String;Ljava/lang/String;)I
+Lcom/android/server/am/UserController;->getCurrentUserId()I
+Lcom/android/server/am/UserController;->ensureNotSpecialUser(I)V
+Lcom/android/server/audio/AudioService;->access$2800(Lcom/android/server/audio/AudioService;)Landroid/content/ContentResolver;
+Lcom/android/server/audio/AudioService$VolumeStreamState;->getSettingNameForDevice(I)Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->enforceCrossUserPermission(IIZZLjava/lang/String;)V
+Lcom/android/server/pm/permission/PermissionManagerService;->access$1900(Lcom/android/server/pm/permission/PermissionManagerService;IIZZZLjava/lang/String;)V
+Lcom/android/server/pm/permission/PermissionManagerService;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V
+Lcom/android/server/pm/UserManagerService;->userWithName(Landroid/content/pm/UserInfo;)Landroid/content/pm/UserInfo;
+Lcom/android/server/pm/UserManagerService;->checkManageOrCreateUsersPermission(Ljava/lang/String;)V
+Lcom/android/server/pm/UserManagerService;->hasManageOrCreateUsersPermission()Z
Lcom/android/server/pm/UserManagerService;->hasManageUsersOrPermission(Ljava/lang/String;)Z
-Lcom/android/server/am/OomAdjProfiler;->scheduleSystemServerCpuTimeUpdate()V
-Lcom/android/server/pm/PackageManagerService$ReconcileRequest;-><init>(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Lcom/android/server/pm/PackageManagerService$1;)V
-Lcom/android/server/pm/PackageManagerService$ReconcileRequest;-><init>(Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V
-Lcom/android/server/wm/ConfigurationContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
-Lcom/android/server/wm/RootActivityContainer;-><init>(Lcom/android/server/wm/ActivityTaskManagerService;)V
-Lcom/android/server/wm/ActivityTaskManagerService;->createRecentTasks()Lcom/android/server/wm/RecentTasks;
-Lcom/android/server/am/OomAdjuster;->updateOomAdjLocked()V
-Lcom/android/server/am/OomAdjuster;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;Z)Z
-Lcom/android/server/am/ActivityManagerService;->updateOomAdjLocked()V
-Lcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;Z)Z
-Lcom/android/server/pm/Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String;
-Lcom/android/server/am/OomAdjProfiler;->updateSystemServerCpuTime(ZZ)V
-Lcom/android/server/pm/UserManagerService;->getInstance()Lcom/android/server/pm/UserManagerService;
-Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->addAllPermissions(Landroid/content/pm/PackageParser$Package;Z)V
-Lcom/android/server/power/PowerManagerService$Injector;->createBatterySaverPolicy(Ljava/lang/Object;Landroid/content/Context;Lcom/android/server/power/batterysaver/BatterySavingStats;)Lcom/android/server/power/batterysaver/BatterySaverPolicy;
-Lcom/android/server/power/ThermalManagerService;-><init>(Landroid/content/Context;)V
-Lcom/android/server/power/ThermalManagerService;-><init>(Landroid/content/Context;Lcom/android/server/power/ThermalManagerService$ThermalHalWrapper;)V
-Lcom/android/server/display/PersistentDataStore$Injector;->openRead()Ljava/io/InputStream;
-Lcom/android/server/pm/PackageManagerService$ReconciledPackage;-><init>(Lcom/android/server/pm/PackageManagerService$InstallArgs;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageManagerService$PackageInstalledInfo;Lcom/android/server/pm/PackageManagerService$PrepareResult;Lcom/android/server/pm/PackageManagerService$ScanResult;Lcom/android/server/pm/PackageManagerService$DeletePackageAction;Ljava/util/List;Landroid/content/pm/PackageParser$SigningDetails;ZZLcom/android/server/pm/PackageManagerService$1;)V
-Lcom/android/server/pm/ComponentResolver;-><init>(Lcom/android/server/pm/UserManagerService;Landroid/content/pm/PackageManagerInternal;Ljava/lang/Object;)V
-Lcom/android/server/wm/LaunchParamsController;->registerDefaultModifiers(Lcom/android/server/wm/ActivityStackSupervisor;)V
-Lcom/android/server/Watchdog$OpenFdMonitor;->create()Lcom/android/server/Watchdog$OpenFdMonitor;
+Lcom/android/server/utils/TimingsTraceAndSlog;->traceBegin(Ljava/lang/String;)V
+Lcom/android/server/utils/TimingsTraceAndSlog;->logDuration(Ljava/lang/String;J)V
+Lcom/android/server/pm/PackageManagerService;->addPackageHoldingPermissions(Ljava/util/ArrayList;Lcom/android/server/pm/PackageSetting;[Ljava/lang/String;[ZII)V
+Lcom/android/server/pm/PackageManagerService;->updateFlagsForPackage(IILjava/lang/Object;)I
+Lcom/android/server/am/ActivityManagerService;->checkPermission(Ljava/lang/String;II)I
+Lcom/android/server/pm/UserManagerService;->isUserUnlockingOrUnlocked(I)Z
+Lcom/android/server/pm/UserManagerService;->checkManageOrInteractPermIfCallerInOtherProfileGroup(ILjava/lang/String;)V
+Lcom/android/server/pm/UserManagerService$LocalService;->isUserUnlockingOrUnlocked(I)Z
+Lcom/android/server/pm/PackageManagerService;->updateFlagsForComponent(IILjava/lang/Object;)I
Lcom/android/server/SystemServiceManager;->warnIfTooLong(JLcom/android/server/SystemService;Ljava/lang/String;)V
-Lcom/android/server/am/UserController$Injector;->getLockPatternUtils()Lcom/android/internal/widget/LockPatternUtils;
-Lcom/android/server/am/PendingIntentController;-><init>(Landroid/os/Looper;Lcom/android/server/am/UserController;)V
-Lcom/android/server/am/BroadcastQueue;-><init>(Lcom/android/server/am/ActivityManagerService;Landroid/os/Handler;Ljava/lang/String;Lcom/android/server/am/BroadcastConstants;Z)V
-Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayState(I)V
-Lcom/android/server/am/BatteryStatsService$WakeupReasonThread;->waitWakeup()Ljava/lang/String;
+Lcom/android/server/PinnerService;->pinFileRanges(Ljava/lang/String;ILcom/android/server/PinnerService$PinRangeSource;)Lcom/android/server/PinnerService$PinnedFile;
+Lcom/android/server/PinnerService$PinRangeSourceStream;->read(Lcom/android/server/PinnerService$PinRange;)Z
+Lcom/android/server/am/ReceiverList;->containsFilter(Landroid/content/IntentFilter;)Z
+Lcom/android/server/pm/Settings;->isEnabledAndMatchLPr(Landroid/content/pm/ComponentInfo;II)Z
+Lcom/android/server/pm/permission/PermissionManagerService;->access$2100(Lcom/android/server/pm/permission/PermissionManagerService;)Lcom/android/server/pm/permission/PermissionSettings;
+Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getAllPermissionWithProtectionLevel(I)Ljava/util/ArrayList;
+Lcom/android/server/pm/PackageManagerService;->forEachPackage(Ljava/util/function/Consumer;)V
+Lcom/android/server/pm/permission/PermissionManagerService;->access$200(Lcom/android/server/pm/permission/PermissionManagerService;)Landroid/content/pm/PackageManagerInternal;
+Lcom/android/server/pm/permission/-$$Lambda$PermissionManagerService$7fYYDxKgBF9e9QlxmWAdwL0CsDs;->accept(Ljava/lang/Object;)V
+Lcom/android/server/pm/permission/PermissionManagerService;->lambda$updatePermissions$10$PermissionManagerService(Landroid/content/pm/PackageParser$Package;ZLjava/lang/String;Ljava/lang/String;Lcom/android/server/pm/permission/PermissionManagerServiceInternal$PermissionCallback;Landroid/content/pm/PackageParser$Package;)V
+Lcom/android/server/pm/permission/PermissionManagerService;->getVolumeUuidForPackage(Landroid/content/pm/PackageParser$Package;)Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionsState;->setGlobalGids([I)V
+Lcom/android/server/pm/permission/PermissionManagerService;->checkIfLegacyStorageOpsNeedToBeUpdated(Landroid/content/pm/PackageParser$Package;Z[I)[I
+Lcom/android/server/pm/permission/PermissionManagerService$1;->onPermissionUpdated([IZ)V
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->writePermissionSettings([IZ)V
+Lcom/android/server/pm/PackageSetting;->isPrivileged()Z
+Lcom/android/server/pm/permission/BasePermission;->isPre23()Z
+Lcom/android/server/pm/permission/BasePermission;->isInstaller()Z
+Lcom/android/server/usage/AppIdleHistory;->getLongValue(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J
+Lcom/android/server/pm/PackageManagerService;->reconcileApps(Ljava/lang/String;)V
+Lcom/android/server/usage/AppIdleHistory;->readAppIdleTimes(ILandroid/util/ArrayMap;)V
+Lcom/android/server/SystemServiceManager;->startBootPhase(Lcom/android/server/utils/TimingsTraceAndSlog;I)V
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackageList(Landroid/content/pm/PackageManagerInternal$PackageListObserver;)Landroid/content/pm/PackageList;
+Lcom/android/server/pm/PackageManagerService;->getPackagesForUid(I)[Ljava/lang/String;
+Lcom/android/server/wm/ConfigurationContainer;->getConfiguration()Landroid/content/res/Configuration;
+Lcom/android/server/am/ActivityManagerService;->enforceNotIsolatedCaller(Ljava/lang/String;)V
+Lcom/android/server/am/ActivityManagerService;->getRecordForAppLocked(Landroid/app/IApplicationThread;)Lcom/android/server/am/ProcessRecord;
+Lcom/android/server/am/ProcessList;->getLRURecordForAppLocked(Landroid/app/IApplicationThread;)Lcom/android/server/am/ProcessRecord;
+Lcom/android/server/am/ActivityManagerService;->isInstantApp(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)Z
+Lcom/android/server/inputmethod/InputMethodUtils$InputMethodSettings;->getEnabledInputMethodSubtypeListLocked(Landroid/view/inputmethod/InputMethodInfo;)Ljava/util/List;
+Lcom/android/server/inputmethod/InputMethodSubtypeSwitchingController$InputMethodAndSubtypeList;->getSortedInputMethodAndSubtypeList(ZZ)Ljava/util/List;
+Lcom/android/server/policy/PermissionPolicyService;->getSwitchOp(Ljava/lang/String;)I
+Lcom/android/server/policy/PermissionPolicyService;->access$500(Ljava/lang/String;)I
+Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addPackage(Ljava/lang/String;)V
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getInstantAppPackageName(I)Ljava/lang/String;
+Lcom/android/server/pm/PackageManagerService;->access$5500(Lcom/android/server/pm/PackageManagerService;I)Ljava/lang/String;
+Lcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;
+Lcom/android/server/pm/permission/BasePermission;->getProtectionLevel()I
+Lcom/android/server/pm/permission/PermissionManagerService;->adjustPermissionProtectionFlagsLocked(ILjava/lang/String;I)I
+Lcom/android/server/pm/permission/BasePermission;->generatePermissionInfo(II)Landroid/content/pm/PermissionInfo;
+Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addOpIfRestricted(Landroid/content/pm/PermissionInfo;Landroid/content/pm/PackageInfo;)V
+Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addOpIfFgPermissions(Landroid/content/pm/PermissionInfo;Landroid/content/pm/PackageInfo;)V
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->filterAppAccess(Landroid/content/pm/PackageParser$Package;II)Z
+Lcom/android/server/pm/PackageManagerService;->access$5600(Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageSetting;II)Z
+Lcom/android/server/wm/ActivityTaskManagerService;->getRecentTasks()Lcom/android/server/wm/RecentTasks;
+Lcom/android/server/pm/PackageManagerService;->isRecentsAccessingChildProfiles(II)Z
+Lcom/android/server/pm/PackageManagerService$Injector;->getActivityTaskManagerInternal()Lcom/android/server/wm/ActivityTaskManagerInternal;
+Lcom/android/server/wm/ActivityTaskManagerService$LocalService;->isCallerRecents(I)Z
+Lcom/android/server/wm/RecentTasks;->isCallerRecents(I)Z
+Lcom/android/server/pm/PackageManagerService;->getApplicationInfoInternal(Ljava/lang/String;III)Landroid/content/pm/ApplicationInfo;
+Lcom/android/server/pm/PackageManagerService;->updateFlagsForApplication(IILjava/lang/Object;)I
+Lcom/android/server/pm/PackageManagerService;->getApplicationInfo(Ljava/lang/String;II)Landroid/content/pm/ApplicationInfo;
+Lcom/android/server/pm/PackageManagerService;->getPackageInfo(Ljava/lang/String;II)Landroid/content/pm/PackageInfo;
+Lcom/android/server/pm/PackageManagerService;->getPackageInfoInternal(Ljava/lang/String;JIII)Landroid/content/pm/PackageInfo;
+Lcom/android/server/policy/SoftRestrictedPermissionPolicy;->getMinimumTargetSDK(Landroid/content/Context;Landroid/content/pm/ApplicationInfo;Landroid/os/UserHandle;)I
+Lcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlagsInternal(Ljava/lang/String;Ljava/lang/String;II)I
+Lcom/android/server/pm/permission/PermissionManagerService;->enforceGrantRevokeGetRuntimePermissionPermissions(Ljava/lang/String;)V
+Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser$OpToChange;-><init>(Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;ILjava/lang/String;I)V
+Lcom/android/server/appop/AppOpsService;->getUidStateLocked(IZ)Lcom/android/server/appop/AppOpsService$UidState;
+Lcom/android/server/appop/AppOpsService;->verifyIncomingUid(I)V
+Lcom/android/server/appop/AppOpsService;->verifyIncomingOp(I)V
+Lcom/android/server/pm/UserManagerService;->hasManagedProfile(I)Z
+Lcom/android/server/appop/AppOpsService;->verifyAndGetIsPrivileged(ILjava/lang/String;)Z
+Lcom/android/server/appop/AppOpsService;->resolvePackageName(ILjava/lang/String;)Ljava/lang/String;
+Lcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Z)Z
+Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->syncPackages()V
+Lcom/android/server/appop/AppOpsService;->checkOperationInternal(IILjava/lang/String;Z)I
+Lcom/android/server/appop/AppOpsService;->checkOperationImpl(IILjava/lang/String;Z)I
+Lcom/android/server/appop/AppOpsService;->checkOperationUnchecked(IILjava/lang/String;Z)I
+Lcom/android/server/pm/permission/BasePermission;->isVerifier()Z
+Lcom/android/server/pm/permission/BasePermission;->isPreInstalled()Z
+Lcom/android/server/policy/PermissionPolicyService;->isStarted(I)Z
+Lcom/android/server/policy/PermissionPolicyService$Internal;->isInitialized(I)Z
+Lcom/android/server/policy/PermissionPolicyService;->access$100(Lcom/android/server/policy/PermissionPolicyService;I)Z
+Lcom/android/server/usage/AppStandbyController;->getIdleUidsForUser(I)[I
+Lcom/android/server/pm/PackageManagerService;->getInstalledApplicationsListInternal(III)Ljava/util/List;
+Lcom/android/server/am/ProcessRecord;->getCurProcState()I
+Lcom/android/server/connectivity/PermissionMonitor;->hasPermission(Landroid/content/pm/PackageInfo;Ljava/lang/String;)Z
+Lcom/android/server/connectivity/PermissionMonitor;->getNetdPermissionMask([Ljava/lang/String;[I)I
+Lcom/android/server/usage/AppStandbyController;->isAppIdleFiltered(Ljava/lang/String;IIJ)Z
+Lcom/android/server/usage/AppStandbyController;->isAppSpecial(Ljava/lang/String;II)Z
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPackage(I)Landroid/content/pm/PackageParser$Package;
+Lcom/android/server/usage/AppStandbyController$Injector;->isPowerSaveWhitelistExceptIdleApp(Ljava/lang/String;)Z
+Lcom/android/server/DeviceIdleController$BinderService;->isPowerSaveWhitelistExceptIdleApp(Ljava/lang/String;)Z
+Lcom/android/server/DeviceIdleController;->isPowerSaveWhitelistExceptIdleAppInternal(Ljava/lang/String;)Z
+Lcom/android/server/usage/AppIdleHistory;->getUserHistory(I)Landroid/util/ArrayMap;
+Lcom/android/server/usage/AppIdleHistory;->getPackageHistory(Landroid/util/ArrayMap;Ljava/lang/String;JZ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;
+Lcom/android/server/net/NetworkPolicyManagerService;->updateRulesForAllAppsUL(I)V
+Lcom/android/server/pm/permission/PermissionManagerService;->checkUidPermission(Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/PermissionManagerService;->checkUidPermissionImpl(Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/PermissionManagerService;->checkUidPermissionInternal(Ljava/lang/String;Landroid/content/pm/PackageParser$Package;II)I
+Lcom/android/server/pm/PackageManagerService;->checkUidPermission(Ljava/lang/String;I)I
+Lcom/android/server/net/NetworkPolicyManagerService;->hasInternetPermissions(I)Z
+Lcom/android/server/pm/permission/PermissionManagerService;->isImpliedPermissionGranted(Lcom/android/server/pm/permission/PermissionsState;Ljava/lang/String;I)Z
+Lcom/android/server/pm/PackageManagerService;->resolveContentProvider(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+Lcom/android/server/pm/PackageManagerService;->resolveContentProviderInternal(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+Lcom/android/server/pm/ComponentResolver;->queryProvider(Ljava/lang/String;II)Landroid/content/pm/ProviderInfo;
+Lcom/android/server/am/OomAdjuster;->updateOomAdjLocked(Ljava/lang/String;)V
+Lcom/android/server/am/BroadcastFilter;-><init>(Landroid/content/IntentFilter;Lcom/android/server/am/ReceiverList;Ljava/lang/String;Ljava/lang/String;IIZZ)V
+Lcom/android/server/am/ActivityManagerService$PidMap;->get(I)Lcom/android/server/am/ProcessRecord;
+Lcom/android/server/am/UidRecord;->getCurProcState()I
+Lcom/android/server/am/ActivityManagerService;->checkContentProviderPermissionLocked(Landroid/content/pm/ProviderInfo;Lcom/android/server/am/ProcessRecord;IZ)Ljava/lang/String;
+Lcom/android/server/am/ActiveUids;->valueAt(I)Lcom/android/server/am/UidRecord;
+Lcom/android/server/NetworkManagementService;->getFirewallChainState(I)Z
+Lcom/android/server/pm/ComponentResolver;->access$800()Lcom/android/server/pm/UserManagerService;
+Lcom/android/server/content/ContentService;->handleIncomingUser(Landroid/net/Uri;IIIZI)I
+Lcom/android/server/am/ActivityManagerService$LocalService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
+Lcom/android/server/am/ActivityManagerService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;
+Lcom/android/server/content/ContentService;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V
+Lcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;Landroid/database/IContentObserver;ZLjava/lang/Object;III)V
+Lcom/android/server/content/ContentService$ObserverNode$ObserverEntry;-><init>(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZLjava/lang/Object;IIILandroid/net/Uri;)V
+Lcom/android/server/content/ContentService;->access$300()Lcom/android/internal/os/BinderDeathDispatcher;
+Lcom/android/server/am/ProcessRecord;->setCurRawAdj(I)V
+Lcom/android/server/wm/WindowProcessController;->setPerceptible(Z)V
+Lcom/android/server/am/OomAdjuster;->computeOomAdjLocked(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJZ)Z
+Lcom/android/server/am/UidRecord;->setCurProcState(I)V
+Lcom/android/server/am/ProcessRecord;->setCurRawProcState(I)V
+Lcom/android/server/location/GnssConfiguration;->loadPropertiesFromCarrierConfig()V
+Lcom/android/server/LockGuard;->guard(I)V
+Lcom/android/server/role/RoleManagerService;->lambda$computeComponentStateHash$2(Ljava/io/ByteArrayOutputStream;Landroid/content/pm/PackageManagerInternal;ILandroid/content/pm/PackageParser$Package;)V
+Lcom/android/server/wm/ActivityStack;->topRunningActivityLocked(Z)Lcom/android/server/wm/ActivityRecord;
+Lcom/android/server/pm/UserManagerService;->getUserInfoLU(I)Landroid/content/pm/UserInfo;
+Lcom/android/server/wm/RootActivityContainer;->getActivityDisplay(I)Lcom/android/server/wm/ActivityDisplay;
+Lcom/android/server/wm/ActivityStack;->getDisplay()Lcom/android/server/wm/ActivityDisplay;
+Lcom/android/server/wm/ConfigurationContainer;->getActivityType()I
+Lcom/android/server/wm/ActivityStack;->topRunningActivityLocked()Lcom/android/server/wm/ActivityRecord;
+Lcom/android/server/wm/WindowContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/WindowContainer;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+Lcom/android/server/am/ActivityManagerService$4;->allowFilterResult(Lcom/android/server/am/BroadcastFilter;Ljava/util/List;)Z
+Lcom/android/server/am/ProcessRecord;->getWindowProcessController()Lcom/android/server/wm/WindowProcessController;
+Lcom/android/server/usage/AppStandbyController;->isActiveDeviceAdmin(Ljava/lang/String;I)Z
+Lcom/android/server/usage/AppStandbyController;->isActiveNetworkScorer(Ljava/lang/String;)Z
+Lcom/android/server/usage/AppStandbyController$Injector;->getActiveNetworkScorer()Ljava/lang/String;
+Lcom/android/server/NetworkScoreService;->getActiveScorerPackage()Ljava/lang/String;
+Lcom/android/server/NetworkScoreService;->enforceSystemOrHasScoreNetworks()V
+Lcom/android/server/usage/AppStandbyController$Injector;->isBoundWidgetPackage(Landroid/appwidget/AppWidgetManager;Ljava/lang/String;I)Z
+Lcom/android/server/appwidget/AppWidgetServiceImpl;->isBoundWidgetPackage(Ljava/lang/String;I)Z
+Lcom/android/server/usage/AppStandbyController;->isDeviceProvisioningPackage(Ljava/lang/String;)Z
+Lcom/android/server/usage/AppStandbyController;->isCarrierApp(Ljava/lang/String;)Z
+Lcom/android/server/usage/AppIdleHistory;->getThresholdIndex(Ljava/lang/String;IJ[J[J)I
+Lcom/android/server/usage/AppIdleHistory;->getElapsedTime(J)J
+Lcom/android/server/usage/AppIdleHistory;->isIdle(Ljava/lang/String;IJ)Z
+Lcom/android/server/net/NetworkPolicyManagerService;->isUidValidForBlacklistRules(I)Z
+Lcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(IIZ)I
+Lcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsULInner(IIZ)I
+Lcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(I)V
+Lcom/android/server/usage/AppStandbyController;->isAppIdleUnfiltered(Ljava/lang/String;IJ)Z
+Lcom/android/server/usage/AppStandbyController;->informListeners(Ljava/lang/String;IIIZ)V
+Lcom/android/server/am/ActivityManagerService;->dispatchUidsChangedForObserver(Landroid/app/IUidObserver;Lcom/android/server/am/ActivityManagerService$UidObserverRegistration;I)V
+Lcom/android/server/pm/PackageManagerService;->getPackageUid(Ljava/lang/String;II)I
+Lcom/android/server/am/ProcessRecord;->getCurRawAdj()I
+Lcom/android/server/am/ProcessRecord;->getReportedProcState()I
+Lcom/android/server/usage/UserUsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;)V
+Lcom/android/server/usage/IntervalStats;->update(Ljava/lang/String;Ljava/lang/String;JII)V
+Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;->resolveWorkSourceUid(I)I
+Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;->getCallingUid()I
+Lcom/android/server/wm/WindowContainer;->getParent()Lcom/android/server/wm/WindowContainer;
+Lcom/android/server/wm/WindowContainer;->scheduleAnimation()V
+Lcom/android/server/wm/ConfigurationContainer;->getBounds()Landroid/graphics/Rect;
+Lcom/android/server/wm/DisplayContent;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/WindowContainer;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;
+Lcom/android/server/wm/DisplayContent;->skipTraverseChild(Lcom/android/server/wm/WindowContainer;)Z
+Lcom/android/server/am/ActivityManagerService;->incrementProcStateSeqAndNotifyAppsLocked()V
+Lcom/android/server/wm/WindowManagerService;->boostPriorityForLockedSection()V
+Lcom/android/server/wm/WindowManagerThreadPriorityBooster;->boost()V
+Lcom/android/server/wm/WindowManagerService;->resetPriorityAfterLockedSection()V
+Lcom/android/server/wm/WindowManagerThreadPriorityBooster;->reset()V
+Lcom/android/server/IntentResolver;->filterResults(Ljava/util/List;)V
+Lcom/android/server/IntentResolver;->getFastIntentCategories(Landroid/content/Intent;)Landroid/util/FastImmutableArraySet;
+Lcom/android/server/am/ProcessRecord;->getCurrentSchedulingGroup()I
+Lcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZIILjava/util/ArrayList;)V
+Lcom/android/server/display/LogicalDisplay;->getDisplayInfoLocked()Landroid/view/DisplayInfo;
+Lcom/android/server/am/UidRecord;->reset()V
+Lcom/android/server/am/ActivityManagerService;->isReceivingBroadcastLocked(Lcom/android/server/am/ProcessRecord;Landroid/util/ArraySet;)Z
+Lcom/android/server/am/ProcessRecord;->hasForegroundServices()Z
+Lcom/android/server/wm/WindowContainer;->prepareSurfaces()V
+Lcom/android/server/am/ReceiverList;-><init>(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;IIILandroid/content/IIntentReceiver;)V
+Lcom/android/server/am/ReceiverList;->hashCode()I
+Lcom/android/server/display/DisplayManagerService;->access$1600(Lcom/android/server/display/DisplayManagerService;II)Landroid/view/DisplayInfo;
+Lcom/android/server/display/DisplayManagerService;->getDisplayInfoInternal(II)Landroid/view/DisplayInfo;
+Lcom/android/server/display/DisplayManagerService$BinderService;->getDisplayInfo(I)Landroid/view/DisplayInfo;
+Lcom/android/server/am/ActivityManagerService$Injector;->isNetworkRestrictedForUid(I)Z
+Lcom/android/server/am/ActivityManagerService$Injector;->ensureHasNetworkManagementInternal()Z
+Lcom/android/server/NetworkManagementService$LocalService;->isNetworkRestrictedForUid(I)Z
+Lcom/android/server/NetworkManagementService;->access$1400(Lcom/android/server/NetworkManagementService;I)Z
+Lcom/android/server/NetworkManagementService;->isNetworkRestrictedInternal(I)Z
+Lcom/android/server/wm/ConfigurationContainer;->getWindowingMode()I
+Lcom/android/server/wm/WindowContainer;->isSelfOrChildAnimating()Z
+Lcom/android/server/am/ProcessRecord;->setCurrentSchedulingGroup(I)V
+Lcom/android/server/wm/WindowProcessController;->setCurrentSchedulingGroup(I)V
+Lcom/android/server/IntentResolver;->queryIntent(Landroid/content/Intent;Ljava/lang/String;ZI)Ljava/util/List;
+Lcom/android/server/am/ProcessRecord;->hasForegroundActivities()Z
+Lcom/android/server/wm/WindowState;->getDisplayContent()Lcom/android/server/wm/DisplayContent;
+Lcom/android/server/pm/ComponentResolver;->access$900()Landroid/content/pm/PackageManagerInternal;
+Lcom/android/server/wm/SurfaceAnimator;->hasLeash()Z
+Lcom/android/server/wm/WindowContainer;->checkCompleteDeferredRemoval()Z
+Lcom/android/server/wm/WindowContainer;->isSelfAnimating()Z
+Lcom/android/server/wm/SurfaceAnimator;->isAnimating()Z
+Lcom/android/server/wm/DisplayContent;->getDisplayId()I
+Lcom/android/server/am/ProcessRecord;->setHasForegroundActivities(Z)V
+Lcom/android/server/wm/WindowProcessController;->setHasForegroundActivities(Z)V
+Lcom/android/server/am/ProcessRecord;->setCurProcState(I)V
+Lcom/android/server/wm/WindowProcessController;->setCurrentProcState(I)V
+Lcom/android/server/am/ActivityManagerService;->updateLowMemStateLocked(III)Z
+Lcom/android/server/wm/ConfigurationContainer;->getWindowConfiguration()Landroid/app/WindowConfiguration;
+Lcom/android/server/am/OomAdjuster;->applyOomAdjLocked(Lcom/android/server/am/ProcessRecord;ZJJ)Z
+Lcom/android/server/am/AppCompactor;->useCompaction()Z
+Lcom/android/server/am/ProcessList;->procStatesDifferForMem(II)Z
+Lcom/android/server/am/ActivityManagerService;->dispatchUidsChanged()V
+Lcom/android/server/audio/AudioService$VolumeStreamState;->setIndex(IILjava/lang/String;)Z
+Lcom/android/server/audio/AudioService;->access$3000(Lcom/android/server/audio/AudioService;)[Lcom/android/server/audio/AudioService$VolumeStreamState;
+Lcom/android/server/content/ContentService$ObserverNode;->removeObserverLocked(Landroid/database/IContentObserver;)Z
+Lcom/android/server/wm/DisplayContent$TaskStackContainers;->forAllExitingAppTokenWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/WindowState;->getTask()Lcom/android/server/wm/Task;
+Lcom/android/server/appop/AppOpsService;->getOpLocked(IILjava/lang/String;ZZ)Lcom/android/server/appop/AppOpsService$Op;
+Lcom/android/server/appop/AppOpsService;->getOpsRawNoVerifyLocked(ILjava/lang/String;ZZ)Lcom/android/server/appop/AppOpsService$Ops;
+Lcom/android/server/wm/AppWindowToken;->getTask()Lcom/android/server/wm/Task;
+Lcom/android/server/wm/WindowContainer;->checkAppWindowsReadyToShow()V
+Lcom/android/server/SystemService;->getContext()Landroid/content/Context;
+Lcom/android/server/am/ProcessRecord;->getInteractionEventTime()J
+Lcom/android/server/power/PowerManagerService;->findWakeLockIndexLocked(Landroid/os/IBinder;)I
+Lcom/android/server/power/PowerManagerService;->updateWakeLockSummaryLocked(I)V
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isEnabledAndMatches(Landroid/content/pm/ComponentInfo;II)Z
+Lcom/android/server/wm/ConfigurationContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V
+Lcom/android/server/policy/SoftRestrictedPermissionPolicy;->forPermission(Landroid/content/Context;Landroid/content/pm/ApplicationInfo;Landroid/os/UserHandle;Ljava/lang/String;)Lcom/android/server/policy/SoftRestrictedPermissionPolicy;
+Lcom/android/server/appop/AppOpsService;->checkOperationRaw(IILjava/lang/String;)I
+Lcom/android/server/appop/AppOpsService;->getOpLocked(Lcom/android/server/appop/AppOpsService$Ops;IZ)Lcom/android/server/appop/AppOpsService$Op;
+Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->setUidModeIfMode(IIIILjava/lang/String;)Z
+Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->setUidModeAllowedIfDefault(IILjava/lang/String;)Z
+Lcom/android/server/pm/PackageManagerService;->getPackagesForSharedUserIdLocked(Ljava/lang/String;I)[Ljava/lang/String;
+Lcom/android/server/policy/PermissionPolicyService;->synchronizePackagePermissionsAndAppOpsForUser(Ljava/lang/String;I)V
+Lcom/android/server/am/ActivityManagerService;->getPackageManagerInternalLocked()Landroid/content/pm/PackageManagerInternal;
+Lcom/android/server/power/PowerManagerService;->getWakeLockSummaryFlags(Lcom/android/server/power/PowerManagerService$WakeLock;)I
+Lcom/android/server/TelephonyRegistry;->add(Landroid/os/IBinder;)Lcom/android/server/TelephonyRegistry$Record;
+Lcom/android/server/am/ServiceRecord;->getConnections()Landroid/util/ArrayMap;
+Lcom/android/server/am/ProcessRecord;->hasTopUi()Z
+Lcom/android/server/wm/WindowProcessController;->hasVisibleActivities()Z
+Lcom/android/server/am/ActivityManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Lcom/android/server/am/ProcessRecord;->hasPendingUiClean()Z
+Lcom/android/server/am/UserController;->getStartedUserState(I)Lcom/android/server/am/UserState;
+Lcom/android/server/wm/ConfigurationContainer;->inSplitScreenPrimaryWindowingMode()Z
+Lcom/android/server/wm/ActivityDisplay;->getFocusedStack()Lcom/android/server/wm/ActivityStack;
+Lcom/android/server/pm/dex/DexManager$PackageCodeLocations;->searchDex(Ljava/lang/String;I)I
+Lcom/android/server/pm/dex/DexManager;->getDexPackage(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Lcom/android/server/pm/dex/DexManager$DexSearchResult;
+Lcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IILandroid/content/Intent;IZZ)I
+Lcom/android/server/wm/WindowState;->getParentWindow()Lcom/android/server/wm/WindowState;
+Lcom/android/server/TelephonyRegistry$Record;->matchPhoneStateListenerEvent(I)Z
+Lcom/android/server/wm/WindowState;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/WindowState;->applyInOrderWithImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/WindowState;->applyImeWindowsIfNeeded(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/WindowState;->isInputMethodTarget()Z
+Lcom/android/server/wm/WindowContainer;->getChildCount()I
+Lcom/android/server/am/ProcessRecord;->getActiveInstrumentation()Lcom/android/server/am/ActiveInstrumentation;
+Lcom/android/server/am/ProcessRecord;->modifyRawOomAdj(I)I
+Lcom/android/server/wm/WindowAnimator;->scheduleAnimation()V
+Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Ljava/lang/Object;)Z
+Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Lcom/android/server/wm/WindowState;)Z
+Lcom/android/server/wm/RootWindowContainer;->getDisplayContent(I)Lcom/android/server/wm/DisplayContent;
+Lcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTopProcessState()I
+Lcom/android/server/wm/ActivityTaskManagerService$LocalService;->isHeavyWeightProcess(Lcom/android/server/wm/WindowProcessController;)Z
+Lcom/android/server/wm/WindowProcessController;->isHomeProcess()Z
+Lcom/android/server/wm/WindowProcessController;->isPreviousProcess()Z
+Lcom/android/server/pm/PackageManagerService;->updateFlagsForResolve(IILandroid/content/Intent;IZ)I
+Lcom/android/server/am/BroadcastQueue;->processNextBroadcastLocked(ZZ)V
+Lcom/android/server/am/ActivityManagerService;->ensureAllowedAssociations()V
+Lcom/android/server/am/ActivityManagerService;->validateAssociationAllowedLocked(Ljava/lang/String;ILjava/lang/String;I)Z
+Lcom/android/server/StorageManagerService;->isUserKeyUnlocked(I)Z
+Lcom/android/server/am/ProcessRecord;->hasOverlayUi()Z
+Lcom/android/server/am/ContentProviderRecord;->hasExternalProcessHandles()Z
+Lcom/android/server/am/UserController;->isUserRunning(II)Z
+Lcom/android/server/wm/RootActivityContainer;->isFocusable(Lcom/android/server/wm/ConfigurationContainer;Z)Z
+Lcom/android/server/wm/WindowProcessController;->hasActivities()Z
+Lcom/android/server/wm/WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams;
+Lcom/android/server/am/ProcessRecord$PackageList;->containsKey(Ljava/lang/Object;)Z
+Lcom/android/server/wm/ActivityDisplay;->getChildCount()I
+Lcom/android/server/TelephonyRegistry;->notifyDataConnectionForSubscriber(IIIZLjava/lang/String;Ljava/lang/String;Landroid/net/LinkProperties;Landroid/net/NetworkCapabilities;IZ)V
+Lcom/android/server/am/OomAdjuster;->shouldSkipDueToCycle(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;IIZ)Z
+Lcom/android/server/am/ProcessRecord;->getCurRawProcState()I
+Lcom/android/server/am/ConnectionRecord;->trackProcState(IIJ)V
+Lcom/android/server/wm/ActivityStack;->getResumedActivity()Lcom/android/server/wm/ActivityRecord;
+Lcom/android/server/wm/ActivityStackSupervisor;->isCurrentProfileLocked(I)Z
+Lcom/android/server/wm/ActivityRecord;->okToShowLocked()Z
+Lcom/android/server/am/ActivityManagerService$LocalService;->isUserRunning(II)Z
+Lcom/android/server/am/ProcessRecord;->hasRecentTasks()Z
+Lcom/android/server/wm/WindowProcessController;->hasRecentTasks()Z
+Lcom/android/server/am/ConnectionRecord;->hasFlag(I)Z
+Lcom/android/server/am/ActiveServices;->updateServiceClientActivitiesLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;Z)Z
+Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isPermissionsReviewRequired(Ljava/lang/String;I)Z
+Lcom/android/server/pm/PackageManagerService;->access$5900(Lcom/android/server/pm/PackageManagerService;)Lcom/android/server/pm/permission/PermissionManagerServiceInternal;
+Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->isPermissionsReviewRequired(Landroid/content/pm/PackageParser$Package;I)Z
+Lcom/android/server/pm/permission/PermissionManagerService;->access$600(Lcom/android/server/pm/permission/PermissionManagerService;Landroid/content/pm/PackageParser$Package;I)Z
+Lcom/android/server/pm/permission/PermissionManagerService;->isPermissionsReviewRequired(Landroid/content/pm/PackageParser$Package;I)Z
+Lcom/android/server/am/ProcessRecord;->updateBoundClientUids()V
+Lcom/android/server/firewall/IntentFirewall;->checkIntent(Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;Landroid/content/ComponentName;ILandroid/content/Intent;IILjava/lang/String;I)Z
+Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->queryByComponent(Landroid/content/ComponentName;Ljava/util/List;)V
+Lcom/android/server/pm/permission/PermissionManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/PermissionManagerService;->checkPermissionImpl(Ljava/lang/String;Ljava/lang/String;I)I
+Lcom/android/server/pm/permission/PermissionManagerService;->checkPermissionInternal(Ljava/lang/String;Ljava/lang/String;II)I
+Lcom/android/server/am/ActivityManagerService;->checkTime(JLjava/lang/String;)V
+Lcom/android/server/wm/ActivityDisplay;->getChildAt(I)Lcom/android/server/wm/ActivityStack;
+Lcom/android/server/power/PowerManagerService;->access$3700(Lcom/android/server/power/PowerManagerService;)Landroid/content/Context;
+Lcom/android/server/appop/AppOpsService;->checkPackage(ILjava/lang/String;)I
+Lcom/android/server/am/BroadcastQueue;->deliverToRegisteredReceiverLocked(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;ZI)V
+Lcom/android/server/am/ProcessList;->checkSlow(JLjava/lang/String;)V
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->isFilterStopped(Landroid/content/IntentFilter;I)Z
+Lcom/android/server/pm/ComponentResolver$ActivityIntentResolver;->isFilterStopped(Landroid/content/pm/PackageParser$ActivityIntentInfo;I)Z
+Lcom/android/server/wm/ConfigurationContainer;->inPinnedWindowingMode()Z
+Lcom/android/server/am/ActiveUids;->size()I
+Lcom/android/server/wm/TaskRecord;->topRunningActivityLocked()Lcom/android/server/wm/ActivityRecord;
+Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->sortResults(Ljava/util/List;)V
+Lcom/android/server/pm/PackageManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z
+Lcom/android/server/wm/WindowContainer;->isAnimating()Z
+Lcom/android/server/wm/WindowContainer;->getDisplayedBounds()Landroid/graphics/Rect;
+Lcom/android/server/wm/WindowManagerService;->scheduleAnimationLocked()V
+Lcom/android/server/wm/Dimmer;->resetDimStates()V
+Lcom/android/server/wm/Dimmer;->updateDims(Landroid/view/SurfaceControl$Transaction;Landroid/graphics/Rect;)Z
+Lcom/android/server/wm/WindowState;->wouldBeVisibleIfPolicyIgnored()Z
+Lcom/android/server/firewall/IntentFirewall;->checkBroadcast(Landroid/content/Intent;IILjava/lang/String;I)Z
+Lcom/android/server/am/BroadcastQueue;->requestStartTargetPermissionsReviewIfNeededLocked(Lcom/android/server/am/BroadcastRecord;Ljava/lang/String;I)Z
+Lcom/android/server/wm/WindowState;->isParentWindowHidden()Z
+Lcom/android/server/wm/WindowStateAnimator;->hasSurface()Z
+Lcom/android/server/wm/WindowContainer;->getDimmer()Lcom/android/server/wm/Dimmer;
+Lcom/android/server/power/batterysaver/BatterySaverPolicy;->getCurrentPolicyLocked()Lcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;
+Lcom/android/server/power/batterysaver/BatterySaverPolicy;->getBatterySaverPolicy(I)Landroid/os/PowerSaveState;
+Lcom/android/server/power/Notifier;->getBatteryStatsWakeLockMonitorType(I)I
+Lcom/android/server/display/DisplayManagerService;->access$600(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayManagerService$SyncRoot;
+Lcom/android/server/power/PowerManagerService;->updatePowerStateLocked()V
+Lcom/android/server/am/BatteryStatsService;->enforceCallingPermission()V
+Lcom/android/server/power/PowerManagerService;->isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()Z
+Lcom/android/server/wm/WindowState;->isVisible()Z
+Lcom/android/server/power/PowerManagerService;->updateIsPoweredLocked(I)V
+Lcom/android/server/power/PowerManagerService;->updateStayOnLocked(I)V
+Lcom/android/server/power/PowerManagerService;->updateScreenBrightnessBoostLocked(I)V
+Lcom/android/server/power/PowerManagerService;->updateUserActivitySummaryLocked(JI)V
+Lcom/android/server/power/PowerManagerService;->updateWakefulnessLocked(I)Z
+Lcom/android/server/power/PowerManagerService;->updateProfilesLocked(J)V
+Lcom/android/server/power/PowerManagerService;->updateDisplayPowerStateLocked(I)Z
+Lcom/android/server/power/PowerManagerService;->updateDreamLocked(IZ)V
+Lcom/android/server/power/PowerManagerService;->finishWakefulnessChangeIfNeededLocked()V
+Lcom/android/server/power/PowerManagerService;->updateSuspendBlockerLocked()V
+Lcom/android/server/power/PowerManagerService;->needDisplaySuspendBlockerLocked()Z
+Lcom/android/server/power/PowerManagerService;->setHalAutoSuspendModeLocked(Z)V
+Lcom/android/server/power/PowerManagerService;->setHalInteractiveModeLocked(Z)V
+Lcom/android/server/display/DisplayManagerService;->access$3900(Lcom/android/server/display/DisplayManagerService;)Lcom/android/server/display/DisplayPowerController;
+Lcom/android/server/power/PowerManagerService;->scheduleSandmanLocked()V
+Lcom/android/server/appop/AppOpsService;->scheduleWriteLocked()V
+Lcom/android/server/power/PowerManagerService;->getDesiredScreenPolicyLocked()I
+Lcom/android/server/power/PowerManagerService;->shouldUseProximitySensorLocked()Z
+Lcom/android/server/power/PowerManagerService;->shouldBoostScreenBrightness()Z
+Lcom/android/server/power/PowerManagerService;->updatePowerRequestFromBatterySaverPolicy(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;)V
+Lcom/android/server/display/DisplayManagerService$LocalService;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z
+Lcom/android/server/display/DisplayPowerController;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z
+Lcom/android/server/power/PowerManagerService$PowerManagerHandler;->handleMessage(Landroid/os/Message;)V
+Lcom/android/server/power/PowerManagerService;->access$3100(Lcom/android/server/power/PowerManagerService;)V
+Lcom/android/server/power/PowerManagerService;->handleSandman()V
+Lcom/android/server/dreams/DreamManagerService$LocalService;->isDreaming()Z
+Lcom/android/server/dreams/DreamManagerService;->access$1400(Lcom/android/server/dreams/DreamManagerService;)Z
+Lcom/android/server/dreams/DreamManagerService;->isDreamingInternal()Z
+Lcom/android/server/power/PowerManagerService;->getSleepTimeoutLocked()J
+Lcom/android/server/power/PowerManagerService;->getScreenOffTimeoutLocked(J)J
+Lcom/android/server/power/PowerManagerService;->getScreenDimDurationLocked(J)J
+Lcom/android/server/power/PowerManagerService;->getNextProfileTimeoutLocked(J)J
+Lcom/android/server/power/PowerManagerService;->adjustWakeLockSummaryLocked(I)I
+Lcom/android/server/power/PowerManagerService;->isItBedTimeYetLocked()Z
+Lcom/android/server/wm/WindowContainer;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V
+Lcom/android/server/wm/WindowState;->isDrawnLw()Z
+Lcom/android/server/wm/DisplayContent;->getDisplayPolicy()Lcom/android/server/wm/DisplayPolicy;
+Lcom/android/server/wm/WindowState;->isVisibleByPolicy()Z
+Lcom/android/server/wm/WindowState;->inSizeCompatMode()Z
+Lcom/android/server/wm/DisplayContent$TaskStackContainers;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/am/BroadcastQueue;->maybeAddAllowBackgroundActivityStartsToken(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;)V
+Lcom/android/server/wm/ConfigurationContainer;->inFreeformWindowingMode()Z
+Lcom/android/server/wm/RootActivityContainer;->getTopResumedActivity()Lcom/android/server/wm/ActivityRecord;
+Lcom/android/server/wm/WindowState;->isChildWindow()Z
+Lcom/android/server/pm/PackageManagerService;->applyPostResolutionFilter(Ljava/util/List;Ljava/lang/String;ZIZILandroid/content/Intent;)Ljava/util/List;
+Lcom/android/server/locksettings/LockSettingsService;->checkReadPermission(Ljava/lang/String;I)V
+Lcom/android/server/wm/ConfigurationContainer;->getBounds(Landroid/graphics/Rect;)V
+Lcom/android/server/wm/WindowState;->getFrameLw()Landroid/graphics/Rect;
+Lcom/android/server/wm/WindowState;->isDisplayedLw()Z
+Lcom/android/server/wm/TaskStack;->getStackOutset()I
+Lcom/android/server/wm/WindowState;->getDisplayId()I
+Lcom/android/server/wm/WindowState;->getOrientationChanging()Z
+Lcom/android/server/wm/WindowContainer;->forAllWindows(Ljava/util/function/Consumer;Z)V
+Lcom/android/server/wm/WindowContainer;->obtainConsumerWrapper(Ljava/util/function/Consumer;)Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;
+Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->setConsumer(Ljava/util/function/Consumer;)V
+Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->release()V
+Lcom/android/server/wm/WindowContainer;->access$100(Lcom/android/server/wm/WindowContainer;)Landroid/util/Pools$SynchronizedPool;
+Lcom/android/server/wm/WindowState;->updateSurfacePosition()V
+Lcom/android/server/wm/WindowState;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V
+Lcom/android/server/appop/AppOpsService$UidState;->evalMode(II)I
+Lcom/android/server/power/PowerManagerService;->access$3300(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+Lcom/android/server/power/PowerManagerService;->copyWorkSource(Landroid/os/WorkSource;)Landroid/os/WorkSource;
+Lcom/android/server/power/Notifier;->onWakeLockAcquired(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;)V
+Lcom/android/server/power/PowerManagerService;->restartNofifyLongTimerLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V
+Lcom/android/server/am/ProcessRecord;->isCrashing()Z
+Lcom/android/server/wm/WindowToken;->isHidden()Z
+Lcom/android/server/wm/AppWindowToken;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/AppWindowToken;->forAllWindowsUnchecked(Lcom/android/internal/util/ToBooleanFunction;Z)Z
+Lcom/android/server/wm/WindowState;->transformFrameToSurfacePosition(IILandroid/graphics/Point;)V
+Lcom/android/server/wm/WindowState;->getStack()Lcom/android/server/wm/TaskStack;
+Lcom/android/server/wm/WindowState;->transformSurfaceInsetsPosition(Landroid/graphics/Point;Landroid/graphics/Rect;)V
+Lcom/android/server/wm/WindowState;->prepareSurfaces()V
+Lcom/android/server/wm/WindowState;->applyDims(Lcom/android/server/wm/Dimmer;)V
+Lcom/android/server/wm/WindowStateAnimator;->prepareSurfaceLocked(Z)V
+Lcom/android/server/wm/RootWindowContainer;->performSurfacePlacementNoTrace(Z)V
+Lcom/android/server/wm/WindowState;->isVisibleLw()Z
+Lcom/android/server/wm/WindowSurfaceController;->hasSurface()Z
+Lcom/android/server/wm/WindowManagerService;->getDefaultDisplayContentLocked()Lcom/android/server/wm/DisplayContent;
+Lcom/android/server/wm/RootWindowContainer;->scheduleAnimation()V
+Lcom/android/server/wm/WindowContainer;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;
+Lcom/android/server/wm/WindowContainer;->needsZBoost()Z
+Lcom/android/server/wm/WindowState;->isOnScreen()Z
+Lcom/android/server/wm/utils/InsetUtils;->insetsBetweenFrames(Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Rect;)V
+Lcom/android/server/wm/PolicyControl;->getWindowFlags(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)I
+Lcom/android/server/wm/WindowContainer;->getChildAt(I)Lcom/android/server/wm/WindowContainer;
+Lcom/android/server/wm/InsetsStateController;->onPostLayout()V
+Lcom/android/server/wm/WindowFrames;->setContentChanged(Z)V
+Lcom/android/server/wm/DisplayContent$NonAppWindowContainers;->prepareSurfaces()V
+Lcom/android/server/wm/DisplayContent;->getHomeStack()Lcom/android/server/wm/TaskStack;
+Lcom/android/server/wm/DisplayContent$TaskStackContainers;->getHomeStack()Lcom/android/server/wm/TaskStack;
+Lcom/android/server/wm/DisplayContent$NonAppWindowContainers;->getDimmer()Lcom/android/server/wm/Dimmer;
+Lcom/android/server/wm/RootActivityContainer;->getTopDisplayFocusedStack()Lcom/android/server/wm/ActivityStack;
+Lcom/android/server/wm/WindowState;->resetContentChanged()V
+Lcom/android/server/wm/WindowState;->isDragResizeChanged()Z
+Lcom/android/server/wm/WindowState;->computeDragResizing()Z
+Lcom/android/server/wm/WindowState;->isVisibleOrAdding()Z
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index b4ee0b1abbd7..8032e1b42ea9 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -887,7 +887,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mMetricsLogger.write(log);
if (intentSender != null) {
if (sDebug) Slog.d(TAG, "Starting intent sender on save()");
- startIntentSender(intentSender);
+ startIntentSenderAndFinishSession(intentSender);
}
// Nothing left to do...
@@ -1101,24 +1101,32 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
// AutoFillUiCallback
@Override
- public void startIntentSender(IntentSender intentSender) {
+ public void startIntentSenderAndFinishSession(IntentSender intentSender) {
+ startIntentSender(intentSender, null);
+ }
+
+ // AutoFillUiCallback
+ @Override
+ public void startIntentSender(IntentSender intentSender, Intent intent) {
synchronized (mLock) {
if (mDestroyed) {
Slog.w(TAG, "Call to Session#startIntentSender() rejected - session: "
+ id + " destroyed");
return;
}
- removeSelfLocked();
+ if (intent == null) {
+ removeSelfLocked();
+ }
}
mHandler.sendMessage(obtainMessage(
Session::doStartIntentSender,
- this, intentSender));
+ this, intentSender, intent));
}
- private void doStartIntentSender(IntentSender intentSender) {
+ private void doStartIntentSender(IntentSender intentSender, Intent intent) {
try {
synchronized (mLock) {
- mClient.startIntentSender(intentSender, null);
+ mClient.startIntentSender(intentSender, intent);
}
} catch (RemoteException e) {
Slog.e(TAG, "Error launching auth intent", e);
@@ -1863,7 +1871,7 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState
mHandler.sendMessage(obtainMessage(Session::logSaveShown, this));
final IAutoFillManagerClient client = getClient();
- mPendingSaveUi = new PendingUi(mActivityToken, id, client);
+ mPendingSaveUi = new PendingUi(new Binder(), id, client);
final CharSequence serviceLabel;
final Drawable serviceIcon;
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index fe86ab3a3f26..0b2e2bf9de1c 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -22,6 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Context;
+import android.content.Intent;
import android.content.IntentSender;
import android.graphics.drawable.Drawable;
import android.metrics.LogMaker;
@@ -82,7 +83,8 @@ public final class AutoFillUI {
void requestShowFillUi(AutofillId id, int width, int height,
IAutofillWindowPresenter presenter);
void requestHideFillUi(AutofillId id);
- void startIntentSender(IntentSender intentSender);
+ void startIntentSenderAndFinishSession(IntentSender intentSender);
+ void startIntentSender(IntentSender intentSender, Intent intent);
void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent);
}
@@ -253,7 +255,7 @@ public final class AutoFillUI {
@Override
public void startIntentSender(IntentSender intentSender) {
if (mCallback != null) {
- mCallback.startIntentSender(intentSender);
+ mCallback.startIntentSenderAndFinishSession(intentSender);
}
}
@@ -338,6 +340,13 @@ public final class AutoFillUI {
}
mMetricsLogger.write(log);
}
+
+ @Override
+ public void startIntentSender(IntentSender intentSender, Intent intent) {
+ if (mCallback != null) {
+ mCallback.startIntentSender(intentSender, intent);
+ }
+ }
}, mUiModeMgr.isNightMode(), isUpdate, compatMode);
});
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
index e2cdddb932d7..8e200196050c 100644
--- a/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/SaveUi.java
@@ -32,7 +32,6 @@ import android.graphics.drawable.Drawable;
import android.metrics.LogMaker;
import android.os.Handler;
import android.os.IBinder;
-import android.os.RemoteException;
import android.service.autofill.BatchUpdates;
import android.service.autofill.CustomDescription;
import android.service.autofill.InternalOnClickAction;
@@ -83,6 +82,7 @@ final class SaveUi {
void onSave();
void onCancel(IntentSender listener);
void onDestroy();
+ void startIntentSender(IntentSender intentSender, Intent intent);
}
/**
@@ -129,6 +129,15 @@ final class SaveUi {
mDone = true;
mRealListener.onDestroy();
}
+
+ @Override
+ public void startIntentSender(IntentSender intentSender, Intent intent) {
+ if (sDebug) Slog.d(TAG, "OneTimeListener.startIntentSender(): " + mDone);
+ if (mDone) {
+ return;
+ }
+ mRealListener.startIntentSender(intentSender, intent);
+ }
}
private final Handler mHandler = UiThread.getHandler();
@@ -168,8 +177,8 @@ final class SaveUi {
context = new ContextThemeWrapper(context, mThemeId) {
@Override
public void startActivity(Intent intent) {
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- super.startActivity(intent);
+ PendingIntent p = PendingIntent.getActivity(this, 0, intent, 0);
+ mListener.startIntentSender(p.getIntentSender(), intent);
}
};
final LayoutInflater inflater = LayoutInflater.from(context);
@@ -329,21 +338,13 @@ final class SaveUi {
if (sVerbose) Slog.v(TAG, "Intercepting custom description intent");
final IBinder token = mPendingUi.getToken();
intent.putExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN, token);
- try {
- mPendingUi.client.startIntentSender(pendingIntent.getIntentSender(),
- intent);
- mPendingUi.setState(PendingUi.STATE_PENDING);
- if (sDebug) Slog.d(TAG, "hiding UI until restored with token " + token);
- hide();
- log.setType(MetricsEvent.TYPE_OPEN);
- mMetricsLogger.write(log);
- return true;
- } catch (RemoteException e) {
- Slog.w(TAG, "error triggering pending intent: " + intent);
- log.setType(MetricsEvent.TYPE_FAILURE);
- mMetricsLogger.write(log);
- return false;
- }
+ mListener.startIntentSender(pendingIntent.getIntentSender(), intent);
+ mPendingUi.setState(PendingUi.STATE_PENDING);
+ if (sDebug) Slog.d(TAG, "hiding UI until restored with token " + token);
+ hide();
+ log.setType(MetricsEvent.TYPE_OPEN);
+ mMetricsLogger.write(log);
+ return true;
};
try {
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index dc0bdb325f24..fffdba70c944 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -38,7 +38,6 @@ import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
-import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Slog;
@@ -50,7 +49,6 @@ import com.android.server.SystemService;
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.Set;
/**
* Definition of the system service that performs backup/restore operations.
@@ -70,14 +68,17 @@ public class BackupManagerService {
private final Context mContext;
private final Trampoline mTrampoline;
-
- // Keeps track of all unlocked users registered with this service. Indexed by user id.
- private final SparseArray<UserBackupManagerService> mServiceUsers = new SparseArray<>();
+ private final SparseArray<UserBackupManagerService> mServiceUsers;
/** Instantiate a new instance of {@link BackupManagerService}. */
- public BackupManagerService(Context context, Trampoline trampoline) {
+ public BackupManagerService(
+ Context context,
+ Trampoline trampoline,
+ SparseArray<UserBackupManagerService> userServices) {
mContext = checkNotNull(context);
mTrampoline = checkNotNull(trampoline);
+ // TODO(b/135661048): Remove
+ mServiceUsers = userServices;
}
/**
@@ -98,48 +99,6 @@ public class BackupManagerService {
// USER LIFECYCLE CALLBACKS
// ---------------------------------------------
- /**
- * Starts the backup service for user {@code userId} by creating a new instance of {@link
- * UserBackupManagerService} and registering it with this service.
- */
- @VisibleForTesting
- protected void startServiceForUser(int userId, Set<ComponentName> transportWhitelist) {
- if (mServiceUsers.get(userId) != null) {
- Slog.i(TAG, "userId " + userId + " already started, so not starting again");
- return;
- }
-
- UserBackupManagerService userBackupManagerService =
- UserBackupManagerService.createAndInitializeService(
- userId, mContext, mTrampoline, transportWhitelist);
- startServiceForUser(userId, userBackupManagerService);
- }
-
- /**
- * Starts the backup service for user {@code userId} by registering its instance of {@link
- * UserBackupManagerService} with this service and setting enabled state.
- */
- void startServiceForUser(int userId, UserBackupManagerService userBackupManagerService) {
- mServiceUsers.put(userId, userBackupManagerService);
-
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup enable");
- userBackupManagerService.initializeBackupEnableState();
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- }
-
- /** Stops the backup service for user {@code userId} when the user is stopped. */
- @VisibleForTesting
- protected void stopServiceForUser(int userId) {
- UserBackupManagerService userBackupManagerService = mServiceUsers.removeReturnOld(userId);
-
- if (userBackupManagerService != null) {
- userBackupManagerService.tearDownService();
-
- KeyValueBackupJob.cancel(userId, mContext);
- FullBackupJob.cancel(userId, mContext);
- }
- }
-
boolean isAbleToServeUser(int userId) {
return getUserServices().get(UserHandle.USER_SYSTEM) != null
&& getUserServices().get(userId) != null;
@@ -453,7 +412,7 @@ public class BackupManagerService {
}
for (int userId : userIds) {
- UserBackupManagerService userBackupManagerService = getUserServices().get(userId);
+ UserBackupManagerService userBackupManagerService = mServiceUsers.get(userId);
if (userBackupManagerService != null) {
if (userBackupManagerService.getAncestralSerialNumber() == ancestralSerialNumber) {
return UserHandle.of(userId);
diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java
index 59d9c0eb3219..cd2fb03af4f9 100644
--- a/services/backup/java/com/android/server/backup/Trampoline.java
+++ b/services/backup/java/com/android/server/backup/Trampoline.java
@@ -46,9 +46,11 @@ import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemProperties;
+import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.Slog;
+import android.util.SparseArray;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
@@ -127,6 +129,9 @@ public class Trampoline extends IBackupManager.Stub {
private final Handler mHandler;
private final Set<ComponentName> mTransportWhitelist;
+ /** Keeps track of all unlocked users registered with this service. Indexed by user id. */
+ private final SparseArray<UserBackupManagerService> mUserServices;
+
private final BroadcastReceiver mUserRemovedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -140,6 +145,11 @@ public class Trampoline extends IBackupManager.Stub {
};
public Trampoline(Context context) {
+ this(context, new SparseArray<>());
+ }
+
+ @VisibleForTesting
+ Trampoline(Context context, SparseArray<UserBackupManagerService> userServices) {
mContext = context;
mGlobalDisable = isBackupDisabled();
HandlerThread handlerThread =
@@ -147,7 +157,8 @@ public class Trampoline extends IBackupManager.Stub {
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
mUserManager = UserManager.get(context);
- mService = new BackupManagerService(mContext, this);
+ mUserServices = userServices;
+ mService = new BackupManagerService(mContext, this, mUserServices);
Set<ComponentName> transportWhitelist =
SystemConfig.getInstance().getBackupTransportWhitelist();
mTransportWhitelist = (transportWhitelist == null) ? emptySet() : transportWhitelist;
@@ -297,7 +308,12 @@ public class Trampoline extends IBackupManager.Stub {
postToHandler(() -> startServiceForUser(userId));
}
- private void startServiceForUser(int userId) {
+ /**
+ * Starts the backup service for user {@code userId} by creating a new instance of {@link
+ * UserBackupManagerService} and registering it with this service.
+ */
+ @VisibleForTesting
+ void startServiceForUser(int userId) {
// We know that the user is unlocked here because it is called from setBackupServiceActive
// and unlockUser which have these guarantees. So we can check if the file exists.
if (mGlobalDisable) {
@@ -308,8 +324,53 @@ public class Trampoline extends IBackupManager.Stub {
Slog.i(TAG, "Backup not activated for user " + userId);
return;
}
+ if (mUserServices.get(userId) != null) {
+ Slog.i(TAG, "userId " + userId + " already started, so not starting again");
+ return;
+ }
Slog.i(TAG, "Starting service for user: " + userId);
- mService.startServiceForUser(userId, mTransportWhitelist);
+ UserBackupManagerService userBackupManagerService =
+ UserBackupManagerService.createAndInitializeService(
+ userId, mContext, this, mTransportWhitelist);
+ startServiceForUser(userId, userBackupManagerService);
+ }
+
+ /**
+ * Starts the backup service for user {@code userId} by registering its instance of {@link
+ * UserBackupManagerService} with this service and setting enabled state.
+ */
+ void startServiceForUser(int userId, UserBackupManagerService userBackupManagerService) {
+ mUserServices.put(userId, userBackupManagerService);
+
+ Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backup enable");
+ userBackupManagerService.initializeBackupEnableState();
+ Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
+ }
+
+ /** Stops the backup service for user {@code userId} when the user is stopped. */
+ @VisibleForTesting
+ protected void stopServiceForUser(int userId) {
+ UserBackupManagerService userBackupManagerService = mUserServices.removeReturnOld(userId);
+
+ if (userBackupManagerService != null) {
+ userBackupManagerService.tearDownService();
+
+ KeyValueBackupJob.cancel(userId, mContext);
+ FullBackupJob.cancel(userId, mContext);
+ }
+ }
+
+ /**
+ * Returns a list of users currently unlocked that have a {@link UserBackupManagerService}
+ * registered.
+ *
+ * Warning: Do NOT modify returned object as it's used inside.
+ *
+ * TODO: Return a copy or only expose read-only information through other means.
+ */
+ @VisibleForTesting
+ SparseArray<UserBackupManagerService> getUserServices() {
+ return mUserServices;
}
/**
@@ -321,7 +382,7 @@ public class Trampoline extends IBackupManager.Stub {
() -> {
if (!mGlobalDisable) {
Slog.i(TAG, "Stopping service for user: " + userId);
- mService.stopServiceForUser(userId);
+ stopServiceForUser(userId);
}
});
}
@@ -329,7 +390,7 @@ public class Trampoline extends IBackupManager.Stub {
/** Returns {@link UserBackupManagerService} for user {@code userId}. */
@Nullable
public UserBackupManagerService getUserService(int userId) {
- return mService.getUserServices().get(userId);
+ return mUserServices.get(userId);
}
/**
diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
index d599aabbaa28..0e81e077652e 100644
--- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java
@@ -649,7 +649,8 @@ public class UserBackupManagerService {
}
/** Cleans up state when the user of this service is stopped. */
- void tearDownService() {
+ @VisibleForTesting
+ protected void tearDownService() {
mAgentTimeoutParameters.stop();
mConstants.stop();
mContext.getContentResolver().unregisterContentObserver(mSetupObserver);
diff --git a/services/core/java/com/android/server/GraphicsStatsService.java b/services/core/java/com/android/server/GraphicsStatsService.java
index 4639d7586f83..70569db5e2d3 100644
--- a/services/core/java/com/android/server/GraphicsStatsService.java
+++ b/services/core/java/com/android/server/GraphicsStatsService.java
@@ -191,7 +191,7 @@ public class GraphicsStatsService extends IGraphicsStats.Stub {
if (!file.getFileDescriptor().valid()) {
throw new IllegalStateException("Invalid file descriptor");
}
- return new ParcelFileDescriptor(file.getFileDescriptor());
+ return ParcelFileDescriptor.dup(file.getFileDescriptor());
} catch (IOException ex) {
throw new IllegalStateException("Failed to get PFD from memory file", ex);
}
diff --git a/services/core/java/com/android/server/SystemService.java b/services/core/java/com/android/server/SystemService.java
index 8e9e74ecedbf..4facf4ea62a2 100644
--- a/services/core/java/com/android/server/SystemService.java
+++ b/services/core/java/com/android/server/SystemService.java
@@ -18,12 +18,17 @@ package com.android.server;
import static android.os.IServiceManager.DUMP_FLAG_PRIORITY_DEFAULT;
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
import android.app.ActivityThread;
import android.content.Context;
+import android.content.pm.UserInfo;
import android.os.IBinder;
import android.os.ServiceManager;
import android.os.UserManager;
+import com.android.server.pm.UserManagerService;
+
/**
* The base class for services running in the system process. Override and implement
* the lifecycle event callback methods as needed.
@@ -145,11 +150,29 @@ public abstract class SystemService {
public void onBootPhase(int phase) {}
/**
+ * @deprecated subclasses should extend {@link #onStartUser(int, int)} instead (which by default
+ * calls this method).
+ */
+ @Deprecated
+ public void onStartUser(@UserIdInt int userHandle) {}
+
+ /**
* Called when a new user is starting, for system services to initialize any per-user
* state they maintain for running users.
- * @param userHandle The identifier of the user.
+ *
+ * @param userInfo The information about the user. <b>NOTE: </b> this is a "live" object
+ * referenced by {@link UserManagerService} and hence should not be modified.
+ */
+ public void onStartUser(@NonNull UserInfo userInfo) {
+ onStartUser(userInfo.id);
+ }
+
+ /**
+ * @deprecated subclasses should extend {@link #onUnlockUser(int, int)} instead (which by
+ * default calls this method).
*/
- public void onStartUser(int userHandle) {}
+ @Deprecated
+ public void onUnlockUser(@UserIdInt int userHandle) {}
/**
* Called when an existing user is in the process of being unlocked. This
@@ -163,17 +186,38 @@ public abstract class SystemService {
* {@link UserManager#isUserUnlockingOrUnlocked(int)} to handle both of
* these states.
*
- * @param userHandle The identifier of the user.
+ * @param userInfo The information about the user. <b>NOTE: </b> this is a "live" object
+ * referenced by {@link UserManagerService} and hence should not be modified.
*/
- public void onUnlockUser(int userHandle) {}
+ public void onUnlockUser(@NonNull UserInfo userInfo) {
+ onUnlockUser(userInfo.id);
+ }
+
+ /**
+ * @deprecated subclasses should extend {@link #onSwitchUser(int, int)} instead (which by
+ * default calls this method).
+ */
+ @Deprecated
+ public void onSwitchUser(@UserIdInt int userHandle) {}
/**
* Called when switching to a different foreground user, for system services that have
* special behavior for whichever user is currently in the foreground. This is called
* before any application processes are aware of the new user.
- * @param userHandle The identifier of the user.
+ *
+ * @param userInfo The information about the user. <b>NOTE: </b> this is a "live" object
+ * referenced by {@link UserManagerService} and hence should not be modified.
+ */
+ public void onSwitchUser(@NonNull UserInfo userInfo) {
+ onSwitchUser(userInfo.id);
+ }
+
+ /**
+ * @deprecated subclasses should extend {@link #onStopUser(int, int)} instead (which by default
+ * calls this method).
*/
- public void onSwitchUser(int userHandle) {}
+ @Deprecated
+ public void onStopUser(@UserIdInt int userHandle) {}
/**
* Called when an existing user is stopping, for system services to finalize any per-user
@@ -183,9 +227,19 @@ public abstract class SystemService {
*
* <p>NOTE: This is the last callback where the callee may access the target user's CE storage.
*
- * @param userHandle The identifier of the user.
+ * @param userInfo The information about the user. <b>NOTE: </b> this is a "live" object
+ * referenced by {@link UserManagerService} and hence should not be modified.
*/
- public void onStopUser(int userHandle) {}
+ public void onStopUser(@NonNull UserInfo userInfo) {
+ onStopUser(userInfo.id);
+ }
+
+ /**
+ * @deprecated subclasses should extend {@link #onCleanupUser(int, int)} instead (which by
+ * default calls this method).
+ */
+ @Deprecated
+ public void onCleanupUser(@UserIdInt int userHandle) {}
/**
* Called when an existing user is stopping, for system services to finalize any per-user
@@ -193,11 +247,14 @@ public abstract class SystemService {
* teardown of the user is complete.
*
* <p>NOTE: When this callback is called, the CE storage for the target user may not be
- * accessible already. Use {@link #onStopUser} instead if you need to access the CE storage.
+ * accessible already. Use {@link #onCleanupUser} instead if you need to access the CE storage.
*
- * @param userHandle The identifier of the user.
+ * @param userInfo The information about the user. <b>NOTE: </b> this is a "live" object
+ * referenced by {@link UserManagerService} and hence should not be modified.
*/
- public void onCleanupUser(int userHandle) {}
+ public void onCleanupUser(@NonNull UserInfo userInfo) {
+ onCleanupUser(userInfo.id);
+ }
/**
* Publish the service so it is accessible to other services and apps.
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 9711152ec5b1..ebe23f61cb2a 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -19,9 +19,11 @@ package com.android.server;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
import android.content.Context;
+import android.content.pm.UserInfo;
import android.os.Environment;
import android.os.SystemClock;
import android.os.Trace;
+import android.os.UserManagerInternal;
import android.util.Slog;
import com.android.server.utils.TimingsTraceAndSlog;
@@ -53,6 +55,8 @@ public class SystemServiceManager {
private int mCurrentPhase = -1;
+ private UserManagerInternal mUserManagerInternal;
+
SystemServiceManager(Context context) {
mContext = context;
}
@@ -187,11 +191,30 @@ public class SystemServiceManager {
}
/**
+ * Called at the beginning of {@code ActivityManagerService.systemReady()}.
+ */
+ public void preSystemReady() {
+ mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
+ }
+
+ private @NonNull UserInfo getUserInfo(@UserIdInt int userHandle) {
+ if (mUserManagerInternal == null) {
+ throw new IllegalStateException("mUserManagerInternal not set yet");
+ }
+ final UserInfo userInfo = mUserManagerInternal.getUserInfo(userHandle);
+ if (userInfo == null) {
+ throw new IllegalStateException("No UserInfo for " + userHandle);
+ }
+ return userInfo;
+ }
+
+ /**
* Starts the given user.
*/
- public void startUser(@NonNull TimingsTraceAndSlog t, final @UserIdInt int userHandle) {
+ public void startUser(final @NonNull TimingsTraceAndSlog t, final @UserIdInt int userHandle) {
t.traceBegin("ssm.startUser-" + userHandle);
Slog.i(TAG, "Calling onStartUser u" + userHandle);
+ final UserInfo userInfo = getUserInfo(userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
@@ -199,7 +222,7 @@ public class SystemServiceManager {
t.traceBegin("onStartUser-" + userHandle + " " + serviceName);
long time = SystemClock.elapsedRealtime();
try {
- service.onStartUser(userHandle);
+ service.onStartUser(userInfo);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting start of user " + userHandle
+ " to service " + service.getClass().getName(), ex);
@@ -217,6 +240,7 @@ public class SystemServiceManager {
final TimingsTraceAndSlog t = TimingsTraceAndSlog.newAsyncLog();
t.traceBegin("ssm.unlockUser-" + userHandle);
Slog.i(TAG, "Calling onUnlockUser u" + userHandle);
+ final UserInfo userInfo = getUserInfo(userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
@@ -224,7 +248,7 @@ public class SystemServiceManager {
t.traceBegin("onUnlockUser-" + userHandle + " " + serviceName);
long time = SystemClock.elapsedRealtime();
try {
- service.onUnlockUser(userHandle);
+ service.onUnlockUser(userInfo);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting unlock of user " + userHandle
+ " to service " + serviceName, ex);
@@ -242,6 +266,7 @@ public class SystemServiceManager {
final TimingsTraceAndSlog t = TimingsTraceAndSlog.newAsyncLog();
t.traceBegin("ssm.switchUser-" + userHandle);
Slog.i(TAG, "Calling switchUser u" + userHandle);
+ final UserInfo userInfo = getUserInfo(userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
@@ -249,7 +274,7 @@ public class SystemServiceManager {
t.traceBegin("onSwitchUser-" + userHandle + " " + serviceName);
long time = SystemClock.elapsedRealtime();
try {
- service.onSwitchUser(userHandle);
+ service.onSwitchUser(userInfo);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting switch of user " + userHandle
+ " to service " + serviceName, ex);
@@ -267,6 +292,7 @@ public class SystemServiceManager {
final TimingsTraceAndSlog t = TimingsTraceAndSlog.newAsyncLog();
t.traceBegin("ssm.stopUser-" + userHandle);
Slog.i(TAG, "Calling onStopUser u" + userHandle);
+ final UserInfo userInfo = getUserInfo(userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
@@ -274,7 +300,7 @@ public class SystemServiceManager {
t.traceBegin("onStopUser-" + userHandle + " " + serviceName);
long time = SystemClock.elapsedRealtime();
try {
- service.onStopUser(userHandle);
+ service.onStopUser(userInfo);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting stop of user " + userHandle
+ " to service " + serviceName, ex);
@@ -292,6 +318,7 @@ public class SystemServiceManager {
final TimingsTraceAndSlog t = TimingsTraceAndSlog.newAsyncLog();
t.traceBegin("ssm.cleanupUser-" + userHandle);
Slog.i(TAG, "Calling onCleanupUser u" + userHandle);
+ final UserInfo userInfo = getUserInfo(userHandle);
final int serviceLen = mServices.size();
for (int i = 0; i < serviceLen; i++) {
final SystemService service = mServices.get(i);
@@ -299,7 +326,7 @@ public class SystemServiceManager {
t.traceBegin("onCleanupUser-" + userHandle + " " + serviceName);
long time = SystemClock.elapsedRealtime();
try {
- service.onCleanupUser(userHandle);
+ service.onCleanupUser(userInfo);
} catch (Exception ex) {
Slog.wtf(TAG, "Failure reporting cleanup of user " + userHandle
+ " to service " + serviceName, ex);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 7b20e5599bad..69655191a9c7 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -8990,6 +8990,7 @@ public class ActivityManagerService extends IActivityManager.Stub
*/
public void systemReady(final Runnable goingCallback, @NonNull TimingsTraceAndSlog t) {
t.traceBegin("PhaseActivityManagerReady");
+ mSystemServiceManager.preSystemReady();
synchronized(this) {
if (mSystemReady) {
// If we're done calling all the receivers, run the next "boot phase" passed in
@@ -9139,8 +9140,12 @@ public class ActivityManagerService extends IActivityManager.Stub
mAtmInternal.showSystemReadyErrorDialogsIfNeeded();
t.traceEnd();
- boolean isSystemUser = currentUserId == UserHandle.USER_SYSTEM;
- if (isSystemUser) {
+ // Some systems - like automotive - will explicitly unlock system user then switch
+ // to a secondary user. Hence, we don't want to send duplicate broadcasts for the
+ // system user here.
+ boolean sendSystemUserBroadcasts = currentUserId == UserHandle.USER_SYSTEM;
+
+ if (sendSystemUserBroadcasts) {
t.traceBegin("sendUserStartBroadcast");
final int callingUid = Binder.getCallingUid();
final int callingPid = Binder.getCallingPid();
@@ -9181,7 +9186,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mAtmInternal.resumeTopActivities(false /* scheduleIdle */);
t.traceEnd();
- if (isSystemUser) {
+ if (sendSystemUserBroadcasts) {
t.traceBegin("sendUserSwitchBroadcasts");
mUserController.sendUserSwitchBroadcasts(-1, currentUserId);
t.traceEnd();
@@ -12109,39 +12114,44 @@ public class ActivityManagerService extends IActivityManager.Stub
final String shortLabel;
final long pss;
final long swapPss;
+ final long mRss;
final int id;
final boolean hasActivities;
ArrayList<MemItem> subitems;
- public MemItem(String _label, String _shortLabel, long _pss, long _swapPss, int _id,
- boolean _hasActivities) {
- isProc = true;
- label = _label;
- shortLabel = _shortLabel;
- pss = _pss;
- swapPss = _swapPss;
- id = _id;
- hasActivities = _hasActivities;
+ MemItem(String label, String shortLabel, long pss, long swapPss, long rss, int id,
+ boolean hasActivities) {
+ this.isProc = true;
+ this.label = label;
+ this.shortLabel = shortLabel;
+ this.pss = pss;
+ this.swapPss = swapPss;
+ this.mRss = rss;
+ this.id = id;
+ this.hasActivities = hasActivities;
}
- public MemItem(String _label, String _shortLabel, long _pss, long _swapPss, int _id) {
- isProc = false;
- label = _label;
- shortLabel = _shortLabel;
- pss = _pss;
- swapPss = _swapPss;
- id = _id;
- hasActivities = false;
+ MemItem(String label, String shortLabel, long pss, long swapPss, long rss, int id) {
+ this.isProc = false;
+ this.label = label;
+ this.shortLabel = shortLabel;
+ this.pss = pss;
+ this.swapPss = swapPss;
+ this.mRss = rss;
+ this.id = id;
+ this.hasActivities = false;
}
}
- private static void sortMemItems(List<MemItem> items) {
+ private static void sortMemItems(List<MemItem> items, final boolean pss) {
Collections.sort(items, new Comparator<MemItem>() {
@Override
public int compare(MemItem lhs, MemItem rhs) {
- if (lhs.pss < rhs.pss) {
+ long lss = pss ? lhs.pss : lhs.mRss;
+ long rss = pss ? rhs.pss : rhs.mRss;
+ if (lss < rss) {
return 1;
- } else if (lhs.pss > rhs.pss) {
+ } else if (lss > rss) {
return -1;
}
return 0;
@@ -12150,40 +12160,44 @@ public class ActivityManagerService extends IActivityManager.Stub
}
static final void dumpMemItems(PrintWriter pw, String prefix, String tag,
- ArrayList<MemItem> items, boolean sort, boolean isCompact, boolean dumpSwapPss) {
+ ArrayList<MemItem> items, boolean sort, boolean isCompact, boolean dumpPss,
+ boolean dumpSwapPss) {
if (sort && !isCompact) {
- sortMemItems(items);
+ sortMemItems(items, dumpPss);
}
for (int i=0; i<items.size(); i++) {
MemItem mi = items.get(i);
if (!isCompact) {
- if (dumpSwapPss) {
+ if (dumpPss && dumpSwapPss) {
pw.printf("%s%s: %-60s (%s in swap)\n", prefix, stringifyKBSize(mi.pss),
mi.label, stringifyKBSize(mi.swapPss));
} else {
- pw.printf("%s%s: %s\n", prefix, stringifyKBSize(mi.pss), mi.label);
+ pw.printf("%s%s: %s\n", prefix, stringifyKBSize(dumpPss ? mi.pss : mi.mRss),
+ mi.label);
}
} else if (mi.isProc) {
pw.print("proc,"); pw.print(tag); pw.print(","); pw.print(mi.shortLabel);
- pw.print(","); pw.print(mi.id); pw.print(","); pw.print(mi.pss); pw.print(",");
+ pw.print(","); pw.print(mi.id); pw.print(",");
+ pw.print(dumpPss ? mi.pss : mi.mRss); pw.print(",");
pw.print(dumpSwapPss ? mi.swapPss : "N/A");
pw.println(mi.hasActivities ? ",a" : ",e");
} else {
pw.print(tag); pw.print(","); pw.print(mi.shortLabel); pw.print(",");
- pw.print(mi.pss); pw.print(","); pw.println(dumpSwapPss ? mi.swapPss : "N/A");
+ pw.print(dumpPss ? mi.pss : mi.mRss); pw.print(",");
+ pw.println(dumpSwapPss ? mi.swapPss : "N/A");
}
if (mi.subitems != null) {
dumpMemItems(pw, prefix + " ", mi.shortLabel, mi.subitems,
- true, isCompact, dumpSwapPss);
+ true, isCompact, dumpPss, dumpSwapPss);
}
}
}
static final void dumpMemItems(ProtoOutputStream proto, long fieldId, String tag,
- ArrayList<MemItem> items, boolean sort, boolean dumpSwapPss) {
+ ArrayList<MemItem> items, boolean sort, boolean dumpPss, boolean dumpSwapPss) {
if (sort) {
- sortMemItems(items);
+ sortMemItems(items, dumpPss);
}
for (int i=0; i<items.size(); i++) {
@@ -12195,13 +12209,17 @@ public class ActivityManagerService extends IActivityManager.Stub
proto.write(MemInfoDumpProto.MemItem.IS_PROC, mi.isProc);
proto.write(MemInfoDumpProto.MemItem.ID, mi.id);
proto.write(MemInfoDumpProto.MemItem.HAS_ACTIVITIES, mi.hasActivities);
- proto.write(MemInfoDumpProto.MemItem.PSS_KB, mi.pss);
+ if (dumpPss) {
+ proto.write(MemInfoDumpProto.MemItem.PSS_KB, mi.pss);
+ } else {
+ proto.write(MemInfoDumpProto.MemItem.RSS_KB, mi.mRss);
+ }
if (dumpSwapPss) {
proto.write(MemInfoDumpProto.MemItem.SWAP_PSS_KB, mi.swapPss);
}
if (mi.subitems != null) {
dumpMemItems(proto, MemInfoDumpProto.MemItem.SUB_ITEMS, mi.shortLabel, mi.subitems,
- true, dumpSwapPss);
+ true, dumpPss, dumpSwapPss);
}
proto.end(token);
}
@@ -12500,24 +12518,32 @@ public class ActivityManagerService extends IActivityManager.Stub
final SparseArray<MemItem> procMemsMap = new SparseArray<MemItem>();
long nativePss = 0;
long nativeSwapPss = 0;
+ long nativeRss = 0;
long dalvikPss = 0;
long dalvikSwapPss = 0;
+ long dalvikRss = 0;
long[] dalvikSubitemPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
long[] dalvikSubitemSwapPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
+ long[] dalvikSubitemRss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
+ EmptyArray.LONG;
long otherPss = 0;
long otherSwapPss = 0;
+ long otherRss = 0;
long[] miscPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long[] miscSwapPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
+ long[] miscRss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long oomPss[] = new long[DUMP_MEM_OOM_LABEL.length];
long oomSwapPss[] = new long[DUMP_MEM_OOM_LABEL.length];
+ long[] oomRss = new long[DUMP_MEM_OOM_LABEL.length];
ArrayList<MemItem>[] oomProcs = (ArrayList<MemItem>[])
new ArrayList[DUMP_MEM_OOM_LABEL.length];
long totalPss = 0;
long totalSwapPss = 0;
+ long totalRss = 0;
long cachedPss = 0;
long cachedSwapPss = 0;
boolean hasSwapPss = false;
@@ -12557,6 +12583,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mi.dalvikPss = (int)Debug.getPss(pid, tmpLong, null);
endTime = SystemClock.currentThreadTimeMillis();
mi.dalvikPrivateDirty = (int)tmpLong[0];
+ mi.dalvikRss = (int) tmpLong[2];
}
if (opts.dumpDetails) {
if (opts.localOnly) {
@@ -12617,22 +12644,27 @@ public class ActivityManagerService extends IActivityManager.Stub
if (!opts.isCheckinRequest && mi != null) {
totalPss += myTotalPss;
totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
MemItem pssItem = new MemItem(r.processName + " (pid " + pid +
(hasActivities ? " / activities)" : ")"), r.processName, myTotalPss,
- myTotalSwapPss, pid, hasActivities);
+ myTotalSwapPss, myTotalRss, pid, hasActivities);
procMems.add(pssItem);
procMemsMap.put(pid, pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
}
otherPss += mi.otherPss;
+ otherRss += mi.otherRss;
otherSwapPss += mi.otherSwappedOutPss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
@@ -12641,6 +12673,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
if (oomAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
@@ -12658,6 +12693,7 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[oomIndex] = new ArrayList<MemItem>();
}
oomProcs[oomIndex].add(pssItem);
+ oomRss[oomIndex] += myTotalRss;
break;
}
}
@@ -12689,25 +12725,33 @@ public class ActivityManagerService extends IActivityManager.Stub
final long myTotalPss = mi.getTotalPss();
final long myTotalSwapPss = mi.getTotalSwappedOutPss();
+ final long myTotalRss = mi.getTotalRss();
totalPss += myTotalPss;
totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
nativeProcTotalPss += myTotalPss;
MemItem pssItem = new MemItem(st.name + " (pid " + st.pid + ")",
- st.name, myTotalPss, mi.getSummaryTotalSwapPss(), st.pid, false);
+ st.name, myTotalPss, mi.getSummaryTotalSwapPss(), myTotalRss,
+ st.pid, false);
procMems.add(pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS
+ + j);
}
otherPss += mi.otherPss;
otherSwapPss += mi.otherSwappedOutPss;
+ otherRss += mi.otherRss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
miscPss[j] += mem;
@@ -12715,6 +12759,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
oomPss[0] += myTotalPss;
oomSwapPss[0] += myTotalSwapPss;
@@ -12722,19 +12769,21 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[0] = new ArrayList<MemItem>();
}
oomProcs[0].add(pssItem);
+ oomRss[0] += myTotalRss;
}
}
}
ArrayList<MemItem> catMems = new ArrayList<MemItem>();
- catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1));
+ catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, nativeRss, -1));
final int dalvikId = -2;
- catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId));
- catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3));
+ catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikRss,
+ dalvikId));
+ catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, otherRss, -3));
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
String label = Debug.MemoryInfo.getOtherLabel(j);
- catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j));
+ catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], miscRss[j], j));
}
if (dalvikSubitemPss.length > 0) {
// Add dalvik subitems.
@@ -12760,7 +12809,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final String name = Debug.MemoryInfo.getOtherLabel(
Debug.MemoryInfo.NUM_OTHER_STATS + j);
memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
- dalvikSubitemSwapPss[j], j));
+ dalvikSubitemSwapPss[j], dalvikSubitemRss[j], j));
}
}
}
@@ -12770,31 +12819,53 @@ public class ActivityManagerService extends IActivityManager.Stub
if (oomPss[j] != 0) {
String label = opts.isCompact ? DUMP_MEM_OOM_COMPACT_LABEL[j]
: DUMP_MEM_OOM_LABEL[j];
- MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j],
+ MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j], oomRss[j],
DUMP_MEM_OOM_ADJ[j]);
item.subitems = oomProcs[j];
oomMems.add(item);
}
}
-
+ if (!opts.isCompact) {
+ pw.println();
+ }
+ if (!brief && !opts.oomOnly && !opts.isCompact) {
+ pw.println();
+ pw.println("Total RSS by process:");
+ dumpMemItems(pw, " ", "proc", procMems, true, opts.isCompact, false, false);
+ pw.println();
+ }
+ if (!opts.isCompact) {
+ pw.println("Total RSS by OOM adjustment:");
+ }
+ dumpMemItems(pw, " ", "oom", oomMems, false, opts.isCompact, false, false);
+ if (!brief && !opts.oomOnly) {
+ PrintWriter out = categoryPw != null ? categoryPw : pw;
+ if (!opts.isCompact) {
+ out.println();
+ out.println("Total RSS by category:");
+ }
+ dumpMemItems(out, " ", "cat", catMems, true, opts.isCompact, false, false);
+ }
opts.dumpSwapPss = opts.dumpSwapPss && hasSwapPss && totalSwapPss != 0;
if (!brief && !opts.oomOnly && !opts.isCompact) {
pw.println();
pw.println("Total PSS by process:");
- dumpMemItems(pw, " ", "proc", procMems, true, opts.isCompact, opts.dumpSwapPss);
+ dumpMemItems(pw, " ", "proc", procMems, true, opts.isCompact, true,
+ opts.dumpSwapPss);
pw.println();
}
if (!opts.isCompact) {
pw.println("Total PSS by OOM adjustment:");
}
- dumpMemItems(pw, " ", "oom", oomMems, false, opts.isCompact, opts.dumpSwapPss);
+ dumpMemItems(pw, " ", "oom", oomMems, false, opts.isCompact, true, opts.dumpSwapPss);
if (!brief && !opts.oomOnly) {
PrintWriter out = categoryPw != null ? categoryPw : pw;
if (!opts.isCompact) {
out.println();
out.println("Total PSS by category:");
}
- dumpMemItems(out, " ", "cat", catMems, true, opts.isCompact, opts.dumpSwapPss);
+ dumpMemItems(out, " ", "cat", catMems, true, opts.isCompact, true,
+ opts.dumpSwapPss);
}
if (!opts.isCompact) {
pw.println();
@@ -13013,24 +13084,32 @@ public class ActivityManagerService extends IActivityManager.Stub
final SparseArray<MemItem> procMemsMap = new SparseArray<MemItem>();
long nativePss = 0;
long nativeSwapPss = 0;
+ long nativeRss = 0;
long dalvikPss = 0;
long dalvikSwapPss = 0;
+ long dalvikRss = 0;
long[] dalvikSubitemPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
long[] dalvikSubitemSwapPss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
EmptyArray.LONG;
+ long[] dalvikSubitemRss = opts.dumpDalvik ? new long[Debug.MemoryInfo.NUM_DVK_STATS] :
+ EmptyArray.LONG;
long otherPss = 0;
long otherSwapPss = 0;
+ long otherRss = 0;
long[] miscPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long[] miscSwapPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
+ long[] miscRss = new long[Debug.MemoryInfo.NUM_OTHER_STATS];
long oomPss[] = new long[DUMP_MEM_OOM_LABEL.length];
long oomSwapPss[] = new long[DUMP_MEM_OOM_LABEL.length];
+ long[] oomRss = new long[DUMP_MEM_OOM_LABEL.length];
ArrayList<MemItem>[] oomProcs = (ArrayList<MemItem>[])
new ArrayList[DUMP_MEM_OOM_LABEL.length];
long totalPss = 0;
long totalSwapPss = 0;
+ long totalRss = 0;
long cachedPss = 0;
long cachedSwapPss = 0;
boolean hasSwapPss = false;
@@ -13069,6 +13148,7 @@ public class ActivityManagerService extends IActivityManager.Stub
mi.dalvikPss = (int) Debug.getPss(pid, tmpLong, null);
endTime = SystemClock.currentThreadTimeMillis();
mi.dalvikPrivateDirty = (int) tmpLong[0];
+ mi.dalvikRss = (int) tmpLong[2];
}
if (opts.dumpDetails) {
if (opts.localOnly) {
@@ -13124,22 +13204,27 @@ public class ActivityManagerService extends IActivityManager.Stub
if (!opts.isCheckinRequest && mi != null) {
totalPss += myTotalPss;
totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
MemItem pssItem = new MemItem(r.processName + " (pid " + pid +
(hasActivities ? " / activities)" : ")"), r.processName, myTotalPss,
- myTotalSwapPss, pid, hasActivities);
+ myTotalSwapPss, myTotalRss, pid, hasActivities);
procMems.add(pssItem);
procMemsMap.put(pid, pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
}
otherPss += mi.otherPss;
+ otherRss += mi.otherRss;
otherSwapPss += mi.otherSwappedOutPss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
@@ -13148,6 +13233,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
if (oomAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
@@ -13165,6 +13253,7 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[oomIndex] = new ArrayList<MemItem>();
}
oomProcs[oomIndex].add(pssItem);
+ oomRss[oomIndex] += myTotalRss;
break;
}
}
@@ -13195,24 +13284,33 @@ public class ActivityManagerService extends IActivityManager.Stub
final long myTotalPss = mi.getTotalPss();
final long myTotalSwapPss = mi.getTotalSwappedOutPss();
+ final long myTotalRss = mi.getTotalRss();
totalPss += myTotalPss;
+ totalSwapPss += myTotalSwapPss;
+ totalRss += myTotalRss;
nativeProcTotalPss += myTotalPss;
MemItem pssItem = new MemItem(st.name + " (pid " + st.pid + ")",
- st.name, myTotalPss, mi.getSummaryTotalSwapPss(), st.pid, false);
+ st.name, myTotalPss, mi.getSummaryTotalSwapPss(), myTotalRss,
+ st.pid, false);
procMems.add(pssItem);
nativePss += mi.nativePss;
nativeSwapPss += mi.nativeSwappedOutPss;
+ nativeRss += mi.nativeRss;
dalvikPss += mi.dalvikPss;
dalvikSwapPss += mi.dalvikSwappedOutPss;
+ dalvikRss += mi.dalvikRss;
for (int j=0; j<dalvikSubitemPss.length; j++) {
dalvikSubitemPss[j] += mi.getOtherPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
dalvikSubitemSwapPss[j] +=
mi.getOtherSwappedOutPss(Debug.MemoryInfo.NUM_OTHER_STATS + j);
+ dalvikSubitemRss[j] += mi.getOtherRss(Debug.MemoryInfo.NUM_OTHER_STATS
+ + j);
}
otherPss += mi.otherPss;
otherSwapPss += mi.otherSwappedOutPss;
+ otherRss += mi.otherRss;
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
long mem = mi.getOtherPss(j);
miscPss[j] += mem;
@@ -13220,6 +13318,9 @@ public class ActivityManagerService extends IActivityManager.Stub
mem = mi.getOtherSwappedOutPss(j);
miscSwapPss[j] += mem;
otherSwapPss -= mem;
+ mem = mi.getOtherRss(j);
+ miscRss[j] += mem;
+ otherRss -= mem;
}
oomPss[0] += myTotalPss;
oomSwapPss[0] += myTotalSwapPss;
@@ -13227,19 +13328,21 @@ public class ActivityManagerService extends IActivityManager.Stub
oomProcs[0] = new ArrayList<MemItem>();
}
oomProcs[0].add(pssItem);
+ oomRss[0] += myTotalRss;
}
}
}
ArrayList<MemItem> catMems = new ArrayList<MemItem>();
- catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1));
+ catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, nativeRss, -1));
final int dalvikId = -2;
- catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId));
- catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3));
+ catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikRss,
+ dalvikId));
+ catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, otherRss, -3));
for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) {
String label = Debug.MemoryInfo.getOtherLabel(j);
- catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j));
+ catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], miscRss[j], j));
}
if (dalvikSubitemPss.length > 0) {
// Add dalvik subitems.
@@ -13265,7 +13368,7 @@ public class ActivityManagerService extends IActivityManager.Stub
final String name = Debug.MemoryInfo.getOtherLabel(
Debug.MemoryInfo.NUM_OTHER_STATS + j);
memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j],
- dalvikSubitemSwapPss[j], j));
+ dalvikSubitemSwapPss[j], dalvikSubitemRss[j], j));
}
}
}
@@ -13275,23 +13378,34 @@ public class ActivityManagerService extends IActivityManager.Stub
if (oomPss[j] != 0) {
String label = opts.isCompact ? DUMP_MEM_OOM_COMPACT_LABEL[j]
: DUMP_MEM_OOM_LABEL[j];
- MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j],
+ MemItem item = new MemItem(label, label, oomPss[j], oomSwapPss[j], oomRss[j],
DUMP_MEM_OOM_ADJ[j]);
item.subitems = oomProcs[j];
oomMems.add(item);
}
}
+ if (!opts.oomOnly) {
+ dumpMemItems(proto, MemInfoDumpProto.TOTAL_RSS_BY_PROCESS, "proc",
+ procMems, true, false, false);
+ }
+ dumpMemItems(proto, MemInfoDumpProto.TOTAL_RSS_BY_OOM_ADJUSTMENT, "oom",
+ oomMems, false, false, false);
+ if (!brief && !opts.oomOnly) {
+ dumpMemItems(proto, MemInfoDumpProto.TOTAL_RSS_BY_CATEGORY, "cat",
+ catMems, true, false, false);
+ }
+
opts.dumpSwapPss = opts.dumpSwapPss && hasSwapPss && totalSwapPss != 0;
if (!opts.oomOnly) {
dumpMemItems(proto, MemInfoDumpProto.TOTAL_PSS_BY_PROCESS, "proc",
- procMems, true, opts.dumpSwapPss);
+ procMems, true, true, opts.dumpSwapPss);
}
dumpMemItems(proto, MemInfoDumpProto.TOTAL_PSS_BY_OOM_ADJUSTMENT, "oom",
- oomMems, false, opts.dumpSwapPss);
+ oomMems, false, true, opts.dumpSwapPss);
if (!brief && !opts.oomOnly) {
dumpMemItems(proto, MemInfoDumpProto.TOTAL_PSS_BY_CATEGORY, "cat",
- catMems, true, opts.dumpSwapPss);
+ catMems, true, true, opts.dumpSwapPss);
}
MemInfoReader memInfo = new MemInfoReader();
memInfo.readMemInfo();
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 9239d0389f1c..a47ea4f95b3e 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -756,7 +756,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
public void noteStartAudio(int uid) {
- enforceSelfOrCallingPermission(uid);
+ enforceCallingPermission();
synchronized (mStats) {
mStats.noteAudioOnLocked(uid);
StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, uid, null,
@@ -765,7 +765,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
public void noteStopAudio(int uid) {
- enforceSelfOrCallingPermission(uid);
+ enforceCallingPermission();
synchronized (mStats) {
mStats.noteAudioOffLocked(uid);
StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, uid, null,
@@ -774,7 +774,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
public void noteStartVideo(int uid) {
- enforceSelfOrCallingPermission(uid);
+ enforceCallingPermission();
synchronized (mStats) {
mStats.noteVideoOnLocked(uid);
StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, uid, null,
@@ -783,7 +783,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
}
public void noteStopVideo(int uid) {
- enforceSelfOrCallingPermission(uid);
+ enforceCallingPermission();
synchronized (mStats) {
mStats.noteVideoOffLocked(uid);
StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, uid,
@@ -1184,13 +1184,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub
Binder.getCallingPid(), Binder.getCallingUid(), null);
}
- private void enforceSelfOrCallingPermission(int uid) {
- if (Binder.getCallingUid() == uid) {
- return;
- }
- enforceCallingPermission();
- }
-
final class WakeupReasonThread extends Thread {
private static final int MAX_REASON_SIZE = 512;
private CharsetDecoder mDecoder;
diff --git a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
index 836f1e64aa9c..f952bcef5606 100644
--- a/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
+++ b/services/core/java/com/android/server/connectivity/tethering/EntitlementManager.java
@@ -161,6 +161,12 @@ public class EntitlementManager {
* Check if cellular upstream is permitted.
*/
public boolean isCellularUpstreamPermitted() {
+ // If provisioning is required and EntitlementManager don't know any downstream,
+ // cellular upstream should not be allowed.
+ final TetheringConfiguration config = mFetcher.fetchTetheringConfiguration();
+ if (mCurrentTethers.size() == 0 && isTetherProvisioningRequired(config)) {
+ return false;
+ }
return mCellularUpstreamPermitted;
}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index c05655a6a5de..193e0afc529e 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -1912,16 +1912,17 @@ public class MediaSessionService extends SystemService implements Monitor {
&& AudioSystem.isStreamActive(suggestedStream, 0)) {
preferSuggestedStream = true;
}
- if (DEBUG_KEY_EVENT) {
- Log.d(TAG, "Adjusting " + session + " by " + direction + ". flags="
- + flags + ", suggestedStream=" + suggestedStream
- + ", preferSuggestedStream=" + preferSuggestedStream);
- }
if (session == null || preferSuggestedStream) {
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Adjusting suggestedStream=" + suggestedStream + " by " + direction
+ + ". flags=" + flags + ", preferSuggestedStream="
+ + preferSuggestedStream + ", session=" + session);
+ }
if ((flags & AudioManager.FLAG_ACTIVE_MEDIA_ONLY) != 0
&& !AudioSystem.isStreamActive(AudioManager.STREAM_MUSIC, 0)) {
- if (DEBUG) {
- Log.d(TAG, "No active session to adjust, skipping media only volume event");
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Nothing is playing on the music stream. Skipping volume event,"
+ + " flags=" + flags);
}
return;
}
@@ -1955,6 +1956,11 @@ public class MediaSessionService extends SystemService implements Monitor {
}
});
} else {
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Adjusting " + session + " by " + direction + ". flags="
+ + flags + ", suggestedStream=" + suggestedStream
+ + ", preferSuggestedStream=" + preferSuggestedStream);
+ }
session.adjustVolume(packageName, opPackageName, pid, uid, null, asSystemService,
direction, flags, true);
}
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index c87ab9794563..4431d869af70 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -28,20 +28,20 @@ import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.permission.IPermissionManager;
-import android.provider.DeviceConfig;
import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import com.android.internal.R;
-import java.util.ArrayList;
+import java.io.PrintWriter;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* The entity responsible for filtering visibility between apps based on declarations in their
@@ -50,26 +50,37 @@ import java.util.Set;
class AppsFilter {
private static final String TAG = PackageManagerService.TAG;
+
+ // Forces filtering logic to run for debug purposes.
+ // STOPSHIP (b/136675067): should be false after development is complete
+ private static final boolean DEBUG_RUN_WHEN_DISABLED = true;
+
+ // Logs all filtering instead of enforcing
+ private static final boolean DEBUG_ALLOW_ALL = false;
+
+ @SuppressWarnings("ConstantExpression")
+ private static final boolean DEBUG_LOGGING = false | DEBUG_RUN_WHEN_DISABLED | DEBUG_ALLOW_ALL;
+
/**
* This contains a list of packages that are implicitly queryable because another app explicitly
* interacted with it. For example, if application A starts a service in application B,
* application B is implicitly allowed to query for application A; regardless of any manifest
* entries.
*/
- private final SparseArray<HashMap<String, ArrayList<String>>> mImplicitlyQueryable =
+ private final SparseArray<HashMap<String, Set<String>>> mImplicitlyQueryable =
new SparseArray<>();
/**
* A mapping from the set of packages that query other packages via package name to the
* list of packages that they can see.
*/
- private final HashMap<String, List<String>> mQueriesViaPackage = new HashMap<>();
+ private final HashMap<String, Set<String>> mQueriesViaPackage = new HashMap<>();
/**
* A mapping from the set of packages that query others via intent to the list
* of packages that the intents resolve to.
*/
- private final HashMap<String, List<String>> mQueriesViaIntent = new HashMap<>();
+ private final HashMap<String, Set<String>> mQueriesViaIntent = new HashMap<>();
/**
* A set of packages that are always queryable by any package, regardless of their manifest
@@ -104,12 +115,11 @@ class AppsFilter {
}
public static AppsFilter create(Context context) {
+ // tracks whether the feature is enabled where -1 is unknown, 0 is false and 1 is true;
+ final AtomicInteger featureEnabled = new AtomicInteger(-1);
+
final boolean forceSystemAppsQueryable =
context.getResources().getBoolean(R.bool.config_forceSystemPackagesQueryable);
- final ConfigProvider configProvider = () -> DeviceConfig.getBoolean(
- DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE,
- "package_query_filtering_enabled",
- false);
final String[] forcedQueryablePackageNames;
if (forceSystemAppsQueryable) {
// all system apps already queryable, no need to read and parse individual exceptions
@@ -123,7 +133,7 @@ class AppsFilter {
}
IPermissionManager permissionmgr =
(IPermissionManager) ServiceManager.getService("permissionmgr");
- return new AppsFilter(configProvider, permissionmgr,
+ return new AppsFilter(() -> false, permissionmgr,
context.getSystemService(AppOpsManager.class), forcedQueryablePackageNames,
forceSystemAppsQueryable);
}
@@ -165,13 +175,13 @@ class AppsFilter {
*/
private void markAppInteraction(
PackageSetting initiatingPackage, PackageSetting targetPackage, int userId) {
- HashMap<String, ArrayList<String>> currentUser = mImplicitlyQueryable.get(userId);
+ HashMap<String, Set<String>> currentUser = mImplicitlyQueryable.get(userId);
if (currentUser == null) {
currentUser = new HashMap<>();
mImplicitlyQueryable.put(userId, currentUser);
}
if (!currentUser.containsKey(targetPackage.pkg.packageName)) {
- currentUser.put(targetPackage.pkg.packageName, new ArrayList<>());
+ currentUser.put(targetPackage.pkg.packageName, new HashSet<>());
}
currentUser.get(targetPackage.pkg.packageName).add(initiatingPackage.pkg.packageName);
}
@@ -200,7 +210,7 @@ class AppsFilter {
}
}
// if the new package declares them, let's evaluate its ability to see existing packages
- mQueriesViaIntent.put(newPkg.packageName, new ArrayList<>());
+ mQueriesViaIntent.put(newPkg.packageName, new HashSet<>());
for (PackageParser.Package existingPackage : existing.values()) {
if (existingPackage.packageName == newPkg.packageName) {
continue;
@@ -214,7 +224,7 @@ class AppsFilter {
mQueriesViaIntent.get(newPkg.packageName).add(existingPackage.packageName);
}
}
- final ArrayList<String> queriesPackages = new ArrayList<>(
+ final HashSet<String> queriesPackages = new HashSet<>(
newPkg.mQueriesPackages == null ? 0 : newPkg.mQueriesPackages.size());
if (newPkg.mQueriesPackages != null) {
queriesPackages.addAll(newPkg.mQueriesPackages);
@@ -232,13 +242,13 @@ class AppsFilter {
for (int i = 0; i < mImplicitlyQueryable.size(); i++) {
mImplicitlyQueryable.valueAt(i).remove(packageName);
- for (ArrayList<String> initiators : mImplicitlyQueryable.valueAt(i).values()) {
+ for (Set<String> initiators : mImplicitlyQueryable.valueAt(i).values()) {
initiators.remove(packageName);
}
}
mQueriesViaIntent.remove(packageName);
- for (List<String> declarators : mQueriesViaIntent.values()) {
+ for (Set<String> declarators : mQueriesViaIntent.values()) {
declarators.remove(packageName);
}
@@ -260,6 +270,10 @@ class AppsFilter {
if (callingUid < Process.FIRST_APPLICATION_UID) {
return false;
}
+ final boolean featureEnabled = mConfigProvider.isEnabled();
+ if (!featureEnabled && !DEBUG_RUN_WHEN_DISABLED) {
+ return false;
+ }
if (callingSetting == null) {
Slog.wtf(TAG, "No setting found for non system uid " + callingUid);
return true;
@@ -277,7 +291,8 @@ class AppsFilter {
final ArraySet<PackageSetting> packageSettings =
((SharedUserSetting) callingSetting).packages;
if (packageSettings != null && packageSettings.size() > 0) {
- for (PackageSetting packageSetting : packageSettings) {
+ for (int i = 0, max = packageSettings.size(); i < max; i++) {
+ final PackageSetting packageSetting = packageSettings.valueAt(i);
if (!shouldFilterApplicationInternal(packageSetting, targetPkgSetting,
userId)) {
// TODO: actually base this on a start / launch (not just a query)
@@ -288,22 +303,29 @@ class AppsFilter {
callingPkgSetting = packageSetting;
}
}
+ if (callingPkgSetting == null) {
+ Slog.wtf(TAG, callingSetting + " does not have any non-null packages!");
+ return true;
+ }
} else {
+ Slog.wtf(TAG, callingSetting + " has no packages!");
return true;
}
}
- if (callingPkgSetting == null) {
- Slog.wtf(TAG, "What... " + callingSetting);
- return true;
+
+ if (!featureEnabled) {
+ return false;
}
final int mode = mAppOpsManager
.checkOpNoThrow(AppOpsManager.OP_QUERY_ALL_PACKAGES, callingUid,
callingPkgSetting.pkg.packageName);
switch (mode) {
case AppOpsManager.MODE_DEFAULT:
- // if default, let's rely on remote feature toggle to determine whether to
- // actually filter
- return mConfigProvider.isEnabled();
+ if (DEBUG_LOGGING) {
+ Slog.d(TAG, "filtered interaction: " + callingPkgSetting.name + " -> "
+ + targetPkgSetting.name + (DEBUG_ALLOW_ALL ? " ALLOWED" : ""));
+ }
+ return !DEBUG_ALLOW_ALL;
case AppOpsManager.MODE_ALLOWED:
// explicitly allowed to see all packages, don't filter
return false;
@@ -372,6 +394,55 @@ class AppsFilter {
|| mForceQueryableByDevice.contains(targetPkgSetting.pkg.packageName));
}
+ public void dumpQueries(
+ PrintWriter pw, @Nullable String filteringPackageName, DumpState dumpState,
+ int[] users) {
+ pw.println();
+ pw.println("Queries:");
+ dumpState.onTitlePrinted();
+ pw.println(" enabled: " + mConfigProvider.isEnabled());
+ pw.println(" system apps queryable: " + mSystemAppsQueryable);
+ dumpPackageSet(pw, filteringPackageName, mForceQueryableByDevice, "System whitelist", " ");
+ dumpPackageSet(pw, filteringPackageName, mForceQueryable, "forceQueryable", " ");
+ pw.println(" queries via package name:");
+ dumpQueriesMap(pw, filteringPackageName, mQueriesViaPackage, " ");
+ pw.println(" queries via intent:");
+ dumpQueriesMap(pw, filteringPackageName, mQueriesViaIntent, " ");
+ pw.println(" queryable via interaction:");
+ for (int user : users) {
+ pw.append(" User ").append(Integer.toString(user)).println(":");
+ final HashMap<String, Set<String>> queryMapForUser = mImplicitlyQueryable.get(user);
+ dumpQueriesMap(pw, filteringPackageName, queryMapForUser, " ");
+ }
+ }
+
+ private static void dumpQueriesMap(PrintWriter pw, @Nullable String filteringPackageName,
+ HashMap<String, Set<String>> queriesMap, String spacing) {
+ for (String callingPkg : queriesMap.keySet()) {
+ if (Objects.equals(callingPkg, filteringPackageName)) {
+ // don't filter target package names if the calling is filteringPackageName
+ dumpPackageSet(pw, null /*filteringPackageName*/, queriesMap.get(callingPkg),
+ callingPkg, spacing);
+ } else {
+ dumpPackageSet(pw, filteringPackageName, queriesMap.get(callingPkg), callingPkg,
+ spacing);
+ }
+ }
+ }
+
+ private static void dumpPackageSet(PrintWriter pw, @Nullable String filteringPackageName,
+ Set<String> targetPkgSet, String subTitle, String spacing) {
+ if (targetPkgSet != null && targetPkgSet.size() > 0
+ && (filteringPackageName == null || targetPkgSet.contains(filteringPackageName))) {
+ pw.append(spacing).append(subTitle).println(":");
+ for (String pkgName : targetPkgSet) {
+ if (filteringPackageName == null || Objects.equals(filteringPackageName, pkgName)) {
+ pw.append(spacing).append(" ").println(pkgName);
+ }
+ }
+ }
+ }
+
public interface ConfigProvider {
boolean isEnabled();
}
diff --git a/services/core/java/com/android/server/pm/DumpState.java b/services/core/java/com/android/server/pm/DumpState.java
index d473fbf5ed51..99a109367afc 100644
--- a/services/core/java/com/android/server/pm/DumpState.java
+++ b/services/core/java/com/android/server/pm/DumpState.java
@@ -42,6 +42,7 @@ public final class DumpState {
public static final int DUMP_VOLUMES = 1 << 23;
public static final int DUMP_SERVICE_PERMISSIONS = 1 << 24;
public static final int DUMP_APEX = 1 << 25;
+ public static final int DUMP_QUERIES = 1 << 26;
public static final int OPTION_SHOW_FILTERS = 1 << 0;
public static final int OPTION_DUMP_ALL_COMPONENTS = 1 << 1;
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 3f6d4dfcdfcb..af20346fc168 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -20663,6 +20663,7 @@ public class PackageManagerService extends IPackageManager.Stub
pw.println(" preferred-xml [--full]: print preferred package settings as xml");
pw.println(" prov[iders]: dump content providers");
pw.println(" p[ackages]: dump installed packages");
+ pw.println(" q[ueries]: dump app queryability calculations");
pw.println(" s[hared-users]: dump shared user IDs");
pw.println(" m[essages]: print collected runtime messages");
pw.println(" v[erifiers]: print package verifier info");
@@ -20785,6 +20786,8 @@ public class PackageManagerService extends IPackageManager.Stub
dumpState.setDump(DumpState.DUMP_DOMAIN_PREFERRED);
} else if ("p".equals(cmd) || "packages".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_PACKAGES);
+ } else if ("q".equals(cmd) || "queries".equals(cmd)) {
+ dumpState.setDump(DumpState.DUMP_QUERIES);
} else if ("s".equals(cmd) || "shared-users".equals(cmd)) {
dumpState.setDump(DumpState.DUMP_SHARED_USERS);
if (opti < args.length && "noperm".equals(args[opti])) {
@@ -21079,6 +21082,10 @@ public class PackageManagerService extends IPackageManager.Stub
mSettings.dumpPackagesLPr(pw, packageName, permissionNames, dumpState, checkin);
}
+ if (dumpState.isDumping(DumpState.DUMP_QUERIES)) {
+ mAppsFilter.dumpQueries(pw, packageName, dumpState, mUserManager.getUserIds());
+ }
+
if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) {
mSettings.dumpSharedUsersLPr(pw, packageName, permissionNames, dumpState, checkin);
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index c1cb53d4ff0f..597246884ca5 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -4570,6 +4570,13 @@ public final class Settings {
pw.print(prefix); pw.print(" privateFlags="); printFlags(pw,
ps.pkg.applicationInfo.privateFlags, PRIVATE_FLAG_DUMP_SPEC); pw.println();
}
+ pw.print(prefix); pw.print(" forceQueryable="); pw.println(ps.pkg.mForceQueryable);
+ if (ps.pkg.mQueriesPackages != null) {
+ pw.append(prefix).append(" queriesPackages=").println(ps.pkg.mQueriesPackages);
+ }
+ if (ps.pkg.mQueriesIntents != null) {
+ pw.append(prefix).append(" queriesIntents=").println(ps.pkg.mQueriesIntents);
+ }
pw.print(prefix); pw.print(" dataDir="); pw.println(ps.pkg.applicationInfo.dataDir);
pw.print(prefix); pw.print(" supportsScreens=[");
boolean first = true;
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index a707aa884966..ead9d7ac2e56 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -75,6 +75,7 @@ import android.os.storage.StorageManager;
import android.security.GateKeeper;
import android.service.gatekeeper.IGateKeeperService;
import android.stats.devicepolicy.DevicePolicyEnums;
+import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.IntArray;
import android.util.Log;
@@ -125,6 +126,7 @@ import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
+import java.util.Set;
/**
* Service for {@link UserManager}.
@@ -214,7 +216,7 @@ public class UserManagerService extends IUserManager.Stub {
@VisibleForTesting
static final int MAX_RECENTLY_REMOVED_IDS_SIZE = 100;
- private static final int USER_VERSION = 7;
+ private static final int USER_VERSION = 8;
private static final long EPOCH_PLUS_30_YEARS = 30L * 365 * 24 * 60 * 60 * 1000L; // ms
@@ -2139,6 +2141,7 @@ public class UserManagerService extends IUserManager.Stub {
*/
@GuardedBy({"mRestrictionsLock", "mPackagesLock"})
private void upgradeIfNecessaryLP(Bundle oldGlobalUserRestrictions) {
+ Set<Integer> userIdsToWrite = new ArraySet<>();
final int originalVersion = mUserVersion;
int userVersion = mUserVersion;
if (userVersion < 1) {
@@ -2147,7 +2150,7 @@ public class UserManagerService extends IUserManager.Stub {
if ("Primary".equals(userData.info.name)) {
userData.info.name =
mContext.getResources().getString(com.android.internal.R.string.owner_name);
- scheduleWriteUser(userData);
+ userIdsToWrite.add(userData.info.id);
}
userVersion = 1;
}
@@ -2157,7 +2160,7 @@ public class UserManagerService extends IUserManager.Stub {
UserData userData = getUserDataNoChecks(UserHandle.USER_SYSTEM);
if ((userData.info.flags & UserInfo.FLAG_INITIALIZED) == 0) {
userData.info.flags |= UserInfo.FLAG_INITIALIZED;
- scheduleWriteUser(userData);
+ userIdsToWrite.add(userData.info.id);
}
userVersion = 2;
}
@@ -2182,7 +2185,7 @@ public class UserManagerService extends IUserManager.Stub {
&& (userData.info.restrictedProfileParentId
== UserInfo.NO_PROFILE_GROUP_ID)) {
userData.info.restrictedProfileParentId = UserHandle.USER_SYSTEM;
- scheduleWriteUser(userData);
+ userIdsToWrite.add(userData.info.id);
}
}
}
@@ -2206,6 +2209,29 @@ public class UserManagerService extends IUserManager.Stub {
userVersion = 7;
}
+ if (userVersion < 8) {
+ // Added FLAG_FULL and FLAG_SYSTEM flags.
+ synchronized (mUsersLock) {
+ UserData userData = mUsers.get(UserHandle.USER_SYSTEM);
+ userData.info.flags |= UserInfo.FLAG_SYSTEM;
+ if (!UserManager.isHeadlessSystemUserMode()) {
+ userData.info.flags |= UserInfo.FLAG_FULL;
+ }
+ userIdsToWrite.add(userData.info.id);
+
+ // Mark FULL all non-profile users except USER_SYSTEM.
+ // Start index at 1 since USER_SYSTEM is the smallest userId and we're skipping it.
+ for (int i = 1; i < mUsers.size(); i++) {
+ userData = mUsers.valueAt(i);
+ if ((userData.info.flags & UserInfo.FLAG_MANAGED_PROFILE) == 0) {
+ userData.info.flags |= UserInfo.FLAG_FULL;
+ userIdsToWrite.add(userData.info.id);
+ }
+ }
+ }
+ userVersion = 8;
+ }
+
if (userVersion < USER_VERSION) {
Slog.w(LOG_TAG, "User version " + mUserVersion + " didn't upgrade as expected to "
+ USER_VERSION);
@@ -2213,6 +2239,12 @@ public class UserManagerService extends IUserManager.Stub {
mUserVersion = userVersion;
if (originalVersion < mUserVersion) {
+ for (int userId : userIdsToWrite) {
+ UserData userData = getUserDataNoChecks(userId);
+ if (userData != null) {
+ writeUserLP(userData);
+ }
+ }
writeUserListLP();
}
}
@@ -2220,12 +2252,15 @@ public class UserManagerService extends IUserManager.Stub {
@GuardedBy({"mPackagesLock", "mRestrictionsLock"})
private void fallbackToSingleUserLP() {
- int flags = UserInfo.FLAG_INITIALIZED;
+ int flags = UserInfo.FLAG_SYSTEM | UserInfo.FLAG_INITIALIZED;
// In split system user mode, the admin and primary flags are assigned to the first human
// user.
if (!UserManager.isSplitSystemUser()) {
flags |= UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY;
}
+ if (!UserManager.isHeadlessSystemUserMode()) {
+ flags |= UserInfo.FLAG_FULL;
+ }
// Create the system user
UserInfo system = new UserInfo(UserHandle.USER_SYSTEM, null, null, flags);
UserData userData = putUserInfo(system);
@@ -2262,14 +2297,14 @@ public class UserManagerService extends IUserManager.Stub {
return mContext.getResources().getString(com.android.internal.R.string.owner_name);
}
- private void scheduleWriteUser(UserData UserData) {
+ private void scheduleWriteUser(UserData userData) {
if (DBG) {
debug("scheduleWriteUser");
}
// No need to wrap it within a lock -- worst case, we'll just post the same message
// twice.
- if (!mHandler.hasMessages(WRITE_USER_MSG, UserData)) {
- Message msg = mHandler.obtainMessage(WRITE_USER_MSG, UserData);
+ if (!mHandler.hasMessages(WRITE_USER_MSG, userData)) {
+ Message msg = mHandler.obtainMessage(WRITE_USER_MSG, userData);
mHandler.sendMessageDelayed(msg, WRITE_USER_DELAY);
}
}
@@ -2749,6 +2784,10 @@ public class UserManagerService extends IUserManager.Stub {
}
}
}
+ if (!isManagedProfile) {
+ // New users cannot be system, and it's not a profile, so per-force it's FULL.
+ flags |= UserInfo.FLAG_FULL;
+ }
userId = getNextAvailableId();
Environment.getUserSystemDirectory(userId).mkdirs();
@@ -3723,6 +3762,8 @@ public class UserManagerService extends IUserManager.Stub {
pw.print(" <partial>");
}
pw.println();
+ pw.print(" Flags: "); pw.print(userInfo.flags); pw.print(" (");
+ pw.print(UserInfo.flagsToString(userInfo.flags)); pw.println(")");
pw.print(" State: ");
final int state;
synchronized (mUserStates) {
@@ -3807,6 +3848,8 @@ public class UserManagerService extends IUserManager.Stub {
pw.println(" All guests ephemeral: " + Resources.getSystem().getBoolean(
com.android.internal.R.bool.config_guestUserEphemeral));
pw.println(" Is split-system user: " + UserManager.isSplitSystemUser());
+ pw.println(" Is headless-system mode: " + UserManager.isHeadlessSystemUserMode());
+ pw.println(" User version: " + mUserVersion);
}
private static void dumpTimeAgo(PrintWriter pw, StringBuilder sb, long nowTime, long time) {
@@ -4133,6 +4176,14 @@ public class UserManagerService extends IUserManager.Stub {
Bundle restrictions = getEffectiveUserRestrictions(userId);
return restrictions != null && restrictions.getBoolean(restrictionKey);
}
+
+ public @Nullable UserInfo getUserInfo(@UserIdInt int userId) {
+ UserData userData;
+ synchronized (mUsersLock) {
+ userData = mUsers.get(userId);
+ }
+ return userData == null ? null : userData.info;
+ }
}
/* Remove all the users except of the system one. */
diff --git a/services/core/java/com/android/server/tv/TvRemoteProviderProxy.java b/services/core/java/com/android/server/tv/TvRemoteProviderProxy.java
index 557e9c8c8557..b27d5ea30c67 100644
--- a/services/core/java/com/android/server/tv/TvRemoteProviderProxy.java
+++ b/services/core/java/com/android/server/tv/TvRemoteProviderProxy.java
@@ -255,8 +255,6 @@ final class TvRemoteProviderProxy implements ServiceConnection {
void clearInputBridge(TvRemoteProviderProxy provider, IBinder token);
- void sendTimeStamp(TvRemoteProviderProxy provider, IBinder token, long timestamp);
-
void sendKeyDown(TvRemoteProviderProxy provider, IBinder token, int keyCode);
void sendKeyUp(TvRemoteProviderProxy provider, IBinder token, int keyCode);
@@ -400,24 +398,8 @@ final class TvRemoteProviderProxy implements ServiceConnection {
}
void sendTimestamp(final IBinder token, final long timestamp) {
- synchronized (mLock) {
- if (mActiveConnection == this && Binder.getCallingUid() == mUid) {
- final long idToken = Binder.clearCallingIdentity();
- try {
- if (mProviderMethods != null) {
- mProviderMethods.sendTimeStamp(TvRemoteProviderProxy.this, token,
- timestamp);
- }
- } finally {
- Binder.restoreCallingIdentity(idToken);
- }
- } else {
- if (DEBUG) {
- Slog.w(TAG,
- "sendTimeStamp, Invalid connection or incorrect uid: " + Binder
- .getCallingUid());
- }
- }
+ if (DEBUG) {
+ Slog.e(TAG, "sendTimestamp is deprecated, please remove all usages of this API.");
}
}
diff --git a/services/core/java/com/android/server/tv/TvRemoteService.java b/services/core/java/com/android/server/tv/TvRemoteService.java
index 961c9925414a..4a41bf8133c3 100644
--- a/services/core/java/com/android/server/tv/TvRemoteService.java
+++ b/services/core/java/com/android/server/tv/TvRemoteService.java
@@ -147,13 +147,6 @@ public class TvRemoteService extends SystemService implements Watchdog.Monitor {
}
}
- private void sendTimeStampInternalLocked(IBinder token, long timestamp) {
- UinputBridge inputBridge = mBridgeMap.get(token);
- if (inputBridge != null) {
- inputBridge.sendTimestamp(token, timestamp);
- }
- }
-
private void sendKeyDownInternalLocked(IBinder token, int keyCode) {
if (DEBUG_KEYS) {
Slog.d(TAG, "sendKeyDownInternalLocked(), token: " + token + ", keyCode: " + keyCode);
@@ -298,15 +291,6 @@ public class TvRemoteService extends SystemService implements Watchdog.Monitor {
}
@Override
- public void sendTimeStamp(TvRemoteProviderProxy provider, IBinder token, long timestamp) {
- synchronized (mLock) {
- if (mProviderList.contains(provider)) {
- mService.sendTimeStampInternalLocked(token, timestamp);
- }
- }
- }
-
- @Override
public void sendKeyDown(TvRemoteProviderProxy provider, IBinder token, int keyCode) {
if (DEBUG_KEYS) {
Slog.d(TAG, "sendKeyDown(), token: " + token + ", keyCode: " + keyCode);
diff --git a/services/core/java/com/android/server/tv/UinputBridge.java b/services/core/java/com/android/server/tv/UinputBridge.java
index 1a984f98051f..752aa6683a88 100644
--- a/services/core/java/com/android/server/tv/UinputBridge.java
+++ b/services/core/java/com/android/server/tv/UinputBridge.java
@@ -16,13 +16,12 @@
package com.android.server.tv;
-import android.os.Binder;
import android.os.IBinder;
-import java.io.IOException;
-
import dalvik.system.CloseGuard;
+import java.io.IOException;
+
/**
* Sends the input event to the linux driver.
*/
@@ -35,7 +34,6 @@ public final class UinputBridge {
int maxPointers);
private static native void nativeClose(long ptr);
private static native void nativeClear(long ptr);
- private static native void nativeSendTimestamp(long ptr, long timestamp);
private static native void nativeSendKey(long ptr, int keyCode, boolean down);
private static native void nativeSendPointerDown(long ptr, int pointerId, int x, int y);
private static native void nativeSendPointerUp(long ptr, int pointerId);
@@ -93,12 +91,6 @@ public final class UinputBridge {
return mToken.equals(token);
}
- public void sendTimestamp(IBinder token, long timestamp) {
- if (isTokenValid(token)) {
- nativeSendTimestamp(mPtr, timestamp);
- }
- }
-
public void sendKeyDown(IBinder token, int keyCode) {
if (isTokenValid(token)) {
nativeSendKey(mPtr, keyCode, true /*down*/);
diff --git a/services/core/java/com/android/server/wm/ActivityStack.java b/services/core/java/com/android/server/wm/ActivityStack.java
index 17536e42acc8..12eab5096a13 100644
--- a/services/core/java/com/android/server/wm/ActivityStack.java
+++ b/services/core/java/com/android/server/wm/ActivityStack.java
@@ -5370,13 +5370,20 @@ class ActivityStack extends ConfigurationContainer {
void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
boolean fromFullscreen) {
if (!inPinnedWindowingMode()) return;
- if (skipResizeAnimation(toBounds == null /* toFullscreen */)) {
- mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
- } else {
- if (getTaskStack() == null) return;
- getTaskStack().animateResizePinnedStack(toBounds, sourceHintBounds,
- animationDuration, fromFullscreen);
+ if (toBounds == null /* toFullscreen */) {
+ final Configuration parentConfig = getParent().getConfiguration();
+ final ActivityRecord top = topRunningNonOverlayTaskActivity();
+ if (top != null && !top.isConfigurationCompatible(parentConfig)) {
+ // The final orientation of this activity will change after moving to full screen.
+ // Start freezing screen here to prevent showing a temporary full screen window.
+ top.startFreezingScreenLocked(top.app, CONFIG_SCREEN_LAYOUT);
+ mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
+ return;
+ }
}
+ if (getTaskStack() == null) return;
+ getTaskStack().animateResizePinnedStack(toBounds, sourceHintBounds,
+ animationDuration, fromFullscreen);
}
/**
@@ -5392,15 +5399,6 @@ class ActivityStack extends ConfigurationContainer {
stack.getAnimationOrCurrentBounds(outBounds);
}
- private boolean skipResizeAnimation(boolean toFullscreen) {
- if (!toFullscreen) {
- return false;
- }
- final Configuration parentConfig = getParent().getConfiguration();
- final ActivityRecord top = topRunningNonOverlayTaskActivity();
- return top != null && !top.isConfigurationCompatible(parentConfig);
- }
-
void setPictureInPictureAspectRatio(float aspectRatio) {
if (getTaskStack() == null) return;
getTaskStack().setPictureInPictureAspectRatio(aspectRatio);
diff --git a/services/core/jni/com_android_server_tv_TvUinputBridge.cpp b/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
index 980922a806f5..c832c18517ce 100644
--- a/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
+++ b/services/core/jni/com_android_server_tv_TvUinputBridge.cpp
@@ -43,10 +43,6 @@
#include <sys/stat.h>
#include <sys/types.h>
-// Refer to EventHub.h
-#define MSC_ANDROID_TIME_SEC 0x6
-#define MSC_ANDROID_TIME_USEC 0x7
-
#define SLOT_UNKNOWN -1
namespace android {
@@ -153,11 +149,6 @@ NativeConnection* NativeConnection::open(const char* name, const char* uniqueId,
ioctl(fd, UI_SET_KEYBIT, KEYS[i].linuxKeyCode);
}
- // set the misc events maps
- ioctl(fd, UI_SET_EVBIT, EV_MSC);
- ioctl(fd, UI_SET_MSCBIT, MSC_ANDROID_TIME_SEC);
- ioctl(fd, UI_SET_MSCBIT, MSC_ANDROID_TIME_USEC);
-
// register the input device
if (write(fd, &uinp, sizeof(uinp)) != sizeof(uinp)) {
ALOGE("Cannot write uinput_user_dev to fd %d: %s.", fd, strerror(errno));
@@ -200,13 +191,6 @@ static void nativeClose(JNIEnv* env, jclass clazz, jlong ptr) {
delete connection;
}
-static void nativeSendTimestamp(JNIEnv* env, jclass clazz, jlong ptr, jlong timestamp) {
- NativeConnection* connection = reinterpret_cast<NativeConnection*>(ptr);
-
- connection->sendEvent(EV_MSC, MSC_ANDROID_TIME_SEC, timestamp / 1000L);
- connection->sendEvent(EV_MSC, MSC_ANDROID_TIME_USEC, (timestamp % 1000L) * 1000L);
-}
-
static void nativeSendKey(JNIEnv* env, jclass clazz, jlong ptr, jint keyCode, jboolean down) {
int32_t code = getLinuxKeyCode(keyCode);
NativeConnection* connection = reinterpret_cast<NativeConnection*>(ptr);
@@ -281,8 +265,6 @@ static JNINativeMethod gUinputBridgeMethods[] = {
(void*)nativeOpen },
{ "nativeClose", "(J)V",
(void*)nativeClose },
- { "nativeSendTimestamp", "(JJ)V",
- (void*)nativeSendTimestamp },
{ "nativeSendKey", "(JIZ)V",
(void*)nativeSendKey },
{ "nativeSendPointerDown", "(JIII)V",
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index f800cca3ab3d..f933b09b0c15 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -10846,6 +10846,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
public void setGlobalSetting(ComponentName who, String setting, String value) {
Preconditions.checkNotNull(who, "ComponentName is null");
+ DevicePolicyEventLogger
+ .createEvent(DevicePolicyEnums.SET_GLOBAL_SETTING)
+ .setAdmin(who)
+ .setStrings(setting, value)
+ .write();
+
synchronized (getLockObject()) {
getActiveAdminForCallerLocked(who, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
diff --git a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
index 0d99561af889..c92737b96897 100644
--- a/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
+++ b/services/robotests/backup/src/com/android/server/backup/BackupManagerServiceTest.java
@@ -36,8 +36,6 @@ import static org.mockito.Mockito.verify;
import static org.robolectric.Shadows.shadowOf;
import static org.testng.Assert.expectThrows;
-import static java.util.Collections.emptySet;
-
import android.annotation.UserIdInt;
import android.app.Application;
import android.app.backup.IBackupManagerMonitor;
@@ -48,14 +46,18 @@ import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
+import android.os.Process;
import android.os.UserHandle;
+import android.os.UserManager;
import android.platform.test.annotations.Presubmit;
import android.util.SparseArray;
import com.android.server.backup.testing.TransportData;
import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowBinder;
+import com.android.server.testing.shadows.ShadowEnvironment;
import com.android.server.testing.shadows.ShadowSystemServiceRegistry;
+import com.android.server.testing.shadows.ShadowUserManager;
import org.junit.After;
import org.junit.Before;
@@ -66,6 +68,7 @@ import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowContextWrapper;
import java.io.File;
@@ -80,7 +83,9 @@ import java.io.StringWriter;
shadows = {
ShadowApplicationPackageManager.class,
ShadowBinder.class,
- ShadowSystemServiceRegistry.class
+ ShadowEnvironment.class,
+ ShadowSystemServiceRegistry.class,
+ ShadowUserManager.class,
})
@Presubmit
public class BackupManagerServiceTest {
@@ -89,7 +94,9 @@ public class BackupManagerServiceTest {
private static final String[] ADB_TEST_PACKAGES = {TEST_PACKAGE};
private ShadowContextWrapper mShadowContext;
+ private ShadowUserManager mShadowUserManager;
private Context mContext;
+ private Trampoline mTrampoline;
@UserIdInt private int mUserOneId;
@UserIdInt private int mUserTwoId;
@Mock private UserBackupManagerService mUserOneService;
@@ -103,9 +110,18 @@ public class BackupManagerServiceTest {
Application application = RuntimeEnvironment.application;
mContext = application;
mShadowContext = shadowOf(application);
+ mShadowUserManager = Shadow.extract(UserManager.get(application));
mUserOneId = UserHandle.USER_SYSTEM + 1;
mUserTwoId = mUserOneId + 1;
+ mShadowUserManager.addUser(mUserOneId, "mUserOneId", 0);
+ mShadowUserManager.addUser(mUserTwoId, "mUserTwoId", 0);
+
+ mShadowContext.grantPermissions(BACKUP);
+ mShadowContext.grantPermissions(INTERACT_ACROSS_USERS_FULL);
+
+ mTrampoline = new Trampoline(mContext);
+ ShadowBinder.setCallingUid(Process.SYSTEM_UID);
}
/**
@@ -133,7 +149,7 @@ public class BackupManagerServiceTest {
public void testConstructor_doesNotRegisterUsers() throws Exception {
BackupManagerService backupManagerService = createService();
- assertThat(backupManagerService.getUserServices().size()).isEqualTo(0);
+ assertThat(mTrampoline.getUserServices().size()).isEqualTo(0);
}
/** Test that the constructor handles {@code null} parameters. */
@@ -144,7 +160,8 @@ public class BackupManagerServiceTest {
() ->
new BackupManagerService(
/* context */ null,
- new Trampoline(mContext)));
+ new Trampoline(mContext),
+ new SparseArray<>()));
}
/** Test that the constructor handles {@code null} parameters. */
@@ -154,70 +171,7 @@ public class BackupManagerServiceTest {
NullPointerException.class,
() ->
new BackupManagerService(
- mContext, /* trampoline */ null));
- }
-
- /** Test that the service registers users. */
- @Test
- public void testStartServiceForUser_registersUser() throws Exception {
- BackupManagerService backupManagerService = createService();
-
- backupManagerService.startServiceForUser(mUserOneId, emptySet());
-
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
- assertThat(serviceUsers.size()).isEqualTo(1);
- assertThat(serviceUsers.get(mUserOneId)).isNotNull();
- }
-
- /** Test that the service registers users. */
- @Test
- public void testStartServiceForUser_withServiceInstance_registersUser() throws Exception {
- BackupManagerService backupManagerService = createService();
-
- backupManagerService.startServiceForUser(mUserOneId, mUserOneService);
-
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
- assertThat(serviceUsers.size()).isEqualTo(1);
- assertThat(serviceUsers.get(mUserOneId)).isEqualTo(mUserOneService);
- }
-
- /** Test that the service unregisters users when stopped. */
- @Test
- public void testStopServiceForUser_forRegisteredUser_unregistersCorrectUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
-
- backupManagerService.stopServiceForUser(mUserOneId);
-
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
- assertThat(serviceUsers.size()).isEqualTo(1);
- assertThat(serviceUsers.get(mUserOneId)).isNull();
- assertThat(serviceUsers.get(mUserTwoId)).isEqualTo(mUserTwoService);
- }
-
- /** Test that the service unregisters users when stopped. */
- @Test
- public void testStopServiceForUser_forRegisteredUser_tearsDownCorrectUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
-
- backupManagerService.stopServiceForUser(mUserOneId);
-
- verify(mUserOneService).tearDownService();
- verify(mUserTwoService, never()).tearDownService();
- }
-
- /** Test that the service unregisters users when stopped. */
- @Test
- public void testStopServiceForUser_forUnknownUser_doesNothing() throws Exception {
- BackupManagerService backupManagerService = createService();
-
- backupManagerService.stopServiceForUser(mUserOneId);
-
- SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
- assertThat(serviceUsers.size()).isEqualTo(0);
+ mContext, /* trampoline */ null, new SparseArray<>()));
}
/**
@@ -226,8 +180,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testGetServiceForUser_withoutPermission_throwsSecurityExceptionForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
expectThrows(
@@ -243,8 +197,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testGetServiceForUserIfCallerHasPermission_withPermission_worksForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ true);
assertEquals(
@@ -258,8 +212,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testGetServiceForUserIfCallerHasPermission_withoutPermission_worksForCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
assertEquals(
@@ -274,8 +228,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testDataChanged_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.dataChanged(mUserOneId, TEST_PACKAGE);
@@ -286,8 +240,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testDataChanged_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.dataChanged(mUserTwoId, TEST_PACKAGE);
@@ -298,8 +252,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testAgentConnected_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
IBinder agentBinder = mock(IBinder.class);
@@ -311,8 +265,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testAgentConnected_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
IBinder agentBinder = mock(IBinder.class);
@@ -324,8 +278,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testAgentDisconnected_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.agentDisconnected(mUserOneId, TEST_PACKAGE);
@@ -336,8 +290,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testAgentDisconnected_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.agentDisconnected(mUserTwoId, TEST_PACKAGE);
@@ -348,8 +302,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testOpComplete_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.opComplete(mUserOneId, /* token */ 0, /* result */ 0L);
@@ -360,8 +314,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testOpComplete_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.opComplete(mUserTwoId, /* token */ 0, /* result */ 0L);
@@ -376,8 +330,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testInitializeTransports_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
String[] transports = {TEST_TRANSPORT};
@@ -389,8 +343,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testInitializeTransports_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
String[] transports = {TEST_TRANSPORT};
@@ -402,8 +356,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testClearBackupData_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.clearBackupData(mUserOneId, TEST_TRANSPORT, TEST_PACKAGE);
@@ -414,8 +368,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testClearBackupData_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.clearBackupData(mUserTwoId, TEST_TRANSPORT, TEST_PACKAGE);
@@ -426,8 +380,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testGetCurrentTransport_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.getCurrentTransport(mUserOneId);
@@ -438,8 +392,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testGetCurrentTransport_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.getCurrentTransport(mUserTwoId);
@@ -451,8 +405,8 @@ public class BackupManagerServiceTest {
@Test
public void testGetCurrentTransportComponent_onRegisteredUser_callsMethodForUser()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.getCurrentTransportComponent(mUserOneId);
@@ -464,8 +418,8 @@ public class BackupManagerServiceTest {
@Test
public void testGetCurrentTransportComponent_onUnknownUser_doesNotPropagateCall()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.getCurrentTransportComponent(mUserTwoId);
@@ -476,8 +430,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testListAllTransports_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.listAllTransports(mUserOneId);
@@ -488,8 +442,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testListAllTransports_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.listAllTransports(mUserTwoId);
@@ -501,8 +455,8 @@ public class BackupManagerServiceTest {
@Test
public void testListAllTransportComponents_onRegisteredUser_callsMethodForUser()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.listAllTransportComponents(mUserOneId);
@@ -514,8 +468,8 @@ public class BackupManagerServiceTest {
@Test
public void testListAllTransportComponents_onUnknownUser_doesNotPropagateCall()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.listAllTransportComponents(mUserTwoId);
@@ -527,8 +481,8 @@ public class BackupManagerServiceTest {
@Test
public void testUpdateTransportAttributes_onRegisteredUser_callsMethodForUser()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
TransportData transport = backupTransport();
Intent configurationIntent = new Intent();
@@ -557,8 +511,8 @@ public class BackupManagerServiceTest {
@Test
public void testUpdateTransportAttributes_onUnknownUser_doesNotPropagateCall()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
TransportData transport = backupTransport();
Intent configurationIntent = new Intent();
@@ -586,8 +540,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testSelectBackupTransport_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.selectBackupTransport(mUserOneId, TEST_TRANSPORT);
@@ -598,8 +552,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testSelectBackupTransport_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.selectBackupTransport(mUserTwoId, TEST_TRANSPORT);
@@ -610,8 +564,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testSelectTransportAsync_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
TransportData transport = backupTransport();
ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class);
@@ -627,8 +581,8 @@ public class BackupManagerServiceTest {
@Test
public void testSelectBackupTransportAsync_onUnknownUser_doesNotPropagateCall()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
TransportData transport = backupTransport();
ISelectBackupTransportCallback callback = mock(ISelectBackupTransportCallback.class);
@@ -643,8 +597,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testGetConfigurationIntent_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.getConfigurationIntent(mUserOneId, TEST_TRANSPORT);
@@ -655,8 +609,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testGetConfigurationIntent_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.getConfigurationIntent(mUserTwoId, TEST_TRANSPORT);
@@ -667,8 +621,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testGetDestinationString_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.getDestinationString(mUserOneId, TEST_TRANSPORT);
@@ -679,8 +633,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testGetDestinationString_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.getDestinationString(mUserTwoId, TEST_TRANSPORT);
@@ -691,8 +645,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testGetDataManagementIntent_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.getDataManagementIntent(mUserOneId, TEST_TRANSPORT);
@@ -703,8 +657,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testGetDataManagementIntent_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.getDataManagementIntent(mUserTwoId, TEST_TRANSPORT);
@@ -715,8 +669,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testGetDataManagementLabel_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.getDataManagementLabel(mUserOneId, TEST_TRANSPORT);
@@ -727,8 +681,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testGetDataManagementLabel_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.getDataManagementLabel(mUserTwoId, TEST_TRANSPORT);
@@ -745,8 +699,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testSetBackupEnabled_withoutPermission_throwsSecurityExceptionForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
expectThrows(
@@ -760,9 +714,10 @@ public class BackupManagerServiceTest {
*/
@Test
public void testSetBackupEnabled_withPermission_propagatesForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+ registerUser(mUserOneId, mUserOneService);
+ registerUser(mUserTwoId, mUserTwoService);
+ BackupManagerService backupManagerService = createService();
+
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true);
backupManagerService.setBackupEnabled(mUserTwoId, true);
@@ -773,8 +728,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testSetBackupEnabled_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.setBackupEnabled(mUserOneId, true);
@@ -785,8 +740,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testSetBackupEnabled_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.setBackupEnabled(mUserTwoId, true);
@@ -797,8 +752,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testSetAutoRestore_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.setAutoRestore(mUserOneId, true);
@@ -809,8 +764,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testSetAutoRestore_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.setAutoRestore(mUserTwoId, true);
@@ -821,8 +776,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testIsBackupEnabled_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.isBackupEnabled(mUserOneId);
@@ -833,8 +788,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testIsBackupEnabled_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.isBackupEnabled(mUserTwoId);
@@ -849,8 +804,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testIsAppEligibleForBackup_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.isAppEligibleForBackup(mUserOneId, TEST_PACKAGE);
@@ -861,8 +816,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testIsAppEligibleForBackup_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.isAppEligibleForBackup(mUserTwoId, TEST_PACKAGE);
@@ -874,8 +829,8 @@ public class BackupManagerServiceTest {
@Test
public void testFilterAppsEligibleForBackup_onRegisteredUser_callsMethodForUser()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
String[] packages = {TEST_PACKAGE};
@@ -888,8 +843,8 @@ public class BackupManagerServiceTest {
@Test
public void testFilterAppsEligibleForBackup_onUnknownUser_doesNotPropagateCall()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
String[] packages = {TEST_PACKAGE};
@@ -904,8 +859,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testBackupNow_withoutPermission_throwsSecurityExceptionForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
expectThrows(SecurityException.class, () -> backupManagerService.backupNow(mUserTwoId));
@@ -917,9 +872,10 @@ public class BackupManagerServiceTest {
*/
@Test
public void testBackupNow_withPermission_propagatesForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+ registerUser(mUserOneId, mUserOneService);
+ registerUser(mUserTwoId, mUserTwoService);
+ BackupManagerService backupManagerService = createService();
+
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true);
backupManagerService.backupNow(mUserTwoId);
@@ -930,8 +886,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testBackupNow_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.backupNow(mUserOneId);
@@ -942,8 +898,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testBackupNow_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.backupNow(mUserTwoId);
@@ -957,8 +913,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testRequestBackup_withoutPermission_throwsSecurityExceptionForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
String[] packages = {TEST_PACKAGE};
IBackupObserver observer = mock(IBackupObserver.class);
@@ -977,9 +933,10 @@ public class BackupManagerServiceTest {
*/
@Test
public void testRequestBackup_withPermission_propagatesForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+ registerUser(mUserOneId, mUserOneService);
+ registerUser(mUserTwoId, mUserTwoService);
+ BackupManagerService backupManagerService = createService();
+
String[] packages = {TEST_PACKAGE};
IBackupObserver observer = mock(IBackupObserver.class);
IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class);
@@ -993,8 +950,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testRequestBackup_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
String[] packages = {TEST_PACKAGE};
IBackupObserver observer = mock(IBackupObserver.class);
IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class);
@@ -1008,8 +965,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testRequestBackup_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
String[] packages = {TEST_PACKAGE};
IBackupObserver observer = mock(IBackupObserver.class);
IBackupManagerMonitor monitor = mock(IBackupManagerMonitor.class);
@@ -1026,8 +983,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testCancelBackups_withoutPermission_throwsSecurityExceptionForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
expectThrows(SecurityException.class, () -> backupManagerService.cancelBackups(mUserTwoId));
@@ -1039,9 +996,10 @@ public class BackupManagerServiceTest {
*/
@Test
public void testCancelBackups_withPermission_propagatesForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+ registerUser(mUserOneId, mUserOneService);
+ registerUser(mUserTwoId, mUserTwoService);
+ BackupManagerService backupManagerService = createService();
+
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true);
backupManagerService.cancelBackups(mUserTwoId);
@@ -1052,8 +1010,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testCancelBackups_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.cancelBackups(mUserOneId);
@@ -1064,8 +1022,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testCancelBackups_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.cancelBackups(mUserTwoId);
@@ -1076,8 +1034,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testBeginFullBackup_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(UserHandle.USER_SYSTEM, mUserOneService);
+ registerUser(UserHandle.USER_SYSTEM, mUserOneService);
+ BackupManagerService backupManagerService = createService();
FullBackupJob job = new FullBackupJob();
backupManagerService.beginFullBackup(UserHandle.USER_SYSTEM, job);
@@ -1099,8 +1057,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testEndFullBackup_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(UserHandle.USER_SYSTEM, mUserOneService);
+ registerUser(UserHandle.USER_SYSTEM, mUserOneService);
+ BackupManagerService backupManagerService = createService();
backupManagerService.endFullBackup(UserHandle.USER_SYSTEM);
@@ -1120,8 +1078,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testFullTransportBackup_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
String[] packages = {TEST_PACKAGE};
@@ -1133,8 +1091,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testFullTransportBackup_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
String[] packages = {TEST_PACKAGE};
@@ -1150,8 +1108,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testRestoreAtInstall_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.restoreAtInstall(mUserOneId, TEST_PACKAGE, /* token */ 0);
@@ -1162,8 +1120,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testRestoreAtInstall_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.restoreAtInstall(mUserTwoId, TEST_PACKAGE, /* token */ 0);
@@ -1174,8 +1132,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testBeginRestoreSession_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.beginRestoreSession(mUserOneId, TEST_PACKAGE, TEST_TRANSPORT);
@@ -1186,8 +1144,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testBeginRestoreSession_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.beginRestoreSession(mUserTwoId, TEST_PACKAGE, TEST_TRANSPORT);
@@ -1199,8 +1157,8 @@ public class BackupManagerServiceTest {
@Test
public void testGetAvailableRestoreToken_onRegisteredUser_callsMethodForUser()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
backupManagerService.getAvailableRestoreToken(mUserOneId, TEST_PACKAGE);
@@ -1211,8 +1169,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testGetAvailableRestoreToken_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
backupManagerService.getAvailableRestoreToken(mUserTwoId, TEST_PACKAGE);
@@ -1227,8 +1185,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testSetBackupPassword_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(UserHandle.USER_SYSTEM, mUserOneService);
+ registerUser(UserHandle.USER_SYSTEM, mUserOneService);
+ BackupManagerService backupManagerService = createService();
backupManagerService.setBackupPassword("currentPassword", "newPassword");
@@ -1248,8 +1206,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testHasBackupPassword_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(UserHandle.USER_SYSTEM, mUserOneService);
+ registerUser(UserHandle.USER_SYSTEM, mUserOneService);
+ BackupManagerService backupManagerService = createService();
backupManagerService.hasBackupPassword();
@@ -1272,8 +1230,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testAdbBackup_withoutPermission_throwsSecurityExceptionForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
expectThrows(
@@ -1299,9 +1257,10 @@ public class BackupManagerServiceTest {
*/
@Test
public void testAdbBackup_withPermission_propagatesForNonCallingUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+ registerUser(mUserOneId, mUserOneService);
+ registerUser(mUserTwoId, mUserTwoService);
+ BackupManagerService backupManagerService = createService();
+
ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true);
@@ -1335,8 +1294,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testAdbBackup_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
@@ -1370,8 +1329,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testAdbBackup_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
@@ -1408,8 +1367,8 @@ public class BackupManagerServiceTest {
*/
@Test
public void testAdbRestore_withoutPermission_throwsSecurityExceptionForNonCallingUser() {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
expectThrows(
@@ -1422,9 +1381,9 @@ public class BackupManagerServiceTest {
*/
@Test
public void testAdbRestore_withPermission_propagatesForNonCallingUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
- backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+ registerUser(mUserOneId, mUserOneService);
+ registerUser(mUserTwoId, mUserTwoService);
+ BackupManagerService backupManagerService = createService();
ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ true);
@@ -1436,8 +1395,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service routes methods correctly to the user that requests it. */
@Test
public void testAdbRestore_onRegisteredUser_callsMethodForUser() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
@@ -1449,8 +1408,8 @@ public class BackupManagerServiceTest {
/** Test that the backup service does not route methods for non-registered users. */
@Test
public void testAdbRestore_onUnknownUser_doesNotPropagateCall() throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
ParcelFileDescriptor parcelFileDescriptor = getFileDescriptorForAdbTest();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
@@ -1463,8 +1422,8 @@ public class BackupManagerServiceTest {
@Test
public void testAcknowledgeAdbBackupOrRestore_onRegisteredUser_callsMethodForUser()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserOneId, /* shouldGrantPermission */ false);
IFullBackupRestoreObserver observer = mock(IFullBackupRestoreObserver.class);
@@ -1489,8 +1448,8 @@ public class BackupManagerServiceTest {
@Test
public void testAcknowledgeAdbBackupOrRestore_onUnknownUser_doesNotPropagateCall()
throws Exception {
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
setCallerAndGrantInteractUserPermission(mUserTwoId, /* shouldGrantPermission */ false);
IFullBackupRestoreObserver observer = mock(IFullBackupRestoreObserver.class);
@@ -1515,7 +1474,6 @@ public class BackupManagerServiceTest {
// Lifecycle tests
// ---------------------------------------------
-
/** testOnStart_publishesService */
@Test
public void testOnStart_publishesService() {
@@ -1562,8 +1520,8 @@ public class BackupManagerServiceTest {
public void testDump_onRegisteredUser_callsMethodForUser() throws Exception {
grantDumpPermissions();
- BackupManagerService backupManagerService =
- createServiceAndRegisterUser(UserHandle.USER_SYSTEM, mUserOneService);
+ registerUser(UserHandle.USER_SYSTEM, mUserOneService);
+ BackupManagerService backupManagerService = createService();
File testFile = createTestFile();
FileDescriptor fileDescriptor = new FileDescriptor();
PrintWriter printWriter = new PrintWriter(testFile);
@@ -1595,8 +1553,8 @@ public class BackupManagerServiceTest {
public void testDump_users_dumpsListOfRegisteredUsers() {
grantDumpPermissions();
- BackupManagerService backupManagerService = createServiceAndRegisterUser(mUserOneId,
- mUserOneService);
+ registerUser(mUserOneId, mUserOneService);
+ BackupManagerService backupManagerService = createService();
StringWriter out = new StringWriter();
PrintWriter writer = new PrintWriter(out);
String[] args = {"users"};
@@ -1623,14 +1581,12 @@ public class BackupManagerServiceTest {
private BackupManagerService createService() {
mShadowContext.grantPermissions(BACKUP);
- return new BackupManagerService(mContext, new Trampoline(mContext));
+ return new BackupManagerService(mContext, mTrampoline, mTrampoline.getUserServices());
}
- private BackupManagerService createServiceAndRegisterUser(
- int userId, UserBackupManagerService userBackupManagerService) {
- BackupManagerService backupManagerService = createService();
- backupManagerService.startServiceForUser(userId, userBackupManagerService);
- return backupManagerService;
+ private void registerUser(int userId, UserBackupManagerService userBackupManagerService) {
+ mTrampoline.setBackupServiceActive(userId, true);
+ mTrampoline.startServiceForUser(userId, userBackupManagerService);
}
/**
diff --git a/services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java b/services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java
new file mode 100644
index 000000000000..dfad1a9120d7
--- /dev/null
+++ b/services/robotests/backup/src/com/android/server/backup/TrampolineRoboTest.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.backup;
+
+import static android.Manifest.permission.BACKUP;
+import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.robolectric.Shadows.shadowOf;
+
+import android.annotation.UserIdInt;
+import android.app.Application;
+import android.content.Context;
+import android.os.Process;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.platform.test.annotations.Presubmit;
+import android.util.SparseArray;
+
+import com.android.server.testing.shadows.ShadowApplicationPackageManager;
+import com.android.server.testing.shadows.ShadowBinder;
+import com.android.server.testing.shadows.ShadowEnvironment;
+import com.android.server.testing.shadows.ShadowSystemServiceRegistry;
+import com.android.server.testing.shadows.ShadowUserManager;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowContextWrapper;
+
+/** Tests for {@link com.android.server.backup.Trampoline}. */
+@RunWith(RobolectricTestRunner.class)
+@Config(
+ shadows = {
+ ShadowApplicationPackageManager.class,
+ ShadowBinder.class,
+ ShadowUserManager.class,
+ ShadowEnvironment.class,
+ ShadowSystemServiceRegistry.class
+ })
+@Presubmit
+public class TrampolineRoboTest {
+ private Context mContext;
+ private ShadowContextWrapper mShadowContext;
+ private ShadowUserManager mShadowUserManager;
+ @UserIdInt private int mUserOneId;
+ @UserIdInt private int mUserTwoId;
+ @Mock private UserBackupManagerService mUserOneService;
+ @Mock private UserBackupManagerService mUserTwoService;
+
+ /** Setup */
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ Application application = RuntimeEnvironment.application;
+ mContext = application;
+ mShadowContext = shadowOf(application);
+ mShadowUserManager = Shadow.extract(UserManager.get(application));
+
+ mUserOneId = UserHandle.USER_SYSTEM + 1;
+ mUserTwoId = mUserOneId + 1;
+ mShadowUserManager.addUser(mUserOneId, "mUserOneId", 0);
+ mShadowUserManager.addUser(mUserTwoId, "mUserTwoId", 0);
+
+ mShadowContext.grantPermissions(BACKUP);
+ mShadowContext.grantPermissions(INTERACT_ACROSS_USERS_FULL);
+
+ ShadowBinder.setCallingUid(Process.SYSTEM_UID);
+ }
+
+ /** Test that the service registers users. */
+ @Test
+ public void testStartServiceForUser_registersUser() throws Exception {
+ Trampoline backupManagerService = createService();
+ backupManagerService.setBackupServiceActive(mUserOneId, true);
+
+ backupManagerService.startServiceForUser(mUserOneId);
+
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
+ assertThat(serviceUsers.size()).isEqualTo(1);
+ assertThat(serviceUsers.get(mUserOneId)).isNotNull();
+ }
+
+ /** Test that the service registers users. */
+ @Test
+ public void testStartServiceForUser_withServiceInstance_registersUser() throws Exception {
+ Trampoline backupManagerService = createService();
+ backupManagerService.setBackupServiceActive(mUserOneId, true);
+
+ backupManagerService.startServiceForUser(mUserOneId, mUserOneService);
+
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
+ assertThat(serviceUsers.size()).isEqualTo(1);
+ assertThat(serviceUsers.get(mUserOneId)).isEqualTo(mUserOneService);
+ }
+
+ /** Test that the service unregisters users when stopped. */
+ @Test
+ public void testStopServiceForUser_forRegisteredUser_unregistersCorrectUser() throws Exception {
+ Trampoline backupManagerService =
+ createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+ ShadowBinder.setCallingUid(Process.SYSTEM_UID);
+
+ backupManagerService.stopServiceForUser(mUserOneId);
+
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
+ assertThat(serviceUsers.size()).isEqualTo(1);
+ assertThat(serviceUsers.get(mUserOneId)).isNull();
+ assertThat(serviceUsers.get(mUserTwoId)).isEqualTo(mUserTwoService);
+ }
+
+ /** Test that the service unregisters users when stopped. */
+ @Test
+ public void testStopServiceForUser_forRegisteredUser_tearsDownCorrectUser() throws Exception {
+ Trampoline backupManagerService =
+ createServiceAndRegisterUser(mUserOneId, mUserOneService);
+ backupManagerService.setBackupServiceActive(mUserTwoId, true);
+ backupManagerService.startServiceForUser(mUserTwoId, mUserTwoService);
+
+ backupManagerService.stopServiceForUser(mUserOneId);
+
+ verify(mUserOneService).tearDownService();
+ verify(mUserTwoService, never()).tearDownService();
+ }
+
+ /** Test that the service unregisters users when stopped. */
+ @Test
+ public void testStopServiceForUser_forUnknownUser_doesNothing() throws Exception {
+ Trampoline backupManagerService = createService();
+ backupManagerService.setBackupServiceActive(mUserOneId, true);
+ ShadowBinder.setCallingUid(Process.SYSTEM_UID);
+
+ backupManagerService.stopServiceForUser(mUserOneId);
+
+ SparseArray<UserBackupManagerService> serviceUsers = backupManagerService.getUserServices();
+ assertThat(serviceUsers.size()).isEqualTo(0);
+ }
+
+ private Trampoline createService() {
+ return new Trampoline(mContext);
+ }
+
+ private Trampoline createServiceAndRegisterUser(
+ int userId, UserBackupManagerService userBackupManagerService) {
+ Trampoline backupManagerService = createService();
+ backupManagerService.setBackupServiceActive(userBackupManagerService.getUserId(), true);
+ backupManagerService.startServiceForUser(userId, userBackupManagerService);
+ return backupManagerService;
+ }
+}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowEnvironment.java b/services/robotests/src/com/android/server/testing/shadows/ShadowEnvironment.java
new file mode 100644
index 000000000000..577b0824e775
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowEnvironment.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.testing.shadows;
+
+import android.annotation.Nullable;
+import android.os.Environment;
+
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.annotation.Resetter;
+
+import java.io.File;
+import java.nio.file.Path;
+
+/** Implementation mimics {@link org.robolectric.shadows.ShadowEnvironment}. */
+@Implements(Environment.class)
+public class ShadowEnvironment extends org.robolectric.shadows.ShadowEnvironment {
+ @Nullable private static Path sDataDirectory;
+
+ /** @see Environment#getDataDirectory() */
+ @Implementation
+ public static File getDataDirectory() {
+ if (sDataDirectory == null) {
+ sDataDirectory = RuntimeEnvironment.getTempDirectory().create("data");
+ }
+ return sDataDirectory.toFile();
+ }
+
+ /** Resets static state. */
+ @Resetter
+ public static void reset() {
+ org.robolectric.shadows.ShadowEnvironment.reset();
+ sDataDirectory = null;
+ }
+}
diff --git a/services/robotests/src/com/android/server/testing/shadows/ShadowUserManager.java b/services/robotests/src/com/android/server/testing/shadows/ShadowUserManager.java
new file mode 100644
index 000000000000..c6ae1a1b6863
--- /dev/null
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowUserManager.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.testing.shadows;
+
+import android.annotation.UserIdInt;
+import android.os.UserManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+/** Shadow for {@link UserManager}. */
+@Implements(UserManager.class)
+public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
+ /** @see UserManager#isUserUnlocked() */
+ @Implementation
+ public boolean isUserUnlocked(@UserIdInt int userId) {
+ return false;
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
index 8668a3cfa26c..1f9351352e2b 100644
--- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
+++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java
@@ -22,11 +22,11 @@ import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -39,6 +39,7 @@ import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
import android.app.backup.IFullBackupRestoreObserver;
import android.app.backup.ISelectBackupTransportCallback;
+import android.app.job.JobScheduler;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -71,7 +72,6 @@ import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
-import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
@@ -129,16 +129,17 @@ public class TrampolineTest {
private TrampolineTestable mTrampoline;
private File mTestDir;
private File mSuppressFile;
+ private SparseArray<UserBackupManagerService> mUserServices;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mUserId = UserHandle.USER_SYSTEM;
- SparseArray<UserBackupManagerService> serviceUsers = new SparseArray<>();
- serviceUsers.append(UserHandle.USER_SYSTEM, mUserBackupManagerService);
- serviceUsers.append(NON_USER_SYSTEM, mUserBackupManagerService);
- when(mBackupManagerServiceMock.getUserServices()).thenReturn(serviceUsers);
+ mUserServices = new SparseArray<>();
+ mUserServices.append(UserHandle.USER_SYSTEM, mUserBackupManagerService);
+ mUserServices.append(NON_USER_SYSTEM, mUserBackupManagerService);
+ when(mBackupManagerServiceMock.getUserServices()).thenReturn(mUserServices);
when(mUserManagerMock.getUserInfo(UserHandle.USER_SYSTEM)).thenReturn(mUserInfoMock);
when(mUserManagerMock.getUserInfo(NON_USER_SYSTEM)).thenReturn(mUserInfoMock);
@@ -159,7 +160,9 @@ public class TrampolineTest {
setUpStateFilesForNonSystemUser(NON_USER_SYSTEM);
setUpStateFilesForNonSystemUser(UNSTARTED_NON_USER_SYSTEM);
- mTrampoline = new TrampolineTestable(mContextMock);
+ when(mContextMock.getSystemService(Context.JOB_SCHEDULER_SERVICE))
+ .thenReturn(mock(JobScheduler.class));
+ mTrampoline = new TrampolineTestable(mContextMock, mUserServices);
}
private void setUpStateFilesForNonSystemUser(int userId) {
@@ -190,9 +193,8 @@ public class TrampolineTest {
@Test
public void testOnUnlockUser_forNonSystemUserWhenBackupsDisabled_doesNotStartUser() {
- when(mBackupManagerServiceMock.getUserServices()).thenReturn(new SparseArray<>());
TrampolineTestable.sBackupDisabled = true;
- TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
+ TrampolineTestable trampoline = new TrampolineTestable(mContextMock, new SparseArray<>());
ConditionVariable unlocked = new ConditionVariable(false);
trampoline.onUnlockUser(NON_USER_SYSTEM);
@@ -204,9 +206,8 @@ public class TrampolineTest {
@Test
public void testOnUnlockUser_forSystemUserWhenBackupsDisabled_doesNotStartUser() {
- when(mBackupManagerServiceMock.getUserServices()).thenReturn(new SparseArray<>());
TrampolineTestable.sBackupDisabled = true;
- TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
+ TrampolineTestable trampoline = new TrampolineTestable(mContextMock, new SparseArray<>());
ConditionVariable unlocked = new ConditionVariable(false);
trampoline.onUnlockUser(UserHandle.USER_SYSTEM);
@@ -218,9 +219,8 @@ public class TrampolineTest {
@Test
public void testOnUnlockUser_whenBackupNotActivated_doesNotStartUser() {
- when(mBackupManagerServiceMock.getUserServices()).thenReturn(new SparseArray<>());
TrampolineTestable.sBackupDisabled = false;
- TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
+ TrampolineTestable trampoline = new TrampolineTestable(mContextMock, new SparseArray<>());
trampoline.setBackupServiceActive(NON_USER_SYSTEM, false);
ConditionVariable unlocked = new ConditionVariable(false);
@@ -229,16 +229,13 @@ public class TrampolineTest {
trampoline.getBackupHandler().post(unlocked::open);
unlocked.block();
assertNull(trampoline.getUserService(NON_USER_SYSTEM));
- //noinspection unchecked
- verify(mBackupManagerServiceMock, never()).startServiceForUser(
- eq(NON_USER_SYSTEM), any(Set.class));
}
@Test
public void testIsBackupServiceActive_forSystemUserWhenBackupDisabled_returnsTrue()
throws Exception {
TrampolineTestable.sBackupDisabled = true;
- Trampoline trampoline = new TrampolineTestable(mContextMock);
+ Trampoline trampoline = new TrampolineTestable(mContextMock, mUserServices);
trampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
assertFalse(trampoline.isBackupServiceActive(UserHandle.USER_SYSTEM));
@@ -248,7 +245,7 @@ public class TrampolineTest {
public void testIsBackupServiceActive_forNonSystemUserWhenBackupDisabled_returnsTrue()
throws Exception {
TrampolineTestable.sBackupDisabled = true;
- Trampoline trampoline = new TrampolineTestable(mContextMock);
+ Trampoline trampoline = new TrampolineTestable(mContextMock, mUserServices);
trampoline.setBackupServiceActive(NON_USER_SYSTEM, true);
assertFalse(trampoline.isBackupServiceActive(NON_USER_SYSTEM));
@@ -396,7 +393,7 @@ public class TrampolineTest {
@Test
public void setBackupServiceActive_backupDisabled_ignored() {
TrampolineTestable.sBackupDisabled = true;
- TrampolineTestable trampoline = new TrampolineTestable(mContextMock);
+ TrampolineTestable trampoline = new TrampolineTestable(mContextMock, mUserServices);
trampoline.setBackupServiceActive(UserHandle.USER_SYSTEM, true);
@@ -1045,7 +1042,7 @@ public class TrampolineTest {
public void testGetUserForAncestralSerialNumber() {
TrampolineTestable.sBackupDisabled = false;
- Trampoline trampoline = new TrampolineTestable(mContextMock);
+ Trampoline trampoline = new TrampolineTestable(mContextMock, mUserServices);
trampoline.getUserForAncestralSerialNumber(0L);
verify(mBackupManagerServiceMock).getUserForAncestralSerialNumber(anyInt());
@@ -1053,7 +1050,7 @@ public class TrampolineTest {
public void testGetUserForAncestralSerialNumber_whenDisabled() {
TrampolineTestable.sBackupDisabled = true;
- Trampoline trampoline = new TrampolineTestable(mContextMock);
+ Trampoline trampoline = new TrampolineTestable(mContextMock, mUserServices);
trampoline.getUserForAncestralSerialNumber(0L);
verify(mBackupManagerServiceMock, never()).getUserForAncestralSerialNumber(anyInt());
@@ -1069,8 +1066,8 @@ public class TrampolineTest {
static SparseArray<File> sRememberActivatedFiles = new SparseArray<>();
static UserManager sUserManagerMock = null;
- TrampolineTestable(Context context) {
- super(context);
+ TrampolineTestable(Context context, SparseArray<UserBackupManagerService> userServices) {
+ super(context, userServices);
mService = sBackupManagerServiceMock;
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index b2fde548e506..b2ac5490440d 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -20,6 +20,7 @@ import android.Manifest;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityManagerInternal;
import android.app.AppGlobals;
@@ -36,6 +37,7 @@ import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.content.pm.ShortcutServiceInternal;
+import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.hardware.soundtrigger.IRecognitionStatusCallback;
@@ -80,6 +82,7 @@ import com.android.server.SystemService;
import com.android.server.UiThread;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.soundtrigger.SoundTriggerInternal;
+import com.android.server.utils.TimingsTraceAndSlog;
import com.android.server.wm.ActivityTaskManagerInternal;
import java.io.FileDescriptor;
@@ -92,7 +95,7 @@ import java.util.concurrent.Executor;
*/
public class VoiceInteractionManagerService extends SystemService {
static final String TAG = "VoiceInteractionManagerService";
- static final boolean DEBUG = false;
+ static final boolean DEBUG = true; // TODO(b/133242016) STOPSHIP: change to false before R ships
final Context mContext;
final ContentResolver mResolver;
@@ -154,19 +157,37 @@ public class VoiceInteractionManagerService extends SystemService {
}
@Override
- public void onStartUser(int userHandle) {
- mServiceStub.initForUser(userHandle);
+ public void onStartUser(@NonNull UserInfo userInfo) {
+ if (DEBUG) Slog.d(TAG, "onStartUser(" + userInfo + ")");
+
+ if (!userInfo.isFull()) {
+ if (DEBUG) Slog.d(TAG, "***** skipping on non-full user " + userInfo);
+ return;
+ }
+ mServiceStub.initForUser(userInfo.id);
}
@Override
- public void onUnlockUser(int userHandle) {
- mServiceStub.initForUser(userHandle);
+ public void onUnlockUser(@NonNull UserInfo userInfo) {
+ if (DEBUG) Slog.d(TAG, "onUnlockUser(" + userInfo + ")");
+
+ if (!userInfo.isFull()) {
+ if (DEBUG) Slog.d(TAG, "***** skipping on non-full user " + userInfo);
+ return;
+ }
+ mServiceStub.initForUser(userInfo.id);
mServiceStub.switchImplementationIfNeeded(false);
}
@Override
- public void onSwitchUser(int userHandle) {
- mServiceStub.switchUser(userHandle);
+ public void onSwitchUser(@NonNull UserInfo userInfo) {
+ if (DEBUG) Slog.d(TAG, "onSwitchUser(" + userInfo + ")");
+
+ if (!userInfo.isFull()) {
+ if (DEBUG) Slog.d(TAG, "***** skipping on non-full user " + userInfo);
+ return;
+ }
+ mServiceStub.switchUser(userInfo.id);
}
class LocalService extends VoiceInteractionManagerInternal {
@@ -270,6 +291,20 @@ public class VoiceInteractionManagerService extends SystemService {
}
public void initForUser(int userHandle) {
+ final TimingsTraceAndSlog t;
+ if (DEBUG) {
+ t = TimingsTraceAndSlog.newAsyncLog();
+ t.traceBegin("VoiceInteractionSvc.initForUser(" + userHandle + ")");
+ } else {
+ t = null;
+ }
+ initForUserNoTracing(userHandle);
+ if (t != null) {
+ t.traceEnd();
+ }
+ }
+
+ private void initForUserNoTracing(@UserIdInt int userHandle) {
if (DEBUG) Slog.d(TAG, "**************** initForUser user=" + userHandle);
String curInteractorStr = Settings.Secure.getStringForUser(
mContext.getContentResolver(),
@@ -426,6 +461,20 @@ public class VoiceInteractionManagerService extends SystemService {
}
void switchImplementationIfNeededLocked(boolean force) {
+ final TimingsTraceAndSlog t;
+ if (DEBUG) {
+ t = TimingsTraceAndSlog.newAsyncLog();
+ t.traceBegin("VoiceInteractionSvc.switchImplementation(" + mCurUser + ")");
+ } else {
+ t = null;
+ }
+ switchImplementationIfNeededNoTracingLocked(force);
+ if (t != null) {
+ t.traceEnd();
+ }
+ }
+
+ void switchImplementationIfNeededNoTracingLocked(boolean force) {
if (!mSafeMode) {
String curService = Settings.Secure.getStringForUser(
mResolver, Settings.Secure.VOICE_INTERACTION_SERVICE, mCurUser);
diff --git a/telecomm/java/android/telecom/Logging/Session.java b/telecomm/java/android/telecom/Logging/Session.java
index 50c3cd97d77a..95a47e131272 100644
--- a/telecomm/java/android/telecom/Logging/Session.java
+++ b/telecomm/java/android/telecom/Logging/Session.java
@@ -33,6 +33,8 @@ import java.util.ArrayList;
*/
public class Session {
+ public static final String LOG_TAG = "Session";
+
public static final String START_SESSION = "START_SESSION";
public static final String START_EXTERNAL_SESSION = "START_EXTERNAL_SESSION";
public static final String CREATE_SUBSESSION = "CREATE_SUBSESSION";
@@ -45,6 +47,9 @@ public class Session {
public static final String EXTERNAL_INDICATOR = "E-";
public static final String TRUNCATE_STRING = "...";
+ // Prevent infinite recursion by setting a reasonable limit.
+ private static final int SESSION_RECURSION_LIMIT = 25;
+
/**
* Initial value of mExecutionEndTimeMs and the final value of {@link #getLocalExecutionTime()}
* if the Session is canceled.
@@ -226,6 +231,15 @@ public class Session {
// Builds full session id recursively
private String getFullSessionId() {
+ return getFullSessionId(0);
+ }
+
+ // keep track of calls and bail if we hit the recursion limit
+ private String getFullSessionId(int parentCount) {
+ if (parentCount >= SESSION_RECURSION_LIMIT) {
+ Log.w(LOG_TAG, "getFullSessionId: Hit recursion limit!");
+ return TRUNCATE_STRING + mSessionId;
+ }
// Cache mParentSession locally to prevent a concurrency problem where
// Log.endParentSessions() is called while a logging statement is running (Log.i, for
// example) and setting mParentSession to null in a different thread after the null check
@@ -235,42 +249,57 @@ public class Session {
return mSessionId;
} else {
if (Log.VERBOSE) {
- return parentSession.getFullSessionId() +
+ return parentSession.getFullSessionId(parentCount + 1)
// Append "_X" to subsession to show subsession designation.
- SESSION_SEPARATION_CHAR_CHILD + mSessionId;
+ + SESSION_SEPARATION_CHAR_CHILD + mSessionId;
} else {
// Only worry about the base ID at the top of the tree.
- return parentSession.getFullSessionId();
+ return parentSession.getFullSessionId(parentCount + 1);
}
}
}
- // Print out the full Session tree from any subsession node
- public String printFullSessionTree() {
- // Get to the top of the tree
+ private Session getRootSession(String callingMethod) {
+ int currParentCount = 0;
Session topNode = this;
while (topNode.getParentSession() != null) {
+ if (currParentCount >= SESSION_RECURSION_LIMIT) {
+ Log.w(LOG_TAG, "getRootSession: Hit recursion limit from " + callingMethod);
+ break;
+ }
topNode = topNode.getParentSession();
+ currParentCount++;
}
- return topNode.printSessionTree();
+ return topNode;
+ }
+
+ // Print out the full Session tree from any subsession node
+ public String printFullSessionTree() {
+ return getRootSession("printFullSessionTree").printSessionTree();
}
// Recursively move down session tree using DFS, but print out each node when it is reached.
- public String printSessionTree() {
+ private String printSessionTree() {
StringBuilder sb = new StringBuilder();
- printSessionTree(0, sb);
+ printSessionTree(0, sb, 0);
return sb.toString();
}
- private void printSessionTree(int tabI, StringBuilder sb) {
+ private void printSessionTree(int tabI, StringBuilder sb, int currChildCount) {
+ // Prevent infinite recursion.
+ if (currChildCount >= SESSION_RECURSION_LIMIT) {
+ Log.w(LOG_TAG, "printSessionTree: Hit recursion limit!");
+ sb.append(TRUNCATE_STRING);
+ return;
+ }
sb.append(toString());
for (Session child : mChildSessions) {
sb.append("\n");
for (int i = 0; i <= tabI; i++) {
sb.append("\t");
}
- child.printSessionTree(tabI + 1, sb);
+ child.printSessionTree(tabI + 1, sb, currChildCount + 1);
}
}
@@ -279,11 +308,17 @@ public class Session {
// recent) will be truncated to "..."
public String getFullMethodPath(boolean truncatePath) {
StringBuilder sb = new StringBuilder();
- getFullMethodPath(sb, truncatePath);
+ getFullMethodPath(sb, truncatePath, 0);
return sb.toString();
}
- private synchronized void getFullMethodPath(StringBuilder sb, boolean truncatePath) {
+ private synchronized void getFullMethodPath(StringBuilder sb, boolean truncatePath,
+ int parentCount) {
+ if (parentCount >= SESSION_RECURSION_LIMIT) {
+ Log.w(LOG_TAG, "getFullMethodPath: Hit recursion limit!");
+ sb.append(TRUNCATE_STRING);
+ return;
+ }
// Return cached value for method path. When returning the truncated path, recalculate the
// full path without using the cached value.
if (!TextUtils.isEmpty(mFullMethodPathCache) && !truncatePath) {
@@ -296,7 +331,7 @@ public class Session {
// Check to see if the session has been renamed yet. If it has not, then the session
// has not been continued.
isSessionStarted = !mShortMethodName.equals(parentSession.mShortMethodName);
- parentSession.getFullMethodPath(sb, truncatePath);
+ parentSession.getFullMethodPath(sb, truncatePath, parentCount + 1);
sb.append(SUBSESSION_SEPARATION_CHAR);
}
// Encapsulate the external session's method name so it is obvious what part of the session
@@ -319,13 +354,10 @@ public class Session {
mFullMethodPathCache = sb.toString();
}
}
+
// Recursively move to the top of the tree to see if the parent session is external.
private boolean isSessionExternal() {
- if (getParentSession() == null) {
- return isExternal();
- } else {
- return getParentSession().isSessionExternal();
- }
+ return getRootSession("isSessionExternal").isExternal();
}
@Override
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index c4a9ee957ab0..43fb304e8fb6 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -3230,6 +3230,8 @@ public final class Telephony {
/**
* The {@code content://} style URL for locked messages in this table.
+ * <P>This {@link Uri} is used to check at most one locked message found in the union of MMS
+ * and SMS messages. Also this will return only _id column in response.</P>
*/
public static final Uri CONTENT_LOCKED_URI = Uri.parse(
"content://mms-sms/locked");
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 66cc6ebd019b..60de214cf878 100755
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1421,6 +1421,13 @@ public class CarrierConfigManager {
"show_4g_for_lte_data_icon_bool";
/**
+ * Boolean indicating if default data account should show 4G icon when in 3G.
+ * @hide
+ */
+ public static final String KEY_SHOW_4G_FOR_3G_DATA_ICON_BOOL =
+ "show_4g_for_3g_data_icon_bool";
+
+ /**
* Boolean indicating if lte+ icon should be shown if available
* @hide
*/
@@ -2675,6 +2682,22 @@ public class CarrierConfigManager {
"5g_icon_configuration_string";
/**
+ * Timeout in second for displaying 5G icon, default value is 0 which means the timer is
+ * disabled.
+ *
+ * System UI will show the 5G icon and start a timer with the timeout from this config when the
+ * device connects to a 5G cell. System UI stops displaying 5G icon when both the device
+ * disconnects from 5G cell and the timer is expired.
+ *
+ * If 5G is reacquired during this timer, the timer is canceled and restarted when 5G is next
+ * lost. Allows us to momentarily lose 5G without blinking the icon.
+ *
+ * @hide
+ */
+ public static final String KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT =
+ "5g_icon_display_grace_period_sec_int";
+
+ /**
* Support ASCII 7-BIT encoding for long SMS. This carrier config is used to enable
* this feature.
* @hide
@@ -3447,6 +3470,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_SPN_DISPLAY_RULE_USE_ROAMING_FROM_SERVICE_STATE_BOOL, false);
sDefaults.putBoolean(KEY_ALWAYS_SHOW_DATA_RAT_ICON_BOOL, false);
sDefaults.putBoolean(KEY_SHOW_4G_FOR_LTE_DATA_ICON_BOOL, false);
+ sDefaults.putBoolean(KEY_SHOW_4G_FOR_3G_DATA_ICON_BOOL, false);
sDefaults.putString(KEY_OPERATOR_NAME_FILTER_PATTERN_STRING, "");
sDefaults.putString(KEY_SHOW_CARRIER_DATA_ICON_PATTERN_STRING, "");
sDefaults.putBoolean(KEY_HIDE_LTE_PLUS_DATA_ICON_BOOL, true);
@@ -3486,6 +3510,7 @@ public class CarrierConfigManager {
sDefaults.putInt(KEY_CALL_WAITING_SERVICE_CLASS_INT, 1 /* SERVICE_CLASS_VOICE */);
sDefaults.putString(KEY_5G_ICON_CONFIGURATION_STRING,
"connected_mmwave:None,connected:5G,not_restricted:None,restricted:None");
+ sDefaults.putInt(KEY_5G_ICON_DISPLAY_GRACE_PERIOD_SEC_INT, 0);
sDefaults.putBoolean(KEY_ASCII_7_BIT_SUPPORT_FOR_LONG_MESSAGE_BOOL, false);
/* Default value is minimum RSRP level needed for SIGNAL_STRENGTH_GOOD */
sDefaults.putInt(KEY_OPPORTUNISTIC_NETWORK_ENTRY_THRESHOLD_RSRP_INT, -108);
diff --git a/telephony/java/android/telephony/ims/ImsException.java b/telephony/java/android/telephony/ims/ImsException.java
index 8e1324b3be0b..6187e67a6acb 100644
--- a/telephony/java/android/telephony/ims/ImsException.java
+++ b/telephony/java/android/telephony/ims/ImsException.java
@@ -39,11 +39,11 @@ public final class ImsException extends Exception {
*/
public static final int CODE_ERROR_UNSPECIFIED = 0;
/**
- * The operation has failed because there is no {@link ImsService} available to service it. This
- * may be due to an {@link ImsService} crash or other illegal state.
+ * The operation has failed because there is no remote process available to service it. This
+ * may be due to a process crash or other illegal state.
* <p>
* This is a temporary error and the operation may be retried until the connection to the
- * {@link ImsService} is restored.
+ * remote process is restored.
*/
public static final int CODE_ERROR_SERVICE_UNAVAILABLE = 1;
diff --git a/telephony/java/android/telephony/ims/aidl/IImsRcsFeature.aidl b/telephony/java/android/telephony/ims/aidl/IImsRcsFeature.aidl
index 691cfba9a28c..4b98b79f1095 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsRcsFeature.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsRcsFeature.aidl
@@ -16,10 +16,38 @@
package android.telephony.ims.aidl;
+import android.net.Uri;
+import android.telephony.ims.RcsContactUceCapability;
+import android.telephony.ims.aidl.IImsCapabilityCallback;
+import android.telephony.ims.aidl.IRcsFeatureListener;
+import android.telephony.ims.feature.CapabilityChangeRequest;
+
+import java.util.List;
+
/**
* See RcsFeature for more information.
* {@hide}
*/
interface IImsRcsFeature {
- //Empty Default Implementation
+ // Not oneway because we need to verify this completes before doing anything else.
+ void setListener(IRcsFeatureListener listener);
+ int queryCapabilityStatus();
+ // Inherited from ImsFeature
+ int getFeatureState();
+ oneway void addCapabilityCallback(IImsCapabilityCallback c);
+ oneway void removeCapabilityCallback(IImsCapabilityCallback c);
+ oneway void changeCapabilitiesConfiguration(in CapabilityChangeRequest r,
+ IImsCapabilityCallback c);
+ oneway void queryCapabilityConfiguration(int capability, int radioTech,
+ IImsCapabilityCallback c);
+ // RcsPresenceExchangeImplBase specific api
+ oneway void requestCapabilities(in List<Uri> uris, int operationToken);
+ oneway void updateCapabilities(in RcsContactUceCapability capabilities, int operationToken);
+ // RcsSipOptionsImplBase specific api
+ oneway void sendCapabilityRequest(in Uri contactUri,
+ in RcsContactUceCapability capabilities, int operationToken);
+ oneway void respondToCapabilityRequest(in String contactUri,
+ in RcsContactUceCapability ownCapabilities, int operationToken);
+ oneway void respondToCapabilityRequestWithError(in Uri contactUri, int code, in String reason,
+ int operationToken);
} \ No newline at end of file
diff --git a/telephony/java/android/telephony/ims/aidl/IRcsFeatureListener.aidl b/telephony/java/android/telephony/ims/aidl/IRcsFeatureListener.aidl
new file mode 100644
index 000000000000..881b4776b25b
--- /dev/null
+++ b/telephony/java/android/telephony/ims/aidl/IRcsFeatureListener.aidl
@@ -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.telephony.ims.aidl;
+
+import android.net.Uri;
+import android.telephony.ims.RcsContactUceCapability;
+
+import java.util.List;
+
+/**
+ * Listener interface for updates from the RcsFeature back to the framework.
+ * {@hide}
+ */
+interface IRcsFeatureListener {
+ //RcsCapabilityExchange specific
+ oneway void onCommandUpdate(int commandCode, int operationToken);
+ // RcsPresenceExchangeImplBase Specific
+ oneway void onNetworkResponse(int code, in String reason, int operationToken);
+ oneway void onCapabilityRequestResponsePresence(in List<RcsContactUceCapability> infos,
+ int operationToken);
+ oneway void onNotifyUpdateCapabilities();
+ oneway void onUnpublish();
+ // RcsSipOptionsImplBase specific
+ oneway void onCapabilityRequestResponseOptions(int code, in String reason,
+ in RcsContactUceCapability info, int operationToken);
+ oneway void onRemoteCapabilityRequest(in Uri contactUri, in RcsContactUceCapability remoteInfo,
+ int operationToken);
+} \ 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 8f8989909f9f..3a9979d78a55 100644
--- a/telephony/java/android/telephony/ims/feature/ImsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/ImsFeature.java
@@ -33,12 +33,8 @@ import com.android.internal.annotations.VisibleForTesting;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
-import java.util.Set;
-import java.util.WeakHashMap;
/**
* Base class for all IMS features that are supported by the framework. Use a concrete subclass
@@ -52,35 +48,6 @@ public abstract class ImsFeature {
private static final String LOG_TAG = "ImsFeature";
/**
- * Action to broadcast when ImsService is up.
- * Internal use only.
- * Only defined here separately for compatibility purposes with the old ImsService.
- *
- * @hide
- */
- public static final String ACTION_IMS_SERVICE_UP =
- "com.android.ims.IMS_SERVICE_UP";
-
- /**
- * Action to broadcast when ImsService is down.
- * Internal use only.
- * Only defined here separately for compatibility purposes with the old ImsService.
- *
- * @hide
- */
- public static final String ACTION_IMS_SERVICE_DOWN =
- "com.android.ims.IMS_SERVICE_DOWN";
-
- /**
- * Part of the ACTION_IMS_SERVICE_UP or _DOWN intents.
- * A long value; the phone ID corresponding to the IMS service coming up or down.
- * Only defined here separately for compatibility purposes with the old ImsService.
- *
- * @hide
- */
- public static final String EXTRA_PHONE_ID = "android:phone_id";
-
- /**
* Invalid feature value
* @hide
*/
@@ -335,8 +302,8 @@ public abstract class ImsFeature {
/** @hide */
protected final Object mLock = new Object();
- private final Set<IImsFeatureStatusCallback> mStatusCallbacks =
- Collections.newSetFromMap(new WeakHashMap<>());
+ private final RemoteCallbackList<IImsFeatureStatusCallback> mStatusCallbacks =
+ new RemoteCallbackList<>();
private @ImsState int mState = STATE_UNAVAILABLE;
private int mSlotId = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
private final RemoteCallbackList<IImsCapabilityCallback> mCapabilityCallbacks =
@@ -397,9 +364,7 @@ public abstract class ImsFeature {
// If we have just connected, send queued status.
c.notifyImsFeatureStatus(getFeatureState());
// Add the callback if the callback completes successfully without a RemoteException.
- synchronized (mLock) {
- mStatusCallbacks.add(c);
- }
+ mStatusCallbacks.register(c);
} catch (RemoteException e) {
Log.w(LOG_TAG, "Couldn't notify feature state: " + e.getMessage());
}
@@ -411,29 +376,21 @@ public abstract class ImsFeature {
*/
@VisibleForTesting
public void removeImsFeatureStatusCallback(@NonNull IImsFeatureStatusCallback c) {
- synchronized (mLock) {
- mStatusCallbacks.remove(c);
- }
+ mStatusCallbacks.unregister(c);
}
/**
* Internal method called by ImsFeature when setFeatureState has changed.
*/
private void notifyFeatureState(@ImsState int state) {
- synchronized (mLock) {
- for (Iterator<IImsFeatureStatusCallback> iter = mStatusCallbacks.iterator();
- iter.hasNext(); ) {
- IImsFeatureStatusCallback callback = iter.next();
- try {
- Log.i(LOG_TAG, "notifying ImsFeatureState=" + state);
- callback.notifyImsFeatureStatus(state);
- } catch (RemoteException e) {
- // remove if the callback is no longer alive.
- iter.remove();
- Log.w(LOG_TAG, "Couldn't notify feature state: " + e.getMessage());
- }
+ mStatusCallbacks.broadcast((c) -> {
+ try {
+ c.notifyImsFeatureStatus(state);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, e + " notifyFeatureState() - Skipping "
+ + "callback.");
}
- }
+ });
}
/**
@@ -452,10 +409,23 @@ public abstract class ImsFeature {
/**
* @hide
*/
- public final void removeCapabilityCallback(IImsCapabilityCallback c) {
+ final void removeCapabilityCallback(IImsCapabilityCallback c) {
mCapabilityCallbacks.unregister(c);
}
+ /**@hide*/
+ final void queryCapabilityConfigurationInternal(int capability, int radioTech,
+ IImsCapabilityCallback c) {
+ boolean enabled = queryCapabilityConfiguration(capability, radioTech);
+ try {
+ if (c != null) {
+ c.onQueryCapabilityConfiguration(capability, radioTech, enabled);
+ }
+ } catch (RemoteException e) {
+ Log.e(LOG_TAG, "queryCapabilityConfigurationInternal called on dead binder!");
+ }
+ }
+
/**
* @return the cached capabilities status for this feature.
* @hide
@@ -484,31 +454,36 @@ public abstract class ImsFeature {
/**
* Called by the ImsFeature when the capabilities status has changed.
*
- * @param c A {@link Capabilities} containing the new Capabilities status.
+ * @param caps the new {@link Capabilities} status of the {@link ImsFeature}.
*
* @hide
*/
- protected final void notifyCapabilitiesStatusChanged(Capabilities c) {
+ protected final void notifyCapabilitiesStatusChanged(Capabilities caps) {
synchronized (mLock) {
- mCapabilityStatus = c.copy();
+ mCapabilityStatus = caps.copy();
}
- int count = mCapabilityCallbacks.beginBroadcast();
- try {
- for (int i = 0; i < count; i++) {
- try {
- mCapabilityCallbacks.getBroadcastItem(i).onCapabilitiesStatusChanged(
- c.mCapabilities);
- } catch (RemoteException e) {
- Log.w(LOG_TAG, e + " " + "notifyCapabilitiesStatusChanged() - Skipping " +
- "callback.");
- }
+ mCapabilityCallbacks.broadcast((callback) -> {
+ try {
+ callback.onCapabilitiesStatusChanged(caps.mCapabilities);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, e + " notifyCapabilitiesStatusChanged() - Skipping "
+ + "callback.");
}
- } finally {
- mCapabilityCallbacks.finishBroadcast();
- }
+ });
}
/**
+ * Provides the ImsFeature with the ability to return the framework Capability Configuration
+ * for a provided Capability. If the framework calls {@link #changeEnabledCapabilities} and
+ * includes a capability A to enable or disable, this method should return the correct enabled
+ * status for capability A.
+ * @param capability The capability that we are querying the configuration for.
+ * @return true if the capability is enabled, false otherwise.
+ * @hide
+ */
+ public abstract boolean queryCapabilityConfiguration(int capability, int radioTech);
+
+ /**
* Features should override this method to receive Capability preference change requests from
* the framework using the provided {@link CapabilityChangeRequest}. If any of the capabilities
* in the {@link CapabilityChangeRequest} are not able to be completed due to an error,
diff --git a/telephony/java/android/telephony/ims/feature/MmTelFeature.java b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
index 898ca48cd1df..056a0abe7a29 100644
--- a/telephony/java/android/telephony/ims/feature/MmTelFeature.java
+++ b/telephony/java/android/telephony/ims/feature/MmTelFeature.java
@@ -37,7 +37,6 @@ 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 com.android.ims.internal.IImsCallSession;
import com.android.ims.internal.IImsEcbm;
@@ -154,17 +153,13 @@ public class MmTelFeature extends ImsFeature {
@Override
public void changeCapabilitiesConfiguration(CapabilityChangeRequest request,
IImsCapabilityCallback c) {
- synchronized (mLock) {
- MmTelFeature.this.requestChangeEnabledCapabilities(request, c);
- }
+ MmTelFeature.this.requestChangeEnabledCapabilities(request, c);
}
@Override
public void queryCapabilityConfiguration(int capability, int radioTech,
IImsCapabilityCallback c) {
- synchronized (mLock) {
- queryCapabilityConfigurationInternal(capability, radioTech, c);
- }
+ queryCapabilityConfigurationInternal(capability, radioTech, c);
}
@Override
@@ -381,18 +376,6 @@ public class MmTelFeature extends ImsFeature {
}
}
- private void queryCapabilityConfigurationInternal(int capability, int radioTech,
- IImsCapabilityCallback c) {
- boolean enabled = queryCapabilityConfiguration(capability, radioTech);
- try {
- if (c != null) {
- c.onQueryCapabilityConfiguration(capability, radioTech, enabled);
- }
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "queryCapabilityConfigurationInternal called on dead binder!");
- }
- }
-
/**
* The current capability status that this MmTelFeature has defined is available. This
* configuration will be used by the platform to figure out which capabilities are CURRENTLY
@@ -512,6 +495,7 @@ public class MmTelFeature extends ImsFeature {
* @param capability The capability that we are querying the configuration for.
* @return true if the capability is enabled, false otherwise.
*/
+ @Override
public boolean queryCapabilityConfiguration(@MmTelCapabilities.MmTelCapability int capability,
@ImsRegistrationImplBase.ImsRegistrationTech int radioTech) {
// Base implementation - Override to provide functionality
diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java
index 5fae3eebbfc6..f69b434eb120 100644
--- a/telephony/java/android/telephony/ims/feature/RcsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java
@@ -16,14 +16,32 @@
package android.telephony.ims.feature;
+import android.annotation.CallbackExecutor;
import android.annotation.IntDef;
+import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.net.Uri;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.telephony.ims.RcsContactUceCapability;
+import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsRcsFeature;
+import android.telephony.ims.aidl.IRcsFeatureListener;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.telephony.ims.stub.RcsPresenceExchangeImplBase;
import android.telephony.ims.stub.RcsSipOptionsImplBase;
+import android.util.Log;
+
+import com.android.internal.util.FunctionalUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.List;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
/**
* Base implementation of the RcsFeature APIs. Any ImsService wishing to support RCS should extend
@@ -33,10 +51,132 @@ import java.lang.annotation.RetentionPolicy;
@SystemApi
public class RcsFeature extends ImsFeature {
- /**{@inheritDoc}*/
- private final IImsRcsFeature mImsRcsBinder = new IImsRcsFeature.Stub() {
- // Empty Default Implementation.
- };
+ private static final String LOG_TAG = "RcsFeature";
+
+ private static final class RcsFeatureBinder extends IImsRcsFeature.Stub {
+ // Reference the outer class in order to have better test coverage metrics instead of
+ // creating a inner class referencing the outer class directly.
+ private final RcsFeature mReference;
+ private final Executor mExecutor;
+
+ RcsFeatureBinder(RcsFeature classRef, @CallbackExecutor Executor executor) {
+ mReference = classRef;
+ mExecutor = executor;
+ }
+
+ @Override
+ public void setListener(IRcsFeatureListener listener) {
+ mReference.setListener(listener);
+ }
+
+ @Override
+ public int queryCapabilityStatus() throws RemoteException {
+ return executeMethodAsyncForResult(
+ () -> mReference.queryCapabilityStatus().mCapabilities,
+ "queryCapabilityStatus");
+ }
+
+ @Override
+ public void addCapabilityCallback(IImsCapabilityCallback c) throws RemoteException {
+ executeMethodAsync(() -> mReference.addCapabilityCallback(c), "addCapabilityCallback");
+ }
+
+ @Override
+ public void removeCapabilityCallback(IImsCapabilityCallback c) throws RemoteException {
+ executeMethodAsync(() -> mReference.removeCapabilityCallback(c),
+ "removeCapabilityCallback");
+ }
+
+ @Override
+ public void changeCapabilitiesConfiguration(CapabilityChangeRequest r,
+ IImsCapabilityCallback c) throws RemoteException {
+ executeMethodAsync(() -> mReference.requestChangeEnabledCapabilities(r, c),
+ "changeCapabilitiesConfiguration");
+ }
+
+ @Override
+ public void queryCapabilityConfiguration(int capability, int radioTech,
+ IImsCapabilityCallback c) throws RemoteException {
+ executeMethodAsync(() -> mReference.queryCapabilityConfigurationInternal(capability,
+ radioTech, c), "queryCapabilityConfiguration");
+ }
+
+ @Override
+ public int getFeatureState() throws RemoteException {
+ return executeMethodAsyncForResult(mReference::getFeatureState, "getFeatureState");
+ }
+
+ // RcsPresenceExchangeImplBase specific APIS
+ @Override
+ public void requestCapabilities(List<Uri> uris, int operationToken) throws RemoteException {
+ executeMethodAsync(() -> mReference.getPresenceExchangeInternal()
+ .requestCapabilities(uris, operationToken), "requestCapabilities");
+ }
+ @Override
+ public void updateCapabilities(RcsContactUceCapability capabilities, int operationToken)
+ throws RemoteException {
+ executeMethodAsync(() -> mReference.getPresenceExchangeInternal()
+ .updateCapabilities(capabilities, operationToken),
+ "updateCapabilities");
+
+ }
+ // RcsSipOptionsImplBase specific APIS
+ @Override
+ public void sendCapabilityRequest(Uri contactUri, RcsContactUceCapability capabilities,
+ int operationToken) throws RemoteException {
+ executeMethodAsync(() -> mReference.getOptionsExchangeInternal()
+ .sendCapabilityRequest(contactUri, capabilities, operationToken),
+ "sendCapabilityRequest");
+
+ }
+ @Override
+ public void respondToCapabilityRequest(String contactUri,
+ RcsContactUceCapability ownCapabilities, int operationToken)
+ throws RemoteException {
+ executeMethodAsync(() -> mReference.getOptionsExchangeInternal()
+ .respondToCapabilityRequest(contactUri, ownCapabilities,
+ operationToken), "respondToCapabilityRequest");
+
+ }
+ @Override
+ public void respondToCapabilityRequestWithError(Uri contactUri, int code, String reason,
+ int operationToken) throws RemoteException {
+ executeMethodAsync(() -> mReference.getOptionsExchangeInternal()
+ .respondToCapabilityRequestWithError(contactUri, code, reason,
+ operationToken), "respondToCapabilityRequestWithError");
+ }
+
+ // Call the methods with a clean calling identity on the executor and wait indefinitely for
+ // the future to return.
+ private void executeMethodAsync(FunctionalUtils.ThrowingRunnable r, String errorLogName)
+ throws RemoteException {
+ // call with a clean calling identity on the executor and wait indefinitely for the
+ // future to return.
+ try {
+ CompletableFuture.runAsync(
+ () -> Binder.withCleanCallingIdentity(r), mExecutor).join();
+ } catch (CancellationException | CompletionException e) {
+ Log.w(LOG_TAG, "RcsFeatureBinder - " + errorLogName + " exception: "
+ + e.getMessage());
+ throw new RemoteException(e.getMessage());
+ }
+ }
+
+ private <T> T executeMethodAsyncForResult(FunctionalUtils.ThrowingSupplier<T> r,
+ String errorLogName) throws RemoteException {
+ // call with a clean calling identity on the executor and wait indefinitely for the
+ // future to return.
+ CompletableFuture<T> future = CompletableFuture.supplyAsync(
+ () -> Binder.withCleanCallingIdentity(r), mExecutor);
+ try {
+ return future.get();
+ } catch (ExecutionException | InterruptedException e) {
+ Log.w(LOG_TAG, "RcsFeatureBinder - " + errorLogName + " exception: "
+ + e.getMessage());
+ throw new RemoteException(e.getMessage());
+ }
+ }
+ }
/**
* Contains the capabilities defined and supported by a {@link RcsFeature} in the
@@ -81,27 +221,66 @@ public class RcsFeature extends ImsFeature {
/**@hide*/
public RcsImsCapabilities(@RcsImsCapabilityFlag int capabilities) {
+ super(capabilities);
+ }
+ /**@hide*/
+ private RcsImsCapabilities(Capabilities c) {
+ super(c.getMask());
}
/**@hide*/
@Override
public void addCapabilities(@RcsImsCapabilityFlag int capabilities) {
-
+ super.addCapabilities(capabilities);
}
/**@hide*/
@Override
public void removeCapabilities(@RcsImsCapabilityFlag int capabilities) {
-
+ super.removeCapabilities(capabilities);
}
/**@hide*/
@Override
public boolean isCapable(@RcsImsCapabilityFlag int capabilities) {
- return false;
+ return super.isCapable(capabilities);
+ }
+ }
+
+ private final RcsFeatureBinder mImsRcsBinder;
+ private IRcsFeatureListener mListenerBinder;
+ private RcsPresenceExchangeImplBase mPresExchange;
+ private RcsSipOptionsImplBase mSipOptions;
+
+ /**
+ * Create a new RcsFeature.
+ * <p>
+ * Method stubs called from the framework will be called asynchronously. To specify the
+ * {@link Executor} that the methods stubs will be called, use
+ * {@link RcsFeature#RcsFeature(Executor)} instead.
+ */
+ public RcsFeature() {
+ super();
+ // Run on the Binder threads that call them.
+ mImsRcsBinder = new RcsFeatureBinder(this, Runnable::run);
+ }
+
+ /**
+ * Create a new RcsFeature using the Executor specified for methods being called by the
+ * framework.
+ * @param executor The executor for the framework to use when making calls to this service.
+ * @hide
+ */
+ public RcsFeature(@NonNull Executor executor) {
+ super();
+ if (executor == null) {
+ throw new IllegalArgumentException("executor can not be null.");
}
+ // Run on the Binder thread by default.
+ mImsRcsBinder = new RcsFeatureBinder(this, executor);
}
+
/**
* Query the current {@link RcsImsCapabilities} status set by the RcsFeature. If a capability is
* set, the {@link RcsFeature} has brought up the capability and is ready for framework
@@ -111,7 +290,7 @@ public class RcsFeature extends ImsFeature {
*/
@Override
public final RcsImsCapabilities queryCapabilityStatus() {
- throw new UnsupportedOperationException();
+ return new RcsImsCapabilities(super.queryCapabilityStatus());
}
/**
@@ -120,8 +299,11 @@ public class RcsFeature extends ImsFeature {
* Call {@link #queryCapabilityStatus()} to return the current capability status.
* @hide
*/
- public final void notifyCapabilitiesStatusChanged(RcsImsCapabilities c) {
- throw new UnsupportedOperationException();
+ public final void notifyCapabilitiesStatusChanged(@NonNull RcsImsCapabilities c) {
+ if (c == null) {
+ throw new IllegalArgumentException("RcsImsCapabilities must be non-null!");
+ }
+ super.notifyCapabilitiesStatusChanged(c);
}
/**
@@ -133,8 +315,10 @@ public class RcsFeature extends ImsFeature {
* @hide
*/
public boolean queryCapabilityConfiguration(
- @RcsImsCapabilities.RcsImsCapabilityFlag int capability) {
- throw new UnsupportedOperationException();
+ @RcsImsCapabilities.RcsImsCapabilityFlag int capability,
+ @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) {
+ // Base Implementation - Override to provide functionality
+ return false;
}
/**
* Called from the framework when the {@link RcsImsCapabilities} that have been configured for
@@ -155,7 +339,7 @@ public class RcsFeature extends ImsFeature {
@Override
public void changeEnabledCapabilities(CapabilityChangeRequest request,
CapabilityCallbackProxy c) {
- throw new UnsupportedOperationException();
+ // Base Implementation - Override to provide functionality
}
/**
@@ -192,13 +376,6 @@ public class RcsFeature extends ImsFeature {
return new RcsPresenceExchangeImplBase();
}
- /**
- * Construct a new {@link RcsFeature} instance.
- */
- public RcsFeature() {
- super();
- }
-
/**{@inheritDoc}*/
@Override
public void onFeatureRemoved() {
@@ -218,4 +395,40 @@ public class RcsFeature extends ImsFeature {
public final IImsRcsFeature getBinder() {
return mImsRcsBinder;
}
+
+ /**@hide*/
+ public IRcsFeatureListener getListener() {
+ synchronized (mLock) {
+ return mListenerBinder;
+ }
+ }
+
+ private void setListener(IRcsFeatureListener listener) {
+ synchronized (mLock) {
+ mListenerBinder = listener;
+ if (mListenerBinder != null) {
+ onFeatureReady();
+ }
+ }
+ }
+
+ private RcsPresenceExchangeImplBase getPresenceExchangeInternal() {
+ synchronized (mLock) {
+ if (mPresExchange == null) {
+ mPresExchange = getPresenceExchangeImpl();
+ mPresExchange.initialize(this);
+ }
+ return mPresExchange;
+ }
+ }
+
+ private RcsSipOptionsImplBase getOptionsExchangeInternal() {
+ synchronized (mLock) {
+ if (mSipOptions == null) {
+ mSipOptions = getOptionsExchangeImpl();
+ mSipOptions.initialize(this);
+ }
+ return mSipOptions;
+ }
+ }
}
diff --git a/telephony/java/android/telephony/ims/stub/RcsCapabilityExchange.java b/telephony/java/android/telephony/ims/stub/RcsCapabilityExchange.java
index 289fd4c8a134..fda295a27111 100644
--- a/telephony/java/android/telephony/ims/stub/RcsCapabilityExchange.java
+++ b/telephony/java/android/telephony/ims/stub/RcsCapabilityExchange.java
@@ -17,6 +17,11 @@
package android.telephony.ims.stub;
import android.annotation.IntDef;
+import android.os.RemoteException;
+import android.telephony.ims.ImsException;
+import android.telephony.ims.aidl.IRcsFeatureListener;
+import android.telephony.ims.feature.ImsFeature;
+import android.telephony.ims.feature.RcsFeature;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -72,6 +77,24 @@ public class RcsCapabilityExchange {
})
public @interface CommandCode {}
+
+ private RcsFeature mFeature;
+
+ /** @hide */
+ public final void initialize(RcsFeature feature) {
+ mFeature = feature;
+ }
+
+ /** @hide */
+ protected final IRcsFeatureListener getListener() throws ImsException {
+ IRcsFeatureListener listener = mFeature.getListener();
+ if (listener == null) {
+ throw new ImsException("Connection to Framework has not been established, wait for "
+ + "onFeatureReady().", ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
+ return mFeature.getListener();
+ }
+
/**
* Provides the framework with an update as to whether or not a command completed successfully
* locally. This includes capabilities requests and updates from the network. If it does not
@@ -82,8 +105,18 @@ public class RcsCapabilityExchange {
* @param code The result of the pending command. If {@link #COMMAND_CODE_SUCCESS}, further
* updates will be sent for this command using the associated operationToken.
* @param operationToken the token associated with the pending command.
+ * @throws ImsException If this {@link RcsCapabilityExchange} instance is not currently
+ * connected to the framework. This can happen if the {@link RcsFeature} is not
+ * {@link ImsFeature#STATE_READY} and the {@link RcsFeature} has not received the
+ * {@link ImsFeature#onFeatureReady()} callback. This may also happen in rare cases when the
+ * Telephony stack has crashed.
*/
- public final void onCommandUpdate(@CommandCode int code, int operationToken) {
- throw new UnsupportedOperationException();
+ public final void onCommandUpdate(@CommandCode int code, int operationToken)
+ throws ImsException {
+ try {
+ getListener().onCommandUpdate(code, operationToken);
+ } catch (RemoteException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
}
}
diff --git a/telephony/java/android/telephony/ims/stub/RcsPresenceExchangeImplBase.java b/telephony/java/android/telephony/ims/stub/RcsPresenceExchangeImplBase.java
index 44024703042d..055fca57a628 100644
--- a/telephony/java/android/telephony/ims/stub/RcsPresenceExchangeImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/RcsPresenceExchangeImplBase.java
@@ -19,7 +19,11 @@ package android.telephony.ims.stub;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.net.Uri;
+import android.os.RemoteException;
+import android.telephony.ims.ImsException;
import android.telephony.ims.RcsContactUceCapability;
+import android.telephony.ims.feature.ImsFeature;
+import android.telephony.ims.feature.RcsFeature;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -113,54 +117,95 @@ public class RcsPresenceExchangeImplBase extends RcsCapabilityExchange {
* Provide the framework with a subsequent network response update to
* {@link #updateCapabilities(RcsContactUceCapability, int)} and
* {@link #requestCapabilities(List, int)} operations.
+ *
* @param code The SIP response code sent from the network for the operation token specified.
* @param reason The optional reason response from the network. If the network provided no
* reason with the code, the string should be empty.
* @param operationToken The token associated with the operation this service is providing a
* response for.
+ * @throws ImsException If this {@link RcsPresenceExchangeImplBase} instance is not currently
+ * connected to the framework. This can happen if the {@link RcsFeature} is not
+ * {@link ImsFeature#STATE_READY} and the {@link RcsFeature} has not received the
+ * {@link ImsFeature#onFeatureReady()} callback. This may also happen in rare cases when the
+ * Telephony stack has crashed.
*/
public final void onNetworkResponse(@PresenceResponseCode int code, @NonNull String reason,
- int operationToken) {
- throw new UnsupportedOperationException();
+ int operationToken) throws ImsException {
+ try {
+ getListener().onNetworkResponse(code, reason, operationToken);
+ } catch (RemoteException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
}
/**
* Provides the framework with the requested contacts’ capabilities requested by the framework
- * using {@link #requestCapabilities(List, int)} .
+ * using {@link #requestCapabilities(List, int)}.
+ *
+ * @throws ImsException If this {@link RcsPresenceExchangeImplBase} instance is not currently
+ * connected to the framework. This can happen if the {@link RcsFeature} is not
+ * {@link ImsFeature#STATE_READY} and the {@link RcsFeature} has not received the
+ * {@link ImsFeature#onFeatureReady()} callback. This may also happen in rare cases when the
+ * Telephony stack has crashed.
*/
public final void onCapabilityRequestResponse(@NonNull List<RcsContactUceCapability> infos,
- int operationToken) {
- throw new UnsupportedOperationException();
+ int operationToken) throws ImsException {
+ try {
+ getListener().onCapabilityRequestResponsePresence(infos, operationToken);
+ } catch (RemoteException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
}
/**
* Trigger the framework to provide a capability update using
- * {@link #updateCapabilities(RcsContactUceCapability, int)}. This is typically used when trying
- * to generate an initial PUBLISH for a new subscription to the network.
+ * {@link #updateCapabilities(RcsContactUceCapability, int)}.
* <p>
- * The device will cache all presence publications after boot until this method is called once.
- */
- public final void onNotifyUpdateCapabilites() {
- throw new UnsupportedOperationException();
+ * This is typically used when trying to generate an initial PUBLISH for a new subscription to
+ * the network. The device will cache all presence publications after boot until this method is
+ * called once.
+ * @throws ImsException If this {@link RcsPresenceExchangeImplBase} instance is not currently
+ * connected to the framework. This can happen if the {@link RcsFeature} is not
+ * {@link ImsFeature#STATE_READY} and the {@link RcsFeature} has not received the
+ * {@link ImsFeature#onFeatureReady()} callback. This may also happen in rare cases when the
+ * Telephony stack has crashed.
+ */
+ public final void onNotifyUpdateCapabilites() throws ImsException {
+ try {
+ getListener().onNotifyUpdateCapabilities();
+ } catch (RemoteException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
}
/**
* Notify the framework that the device’s capabilities have been unpublished from the network.
- */
- public final void onUnpublish() {
- throw new UnsupportedOperationException();
+ *
+ * @throws ImsException If this {@link RcsPresenceExchangeImplBase} instance is not currently
+ * connected to the framework. This can happen if the {@link RcsFeature} is not
+ * {@link ImsFeature#STATE_READY} and the {@link RcsFeature} has not received the
+ * {@link ImsFeature#onFeatureReady()} callback. This may also happen in rare cases when the
+ * Telephony stack has crashed.
+ */
+ public final void onUnpublish() throws ImsException {
+ try {
+ getListener().onUnpublish();
+ } catch (RemoteException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
}
/**
- * The user capabilities of one or multiple contacts have been requested.
+ * The user capabilities of one or multiple contacts have been requested by the framework.
* <p>
- * This must be followed up with one call to {@link #onCommandUpdate(int, int)} with an update
- * as to whether or not the command completed as well as subsequent network
- * updates using {@link #onNetworkResponse(int, String, int)}. When the operation is completed,
- * {@link #onCapabilityRequestResponse(List, int)} should be called with
- * the presence information for the contacts specified.
- * @param uris A {@link List} of the URIs that the framework is requesting the UCE capabilities
- * for.
+ * The implementer must follow up this call with an {@link #onCommandUpdate(int, int)} call to
+ * indicate whether or not this operation succeeded. If this operation succeeds, network
+ * response updates should be sent to the framework using
+ * {@link #onNetworkResponse(int, String, int)}. When the operation is completed,
+ * {@link #onCapabilityRequestResponse(List, int)} should be called with the presence
+ * information for the contacts specified.
+ * @param uris A {@link List} of the {@link Uri}s that the framework is requesting the UCE
+ * capabilities for.
* @param operationToken The token associated with this operation. Updates to this request using
* {@link #onCommandUpdate(int, int)}, {@link #onNetworkResponse(int, String, int)}, and
* {@link #onCapabilityRequestResponse(List, int)} must use the same operation token
@@ -169,14 +214,20 @@ public class RcsPresenceExchangeImplBase extends RcsCapabilityExchange {
public void requestCapabilities(@NonNull List<Uri> uris, int operationToken) {
// Stub - to be implemented by service
Log.w(LOG_TAG, "requestCapabilities called with no implementation.");
- onCommandUpdate(COMMAND_CODE_GENERIC_FAILURE, operationToken);
+ try {
+ getListener().onCommandUpdate(COMMAND_CODE_NOT_SUPPORTED, operationToken);
+ } catch (RemoteException | ImsException e) {
+ // Do not do anything, this is a stub implementation.
+ }
}
/**
- * The capabilities of this device have been updated and should be published
- * to the network. The framework will expect one {@link #onCommandUpdate(int, int)} call to
- * indicate whether or not this operation failed first as well as network response
- * updates to this update using {@link #onNetworkResponse(int, String, int)}.
+ * The capabilities of this device have been updated and should be published to the network.
+ * <p>
+ * The implementer must follow up this call with an {@link #onCommandUpdate(int, int)} call to
+ * indicate whether or not this operation succeeded. If this operation succeeds, network
+ * response updates should be sent to the framework using
+ * {@link #onNetworkResponse(int, String, int)}.
* @param capabilities The capabilities for this device.
* @param operationToken The token associated with this operation. Any subsequent
* {@link #onCommandUpdate(int, int)} or {@link #onNetworkResponse(int, String, int)}
@@ -186,6 +237,10 @@ public class RcsPresenceExchangeImplBase extends RcsCapabilityExchange {
int operationToken) {
// Stub - to be implemented by service
Log.w(LOG_TAG, "updateCapabilities called with no implementation.");
- onCommandUpdate(COMMAND_CODE_GENERIC_FAILURE, operationToken);
+ try {
+ getListener().onCommandUpdate(COMMAND_CODE_NOT_SUPPORTED, operationToken);
+ } catch (RemoteException | ImsException e) {
+ // Do not do anything, this is a stub implementation.
+ }
}
}
diff --git a/telephony/java/android/telephony/ims/stub/RcsSipOptionsImplBase.java b/telephony/java/android/telephony/ims/stub/RcsSipOptionsImplBase.java
index 3343074ea52c..1c68fc08529e 100644
--- a/telephony/java/android/telephony/ims/stub/RcsSipOptionsImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/RcsSipOptionsImplBase.java
@@ -20,7 +20,11 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.Uri;
+import android.os.RemoteException;
+import android.telephony.ims.ImsException;
import android.telephony.ims.RcsContactUceCapability;
+import android.telephony.ims.feature.ImsFeature;
+import android.telephony.ims.feature.RcsFeature;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -87,10 +91,19 @@ public class RcsSipOptionsImplBase extends RcsCapabilityExchange {
* @param info the contact's UCE capabilities associated with the capability request.
* @param operationToken The token associated with the original capability request, set by
* {@link #sendCapabilityRequest(Uri, RcsContactUceCapability, int)}.
+ * @throws ImsException If this {@link RcsSipOptionsImplBase} instance is not currently
+ * connected to the framework. This can happen if the {@link RcsFeature} is not
+ * {@link ImsFeature#STATE_READY} and the {@link RcsFeature} has not received the
+ * {@link ImsFeature#onFeatureReady()} callback. This may also happen in rare cases when the
+ * Telephony stack has crashed.
*/
public final void onCapabilityRequestResponse(@SipResponseCode int code, @NonNull String reason,
- @Nullable RcsContactUceCapability info, int operationToken) {
- throw new UnsupportedOperationException();
+ @Nullable RcsContactUceCapability info, int operationToken) throws ImsException {
+ try {
+ getListener().onCapabilityRequestResponseOptions(code, reason, info, operationToken);
+ } catch (RemoteException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
}
/**
@@ -104,10 +117,19 @@ public class RcsSipOptionsImplBase extends RcsCapabilityExchange {
* @param operationToken An unique operation token that you have generated that will be returned
* by the framework in
* {@link #respondToCapabilityRequest(String, RcsContactUceCapability, int)}.
+ * @throws ImsException If this {@link RcsSipOptionsImplBase} instance is not currently
+ * connected to the framework. This can happen if the {@link RcsFeature} is not
+ * {@link ImsFeature#STATE_READY} and the {@link RcsFeature} has not received the
+ * {@link ImsFeature#onFeatureReady()} callback. This may also happen in rare cases when the
+ * Telephony stack has crashed.
*/
public final void onRemoteCapabilityRequest(@NonNull Uri contactUri,
- @NonNull RcsContactUceCapability remoteInfo, int operationToken) {
- throw new UnsupportedOperationException();
+ @NonNull RcsContactUceCapability remoteInfo, int operationToken) throws ImsException {
+ try {
+ getListener().onRemoteCapabilityRequest(contactUri, remoteInfo, operationToken);
+ } catch (RemoteException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
}
/**
@@ -127,7 +149,11 @@ public class RcsSipOptionsImplBase extends RcsCapabilityExchange {
@NonNull RcsContactUceCapability capabilities, int operationToken) {
// Stub - to be implemented by service
Log.w(LOG_TAG, "sendCapabilityRequest called with no implementation.");
- onCommandUpdate(COMMAND_CODE_GENERIC_FAILURE, operationToken);
+ try {
+ getListener().onCommandUpdate(COMMAND_CODE_NOT_SUPPORTED, operationToken);
+ } catch (RemoteException | ImsException e) {
+ // Do not do anything, this is a stub implementation.
+ }
}
/**
@@ -145,7 +171,11 @@ public class RcsSipOptionsImplBase extends RcsCapabilityExchange {
@NonNull RcsContactUceCapability ownCapabilities, int operationToken) {
// Stub - to be implemented by service
Log.w(LOG_TAG, "respondToCapabilityRequest called with no implementation.");
- onCommandUpdate(COMMAND_CODE_GENERIC_FAILURE, operationToken);
+ try {
+ getListener().onCommandUpdate(COMMAND_CODE_NOT_SUPPORTED, operationToken);
+ } catch (RemoteException | ImsException e) {
+ // Do not do anything, this is a stub implementation.
+ }
}
/**
@@ -164,6 +194,10 @@ public class RcsSipOptionsImplBase extends RcsCapabilityExchange {
@SipResponseCode int code, @NonNull String reason, int operationToken) {
// Stub - to be implemented by service
Log.w(LOG_TAG, "respondToCapabiltyRequestWithError called with no implementation.");
- onCommandUpdate(COMMAND_CODE_GENERIC_FAILURE, operationToken);
+ try {
+ getListener().onCommandUpdate(COMMAND_CODE_NOT_SUPPORTED, operationToken);
+ } catch (RemoteException | ImsException e) {
+ // Do not do anything, this is a stub implementation.
+ }
}
}
diff --git a/test-mock/Android.bp b/test-mock/Android.bp
index a5cd1751151f..0129c4ca5bc1 100644
--- a/test-mock/Android.bp
+++ b/test-mock/Android.bp
@@ -25,7 +25,7 @@ java_sdk_library {
"android.test.mock",
],
- srcs_lib: "framework",
+ srcs_lib: "framework-minus-apex",
srcs_lib_whitelist_dirs: ["core/java"],
srcs_lib_whitelist_pkgs: ["android"],
compile_dex: true,
diff --git a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
index 2b2e8a72ab04..5217e26a40ef 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/EntitlementManagerTest.java
@@ -406,6 +406,13 @@ public final class EntitlementManagerTest {
}
@Test
+ public void verifyPermissionWhenProvisioningNotStarted() {
+ assertTrue(mEnMgr.isCellularUpstreamPermitted());
+ setupForRequiredProvisioning();
+ assertFalse(mEnMgr.isCellularUpstreamPermitted());
+ }
+
+ @Test
public void testRunTetherProvisioning() {
setupForRequiredProvisioning();
// 1. start ui provisioning, upstream is mobile