summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ApiDocs.bp2
-rw-r--r--OWNERS9
-rw-r--r--OWNERS.md34
-rw-r--r--StubLibraries.bp4
-rw-r--r--apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java19
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java27
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java26
-rw-r--r--api/Android.bp18
-rw-r--r--core/api/current.txt4879
-rw-r--r--core/api/module-lib-current.txt14
-rw-r--r--core/api/removed.txt8
-rw-r--r--core/api/system-current.txt5
-rw-r--r--core/api/test-current.txt3
-rw-r--r--core/java/android/app/ActivityManager.java38
-rw-r--r--core/java/android/app/ActivityThread.java3
-rw-r--r--core/java/android/app/AppOpsManager.java14
-rw-r--r--core/java/android/app/ApplicationPackageManager.java284
-rw-r--r--core/java/android/app/ContextImpl.java6
-rw-r--r--core/java/android/app/OWNERS37
-rw-r--r--core/java/android/app/SystemServiceRegistry.java13
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java95
-rw-r--r--core/java/android/companion/CompanionDeviceManager.java72
-rw-r--r--core/java/android/companion/DeviceNotAssociatedException.java31
-rw-r--r--core/java/android/companion/ICompanionDeviceManager.aidl4
-rw-r--r--core/java/android/content/Context.java9
-rw-r--r--core/java/android/content/OWNERS3
-rw-r--r--core/java/android/content/pm/OWNERS1
-rw-r--r--core/java/android/content/pm/PackageManager.java27
-rw-r--r--core/java/android/content/pm/PackageParser.java14
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageUtils.java15
-rw-r--r--core/java/android/hardware/OWNERS3
-rw-r--r--core/java/android/hardware/camera2/CameraMetadata.java4
-rw-r--r--core/java/android/hardware/hdmi/HdmiPortInfo.java3
-rw-r--r--core/java/android/net/NetworkAgent.java62
-rw-r--r--core/java/android/net/OWNERS8
-rw-r--r--core/java/android/net/TcpRepairWindow.java3
-rw-r--r--core/java/android/os/OWNERS3
-rw-r--r--core/java/android/os/RemoteException.java5
-rw-r--r--core/java/android/permission/ILegacyPermissionManager.aidl48
-rw-r--r--core/java/android/permission/IPermissionManager.aidl16
-rw-r--r--core/java/android/permission/LegacyPermissionManager.java217
-rw-r--r--core/java/android/permission/PermissionManager.java852
-rw-r--r--core/java/android/provider/Settings.java29
-rw-r--r--core/java/android/security/keymaster/KeymasterDefs.java24
-rw-r--r--core/java/android/service/textservice/OWNERS4
-rw-r--r--core/java/android/telephony/OWNERS1
-rw-r--r--core/java/android/util/ExceptionUtils.java2
-rw-r--r--core/java/android/view/InsetsAnimationThreadControlRunner.java1
-rw-r--r--core/java/android/view/OWNERS68
-rw-r--r--core/java/android/view/SurfaceView.java2
-rw-r--r--core/java/android/view/Window.java25
-rw-r--r--core/java/android/view/contentcapture/MainContentCaptureSession.java16
-rw-r--r--core/java/android/view/textservice/OWNERS4
-rw-r--r--core/java/android/widget/OWNERS2
-rw-r--r--core/java/com/android/internal/app/IAppOpsNotedCallback.aidl2
-rw-r--r--core/java/com/android/internal/app/IAppOpsStartedCallback.aidl2
-rw-r--r--core/java/com/android/internal/app/OWNERS1
-rw-r--r--core/java/com/android/internal/notification/OWNERS1
-rw-r--r--core/java/com/android/internal/os/OWNERS1
-rw-r--r--core/java/com/android/internal/telephony/OWNERS1
-rw-r--r--core/java/com/android/internal/view/OWNERS5
-rw-r--r--core/jni/OWNERS18
-rw-r--r--core/res/AndroidManifest.xml11
-rw-r--r--core/res/res/drawable-car/car_button_background.xml50
-rw-r--r--core/res/res/values/config.xml4
-rw-r--r--core/res/res/values/symbols.xml4
-rw-r--r--core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp (renamed from core/tests/powertests/PowerStatsLoadTests/Android.bp)2
-rw-r--r--core/tests/batterystatstests/BatteryStatsLoadTests/AndroidManifest.xml (renamed from core/tests/powertests/PowerStatsLoadTests/AndroidManifest.xml)4
-rw-r--r--core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java (renamed from core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/ConnectivitySetupRule.java)2
-rw-r--r--core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java (renamed from core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetrics.java)2
-rw-r--r--core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java (renamed from core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetricsCollector.java)3
-rw-r--r--core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java (renamed from core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/SystemServiceCallLoadTest.java)2
-rw-r--r--core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java (renamed from core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/WiFiLoadTest.java)2
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/Android.bp (renamed from core/tests/powertests/PowerStatsViewer/Android.bp)2
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml (renamed from core/tests/powertests/PowerStatsViewer/AndroidManifest.xml)12
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_entry_layout.xml (renamed from core/tests/powertests/PowerStatsViewer/res/layout/power_stats_entry_layout.xml)0
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_info_layout.xml (renamed from core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_info_layout.xml)0
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_activity_layout.xml (renamed from core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_activity_layout.xml)0
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml (renamed from core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_layout.xml)0
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml (renamed from core/tests/powertests/PowerStatsViewer/res/layout/power_stats_viewer_layout.xml)6
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml (renamed from core/tests/powertests/PowerStatsViewer/res/values/styles.xml)0
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java (renamed from core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java)29
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerInfoHelper.java (renamed from core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerInfoHelper.java)12
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java (renamed from core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerActivity.java)20
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerFragment.java (renamed from core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerFragment.java)101
-rw-r--r--core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java (renamed from core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java)114
-rw-r--r--core/tests/batterystatstests/OWNERS (renamed from core/tests/powertests/OWNERS)0
-rw-r--r--core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java2
-rwxr-xr-xcore/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java62
-rw-r--r--data/etc/car/com.android.car.provision.xml1
-rw-r--r--data/etc/com.android.documentsui.xml1
-rw-r--r--data/etc/privapp-permissions-platform.xml1
-rw-r--r--data/etc/services.core.protolog.json30
-rw-r--r--graphics/java/android/graphics/OWNERS2
-rw-r--r--keystore/java/android/security/KeyStoreOperation.java2
-rw-r--r--keystore/java/android/security/KeyStoreSecurityLevel.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java4
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java4
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java2
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java6
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java2
-rw-r--r--keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java70
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java2
-rw-r--r--libs/hwui/jni/Typeface.cpp25
-rw-r--r--location/java/android/location/Location.java7
-rw-r--r--location/java/android/location/LocationManager.java78
-rw-r--r--location/java/android/location/OWNERS4
-rw-r--r--media/java/android/media/tv/tuner/Tuner.java21
-rw-r--r--media/jni/android_media_MediaMetadataRetriever.cpp12
-rw-r--r--media/native/midi/amidi.cpp6
-rw-r--r--packages/Shell/AndroidManifest.xml3
-rw-r--r--packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java3
-rw-r--r--packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java11
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java20
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java28
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java14
-rw-r--r--services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java38
-rw-r--r--services/core/java/com/android/server/BluetoothAirplaneModeListener.java4
-rw-r--r--services/core/java/com/android/server/BluetoothManagerService.java4
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java9
-rw-r--r--services/core/java/com/android/server/OWNERS5
-rw-r--r--services/core/java/com/android/server/SensorPrivacyService.java122
-rw-r--r--services/core/java/com/android/server/TestNetworkService.java11
-rw-r--r--services/core/java/com/android/server/am/ActiveServices.java5
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java58
-rw-r--r--services/core/java/com/android/server/am/AppErrors.java15
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java39
-rw-r--r--services/core/java/com/android/server/connectivity/PermissionMonitor.java9
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java2
-rw-r--r--services/core/java/com/android/server/display/DisplayManagerService.java2
-rw-r--r--services/core/java/com/android/server/display/LogicalDisplayMapper.java9
-rwxr-xr-xservices/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java8
-rw-r--r--services/core/java/com/android/server/location/LocationManagerService.java14
-rw-r--r--services/core/java/com/android/server/location/OWNERS9
-rw-r--r--services/core/java/com/android/server/location/contexthub/OWNERS2
-rw-r--r--services/core/java/com/android/server/pm/ShortcutPackage.java2
-rw-r--r--services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java46
-rw-r--r--services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java240
-rw-r--r--services/core/java/com/android/server/pm/permission/PermissionManagerService.java230
-rw-r--r--services/core/java/com/android/server/policy/OWNERS1
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java6
-rw-r--r--services/core/java/com/android/server/wm/DisplayContent.java232
-rw-r--r--services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java119
-rw-r--r--services/core/java/com/android/server/wm/Session.java5
-rw-r--r--services/core/java/com/android/server/wm/SurfaceAnimationRunner.java1
-rw-r--r--services/core/java/com/android/server/wm/Task.java7
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java104
-rw-r--r--services/core/java/com/android/server/wm/TaskOrganizerController.java5
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java41
-rw-r--r--services/core/java/com/android/server/wm/WindowState.java51
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java2
-rw-r--r--services/robotests/src/com/android/server/location/OWNERS1
-rw-r--r--services/tests/servicestests/src/com/android/server/OWNERS2
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java2
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java108
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java (renamed from services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java)37
-rwxr-xr-xservices/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java21
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java64
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java14
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java11
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java9
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java2
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java12
-rw-r--r--telephony/common/com/android/internal/telephony/CarrierAppUtils.java6
-rw-r--r--telephony/common/com/android/internal/telephony/TelephonyPermissions.java6
-rw-r--r--telephony/java/android/telephony/DataFailCause.java106
-rw-r--r--telephony/java/android/telephony/data/ApnThrottleStatus.java4
-rw-r--r--telephony/java/android/telephony/ims/DelegateRegistrationState.java14
-rw-r--r--telephony/java/android/telephony/ims/SipDelegateConnection.java16
-rw-r--r--telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl2
-rw-r--r--telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java13
-rw-r--r--telephony/java/android/telephony/ims/stub/SipDelegate.java11
-rw-r--r--tests/FlickerTests/OWNERS1
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt8
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt7
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt17
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt18
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt13
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt14
-rw-r--r--tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt4
-rw-r--r--tests/net/integration/util/com/android/server/NetworkAgentWrapper.java43
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java35
-rw-r--r--tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java1
-rw-r--r--tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java9
197 files changed, 3519 insertions, 6561 deletions
diff --git a/ApiDocs.bp b/ApiDocs.bp
index 7ed7ec526686..3d6bdbf19264 100644
--- a/ApiDocs.bp
+++ b/ApiDocs.bp
@@ -67,7 +67,7 @@ stubs_defaults {
":opt-net-voip-srcs",
":art.module.public.api{.public.stubs.source}",
":conscrypt.module.public.api{.public.stubs.source}",
- ":android_icu4j_public_api_files",
+ ":i18n.module.public.api{.public.stubs.source}",
"test-mock/src/**/*.java",
"test-runner/src/**/*.java",
],
diff --git a/OWNERS b/OWNERS
index 4f89f7dde6af..4160122532ff 100644
--- a/OWNERS
+++ b/OWNERS
@@ -1,22 +1,29 @@
# This top-level list should remain narrowly defined as team leads; individual
# teams are strongly encouraged to define narrower OWNERS files at deeper
# levels within the source tree; see OWNERS.md for more details
+akulian@google.com
dsandler@android.com
dsandler@google.com
hackbod@android.com
hackbod@google.com
+jjaggi@google.com
jsharkey@android.com
jsharkey@google.com
michaelwr@google.com
nandana@google.com
narayan@google.com
ogunwale@google.com
+roosa@google.com
svetoslavganov@android.com
svetoslavganov@google.com
yamasani@google.com
+# API changes are already covered by API-Review+1 (http://mdb/android-api-council)
+# via https://android.git.corp.google.com/All-Projects/+/refs/meta/config/rules.pl.
+per-file */api/*current.txt = *
+
# Support bulk translation updates
-per-file */res*/values*/*.xml = byi@google.com
+per-file */res*/values*/*.xml = byi@google.com, delphij@google.com
per-file Android.bp = file:platform/build/soong:/OWNERS
per-file Android.mk = file:platform/build/soong:/OWNERS
diff --git a/OWNERS.md b/OWNERS.md
index 6428c59fd793..601b5c641f21 100644
--- a/OWNERS.md
+++ b/OWNERS.md
@@ -1,3 +1,5 @@
+# Background
+
As general background, `OWNERS` files expedite code reviews by helping code
authors quickly find relevant reviewers, and they also ensure that stakeholders
are involved in code changes in their areas.
@@ -27,8 +29,40 @@ main `services/core/` project:
* `media/`
* `wifi/`
+# Design
+
Area maintainers are strongly encouraged to list people in a single
authoritative `OWNERS` file in **exactly one** location. Then, other paths
should reference that single authoritative `OWNERS` file using an include
directive. This approach ensures that updates are applied consistently across
the tree, reducing maintenance burden.
+
+# Examples
+
+The exact syntax of `OWNERS` files can be difficult to get correct, so here are
+some common examples:
+
+```
+# Complete include of top-level owners from this repo
+include /ZYGOTE_OWNERS
+# Partial include of top-level owners from this repo
+per-file ZygoteFile.java = file:/ZYGOTE_OWNERS
+```
+```
+# Complete include of subdirectory owners from this repo
+include /services/core/java/com/android/server/net/OWNERS
+# Partial include of subdirectory owners from this repo
+per-file NetworkFile.java = file:/services/core/java/com/android/server/net/OWNERS
+```
+```
+# Complete include of top-level owners from another repo
+include platform/libcore:/OWNERS
+# Partial include of top-level owners from another repo
+per-file LibcoreFile.java = file:platform/libcore:/OWNERS
+```
+```
+# Complete include of subdirectory owners from another repo
+include platform/frameworks/av:/camera/OWNERS
+# Partial include of subdirectory owners from another repo
+per-file CameraFile.java = file:platform/frameworks/av:/camera/OWNERS
+```
diff --git a/StubLibraries.bp b/StubLibraries.bp
index 380839e5c06b..12ee889387ec 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -48,7 +48,6 @@ stubs_defaults {
":opt-telephony-srcs",
":opt-net-voip-srcs",
":art.module.public.api{.public.stubs.source}",
- ":android_icu4j_public_api_files",
"**/package.html",
],
sdk_version: "core_platform",
@@ -251,6 +250,7 @@ java_library_static {
"framework-statsd.stubs",
"framework-tethering.stubs",
"framework-wifi.stubs",
+ "i18n.module.public.api.stubs",
"private-stub-annotations-jar",
],
defaults: ["android_defaults_stubs_current"],
@@ -270,6 +270,7 @@ java_library_static {
"framework-statsd.stubs.system",
"framework-tethering.stubs.system",
"framework-wifi.stubs.system",
+ "i18n.module.public.api.stubs",
"private-stub-annotations-jar",
],
defaults: [
@@ -305,6 +306,7 @@ java_library_static {
"framework-statsd.stubs.system",
"framework-tethering.stubs.system",
"framework-wifi.stubs.system",
+ "i18n.module.public.api.stubs",
"private-stub-annotations-jar",
],
defaults: [
diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
index 1d86595a4063..b7cd4f5f8bce 100644
--- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
+++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java
@@ -18,6 +18,7 @@ package android.app.appsearch;
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
+import android.app.appsearch.exceptions.AppSearchException;
import android.os.Bundle;
import android.os.ParcelableException;
import android.os.RemoteException;
@@ -166,9 +167,9 @@ public final class AppSearchSession {
* of the returned {@link AppSearchBatchResult} are the URIs of the input
* documents. The values are {@code null} if they were successfully indexed,
* or a failed {@link AppSearchResult} otherwise.
- * Or {@link BatchResultCallback#onSystemError} will be invoked with a
- * {@link Throwable} if an unexpected internal error occurred in AppSearch
- * service.
+ * Or {@link BatchResultCallback#onSystemError} will be invoked with an
+ * {@link AppSearchException} if an error occurred in AppSearch initialization
+ * or a cause {@link Throwable} if other error occurred in AppSearch service.
*/
public void putDocuments(
@NonNull PutDocumentsRequest request,
@@ -209,9 +210,9 @@ public final class AppSearchSession {
* {@link AppSearchResult} otherwise. URIs that are not found will return a
* failed {@link AppSearchResult} with a result code of
* {@link AppSearchResult#RESULT_NOT_FOUND}.
- * Or {@link BatchResultCallback#onSystemError} will be invoked with a
- * {@link Throwable} if an unexpected internal error occurred in AppSearch
- * service.
+ * Or {@link BatchResultCallback#onSystemError} will be invoked with an
+ * {@link AppSearchException} if an error occurred in AppSearch initialization
+ * or a cause {@link Throwable} if other error occurred in AppSearch service.
*/
public void getByUri(
@NonNull GetByUriRequest request,
@@ -337,9 +338,9 @@ public final class AppSearchSession {
* are {@code null} on success, or a failed {@link AppSearchResult} otherwise.
* URIs that are not found will return a failed {@link AppSearchResult} with a
* result code of {@link AppSearchResult#RESULT_NOT_FOUND}.
- * Or {@link BatchResultCallback#onSystemError} will be invoked with a
- * {@link Throwable} if an unexpected internal error occurred in AppSearch
- * service.
+ * Or {@link BatchResultCallback#onSystemError} will be invoked with an
+ * {@link AppSearchException} if an error occurred in AppSearch initialization
+ * or a cause {@link Throwable} if other error occurred in AppSearch service.
*/
public void removeByUri(
@NonNull RemoveByUriRequest request,
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
index 53d097e844c8..551347c5c202 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java
@@ -77,7 +77,7 @@ public class AppSearchManagerService extends SystemService {
for (int i = 0; i < schemaBundles.size(); i++) {
schemas.add(new AppSearchSchema(schemaBundles.get(i)));
}
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
impl.setSchema(databaseName, schemas, schemasNotPlatformSurfaceable, forceOverride);
invokeCallbackOnResult(callback,
@@ -103,7 +103,7 @@ public class AppSearchManagerService extends SystemService {
try {
AppSearchBatchResult.Builder<String, Void> resultBuilder =
new AppSearchBatchResult.Builder<>();
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
for (int i = 0; i < documentBundles.size(); i++) {
GenericDocument document = new GenericDocument(documentBundles.get(i));
@@ -138,7 +138,7 @@ public class AppSearchManagerService extends SystemService {
try {
AppSearchBatchResult.Builder<String, Bundle> resultBuilder =
new AppSearchBatchResult.Builder<>();
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
for (int i = 0; i < uris.size(); i++) {
String uri = uris.get(i);
@@ -172,7 +172,7 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = UserHandle.getUserId(callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
SearchResultPage searchResultPage = impl.query(
databaseName,
@@ -198,7 +198,7 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = UserHandle.getUserId(callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
SearchResultPage searchResultPage = impl.globalQuery(
queryExpression,
new SearchSpec(searchSpecBundle));
@@ -221,7 +221,7 @@ public class AppSearchManagerService extends SystemService {
// TODO(b/162450968) check nextPageToken is being advanced by the same uid as originally
// opened it
try {
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
SearchResultPage searchResultPage = impl.getNextPage(nextPageToken);
invokeCallbackOnResult(callback,
AppSearchResult.newSuccessfulResult(searchResultPage.getBundle()));
@@ -238,7 +238,7 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = UserHandle.getUserId(callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
impl.invalidateNextPageToken(nextPageToken);
} catch (Throwable t) {
Log.d(TAG, "Unable to invalidate the query page token", t);
@@ -257,10 +257,10 @@ public class AppSearchManagerService extends SystemService {
int callingUid = Binder.getCallingUidOrThrow();
int callingUserId = UserHandle.getUserId(callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
+ AppSearchBatchResult.Builder<String, Void> resultBuilder =
+ new AppSearchBatchResult.Builder<>();
try {
- AppSearchBatchResult.Builder<String, Void> resultBuilder =
- new AppSearchBatchResult.Builder<>();
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
for (int i = 0; i < uris.size(); i++) {
String uri = uris.get(i);
@@ -293,7 +293,7 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = UserHandle.getUserId(callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
- AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId);
+ AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId);
databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid);
impl.removeByQuery(databaseName, queryExpression,
new SearchSpec(searchSpecBundle));
@@ -312,7 +312,7 @@ public class AppSearchManagerService extends SystemService {
int callingUserId = UserHandle.getUserId(callingUid);
final long callingIdentity = Binder.clearCallingIdentity();
try {
- ImplInstanceManager.getOrCreateInstance(getContext(), callingUserId);
+ ImplInstanceManager.getInstance(getContext(), callingUserId);
invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null));
} catch (Throwable t) {
invokeCallbackOnError(callback, t);
@@ -374,14 +374,13 @@ public class AppSearchManagerService extends SystemService {
}
/**
- * Invokes the {@link IAppSearchBatchResultCallback} with an unexpected internal throwable.
+ * Invokes the {@link IAppSearchBatchResultCallback} with an throwable.
*
* <p>The throwable is converted to {@link ParcelableException}.
*/
private void invokeCallbackOnError(IAppSearchBatchResultCallback callback,
Throwable throwable) {
try {
- //TODO(b/175067650) verify ParcelableException could propagate throwable correctly.
callback.onSystemError(new ParcelableException(throwable));
} catch (RemoteException e) {
Log.d(TAG, "Unable to send error to the callback", e);
diff --git a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
index d26269132c5a..2871eb622f11 100644
--- a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
+++ b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java
@@ -41,7 +41,7 @@ public final class ImplInstanceManager {
private ImplInstanceManager() {}
/**
- * Gets an instance of AppSearchImpl for the given user, or creates one if none exists.
+ * Gets an instance of AppSearchImpl for the given user.
*
* <p>If no AppSearchImpl instance exists for this user, Icing will be initialized and one will
* be created.
@@ -51,7 +51,7 @@ public final class ImplInstanceManager {
* @return An initialized {@link AppSearchImpl} for this user
*/
@NonNull
- public static AppSearchImpl getOrCreateInstance(@NonNull Context context, @UserIdInt int userId)
+ public static AppSearchImpl getInstance(@NonNull Context context, @UserIdInt int userId)
throws AppSearchException {
AppSearchImpl instance = sInstances.get(userId);
if (instance == null) {
@@ -66,28 +66,6 @@ public final class ImplInstanceManager {
return instance;
}
- /**
- * Gets an instance of AppSearchImpl for the given user.
- *
- * <p>This method should only be called by an initialized SearchSession, which has been already
- * created the AppSearchImpl instance for the given user.
- *
- * @param userId The multi-user userId of the device user calling AppSearch
- * @return An initialized {@link AppSearchImpl} for this user
- */
- @NonNull
- public static AppSearchImpl getInstance(@UserIdInt int userId) {
- AppSearchImpl instance = sInstances.get(userId);
- if (instance == null) {
- // Impossible scenario, user cannot call an uninitialized SearchSession,
- // getInstance should always find the instance for the given user and never try to
- // create an instance for this user again.
- throw new IllegalStateException(
- "AppSearchImpl has never been created for this user: " + userId);
- }
- return instance;
- }
-
private static AppSearchImpl createImpl(@NonNull Context context, @UserIdInt int userId)
throws AppSearchException {
File appSearchDir = getAppSearchDir(context, userId);
diff --git a/api/Android.bp b/api/Android.bp
index 5ee41b79b58c..9417030fc937 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -38,6 +38,7 @@ genrule {
":framework-statsd{.public.api.txt}",
":framework-tethering{.public.api.txt}",
":framework-wifi{.public.api.txt}",
+ ":i18n.module.public.api{.public.api.txt}",
":non-updatable-current.txt",
],
out: ["current.txt"],
@@ -50,7 +51,10 @@ genrule {
dest: "current.txt",
},
{
- targets: ["sdk", "win_sdk"],
+ targets: [
+ "sdk",
+ "win_sdk",
+ ],
dir: "apistubs/android/public/api",
dest: "android.txt",
},
@@ -72,6 +76,7 @@ genrule {
":framework-statsd{.public.stubs.source}",
":framework-tethering{.public.stubs.source}",
":framework-wifi{.public.stubs.source}",
+ ":i18n.module.public.api{.public.stubs.source}",
],
out: ["current.srcjar"],
tools: ["merge_zips"],
@@ -92,6 +97,7 @@ genrule {
":framework-statsd{.public.removed-api.txt}",
":framework-tethering{.public.removed-api.txt}",
":framework-wifi{.public.removed-api.txt}",
+ ":i18n.module.public.api{.public.removed-api.txt}",
":non-updatable-removed.txt",
],
out: ["removed.txt"],
@@ -130,7 +136,10 @@ genrule {
dest: "system-current.txt",
},
{
- targets: ["sdk", "win_sdk"],
+ targets: [
+ "sdk",
+ "win_sdk",
+ ],
dir: "apistubs/android/system/api",
dest: "android.txt",
},
@@ -189,7 +198,10 @@ genrule {
dest: "module-lib-current.txt",
},
{
- targets: ["sdk", "win_sdk"],
+ targets: [
+ "sdk",
+ "win_sdk",
+ ],
dir: "apistubs/android/module-lib/api",
dest: "android.txt",
},
diff --git a/core/api/current.txt b/core/api/current.txt
index 9a34270442d0..e88811569049 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -87,6 +87,7 @@ package android {
field public static final String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE";
field @Deprecated public static final String GET_TASKS = "android.permission.GET_TASKS";
field public static final String GLOBAL_SEARCH = "android.permission.GLOBAL_SEARCH";
+ field public static final String HIDE_OVERLAY_WINDOWS = "android.permission.HIDE_OVERLAY_WINDOWS";
field public static final String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER";
field public static final String INSTALL_PACKAGES = "android.permission.INSTALL_PACKAGES";
field public static final String INSTALL_SHORTCUT = "com.android.launcher.permission.INSTALL_SHORTCUT";
@@ -140,6 +141,7 @@ package android {
field public static final String REQUEST_DELETE_PACKAGES = "android.permission.REQUEST_DELETE_PACKAGES";
field public static final String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";
field public static final String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";
+ field public static final String REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE = "android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE";
field public static final String REQUEST_PASSWORD_COMPLEXITY = "android.permission.REQUEST_PASSWORD_COMPLEXITY";
field @Deprecated public static final String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES";
field public static final String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";
@@ -6940,14 +6942,14 @@ package android.app.admin {
method public long getPasswordExpirationTimeout(@Nullable android.content.ComponentName);
method public int getPasswordHistoryLength(@Nullable android.content.ComponentName);
method public int getPasswordMaximumLength(int);
- method public int getPasswordMinimumLength(@Nullable android.content.ComponentName);
- method public int getPasswordMinimumLetters(@Nullable android.content.ComponentName);
- method public int getPasswordMinimumLowerCase(@Nullable android.content.ComponentName);
- method public int getPasswordMinimumNonLetter(@Nullable android.content.ComponentName);
- method public int getPasswordMinimumNumeric(@Nullable android.content.ComponentName);
- method public int getPasswordMinimumSymbols(@Nullable android.content.ComponentName);
- method public int getPasswordMinimumUpperCase(@Nullable android.content.ComponentName);
- method public int getPasswordQuality(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordMinimumLength(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordMinimumLetters(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordMinimumLowerCase(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordMinimumNonLetter(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordMinimumNumeric(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordMinimumSymbols(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordMinimumUpperCase(@Nullable android.content.ComponentName);
+ method @Deprecated public int getPasswordQuality(@Nullable android.content.ComponentName);
method @Nullable public android.app.admin.SystemUpdateInfo getPendingSystemUpdate(@NonNull android.content.ComponentName);
method public int getPermissionGrantState(@Nullable android.content.ComponentName, @NonNull String, @NonNull String);
method public int getPermissionPolicy(android.content.ComponentName);
@@ -7071,14 +7073,14 @@ package android.app.admin {
method @NonNull public String[] setPackagesSuspended(@NonNull android.content.ComponentName, @NonNull String[], boolean);
method public void setPasswordExpirationTimeout(@NonNull android.content.ComponentName, long);
method public void setPasswordHistoryLength(@NonNull android.content.ComponentName, int);
- method public void setPasswordMinimumLength(@NonNull android.content.ComponentName, int);
- method public void setPasswordMinimumLetters(@NonNull android.content.ComponentName, int);
- method public void setPasswordMinimumLowerCase(@NonNull android.content.ComponentName, int);
- method public void setPasswordMinimumNonLetter(@NonNull android.content.ComponentName, int);
- method public void setPasswordMinimumNumeric(@NonNull android.content.ComponentName, int);
- method public void setPasswordMinimumSymbols(@NonNull android.content.ComponentName, int);
- method public void setPasswordMinimumUpperCase(@NonNull android.content.ComponentName, int);
- method public void setPasswordQuality(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordMinimumLength(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordMinimumLetters(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordMinimumLowerCase(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordMinimumNonLetter(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordMinimumNumeric(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordMinimumSymbols(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordMinimumUpperCase(@NonNull android.content.ComponentName, int);
+ method @Deprecated public void setPasswordQuality(@NonNull android.content.ComponentName, int);
method public boolean setPermissionGrantState(@NonNull android.content.ComponentName, @NonNull String, @NonNull String, int);
method public void setPermissionPolicy(@NonNull android.content.ComponentName, int);
method public boolean setPermittedAccessibilityServices(@NonNull android.content.ComponentName, java.util.List<java.lang.String>);
@@ -9519,6 +9521,8 @@ package android.companion {
method @NonNull public java.util.List<java.lang.String> getAssociations();
method public boolean hasNotificationAccess(android.content.ComponentName);
method public void requestNotificationAccess(android.content.ComponentName);
+ method @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) public void startObservingDevicePresence(@NonNull String) throws android.companion.DeviceNotAssociatedException;
+ method @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) public void stopObservingDevicePresence(@NonNull String) throws android.companion.DeviceNotAssociatedException;
field public static final String EXTRA_DEVICE = "android.companion.extra.DEVICE";
}
@@ -9539,6 +9543,9 @@ package android.companion {
public interface DeviceFilter<D extends android.os.Parcelable> extends android.os.Parcelable {
}
+ public class DeviceNotAssociatedException extends java.lang.Exception {
+ }
+
public final class WifiDeviceFilter implements android.companion.DeviceFilter<android.net.wifi.ScanResult> {
method public int describeContents();
method public void writeToParcel(@NonNull android.os.Parcel, int);
@@ -18519,4812 +18526,6 @@ package android.hardware.usb {
}
-package android.icu.lang {
-
- public final class UCharacter implements android.icu.lang.UCharacterEnums.ECharacterCategory android.icu.lang.UCharacterEnums.ECharacterDirection {
- method public static int charCount(int);
- method public static int codePointAt(CharSequence, int);
- method public static int codePointAt(char[], int);
- method public static int codePointAt(char[], int, int);
- method public static int codePointBefore(CharSequence, int);
- method public static int codePointBefore(char[], int);
- method public static int codePointBefore(char[], int, int);
- method public static int codePointCount(CharSequence, int, int);
- method public static int codePointCount(char[], int, int);
- method public static int digit(int, int);
- method public static int digit(int);
- method public static int foldCase(int, boolean);
- method public static String foldCase(String, boolean);
- method public static int foldCase(int, int);
- method public static String foldCase(String, int);
- method public static char forDigit(int, int);
- method public static android.icu.util.VersionInfo getAge(int);
- method public static int getBidiPairedBracket(int);
- method public static int getCharFromExtendedName(String);
- method public static int getCharFromName(String);
- method public static int getCharFromNameAlias(String);
- method public static int getCodePoint(char, char);
- method public static int getCodePoint(char);
- method public static int getCombiningClass(int);
- method public static int getDirection(int);
- method public static byte getDirectionality(int);
- method public static String getExtendedName(int);
- method public static android.icu.util.ValueIterator getExtendedNameIterator();
- method public static int getHanNumericValue(int);
- method public static int getIntPropertyMaxValue(int);
- method public static int getIntPropertyMinValue(int);
- method public static int getIntPropertyValue(int, int);
- method public static int getMirror(int);
- method public static String getName(int);
- method public static String getName(String, String);
- method public static String getNameAlias(int);
- method public static android.icu.util.ValueIterator getNameIterator();
- method public static int getNumericValue(int);
- method public static int getPropertyEnum(CharSequence);
- method public static String getPropertyName(int, int);
- method public static int getPropertyValueEnum(int, CharSequence);
- method public static String getPropertyValueName(int, int, int);
- method public static int getType(int);
- method public static android.icu.util.RangeValueIterator getTypeIterator();
- method public static double getUnicodeNumericValue(int);
- method public static android.icu.util.VersionInfo getUnicodeVersion();
- method public static boolean hasBinaryProperty(int, int);
- method public static boolean isBMP(int);
- method public static boolean isBaseForm(int);
- method public static boolean isDefined(int);
- method public static boolean isDigit(int);
- method public static boolean isHighSurrogate(char);
- method public static boolean isISOControl(int);
- method public static boolean isIdentifierIgnorable(int);
- method public static boolean isJavaIdentifierPart(int);
- method public static boolean isJavaIdentifierStart(int);
- method public static boolean isLegal(int);
- method public static boolean isLegal(String);
- method public static boolean isLetter(int);
- method public static boolean isLetterOrDigit(int);
- method public static boolean isLowSurrogate(char);
- method public static boolean isLowerCase(int);
- method public static boolean isMirrored(int);
- method public static boolean isPrintable(int);
- method public static boolean isSpaceChar(int);
- method public static boolean isSupplementary(int);
- method public static boolean isSupplementaryCodePoint(int);
- method public static boolean isSurrogatePair(char, char);
- method public static boolean isTitleCase(int);
- method public static boolean isUAlphabetic(int);
- method public static boolean isULowercase(int);
- method public static boolean isUUppercase(int);
- method public static boolean isUWhiteSpace(int);
- method public static boolean isUnicodeIdentifierPart(int);
- method public static boolean isUnicodeIdentifierStart(int);
- method public static boolean isUpperCase(int);
- method public static boolean isValidCodePoint(int);
- method public static boolean isWhitespace(int);
- method public static int offsetByCodePoints(CharSequence, int, int);
- method public static int offsetByCodePoints(char[], int, int, int, int);
- method public static int toChars(int, char[], int);
- method public static char[] toChars(int);
- method public static int toCodePoint(char, char);
- method public static int toLowerCase(int);
- method public static String toLowerCase(String);
- method public static String toLowerCase(java.util.Locale, String);
- method public static String toLowerCase(android.icu.util.ULocale, String);
- method public static String toString(int);
- method public static int toTitleCase(int);
- method public static String toTitleCase(String, android.icu.text.BreakIterator);
- method public static String toTitleCase(java.util.Locale, String, android.icu.text.BreakIterator);
- method public static String toTitleCase(android.icu.util.ULocale, String, android.icu.text.BreakIterator);
- method public static String toTitleCase(android.icu.util.ULocale, String, android.icu.text.BreakIterator, int);
- method public static String toTitleCase(java.util.Locale, String, android.icu.text.BreakIterator, int);
- method public static int toUpperCase(int);
- method public static String toUpperCase(String);
- method public static String toUpperCase(java.util.Locale, String);
- method public static String toUpperCase(android.icu.util.ULocale, String);
- field public static final int FOLD_CASE_DEFAULT = 0; // 0x0
- field public static final int FOLD_CASE_EXCLUDE_SPECIAL_I = 1; // 0x1
- field public static final int MAX_CODE_POINT = 1114111; // 0x10ffff
- field public static final char MAX_HIGH_SURROGATE = 56319; // 0xdbff '\udbff'
- field public static final char MAX_LOW_SURROGATE = 57343; // 0xdfff '\udfff'
- field public static final int MAX_RADIX = 36; // 0x24
- field public static final char MAX_SURROGATE = 57343; // 0xdfff '\udfff'
- field public static final int MAX_VALUE = 1114111; // 0x10ffff
- field public static final int MIN_CODE_POINT = 0; // 0x0
- field public static final char MIN_HIGH_SURROGATE = 55296; // 0xd800 '\ud800'
- field public static final char MIN_LOW_SURROGATE = 56320; // 0xdc00 '\udc00'
- field public static final int MIN_RADIX = 2; // 0x2
- field public static final int MIN_SUPPLEMENTARY_CODE_POINT = 65536; // 0x10000
- field public static final char MIN_SURROGATE = 55296; // 0xd800 '\ud800'
- field public static final int MIN_VALUE = 0; // 0x0
- field public static final double NO_NUMERIC_VALUE = -1.23456789E8;
- field public static final int REPLACEMENT_CHAR = 65533; // 0xfffd
- field public static final int SUPPLEMENTARY_MIN_VALUE = 65536; // 0x10000
- field public static final int TITLECASE_NO_BREAK_ADJUSTMENT = 512; // 0x200
- field public static final int TITLECASE_NO_LOWERCASE = 256; // 0x100
- }
-
- public static interface UCharacter.BidiPairedBracketType {
- field public static final int CLOSE = 2; // 0x2
- field public static final int NONE = 0; // 0x0
- field public static final int OPEN = 1; // 0x1
- }
-
- public static interface UCharacter.DecompositionType {
- field public static final int CANONICAL = 1; // 0x1
- field public static final int CIRCLE = 3; // 0x3
- field public static final int COMPAT = 2; // 0x2
- field public static final int FINAL = 4; // 0x4
- field public static final int FONT = 5; // 0x5
- field public static final int FRACTION = 6; // 0x6
- field public static final int INITIAL = 7; // 0x7
- field public static final int ISOLATED = 8; // 0x8
- field public static final int MEDIAL = 9; // 0x9
- field public static final int NARROW = 10; // 0xa
- field public static final int NOBREAK = 11; // 0xb
- field public static final int NONE = 0; // 0x0
- field public static final int SMALL = 12; // 0xc
- field public static final int SQUARE = 13; // 0xd
- field public static final int SUB = 14; // 0xe
- field public static final int SUPER = 15; // 0xf
- field public static final int VERTICAL = 16; // 0x10
- field public static final int WIDE = 17; // 0x11
- }
-
- public static interface UCharacter.EastAsianWidth {
- field public static final int AMBIGUOUS = 1; // 0x1
- field public static final int FULLWIDTH = 3; // 0x3
- field public static final int HALFWIDTH = 2; // 0x2
- field public static final int NARROW = 4; // 0x4
- field public static final int NEUTRAL = 0; // 0x0
- field public static final int WIDE = 5; // 0x5
- }
-
- public static interface UCharacter.GraphemeClusterBreak {
- field public static final int CONTROL = 1; // 0x1
- field public static final int CR = 2; // 0x2
- field public static final int EXTEND = 3; // 0x3
- field public static final int E_BASE = 13; // 0xd
- field public static final int E_BASE_GAZ = 14; // 0xe
- field public static final int E_MODIFIER = 15; // 0xf
- field public static final int GLUE_AFTER_ZWJ = 16; // 0x10
- field public static final int L = 4; // 0x4
- field public static final int LF = 5; // 0x5
- field public static final int LV = 6; // 0x6
- field public static final int LVT = 7; // 0x7
- field public static final int OTHER = 0; // 0x0
- field public static final int PREPEND = 11; // 0xb
- field public static final int REGIONAL_INDICATOR = 12; // 0xc
- field public static final int SPACING_MARK = 10; // 0xa
- field public static final int T = 8; // 0x8
- field public static final int V = 9; // 0x9
- field public static final int ZWJ = 17; // 0x11
- }
-
- public static interface UCharacter.HangulSyllableType {
- field public static final int LEADING_JAMO = 1; // 0x1
- field public static final int LVT_SYLLABLE = 5; // 0x5
- field public static final int LV_SYLLABLE = 4; // 0x4
- field public static final int NOT_APPLICABLE = 0; // 0x0
- field public static final int TRAILING_JAMO = 3; // 0x3
- field public static final int VOWEL_JAMO = 2; // 0x2
- }
-
- public static interface UCharacter.IndicPositionalCategory {
- field public static final int BOTTOM = 1; // 0x1
- field public static final int BOTTOM_AND_LEFT = 2; // 0x2
- field public static final int BOTTOM_AND_RIGHT = 3; // 0x3
- field public static final int LEFT = 4; // 0x4
- field public static final int LEFT_AND_RIGHT = 5; // 0x5
- field public static final int NA = 0; // 0x0
- field public static final int OVERSTRUCK = 6; // 0x6
- field public static final int RIGHT = 7; // 0x7
- field public static final int TOP = 8; // 0x8
- field public static final int TOP_AND_BOTTOM = 9; // 0x9
- field public static final int TOP_AND_BOTTOM_AND_LEFT = 15; // 0xf
- field public static final int TOP_AND_BOTTOM_AND_RIGHT = 10; // 0xa
- field public static final int TOP_AND_LEFT = 11; // 0xb
- field public static final int TOP_AND_LEFT_AND_RIGHT = 12; // 0xc
- field public static final int TOP_AND_RIGHT = 13; // 0xd
- field public static final int VISUAL_ORDER_LEFT = 14; // 0xe
- }
-
- public static interface UCharacter.IndicSyllabicCategory {
- field public static final int AVAGRAHA = 1; // 0x1
- field public static final int BINDU = 2; // 0x2
- field public static final int BRAHMI_JOINING_NUMBER = 3; // 0x3
- field public static final int CANTILLATION_MARK = 4; // 0x4
- field public static final int CONSONANT = 5; // 0x5
- field public static final int CONSONANT_DEAD = 6; // 0x6
- field public static final int CONSONANT_FINAL = 7; // 0x7
- field public static final int CONSONANT_HEAD_LETTER = 8; // 0x8
- field public static final int CONSONANT_INITIAL_POSTFIXED = 9; // 0x9
- field public static final int CONSONANT_KILLER = 10; // 0xa
- field public static final int CONSONANT_MEDIAL = 11; // 0xb
- field public static final int CONSONANT_PLACEHOLDER = 12; // 0xc
- field public static final int CONSONANT_PRECEDING_REPHA = 13; // 0xd
- field public static final int CONSONANT_PREFIXED = 14; // 0xe
- field public static final int CONSONANT_SUBJOINED = 15; // 0xf
- field public static final int CONSONANT_SUCCEEDING_REPHA = 16; // 0x10
- field public static final int CONSONANT_WITH_STACKER = 17; // 0x11
- field public static final int GEMINATION_MARK = 18; // 0x12
- field public static final int INVISIBLE_STACKER = 19; // 0x13
- field public static final int JOINER = 20; // 0x14
- field public static final int MODIFYING_LETTER = 21; // 0x15
- field public static final int NON_JOINER = 22; // 0x16
- field public static final int NUKTA = 23; // 0x17
- field public static final int NUMBER = 24; // 0x18
- field public static final int NUMBER_JOINER = 25; // 0x19
- field public static final int OTHER = 0; // 0x0
- field public static final int PURE_KILLER = 26; // 0x1a
- field public static final int REGISTER_SHIFTER = 27; // 0x1b
- field public static final int SYLLABLE_MODIFIER = 28; // 0x1c
- field public static final int TONE_LETTER = 29; // 0x1d
- field public static final int TONE_MARK = 30; // 0x1e
- field public static final int VIRAMA = 31; // 0x1f
- field public static final int VISARGA = 32; // 0x20
- field public static final int VOWEL = 33; // 0x21
- field public static final int VOWEL_DEPENDENT = 34; // 0x22
- field public static final int VOWEL_INDEPENDENT = 35; // 0x23
- }
-
- public static interface UCharacter.JoiningGroup {
- field public static final int AFRICAN_FEH = 86; // 0x56
- field public static final int AFRICAN_NOON = 87; // 0x57
- field public static final int AFRICAN_QAF = 88; // 0x58
- field public static final int AIN = 1; // 0x1
- field public static final int ALAPH = 2; // 0x2
- field public static final int ALEF = 3; // 0x3
- field public static final int BEH = 4; // 0x4
- field public static final int BETH = 5; // 0x5
- field public static final int BURUSHASKI_YEH_BARREE = 54; // 0x36
- field public static final int DAL = 6; // 0x6
- field public static final int DALATH_RISH = 7; // 0x7
- field public static final int E = 8; // 0x8
- field public static final int FARSI_YEH = 55; // 0x37
- field public static final int FE = 51; // 0x33
- field public static final int FEH = 9; // 0x9
- field public static final int FINAL_SEMKATH = 10; // 0xa
- field public static final int GAF = 11; // 0xb
- field public static final int GAMAL = 12; // 0xc
- field public static final int HAH = 13; // 0xd
- field public static final int HAMZA_ON_HEH_GOAL = 14; // 0xe
- field public static final int HANIFI_ROHINGYA_KINNA_YA = 100; // 0x64
- field public static final int HANIFI_ROHINGYA_PA = 101; // 0x65
- field public static final int HE = 15; // 0xf
- field public static final int HEH = 16; // 0x10
- field public static final int HEH_GOAL = 17; // 0x11
- field public static final int HETH = 18; // 0x12
- field public static final int KAF = 19; // 0x13
- field public static final int KAPH = 20; // 0x14
- field public static final int KHAPH = 52; // 0x34
- field public static final int KNOTTED_HEH = 21; // 0x15
- field public static final int LAM = 22; // 0x16
- field public static final int LAMADH = 23; // 0x17
- field public static final int MALAYALAM_BHA = 89; // 0x59
- field public static final int MALAYALAM_JA = 90; // 0x5a
- field public static final int MALAYALAM_LLA = 91; // 0x5b
- field public static final int MALAYALAM_LLLA = 92; // 0x5c
- field public static final int MALAYALAM_NGA = 93; // 0x5d
- field public static final int MALAYALAM_NNA = 94; // 0x5e
- field public static final int MALAYALAM_NNNA = 95; // 0x5f
- field public static final int MALAYALAM_NYA = 96; // 0x60
- field public static final int MALAYALAM_RA = 97; // 0x61
- field public static final int MALAYALAM_SSA = 98; // 0x62
- field public static final int MALAYALAM_TTA = 99; // 0x63
- field public static final int MANICHAEAN_ALEPH = 58; // 0x3a
- field public static final int MANICHAEAN_AYIN = 59; // 0x3b
- field public static final int MANICHAEAN_BETH = 60; // 0x3c
- field public static final int MANICHAEAN_DALETH = 61; // 0x3d
- field public static final int MANICHAEAN_DHAMEDH = 62; // 0x3e
- field public static final int MANICHAEAN_FIVE = 63; // 0x3f
- field public static final int MANICHAEAN_GIMEL = 64; // 0x40
- field public static final int MANICHAEAN_HETH = 65; // 0x41
- field public static final int MANICHAEAN_HUNDRED = 66; // 0x42
- field public static final int MANICHAEAN_KAPH = 67; // 0x43
- field public static final int MANICHAEAN_LAMEDH = 68; // 0x44
- field public static final int MANICHAEAN_MEM = 69; // 0x45
- field public static final int MANICHAEAN_NUN = 70; // 0x46
- field public static final int MANICHAEAN_ONE = 71; // 0x47
- field public static final int MANICHAEAN_PE = 72; // 0x48
- field public static final int MANICHAEAN_QOPH = 73; // 0x49
- field public static final int MANICHAEAN_RESH = 74; // 0x4a
- field public static final int MANICHAEAN_SADHE = 75; // 0x4b
- field public static final int MANICHAEAN_SAMEKH = 76; // 0x4c
- field public static final int MANICHAEAN_TAW = 77; // 0x4d
- field public static final int MANICHAEAN_TEN = 78; // 0x4e
- field public static final int MANICHAEAN_TETH = 79; // 0x4f
- field public static final int MANICHAEAN_THAMEDH = 80; // 0x50
- field public static final int MANICHAEAN_TWENTY = 81; // 0x51
- field public static final int MANICHAEAN_WAW = 82; // 0x52
- field public static final int MANICHAEAN_YODH = 83; // 0x53
- field public static final int MANICHAEAN_ZAYIN = 84; // 0x54
- field public static final int MEEM = 24; // 0x18
- field public static final int MIM = 25; // 0x19
- field public static final int NOON = 26; // 0x1a
- field public static final int NO_JOINING_GROUP = 0; // 0x0
- field public static final int NUN = 27; // 0x1b
- field public static final int NYA = 56; // 0x38
- field public static final int PE = 28; // 0x1c
- field public static final int QAF = 29; // 0x1d
- field public static final int QAPH = 30; // 0x1e
- field public static final int REH = 31; // 0x1f
- field public static final int REVERSED_PE = 32; // 0x20
- field public static final int ROHINGYA_YEH = 57; // 0x39
- field public static final int SAD = 33; // 0x21
- field public static final int SADHE = 34; // 0x22
- field public static final int SEEN = 35; // 0x23
- field public static final int SEMKATH = 36; // 0x24
- field public static final int SHIN = 37; // 0x25
- field public static final int STRAIGHT_WAW = 85; // 0x55
- field public static final int SWASH_KAF = 38; // 0x26
- field public static final int SYRIAC_WAW = 39; // 0x27
- field public static final int TAH = 40; // 0x28
- field public static final int TAW = 41; // 0x29
- field public static final int TEH_MARBUTA = 42; // 0x2a
- field public static final int TEH_MARBUTA_GOAL = 14; // 0xe
- field public static final int TETH = 43; // 0x2b
- field public static final int WAW = 44; // 0x2c
- field public static final int YEH = 45; // 0x2d
- field public static final int YEH_BARREE = 46; // 0x2e
- field public static final int YEH_WITH_TAIL = 47; // 0x2f
- field public static final int YUDH = 48; // 0x30
- field public static final int YUDH_HE = 49; // 0x31
- field public static final int ZAIN = 50; // 0x32
- field public static final int ZHAIN = 53; // 0x35
- }
-
- public static interface UCharacter.JoiningType {
- field public static final int DUAL_JOINING = 2; // 0x2
- field public static final int JOIN_CAUSING = 1; // 0x1
- field public static final int LEFT_JOINING = 3; // 0x3
- field public static final int NON_JOINING = 0; // 0x0
- field public static final int RIGHT_JOINING = 4; // 0x4
- field public static final int TRANSPARENT = 5; // 0x5
- }
-
- public static interface UCharacter.LineBreak {
- field public static final int ALPHABETIC = 2; // 0x2
- field public static final int AMBIGUOUS = 1; // 0x1
- field public static final int BREAK_AFTER = 4; // 0x4
- field public static final int BREAK_BEFORE = 5; // 0x5
- field public static final int BREAK_BOTH = 3; // 0x3
- field public static final int BREAK_SYMBOLS = 27; // 0x1b
- field public static final int CARRIAGE_RETURN = 10; // 0xa
- field public static final int CLOSE_PARENTHESIS = 36; // 0x24
- field public static final int CLOSE_PUNCTUATION = 8; // 0x8
- field public static final int COMBINING_MARK = 9; // 0x9
- field public static final int COMPLEX_CONTEXT = 24; // 0x18
- field public static final int CONDITIONAL_JAPANESE_STARTER = 37; // 0x25
- field public static final int CONTINGENT_BREAK = 7; // 0x7
- field public static final int EXCLAMATION = 11; // 0xb
- field public static final int E_BASE = 40; // 0x28
- field public static final int E_MODIFIER = 41; // 0x29
- field public static final int GLUE = 12; // 0xc
- field public static final int H2 = 31; // 0x1f
- field public static final int H3 = 32; // 0x20
- field public static final int HEBREW_LETTER = 38; // 0x26
- field public static final int HYPHEN = 13; // 0xd
- field public static final int IDEOGRAPHIC = 14; // 0xe
- field public static final int INFIX_NUMERIC = 16; // 0x10
- field public static final int INSEPARABLE = 15; // 0xf
- field public static final int INSEPERABLE = 15; // 0xf
- field public static final int JL = 33; // 0x21
- field public static final int JT = 34; // 0x22
- field public static final int JV = 35; // 0x23
- field public static final int LINE_FEED = 17; // 0x11
- field public static final int MANDATORY_BREAK = 6; // 0x6
- field public static final int NEXT_LINE = 29; // 0x1d
- field public static final int NONSTARTER = 18; // 0x12
- field public static final int NUMERIC = 19; // 0x13
- field public static final int OPEN_PUNCTUATION = 20; // 0x14
- field public static final int POSTFIX_NUMERIC = 21; // 0x15
- field public static final int PREFIX_NUMERIC = 22; // 0x16
- field public static final int QUOTATION = 23; // 0x17
- field public static final int REGIONAL_INDICATOR = 39; // 0x27
- field public static final int SPACE = 26; // 0x1a
- field public static final int SURROGATE = 25; // 0x19
- field public static final int UNKNOWN = 0; // 0x0
- field public static final int WORD_JOINER = 30; // 0x1e
- field public static final int ZWJ = 42; // 0x2a
- field public static final int ZWSPACE = 28; // 0x1c
- }
-
- public static interface UCharacter.NumericType {
- field public static final int DECIMAL = 1; // 0x1
- field public static final int DIGIT = 2; // 0x2
- field public static final int NONE = 0; // 0x0
- field public static final int NUMERIC = 3; // 0x3
- }
-
- public static interface UCharacter.SentenceBreak {
- field public static final int ATERM = 1; // 0x1
- field public static final int CLOSE = 2; // 0x2
- field public static final int CR = 11; // 0xb
- field public static final int EXTEND = 12; // 0xc
- field public static final int FORMAT = 3; // 0x3
- field public static final int LF = 13; // 0xd
- field public static final int LOWER = 4; // 0x4
- field public static final int NUMERIC = 5; // 0x5
- field public static final int OLETTER = 6; // 0x6
- field public static final int OTHER = 0; // 0x0
- field public static final int SCONTINUE = 14; // 0xe
- field public static final int SEP = 7; // 0x7
- field public static final int SP = 8; // 0x8
- field public static final int STERM = 9; // 0x9
- field public static final int UPPER = 10; // 0xa
- }
-
- public static final class UCharacter.UnicodeBlock extends java.lang.Character.Subset {
- method public static android.icu.lang.UCharacter.UnicodeBlock forName(String);
- method public int getID();
- method public static android.icu.lang.UCharacter.UnicodeBlock getInstance(int);
- method public static android.icu.lang.UCharacter.UnicodeBlock of(int);
- field public static final android.icu.lang.UCharacter.UnicodeBlock ADLAM;
- field public static final int ADLAM_ID = 263; // 0x107
- field public static final android.icu.lang.UCharacter.UnicodeBlock AEGEAN_NUMBERS;
- field public static final int AEGEAN_NUMBERS_ID = 119; // 0x77
- field public static final android.icu.lang.UCharacter.UnicodeBlock AHOM;
- field public static final int AHOM_ID = 253; // 0xfd
- field public static final android.icu.lang.UCharacter.UnicodeBlock ALCHEMICAL_SYMBOLS;
- field public static final int ALCHEMICAL_SYMBOLS_ID = 208; // 0xd0
- field public static final android.icu.lang.UCharacter.UnicodeBlock ALPHABETIC_PRESENTATION_FORMS;
- field public static final int ALPHABETIC_PRESENTATION_FORMS_ID = 80; // 0x50
- field public static final android.icu.lang.UCharacter.UnicodeBlock ANATOLIAN_HIEROGLYPHS;
- field public static final int ANATOLIAN_HIEROGLYPHS_ID = 254; // 0xfe
- field public static final android.icu.lang.UCharacter.UnicodeBlock ANCIENT_GREEK_MUSICAL_NOTATION;
- field public static final int ANCIENT_GREEK_MUSICAL_NOTATION_ID = 126; // 0x7e
- field public static final android.icu.lang.UCharacter.UnicodeBlock ANCIENT_GREEK_NUMBERS;
- field public static final int ANCIENT_GREEK_NUMBERS_ID = 127; // 0x7f
- field public static final android.icu.lang.UCharacter.UnicodeBlock ANCIENT_SYMBOLS;
- field public static final int ANCIENT_SYMBOLS_ID = 165; // 0xa5
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC;
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_EXTENDED_A;
- field public static final int ARABIC_EXTENDED_A_ID = 210; // 0xd2
- field public static final int ARABIC_ID = 12; // 0xc
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS;
- field public static final int ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS_ID = 211; // 0xd3
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_PRESENTATION_FORMS_A;
- field public static final int ARABIC_PRESENTATION_FORMS_A_ID = 81; // 0x51
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_PRESENTATION_FORMS_B;
- field public static final int ARABIC_PRESENTATION_FORMS_B_ID = 85; // 0x55
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_SUPPLEMENT;
- field public static final int ARABIC_SUPPLEMENT_ID = 128; // 0x80
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARMENIAN;
- field public static final int ARMENIAN_ID = 10; // 0xa
- field public static final android.icu.lang.UCharacter.UnicodeBlock ARROWS;
- field public static final int ARROWS_ID = 46; // 0x2e
- field public static final android.icu.lang.UCharacter.UnicodeBlock AVESTAN;
- field public static final int AVESTAN_ID = 188; // 0xbc
- field public static final android.icu.lang.UCharacter.UnicodeBlock BALINESE;
- field public static final int BALINESE_ID = 147; // 0x93
- field public static final android.icu.lang.UCharacter.UnicodeBlock BAMUM;
- field public static final int BAMUM_ID = 177; // 0xb1
- field public static final android.icu.lang.UCharacter.UnicodeBlock BAMUM_SUPPLEMENT;
- field public static final int BAMUM_SUPPLEMENT_ID = 202; // 0xca
- field public static final android.icu.lang.UCharacter.UnicodeBlock BASIC_LATIN;
- field public static final int BASIC_LATIN_ID = 1; // 0x1
- field public static final android.icu.lang.UCharacter.UnicodeBlock BASSA_VAH;
- field public static final int BASSA_VAH_ID = 221; // 0xdd
- field public static final android.icu.lang.UCharacter.UnicodeBlock BATAK;
- field public static final int BATAK_ID = 199; // 0xc7
- field public static final android.icu.lang.UCharacter.UnicodeBlock BENGALI;
- field public static final int BENGALI_ID = 16; // 0x10
- field public static final android.icu.lang.UCharacter.UnicodeBlock BHAIKSUKI;
- field public static final int BHAIKSUKI_ID = 264; // 0x108
- field public static final android.icu.lang.UCharacter.UnicodeBlock BLOCK_ELEMENTS;
- field public static final int BLOCK_ELEMENTS_ID = 53; // 0x35
- field public static final android.icu.lang.UCharacter.UnicodeBlock BOPOMOFO;
- field public static final android.icu.lang.UCharacter.UnicodeBlock BOPOMOFO_EXTENDED;
- field public static final int BOPOMOFO_EXTENDED_ID = 67; // 0x43
- field public static final int BOPOMOFO_ID = 64; // 0x40
- field public static final android.icu.lang.UCharacter.UnicodeBlock BOX_DRAWING;
- field public static final int BOX_DRAWING_ID = 52; // 0x34
- field public static final android.icu.lang.UCharacter.UnicodeBlock BRAHMI;
- field public static final int BRAHMI_ID = 201; // 0xc9
- field public static final android.icu.lang.UCharacter.UnicodeBlock BRAILLE_PATTERNS;
- field public static final int BRAILLE_PATTERNS_ID = 57; // 0x39
- field public static final android.icu.lang.UCharacter.UnicodeBlock BUGINESE;
- field public static final int BUGINESE_ID = 129; // 0x81
- field public static final android.icu.lang.UCharacter.UnicodeBlock BUHID;
- field public static final int BUHID_ID = 100; // 0x64
- field public static final android.icu.lang.UCharacter.UnicodeBlock BYZANTINE_MUSICAL_SYMBOLS;
- field public static final int BYZANTINE_MUSICAL_SYMBOLS_ID = 91; // 0x5b
- field public static final android.icu.lang.UCharacter.UnicodeBlock CARIAN;
- field public static final int CARIAN_ID = 168; // 0xa8
- field public static final android.icu.lang.UCharacter.UnicodeBlock CAUCASIAN_ALBANIAN;
- field public static final int CAUCASIAN_ALBANIAN_ID = 222; // 0xde
- field public static final android.icu.lang.UCharacter.UnicodeBlock CHAKMA;
- field public static final int CHAKMA_ID = 212; // 0xd4
- field public static final android.icu.lang.UCharacter.UnicodeBlock CHAM;
- field public static final int CHAM_ID = 164; // 0xa4
- field public static final android.icu.lang.UCharacter.UnicodeBlock CHEROKEE;
- field public static final int CHEROKEE_ID = 32; // 0x20
- field public static final android.icu.lang.UCharacter.UnicodeBlock CHEROKEE_SUPPLEMENT;
- field public static final int CHEROKEE_SUPPLEMENT_ID = 255; // 0xff
- field public static final android.icu.lang.UCharacter.UnicodeBlock CHESS_SYMBOLS;
- field public static final int CHESS_SYMBOLS_ID = 281; // 0x119
- field public static final android.icu.lang.UCharacter.UnicodeBlock CHORASMIAN;
- field public static final int CHORASMIAN_ID = 301; // 0x12d
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY;
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY_FORMS;
- field public static final int CJK_COMPATIBILITY_FORMS_ID = 83; // 0x53
- field public static final int CJK_COMPATIBILITY_ID = 69; // 0x45
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS;
- field public static final int CJK_COMPATIBILITY_IDEOGRAPHS_ID = 79; // 0x4f
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT;
- field public static final int CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT_ID = 95; // 0x5f
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_RADICALS_SUPPLEMENT;
- field public static final int CJK_RADICALS_SUPPLEMENT_ID = 58; // 0x3a
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_STROKES;
- field public static final int CJK_STROKES_ID = 130; // 0x82
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_SYMBOLS_AND_PUNCTUATION;
- field public static final int CJK_SYMBOLS_AND_PUNCTUATION_ID = 61; // 0x3d
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS;
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A;
- field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A_ID = 70; // 0x46
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B;
- field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B_ID = 94; // 0x5e
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C;
- field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C_ID = 197; // 0xc5
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D;
- field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D_ID = 209; // 0xd1
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E;
- field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E_ID = 256; // 0x100
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F;
- field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F_ID = 274; // 0x112
- field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G;
- field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G_ID = 302; // 0x12e
- field public static final int CJK_UNIFIED_IDEOGRAPHS_ID = 71; // 0x47
- field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_DIACRITICAL_MARKS;
- field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_DIACRITICAL_MARKS_EXTENDED;
- field public static final int COMBINING_DIACRITICAL_MARKS_EXTENDED_ID = 224; // 0xe0
- field public static final int COMBINING_DIACRITICAL_MARKS_ID = 7; // 0x7
- field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_DIACRITICAL_MARKS_SUPPLEMENT;
- field public static final int COMBINING_DIACRITICAL_MARKS_SUPPLEMENT_ID = 131; // 0x83
- field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_HALF_MARKS;
- field public static final int COMBINING_HALF_MARKS_ID = 82; // 0x52
- field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS;
- field public static final int COMBINING_MARKS_FOR_SYMBOLS_ID = 43; // 0x2b
- field public static final android.icu.lang.UCharacter.UnicodeBlock COMMON_INDIC_NUMBER_FORMS;
- field public static final int COMMON_INDIC_NUMBER_FORMS_ID = 178; // 0xb2
- field public static final android.icu.lang.UCharacter.UnicodeBlock CONTROL_PICTURES;
- field public static final int CONTROL_PICTURES_ID = 49; // 0x31
- field public static final android.icu.lang.UCharacter.UnicodeBlock COPTIC;
- field public static final android.icu.lang.UCharacter.UnicodeBlock COPTIC_EPACT_NUMBERS;
- field public static final int COPTIC_EPACT_NUMBERS_ID = 223; // 0xdf
- field public static final int COPTIC_ID = 132; // 0x84
- field public static final android.icu.lang.UCharacter.UnicodeBlock COUNTING_ROD_NUMERALS;
- field public static final int COUNTING_ROD_NUMERALS_ID = 154; // 0x9a
- field public static final android.icu.lang.UCharacter.UnicodeBlock CUNEIFORM;
- field public static final int CUNEIFORM_ID = 152; // 0x98
- field public static final android.icu.lang.UCharacter.UnicodeBlock CUNEIFORM_NUMBERS_AND_PUNCTUATION;
- field public static final int CUNEIFORM_NUMBERS_AND_PUNCTUATION_ID = 153; // 0x99
- field public static final android.icu.lang.UCharacter.UnicodeBlock CURRENCY_SYMBOLS;
- field public static final int CURRENCY_SYMBOLS_ID = 42; // 0x2a
- field public static final android.icu.lang.UCharacter.UnicodeBlock CYPRIOT_SYLLABARY;
- field public static final int CYPRIOT_SYLLABARY_ID = 123; // 0x7b
- field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC;
- field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_EXTENDED_A;
- field public static final int CYRILLIC_EXTENDED_A_ID = 158; // 0x9e
- field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_EXTENDED_B;
- field public static final int CYRILLIC_EXTENDED_B_ID = 160; // 0xa0
- field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_EXTENDED_C;
- field public static final int CYRILLIC_EXTENDED_C_ID = 265; // 0x109
- field public static final int CYRILLIC_ID = 9; // 0x9
- field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_SUPPLEMENT;
- field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_SUPPLEMENTARY;
- field public static final int CYRILLIC_SUPPLEMENTARY_ID = 97; // 0x61
- field public static final int CYRILLIC_SUPPLEMENT_ID = 97; // 0x61
- field public static final android.icu.lang.UCharacter.UnicodeBlock DESERET;
- field public static final int DESERET_ID = 90; // 0x5a
- field public static final android.icu.lang.UCharacter.UnicodeBlock DEVANAGARI;
- field public static final android.icu.lang.UCharacter.UnicodeBlock DEVANAGARI_EXTENDED;
- field public static final int DEVANAGARI_EXTENDED_ID = 179; // 0xb3
- field public static final int DEVANAGARI_ID = 15; // 0xf
- field public static final android.icu.lang.UCharacter.UnicodeBlock DINGBATS;
- field public static final int DINGBATS_ID = 56; // 0x38
- field public static final android.icu.lang.UCharacter.UnicodeBlock DIVES_AKURU;
- field public static final int DIVES_AKURU_ID = 303; // 0x12f
- field public static final android.icu.lang.UCharacter.UnicodeBlock DOGRA;
- field public static final int DOGRA_ID = 282; // 0x11a
- field public static final android.icu.lang.UCharacter.UnicodeBlock DOMINO_TILES;
- field public static final int DOMINO_TILES_ID = 171; // 0xab
- field public static final android.icu.lang.UCharacter.UnicodeBlock DUPLOYAN;
- field public static final int DUPLOYAN_ID = 225; // 0xe1
- field public static final android.icu.lang.UCharacter.UnicodeBlock EARLY_DYNASTIC_CUNEIFORM;
- field public static final int EARLY_DYNASTIC_CUNEIFORM_ID = 257; // 0x101
- field public static final android.icu.lang.UCharacter.UnicodeBlock EGYPTIAN_HIEROGLYPHS;
- field public static final int EGYPTIAN_HIEROGLYPHS_ID = 194; // 0xc2
- field public static final android.icu.lang.UCharacter.UnicodeBlock EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS;
- field public static final int EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS_ID = 292; // 0x124
- field public static final android.icu.lang.UCharacter.UnicodeBlock ELBASAN;
- field public static final int ELBASAN_ID = 226; // 0xe2
- field public static final android.icu.lang.UCharacter.UnicodeBlock ELYMAIC;
- field public static final int ELYMAIC_ID = 293; // 0x125
- field public static final android.icu.lang.UCharacter.UnicodeBlock EMOTICONS;
- field public static final int EMOTICONS_ID = 206; // 0xce
- field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_ALPHANUMERICS;
- field public static final int ENCLOSED_ALPHANUMERICS_ID = 51; // 0x33
- field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_ALPHANUMERIC_SUPPLEMENT;
- field public static final int ENCLOSED_ALPHANUMERIC_SUPPLEMENT_ID = 195; // 0xc3
- field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_CJK_LETTERS_AND_MONTHS;
- field public static final int ENCLOSED_CJK_LETTERS_AND_MONTHS_ID = 68; // 0x44
- field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_IDEOGRAPHIC_SUPPLEMENT;
- field public static final int ENCLOSED_IDEOGRAPHIC_SUPPLEMENT_ID = 196; // 0xc4
- field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC;
- field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC_EXTENDED;
- field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC_EXTENDED_A;
- field public static final int ETHIOPIC_EXTENDED_A_ID = 200; // 0xc8
- field public static final int ETHIOPIC_EXTENDED_ID = 133; // 0x85
- field public static final int ETHIOPIC_ID = 31; // 0x1f
- field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC_SUPPLEMENT;
- field public static final int ETHIOPIC_SUPPLEMENT_ID = 134; // 0x86
- field public static final android.icu.lang.UCharacter.UnicodeBlock GENERAL_PUNCTUATION;
- field public static final int GENERAL_PUNCTUATION_ID = 40; // 0x28
- field public static final android.icu.lang.UCharacter.UnicodeBlock GEOMETRIC_SHAPES;
- field public static final android.icu.lang.UCharacter.UnicodeBlock GEOMETRIC_SHAPES_EXTENDED;
- field public static final int GEOMETRIC_SHAPES_EXTENDED_ID = 227; // 0xe3
- field public static final int GEOMETRIC_SHAPES_ID = 54; // 0x36
- field public static final android.icu.lang.UCharacter.UnicodeBlock GEORGIAN;
- field public static final android.icu.lang.UCharacter.UnicodeBlock GEORGIAN_EXTENDED;
- field public static final int GEORGIAN_EXTENDED_ID = 283; // 0x11b
- field public static final int GEORGIAN_ID = 29; // 0x1d
- field public static final android.icu.lang.UCharacter.UnicodeBlock GEORGIAN_SUPPLEMENT;
- field public static final int GEORGIAN_SUPPLEMENT_ID = 135; // 0x87
- field public static final android.icu.lang.UCharacter.UnicodeBlock GLAGOLITIC;
- field public static final int GLAGOLITIC_ID = 136; // 0x88
- field public static final android.icu.lang.UCharacter.UnicodeBlock GLAGOLITIC_SUPPLEMENT;
- field public static final int GLAGOLITIC_SUPPLEMENT_ID = 266; // 0x10a
- field public static final android.icu.lang.UCharacter.UnicodeBlock GOTHIC;
- field public static final int GOTHIC_ID = 89; // 0x59
- field public static final android.icu.lang.UCharacter.UnicodeBlock GRANTHA;
- field public static final int GRANTHA_ID = 228; // 0xe4
- field public static final android.icu.lang.UCharacter.UnicodeBlock GREEK;
- field public static final android.icu.lang.UCharacter.UnicodeBlock GREEK_EXTENDED;
- field public static final int GREEK_EXTENDED_ID = 39; // 0x27
- field public static final int GREEK_ID = 8; // 0x8
- field public static final android.icu.lang.UCharacter.UnicodeBlock GUJARATI;
- field public static final int GUJARATI_ID = 18; // 0x12
- field public static final android.icu.lang.UCharacter.UnicodeBlock GUNJALA_GONDI;
- field public static final int GUNJALA_GONDI_ID = 284; // 0x11c
- field public static final android.icu.lang.UCharacter.UnicodeBlock GURMUKHI;
- field public static final int GURMUKHI_ID = 17; // 0x11
- field public static final android.icu.lang.UCharacter.UnicodeBlock HALFWIDTH_AND_FULLWIDTH_FORMS;
- field public static final int HALFWIDTH_AND_FULLWIDTH_FORMS_ID = 87; // 0x57
- field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_COMPATIBILITY_JAMO;
- field public static final int HANGUL_COMPATIBILITY_JAMO_ID = 65; // 0x41
- field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_JAMO;
- field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_JAMO_EXTENDED_A;
- field public static final int HANGUL_JAMO_EXTENDED_A_ID = 180; // 0xb4
- field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_JAMO_EXTENDED_B;
- field public static final int HANGUL_JAMO_EXTENDED_B_ID = 185; // 0xb9
- field public static final int HANGUL_JAMO_ID = 30; // 0x1e
- field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_SYLLABLES;
- field public static final int HANGUL_SYLLABLES_ID = 74; // 0x4a
- field public static final android.icu.lang.UCharacter.UnicodeBlock HANIFI_ROHINGYA;
- field public static final int HANIFI_ROHINGYA_ID = 285; // 0x11d
- field public static final android.icu.lang.UCharacter.UnicodeBlock HANUNOO;
- field public static final int HANUNOO_ID = 99; // 0x63
- field public static final android.icu.lang.UCharacter.UnicodeBlock HATRAN;
- field public static final int HATRAN_ID = 258; // 0x102
- field public static final android.icu.lang.UCharacter.UnicodeBlock HEBREW;
- field public static final int HEBREW_ID = 11; // 0xb
- field public static final android.icu.lang.UCharacter.UnicodeBlock HIGH_PRIVATE_USE_SURROGATES;
- field public static final int HIGH_PRIVATE_USE_SURROGATES_ID = 76; // 0x4c
- field public static final android.icu.lang.UCharacter.UnicodeBlock HIGH_SURROGATES;
- field public static final int HIGH_SURROGATES_ID = 75; // 0x4b
- field public static final android.icu.lang.UCharacter.UnicodeBlock HIRAGANA;
- field public static final int HIRAGANA_ID = 62; // 0x3e
- field public static final android.icu.lang.UCharacter.UnicodeBlock IDEOGRAPHIC_DESCRIPTION_CHARACTERS;
- field public static final int IDEOGRAPHIC_DESCRIPTION_CHARACTERS_ID = 60; // 0x3c
- field public static final android.icu.lang.UCharacter.UnicodeBlock IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION;
- field public static final int IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION_ID = 267; // 0x10b
- field public static final android.icu.lang.UCharacter.UnicodeBlock IMPERIAL_ARAMAIC;
- field public static final int IMPERIAL_ARAMAIC_ID = 186; // 0xba
- field public static final android.icu.lang.UCharacter.UnicodeBlock INDIC_SIYAQ_NUMBERS;
- field public static final int INDIC_SIYAQ_NUMBERS_ID = 286; // 0x11e
- field public static final android.icu.lang.UCharacter.UnicodeBlock INSCRIPTIONAL_PAHLAVI;
- field public static final int INSCRIPTIONAL_PAHLAVI_ID = 190; // 0xbe
- field public static final android.icu.lang.UCharacter.UnicodeBlock INSCRIPTIONAL_PARTHIAN;
- field public static final int INSCRIPTIONAL_PARTHIAN_ID = 189; // 0xbd
- field public static final android.icu.lang.UCharacter.UnicodeBlock INVALID_CODE;
- field public static final int INVALID_CODE_ID = -1; // 0xffffffff
- field public static final android.icu.lang.UCharacter.UnicodeBlock IPA_EXTENSIONS;
- field public static final int IPA_EXTENSIONS_ID = 5; // 0x5
- field public static final android.icu.lang.UCharacter.UnicodeBlock JAVANESE;
- field public static final int JAVANESE_ID = 181; // 0xb5
- field public static final android.icu.lang.UCharacter.UnicodeBlock KAITHI;
- field public static final int KAITHI_ID = 193; // 0xc1
- field public static final android.icu.lang.UCharacter.UnicodeBlock KANA_EXTENDED_A;
- field public static final int KANA_EXTENDED_A_ID = 275; // 0x113
- field public static final android.icu.lang.UCharacter.UnicodeBlock KANA_SUPPLEMENT;
- field public static final int KANA_SUPPLEMENT_ID = 203; // 0xcb
- field public static final android.icu.lang.UCharacter.UnicodeBlock KANBUN;
- field public static final int KANBUN_ID = 66; // 0x42
- field public static final android.icu.lang.UCharacter.UnicodeBlock KANGXI_RADICALS;
- field public static final int KANGXI_RADICALS_ID = 59; // 0x3b
- field public static final android.icu.lang.UCharacter.UnicodeBlock KANNADA;
- field public static final int KANNADA_ID = 22; // 0x16
- field public static final android.icu.lang.UCharacter.UnicodeBlock KATAKANA;
- field public static final int KATAKANA_ID = 63; // 0x3f
- field public static final android.icu.lang.UCharacter.UnicodeBlock KATAKANA_PHONETIC_EXTENSIONS;
- field public static final int KATAKANA_PHONETIC_EXTENSIONS_ID = 107; // 0x6b
- field public static final android.icu.lang.UCharacter.UnicodeBlock KAYAH_LI;
- field public static final int KAYAH_LI_ID = 162; // 0xa2
- field public static final android.icu.lang.UCharacter.UnicodeBlock KHAROSHTHI;
- field public static final int KHAROSHTHI_ID = 137; // 0x89
- field public static final android.icu.lang.UCharacter.UnicodeBlock KHITAN_SMALL_SCRIPT;
- field public static final int KHITAN_SMALL_SCRIPT_ID = 304; // 0x130
- field public static final android.icu.lang.UCharacter.UnicodeBlock KHMER;
- field public static final int KHMER_ID = 36; // 0x24
- field public static final android.icu.lang.UCharacter.UnicodeBlock KHMER_SYMBOLS;
- field public static final int KHMER_SYMBOLS_ID = 113; // 0x71
- field public static final android.icu.lang.UCharacter.UnicodeBlock KHOJKI;
- field public static final int KHOJKI_ID = 229; // 0xe5
- field public static final android.icu.lang.UCharacter.UnicodeBlock KHUDAWADI;
- field public static final int KHUDAWADI_ID = 230; // 0xe6
- field public static final android.icu.lang.UCharacter.UnicodeBlock LAO;
- field public static final int LAO_ID = 26; // 0x1a
- field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_1_SUPPLEMENT;
- field public static final int LATIN_1_SUPPLEMENT_ID = 2; // 0x2
- field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_A;
- field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_ADDITIONAL;
- field public static final int LATIN_EXTENDED_ADDITIONAL_ID = 38; // 0x26
- field public static final int LATIN_EXTENDED_A_ID = 3; // 0x3
- field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_B;
- field public static final int LATIN_EXTENDED_B_ID = 4; // 0x4
- field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_C;
- field public static final int LATIN_EXTENDED_C_ID = 148; // 0x94
- field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_D;
- field public static final int LATIN_EXTENDED_D_ID = 149; // 0x95
- field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_E;
- field public static final int LATIN_EXTENDED_E_ID = 231; // 0xe7
- field public static final android.icu.lang.UCharacter.UnicodeBlock LEPCHA;
- field public static final int LEPCHA_ID = 156; // 0x9c
- field public static final android.icu.lang.UCharacter.UnicodeBlock LETTERLIKE_SYMBOLS;
- field public static final int LETTERLIKE_SYMBOLS_ID = 44; // 0x2c
- field public static final android.icu.lang.UCharacter.UnicodeBlock LIMBU;
- field public static final int LIMBU_ID = 111; // 0x6f
- field public static final android.icu.lang.UCharacter.UnicodeBlock LINEAR_A;
- field public static final int LINEAR_A_ID = 232; // 0xe8
- field public static final android.icu.lang.UCharacter.UnicodeBlock LINEAR_B_IDEOGRAMS;
- field public static final int LINEAR_B_IDEOGRAMS_ID = 118; // 0x76
- field public static final android.icu.lang.UCharacter.UnicodeBlock LINEAR_B_SYLLABARY;
- field public static final int LINEAR_B_SYLLABARY_ID = 117; // 0x75
- field public static final android.icu.lang.UCharacter.UnicodeBlock LISU;
- field public static final int LISU_ID = 176; // 0xb0
- field public static final android.icu.lang.UCharacter.UnicodeBlock LISU_SUPPLEMENT;
- field public static final int LISU_SUPPLEMENT_ID = 305; // 0x131
- field public static final android.icu.lang.UCharacter.UnicodeBlock LOW_SURROGATES;
- field public static final int LOW_SURROGATES_ID = 77; // 0x4d
- field public static final android.icu.lang.UCharacter.UnicodeBlock LYCIAN;
- field public static final int LYCIAN_ID = 167; // 0xa7
- field public static final android.icu.lang.UCharacter.UnicodeBlock LYDIAN;
- field public static final int LYDIAN_ID = 169; // 0xa9
- field public static final android.icu.lang.UCharacter.UnicodeBlock MAHAJANI;
- field public static final int MAHAJANI_ID = 233; // 0xe9
- field public static final android.icu.lang.UCharacter.UnicodeBlock MAHJONG_TILES;
- field public static final int MAHJONG_TILES_ID = 170; // 0xaa
- field public static final android.icu.lang.UCharacter.UnicodeBlock MAKASAR;
- field public static final int MAKASAR_ID = 287; // 0x11f
- field public static final android.icu.lang.UCharacter.UnicodeBlock MALAYALAM;
- field public static final int MALAYALAM_ID = 23; // 0x17
- field public static final android.icu.lang.UCharacter.UnicodeBlock MANDAIC;
- field public static final int MANDAIC_ID = 198; // 0xc6
- field public static final android.icu.lang.UCharacter.UnicodeBlock MANICHAEAN;
- field public static final int MANICHAEAN_ID = 234; // 0xea
- field public static final android.icu.lang.UCharacter.UnicodeBlock MARCHEN;
- field public static final int MARCHEN_ID = 268; // 0x10c
- field public static final android.icu.lang.UCharacter.UnicodeBlock MASARAM_GONDI;
- field public static final int MASARAM_GONDI_ID = 276; // 0x114
- field public static final android.icu.lang.UCharacter.UnicodeBlock MATHEMATICAL_ALPHANUMERIC_SYMBOLS;
- field public static final int MATHEMATICAL_ALPHANUMERIC_SYMBOLS_ID = 93; // 0x5d
- field public static final android.icu.lang.UCharacter.UnicodeBlock MATHEMATICAL_OPERATORS;
- field public static final int MATHEMATICAL_OPERATORS_ID = 47; // 0x2f
- field public static final android.icu.lang.UCharacter.UnicodeBlock MAYAN_NUMERALS;
- field public static final int MAYAN_NUMERALS_ID = 288; // 0x120
- field public static final android.icu.lang.UCharacter.UnicodeBlock MEDEFAIDRIN;
- field public static final int MEDEFAIDRIN_ID = 289; // 0x121
- field public static final android.icu.lang.UCharacter.UnicodeBlock MEETEI_MAYEK;
- field public static final android.icu.lang.UCharacter.UnicodeBlock MEETEI_MAYEK_EXTENSIONS;
- field public static final int MEETEI_MAYEK_EXTENSIONS_ID = 213; // 0xd5
- field public static final int MEETEI_MAYEK_ID = 184; // 0xb8
- field public static final android.icu.lang.UCharacter.UnicodeBlock MENDE_KIKAKUI;
- field public static final int MENDE_KIKAKUI_ID = 235; // 0xeb
- field public static final android.icu.lang.UCharacter.UnicodeBlock MEROITIC_CURSIVE;
- field public static final int MEROITIC_CURSIVE_ID = 214; // 0xd6
- field public static final android.icu.lang.UCharacter.UnicodeBlock MEROITIC_HIEROGLYPHS;
- field public static final int MEROITIC_HIEROGLYPHS_ID = 215; // 0xd7
- field public static final android.icu.lang.UCharacter.UnicodeBlock MIAO;
- field public static final int MIAO_ID = 216; // 0xd8
- field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A;
- field public static final int MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A_ID = 102; // 0x66
- field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B;
- field public static final int MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B_ID = 105; // 0x69
- field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_SYMBOLS;
- field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_SYMBOLS_AND_ARROWS;
- field public static final int MISCELLANEOUS_SYMBOLS_AND_ARROWS_ID = 115; // 0x73
- field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS;
- field public static final int MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS_ID = 205; // 0xcd
- field public static final int MISCELLANEOUS_SYMBOLS_ID = 55; // 0x37
- field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_TECHNICAL;
- field public static final int MISCELLANEOUS_TECHNICAL_ID = 48; // 0x30
- field public static final android.icu.lang.UCharacter.UnicodeBlock MODI;
- field public static final android.icu.lang.UCharacter.UnicodeBlock MODIFIER_TONE_LETTERS;
- field public static final int MODIFIER_TONE_LETTERS_ID = 138; // 0x8a
- field public static final int MODI_ID = 236; // 0xec
- field public static final android.icu.lang.UCharacter.UnicodeBlock MONGOLIAN;
- field public static final int MONGOLIAN_ID = 37; // 0x25
- field public static final android.icu.lang.UCharacter.UnicodeBlock MONGOLIAN_SUPPLEMENT;
- field public static final int MONGOLIAN_SUPPLEMENT_ID = 269; // 0x10d
- field public static final android.icu.lang.UCharacter.UnicodeBlock MRO;
- field public static final int MRO_ID = 237; // 0xed
- field public static final android.icu.lang.UCharacter.UnicodeBlock MULTANI;
- field public static final int MULTANI_ID = 259; // 0x103
- field public static final android.icu.lang.UCharacter.UnicodeBlock MUSICAL_SYMBOLS;
- field public static final int MUSICAL_SYMBOLS_ID = 92; // 0x5c
- field public static final android.icu.lang.UCharacter.UnicodeBlock MYANMAR;
- field public static final android.icu.lang.UCharacter.UnicodeBlock MYANMAR_EXTENDED_A;
- field public static final int MYANMAR_EXTENDED_A_ID = 182; // 0xb6
- field public static final android.icu.lang.UCharacter.UnicodeBlock MYANMAR_EXTENDED_B;
- field public static final int MYANMAR_EXTENDED_B_ID = 238; // 0xee
- field public static final int MYANMAR_ID = 28; // 0x1c
- field public static final android.icu.lang.UCharacter.UnicodeBlock NABATAEAN;
- field public static final int NABATAEAN_ID = 239; // 0xef
- field public static final android.icu.lang.UCharacter.UnicodeBlock NANDINAGARI;
- field public static final int NANDINAGARI_ID = 294; // 0x126
- field public static final android.icu.lang.UCharacter.UnicodeBlock NEWA;
- field public static final int NEWA_ID = 270; // 0x10e
- field public static final android.icu.lang.UCharacter.UnicodeBlock NEW_TAI_LUE;
- field public static final int NEW_TAI_LUE_ID = 139; // 0x8b
- field public static final android.icu.lang.UCharacter.UnicodeBlock NKO;
- field public static final int NKO_ID = 146; // 0x92
- field public static final android.icu.lang.UCharacter.UnicodeBlock NO_BLOCK;
- field public static final android.icu.lang.UCharacter.UnicodeBlock NUMBER_FORMS;
- field public static final int NUMBER_FORMS_ID = 45; // 0x2d
- field public static final android.icu.lang.UCharacter.UnicodeBlock NUSHU;
- field public static final int NUSHU_ID = 277; // 0x115
- field public static final android.icu.lang.UCharacter.UnicodeBlock NYIAKENG_PUACHUE_HMONG;
- field public static final int NYIAKENG_PUACHUE_HMONG_ID = 295; // 0x127
- field public static final android.icu.lang.UCharacter.UnicodeBlock OGHAM;
- field public static final int OGHAM_ID = 34; // 0x22
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_HUNGARIAN;
- field public static final int OLD_HUNGARIAN_ID = 260; // 0x104
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_ITALIC;
- field public static final int OLD_ITALIC_ID = 88; // 0x58
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_NORTH_ARABIAN;
- field public static final int OLD_NORTH_ARABIAN_ID = 240; // 0xf0
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_PERMIC;
- field public static final int OLD_PERMIC_ID = 241; // 0xf1
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_PERSIAN;
- field public static final int OLD_PERSIAN_ID = 140; // 0x8c
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_SOGDIAN;
- field public static final int OLD_SOGDIAN_ID = 290; // 0x122
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_SOUTH_ARABIAN;
- field public static final int OLD_SOUTH_ARABIAN_ID = 187; // 0xbb
- field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_TURKIC;
- field public static final int OLD_TURKIC_ID = 191; // 0xbf
- field public static final android.icu.lang.UCharacter.UnicodeBlock OL_CHIKI;
- field public static final int OL_CHIKI_ID = 157; // 0x9d
- field public static final android.icu.lang.UCharacter.UnicodeBlock OPTICAL_CHARACTER_RECOGNITION;
- field public static final int OPTICAL_CHARACTER_RECOGNITION_ID = 50; // 0x32
- field public static final android.icu.lang.UCharacter.UnicodeBlock ORIYA;
- field public static final int ORIYA_ID = 19; // 0x13
- field public static final android.icu.lang.UCharacter.UnicodeBlock ORNAMENTAL_DINGBATS;
- field public static final int ORNAMENTAL_DINGBATS_ID = 242; // 0xf2
- field public static final android.icu.lang.UCharacter.UnicodeBlock OSAGE;
- field public static final int OSAGE_ID = 271; // 0x10f
- field public static final android.icu.lang.UCharacter.UnicodeBlock OSMANYA;
- field public static final int OSMANYA_ID = 122; // 0x7a
- field public static final android.icu.lang.UCharacter.UnicodeBlock OTTOMAN_SIYAQ_NUMBERS;
- field public static final int OTTOMAN_SIYAQ_NUMBERS_ID = 296; // 0x128
- field public static final android.icu.lang.UCharacter.UnicodeBlock PAHAWH_HMONG;
- field public static final int PAHAWH_HMONG_ID = 243; // 0xf3
- field public static final android.icu.lang.UCharacter.UnicodeBlock PALMYRENE;
- field public static final int PALMYRENE_ID = 244; // 0xf4
- field public static final android.icu.lang.UCharacter.UnicodeBlock PAU_CIN_HAU;
- field public static final int PAU_CIN_HAU_ID = 245; // 0xf5
- field public static final android.icu.lang.UCharacter.UnicodeBlock PHAGS_PA;
- field public static final int PHAGS_PA_ID = 150; // 0x96
- field public static final android.icu.lang.UCharacter.UnicodeBlock PHAISTOS_DISC;
- field public static final int PHAISTOS_DISC_ID = 166; // 0xa6
- field public static final android.icu.lang.UCharacter.UnicodeBlock PHOENICIAN;
- field public static final int PHOENICIAN_ID = 151; // 0x97
- field public static final android.icu.lang.UCharacter.UnicodeBlock PHONETIC_EXTENSIONS;
- field public static final int PHONETIC_EXTENSIONS_ID = 114; // 0x72
- field public static final android.icu.lang.UCharacter.UnicodeBlock PHONETIC_EXTENSIONS_SUPPLEMENT;
- field public static final int PHONETIC_EXTENSIONS_SUPPLEMENT_ID = 141; // 0x8d
- field public static final android.icu.lang.UCharacter.UnicodeBlock PLAYING_CARDS;
- field public static final int PLAYING_CARDS_ID = 204; // 0xcc
- field public static final android.icu.lang.UCharacter.UnicodeBlock PRIVATE_USE;
- field public static final android.icu.lang.UCharacter.UnicodeBlock PRIVATE_USE_AREA;
- field public static final int PRIVATE_USE_AREA_ID = 78; // 0x4e
- field public static final int PRIVATE_USE_ID = 78; // 0x4e
- field public static final android.icu.lang.UCharacter.UnicodeBlock PSALTER_PAHLAVI;
- field public static final int PSALTER_PAHLAVI_ID = 246; // 0xf6
- field public static final android.icu.lang.UCharacter.UnicodeBlock REJANG;
- field public static final int REJANG_ID = 163; // 0xa3
- field public static final android.icu.lang.UCharacter.UnicodeBlock RUMI_NUMERAL_SYMBOLS;
- field public static final int RUMI_NUMERAL_SYMBOLS_ID = 192; // 0xc0
- field public static final android.icu.lang.UCharacter.UnicodeBlock RUNIC;
- field public static final int RUNIC_ID = 35; // 0x23
- field public static final android.icu.lang.UCharacter.UnicodeBlock SAMARITAN;
- field public static final int SAMARITAN_ID = 172; // 0xac
- field public static final android.icu.lang.UCharacter.UnicodeBlock SAURASHTRA;
- field public static final int SAURASHTRA_ID = 161; // 0xa1
- field public static final android.icu.lang.UCharacter.UnicodeBlock SHARADA;
- field public static final int SHARADA_ID = 217; // 0xd9
- field public static final android.icu.lang.UCharacter.UnicodeBlock SHAVIAN;
- field public static final int SHAVIAN_ID = 121; // 0x79
- field public static final android.icu.lang.UCharacter.UnicodeBlock SHORTHAND_FORMAT_CONTROLS;
- field public static final int SHORTHAND_FORMAT_CONTROLS_ID = 247; // 0xf7
- field public static final android.icu.lang.UCharacter.UnicodeBlock SIDDHAM;
- field public static final int SIDDHAM_ID = 248; // 0xf8
- field public static final android.icu.lang.UCharacter.UnicodeBlock SINHALA;
- field public static final android.icu.lang.UCharacter.UnicodeBlock SINHALA_ARCHAIC_NUMBERS;
- field public static final int SINHALA_ARCHAIC_NUMBERS_ID = 249; // 0xf9
- field public static final int SINHALA_ID = 24; // 0x18
- field public static final android.icu.lang.UCharacter.UnicodeBlock SMALL_FORM_VARIANTS;
- field public static final int SMALL_FORM_VARIANTS_ID = 84; // 0x54
- field public static final android.icu.lang.UCharacter.UnicodeBlock SMALL_KANA_EXTENSION;
- field public static final int SMALL_KANA_EXTENSION_ID = 297; // 0x129
- field public static final android.icu.lang.UCharacter.UnicodeBlock SOGDIAN;
- field public static final int SOGDIAN_ID = 291; // 0x123
- field public static final android.icu.lang.UCharacter.UnicodeBlock SORA_SOMPENG;
- field public static final int SORA_SOMPENG_ID = 218; // 0xda
- field public static final android.icu.lang.UCharacter.UnicodeBlock SOYOMBO;
- field public static final int SOYOMBO_ID = 278; // 0x116
- field public static final android.icu.lang.UCharacter.UnicodeBlock SPACING_MODIFIER_LETTERS;
- field public static final int SPACING_MODIFIER_LETTERS_ID = 6; // 0x6
- field public static final android.icu.lang.UCharacter.UnicodeBlock SPECIALS;
- field public static final int SPECIALS_ID = 86; // 0x56
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUNDANESE;
- field public static final int SUNDANESE_ID = 155; // 0x9b
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUNDANESE_SUPPLEMENT;
- field public static final int SUNDANESE_SUPPLEMENT_ID = 219; // 0xdb
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPERSCRIPTS_AND_SUBSCRIPTS;
- field public static final int SUPERSCRIPTS_AND_SUBSCRIPTS_ID = 41; // 0x29
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_ARROWS_A;
- field public static final int SUPPLEMENTAL_ARROWS_A_ID = 103; // 0x67
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_ARROWS_B;
- field public static final int SUPPLEMENTAL_ARROWS_B_ID = 104; // 0x68
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_ARROWS_C;
- field public static final int SUPPLEMENTAL_ARROWS_C_ID = 250; // 0xfa
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_MATHEMATICAL_OPERATORS;
- field public static final int SUPPLEMENTAL_MATHEMATICAL_OPERATORS_ID = 106; // 0x6a
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_PUNCTUATION;
- field public static final int SUPPLEMENTAL_PUNCTUATION_ID = 142; // 0x8e
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS;
- field public static final int SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS_ID = 261; // 0x105
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_A;
- field public static final int SUPPLEMENTARY_PRIVATE_USE_AREA_A_ID = 109; // 0x6d
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_B;
- field public static final int SUPPLEMENTARY_PRIVATE_USE_AREA_B_ID = 110; // 0x6e
- field public static final android.icu.lang.UCharacter.UnicodeBlock SUTTON_SIGNWRITING;
- field public static final int SUTTON_SIGNWRITING_ID = 262; // 0x106
- field public static final android.icu.lang.UCharacter.UnicodeBlock SYLOTI_NAGRI;
- field public static final int SYLOTI_NAGRI_ID = 143; // 0x8f
- field public static final android.icu.lang.UCharacter.UnicodeBlock SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A;
- field public static final int SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A_ID = 298; // 0x12a
- field public static final android.icu.lang.UCharacter.UnicodeBlock SYMBOLS_FOR_LEGACY_COMPUTING;
- field public static final int SYMBOLS_FOR_LEGACY_COMPUTING_ID = 306; // 0x132
- field public static final android.icu.lang.UCharacter.UnicodeBlock SYRIAC;
- field public static final int SYRIAC_ID = 13; // 0xd
- field public static final android.icu.lang.UCharacter.UnicodeBlock SYRIAC_SUPPLEMENT;
- field public static final int SYRIAC_SUPPLEMENT_ID = 279; // 0x117
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAGALOG;
- field public static final int TAGALOG_ID = 98; // 0x62
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAGBANWA;
- field public static final int TAGBANWA_ID = 101; // 0x65
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAGS;
- field public static final int TAGS_ID = 96; // 0x60
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_LE;
- field public static final int TAI_LE_ID = 112; // 0x70
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_THAM;
- field public static final int TAI_THAM_ID = 174; // 0xae
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_VIET;
- field public static final int TAI_VIET_ID = 183; // 0xb7
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_XUAN_JING_SYMBOLS;
- field public static final int TAI_XUAN_JING_SYMBOLS_ID = 124; // 0x7c
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAKRI;
- field public static final int TAKRI_ID = 220; // 0xdc
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAMIL;
- field public static final int TAMIL_ID = 20; // 0x14
- field public static final android.icu.lang.UCharacter.UnicodeBlock TAMIL_SUPPLEMENT;
- field public static final int TAMIL_SUPPLEMENT_ID = 299; // 0x12b
- field public static final android.icu.lang.UCharacter.UnicodeBlock TANGUT;
- field public static final android.icu.lang.UCharacter.UnicodeBlock TANGUT_COMPONENTS;
- field public static final int TANGUT_COMPONENTS_ID = 273; // 0x111
- field public static final int TANGUT_ID = 272; // 0x110
- field public static final android.icu.lang.UCharacter.UnicodeBlock TANGUT_SUPPLEMENT;
- field public static final int TANGUT_SUPPLEMENT_ID = 307; // 0x133
- field public static final android.icu.lang.UCharacter.UnicodeBlock TELUGU;
- field public static final int TELUGU_ID = 21; // 0x15
- field public static final android.icu.lang.UCharacter.UnicodeBlock THAANA;
- field public static final int THAANA_ID = 14; // 0xe
- field public static final android.icu.lang.UCharacter.UnicodeBlock THAI;
- field public static final int THAI_ID = 25; // 0x19
- field public static final android.icu.lang.UCharacter.UnicodeBlock TIBETAN;
- field public static final int TIBETAN_ID = 27; // 0x1b
- field public static final android.icu.lang.UCharacter.UnicodeBlock TIFINAGH;
- field public static final int TIFINAGH_ID = 144; // 0x90
- field public static final android.icu.lang.UCharacter.UnicodeBlock TIRHUTA;
- field public static final int TIRHUTA_ID = 251; // 0xfb
- field public static final android.icu.lang.UCharacter.UnicodeBlock TRANSPORT_AND_MAP_SYMBOLS;
- field public static final int TRANSPORT_AND_MAP_SYMBOLS_ID = 207; // 0xcf
- field public static final android.icu.lang.UCharacter.UnicodeBlock UGARITIC;
- field public static final int UGARITIC_ID = 120; // 0x78
- field public static final android.icu.lang.UCharacter.UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS;
- field public static final android.icu.lang.UCharacter.UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED;
- field public static final int UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_ID = 173; // 0xad
- field public static final int UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_ID = 33; // 0x21
- field public static final android.icu.lang.UCharacter.UnicodeBlock VAI;
- field public static final int VAI_ID = 159; // 0x9f
- field public static final android.icu.lang.UCharacter.UnicodeBlock VARIATION_SELECTORS;
- field public static final int VARIATION_SELECTORS_ID = 108; // 0x6c
- field public static final android.icu.lang.UCharacter.UnicodeBlock VARIATION_SELECTORS_SUPPLEMENT;
- field public static final int VARIATION_SELECTORS_SUPPLEMENT_ID = 125; // 0x7d
- field public static final android.icu.lang.UCharacter.UnicodeBlock VEDIC_EXTENSIONS;
- field public static final int VEDIC_EXTENSIONS_ID = 175; // 0xaf
- field public static final android.icu.lang.UCharacter.UnicodeBlock VERTICAL_FORMS;
- field public static final int VERTICAL_FORMS_ID = 145; // 0x91
- field public static final android.icu.lang.UCharacter.UnicodeBlock WANCHO;
- field public static final int WANCHO_ID = 300; // 0x12c
- field public static final android.icu.lang.UCharacter.UnicodeBlock WARANG_CITI;
- field public static final int WARANG_CITI_ID = 252; // 0xfc
- field public static final android.icu.lang.UCharacter.UnicodeBlock YEZIDI;
- field public static final int YEZIDI_ID = 308; // 0x134
- field public static final android.icu.lang.UCharacter.UnicodeBlock YIJING_HEXAGRAM_SYMBOLS;
- field public static final int YIJING_HEXAGRAM_SYMBOLS_ID = 116; // 0x74
- field public static final android.icu.lang.UCharacter.UnicodeBlock YI_RADICALS;
- field public static final int YI_RADICALS_ID = 73; // 0x49
- field public static final android.icu.lang.UCharacter.UnicodeBlock YI_SYLLABLES;
- field public static final int YI_SYLLABLES_ID = 72; // 0x48
- field public static final android.icu.lang.UCharacter.UnicodeBlock ZANABAZAR_SQUARE;
- field public static final int ZANABAZAR_SQUARE_ID = 280; // 0x118
- }
-
- public static interface UCharacter.VerticalOrientation {
- field public static final int ROTATED = 0; // 0x0
- field public static final int TRANSFORMED_ROTATED = 1; // 0x1
- field public static final int TRANSFORMED_UPRIGHT = 2; // 0x2
- field public static final int UPRIGHT = 3; // 0x3
- }
-
- public static interface UCharacter.WordBreak {
- field public static final int ALETTER = 1; // 0x1
- field public static final int CR = 8; // 0x8
- field public static final int DOUBLE_QUOTE = 16; // 0x10
- field public static final int EXTEND = 9; // 0x9
- field public static final int EXTENDNUMLET = 7; // 0x7
- field public static final int E_BASE = 17; // 0x11
- field public static final int E_BASE_GAZ = 18; // 0x12
- field public static final int E_MODIFIER = 19; // 0x13
- field public static final int FORMAT = 2; // 0x2
- field public static final int GLUE_AFTER_ZWJ = 20; // 0x14
- field public static final int HEBREW_LETTER = 14; // 0xe
- field public static final int KATAKANA = 3; // 0x3
- field public static final int LF = 10; // 0xa
- field public static final int MIDLETTER = 4; // 0x4
- field public static final int MIDNUM = 5; // 0x5
- field public static final int MIDNUMLET = 11; // 0xb
- field public static final int NEWLINE = 12; // 0xc
- field public static final int NUMERIC = 6; // 0x6
- field public static final int OTHER = 0; // 0x0
- field public static final int REGIONAL_INDICATOR = 13; // 0xd
- field public static final int SINGLE_QUOTE = 15; // 0xf
- field public static final int WSEGSPACE = 22; // 0x16
- field public static final int ZWJ = 21; // 0x15
- }
-
- public final class UCharacterCategory implements android.icu.lang.UCharacterEnums.ECharacterCategory {
- method public static String toString(int);
- }
-
- public final class UCharacterDirection implements android.icu.lang.UCharacterEnums.ECharacterDirection {
- method public static String toString(int);
- }
-
- public class UCharacterEnums {
- }
-
- public static interface UCharacterEnums.ECharacterCategory {
- field public static final byte COMBINING_SPACING_MARK = 8; // 0x8
- field public static final byte CONNECTOR_PUNCTUATION = 22; // 0x16
- field public static final byte CONTROL = 15; // 0xf
- field public static final byte CURRENCY_SYMBOL = 25; // 0x19
- field public static final byte DASH_PUNCTUATION = 19; // 0x13
- field public static final byte DECIMAL_DIGIT_NUMBER = 9; // 0x9
- field public static final byte ENCLOSING_MARK = 7; // 0x7
- field public static final byte END_PUNCTUATION = 21; // 0x15
- field public static final byte FINAL_PUNCTUATION = 29; // 0x1d
- field public static final byte FINAL_QUOTE_PUNCTUATION = 29; // 0x1d
- field public static final byte FORMAT = 16; // 0x10
- field public static final byte GENERAL_OTHER_TYPES = 0; // 0x0
- field public static final byte INITIAL_PUNCTUATION = 28; // 0x1c
- field public static final byte INITIAL_QUOTE_PUNCTUATION = 28; // 0x1c
- field public static final byte LETTER_NUMBER = 10; // 0xa
- field public static final byte LINE_SEPARATOR = 13; // 0xd
- field public static final byte LOWERCASE_LETTER = 2; // 0x2
- field public static final byte MATH_SYMBOL = 24; // 0x18
- field public static final byte MODIFIER_LETTER = 4; // 0x4
- field public static final byte MODIFIER_SYMBOL = 26; // 0x1a
- field public static final byte NON_SPACING_MARK = 6; // 0x6
- field public static final byte OTHER_LETTER = 5; // 0x5
- field public static final byte OTHER_NUMBER = 11; // 0xb
- field public static final byte OTHER_PUNCTUATION = 23; // 0x17
- field public static final byte OTHER_SYMBOL = 27; // 0x1b
- field public static final byte PARAGRAPH_SEPARATOR = 14; // 0xe
- field public static final byte PRIVATE_USE = 17; // 0x11
- field public static final byte SPACE_SEPARATOR = 12; // 0xc
- field public static final byte START_PUNCTUATION = 20; // 0x14
- field public static final byte SURROGATE = 18; // 0x12
- field public static final byte TITLECASE_LETTER = 3; // 0x3
- field public static final byte UNASSIGNED = 0; // 0x0
- field public static final byte UPPERCASE_LETTER = 1; // 0x1
- }
-
- public static interface UCharacterEnums.ECharacterDirection {
- field public static final int ARABIC_NUMBER = 5; // 0x5
- field public static final int BLOCK_SEPARATOR = 7; // 0x7
- field public static final int BOUNDARY_NEUTRAL = 18; // 0x12
- field public static final int COMMON_NUMBER_SEPARATOR = 6; // 0x6
- field public static final byte DIRECTIONALITY_ARABIC_NUMBER = 5; // 0x5
- field public static final byte DIRECTIONALITY_BOUNDARY_NEUTRAL = 18; // 0x12
- field public static final byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR = 6; // 0x6
- field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER = 2; // 0x2
- field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR = 3; // 0x3
- field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR = 4; // 0x4
- field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT = 0; // 0x0
- field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING = 11; // 0xb
- field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE = 12; // 0xc
- field public static final byte DIRECTIONALITY_NONSPACING_MARK = 17; // 0x11
- field public static final byte DIRECTIONALITY_OTHER_NEUTRALS = 10; // 0xa
- field public static final byte DIRECTIONALITY_PARAGRAPH_SEPARATOR = 7; // 0x7
- field public static final byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT = 16; // 0x10
- field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT = 1; // 0x1
- field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC = 13; // 0xd
- field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING = 14; // 0xe
- field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE = 15; // 0xf
- field public static final byte DIRECTIONALITY_SEGMENT_SEPARATOR = 8; // 0x8
- field public static final byte DIRECTIONALITY_UNDEFINED = -1; // 0xffffffff
- field public static final byte DIRECTIONALITY_WHITESPACE = 9; // 0x9
- field public static final int DIR_NON_SPACING_MARK = 17; // 0x11
- field public static final int EUROPEAN_NUMBER = 2; // 0x2
- field public static final int EUROPEAN_NUMBER_SEPARATOR = 3; // 0x3
- field public static final int EUROPEAN_NUMBER_TERMINATOR = 4; // 0x4
- field public static final byte FIRST_STRONG_ISOLATE = 19; // 0x13
- field public static final int LEFT_TO_RIGHT = 0; // 0x0
- field public static final int LEFT_TO_RIGHT_EMBEDDING = 11; // 0xb
- field public static final byte LEFT_TO_RIGHT_ISOLATE = 20; // 0x14
- field public static final int LEFT_TO_RIGHT_OVERRIDE = 12; // 0xc
- field public static final int OTHER_NEUTRAL = 10; // 0xa
- field public static final int POP_DIRECTIONAL_FORMAT = 16; // 0x10
- field public static final byte POP_DIRECTIONAL_ISOLATE = 22; // 0x16
- field public static final int RIGHT_TO_LEFT = 1; // 0x1
- field public static final int RIGHT_TO_LEFT_ARABIC = 13; // 0xd
- field public static final int RIGHT_TO_LEFT_EMBEDDING = 14; // 0xe
- field public static final byte RIGHT_TO_LEFT_ISOLATE = 21; // 0x15
- field public static final int RIGHT_TO_LEFT_OVERRIDE = 15; // 0xf
- field public static final int SEGMENT_SEPARATOR = 8; // 0x8
- field public static final int WHITE_SPACE_NEUTRAL = 9; // 0x9
- }
-
- public interface UProperty {
- field public static final int AGE = 16384; // 0x4000
- field public static final int ALPHABETIC = 0; // 0x0
- field public static final int ASCII_HEX_DIGIT = 1; // 0x1
- field public static final int BIDI_CLASS = 4096; // 0x1000
- field public static final int BIDI_CONTROL = 2; // 0x2
- field public static final int BIDI_MIRRORED = 3; // 0x3
- field public static final int BIDI_MIRRORING_GLYPH = 16385; // 0x4001
- field public static final int BIDI_PAIRED_BRACKET = 16397; // 0x400d
- field public static final int BIDI_PAIRED_BRACKET_TYPE = 4117; // 0x1015
- field public static final int BINARY_START = 0; // 0x0
- field public static final int BLOCK = 4097; // 0x1001
- field public static final int CANONICAL_COMBINING_CLASS = 4098; // 0x1002
- field public static final int CASED = 49; // 0x31
- field public static final int CASE_FOLDING = 16386; // 0x4002
- field public static final int CASE_IGNORABLE = 50; // 0x32
- field public static final int CASE_SENSITIVE = 34; // 0x22
- field public static final int CHANGES_WHEN_CASEFOLDED = 54; // 0x36
- field public static final int CHANGES_WHEN_CASEMAPPED = 55; // 0x37
- field public static final int CHANGES_WHEN_LOWERCASED = 51; // 0x33
- field public static final int CHANGES_WHEN_NFKC_CASEFOLDED = 56; // 0x38
- field public static final int CHANGES_WHEN_TITLECASED = 53; // 0x35
- field public static final int CHANGES_WHEN_UPPERCASED = 52; // 0x34
- field public static final int DASH = 4; // 0x4
- field public static final int DECOMPOSITION_TYPE = 4099; // 0x1003
- field public static final int DEFAULT_IGNORABLE_CODE_POINT = 5; // 0x5
- field public static final int DEPRECATED = 6; // 0x6
- field public static final int DIACRITIC = 7; // 0x7
- field public static final int DOUBLE_START = 12288; // 0x3000
- field public static final int EAST_ASIAN_WIDTH = 4100; // 0x1004
- field public static final int EMOJI = 57; // 0x39
- field public static final int EMOJI_COMPONENT = 61; // 0x3d
- field public static final int EMOJI_MODIFIER = 59; // 0x3b
- field public static final int EMOJI_MODIFIER_BASE = 60; // 0x3c
- field public static final int EMOJI_PRESENTATION = 58; // 0x3a
- field public static final int EXTENDED_PICTOGRAPHIC = 64; // 0x40
- field public static final int EXTENDER = 8; // 0x8
- field public static final int FULL_COMPOSITION_EXCLUSION = 9; // 0x9
- field public static final int GENERAL_CATEGORY = 4101; // 0x1005
- field public static final int GENERAL_CATEGORY_MASK = 8192; // 0x2000
- field public static final int GRAPHEME_BASE = 10; // 0xa
- field public static final int GRAPHEME_CLUSTER_BREAK = 4114; // 0x1012
- field public static final int GRAPHEME_EXTEND = 11; // 0xb
- field public static final int GRAPHEME_LINK = 12; // 0xc
- field public static final int HANGUL_SYLLABLE_TYPE = 4107; // 0x100b
- field public static final int HEX_DIGIT = 13; // 0xd
- field public static final int HYPHEN = 14; // 0xe
- field public static final int IDEOGRAPHIC = 17; // 0x11
- field public static final int IDS_BINARY_OPERATOR = 18; // 0x12
- field public static final int IDS_TRINARY_OPERATOR = 19; // 0x13
- field public static final int ID_CONTINUE = 15; // 0xf
- field public static final int ID_START = 16; // 0x10
- field public static final int INDIC_POSITIONAL_CATEGORY = 4118; // 0x1016
- field public static final int INDIC_SYLLABIC_CATEGORY = 4119; // 0x1017
- field public static final int INT_START = 4096; // 0x1000
- field public static final int JOINING_GROUP = 4102; // 0x1006
- field public static final int JOINING_TYPE = 4103; // 0x1007
- field public static final int JOIN_CONTROL = 20; // 0x14
- field public static final int LEAD_CANONICAL_COMBINING_CLASS = 4112; // 0x1010
- field public static final int LINE_BREAK = 4104; // 0x1008
- field public static final int LOGICAL_ORDER_EXCEPTION = 21; // 0x15
- field public static final int LOWERCASE = 22; // 0x16
- field public static final int LOWERCASE_MAPPING = 16388; // 0x4004
- field public static final int MASK_START = 8192; // 0x2000
- field public static final int MATH = 23; // 0x17
- field public static final int NAME = 16389; // 0x4005
- field public static final int NFC_INERT = 39; // 0x27
- field public static final int NFC_QUICK_CHECK = 4110; // 0x100e
- field public static final int NFD_INERT = 37; // 0x25
- field public static final int NFD_QUICK_CHECK = 4108; // 0x100c
- field public static final int NFKC_INERT = 40; // 0x28
- field public static final int NFKC_QUICK_CHECK = 4111; // 0x100f
- field public static final int NFKD_INERT = 38; // 0x26
- field public static final int NFKD_QUICK_CHECK = 4109; // 0x100d
- field public static final int NONCHARACTER_CODE_POINT = 24; // 0x18
- field public static final int NUMERIC_TYPE = 4105; // 0x1009
- field public static final int NUMERIC_VALUE = 12288; // 0x3000
- field public static final int OTHER_PROPERTY_START = 28672; // 0x7000
- field public static final int PATTERN_SYNTAX = 42; // 0x2a
- field public static final int PATTERN_WHITE_SPACE = 43; // 0x2b
- field public static final int POSIX_ALNUM = 44; // 0x2c
- field public static final int POSIX_BLANK = 45; // 0x2d
- field public static final int POSIX_GRAPH = 46; // 0x2e
- field public static final int POSIX_PRINT = 47; // 0x2f
- field public static final int POSIX_XDIGIT = 48; // 0x30
- field public static final int PREPENDED_CONCATENATION_MARK = 63; // 0x3f
- field public static final int QUOTATION_MARK = 25; // 0x19
- field public static final int RADICAL = 26; // 0x1a
- field public static final int REGIONAL_INDICATOR = 62; // 0x3e
- field public static final int SCRIPT = 4106; // 0x100a
- field public static final int SCRIPT_EXTENSIONS = 28672; // 0x7000
- field public static final int SEGMENT_STARTER = 41; // 0x29
- field public static final int SENTENCE_BREAK = 4115; // 0x1013
- field public static final int SIMPLE_CASE_FOLDING = 16390; // 0x4006
- field public static final int SIMPLE_LOWERCASE_MAPPING = 16391; // 0x4007
- field public static final int SIMPLE_TITLECASE_MAPPING = 16392; // 0x4008
- field public static final int SIMPLE_UPPERCASE_MAPPING = 16393; // 0x4009
- field public static final int SOFT_DOTTED = 27; // 0x1b
- field public static final int STRING_START = 16384; // 0x4000
- field public static final int S_TERM = 35; // 0x23
- field public static final int TERMINAL_PUNCTUATION = 28; // 0x1c
- field public static final int TITLECASE_MAPPING = 16394; // 0x400a
- field public static final int TRAIL_CANONICAL_COMBINING_CLASS = 4113; // 0x1011
- field public static final int UNIFIED_IDEOGRAPH = 29; // 0x1d
- field public static final int UPPERCASE = 30; // 0x1e
- field public static final int UPPERCASE_MAPPING = 16396; // 0x400c
- field public static final int VARIATION_SELECTOR = 36; // 0x24
- field public static final int VERTICAL_ORIENTATION = 4120; // 0x1018
- field public static final int WHITE_SPACE = 31; // 0x1f
- field public static final int WORD_BREAK = 4116; // 0x1014
- field public static final int XID_CONTINUE = 32; // 0x20
- field public static final int XID_START = 33; // 0x21
- }
-
- public static interface UProperty.NameChoice {
- field public static final int LONG = 1; // 0x1
- field public static final int SHORT = 0; // 0x0
- }
-
- public final class UScript {
- method public static boolean breaksBetweenLetters(int);
- method public static int[] getCode(java.util.Locale);
- method public static int[] getCode(android.icu.util.ULocale);
- method public static int[] getCode(String);
- method public static int getCodeFromName(String);
- method public static String getName(int);
- method public static String getSampleString(int);
- method public static int getScript(int);
- method public static int getScriptExtensions(int, java.util.BitSet);
- method public static String getShortName(int);
- method public static android.icu.lang.UScript.ScriptUsage getUsage(int);
- method public static boolean hasScript(int, int);
- method public static boolean isCased(int);
- method public static boolean isRightToLeft(int);
- field public static final int ADLAM = 167; // 0xa7
- field public static final int AFAKA = 147; // 0x93
- field public static final int AHOM = 161; // 0xa1
- field public static final int ANATOLIAN_HIEROGLYPHS = 156; // 0x9c
- field public static final int ARABIC = 2; // 0x2
- field public static final int ARMENIAN = 3; // 0x3
- field public static final int AVESTAN = 117; // 0x75
- field public static final int BALINESE = 62; // 0x3e
- field public static final int BAMUM = 130; // 0x82
- field public static final int BASSA_VAH = 134; // 0x86
- field public static final int BATAK = 63; // 0x3f
- field public static final int BENGALI = 4; // 0x4
- field public static final int BHAIKSUKI = 168; // 0xa8
- field public static final int BLISSYMBOLS = 64; // 0x40
- field public static final int BOOK_PAHLAVI = 124; // 0x7c
- field public static final int BOPOMOFO = 5; // 0x5
- field public static final int BRAHMI = 65; // 0x41
- field public static final int BRAILLE = 46; // 0x2e
- field public static final int BUGINESE = 55; // 0x37
- field public static final int BUHID = 44; // 0x2c
- field public static final int CANADIAN_ABORIGINAL = 40; // 0x28
- field public static final int CARIAN = 104; // 0x68
- field public static final int CAUCASIAN_ALBANIAN = 159; // 0x9f
- field public static final int CHAKMA = 118; // 0x76
- field public static final int CHAM = 66; // 0x42
- field public static final int CHEROKEE = 6; // 0x6
- field public static final int CHORASMIAN = 189; // 0xbd
- field public static final int CIRTH = 67; // 0x43
- field public static final int COMMON = 0; // 0x0
- field public static final int COPTIC = 7; // 0x7
- field public static final int CUNEIFORM = 101; // 0x65
- field public static final int CYPRIOT = 47; // 0x2f
- field public static final int CYRILLIC = 8; // 0x8
- field public static final int DEMOTIC_EGYPTIAN = 69; // 0x45
- field public static final int DESERET = 9; // 0x9
- field public static final int DEVANAGARI = 10; // 0xa
- field public static final int DIVES_AKURU = 190; // 0xbe
- field public static final int DOGRA = 178; // 0xb2
- field public static final int DUPLOYAN = 135; // 0x87
- field public static final int EASTERN_SYRIAC = 97; // 0x61
- field public static final int EGYPTIAN_HIEROGLYPHS = 71; // 0x47
- field public static final int ELBASAN = 136; // 0x88
- field public static final int ELYMAIC = 185; // 0xb9
- field public static final int ESTRANGELO_SYRIAC = 95; // 0x5f
- field public static final int ETHIOPIC = 11; // 0xb
- field public static final int GEORGIAN = 12; // 0xc
- field public static final int GLAGOLITIC = 56; // 0x38
- field public static final int GOTHIC = 13; // 0xd
- field public static final int GRANTHA = 137; // 0x89
- field public static final int GREEK = 14; // 0xe
- field public static final int GUJARATI = 15; // 0xf
- field public static final int GUNJALA_GONDI = 179; // 0xb3
- field public static final int GURMUKHI = 16; // 0x10
- field public static final int HAN = 17; // 0x11
- field public static final int HANGUL = 18; // 0x12
- field public static final int HANIFI_ROHINGYA = 182; // 0xb6
- field public static final int HANUNOO = 43; // 0x2b
- field public static final int HAN_WITH_BOPOMOFO = 172; // 0xac
- field public static final int HARAPPAN_INDUS = 77; // 0x4d
- field public static final int HATRAN = 162; // 0xa2
- field public static final int HEBREW = 19; // 0x13
- field public static final int HIERATIC_EGYPTIAN = 70; // 0x46
- field public static final int HIRAGANA = 20; // 0x14
- field public static final int IMPERIAL_ARAMAIC = 116; // 0x74
- field public static final int INHERITED = 1; // 0x1
- field public static final int INSCRIPTIONAL_PAHLAVI = 122; // 0x7a
- field public static final int INSCRIPTIONAL_PARTHIAN = 125; // 0x7d
- field public static final int INVALID_CODE = -1; // 0xffffffff
- field public static final int JAMO = 173; // 0xad
- field public static final int JAPANESE = 105; // 0x69
- field public static final int JAVANESE = 78; // 0x4e
- field public static final int JURCHEN = 148; // 0x94
- field public static final int KAITHI = 120; // 0x78
- field public static final int KANNADA = 21; // 0x15
- field public static final int KATAKANA = 22; // 0x16
- field public static final int KATAKANA_OR_HIRAGANA = 54; // 0x36
- field public static final int KAYAH_LI = 79; // 0x4f
- field public static final int KHAROSHTHI = 57; // 0x39
- field public static final int KHITAN_SMALL_SCRIPT = 191; // 0xbf
- field public static final int KHMER = 23; // 0x17
- field public static final int KHOJKI = 157; // 0x9d
- field public static final int KHUDAWADI = 145; // 0x91
- field public static final int KHUTSURI = 72; // 0x48
- field public static final int KOREAN = 119; // 0x77
- field public static final int KPELLE = 138; // 0x8a
- field public static final int LANNA = 106; // 0x6a
- field public static final int LAO = 24; // 0x18
- field public static final int LATIN = 25; // 0x19
- field public static final int LATIN_FRAKTUR = 80; // 0x50
- field public static final int LATIN_GAELIC = 81; // 0x51
- field public static final int LEPCHA = 82; // 0x52
- field public static final int LIMBU = 48; // 0x30
- field public static final int LINEAR_A = 83; // 0x53
- field public static final int LINEAR_B = 49; // 0x31
- field public static final int LISU = 131; // 0x83
- field public static final int LOMA = 139; // 0x8b
- field public static final int LYCIAN = 107; // 0x6b
- field public static final int LYDIAN = 108; // 0x6c
- field public static final int MAHAJANI = 160; // 0xa0
- field public static final int MAKASAR = 180; // 0xb4
- field public static final int MALAYALAM = 26; // 0x1a
- field public static final int MANDAEAN = 84; // 0x54
- field public static final int MANDAIC = 84; // 0x54
- field public static final int MANICHAEAN = 121; // 0x79
- field public static final int MARCHEN = 169; // 0xa9
- field public static final int MASARAM_GONDI = 175; // 0xaf
- field public static final int MATHEMATICAL_NOTATION = 128; // 0x80
- field public static final int MAYAN_HIEROGLYPHS = 85; // 0x55
- field public static final int MEDEFAIDRIN = 181; // 0xb5
- field public static final int MEITEI_MAYEK = 115; // 0x73
- field public static final int MENDE = 140; // 0x8c
- field public static final int MEROITIC = 86; // 0x56
- field public static final int MEROITIC_CURSIVE = 141; // 0x8d
- field public static final int MEROITIC_HIEROGLYPHS = 86; // 0x56
- field public static final int MIAO = 92; // 0x5c
- field public static final int MODI = 163; // 0xa3
- field public static final int MONGOLIAN = 27; // 0x1b
- field public static final int MOON = 114; // 0x72
- field public static final int MRO = 149; // 0x95
- field public static final int MULTANI = 164; // 0xa4
- field public static final int MYANMAR = 28; // 0x1c
- field public static final int NABATAEAN = 143; // 0x8f
- field public static final int NAKHI_GEBA = 132; // 0x84
- field public static final int NANDINAGARI = 187; // 0xbb
- field public static final int NEWA = 170; // 0xaa
- field public static final int NEW_TAI_LUE = 59; // 0x3b
- field public static final int NKO = 87; // 0x57
- field public static final int NUSHU = 150; // 0x96
- field public static final int NYIAKENG_PUACHUE_HMONG = 186; // 0xba
- field public static final int OGHAM = 29; // 0x1d
- field public static final int OLD_CHURCH_SLAVONIC_CYRILLIC = 68; // 0x44
- field public static final int OLD_HUNGARIAN = 76; // 0x4c
- field public static final int OLD_ITALIC = 30; // 0x1e
- field public static final int OLD_NORTH_ARABIAN = 142; // 0x8e
- field public static final int OLD_PERMIC = 89; // 0x59
- field public static final int OLD_PERSIAN = 61; // 0x3d
- field public static final int OLD_SOGDIAN = 184; // 0xb8
- field public static final int OLD_SOUTH_ARABIAN = 133; // 0x85
- field public static final int OL_CHIKI = 109; // 0x6d
- field public static final int ORIYA = 31; // 0x1f
- field public static final int ORKHON = 88; // 0x58
- field public static final int OSAGE = 171; // 0xab
- field public static final int OSMANYA = 50; // 0x32
- field public static final int PAHAWH_HMONG = 75; // 0x4b
- field public static final int PALMYRENE = 144; // 0x90
- field public static final int PAU_CIN_HAU = 165; // 0xa5
- field public static final int PHAGS_PA = 90; // 0x5a
- field public static final int PHOENICIAN = 91; // 0x5b
- field public static final int PHONETIC_POLLARD = 92; // 0x5c
- field public static final int PSALTER_PAHLAVI = 123; // 0x7b
- field public static final int REJANG = 110; // 0x6e
- field public static final int RONGORONGO = 93; // 0x5d
- field public static final int RUNIC = 32; // 0x20
- field public static final int SAMARITAN = 126; // 0x7e
- field public static final int SARATI = 94; // 0x5e
- field public static final int SAURASHTRA = 111; // 0x6f
- field public static final int SHARADA = 151; // 0x97
- field public static final int SHAVIAN = 51; // 0x33
- field public static final int SIDDHAM = 166; // 0xa6
- field public static final int SIGN_WRITING = 112; // 0x70
- field public static final int SIMPLIFIED_HAN = 73; // 0x49
- field public static final int SINDHI = 145; // 0x91
- field public static final int SINHALA = 33; // 0x21
- field public static final int SOGDIAN = 183; // 0xb7
- field public static final int SORA_SOMPENG = 152; // 0x98
- field public static final int SOYOMBO = 176; // 0xb0
- field public static final int SUNDANESE = 113; // 0x71
- field public static final int SYLOTI_NAGRI = 58; // 0x3a
- field public static final int SYMBOLS = 129; // 0x81
- field public static final int SYMBOLS_EMOJI = 174; // 0xae
- field public static final int SYRIAC = 34; // 0x22
- field public static final int TAGALOG = 42; // 0x2a
- field public static final int TAGBANWA = 45; // 0x2d
- field public static final int TAI_LE = 52; // 0x34
- field public static final int TAI_VIET = 127; // 0x7f
- field public static final int TAKRI = 153; // 0x99
- field public static final int TAMIL = 35; // 0x23
- field public static final int TANGUT = 154; // 0x9a
- field public static final int TELUGU = 36; // 0x24
- field public static final int TENGWAR = 98; // 0x62
- field public static final int THAANA = 37; // 0x25
- field public static final int THAI = 38; // 0x26
- field public static final int TIBETAN = 39; // 0x27
- field public static final int TIFINAGH = 60; // 0x3c
- field public static final int TIRHUTA = 158; // 0x9e
- field public static final int TRADITIONAL_HAN = 74; // 0x4a
- field public static final int UCAS = 40; // 0x28
- field public static final int UGARITIC = 53; // 0x35
- field public static final int UNKNOWN = 103; // 0x67
- field public static final int UNWRITTEN_LANGUAGES = 102; // 0x66
- field public static final int VAI = 99; // 0x63
- field public static final int VISIBLE_SPEECH = 100; // 0x64
- field public static final int WANCHO = 188; // 0xbc
- field public static final int WARANG_CITI = 146; // 0x92
- field public static final int WESTERN_SYRIAC = 96; // 0x60
- field public static final int WOLEAI = 155; // 0x9b
- field public static final int YEZIDI = 192; // 0xc0
- field public static final int YI = 41; // 0x29
- field public static final int ZANABAZAR_SQUARE = 177; // 0xb1
- }
-
- public enum UScript.ScriptUsage {
- enum_constant public static final android.icu.lang.UScript.ScriptUsage ASPIRATIONAL;
- enum_constant public static final android.icu.lang.UScript.ScriptUsage EXCLUDED;
- enum_constant public static final android.icu.lang.UScript.ScriptUsage LIMITED_USE;
- enum_constant public static final android.icu.lang.UScript.ScriptUsage NOT_ENCODED;
- enum_constant public static final android.icu.lang.UScript.ScriptUsage RECOMMENDED;
- enum_constant public static final android.icu.lang.UScript.ScriptUsage UNKNOWN;
- }
-
-}
-
-package android.icu.math {
-
- public class BigDecimal extends java.lang.Number implements java.lang.Comparable<android.icu.math.BigDecimal> java.io.Serializable {
- ctor public BigDecimal(java.math.BigDecimal);
- ctor public BigDecimal(java.math.BigInteger);
- ctor public BigDecimal(java.math.BigInteger, int);
- ctor public BigDecimal(char[]);
- ctor public BigDecimal(char[], int, int);
- ctor public BigDecimal(double);
- ctor public BigDecimal(int);
- ctor public BigDecimal(long);
- ctor public BigDecimal(String);
- method public android.icu.math.BigDecimal abs();
- method public android.icu.math.BigDecimal abs(android.icu.math.MathContext);
- method public android.icu.math.BigDecimal add(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal add(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public byte byteValueExact();
- method public int compareTo(android.icu.math.BigDecimal);
- method public int compareTo(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal, int);
- method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal, int, int);
- method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public android.icu.math.BigDecimal divideInteger(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal divideInteger(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public double doubleValue();
- method public float floatValue();
- method public String format(int, int);
- method public String format(int, int, int, int, int, int);
- method public int intValue();
- method public int intValueExact();
- method public long longValue();
- method public long longValueExact();
- method public android.icu.math.BigDecimal max(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal max(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public android.icu.math.BigDecimal min(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal min(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public android.icu.math.BigDecimal movePointLeft(int);
- method public android.icu.math.BigDecimal movePointRight(int);
- method public android.icu.math.BigDecimal multiply(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal multiply(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public android.icu.math.BigDecimal negate();
- method public android.icu.math.BigDecimal negate(android.icu.math.MathContext);
- method public android.icu.math.BigDecimal plus();
- method public android.icu.math.BigDecimal plus(android.icu.math.MathContext);
- method public android.icu.math.BigDecimal pow(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal pow(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public android.icu.math.BigDecimal remainder(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal remainder(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public int scale();
- method public android.icu.math.BigDecimal setScale(int);
- method public android.icu.math.BigDecimal setScale(int, int);
- method public short shortValueExact();
- method public int signum();
- method public android.icu.math.BigDecimal subtract(android.icu.math.BigDecimal);
- method public android.icu.math.BigDecimal subtract(android.icu.math.BigDecimal, android.icu.math.MathContext);
- method public java.math.BigDecimal toBigDecimal();
- method public java.math.BigInteger toBigInteger();
- method public java.math.BigInteger toBigIntegerExact();
- method public char[] toCharArray();
- method public java.math.BigInteger unscaledValue();
- method public static android.icu.math.BigDecimal valueOf(double);
- method public static android.icu.math.BigDecimal valueOf(long);
- method public static android.icu.math.BigDecimal valueOf(long, int);
- field public static final android.icu.math.BigDecimal ONE;
- field public static final int ROUND_CEILING = 2; // 0x2
- field public static final int ROUND_DOWN = 1; // 0x1
- field public static final int ROUND_FLOOR = 3; // 0x3
- field public static final int ROUND_HALF_DOWN = 5; // 0x5
- field public static final int ROUND_HALF_EVEN = 6; // 0x6
- field public static final int ROUND_HALF_UP = 4; // 0x4
- field public static final int ROUND_UNNECESSARY = 7; // 0x7
- field public static final int ROUND_UP = 0; // 0x0
- field public static final android.icu.math.BigDecimal TEN;
- field public static final android.icu.math.BigDecimal ZERO;
- }
-
- public final class MathContext implements java.io.Serializable {
- ctor public MathContext(int);
- ctor public MathContext(int, int);
- ctor public MathContext(int, int, boolean);
- ctor public MathContext(int, int, boolean, int);
- method public int getDigits();
- method public int getForm();
- method public boolean getLostDigits();
- method public int getRoundingMode();
- field public static final android.icu.math.MathContext DEFAULT;
- field public static final int ENGINEERING = 2; // 0x2
- field public static final int PLAIN = 0; // 0x0
- field public static final int ROUND_CEILING = 2; // 0x2
- field public static final int ROUND_DOWN = 1; // 0x1
- field public static final int ROUND_FLOOR = 3; // 0x3
- field public static final int ROUND_HALF_DOWN = 5; // 0x5
- field public static final int ROUND_HALF_EVEN = 6; // 0x6
- field public static final int ROUND_HALF_UP = 4; // 0x4
- field public static final int ROUND_UNNECESSARY = 7; // 0x7
- field public static final int ROUND_UP = 0; // 0x0
- field public static final int SCIENTIFIC = 1; // 0x1
- }
-
-}
-
-package android.icu.number {
-
- public class CompactNotation extends android.icu.number.Notation {
- }
-
- public abstract class CurrencyPrecision extends android.icu.number.Precision {
- method public android.icu.number.Precision withCurrency(android.icu.util.Currency);
- }
-
- public class FormattedNumber implements java.lang.CharSequence {
- method public char charAt(int);
- method public int length();
- method public CharSequence subSequence(int, int);
- method public java.math.BigDecimal toBigDecimal();
- method public java.text.AttributedCharacterIterator toCharacterIterator();
- }
-
- public class FormattedNumberRange implements java.lang.CharSequence {
- method public char charAt(int);
- method public java.math.BigDecimal getFirstBigDecimal();
- method public android.icu.number.NumberRangeFormatter.RangeIdentityResult getIdentityResult();
- method public java.math.BigDecimal getSecondBigDecimal();
- method public int length();
- method public CharSequence subSequence(int, int);
- method public java.text.AttributedCharacterIterator toCharacterIterator();
- }
-
- public abstract class FractionPrecision extends android.icu.number.Precision {
- method public android.icu.number.Precision withMaxDigits(int);
- method public android.icu.number.Precision withMinDigits(int);
- }
-
- public class IntegerWidth {
- method public android.icu.number.IntegerWidth truncateAt(int);
- method public static android.icu.number.IntegerWidth zeroFillTo(int);
- }
-
- public class LocalizedNumberFormatter extends android.icu.number.NumberFormatterSettings<android.icu.number.LocalizedNumberFormatter> {
- method public android.icu.number.FormattedNumber format(long);
- method public android.icu.number.FormattedNumber format(double);
- method public android.icu.number.FormattedNumber format(Number);
- method public android.icu.number.FormattedNumber format(android.icu.util.Measure);
- method public java.text.Format toFormat();
- }
-
- public class LocalizedNumberRangeFormatter extends android.icu.number.NumberRangeFormatterSettings<android.icu.number.LocalizedNumberRangeFormatter> {
- method public android.icu.number.FormattedNumberRange formatRange(int, int);
- method public android.icu.number.FormattedNumberRange formatRange(double, double);
- method public android.icu.number.FormattedNumberRange formatRange(Number, Number);
- }
-
- public class Notation {
- method public static android.icu.number.CompactNotation compactLong();
- method public static android.icu.number.CompactNotation compactShort();
- method public static android.icu.number.ScientificNotation engineering();
- method public static android.icu.number.ScientificNotation scientific();
- method public static android.icu.number.SimpleNotation simple();
- }
-
- public final class NumberFormatter {
- method public static android.icu.number.UnlocalizedNumberFormatter with();
- method public static android.icu.number.LocalizedNumberFormatter withLocale(java.util.Locale);
- method public static android.icu.number.LocalizedNumberFormatter withLocale(android.icu.util.ULocale);
- }
-
- public enum NumberFormatter.DecimalSeparatorDisplay {
- enum_constant public static final android.icu.number.NumberFormatter.DecimalSeparatorDisplay ALWAYS;
- enum_constant public static final android.icu.number.NumberFormatter.DecimalSeparatorDisplay AUTO;
- }
-
- public enum NumberFormatter.GroupingStrategy {
- enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy AUTO;
- enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy MIN2;
- enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy OFF;
- enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy ON_ALIGNED;
- enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy THOUSANDS;
- }
-
- public enum NumberFormatter.SignDisplay {
- enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ACCOUNTING;
- enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ACCOUNTING_ALWAYS;
- enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ACCOUNTING_EXCEPT_ZERO;
- enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ALWAYS;
- enum_constant public static final android.icu.number.NumberFormatter.SignDisplay AUTO;
- enum_constant public static final android.icu.number.NumberFormatter.SignDisplay EXCEPT_ZERO;
- enum_constant public static final android.icu.number.NumberFormatter.SignDisplay NEVER;
- }
-
- public enum NumberFormatter.UnitWidth {
- enum_constant public static final android.icu.number.NumberFormatter.UnitWidth FULL_NAME;
- enum_constant public static final android.icu.number.NumberFormatter.UnitWidth HIDDEN;
- enum_constant public static final android.icu.number.NumberFormatter.UnitWidth ISO_CODE;
- enum_constant public static final android.icu.number.NumberFormatter.UnitWidth NARROW;
- enum_constant public static final android.icu.number.NumberFormatter.UnitWidth SHORT;
- }
-
- public abstract class NumberFormatterSettings<T extends android.icu.number.NumberFormatterSettings<?>> {
- method public T decimal(android.icu.number.NumberFormatter.DecimalSeparatorDisplay);
- method public T grouping(android.icu.number.NumberFormatter.GroupingStrategy);
- method public T integerWidth(android.icu.number.IntegerWidth);
- method public T notation(android.icu.number.Notation);
- method public T perUnit(android.icu.util.MeasureUnit);
- method public T precision(android.icu.number.Precision);
- method public T roundingMode(java.math.RoundingMode);
- method public T scale(android.icu.number.Scale);
- method public T sign(android.icu.number.NumberFormatter.SignDisplay);
- method public T symbols(android.icu.text.DecimalFormatSymbols);
- method public T symbols(android.icu.text.NumberingSystem);
- method public T unit(android.icu.util.MeasureUnit);
- method public T unitWidth(android.icu.number.NumberFormatter.UnitWidth);
- }
-
- public abstract class NumberRangeFormatter {
- method public static android.icu.number.UnlocalizedNumberRangeFormatter with();
- method public static android.icu.number.LocalizedNumberRangeFormatter withLocale(java.util.Locale);
- method public static android.icu.number.LocalizedNumberRangeFormatter withLocale(android.icu.util.ULocale);
- }
-
- public enum NumberRangeFormatter.RangeCollapse {
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse ALL;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse AUTO;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse NONE;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse UNIT;
- }
-
- public enum NumberRangeFormatter.RangeIdentityFallback {
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback APPROXIMATELY;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback APPROXIMATELY_OR_SINGLE_VALUE;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback RANGE;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback SINGLE_VALUE;
- }
-
- public enum NumberRangeFormatter.RangeIdentityResult {
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityResult EQUAL_AFTER_ROUNDING;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityResult EQUAL_BEFORE_ROUNDING;
- enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityResult NOT_EQUAL;
- }
-
- public abstract class NumberRangeFormatterSettings<T extends android.icu.number.NumberRangeFormatterSettings<?>> {
- method public T collapse(android.icu.number.NumberRangeFormatter.RangeCollapse);
- method public T identityFallback(android.icu.number.NumberRangeFormatter.RangeIdentityFallback);
- method public T numberFormatterBoth(android.icu.number.UnlocalizedNumberFormatter);
- method public T numberFormatterFirst(android.icu.number.UnlocalizedNumberFormatter);
- method public T numberFormatterSecond(android.icu.number.UnlocalizedNumberFormatter);
- }
-
- public abstract class Precision {
- method public static android.icu.number.CurrencyPrecision currency(android.icu.util.Currency.CurrencyUsage);
- method public static android.icu.number.FractionPrecision fixedFraction(int);
- method public static android.icu.number.Precision fixedSignificantDigits(int);
- method public static android.icu.number.Precision increment(java.math.BigDecimal);
- method public static android.icu.number.FractionPrecision integer();
- method public static android.icu.number.FractionPrecision maxFraction(int);
- method public static android.icu.number.Precision maxSignificantDigits(int);
- method public static android.icu.number.FractionPrecision minFraction(int);
- method public static android.icu.number.FractionPrecision minMaxFraction(int, int);
- method public static android.icu.number.Precision minMaxSignificantDigits(int, int);
- method public static android.icu.number.Precision minSignificantDigits(int);
- method public static android.icu.number.Precision unlimited();
- }
-
- public class Scale {
- method public static android.icu.number.Scale byBigDecimal(java.math.BigDecimal);
- method public static android.icu.number.Scale byDouble(double);
- method public static android.icu.number.Scale byDoubleAndPowerOfTen(double, int);
- method public static android.icu.number.Scale none();
- method public static android.icu.number.Scale powerOfTen(int);
- }
-
- public class ScientificNotation extends android.icu.number.Notation {
- method public android.icu.number.ScientificNotation withExponentSignDisplay(android.icu.number.NumberFormatter.SignDisplay);
- method public android.icu.number.ScientificNotation withMinExponentDigits(int);
- }
-
- public class SimpleNotation extends android.icu.number.Notation {
- }
-
- public class UnlocalizedNumberFormatter extends android.icu.number.NumberFormatterSettings<android.icu.number.UnlocalizedNumberFormatter> {
- method public android.icu.number.LocalizedNumberFormatter locale(java.util.Locale);
- method public android.icu.number.LocalizedNumberFormatter locale(android.icu.util.ULocale);
- }
-
- public class UnlocalizedNumberRangeFormatter extends android.icu.number.NumberRangeFormatterSettings<android.icu.number.UnlocalizedNumberRangeFormatter> {
- method public android.icu.number.LocalizedNumberRangeFormatter locale(java.util.Locale);
- method public android.icu.number.LocalizedNumberRangeFormatter locale(android.icu.util.ULocale);
- }
-
-}
-
-package android.icu.text {
-
- public final class AlphabeticIndex<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Bucket<V>> {
- ctor public AlphabeticIndex(android.icu.util.ULocale);
- ctor public AlphabeticIndex(java.util.Locale);
- ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator);
- method public android.icu.text.AlphabeticIndex<V> addLabels(android.icu.text.UnicodeSet);
- method public android.icu.text.AlphabeticIndex<V> addLabels(android.icu.util.ULocale...);
- method public android.icu.text.AlphabeticIndex<V> addLabels(java.util.Locale...);
- method public android.icu.text.AlphabeticIndex<V> addRecord(CharSequence, V);
- method public android.icu.text.AlphabeticIndex.ImmutableIndex<V> buildImmutableIndex();
- method public android.icu.text.AlphabeticIndex<V> clearRecords();
- method public int getBucketCount();
- method public int getBucketIndex(CharSequence);
- method public java.util.List<java.lang.String> getBucketLabels();
- method public android.icu.text.RuleBasedCollator getCollator();
- method public String getInflowLabel();
- method public int getMaxLabelCount();
- method public String getOverflowLabel();
- method public int getRecordCount();
- method public String getUnderflowLabel();
- method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator();
- method public android.icu.text.AlphabeticIndex<V> setInflowLabel(String);
- method public android.icu.text.AlphabeticIndex<V> setMaxLabelCount(int);
- method public android.icu.text.AlphabeticIndex<V> setOverflowLabel(String);
- method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(String);
- }
-
- public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Record<V>> {
- method public String getLabel();
- method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType();
- method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator();
- method public int size();
- }
-
- public enum AlphabeticIndex.Bucket.LabelType {
- enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType INFLOW;
- enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType NORMAL;
- enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType OVERFLOW;
- enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW;
- }
-
- public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Bucket<V>> {
- method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int);
- method public int getBucketCount();
- method public int getBucketIndex(CharSequence);
- method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator();
- }
-
- public static class AlphabeticIndex.Record<V> {
- method public V getData();
- method public CharSequence getName();
- }
-
- public class Bidi {
- ctor public Bidi();
- ctor public Bidi(int, int);
- ctor public Bidi(String, int);
- ctor public Bidi(java.text.AttributedCharacterIterator);
- ctor public Bidi(char[], int, byte[], int, int, int);
- method public boolean baseIsLeftToRight();
- method public int countParagraphs();
- method public int countRuns();
- method public android.icu.text.Bidi createLineBidi(int, int);
- method public static byte getBaseDirection(CharSequence);
- method public int getBaseLevel();
- method public android.icu.text.BidiClassifier getCustomClassifier();
- method public int getCustomizedClass(int);
- method public byte getDirection();
- method public int getLength();
- method public byte getLevelAt(int);
- method public byte[] getLevels();
- method public int getLogicalIndex(int);
- method public int[] getLogicalMap();
- method public android.icu.text.BidiRun getLogicalRun(int);
- method public byte getParaLevel();
- method public android.icu.text.BidiRun getParagraph(int);
- method public android.icu.text.BidiRun getParagraphByIndex(int);
- method public int getParagraphIndex(int);
- method public int getProcessedLength();
- method public int getReorderingMode();
- method public int getReorderingOptions();
- method public int getResultLength();
- method public int getRunCount();
- method public int getRunLevel(int);
- method public int getRunLimit(int);
- method public int getRunStart(int);
- method public char[] getText();
- method public String getTextAsString();
- method public int getVisualIndex(int);
- method public int[] getVisualMap();
- method public android.icu.text.BidiRun getVisualRun(int);
- method public static int[] invertMap(int[]);
- method public boolean isInverse();
- method public boolean isLeftToRight();
- method public boolean isMixed();
- method public boolean isOrderParagraphsLTR();
- method public boolean isRightToLeft();
- method public void orderParagraphsLTR(boolean);
- method public static int[] reorderLogical(byte[]);
- method public static int[] reorderVisual(byte[]);
- method public static void reorderVisually(byte[], int, Object[], int, int);
- method public static boolean requiresBidi(char[], int, int);
- method public void setContext(String, String);
- method public void setCustomClassifier(android.icu.text.BidiClassifier);
- method public void setInverse(boolean);
- method public android.icu.text.Bidi setLine(int, int);
- method public void setPara(String, byte, byte[]);
- method public void setPara(char[], byte, byte[]);
- method public void setPara(java.text.AttributedCharacterIterator);
- method public void setReorderingMode(int);
- method public void setReorderingOptions(int);
- method public String writeReordered(int);
- method public static String writeReverse(String, int);
- field public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = 126; // 0x7e
- field public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = 127; // 0x7f
- field public static final int DIRECTION_LEFT_TO_RIGHT = 0; // 0x0
- field public static final int DIRECTION_RIGHT_TO_LEFT = 1; // 0x1
- field public static final short DO_MIRRORING = 2; // 0x2
- field public static final short INSERT_LRM_FOR_NUMERIC = 4; // 0x4
- field public static final short KEEP_BASE_COMBINING = 1; // 0x1
- field public static final byte LEVEL_DEFAULT_LTR = 126; // 0x7e
- field public static final byte LEVEL_DEFAULT_RTL = 127; // 0x7f
- field public static final byte LEVEL_OVERRIDE = -128; // 0xffffff80
- field public static final byte LTR = 0; // 0x0
- field public static final int MAP_NOWHERE = -1; // 0xffffffff
- field public static final byte MAX_EXPLICIT_LEVEL = 125; // 0x7d
- field public static final byte MIXED = 2; // 0x2
- field public static final byte NEUTRAL = 3; // 0x3
- field public static final int OPTION_DEFAULT = 0; // 0x0
- field public static final int OPTION_INSERT_MARKS = 1; // 0x1
- field public static final int OPTION_REMOVE_CONTROLS = 2; // 0x2
- field public static final int OPTION_STREAMING = 4; // 0x4
- field public static final short OUTPUT_REVERSE = 16; // 0x10
- field public static final short REMOVE_BIDI_CONTROLS = 8; // 0x8
- field public static final short REORDER_DEFAULT = 0; // 0x0
- field public static final short REORDER_GROUP_NUMBERS_WITH_R = 2; // 0x2
- field public static final short REORDER_INVERSE_FOR_NUMBERS_SPECIAL = 6; // 0x6
- field public static final short REORDER_INVERSE_LIKE_DIRECT = 5; // 0x5
- field public static final short REORDER_INVERSE_NUMBERS_AS_L = 4; // 0x4
- field public static final short REORDER_NUMBERS_SPECIAL = 1; // 0x1
- field public static final short REORDER_RUNS_ONLY = 3; // 0x3
- field public static final byte RTL = 1; // 0x1
- }
-
- public class BidiClassifier {
- ctor public BidiClassifier(Object);
- method public int classify(int);
- method public Object getContext();
- method public void setContext(Object);
- }
-
- public class BidiRun {
- method public byte getDirection();
- method public byte getEmbeddingLevel();
- method public int getLength();
- method public int getLimit();
- method public int getStart();
- method public boolean isEvenRun();
- method public boolean isOddRun();
- }
-
- public abstract class BreakIterator implements java.lang.Cloneable {
- ctor protected BreakIterator();
- method public Object clone();
- method public abstract int current();
- method public abstract int first();
- method public abstract int following(int);
- method public static java.util.Locale[] getAvailableLocales();
- method public static android.icu.text.BreakIterator getCharacterInstance();
- method public static android.icu.text.BreakIterator getCharacterInstance(java.util.Locale);
- method public static android.icu.text.BreakIterator getCharacterInstance(android.icu.util.ULocale);
- method public static android.icu.text.BreakIterator getLineInstance();
- method public static android.icu.text.BreakIterator getLineInstance(java.util.Locale);
- method public static android.icu.text.BreakIterator getLineInstance(android.icu.util.ULocale);
- method public int getRuleStatus();
- method public int getRuleStatusVec(int[]);
- method public static android.icu.text.BreakIterator getSentenceInstance();
- method public static android.icu.text.BreakIterator getSentenceInstance(java.util.Locale);
- method public static android.icu.text.BreakIterator getSentenceInstance(android.icu.util.ULocale);
- method public abstract java.text.CharacterIterator getText();
- method @Deprecated public static android.icu.text.BreakIterator getTitleInstance();
- method @Deprecated public static android.icu.text.BreakIterator getTitleInstance(java.util.Locale);
- method @Deprecated public static android.icu.text.BreakIterator getTitleInstance(android.icu.util.ULocale);
- method public static android.icu.text.BreakIterator getWordInstance();
- method public static android.icu.text.BreakIterator getWordInstance(java.util.Locale);
- method public static android.icu.text.BreakIterator getWordInstance(android.icu.util.ULocale);
- method public boolean isBoundary(int);
- method public abstract int last();
- method public abstract int next(int);
- method public abstract int next();
- method public int preceding(int);
- method public abstract int previous();
- method public void setText(String);
- method public void setText(CharSequence);
- method public abstract void setText(java.text.CharacterIterator);
- field public static final int DONE = -1; // 0xffffffff
- field public static final int KIND_CHARACTER = 0; // 0x0
- field public static final int KIND_LINE = 2; // 0x2
- field public static final int KIND_SENTENCE = 3; // 0x3
- field @Deprecated public static final int KIND_TITLE = 4; // 0x4
- field public static final int KIND_WORD = 1; // 0x1
- field public static final int WORD_IDEO = 400; // 0x190
- field public static final int WORD_IDEO_LIMIT = 500; // 0x1f4
- field public static final int WORD_KANA = 300; // 0x12c
- field public static final int WORD_KANA_LIMIT = 400; // 0x190
- field public static final int WORD_LETTER = 200; // 0xc8
- field public static final int WORD_LETTER_LIMIT = 300; // 0x12c
- field public static final int WORD_NONE = 0; // 0x0
- field public static final int WORD_NONE_LIMIT = 100; // 0x64
- field public static final int WORD_NUMBER = 100; // 0x64
- field public static final int WORD_NUMBER_LIMIT = 200; // 0xc8
- }
-
- public abstract class CaseMap {
- method public static android.icu.text.CaseMap.Fold fold();
- method public abstract android.icu.text.CaseMap omitUnchangedText();
- method public static android.icu.text.CaseMap.Lower toLower();
- method public static android.icu.text.CaseMap.Title toTitle();
- method public static android.icu.text.CaseMap.Upper toUpper();
- }
-
- public static final class CaseMap.Fold extends android.icu.text.CaseMap {
- method public String apply(CharSequence);
- method public <A extends java.lang.Appendable> A apply(CharSequence, A, android.icu.text.Edits);
- method public android.icu.text.CaseMap.Fold omitUnchangedText();
- method public android.icu.text.CaseMap.Fold turkic();
- }
-
- public static final class CaseMap.Lower extends android.icu.text.CaseMap {
- method public String apply(java.util.Locale, CharSequence);
- method public <A extends java.lang.Appendable> A apply(java.util.Locale, CharSequence, A, android.icu.text.Edits);
- method public android.icu.text.CaseMap.Lower omitUnchangedText();
- }
-
- public static final class CaseMap.Title extends android.icu.text.CaseMap {
- method public android.icu.text.CaseMap.Title adjustToCased();
- method public String apply(java.util.Locale, android.icu.text.BreakIterator, CharSequence);
- method public <A extends java.lang.Appendable> A apply(java.util.Locale, android.icu.text.BreakIterator, CharSequence, A, android.icu.text.Edits);
- method public android.icu.text.CaseMap.Title noBreakAdjustment();
- method public android.icu.text.CaseMap.Title noLowercase();
- method public android.icu.text.CaseMap.Title omitUnchangedText();
- method public android.icu.text.CaseMap.Title sentences();
- method public android.icu.text.CaseMap.Title wholeString();
- }
-
- public static final class CaseMap.Upper extends android.icu.text.CaseMap {
- method public String apply(java.util.Locale, CharSequence);
- method public <A extends java.lang.Appendable> A apply(java.util.Locale, CharSequence, A, android.icu.text.Edits);
- method public android.icu.text.CaseMap.Upper omitUnchangedText();
- }
-
- public final class CollationElementIterator {
- method public int getMaxExpansion(int);
- method public int getOffset();
- method public int next();
- method public int previous();
- method public static int primaryOrder(int);
- method public void reset();
- method public static int secondaryOrder(int);
- method public void setOffset(int);
- method public void setText(String);
- method public void setText(android.icu.text.UCharacterIterator);
- method public void setText(java.text.CharacterIterator);
- method public static int tertiaryOrder(int);
- field public static final int IGNORABLE = 0; // 0x0
- field public static final int NULLORDER = -1; // 0xffffffff
- }
-
- public final class CollationKey implements java.lang.Comparable<android.icu.text.CollationKey> {
- ctor public CollationKey(String, byte[]);
- method public int compareTo(android.icu.text.CollationKey);
- method public boolean equals(android.icu.text.CollationKey);
- method public android.icu.text.CollationKey getBound(int, int);
- method public String getSourceString();
- method public android.icu.text.CollationKey merge(android.icu.text.CollationKey);
- method public byte[] toByteArray();
- }
-
- public static final class CollationKey.BoundMode {
- field public static final int LOWER = 0; // 0x0
- field public static final int UPPER = 1; // 0x1
- field public static final int UPPER_LONG = 2; // 0x2
- }
-
- public abstract class Collator implements java.lang.Cloneable java.util.Comparator<java.lang.Object> android.icu.util.Freezable<android.icu.text.Collator> {
- ctor protected Collator();
- method public Object clone() throws java.lang.CloneNotSupportedException;
- method public android.icu.text.Collator cloneAsThawed();
- method public abstract int compare(String, String);
- method public int compare(Object, Object);
- method public boolean equals(String, String);
- method public android.icu.text.Collator freeze();
- method public static java.util.Locale[] getAvailableLocales();
- method public static final android.icu.util.ULocale[] getAvailableULocales();
- method public abstract android.icu.text.CollationKey getCollationKey(String);
- method public int getDecomposition();
- method public static String getDisplayName(java.util.Locale, java.util.Locale);
- method public static String getDisplayName(android.icu.util.ULocale, android.icu.util.ULocale);
- method public static String getDisplayName(java.util.Locale);
- method public static String getDisplayName(android.icu.util.ULocale);
- method public static int[] getEquivalentReorderCodes(int);
- method public static final android.icu.util.ULocale getFunctionalEquivalent(String, android.icu.util.ULocale, boolean[]);
- method public static final android.icu.util.ULocale getFunctionalEquivalent(String, android.icu.util.ULocale);
- method public static final android.icu.text.Collator getInstance();
- method public static final android.icu.text.Collator getInstance(android.icu.util.ULocale);
- method public static final android.icu.text.Collator getInstance(java.util.Locale);
- method public static final String[] getKeywordValues(String);
- method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean);
- method public static final String[] getKeywords();
- method public int getMaxVariable();
- method public int[] getReorderCodes();
- method public int getStrength();
- method public android.icu.text.UnicodeSet getTailoredSet();
- method public abstract android.icu.util.VersionInfo getUCAVersion();
- method public abstract int getVariableTop();
- method public abstract android.icu.util.VersionInfo getVersion();
- method public boolean isFrozen();
- method public void setDecomposition(int);
- method public android.icu.text.Collator setMaxVariable(int);
- method public void setReorderCodes(int...);
- method public void setStrength(int);
- field public static final int CANONICAL_DECOMPOSITION = 17; // 0x11
- field public static final int FULL_DECOMPOSITION = 15; // 0xf
- field public static final int IDENTICAL = 15; // 0xf
- field public static final int NO_DECOMPOSITION = 16; // 0x10
- field public static final int PRIMARY = 0; // 0x0
- field public static final int QUATERNARY = 3; // 0x3
- field public static final int SECONDARY = 1; // 0x1
- field public static final int TERTIARY = 2; // 0x2
- }
-
- public static interface Collator.ReorderCodes {
- field public static final int CURRENCY = 4099; // 0x1003
- field public static final int DEFAULT = -1; // 0xffffffff
- field public static final int DIGIT = 4100; // 0x1004
- field public static final int FIRST = 4096; // 0x1000
- field public static final int NONE = 103; // 0x67
- field public static final int OTHERS = 103; // 0x67
- field public static final int PUNCTUATION = 4097; // 0x1001
- field public static final int SPACE = 4096; // 0x1000
- field public static final int SYMBOL = 4098; // 0x1002
- }
-
- public class CompactDecimalFormat extends android.icu.text.DecimalFormat {
- method public static android.icu.text.CompactDecimalFormat getInstance(android.icu.util.ULocale, android.icu.text.CompactDecimalFormat.CompactStyle);
- method public static android.icu.text.CompactDecimalFormat getInstance(java.util.Locale, android.icu.text.CompactDecimalFormat.CompactStyle);
- }
-
- public enum CompactDecimalFormat.CompactStyle {
- enum_constant public static final android.icu.text.CompactDecimalFormat.CompactStyle LONG;
- enum_constant public static final android.icu.text.CompactDecimalFormat.CompactStyle SHORT;
- }
-
- public class CurrencyPluralInfo implements java.lang.Cloneable java.io.Serializable {
- ctor public CurrencyPluralInfo();
- ctor public CurrencyPluralInfo(java.util.Locale);
- ctor public CurrencyPluralInfo(android.icu.util.ULocale);
- method public Object clone();
- method public String getCurrencyPluralPattern(String);
- method public static android.icu.text.CurrencyPluralInfo getInstance();
- method public static android.icu.text.CurrencyPluralInfo getInstance(java.util.Locale);
- method public static android.icu.text.CurrencyPluralInfo getInstance(android.icu.util.ULocale);
- method public android.icu.util.ULocale getLocale();
- method public android.icu.text.PluralRules getPluralRules();
- method public void setCurrencyPluralPattern(String, String);
- method public void setLocale(android.icu.util.ULocale);
- method public void setPluralRules(String);
- }
-
- public abstract class DateFormat extends android.icu.text.UFormat {
- ctor protected DateFormat();
- method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public abstract StringBuffer format(android.icu.util.Calendar, StringBuffer, java.text.FieldPosition);
- method public StringBuffer format(java.util.Date, StringBuffer, java.text.FieldPosition);
- method public final String format(java.util.Date);
- method public static java.util.Locale[] getAvailableLocales();
- method public boolean getBooleanAttribute(android.icu.text.DateFormat.BooleanAttribute);
- method public android.icu.util.Calendar getCalendar();
- method public android.icu.text.DisplayContext getContext(android.icu.text.DisplayContext.Type);
- method public static final android.icu.text.DateFormat getDateInstance();
- method public static final android.icu.text.DateFormat getDateInstance(int);
- method public static final android.icu.text.DateFormat getDateInstance(int, java.util.Locale);
- method public static final android.icu.text.DateFormat getDateInstance(int, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getDateInstance(android.icu.util.Calendar, int, java.util.Locale);
- method public static final android.icu.text.DateFormat getDateInstance(android.icu.util.Calendar, int, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getDateInstance(android.icu.util.Calendar, int);
- method public static final android.icu.text.DateFormat getDateTimeInstance();
- method public static final android.icu.text.DateFormat getDateTimeInstance(int, int);
- method public static final android.icu.text.DateFormat getDateTimeInstance(int, int, java.util.Locale);
- method public static final android.icu.text.DateFormat getDateTimeInstance(int, int, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getDateTimeInstance(android.icu.util.Calendar, int, int, java.util.Locale);
- method public static final android.icu.text.DateFormat getDateTimeInstance(android.icu.util.Calendar, int, int, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getDateTimeInstance(android.icu.util.Calendar, int, int);
- method public static final android.icu.text.DateFormat getInstance();
- method public static final android.icu.text.DateFormat getInstance(android.icu.util.Calendar, java.util.Locale);
- method public static final android.icu.text.DateFormat getInstance(android.icu.util.Calendar);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(String);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(String, java.util.Locale);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(String, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, String, java.util.Locale);
- method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, String, android.icu.util.ULocale);
- method public android.icu.text.NumberFormat getNumberFormat();
- method public static final android.icu.text.DateFormat getPatternInstance(String);
- method public static final android.icu.text.DateFormat getPatternInstance(String, java.util.Locale);
- method public static final android.icu.text.DateFormat getPatternInstance(String, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, String, java.util.Locale);
- method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, String, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getTimeInstance();
- method public static final android.icu.text.DateFormat getTimeInstance(int);
- method public static final android.icu.text.DateFormat getTimeInstance(int, java.util.Locale);
- method public static final android.icu.text.DateFormat getTimeInstance(int, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getTimeInstance(android.icu.util.Calendar, int, java.util.Locale);
- method public static final android.icu.text.DateFormat getTimeInstance(android.icu.util.Calendar, int, android.icu.util.ULocale);
- method public static final android.icu.text.DateFormat getTimeInstance(android.icu.util.Calendar, int);
- method public android.icu.util.TimeZone getTimeZone();
- method public boolean isCalendarLenient();
- method public boolean isLenient();
- method public java.util.Date parse(String) throws java.text.ParseException;
- method public abstract void parse(String, android.icu.util.Calendar, java.text.ParsePosition);
- method public java.util.Date parse(String, java.text.ParsePosition);
- method public Object parseObject(String, java.text.ParsePosition);
- method public android.icu.text.DateFormat setBooleanAttribute(android.icu.text.DateFormat.BooleanAttribute, boolean);
- method public void setCalendar(android.icu.util.Calendar);
- method public void setCalendarLenient(boolean);
- method public void setContext(android.icu.text.DisplayContext);
- method public void setLenient(boolean);
- method public void setNumberFormat(android.icu.text.NumberFormat);
- method public void setTimeZone(android.icu.util.TimeZone);
- field public static final String ABBR_GENERIC_TZ = "v";
- field public static final String ABBR_MONTH = "MMM";
- field public static final String ABBR_MONTH_DAY = "MMMd";
- field public static final String ABBR_MONTH_WEEKDAY_DAY = "MMMEd";
- field public static final String ABBR_QUARTER = "QQQ";
- field public static final String ABBR_SPECIFIC_TZ = "z";
- field public static final String ABBR_UTC_TZ = "ZZZZ";
- field public static final String ABBR_WEEKDAY = "E";
- field public static final int AM_PM_FIELD = 14; // 0xe
- field public static final int AM_PM_MIDNIGHT_NOON_FIELD = 35; // 0x23
- field public static final int DATE_FIELD = 3; // 0x3
- field public static final String DAY = "d";
- field public static final int DAY_OF_WEEK_FIELD = 9; // 0x9
- field public static final int DAY_OF_WEEK_IN_MONTH_FIELD = 11; // 0xb
- field public static final int DAY_OF_YEAR_FIELD = 10; // 0xa
- field public static final int DEFAULT = 2; // 0x2
- field public static final int DOW_LOCAL_FIELD = 19; // 0x13
- field public static final int ERA_FIELD = 0; // 0x0
- field public static final int EXTENDED_YEAR_FIELD = 20; // 0x14
- field public static final int FLEXIBLE_DAY_PERIOD_FIELD = 36; // 0x24
- field public static final int FRACTIONAL_SECOND_FIELD = 8; // 0x8
- field public static final int FULL = 0; // 0x0
- field public static final String GENERIC_TZ = "vvvv";
- field public static final String HOUR = "j";
- field public static final int HOUR0_FIELD = 16; // 0x10
- field public static final int HOUR1_FIELD = 15; // 0xf
- field public static final String HOUR24 = "H";
- field public static final String HOUR24_MINUTE = "Hm";
- field public static final String HOUR24_MINUTE_SECOND = "Hms";
- field public static final String HOUR_MINUTE = "jm";
- field public static final String HOUR_MINUTE_SECOND = "jms";
- field public static final int HOUR_OF_DAY0_FIELD = 5; // 0x5
- field public static final int HOUR_OF_DAY1_FIELD = 4; // 0x4
- field public static final int JULIAN_DAY_FIELD = 21; // 0x15
- field public static final String LOCATION_TZ = "VVVV";
- field public static final int LONG = 1; // 0x1
- field public static final int MEDIUM = 2; // 0x2
- field public static final int MILLISECONDS_IN_DAY_FIELD = 22; // 0x16
- field public static final int MILLISECOND_FIELD = 8; // 0x8
- field public static final String MINUTE = "m";
- field public static final int MINUTE_FIELD = 6; // 0x6
- field public static final String MINUTE_SECOND = "ms";
- field public static final String MONTH = "MMMM";
- field public static final String MONTH_DAY = "MMMMd";
- field public static final int MONTH_FIELD = 2; // 0x2
- field public static final String MONTH_WEEKDAY_DAY = "MMMMEEEEd";
- field public static final int NONE = -1; // 0xffffffff
- field public static final String NUM_MONTH = "M";
- field public static final String NUM_MONTH_DAY = "Md";
- field public static final String NUM_MONTH_WEEKDAY_DAY = "MEd";
- field public static final String QUARTER = "QQQQ";
- field public static final int QUARTER_FIELD = 27; // 0x1b
- field public static final int RELATIVE = 128; // 0x80
- field public static final int RELATIVE_DEFAULT = 130; // 0x82
- field public static final int RELATIVE_FULL = 128; // 0x80
- field public static final int RELATIVE_LONG = 129; // 0x81
- field public static final int RELATIVE_MEDIUM = 130; // 0x82
- field public static final int RELATIVE_SHORT = 131; // 0x83
- field public static final String SECOND = "s";
- field public static final int SECOND_FIELD = 7; // 0x7
- field public static final int SHORT = 3; // 0x3
- field public static final String SPECIFIC_TZ = "zzzz";
- field public static final int STANDALONE_DAY_FIELD = 25; // 0x19
- field public static final int STANDALONE_MONTH_FIELD = 26; // 0x1a
- field public static final int STANDALONE_QUARTER_FIELD = 28; // 0x1c
- field public static final int TIMEZONE_FIELD = 17; // 0x11
- field public static final int TIMEZONE_GENERIC_FIELD = 24; // 0x18
- field public static final int TIMEZONE_ISO_FIELD = 32; // 0x20
- field public static final int TIMEZONE_ISO_LOCAL_FIELD = 33; // 0x21
- field public static final int TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD = 31; // 0x1f
- field public static final int TIMEZONE_RFC_FIELD = 23; // 0x17
- field public static final int TIMEZONE_SPECIAL_FIELD = 29; // 0x1d
- field public static final String WEEKDAY = "EEEE";
- field public static final int WEEK_OF_MONTH_FIELD = 13; // 0xd
- field public static final int WEEK_OF_YEAR_FIELD = 12; // 0xc
- field public static final String YEAR = "y";
- field public static final String YEAR_ABBR_MONTH = "yMMM";
- field public static final String YEAR_ABBR_MONTH_DAY = "yMMMd";
- field public static final String YEAR_ABBR_MONTH_WEEKDAY_DAY = "yMMMEd";
- field public static final String YEAR_ABBR_QUARTER = "yQQQ";
- field public static final int YEAR_FIELD = 1; // 0x1
- field public static final String YEAR_MONTH = "yMMMM";
- field public static final String YEAR_MONTH_DAY = "yMMMMd";
- field public static final String YEAR_MONTH_WEEKDAY_DAY = "yMMMMEEEEd";
- field public static final int YEAR_NAME_FIELD = 30; // 0x1e
- field public static final String YEAR_NUM_MONTH = "yM";
- field public static final String YEAR_NUM_MONTH_DAY = "yMd";
- field public static final String YEAR_NUM_MONTH_WEEKDAY_DAY = "yMEd";
- field public static final String YEAR_QUARTER = "yQQQQ";
- field public static final int YEAR_WOY_FIELD = 18; // 0x12
- field protected android.icu.util.Calendar calendar;
- field protected android.icu.text.NumberFormat numberFormat;
- }
-
- public enum DateFormat.BooleanAttribute {
- enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_ALLOW_NUMERIC;
- enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_ALLOW_WHITESPACE;
- enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_MULTIPLE_PATTERNS_FOR_MATCH;
- enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_PARTIAL_LITERAL_MATCH;
- }
-
- public static class DateFormat.Field extends java.text.Format.Field {
- ctor protected DateFormat.Field(String, int);
- method public int getCalendarField();
- method public static android.icu.text.DateFormat.Field ofCalendarField(int);
- field public static final android.icu.text.DateFormat.Field AM_PM;
- field public static final android.icu.text.DateFormat.Field AM_PM_MIDNIGHT_NOON;
- field public static final android.icu.text.DateFormat.Field DAY_OF_MONTH;
- field public static final android.icu.text.DateFormat.Field DAY_OF_WEEK;
- field public static final android.icu.text.DateFormat.Field DAY_OF_WEEK_IN_MONTH;
- field public static final android.icu.text.DateFormat.Field DAY_OF_YEAR;
- field public static final android.icu.text.DateFormat.Field DOW_LOCAL;
- field public static final android.icu.text.DateFormat.Field ERA;
- field public static final android.icu.text.DateFormat.Field EXTENDED_YEAR;
- field public static final android.icu.text.DateFormat.Field FLEXIBLE_DAY_PERIOD;
- field public static final android.icu.text.DateFormat.Field HOUR0;
- field public static final android.icu.text.DateFormat.Field HOUR1;
- field public static final android.icu.text.DateFormat.Field HOUR_OF_DAY0;
- field public static final android.icu.text.DateFormat.Field HOUR_OF_DAY1;
- field public static final android.icu.text.DateFormat.Field JULIAN_DAY;
- field public static final android.icu.text.DateFormat.Field MILLISECOND;
- field public static final android.icu.text.DateFormat.Field MILLISECONDS_IN_DAY;
- field public static final android.icu.text.DateFormat.Field MINUTE;
- field public static final android.icu.text.DateFormat.Field MONTH;
- field public static final android.icu.text.DateFormat.Field QUARTER;
- field public static final android.icu.text.DateFormat.Field SECOND;
- field public static final android.icu.text.DateFormat.Field TIME_ZONE;
- field public static final android.icu.text.DateFormat.Field WEEK_OF_MONTH;
- field public static final android.icu.text.DateFormat.Field WEEK_OF_YEAR;
- field public static final android.icu.text.DateFormat.Field YEAR;
- field public static final android.icu.text.DateFormat.Field YEAR_WOY;
- }
-
- public class DateFormatSymbols implements java.lang.Cloneable java.io.Serializable {
- ctor public DateFormatSymbols();
- ctor public DateFormatSymbols(java.util.Locale);
- ctor public DateFormatSymbols(android.icu.util.ULocale);
- ctor public DateFormatSymbols(android.icu.util.Calendar, java.util.Locale);
- ctor public DateFormatSymbols(android.icu.util.Calendar, android.icu.util.ULocale);
- ctor public DateFormatSymbols(Class<? extends android.icu.util.Calendar>, java.util.Locale);
- ctor public DateFormatSymbols(Class<? extends android.icu.util.Calendar>, android.icu.util.ULocale);
- ctor public DateFormatSymbols(java.util.ResourceBundle, java.util.Locale);
- ctor public DateFormatSymbols(java.util.ResourceBundle, android.icu.util.ULocale);
- method public Object clone();
- method public String[] getAmPmStrings();
- method public static java.util.Locale[] getAvailableLocales();
- method public String[] getEraNames();
- method public String[] getEras();
- method public static android.icu.text.DateFormatSymbols getInstance();
- method public static android.icu.text.DateFormatSymbols getInstance(java.util.Locale);
- method public static android.icu.text.DateFormatSymbols getInstance(android.icu.util.ULocale);
- method public String getLocalPatternChars();
- method public String[] getMonths();
- method public String[] getMonths(int, int);
- method public String[] getQuarters(int, int);
- method public String[] getShortMonths();
- method public String[] getShortWeekdays();
- method public String[] getWeekdays();
- method public String[] getWeekdays(int, int);
- method public String[] getYearNames(int, int);
- method public String[] getZodiacNames(int, int);
- method public String[][] getZoneStrings();
- method protected void initializeData(android.icu.util.ULocale, String);
- method public void setAmPmStrings(String[]);
- method public void setEraNames(String[]);
- method public void setEras(String[]);
- method public void setLocalPatternChars(String);
- method public void setMonths(String[]);
- method public void setMonths(String[], int, int);
- method public void setQuarters(String[], int, int);
- method public void setShortMonths(String[]);
- method public void setShortWeekdays(String[]);
- method public void setWeekdays(String[], int, int);
- method public void setWeekdays(String[]);
- method public void setYearNames(String[], int, int);
- method public void setZodiacNames(String[], int, int);
- method public void setZoneStrings(String[][]);
- field public static final int ABBREVIATED = 0; // 0x0
- field public static final int FORMAT = 0; // 0x0
- field public static final int NARROW = 2; // 0x2
- field public static final int SHORT = 3; // 0x3
- field public static final int STANDALONE = 1; // 0x1
- field public static final int WIDE = 1; // 0x1
- }
-
- public class DateIntervalFormat extends android.icu.text.UFormat {
- method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public final StringBuffer format(android.icu.util.DateInterval, StringBuffer, java.text.FieldPosition);
- method public final StringBuffer format(android.icu.util.Calendar, android.icu.util.Calendar, StringBuffer, java.text.FieldPosition);
- method public android.icu.text.DateFormat getDateFormat();
- method public android.icu.text.DateIntervalInfo getDateIntervalInfo();
- method public static final android.icu.text.DateIntervalFormat getInstance(String);
- method public static final android.icu.text.DateIntervalFormat getInstance(String, java.util.Locale);
- method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.util.ULocale);
- method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.text.DateIntervalInfo);
- method public static final android.icu.text.DateIntervalFormat getInstance(String, java.util.Locale, android.icu.text.DateIntervalInfo);
- method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.util.ULocale, android.icu.text.DateIntervalInfo);
- method public android.icu.util.TimeZone getTimeZone();
- method @Deprecated public Object parseObject(String, java.text.ParsePosition);
- method public void setDateIntervalInfo(android.icu.text.DateIntervalInfo);
- method public void setTimeZone(android.icu.util.TimeZone);
- }
-
- public class DateIntervalInfo implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.DateIntervalInfo> java.io.Serializable {
- ctor public DateIntervalInfo(android.icu.util.ULocale);
- ctor public DateIntervalInfo(java.util.Locale);
- method public Object clone();
- method public android.icu.text.DateIntervalInfo cloneAsThawed();
- method public android.icu.text.DateIntervalInfo freeze();
- method public boolean getDefaultOrder();
- method public String getFallbackIntervalPattern();
- method public android.icu.text.DateIntervalInfo.PatternInfo getIntervalPattern(String, int);
- method public boolean isFrozen();
- method public void setFallbackIntervalPattern(String);
- method public void setIntervalPattern(String, int, String);
- }
-
- public static final class DateIntervalInfo.PatternInfo implements java.lang.Cloneable java.io.Serializable {
- ctor public DateIntervalInfo.PatternInfo(String, String, boolean);
- method public boolean firstDateInPtnIsLaterDate();
- method public String getFirstPart();
- method public String getSecondPart();
- }
-
- public class DateTimePatternGenerator implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.DateTimePatternGenerator> {
- ctor protected DateTimePatternGenerator();
- method public android.icu.text.DateTimePatternGenerator addPattern(String, boolean, android.icu.text.DateTimePatternGenerator.PatternInfo);
- method public Object clone();
- method public android.icu.text.DateTimePatternGenerator cloneAsThawed();
- method public android.icu.text.DateTimePatternGenerator freeze();
- method public String getAppendItemFormat(int);
- method public String getAppendItemName(int);
- method public String getBaseSkeleton(String);
- method public java.util.Set<java.lang.String> getBaseSkeletons(java.util.Set<java.lang.String>);
- method public String getBestPattern(String);
- method public String getBestPattern(String, int);
- method public String getDateTimeFormat();
- method public String getDecimal();
- method public static android.icu.text.DateTimePatternGenerator getEmptyInstance();
- method public String getFieldDisplayName(int, android.icu.text.DateTimePatternGenerator.DisplayWidth);
- method public static android.icu.text.DateTimePatternGenerator getInstance();
- method public static android.icu.text.DateTimePatternGenerator getInstance(android.icu.util.ULocale);
- method public static android.icu.text.DateTimePatternGenerator getInstance(java.util.Locale);
- method public String getSkeleton(String);
- method public java.util.Map<java.lang.String,java.lang.String> getSkeletons(java.util.Map<java.lang.String,java.lang.String>);
- method public boolean isFrozen();
- method public String replaceFieldTypes(String, String);
- method public String replaceFieldTypes(String, String, int);
- method public void setAppendItemFormat(int, String);
- method public void setAppendItemName(int, String);
- method public void setDateTimeFormat(String);
- method public void setDecimal(String);
- field public static final int DAY = 7; // 0x7
- field public static final int DAYPERIOD = 10; // 0xa
- field public static final int DAY_OF_WEEK_IN_MONTH = 9; // 0x9
- field public static final int DAY_OF_YEAR = 8; // 0x8
- field public static final int ERA = 0; // 0x0
- field public static final int FRACTIONAL_SECOND = 14; // 0xe
- field public static final int HOUR = 11; // 0xb
- field public static final int MATCH_ALL_FIELDS_LENGTH = 65535; // 0xffff
- field public static final int MATCH_HOUR_FIELD_LENGTH = 2048; // 0x800
- field public static final int MATCH_NO_OPTIONS = 0; // 0x0
- field public static final int MINUTE = 12; // 0xc
- field public static final int MONTH = 3; // 0x3
- field public static final int QUARTER = 2; // 0x2
- field public static final int SECOND = 13; // 0xd
- field public static final int WEEKDAY = 6; // 0x6
- field public static final int WEEK_OF_MONTH = 5; // 0x5
- field public static final int WEEK_OF_YEAR = 4; // 0x4
- field public static final int YEAR = 1; // 0x1
- field public static final int ZONE = 15; // 0xf
- }
-
- public enum DateTimePatternGenerator.DisplayWidth {
- enum_constant public static final android.icu.text.DateTimePatternGenerator.DisplayWidth ABBREVIATED;
- enum_constant public static final android.icu.text.DateTimePatternGenerator.DisplayWidth NARROW;
- enum_constant public static final android.icu.text.DateTimePatternGenerator.DisplayWidth WIDE;
- }
-
- public static final class DateTimePatternGenerator.PatternInfo {
- ctor public DateTimePatternGenerator.PatternInfo();
- field public static final int BASE_CONFLICT = 1; // 0x1
- field public static final int CONFLICT = 2; // 0x2
- field public static final int OK = 0; // 0x0
- field public String conflictingPattern;
- field public int status;
- }
-
- public class DecimalFormat extends android.icu.text.NumberFormat {
- ctor public DecimalFormat();
- ctor public DecimalFormat(String);
- ctor public DecimalFormat(String, android.icu.text.DecimalFormatSymbols);
- ctor public DecimalFormat(String, android.icu.text.DecimalFormatSymbols, android.icu.text.CurrencyPluralInfo, int);
- method public void applyLocalizedPattern(String);
- method public void applyPattern(String);
- method public boolean areSignificantDigitsUsed();
- method public StringBuffer format(double, StringBuffer, java.text.FieldPosition);
- method public StringBuffer format(long, StringBuffer, java.text.FieldPosition);
- method public StringBuffer format(java.math.BigInteger, StringBuffer, java.text.FieldPosition);
- method public StringBuffer format(java.math.BigDecimal, StringBuffer, java.text.FieldPosition);
- method public StringBuffer format(android.icu.math.BigDecimal, StringBuffer, java.text.FieldPosition);
- method public android.icu.text.CurrencyPluralInfo getCurrencyPluralInfo();
- method public android.icu.util.Currency.CurrencyUsage getCurrencyUsage();
- method public android.icu.text.DecimalFormatSymbols getDecimalFormatSymbols();
- method public int getFormatWidth();
- method public int getGroupingSize();
- method public java.math.MathContext getMathContext();
- method public android.icu.math.MathContext getMathContextICU();
- method public int getMaximumSignificantDigits();
- method public byte getMinimumExponentDigits();
- method public int getMinimumSignificantDigits();
- method public int getMultiplier();
- method public String getNegativePrefix();
- method public String getNegativeSuffix();
- method public char getPadCharacter();
- method public int getPadPosition();
- method @Deprecated public int getParseMaxDigits();
- method public String getPositivePrefix();
- method public String getPositiveSuffix();
- method public java.math.BigDecimal getRoundingIncrement();
- method public int getSecondaryGroupingSize();
- method public boolean isDecimalPatternMatchRequired();
- method public boolean isDecimalSeparatorAlwaysShown();
- method public boolean isExponentSignAlwaysShown();
- method public boolean isParseBigDecimal();
- method public boolean isScientificNotation();
- method public Number parse(String, java.text.ParsePosition);
- method public void setCurrencyPluralInfo(android.icu.text.CurrencyPluralInfo);
- method public void setCurrencyUsage(android.icu.util.Currency.CurrencyUsage);
- method public void setDecimalFormatSymbols(android.icu.text.DecimalFormatSymbols);
- method public void setDecimalPatternMatchRequired(boolean);
- method public void setDecimalSeparatorAlwaysShown(boolean);
- method public void setExponentSignAlwaysShown(boolean);
- method public void setFormatWidth(int);
- method public void setGroupingSize(int);
- method public void setMathContext(java.math.MathContext);
- method public void setMathContextICU(android.icu.math.MathContext);
- method public void setMaximumSignificantDigits(int);
- method public void setMinimumExponentDigits(byte);
- method public void setMinimumSignificantDigits(int);
- method public void setMultiplier(int);
- method public void setNegativePrefix(String);
- method public void setNegativeSuffix(String);
- method public void setPadCharacter(char);
- method public void setPadPosition(int);
- method public void setParseBigDecimal(boolean);
- method @Deprecated public void setParseMaxDigits(int);
- method public void setPositivePrefix(String);
- method public void setPositiveSuffix(String);
- method public void setRoundingIncrement(java.math.BigDecimal);
- method public void setRoundingIncrement(android.icu.math.BigDecimal);
- method public void setRoundingIncrement(double);
- method public void setScientificNotation(boolean);
- method public void setSecondaryGroupingSize(int);
- method public void setSignificantDigitsUsed(boolean);
- method public String toLocalizedPattern();
- method public String toPattern();
- field public static final int PAD_AFTER_PREFIX = 1; // 0x1
- field public static final int PAD_AFTER_SUFFIX = 3; // 0x3
- field public static final int PAD_BEFORE_PREFIX = 0; // 0x0
- field public static final int PAD_BEFORE_SUFFIX = 2; // 0x2
- }
-
- public class DecimalFormatSymbols implements java.lang.Cloneable java.io.Serializable {
- ctor public DecimalFormatSymbols();
- ctor public DecimalFormatSymbols(java.util.Locale);
- ctor public DecimalFormatSymbols(android.icu.util.ULocale);
- method public Object clone();
- method public static android.icu.text.DecimalFormatSymbols forNumberingSystem(java.util.Locale, android.icu.text.NumberingSystem);
- method public static android.icu.text.DecimalFormatSymbols forNumberingSystem(android.icu.util.ULocale, android.icu.text.NumberingSystem);
- method public static java.util.Locale[] getAvailableLocales();
- method public android.icu.util.Currency getCurrency();
- method public String getCurrencySymbol();
- method public char getDecimalSeparator();
- method public String getDecimalSeparatorString();
- method public char getDigit();
- method public String[] getDigitStrings();
- method public char[] getDigits();
- method public String getExponentMultiplicationSign();
- method public String getExponentSeparator();
- method public char getGroupingSeparator();
- method public String getGroupingSeparatorString();
- method public String getInfinity();
- method public static android.icu.text.DecimalFormatSymbols getInstance();
- method public static android.icu.text.DecimalFormatSymbols getInstance(java.util.Locale);
- method public static android.icu.text.DecimalFormatSymbols getInstance(android.icu.util.ULocale);
- method public String getInternationalCurrencySymbol();
- method public java.util.Locale getLocale();
- method public char getMinusSign();
- method public String getMinusSignString();
- method public char getMonetaryDecimalSeparator();
- method public String getMonetaryDecimalSeparatorString();
- method public char getMonetaryGroupingSeparator();
- method public String getMonetaryGroupingSeparatorString();
- method public String getNaN();
- method public char getPadEscape();
- method public String getPatternForCurrencySpacing(int, boolean);
- method public char getPatternSeparator();
- method public char getPerMill();
- method public String getPerMillString();
- method public char getPercent();
- method public String getPercentString();
- method public char getPlusSign();
- method public String getPlusSignString();
- method public char getSignificantDigit();
- method public android.icu.util.ULocale getULocale();
- method public char getZeroDigit();
- method public void setCurrency(android.icu.util.Currency);
- method public void setCurrencySymbol(String);
- method public void setDecimalSeparator(char);
- method public void setDecimalSeparatorString(String);
- method public void setDigit(char);
- method public void setDigitStrings(String[]);
- method public void setExponentMultiplicationSign(String);
- method public void setExponentSeparator(String);
- method public void setGroupingSeparator(char);
- method public void setGroupingSeparatorString(String);
- method public void setInfinity(String);
- method public void setInternationalCurrencySymbol(String);
- method public void setMinusSign(char);
- method public void setMinusSignString(String);
- method public void setMonetaryDecimalSeparator(char);
- method public void setMonetaryDecimalSeparatorString(String);
- method public void setMonetaryGroupingSeparator(char);
- method public void setMonetaryGroupingSeparatorString(String);
- method public void setNaN(String);
- method public void setPadEscape(char);
- method public void setPatternForCurrencySpacing(int, boolean, String);
- method public void setPatternSeparator(char);
- method public void setPerMill(char);
- method public void setPerMillString(String);
- method public void setPercent(char);
- method public void setPercentString(String);
- method public void setPlusSign(char);
- method public void setPlusSignString(String);
- method public void setSignificantDigit(char);
- method public void setZeroDigit(char);
- field public static final int CURRENCY_SPC_CURRENCY_MATCH = 0; // 0x0
- field public static final int CURRENCY_SPC_INSERT = 2; // 0x2
- field public static final int CURRENCY_SPC_SURROUNDING_MATCH = 1; // 0x1
- }
-
- public enum DisplayContext {
- method public android.icu.text.DisplayContext.Type type();
- method public int value();
- enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE;
- enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE;
- enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_STANDALONE;
- enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_UI_LIST_OR_MENU;
- enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_NONE;
- enum_constant public static final android.icu.text.DisplayContext DIALECT_NAMES;
- enum_constant public static final android.icu.text.DisplayContext LENGTH_FULL;
- enum_constant public static final android.icu.text.DisplayContext LENGTH_SHORT;
- enum_constant public static final android.icu.text.DisplayContext NO_SUBSTITUTE;
- enum_constant public static final android.icu.text.DisplayContext STANDARD_NAMES;
- enum_constant public static final android.icu.text.DisplayContext SUBSTITUTE;
- }
-
- public enum DisplayContext.Type {
- enum_constant public static final android.icu.text.DisplayContext.Type CAPITALIZATION;
- enum_constant public static final android.icu.text.DisplayContext.Type DIALECT_HANDLING;
- enum_constant public static final android.icu.text.DisplayContext.Type DISPLAY_LENGTH;
- enum_constant public static final android.icu.text.DisplayContext.Type SUBSTITUTE_HANDLING;
- }
-
- public final class Edits {
- ctor public Edits();
- method public void addReplace(int, int);
- method public void addUnchanged(int);
- method public android.icu.text.Edits.Iterator getCoarseChangesIterator();
- method public android.icu.text.Edits.Iterator getCoarseIterator();
- method public android.icu.text.Edits.Iterator getFineChangesIterator();
- method public android.icu.text.Edits.Iterator getFineIterator();
- method public boolean hasChanges();
- method public int lengthDelta();
- method public android.icu.text.Edits mergeAndAppend(android.icu.text.Edits, android.icu.text.Edits);
- method public int numberOfChanges();
- method public void reset();
- }
-
- public static final class Edits.Iterator {
- method public int destinationIndex();
- method public int destinationIndexFromSourceIndex(int);
- method public boolean findDestinationIndex(int);
- method public boolean findSourceIndex(int);
- method public boolean hasChange();
- method public int newLength();
- method public boolean next();
- method public int oldLength();
- method public int replacementIndex();
- method public int sourceIndex();
- method public int sourceIndexFromDestinationIndex(int);
- }
-
- public abstract class IDNA {
- method public static android.icu.text.IDNA getUTS46Instance(int);
- method public abstract StringBuilder labelToASCII(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
- method public abstract StringBuilder labelToUnicode(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
- method public abstract StringBuilder nameToASCII(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
- method public abstract StringBuilder nameToUnicode(CharSequence, StringBuilder, android.icu.text.IDNA.Info);
- field public static final int CHECK_BIDI = 4; // 0x4
- field public static final int CHECK_CONTEXTJ = 8; // 0x8
- field public static final int CHECK_CONTEXTO = 64; // 0x40
- field public static final int DEFAULT = 0; // 0x0
- field public static final int NONTRANSITIONAL_TO_ASCII = 16; // 0x10
- field public static final int NONTRANSITIONAL_TO_UNICODE = 32; // 0x20
- field public static final int USE_STD3_RULES = 2; // 0x2
- }
-
- public enum IDNA.Error {
- enum_constant public static final android.icu.text.IDNA.Error BIDI;
- enum_constant public static final android.icu.text.IDNA.Error CONTEXTJ;
- enum_constant public static final android.icu.text.IDNA.Error CONTEXTO_DIGITS;
- enum_constant public static final android.icu.text.IDNA.Error CONTEXTO_PUNCTUATION;
- enum_constant public static final android.icu.text.IDNA.Error DISALLOWED;
- enum_constant public static final android.icu.text.IDNA.Error DOMAIN_NAME_TOO_LONG;
- enum_constant public static final android.icu.text.IDNA.Error EMPTY_LABEL;
- enum_constant public static final android.icu.text.IDNA.Error HYPHEN_3_4;
- enum_constant public static final android.icu.text.IDNA.Error INVALID_ACE_LABEL;
- enum_constant public static final android.icu.text.IDNA.Error LABEL_HAS_DOT;
- enum_constant public static final android.icu.text.IDNA.Error LABEL_TOO_LONG;
- enum_constant public static final android.icu.text.IDNA.Error LEADING_COMBINING_MARK;
- enum_constant public static final android.icu.text.IDNA.Error LEADING_HYPHEN;
- enum_constant public static final android.icu.text.IDNA.Error PUNYCODE;
- enum_constant public static final android.icu.text.IDNA.Error TRAILING_HYPHEN;
- }
-
- public static final class IDNA.Info {
- ctor public IDNA.Info();
- method public java.util.Set<android.icu.text.IDNA.Error> getErrors();
- method public boolean hasErrors();
- method public boolean isTransitionalDifferent();
- }
-
- public final class ListFormatter {
- method public String format(java.lang.Object...);
- method public String format(java.util.Collection<?>);
- method public static android.icu.text.ListFormatter getInstance(android.icu.util.ULocale);
- method public static android.icu.text.ListFormatter getInstance(java.util.Locale);
- method public static android.icu.text.ListFormatter getInstance();
- method public String getPatternForNumItems(int);
- }
-
- public abstract class LocaleDisplayNames {
- method public abstract android.icu.text.DisplayContext getContext(android.icu.text.DisplayContext.Type);
- method public abstract android.icu.text.LocaleDisplayNames.DialectHandling getDialectHandling();
- method public static android.icu.text.LocaleDisplayNames getInstance(android.icu.util.ULocale);
- method public static android.icu.text.LocaleDisplayNames getInstance(java.util.Locale);
- method public static android.icu.text.LocaleDisplayNames getInstance(android.icu.util.ULocale, android.icu.text.LocaleDisplayNames.DialectHandling);
- method public static android.icu.text.LocaleDisplayNames getInstance(android.icu.util.ULocale, android.icu.text.DisplayContext...);
- method public static android.icu.text.LocaleDisplayNames getInstance(java.util.Locale, android.icu.text.DisplayContext...);
- method public abstract android.icu.util.ULocale getLocale();
- method public java.util.List<android.icu.text.LocaleDisplayNames.UiListItem> getUiList(java.util.Set<android.icu.util.ULocale>, boolean, java.util.Comparator<java.lang.Object>);
- method public abstract java.util.List<android.icu.text.LocaleDisplayNames.UiListItem> getUiListCompareWholeItems(java.util.Set<android.icu.util.ULocale>, java.util.Comparator<android.icu.text.LocaleDisplayNames.UiListItem>);
- method public abstract String keyDisplayName(String);
- method public abstract String keyValueDisplayName(String, String);
- method public abstract String languageDisplayName(String);
- method public abstract String localeDisplayName(android.icu.util.ULocale);
- method public abstract String localeDisplayName(java.util.Locale);
- method public abstract String localeDisplayName(String);
- method public abstract String regionDisplayName(String);
- method public abstract String scriptDisplayName(String);
- method public abstract String scriptDisplayName(int);
- method public abstract String variantDisplayName(String);
- }
-
- public enum LocaleDisplayNames.DialectHandling {
- enum_constant public static final android.icu.text.LocaleDisplayNames.DialectHandling DIALECT_NAMES;
- enum_constant public static final android.icu.text.LocaleDisplayNames.DialectHandling STANDARD_NAMES;
- }
-
- public static class LocaleDisplayNames.UiListItem {
- ctor public LocaleDisplayNames.UiListItem(android.icu.util.ULocale, android.icu.util.ULocale, String, String);
- method public static java.util.Comparator<android.icu.text.LocaleDisplayNames.UiListItem> getComparator(java.util.Comparator<java.lang.Object>, boolean);
- field public final android.icu.util.ULocale minimized;
- field public final android.icu.util.ULocale modified;
- field public final String nameInDisplayLocale;
- field public final String nameInSelf;
- }
-
- public class MeasureFormat extends android.icu.text.UFormat {
- method public final boolean equals(Object);
- method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public StringBuilder formatMeasurePerUnit(android.icu.util.Measure, android.icu.util.MeasureUnit, StringBuilder, java.text.FieldPosition);
- method public final String formatMeasures(android.icu.util.Measure...);
- method public StringBuilder formatMeasures(StringBuilder, java.text.FieldPosition, android.icu.util.Measure...);
- method public static android.icu.text.MeasureFormat getCurrencyFormat(android.icu.util.ULocale);
- method public static android.icu.text.MeasureFormat getCurrencyFormat(java.util.Locale);
- method public static android.icu.text.MeasureFormat getCurrencyFormat();
- method public static android.icu.text.MeasureFormat getInstance(android.icu.util.ULocale, android.icu.text.MeasureFormat.FormatWidth);
- method public static android.icu.text.MeasureFormat getInstance(java.util.Locale, android.icu.text.MeasureFormat.FormatWidth);
- method public static android.icu.text.MeasureFormat getInstance(android.icu.util.ULocale, android.icu.text.MeasureFormat.FormatWidth, android.icu.text.NumberFormat);
- method public static android.icu.text.MeasureFormat getInstance(java.util.Locale, android.icu.text.MeasureFormat.FormatWidth, android.icu.text.NumberFormat);
- method public final android.icu.util.ULocale getLocale();
- method public android.icu.text.NumberFormat getNumberFormat();
- method public String getUnitDisplayName(android.icu.util.MeasureUnit);
- method public android.icu.text.MeasureFormat.FormatWidth getWidth();
- method public final int hashCode();
- method public android.icu.util.Measure parseObject(String, java.text.ParsePosition);
- }
-
- public enum MeasureFormat.FormatWidth {
- enum_constant public static final android.icu.text.MeasureFormat.FormatWidth NARROW;
- enum_constant public static final android.icu.text.MeasureFormat.FormatWidth NUMERIC;
- enum_constant public static final android.icu.text.MeasureFormat.FormatWidth SHORT;
- enum_constant public static final android.icu.text.MeasureFormat.FormatWidth WIDE;
- }
-
- public class MessageFormat extends android.icu.text.UFormat {
- ctor public MessageFormat(String);
- ctor public MessageFormat(String, java.util.Locale);
- ctor public MessageFormat(String, android.icu.util.ULocale);
- method public void applyPattern(String);
- method public void applyPattern(String, android.icu.text.MessagePattern.ApostropheMode);
- method public static String autoQuoteApostrophe(String);
- method public final StringBuffer format(Object[], StringBuffer, java.text.FieldPosition);
- method public final StringBuffer format(java.util.Map<java.lang.String,java.lang.Object>, StringBuffer, java.text.FieldPosition);
- method public static String format(String, java.lang.Object...);
- method public static String format(String, java.util.Map<java.lang.String,java.lang.Object>);
- method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public android.icu.text.MessagePattern.ApostropheMode getApostropheMode();
- method public java.util.Set<java.lang.String> getArgumentNames();
- method public java.text.Format getFormatByArgumentName(String);
- method public java.text.Format[] getFormats();
- method public java.text.Format[] getFormatsByArgumentIndex();
- method public java.util.Locale getLocale();
- method public android.icu.util.ULocale getULocale();
- method public Object[] parse(String, java.text.ParsePosition);
- method public Object[] parse(String) throws java.text.ParseException;
- method public Object parseObject(String, java.text.ParsePosition);
- method public java.util.Map<java.lang.String,java.lang.Object> parseToMap(String, java.text.ParsePosition);
- method public java.util.Map<java.lang.String,java.lang.Object> parseToMap(String) throws java.text.ParseException;
- method public void setFormat(int, java.text.Format);
- method public void setFormatByArgumentIndex(int, java.text.Format);
- method public void setFormatByArgumentName(String, java.text.Format);
- method public void setFormats(java.text.Format[]);
- method public void setFormatsByArgumentIndex(java.text.Format[]);
- method public void setFormatsByArgumentName(java.util.Map<java.lang.String,java.text.Format>);
- method public void setLocale(java.util.Locale);
- method public void setLocale(android.icu.util.ULocale);
- method public String toPattern();
- method public boolean usesNamedArguments();
- }
-
- public static class MessageFormat.Field extends java.text.Format.Field {
- ctor protected MessageFormat.Field(String);
- field public static final android.icu.text.MessageFormat.Field ARGUMENT;
- }
-
- public final class MessagePattern implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.MessagePattern> {
- ctor public MessagePattern();
- ctor public MessagePattern(android.icu.text.MessagePattern.ApostropheMode);
- ctor public MessagePattern(String);
- method public String autoQuoteApostropheDeep();
- method public void clear();
- method public void clearPatternAndSetApostropheMode(android.icu.text.MessagePattern.ApostropheMode);
- method public Object clone();
- method public android.icu.text.MessagePattern cloneAsThawed();
- method public int countParts();
- method public android.icu.text.MessagePattern freeze();
- method public android.icu.text.MessagePattern.ApostropheMode getApostropheMode();
- method public int getLimitPartIndex(int);
- method public double getNumericValue(android.icu.text.MessagePattern.Part);
- method public android.icu.text.MessagePattern.Part getPart(int);
- method public android.icu.text.MessagePattern.Part.Type getPartType(int);
- method public int getPatternIndex(int);
- method public String getPatternString();
- method public double getPluralOffset(int);
- method public String getSubstring(android.icu.text.MessagePattern.Part);
- method public boolean hasNamedArguments();
- method public boolean hasNumberedArguments();
- method public boolean isFrozen();
- method public android.icu.text.MessagePattern parse(String);
- method public android.icu.text.MessagePattern parseChoiceStyle(String);
- method public android.icu.text.MessagePattern parsePluralStyle(String);
- method public android.icu.text.MessagePattern parseSelectStyle(String);
- method public boolean partSubstringMatches(android.icu.text.MessagePattern.Part, String);
- method public static int validateArgumentName(String);
- field public static final int ARG_NAME_NOT_NUMBER = -1; // 0xffffffff
- field public static final int ARG_NAME_NOT_VALID = -2; // 0xfffffffe
- field public static final double NO_NUMERIC_VALUE = -1.23456789E8;
- }
-
- public enum MessagePattern.ApostropheMode {
- enum_constant public static final android.icu.text.MessagePattern.ApostropheMode DOUBLE_OPTIONAL;
- enum_constant public static final android.icu.text.MessagePattern.ApostropheMode DOUBLE_REQUIRED;
- }
-
- public enum MessagePattern.ArgType {
- method public boolean hasPluralStyle();
- enum_constant public static final android.icu.text.MessagePattern.ArgType CHOICE;
- enum_constant public static final android.icu.text.MessagePattern.ArgType NONE;
- enum_constant public static final android.icu.text.MessagePattern.ArgType PLURAL;
- enum_constant public static final android.icu.text.MessagePattern.ArgType SELECT;
- enum_constant public static final android.icu.text.MessagePattern.ArgType SELECTORDINAL;
- enum_constant public static final android.icu.text.MessagePattern.ArgType SIMPLE;
- }
-
- public static final class MessagePattern.Part {
- method public android.icu.text.MessagePattern.ArgType getArgType();
- method public int getIndex();
- method public int getLength();
- method public int getLimit();
- method public android.icu.text.MessagePattern.Part.Type getType();
- method public int getValue();
- }
-
- public enum MessagePattern.Part.Type {
- method public boolean hasNumericValue();
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_DOUBLE;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_INT;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_LIMIT;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_NAME;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_NUMBER;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_SELECTOR;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_START;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_STYLE;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_TYPE;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type INSERT_CHAR;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type MSG_LIMIT;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type MSG_START;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type REPLACE_NUMBER;
- enum_constant public static final android.icu.text.MessagePattern.Part.Type SKIP_SYNTAX;
- }
-
- public final class Normalizer implements java.lang.Cloneable {
- method @Deprecated public Object clone();
- method public static int compare(char[], int, int, char[], int, int, int);
- method public static int compare(String, String, int);
- method public static int compare(char[], char[], int);
- method public static int compare(int, int, int);
- method public static int compare(int, String, int);
- field public static final int COMPARE_CODE_POINT_ORDER = 32768; // 0x8000
- field public static final int COMPARE_IGNORE_CASE = 65536; // 0x10000
- field public static final int FOLD_CASE_DEFAULT = 0; // 0x0
- field public static final int FOLD_CASE_EXCLUDE_SPECIAL_I = 1; // 0x1
- field public static final int INPUT_IS_FCD = 131072; // 0x20000
- field public static final android.icu.text.Normalizer.QuickCheckResult MAYBE;
- field public static final android.icu.text.Normalizer.QuickCheckResult NO;
- field public static final android.icu.text.Normalizer.QuickCheckResult YES;
- }
-
- public static final class Normalizer.QuickCheckResult {
- }
-
- public abstract class Normalizer2 {
- method public abstract StringBuilder append(StringBuilder, CharSequence);
- method public int composePair(int, int);
- method public int getCombiningClass(int);
- method public abstract String getDecomposition(int);
- method public static android.icu.text.Normalizer2 getInstance(java.io.InputStream, String, android.icu.text.Normalizer2.Mode);
- method public static android.icu.text.Normalizer2 getNFCInstance();
- method public static android.icu.text.Normalizer2 getNFDInstance();
- method public static android.icu.text.Normalizer2 getNFKCCasefoldInstance();
- method public static android.icu.text.Normalizer2 getNFKCInstance();
- method public static android.icu.text.Normalizer2 getNFKDInstance();
- method public String getRawDecomposition(int);
- method public abstract boolean hasBoundaryAfter(int);
- method public abstract boolean hasBoundaryBefore(int);
- method public abstract boolean isInert(int);
- method public abstract boolean isNormalized(CharSequence);
- method public String normalize(CharSequence);
- method public abstract StringBuilder normalize(CharSequence, StringBuilder);
- method public abstract Appendable normalize(CharSequence, Appendable);
- method public abstract StringBuilder normalizeSecondAndAppend(StringBuilder, CharSequence);
- method public abstract android.icu.text.Normalizer.QuickCheckResult quickCheck(CharSequence);
- method public abstract int spanQuickCheckYes(CharSequence);
- }
-
- public enum Normalizer2.Mode {
- enum_constant public static final android.icu.text.Normalizer2.Mode COMPOSE;
- enum_constant public static final android.icu.text.Normalizer2.Mode COMPOSE_CONTIGUOUS;
- enum_constant public static final android.icu.text.Normalizer2.Mode DECOMPOSE;
- enum_constant public static final android.icu.text.Normalizer2.Mode FCD;
- }
-
- public abstract class NumberFormat extends android.icu.text.UFormat {
- ctor public NumberFormat();
- method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public final String format(double);
- method public final String format(long);
- method public final String format(java.math.BigInteger);
- method public final String format(java.math.BigDecimal);
- method public final String format(android.icu.math.BigDecimal);
- method public final String format(android.icu.util.CurrencyAmount);
- method public abstract StringBuffer format(double, StringBuffer, java.text.FieldPosition);
- method public abstract StringBuffer format(long, StringBuffer, java.text.FieldPosition);
- method public abstract StringBuffer format(java.math.BigInteger, StringBuffer, java.text.FieldPosition);
- method public abstract StringBuffer format(java.math.BigDecimal, StringBuffer, java.text.FieldPosition);
- method public abstract StringBuffer format(android.icu.math.BigDecimal, StringBuffer, java.text.FieldPosition);
- method public StringBuffer format(android.icu.util.CurrencyAmount, StringBuffer, java.text.FieldPosition);
- method public static java.util.Locale[] getAvailableLocales();
- method public android.icu.text.DisplayContext getContext(android.icu.text.DisplayContext.Type);
- method public android.icu.util.Currency getCurrency();
- method public static final android.icu.text.NumberFormat getCurrencyInstance();
- method public static android.icu.text.NumberFormat getCurrencyInstance(java.util.Locale);
- method public static android.icu.text.NumberFormat getCurrencyInstance(android.icu.util.ULocale);
- method public static final android.icu.text.NumberFormat getInstance();
- method public static android.icu.text.NumberFormat getInstance(java.util.Locale);
- method public static android.icu.text.NumberFormat getInstance(android.icu.util.ULocale);
- method public static final android.icu.text.NumberFormat getInstance(int);
- method public static android.icu.text.NumberFormat getInstance(java.util.Locale, int);
- method public static android.icu.text.NumberFormat getInstance(android.icu.util.ULocale, int);
- method public static final android.icu.text.NumberFormat getIntegerInstance();
- method public static android.icu.text.NumberFormat getIntegerInstance(java.util.Locale);
- method public static android.icu.text.NumberFormat getIntegerInstance(android.icu.util.ULocale);
- method public int getMaximumFractionDigits();
- method public int getMaximumIntegerDigits();
- method public int getMinimumFractionDigits();
- method public int getMinimumIntegerDigits();
- method public static final android.icu.text.NumberFormat getNumberInstance();
- method public static android.icu.text.NumberFormat getNumberInstance(java.util.Locale);
- method public static android.icu.text.NumberFormat getNumberInstance(android.icu.util.ULocale);
- method protected static String getPattern(android.icu.util.ULocale, int);
- method public static final android.icu.text.NumberFormat getPercentInstance();
- method public static android.icu.text.NumberFormat getPercentInstance(java.util.Locale);
- method public static android.icu.text.NumberFormat getPercentInstance(android.icu.util.ULocale);
- method public int getRoundingMode();
- method public static final android.icu.text.NumberFormat getScientificInstance();
- method public static android.icu.text.NumberFormat getScientificInstance(java.util.Locale);
- method public static android.icu.text.NumberFormat getScientificInstance(android.icu.util.ULocale);
- method public boolean isGroupingUsed();
- method public boolean isParseIntegerOnly();
- method public boolean isParseStrict();
- method public abstract Number parse(String, java.text.ParsePosition);
- method public Number parse(String) throws java.text.ParseException;
- method public android.icu.util.CurrencyAmount parseCurrency(CharSequence, java.text.ParsePosition);
- method public final Object parseObject(String, java.text.ParsePosition);
- method public void setContext(android.icu.text.DisplayContext);
- method public void setCurrency(android.icu.util.Currency);
- method public void setGroupingUsed(boolean);
- method public void setMaximumFractionDigits(int);
- method public void setMaximumIntegerDigits(int);
- method public void setMinimumFractionDigits(int);
- method public void setMinimumIntegerDigits(int);
- method public void setParseIntegerOnly(boolean);
- method public void setParseStrict(boolean);
- method public void setRoundingMode(int);
- field public static final int ACCOUNTINGCURRENCYSTYLE = 7; // 0x7
- field public static final int CASHCURRENCYSTYLE = 8; // 0x8
- field public static final int CURRENCYSTYLE = 1; // 0x1
- field public static final int FRACTION_FIELD = 1; // 0x1
- field public static final int INTEGERSTYLE = 4; // 0x4
- field public static final int INTEGER_FIELD = 0; // 0x0
- field public static final int ISOCURRENCYSTYLE = 5; // 0x5
- field public static final int NUMBERSTYLE = 0; // 0x0
- field public static final int PERCENTSTYLE = 2; // 0x2
- field public static final int PLURALCURRENCYSTYLE = 6; // 0x6
- field public static final int SCIENTIFICSTYLE = 3; // 0x3
- field public static final int STANDARDCURRENCYSTYLE = 9; // 0x9
- }
-
- public static class NumberFormat.Field extends java.text.Format.Field {
- ctor protected NumberFormat.Field(String);
- field public static final android.icu.text.NumberFormat.Field CURRENCY;
- field public static final android.icu.text.NumberFormat.Field DECIMAL_SEPARATOR;
- field public static final android.icu.text.NumberFormat.Field EXPONENT;
- field public static final android.icu.text.NumberFormat.Field EXPONENT_SIGN;
- field public static final android.icu.text.NumberFormat.Field EXPONENT_SYMBOL;
- field public static final android.icu.text.NumberFormat.Field FRACTION;
- field public static final android.icu.text.NumberFormat.Field GROUPING_SEPARATOR;
- field public static final android.icu.text.NumberFormat.Field INTEGER;
- field public static final android.icu.text.NumberFormat.Field PERCENT;
- field public static final android.icu.text.NumberFormat.Field PERMILLE;
- field public static final android.icu.text.NumberFormat.Field SIGN;
- }
-
- public class NumberingSystem {
- ctor public NumberingSystem();
- method public static String[] getAvailableNames();
- method public String getDescription();
- method public static android.icu.text.NumberingSystem getInstance(int, boolean, String);
- method public static android.icu.text.NumberingSystem getInstance(java.util.Locale);
- method public static android.icu.text.NumberingSystem getInstance(android.icu.util.ULocale);
- method public static android.icu.text.NumberingSystem getInstance();
- method public static android.icu.text.NumberingSystem getInstanceByName(String);
- method public String getName();
- method public int getRadix();
- method public boolean isAlgorithmic();
- method public static boolean isValidDigitString(String);
- field public static final android.icu.text.NumberingSystem LATIN;
- }
-
- public class PluralFormat extends android.icu.text.UFormat {
- ctor public PluralFormat();
- ctor public PluralFormat(android.icu.util.ULocale);
- ctor public PluralFormat(java.util.Locale);
- ctor public PluralFormat(android.icu.text.PluralRules);
- ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules);
- ctor public PluralFormat(java.util.Locale, android.icu.text.PluralRules);
- ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType);
- ctor public PluralFormat(java.util.Locale, android.icu.text.PluralRules.PluralType);
- ctor public PluralFormat(String);
- ctor public PluralFormat(android.icu.util.ULocale, String);
- ctor public PluralFormat(android.icu.text.PluralRules, String);
- ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules, String);
- ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType, String);
- method public void applyPattern(String);
- method public boolean equals(android.icu.text.PluralFormat);
- method public final String format(double);
- method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public Number parse(String, java.text.ParsePosition);
- method public Object parseObject(String, java.text.ParsePosition);
- method public void setNumberFormat(android.icu.text.NumberFormat);
- method public String toPattern();
- }
-
- public class PluralRules implements java.io.Serializable {
- method public static android.icu.text.PluralRules createRules(String);
- method public boolean equals(android.icu.text.PluralRules);
- method public static android.icu.text.PluralRules forLocale(android.icu.util.ULocale);
- method public static android.icu.text.PluralRules forLocale(java.util.Locale);
- method public static android.icu.text.PluralRules forLocale(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType);
- method public static android.icu.text.PluralRules forLocale(java.util.Locale, android.icu.text.PluralRules.PluralType);
- method public java.util.Collection<java.lang.Double> getAllKeywordValues(String);
- method public java.util.Set<java.lang.String> getKeywords();
- method public java.util.Collection<java.lang.Double> getSamples(String);
- method public double getUniqueKeywordValue(String);
- method public static android.icu.text.PluralRules parseDescription(String) throws java.text.ParseException;
- method public String select(double);
- field public static final android.icu.text.PluralRules DEFAULT;
- field public static final String KEYWORD_FEW = "few";
- field public static final String KEYWORD_MANY = "many";
- field public static final String KEYWORD_ONE = "one";
- field public static final String KEYWORD_OTHER = "other";
- field public static final String KEYWORD_TWO = "two";
- field public static final String KEYWORD_ZERO = "zero";
- field public static final double NO_UNIQUE_VALUE = -0.00123456777;
- }
-
- public enum PluralRules.PluralType {
- enum_constant public static final android.icu.text.PluralRules.PluralType CARDINAL;
- enum_constant public static final android.icu.text.PluralRules.PluralType ORDINAL;
- }
-
- public final class RelativeDateTimeFormatter {
- method public String combineDateAndTime(String, String);
- method public String format(double, android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.RelativeUnit);
- method public String format(android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit);
- method public String format(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit);
- method public String formatNumeric(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit);
- method public android.icu.text.DisplayContext getCapitalizationContext();
- method public android.icu.text.RelativeDateTimeFormatter.Style getFormatStyle();
- method public static android.icu.text.RelativeDateTimeFormatter getInstance();
- method public static android.icu.text.RelativeDateTimeFormatter getInstance(android.icu.util.ULocale);
- method public static android.icu.text.RelativeDateTimeFormatter getInstance(java.util.Locale);
- method public static android.icu.text.RelativeDateTimeFormatter getInstance(android.icu.util.ULocale, android.icu.text.NumberFormat);
- method public static android.icu.text.RelativeDateTimeFormatter getInstance(android.icu.util.ULocale, android.icu.text.NumberFormat, android.icu.text.RelativeDateTimeFormatter.Style, android.icu.text.DisplayContext);
- method public static android.icu.text.RelativeDateTimeFormatter getInstance(java.util.Locale, android.icu.text.NumberFormat);
- method public android.icu.text.NumberFormat getNumberFormat();
- }
-
- public enum RelativeDateTimeFormatter.AbsoluteUnit {
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit DAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit FRIDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit MONDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit MONTH;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit NOW;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit SATURDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit SUNDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit THURSDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit TUESDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit WEDNESDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit WEEK;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit YEAR;
- }
-
- public enum RelativeDateTimeFormatter.Direction {
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction LAST;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction LAST_2;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction NEXT;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction NEXT_2;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction PLAIN;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction THIS;
- }
-
- public enum RelativeDateTimeFormatter.RelativeDateTimeUnit {
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit DAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit FRIDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit HOUR;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit MINUTE;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit MONDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit MONTH;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit QUARTER;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit SATURDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit SECOND;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit SUNDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit THURSDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit TUESDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit WEDNESDAY;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit WEEK;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit YEAR;
- }
-
- public enum RelativeDateTimeFormatter.RelativeUnit {
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit DAYS;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit HOURS;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit MINUTES;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit MONTHS;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit SECONDS;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit WEEKS;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit YEARS;
- }
-
- public enum RelativeDateTimeFormatter.Style {
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style LONG;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style NARROW;
- enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style SHORT;
- }
-
- public interface Replaceable {
- method public int char32At(int);
- method public char charAt(int);
- method public void copy(int, int, int);
- method public void getChars(int, int, char[], int);
- method public boolean hasMetaData();
- method public int length();
- method public void replace(int, int, String);
- method public void replace(int, int, char[], int, int);
- }
-
- public final class RuleBasedCollator extends android.icu.text.Collator {
- ctor public RuleBasedCollator(String) throws java.lang.Exception;
- method public android.icu.text.RuleBasedCollator cloneAsThawed();
- method public int compare(String, String);
- method public android.icu.text.CollationElementIterator getCollationElementIterator(String);
- method public android.icu.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator);
- method public android.icu.text.CollationElementIterator getCollationElementIterator(android.icu.text.UCharacterIterator);
- method public android.icu.text.CollationKey getCollationKey(String);
- method public void getContractionsAndExpansions(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet, boolean) throws java.lang.Exception;
- method public boolean getNumericCollation();
- method public String getRules();
- method public String getRules(boolean);
- method public android.icu.util.VersionInfo getUCAVersion();
- method public int getVariableTop();
- method public android.icu.util.VersionInfo getVersion();
- method public boolean isAlternateHandlingShifted();
- method public boolean isCaseLevel();
- method public boolean isFrenchCollation();
- method public boolean isLowerCaseFirst();
- method public boolean isUpperCaseFirst();
- method public void setAlternateHandlingDefault();
- method public void setAlternateHandlingShifted(boolean);
- method public void setCaseFirstDefault();
- method public void setCaseLevel(boolean);
- method public void setCaseLevelDefault();
- method public void setDecompositionDefault();
- method public void setFrenchCollation(boolean);
- method public void setFrenchCollationDefault();
- method public void setLowerCaseFirst(boolean);
- method public android.icu.text.RuleBasedCollator setMaxVariable(int);
- method public void setNumericCollation(boolean);
- method public void setNumericCollationDefault();
- method public void setStrengthDefault();
- method public void setUpperCaseFirst(boolean);
- }
-
- public final class ScientificNumberFormatter {
- method public String format(Object);
- method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.util.ULocale, String, String);
- method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.text.DecimalFormat, String, String);
- method public static android.icu.text.ScientificNumberFormatter getSuperscriptInstance(android.icu.util.ULocale);
- method public static android.icu.text.ScientificNumberFormatter getSuperscriptInstance(android.icu.text.DecimalFormat);
- }
-
- public abstract class SearchIterator {
- ctor protected SearchIterator(java.text.CharacterIterator, android.icu.text.BreakIterator);
- method public final int first();
- method public final int following(int);
- method public android.icu.text.BreakIterator getBreakIterator();
- method public android.icu.text.SearchIterator.ElementComparisonType getElementComparisonType();
- method public abstract int getIndex();
- method public int getMatchLength();
- method public int getMatchStart();
- method public String getMatchedText();
- method public java.text.CharacterIterator getTarget();
- method protected abstract int handleNext(int);
- method protected abstract int handlePrevious(int);
- method public boolean isOverlapping();
- method public final int last();
- method public int next();
- method public final int preceding(int);
- method public int previous();
- method public void reset();
- method public void setBreakIterator(android.icu.text.BreakIterator);
- method public void setElementComparisonType(android.icu.text.SearchIterator.ElementComparisonType);
- method public void setIndex(int);
- method protected void setMatchLength(int);
- method public void setOverlapping(boolean);
- method public void setTarget(java.text.CharacterIterator);
- field public static final int DONE = -1; // 0xffffffff
- field protected android.icu.text.BreakIterator breakIterator;
- field protected int matchLength;
- field protected java.text.CharacterIterator targetText;
- }
-
- public enum SearchIterator.ElementComparisonType {
- enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType ANY_BASE_WEIGHT_IS_WILDCARD;
- enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType PATTERN_BASE_WEIGHT_IS_WILDCARD;
- enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType STANDARD_ELEMENT_COMPARISON;
- }
-
- public class SelectFormat extends java.text.Format {
- ctor public SelectFormat(String);
- method public void applyPattern(String);
- method public final String format(String);
- method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public Object parseObject(String, java.text.ParsePosition);
- method public String toPattern();
- }
-
- public class SimpleDateFormat extends android.icu.text.DateFormat {
- ctor public SimpleDateFormat();
- ctor public SimpleDateFormat(String);
- ctor public SimpleDateFormat(String, java.util.Locale);
- ctor public SimpleDateFormat(String, android.icu.util.ULocale);
- ctor public SimpleDateFormat(String, String, android.icu.util.ULocale);
- ctor public SimpleDateFormat(String, android.icu.text.DateFormatSymbols);
- method public void applyLocalizedPattern(String);
- method public void applyPattern(String);
- method public StringBuffer format(android.icu.util.Calendar, StringBuffer, java.text.FieldPosition);
- method public java.util.Date get2DigitYearStart();
- method public android.icu.text.DateFormatSymbols getDateFormatSymbols();
- method public android.icu.text.NumberFormat getNumberFormat(char);
- method protected android.icu.text.DateFormatSymbols getSymbols();
- method public android.icu.text.TimeZoneFormat getTimeZoneFormat();
- method protected int matchQuarterString(String, int, int, String[], android.icu.util.Calendar);
- method protected int matchString(String, int, int, String[], android.icu.util.Calendar);
- method public void parse(String, android.icu.util.Calendar, java.text.ParsePosition);
- method protected android.icu.text.DateFormat.Field patternCharToDateFormatField(char);
- method public void set2DigitYearStart(java.util.Date);
- method public void setDateFormatSymbols(android.icu.text.DateFormatSymbols);
- method public void setNumberFormat(String, android.icu.text.NumberFormat);
- method public void setTimeZoneFormat(android.icu.text.TimeZoneFormat);
- method protected String subFormat(char, int, int, java.text.FieldPosition, android.icu.text.DateFormatSymbols, android.icu.util.Calendar) throws java.lang.IllegalArgumentException;
- method protected int subParse(String, int, char, int, boolean, boolean, boolean[], android.icu.util.Calendar);
- method public String toLocalizedPattern();
- method public String toPattern();
- method protected String zeroPaddingNumber(long, int, int);
- }
-
- public class StringPrepParseException extends java.text.ParseException {
- ctor public StringPrepParseException(String, int);
- ctor public StringPrepParseException(String, int, String, int);
- ctor public StringPrepParseException(String, int, String, int, int);
- method public int getError();
- field public static final int ACE_PREFIX_ERROR = 6; // 0x6
- field public static final int BUFFER_OVERFLOW_ERROR = 9; // 0x9
- field public static final int CHECK_BIDI_ERROR = 4; // 0x4
- field public static final int DOMAIN_NAME_TOO_LONG_ERROR = 11; // 0xb
- field public static final int ILLEGAL_CHAR_FOUND = 1; // 0x1
- field public static final int INVALID_CHAR_FOUND = 0; // 0x0
- field public static final int LABEL_TOO_LONG_ERROR = 8; // 0x8
- field public static final int PROHIBITED_ERROR = 2; // 0x2
- field public static final int STD3_ASCII_RULES_ERROR = 5; // 0x5
- field public static final int UNASSIGNED_ERROR = 3; // 0x3
- field public static final int VERIFICATION_ERROR = 7; // 0x7
- field public static final int ZERO_LENGTH_LABEL = 10; // 0xa
- }
-
- public final class StringSearch extends android.icu.text.SearchIterator {
- ctor public StringSearch(String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator, android.icu.text.BreakIterator);
- ctor public StringSearch(String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator);
- ctor public StringSearch(String, java.text.CharacterIterator, java.util.Locale);
- ctor public StringSearch(String, java.text.CharacterIterator, android.icu.util.ULocale);
- ctor public StringSearch(String, String);
- method public android.icu.text.RuleBasedCollator getCollator();
- method public int getIndex();
- method public String getPattern();
- method protected int handleNext(int);
- method protected int handlePrevious(int);
- method public boolean isCanonical();
- method public void setCanonical(boolean);
- method public void setCollator(android.icu.text.RuleBasedCollator);
- method public void setPattern(String);
- }
-
- public interface SymbolTable {
- method public char[] lookup(String);
- method public android.icu.text.UnicodeMatcher lookupMatcher(int);
- method public String parseReference(String, java.text.ParsePosition, int);
- field public static final char SYMBOL_REF = 36; // 0x0024 '$'
- }
-
- public class TimeZoneFormat extends android.icu.text.UFormat implements android.icu.util.Freezable<android.icu.text.TimeZoneFormat> java.io.Serializable {
- ctor protected TimeZoneFormat(android.icu.util.ULocale);
- method public android.icu.text.TimeZoneFormat cloneAsThawed();
- method public final String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long);
- method public String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
- method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition);
- method public final String formatOffsetISO8601Basic(int, boolean, boolean, boolean);
- method public final String formatOffsetISO8601Extended(int, boolean, boolean, boolean);
- method public String formatOffsetLocalizedGMT(int);
- method public String formatOffsetShortLocalizedGMT(int);
- method public android.icu.text.TimeZoneFormat freeze();
- method public java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption> getDefaultParseOptions();
- method public String getGMTOffsetDigits();
- method public String getGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType);
- method public String getGMTPattern();
- method public String getGMTZeroFormat();
- method public static android.icu.text.TimeZoneFormat getInstance(android.icu.util.ULocale);
- method public static android.icu.text.TimeZoneFormat getInstance(java.util.Locale);
- method public android.icu.text.TimeZoneNames getTimeZoneNames();
- method public boolean isFrozen();
- method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, String, java.text.ParsePosition, java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption>, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
- method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, String, java.text.ParsePosition, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>);
- method public final android.icu.util.TimeZone parse(String, java.text.ParsePosition);
- method public final android.icu.util.TimeZone parse(String) throws java.text.ParseException;
- method public Object parseObject(String, java.text.ParsePosition);
- method public final int parseOffsetISO8601(String, java.text.ParsePosition);
- method public int parseOffsetLocalizedGMT(String, java.text.ParsePosition);
- method public int parseOffsetShortLocalizedGMT(String, java.text.ParsePosition);
- method public android.icu.text.TimeZoneFormat setDefaultParseOptions(java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption>);
- method public android.icu.text.TimeZoneFormat setGMTOffsetDigits(String);
- method public android.icu.text.TimeZoneFormat setGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType, String);
- method public android.icu.text.TimeZoneFormat setGMTPattern(String);
- method public android.icu.text.TimeZoneFormat setGMTZeroFormat(String);
- method public android.icu.text.TimeZoneFormat setTimeZoneNames(android.icu.text.TimeZoneNames);
- }
-
- public enum TimeZoneFormat.GMTOffsetPatternType {
- enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_H;
- enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_HM;
- enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_HMS;
- enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType POSITIVE_H;
- enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType POSITIVE_HM;
- enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType POSITIVE_HMS;
- }
-
- public enum TimeZoneFormat.ParseOption {
- enum_constant public static final android.icu.text.TimeZoneFormat.ParseOption ALL_STYLES;
- enum_constant public static final android.icu.text.TimeZoneFormat.ParseOption TZ_DATABASE_ABBREVIATIONS;
- }
-
- public enum TimeZoneFormat.Style {
- enum_constant public static final android.icu.text.TimeZoneFormat.Style EXEMPLAR_LOCATION;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_LOCATION;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_LONG;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_SHORT;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_FIXED;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_FULL;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_LOCAL_FIXED;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_LOCAL_FULL;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_LOCAL_SHORT;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_SHORT;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_FIXED;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_FULL;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_LOCAL_FIXED;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_LOCAL_FULL;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style LOCALIZED_GMT;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style LOCALIZED_GMT_SHORT;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style SPECIFIC_LONG;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style SPECIFIC_SHORT;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ZONE_ID;
- enum_constant public static final android.icu.text.TimeZoneFormat.Style ZONE_ID_SHORT;
- }
-
- public enum TimeZoneFormat.TimeType {
- enum_constant public static final android.icu.text.TimeZoneFormat.TimeType DAYLIGHT;
- enum_constant public static final android.icu.text.TimeZoneFormat.TimeType STANDARD;
- enum_constant public static final android.icu.text.TimeZoneFormat.TimeType UNKNOWN;
- }
-
- public abstract class TimeZoneNames implements java.io.Serializable {
- method public abstract java.util.Set<java.lang.String> getAvailableMetaZoneIDs();
- method public abstract java.util.Set<java.lang.String> getAvailableMetaZoneIDs(String);
- method public final String getDisplayName(String, android.icu.text.TimeZoneNames.NameType, long);
- method public String getExemplarLocationName(String);
- method public static android.icu.text.TimeZoneNames getInstance(android.icu.util.ULocale);
- method public static android.icu.text.TimeZoneNames getInstance(java.util.Locale);
- method public abstract String getMetaZoneDisplayName(String, android.icu.text.TimeZoneNames.NameType);
- method public abstract String getMetaZoneID(String, long);
- method public abstract String getReferenceZoneID(String, String);
- method public static android.icu.text.TimeZoneNames getTZDBInstance(android.icu.util.ULocale);
- method public abstract String getTimeZoneDisplayName(String, android.icu.text.TimeZoneNames.NameType);
- }
-
- public enum TimeZoneNames.NameType {
- enum_constant public static final android.icu.text.TimeZoneNames.NameType EXEMPLAR_LOCATION;
- enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_DAYLIGHT;
- enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_GENERIC;
- enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_STANDARD;
- enum_constant public static final android.icu.text.TimeZoneNames.NameType SHORT_DAYLIGHT;
- enum_constant public static final android.icu.text.TimeZoneNames.NameType SHORT_GENERIC;
- enum_constant public static final android.icu.text.TimeZoneNames.NameType SHORT_STANDARD;
- }
-
- public abstract class Transliterator {
- method public static final android.icu.text.Transliterator createFromRules(String, String, int);
- method public void filteredTransliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, boolean);
- method public final void finishTransliteration(android.icu.text.Replaceable, android.icu.text.Transliterator.Position);
- method public static final java.util.Enumeration<java.lang.String> getAvailableIDs();
- method public static final java.util.Enumeration<java.lang.String> getAvailableSources();
- method public static final java.util.Enumeration<java.lang.String> getAvailableTargets(String);
- method public static final java.util.Enumeration<java.lang.String> getAvailableVariants(String, String);
- method public static final String getDisplayName(String);
- method public static String getDisplayName(String, java.util.Locale);
- method public static String getDisplayName(String, android.icu.util.ULocale);
- method public android.icu.text.Transliterator[] getElements();
- method public final android.icu.text.UnicodeFilter getFilter();
- method public final String getID();
- method public static final android.icu.text.Transliterator getInstance(String);
- method public static android.icu.text.Transliterator getInstance(String, int);
- method public final android.icu.text.Transliterator getInverse();
- method public final int getMaximumContextLength();
- method public final android.icu.text.UnicodeSet getSourceSet();
- method public android.icu.text.UnicodeSet getTargetSet();
- method public void setFilter(android.icu.text.UnicodeFilter);
- method public String toRules(boolean);
- method public final int transliterate(android.icu.text.Replaceable, int, int);
- method public final void transliterate(android.icu.text.Replaceable);
- method public final String transliterate(String);
- method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, String);
- method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, int);
- method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position);
- field public static final int FORWARD = 0; // 0x0
- field public static final int REVERSE = 1; // 0x1
- }
-
- public static class Transliterator.Position {
- ctor public Transliterator.Position();
- ctor public Transliterator.Position(int, int, int);
- ctor public Transliterator.Position(int, int, int, int);
- ctor public Transliterator.Position(android.icu.text.Transliterator.Position);
- method public void set(android.icu.text.Transliterator.Position);
- method public final void validate(int);
- field public int contextLimit;
- field public int contextStart;
- field public int limit;
- field public int start;
- }
-
- public abstract class UCharacterIterator implements java.lang.Cloneable {
- ctor protected UCharacterIterator();
- method public Object clone() throws java.lang.CloneNotSupportedException;
- method public abstract int current();
- method public int currentCodePoint();
- method public java.text.CharacterIterator getCharacterIterator();
- method public abstract int getIndex();
- method public static final android.icu.text.UCharacterIterator getInstance(android.icu.text.Replaceable);
- method public static final android.icu.text.UCharacterIterator getInstance(String);
- method public static final android.icu.text.UCharacterIterator getInstance(char[]);
- method public static final android.icu.text.UCharacterIterator getInstance(char[], int, int);
- method public static final android.icu.text.UCharacterIterator getInstance(StringBuffer);
- method public static final android.icu.text.UCharacterIterator getInstance(java.text.CharacterIterator);
- method public abstract int getLength();
- method public abstract int getText(char[], int);
- method public final int getText(char[]);
- method public String getText();
- method public int moveCodePointIndex(int);
- method public int moveIndex(int);
- method public abstract int next();
- method public int nextCodePoint();
- method public abstract int previous();
- method public int previousCodePoint();
- method public abstract void setIndex(int);
- method public void setToLimit();
- method public void setToStart();
- field public static final int DONE = -1; // 0xffffffff
- }
-
- public abstract class UFormat extends java.text.Format {
- ctor public UFormat();
- }
-
- public abstract class UnicodeFilter implements android.icu.text.UnicodeMatcher {
- method public abstract boolean contains(int);
- method public int matches(android.icu.text.Replaceable, int[], int, boolean);
- }
-
- public interface UnicodeMatcher {
- method public void addMatchSetTo(android.icu.text.UnicodeSet);
- method public int matches(android.icu.text.Replaceable, int[], int, boolean);
- method public boolean matchesIndexValue(int);
- method public String toPattern(boolean);
- field public static final char ETHER = 65535; // 0xffff '\uffff'
- field public static final int U_MATCH = 2; // 0x2
- field public static final int U_MISMATCH = 0; // 0x0
- field public static final int U_PARTIAL_MATCH = 1; // 0x1
- }
-
- public class UnicodeSet extends android.icu.text.UnicodeFilter implements java.lang.Comparable<android.icu.text.UnicodeSet> android.icu.util.Freezable<android.icu.text.UnicodeSet> java.lang.Iterable<java.lang.String> {
- ctor public UnicodeSet();
- ctor public UnicodeSet(android.icu.text.UnicodeSet);
- ctor public UnicodeSet(int, int);
- ctor public UnicodeSet(int...);
- ctor public UnicodeSet(String);
- ctor public UnicodeSet(String, boolean);
- ctor public UnicodeSet(String, int);
- ctor public UnicodeSet(String, java.text.ParsePosition, android.icu.text.SymbolTable);
- ctor public UnicodeSet(String, java.text.ParsePosition, android.icu.text.SymbolTable, int);
- method public StringBuffer _generatePattern(StringBuffer, boolean);
- method public StringBuffer _generatePattern(StringBuffer, boolean, boolean);
- method public android.icu.text.UnicodeSet add(int, int);
- method public final android.icu.text.UnicodeSet add(int);
- method public final android.icu.text.UnicodeSet add(CharSequence);
- method public android.icu.text.UnicodeSet add(Iterable<?>);
- method public android.icu.text.UnicodeSet addAll(int, int);
- method public final android.icu.text.UnicodeSet addAll(CharSequence);
- method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet);
- method public android.icu.text.UnicodeSet addAll(Iterable<?>);
- method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...);
- method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T);
- method public void addMatchSetTo(android.icu.text.UnicodeSet);
- method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int);
- method public final android.icu.text.UnicodeSet applyPattern(String);
- method public android.icu.text.UnicodeSet applyPattern(String, boolean);
- method public android.icu.text.UnicodeSet applyPattern(String, int);
- method public android.icu.text.UnicodeSet applyPropertyAlias(String, String);
- method public android.icu.text.UnicodeSet applyPropertyAlias(String, String, android.icu.text.SymbolTable);
- method public int charAt(int);
- method public android.icu.text.UnicodeSet clear();
- method public Object clone();
- method public android.icu.text.UnicodeSet cloneAsThawed();
- method public android.icu.text.UnicodeSet closeOver(int);
- method public android.icu.text.UnicodeSet compact();
- method public int compareTo(android.icu.text.UnicodeSet);
- method public int compareTo(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet.ComparisonStyle);
- method public int compareTo(Iterable<java.lang.String>);
- method public android.icu.text.UnicodeSet complement(int, int);
- method public final android.icu.text.UnicodeSet complement(int);
- method public android.icu.text.UnicodeSet complement();
- method public final android.icu.text.UnicodeSet complement(CharSequence);
- method public final android.icu.text.UnicodeSet complementAll(CharSequence);
- method public android.icu.text.UnicodeSet complementAll(android.icu.text.UnicodeSet);
- method public boolean contains(int);
- method public boolean contains(int, int);
- method public final boolean contains(CharSequence);
- method public boolean containsAll(android.icu.text.UnicodeSet);
- method public boolean containsAll(String);
- method public <T extends java.lang.CharSequence> boolean containsAll(Iterable<T>);
- method public boolean containsNone(int, int);
- method public boolean containsNone(android.icu.text.UnicodeSet);
- method public boolean containsNone(CharSequence);
- method public <T extends java.lang.CharSequence> boolean containsNone(Iterable<T>);
- method public final boolean containsSome(int, int);
- method public final boolean containsSome(android.icu.text.UnicodeSet);
- method public final boolean containsSome(CharSequence);
- method public final <T extends java.lang.CharSequence> boolean containsSome(Iterable<T>);
- method public android.icu.text.UnicodeSet freeze();
- method public static android.icu.text.UnicodeSet from(CharSequence);
- method public static android.icu.text.UnicodeSet fromAll(CharSequence);
- method public int getRangeCount();
- method public int getRangeEnd(int);
- method public int getRangeStart(int);
- method public int indexOf(int);
- method public boolean isEmpty();
- method public boolean isFrozen();
- method public java.util.Iterator<java.lang.String> iterator();
- method public boolean matchesIndexValue(int);
- method public Iterable<android.icu.text.UnicodeSet.EntryRange> ranges();
- method public android.icu.text.UnicodeSet remove(int, int);
- method public final android.icu.text.UnicodeSet remove(int);
- method public final android.icu.text.UnicodeSet remove(CharSequence);
- method public final android.icu.text.UnicodeSet removeAll(CharSequence);
- method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet);
- method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(Iterable<T>);
- method public final android.icu.text.UnicodeSet removeAllStrings();
- method public android.icu.text.UnicodeSet retain(int, int);
- method public final android.icu.text.UnicodeSet retain(int);
- method public final android.icu.text.UnicodeSet retain(CharSequence);
- method public final android.icu.text.UnicodeSet retainAll(CharSequence);
- method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet);
- method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(Iterable<T>);
- method public android.icu.text.UnicodeSet set(int, int);
- method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet);
- method public int size();
- method public int span(CharSequence, android.icu.text.UnicodeSet.SpanCondition);
- method public int span(CharSequence, int, android.icu.text.UnicodeSet.SpanCondition);
- method public int spanBack(CharSequence, android.icu.text.UnicodeSet.SpanCondition);
- method public int spanBack(CharSequence, int, android.icu.text.UnicodeSet.SpanCondition);
- method public java.util.Collection<java.lang.String> strings();
- method public String toPattern(boolean);
- field public static final int ADD_CASE_MAPPINGS = 4; // 0x4
- field public static final android.icu.text.UnicodeSet ALL_CODE_POINTS;
- field public static final int CASE = 2; // 0x2
- field public static final int CASE_INSENSITIVE = 2; // 0x2
- field public static final android.icu.text.UnicodeSet EMPTY;
- field public static final int IGNORE_SPACE = 1; // 0x1
- field public static final int MAX_VALUE = 1114111; // 0x10ffff
- field public static final int MIN_VALUE = 0; // 0x0
- }
-
- public enum UnicodeSet.ComparisonStyle {
- enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle LEXICOGRAPHIC;
- enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle LONGER_FIRST;
- enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle SHORTER_FIRST;
- }
-
- public static class UnicodeSet.EntryRange {
- field public int codepoint;
- field public int codepointEnd;
- }
-
- public enum UnicodeSet.SpanCondition {
- enum_constant public static final android.icu.text.UnicodeSet.SpanCondition CONDITION_COUNT;
- enum_constant public static final android.icu.text.UnicodeSet.SpanCondition CONTAINED;
- enum_constant public static final android.icu.text.UnicodeSet.SpanCondition NOT_CONTAINED;
- enum_constant public static final android.icu.text.UnicodeSet.SpanCondition SIMPLE;
- }
-
- public class UnicodeSetIterator {
- ctor public UnicodeSetIterator(android.icu.text.UnicodeSet);
- ctor public UnicodeSetIterator();
- method public String getString();
- method public boolean next();
- method public boolean nextRange();
- method public void reset(android.icu.text.UnicodeSet);
- method public void reset();
- field public static int IS_STRING;
- field public int codepoint;
- field public int codepointEnd;
- field public String string;
- }
-
- public class UnicodeSetSpanner {
- ctor public UnicodeSetSpanner(android.icu.text.UnicodeSet);
- method public int countIn(CharSequence);
- method public int countIn(CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod);
- method public int countIn(CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition);
- method public String deleteFrom(CharSequence);
- method public String deleteFrom(CharSequence, android.icu.text.UnicodeSet.SpanCondition);
- method public android.icu.text.UnicodeSet getUnicodeSet();
- method public String replaceFrom(CharSequence, CharSequence);
- method public String replaceFrom(CharSequence, CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod);
- method public String replaceFrom(CharSequence, CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition);
- method public CharSequence trim(CharSequence);
- method public CharSequence trim(CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption);
- method public CharSequence trim(CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption, android.icu.text.UnicodeSet.SpanCondition);
- }
-
- public enum UnicodeSetSpanner.CountMethod {
- enum_constant public static final android.icu.text.UnicodeSetSpanner.CountMethod MIN_ELEMENTS;
- enum_constant public static final android.icu.text.UnicodeSetSpanner.CountMethod WHOLE_SPAN;
- }
-
- public enum UnicodeSetSpanner.TrimOption {
- enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption BOTH;
- enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption LEADING;
- enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption TRAILING;
- }
-
-}
-
-package android.icu.util {
-
- public class BuddhistCalendar extends android.icu.util.GregorianCalendar {
- ctor public BuddhistCalendar();
- ctor public BuddhistCalendar(android.icu.util.TimeZone);
- ctor public BuddhistCalendar(java.util.Locale);
- ctor public BuddhistCalendar(android.icu.util.ULocale);
- ctor public BuddhistCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public BuddhistCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public BuddhistCalendar(java.util.Date);
- ctor public BuddhistCalendar(int, int, int);
- ctor public BuddhistCalendar(int, int, int, int, int, int);
- field public static final int BE = 0; // 0x0
- }
-
- public abstract class Calendar implements java.lang.Cloneable java.lang.Comparable<android.icu.util.Calendar> java.io.Serializable {
- ctor protected Calendar();
- ctor protected Calendar(android.icu.util.TimeZone, java.util.Locale);
- ctor protected Calendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- method public void add(int, int);
- method public boolean after(Object);
- method public boolean before(Object);
- method public final void clear();
- method public final void clear(int);
- method public Object clone();
- method public int compareTo(android.icu.util.Calendar);
- method protected void complete();
- method protected void computeFields();
- method protected final void computeGregorianFields(int);
- method protected int computeGregorianMonthStart(int, int);
- method protected int computeJulianDay();
- method @Deprecated protected int computeMillisInDay();
- method protected void computeTime();
- method @Deprecated protected int computeZoneOffset(long, int);
- method public int fieldDifference(java.util.Date, int);
- method protected String fieldName(int);
- method protected static final long floorDivide(long, long);
- method protected static final int floorDivide(int, int);
- method protected static final int floorDivide(int, int, int[]);
- method protected static final int floorDivide(long, int, int[]);
- method public final int get(int);
- method public int getActualMaximum(int);
- method public int getActualMinimum(int);
- method public static java.util.Locale[] getAvailableLocales();
- method public android.icu.text.DateFormat getDateTimeFormat(int, int, java.util.Locale);
- method public android.icu.text.DateFormat getDateTimeFormat(int, int, android.icu.util.ULocale);
- method public String getDisplayName(java.util.Locale);
- method public String getDisplayName(android.icu.util.ULocale);
- method public final int getFieldCount();
- method protected int[][][] getFieldResolutionTable();
- method public int getFirstDayOfWeek();
- method public final int getGreatestMinimum(int);
- method protected final int getGregorianDayOfMonth();
- method protected final int getGregorianDayOfYear();
- method protected final int getGregorianMonth();
- method protected final int getGregorianYear();
- method public static android.icu.util.Calendar getInstance();
- method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone);
- method public static android.icu.util.Calendar getInstance(java.util.Locale);
- method public static android.icu.util.Calendar getInstance(android.icu.util.ULocale);
- method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone, java.util.Locale);
- method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone, android.icu.util.ULocale);
- method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean);
- method public final int getLeastMaximum(int);
- method protected int getLimit(int, int);
- method public final int getMaximum(int);
- method public int getMinimalDaysInFirstWeek();
- method public final int getMinimum(int);
- method public int getRepeatedWallTimeOption();
- method public int getSkippedWallTimeOption();
- method protected final int getStamp(int);
- method public final java.util.Date getTime();
- method public long getTimeInMillis();
- method public android.icu.util.TimeZone getTimeZone();
- method public String getType();
- method public android.icu.util.Calendar.WeekData getWeekData();
- method public static android.icu.util.Calendar.WeekData getWeekDataForRegion(String);
- method protected static final int gregorianMonthLength(int, int);
- method protected static final int gregorianPreviousMonthLength(int, int);
- method protected void handleComputeFields(int);
- method protected int handleComputeJulianDay(int);
- method protected abstract int handleComputeMonthStart(int, int, boolean);
- method protected int[] handleCreateFields();
- method protected android.icu.text.DateFormat handleGetDateFormat(String, java.util.Locale);
- method protected android.icu.text.DateFormat handleGetDateFormat(String, String, java.util.Locale);
- method protected android.icu.text.DateFormat handleGetDateFormat(String, android.icu.util.ULocale);
- method protected abstract int handleGetExtendedYear();
- method protected abstract int handleGetLimit(int, int);
- method protected int handleGetMonthLength(int, int);
- method protected int handleGetYearLength(int);
- method protected final int internalGet(int);
- method protected final int internalGet(int, int);
- method protected final long internalGetTimeInMillis();
- method protected final void internalSet(int, int);
- method public boolean isEquivalentTo(android.icu.util.Calendar);
- method protected static final boolean isGregorianLeapYear(int);
- method public boolean isLenient();
- method public final boolean isSet(int);
- method public boolean isWeekend(java.util.Date);
- method public boolean isWeekend();
- method protected static final int julianDayToDayOfWeek(int);
- method protected static final long julianDayToMillis(int);
- method protected static final int millisToJulianDay(long);
- method protected int newerField(int, int);
- method protected int newestStamp(int, int, int);
- method protected void pinField(int);
- method protected void prepareGetActual(int, boolean);
- method protected int resolveFields(int[][][]);
- method public final void roll(int, boolean);
- method public void roll(int, int);
- method public final void set(int, int);
- method public final void set(int, int, int);
- method public final void set(int, int, int, int, int);
- method public final void set(int, int, int, int, int, int);
- method public void setFirstDayOfWeek(int);
- method public void setLenient(boolean);
- method public void setMinimalDaysInFirstWeek(int);
- method public void setRepeatedWallTimeOption(int);
- method public void setSkippedWallTimeOption(int);
- method public final void setTime(java.util.Date);
- method public void setTimeInMillis(long);
- method public void setTimeZone(android.icu.util.TimeZone);
- method public android.icu.util.Calendar setWeekData(android.icu.util.Calendar.WeekData);
- method protected void validateField(int);
- method protected final void validateField(int, int, int);
- method protected void validateFields();
- method protected int weekNumber(int, int, int);
- method protected final int weekNumber(int, int);
- field public static final int AM = 0; // 0x0
- field public static final int AM_PM = 9; // 0x9
- field public static final int APRIL = 3; // 0x3
- field public static final int AUGUST = 7; // 0x7
- field @Deprecated protected static final int BASE_FIELD_COUNT = 23; // 0x17
- field public static final int DATE = 5; // 0x5
- field public static final int DAY_OF_MONTH = 5; // 0x5
- field public static final int DAY_OF_WEEK = 7; // 0x7
- field public static final int DAY_OF_WEEK_IN_MONTH = 8; // 0x8
- field public static final int DAY_OF_YEAR = 6; // 0x6
- field public static final int DECEMBER = 11; // 0xb
- field public static final int DOW_LOCAL = 18; // 0x12
- field public static final int DST_OFFSET = 16; // 0x10
- field protected static final int EPOCH_JULIAN_DAY = 2440588; // 0x253d8c
- field public static final int ERA = 0; // 0x0
- field public static final int EXTENDED_YEAR = 19; // 0x13
- field public static final int FEBRUARY = 1; // 0x1
- field public static final int FRIDAY = 6; // 0x6
- field protected static final int GREATEST_MINIMUM = 1; // 0x1
- field public static final int HOUR = 10; // 0xa
- field public static final int HOUR_OF_DAY = 11; // 0xb
- field protected static final int INTERNALLY_SET = 1; // 0x1
- field public static final int IS_LEAP_MONTH = 22; // 0x16
- field public static final int JANUARY = 0; // 0x0
- field protected static final int JAN_1_1_JULIAN_DAY = 1721426; // 0x1a4452
- field public static final int JULIAN_DAY = 20; // 0x14
- field public static final int JULY = 6; // 0x6
- field public static final int JUNE = 5; // 0x5
- field protected static final int LEAST_MAXIMUM = 2; // 0x2
- field public static final int MARCH = 2; // 0x2
- field protected static final int MAXIMUM = 3; // 0x3
- field protected static final java.util.Date MAX_DATE;
- field @Deprecated protected static final int MAX_FIELD_COUNT = 32; // 0x20
- field protected static final int MAX_JULIAN = 2130706432; // 0x7f000000
- field protected static final long MAX_MILLIS = 183882168921600000L; // 0x28d47dbbf19b000L
- field public static final int MAY = 4; // 0x4
- field public static final int MILLISECOND = 14; // 0xe
- field public static final int MILLISECONDS_IN_DAY = 21; // 0x15
- field protected static final int MINIMUM = 0; // 0x0
- field protected static final int MINIMUM_USER_STAMP = 2; // 0x2
- field public static final int MINUTE = 12; // 0xc
- field protected static final java.util.Date MIN_DATE;
- field protected static final int MIN_JULIAN = -2130706432; // 0x81000000
- field protected static final long MIN_MILLIS = -184303902528000000L; // 0xfd713893bf19b000L
- field public static final int MONDAY = 2; // 0x2
- field public static final int MONTH = 2; // 0x2
- field public static final int NOVEMBER = 10; // 0xa
- field public static final int OCTOBER = 9; // 0x9
- field protected static final long ONE_DAY = 86400000L; // 0x5265c00L
- field protected static final int ONE_HOUR = 3600000; // 0x36ee80
- field protected static final int ONE_MINUTE = 60000; // 0xea60
- field protected static final int ONE_SECOND = 1000; // 0x3e8
- field protected static final long ONE_WEEK = 604800000L; // 0x240c8400L
- field public static final int PM = 1; // 0x1
- field protected static final int RESOLVE_REMAP = 32; // 0x20
- field public static final int SATURDAY = 7; // 0x7
- field public static final int SECOND = 13; // 0xd
- field public static final int SEPTEMBER = 8; // 0x8
- field public static final int SUNDAY = 1; // 0x1
- field public static final int THURSDAY = 5; // 0x5
- field public static final int TUESDAY = 3; // 0x3
- field public static final int UNDECIMBER = 12; // 0xc
- field protected static final int UNSET = 0; // 0x0
- field public static final int WALLTIME_FIRST = 1; // 0x1
- field public static final int WALLTIME_LAST = 0; // 0x0
- field public static final int WALLTIME_NEXT_VALID = 2; // 0x2
- field public static final int WEDNESDAY = 4; // 0x4
- field public static final int WEEK_OF_MONTH = 4; // 0x4
- field public static final int WEEK_OF_YEAR = 3; // 0x3
- field public static final int YEAR = 1; // 0x1
- field public static final int YEAR_WOY = 17; // 0x11
- field public static final int ZONE_OFFSET = 15; // 0xf
- }
-
- public static final class Calendar.WeekData {
- ctor public Calendar.WeekData(int, int, int, int, int, int);
- field public final int firstDayOfWeek;
- field public final int minimalDaysInFirstWeek;
- field public final int weekendCease;
- field public final int weekendCeaseMillis;
- field public final int weekendOnset;
- field public final int weekendOnsetMillis;
- }
-
- public class ChineseCalendar extends android.icu.util.Calendar {
- ctor public ChineseCalendar();
- ctor public ChineseCalendar(java.util.Date);
- ctor public ChineseCalendar(int, int, int, int);
- ctor public ChineseCalendar(int, int, int, int, int, int, int);
- ctor public ChineseCalendar(int, int, int, int, int);
- ctor public ChineseCalendar(int, int, int, int, int, int, int, int);
- ctor public ChineseCalendar(java.util.Locale);
- ctor public ChineseCalendar(android.icu.util.TimeZone);
- ctor public ChineseCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public ChineseCalendar(android.icu.util.ULocale);
- ctor public ChineseCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- method protected int handleComputeMonthStart(int, int, boolean);
- method protected android.icu.text.DateFormat handleGetDateFormat(String, String, android.icu.util.ULocale);
- method protected int handleGetExtendedYear();
- method protected int handleGetLimit(int, int);
- }
-
- public final class CopticCalendar extends android.icu.util.Calendar {
- ctor public CopticCalendar();
- ctor public CopticCalendar(android.icu.util.TimeZone);
- ctor public CopticCalendar(java.util.Locale);
- ctor public CopticCalendar(android.icu.util.ULocale);
- ctor public CopticCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public CopticCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public CopticCalendar(int, int, int);
- ctor public CopticCalendar(java.util.Date);
- ctor public CopticCalendar(int, int, int, int, int, int);
- method @Deprecated protected void handleComputeFields(int);
- method protected int handleComputeMonthStart(int, int, boolean);
- method @Deprecated protected int handleGetExtendedYear();
- method protected int handleGetLimit(int, int);
- field public static final int AMSHIR = 5; // 0x5
- field public static final int BABA = 1; // 0x1
- field public static final int BARAMHAT = 6; // 0x6
- field public static final int BARAMOUDA = 7; // 0x7
- field public static final int BASHANS = 8; // 0x8
- field public static final int EPEP = 10; // 0xa
- field public static final int HATOR = 2; // 0x2
- field public static final int KIAHK = 3; // 0x3
- field public static final int MESRA = 11; // 0xb
- field public static final int NASIE = 12; // 0xc
- field public static final int PAONA = 9; // 0x9
- field public static final int TOBA = 4; // 0x4
- field public static final int TOUT = 0; // 0x0
- }
-
- public class Currency extends android.icu.util.MeasureUnit {
- ctor protected Currency(String);
- method public static android.icu.util.Currency fromJavaCurrency(java.util.Currency);
- method public static java.util.Set<android.icu.util.Currency> getAvailableCurrencies();
- method public static String[] getAvailableCurrencyCodes(android.icu.util.ULocale, java.util.Date);
- method public static String[] getAvailableCurrencyCodes(java.util.Locale, java.util.Date);
- method public static java.util.Locale[] getAvailableLocales();
- method public static android.icu.util.ULocale[] getAvailableULocales();
- method public String getCurrencyCode();
- method public int getDefaultFractionDigits();
- method public int getDefaultFractionDigits(android.icu.util.Currency.CurrencyUsage);
- method public String getDisplayName();
- method public String getDisplayName(java.util.Locale);
- method public static android.icu.util.Currency getInstance(java.util.Locale);
- method public static android.icu.util.Currency getInstance(android.icu.util.ULocale);
- method public static android.icu.util.Currency getInstance(String);
- method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean);
- method public String getName(java.util.Locale, int, boolean[]);
- method public String getName(android.icu.util.ULocale, int, boolean[]);
- method public String getName(java.util.Locale, int, String, boolean[]);
- method public String getName(android.icu.util.ULocale, int, String, boolean[]);
- method public int getNumericCode();
- method public double getRoundingIncrement();
- method public double getRoundingIncrement(android.icu.util.Currency.CurrencyUsage);
- method public String getSymbol();
- method public String getSymbol(java.util.Locale);
- method public String getSymbol(android.icu.util.ULocale);
- method public static boolean isAvailable(String, java.util.Date, java.util.Date);
- method public java.util.Currency toJavaCurrency();
- field public static final int LONG_NAME = 1; // 0x1
- field public static final int NARROW_SYMBOL_NAME = 3; // 0x3
- field public static final int PLURAL_LONG_NAME = 2; // 0x2
- field public static final int SYMBOL_NAME = 0; // 0x0
- }
-
- public enum Currency.CurrencyUsage {
- enum_constant public static final android.icu.util.Currency.CurrencyUsage CASH;
- enum_constant public static final android.icu.util.Currency.CurrencyUsage STANDARD;
- }
-
- public class CurrencyAmount extends android.icu.util.Measure {
- ctor public CurrencyAmount(Number, android.icu.util.Currency);
- ctor public CurrencyAmount(double, android.icu.util.Currency);
- ctor public CurrencyAmount(Number, java.util.Currency);
- ctor public CurrencyAmount(double, java.util.Currency);
- method public android.icu.util.Currency getCurrency();
- }
-
- public final class DateInterval implements java.io.Serializable {
- ctor public DateInterval(long, long);
- method public long getFromDate();
- method public long getToDate();
- }
-
- public final class EthiopicCalendar extends android.icu.util.Calendar {
- ctor public EthiopicCalendar();
- ctor public EthiopicCalendar(android.icu.util.TimeZone);
- ctor public EthiopicCalendar(java.util.Locale);
- ctor public EthiopicCalendar(android.icu.util.ULocale);
- ctor public EthiopicCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public EthiopicCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public EthiopicCalendar(int, int, int);
- ctor public EthiopicCalendar(java.util.Date);
- ctor public EthiopicCalendar(int, int, int, int, int, int);
- method @Deprecated protected void handleComputeFields(int);
- method protected int handleComputeMonthStart(int, int, boolean);
- method @Deprecated protected int handleGetExtendedYear();
- method @Deprecated protected int handleGetLimit(int, int);
- method public boolean isAmeteAlemEra();
- method public void setAmeteAlemEra(boolean);
- field public static final int GENBOT = 8; // 0x8
- field public static final int HAMLE = 10; // 0xa
- field public static final int HEDAR = 2; // 0x2
- field public static final int MEGABIT = 6; // 0x6
- field public static final int MESKEREM = 0; // 0x0
- field public static final int MIAZIA = 7; // 0x7
- field public static final int NEHASSE = 11; // 0xb
- field public static final int PAGUMEN = 12; // 0xc
- field public static final int SENE = 9; // 0x9
- field public static final int TAHSAS = 3; // 0x3
- field public static final int TEKEMT = 1; // 0x1
- field public static final int TER = 4; // 0x4
- field public static final int YEKATIT = 5; // 0x5
- }
-
- public interface Freezable<T> extends java.lang.Cloneable {
- method public T cloneAsThawed();
- method public T freeze();
- method public boolean isFrozen();
- }
-
- public class GregorianCalendar extends android.icu.util.Calendar {
- ctor public GregorianCalendar();
- ctor public GregorianCalendar(android.icu.util.TimeZone);
- ctor public GregorianCalendar(java.util.Locale);
- ctor public GregorianCalendar(android.icu.util.ULocale);
- ctor public GregorianCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public GregorianCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public GregorianCalendar(int, int, int);
- ctor public GregorianCalendar(int, int, int, int, int);
- ctor public GregorianCalendar(int, int, int, int, int, int);
- method public final java.util.Date getGregorianChange();
- method protected int handleComputeMonthStart(int, int, boolean);
- method protected int handleGetExtendedYear();
- method protected int handleGetLimit(int, int);
- method public boolean isLeapYear(int);
- method public void setGregorianChange(java.util.Date);
- field public static final int AD = 1; // 0x1
- field public static final int BC = 0; // 0x0
- field protected transient boolean invertGregorian;
- field protected transient boolean isGregorian;
- }
-
- public class HebrewCalendar extends android.icu.util.Calendar {
- ctor public HebrewCalendar();
- ctor public HebrewCalendar(android.icu.util.TimeZone);
- ctor public HebrewCalendar(java.util.Locale);
- ctor public HebrewCalendar(android.icu.util.ULocale);
- ctor public HebrewCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public HebrewCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public HebrewCalendar(int, int, int);
- ctor public HebrewCalendar(java.util.Date);
- ctor public HebrewCalendar(int, int, int, int, int, int);
- method protected int handleComputeMonthStart(int, int, boolean);
- method protected int handleGetExtendedYear();
- method protected int handleGetLimit(int, int);
- method @Deprecated protected void validateField(int);
- field public static final int ADAR = 6; // 0x6
- field public static final int ADAR_1 = 5; // 0x5
- field public static final int AV = 11; // 0xb
- field public static final int ELUL = 12; // 0xc
- field public static final int HESHVAN = 1; // 0x1
- field public static final int IYAR = 8; // 0x8
- field public static final int KISLEV = 2; // 0x2
- field public static final int NISAN = 7; // 0x7
- field public static final int SHEVAT = 4; // 0x4
- field public static final int SIVAN = 9; // 0x9
- field public static final int TAMUZ = 10; // 0xa
- field public static final int TEVET = 3; // 0x3
- field public static final int TISHRI = 0; // 0x0
- }
-
- public class ICUUncheckedIOException extends java.lang.RuntimeException {
- ctor public ICUUncheckedIOException();
- ctor public ICUUncheckedIOException(String);
- ctor public ICUUncheckedIOException(Throwable);
- ctor public ICUUncheckedIOException(String, Throwable);
- }
-
- public class IllformedLocaleException extends java.lang.RuntimeException {
- ctor public IllformedLocaleException();
- ctor public IllformedLocaleException(String);
- ctor public IllformedLocaleException(String, int);
- method public int getErrorIndex();
- }
-
- public class IndianCalendar extends android.icu.util.Calendar {
- ctor public IndianCalendar();
- ctor public IndianCalendar(android.icu.util.TimeZone);
- ctor public IndianCalendar(java.util.Locale);
- ctor public IndianCalendar(android.icu.util.ULocale);
- ctor public IndianCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public IndianCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public IndianCalendar(java.util.Date);
- ctor public IndianCalendar(int, int, int);
- ctor public IndianCalendar(int, int, int, int, int, int);
- method protected int handleComputeMonthStart(int, int, boolean);
- method protected int handleGetExtendedYear();
- method protected int handleGetLimit(int, int);
- field public static final int AGRAHAYANA = 8; // 0x8
- field public static final int ASADHA = 3; // 0x3
- field public static final int ASVINA = 6; // 0x6
- field public static final int BHADRA = 5; // 0x5
- field public static final int CHAITRA = 0; // 0x0
- field public static final int IE = 0; // 0x0
- field public static final int JYAISTHA = 2; // 0x2
- field public static final int KARTIKA = 7; // 0x7
- field public static final int MAGHA = 10; // 0xa
- field public static final int PAUSA = 9; // 0x9
- field public static final int PHALGUNA = 11; // 0xb
- field public static final int SRAVANA = 4; // 0x4
- field public static final int VAISAKHA = 1; // 0x1
- }
-
- public class IslamicCalendar extends android.icu.util.Calendar {
- ctor public IslamicCalendar();
- ctor public IslamicCalendar(android.icu.util.TimeZone);
- ctor public IslamicCalendar(java.util.Locale);
- ctor public IslamicCalendar(android.icu.util.ULocale);
- ctor public IslamicCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public IslamicCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public IslamicCalendar(java.util.Date);
- ctor public IslamicCalendar(int, int, int);
- ctor public IslamicCalendar(int, int, int, int, int, int);
- method public android.icu.util.IslamicCalendar.CalculationType getCalculationType();
- method protected int handleComputeMonthStart(int, int, boolean);
- method protected int handleGetExtendedYear();
- method protected int handleGetLimit(int, int);
- method public void setCalculationType(android.icu.util.IslamicCalendar.CalculationType);
- field public static final int DHU_AL_HIJJAH = 11; // 0xb
- field public static final int DHU_AL_QIDAH = 10; // 0xa
- field public static final int JUMADA_1 = 4; // 0x4
- field public static final int JUMADA_2 = 5; // 0x5
- field public static final int MUHARRAM = 0; // 0x0
- field public static final int RABI_1 = 2; // 0x2
- field public static final int RABI_2 = 3; // 0x3
- field public static final int RAJAB = 6; // 0x6
- field public static final int RAMADAN = 8; // 0x8
- field public static final int SAFAR = 1; // 0x1
- field public static final int SHABAN = 7; // 0x7
- field public static final int SHAWWAL = 9; // 0x9
- }
-
- public enum IslamicCalendar.CalculationType {
- enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC;
- enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_CIVIL;
- enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_TBLA;
- enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_UMALQURA;
- }
-
- public class JapaneseCalendar extends android.icu.util.GregorianCalendar {
- ctor public JapaneseCalendar();
- ctor public JapaneseCalendar(android.icu.util.TimeZone);
- ctor public JapaneseCalendar(java.util.Locale);
- ctor public JapaneseCalendar(android.icu.util.ULocale);
- ctor public JapaneseCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public JapaneseCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public JapaneseCalendar(java.util.Date);
- ctor public JapaneseCalendar(int, int, int, int);
- ctor public JapaneseCalendar(int, int, int);
- ctor public JapaneseCalendar(int, int, int, int, int, int);
- field public static final int HEISEI;
- field public static final int MEIJI;
- field public static final int REIWA;
- field public static final int SHOWA;
- field public static final int TAISHO;
- }
-
- public final class LocaleData {
- method public static android.icu.util.VersionInfo getCLDRVersion();
- method public String getDelimiter(int);
- method public static android.icu.util.LocaleData getInstance(android.icu.util.ULocale);
- method public static android.icu.util.LocaleData getInstance();
- method public static android.icu.util.LocaleData.MeasurementSystem getMeasurementSystem(android.icu.util.ULocale);
- method public boolean getNoSubstitute();
- method public static android.icu.util.LocaleData.PaperSize getPaperSize(android.icu.util.ULocale);
- method public void setNoSubstitute(boolean);
- field public static final int ALT_QUOTATION_END = 3; // 0x3
- field public static final int ALT_QUOTATION_START = 2; // 0x2
- field public static final int QUOTATION_END = 1; // 0x1
- field public static final int QUOTATION_START = 0; // 0x0
- }
-
- public static final class LocaleData.MeasurementSystem {
- field public static final android.icu.util.LocaleData.MeasurementSystem SI;
- field public static final android.icu.util.LocaleData.MeasurementSystem UK;
- field public static final android.icu.util.LocaleData.MeasurementSystem US;
- }
-
- public static final class LocaleData.PaperSize {
- method public int getHeight();
- method public int getWidth();
- }
-
- public class Measure {
- ctor public Measure(Number, android.icu.util.MeasureUnit);
- method public Number getNumber();
- method public android.icu.util.MeasureUnit getUnit();
- }
-
- public class MeasureUnit implements java.io.Serializable {
- method public static java.util.Set<android.icu.util.MeasureUnit> getAvailable(String);
- method public static java.util.Set<android.icu.util.MeasureUnit> getAvailable();
- method public static java.util.Set<java.lang.String> getAvailableTypes();
- method public String getSubtype();
- method public String getType();
- field public static final android.icu.util.MeasureUnit ACRE;
- field public static final android.icu.util.MeasureUnit ACRE_FOOT;
- field public static final android.icu.util.MeasureUnit AMPERE;
- field public static final android.icu.util.MeasureUnit ARC_MINUTE;
- field public static final android.icu.util.MeasureUnit ARC_SECOND;
- field public static final android.icu.util.MeasureUnit ASTRONOMICAL_UNIT;
- field public static final android.icu.util.MeasureUnit ATMOSPHERE;
- field public static final android.icu.util.MeasureUnit BIT;
- field public static final android.icu.util.MeasureUnit BUSHEL;
- field public static final android.icu.util.MeasureUnit BYTE;
- field public static final android.icu.util.MeasureUnit CALORIE;
- field public static final android.icu.util.MeasureUnit CARAT;
- field public static final android.icu.util.MeasureUnit CELSIUS;
- field public static final android.icu.util.MeasureUnit CENTILITER;
- field public static final android.icu.util.MeasureUnit CENTIMETER;
- field public static final android.icu.util.MeasureUnit CENTURY;
- field public static final android.icu.util.MeasureUnit CUBIC_CENTIMETER;
- field public static final android.icu.util.MeasureUnit CUBIC_FOOT;
- field public static final android.icu.util.MeasureUnit CUBIC_INCH;
- field public static final android.icu.util.MeasureUnit CUBIC_KILOMETER;
- field public static final android.icu.util.MeasureUnit CUBIC_METER;
- field public static final android.icu.util.MeasureUnit CUBIC_MILE;
- field public static final android.icu.util.MeasureUnit CUBIC_YARD;
- field public static final android.icu.util.MeasureUnit CUP;
- field public static final android.icu.util.MeasureUnit CUP_METRIC;
- field public static final android.icu.util.TimeUnit DAY;
- field public static final android.icu.util.MeasureUnit DECILITER;
- field public static final android.icu.util.MeasureUnit DECIMETER;
- field public static final android.icu.util.MeasureUnit DEGREE;
- field public static final android.icu.util.MeasureUnit FAHRENHEIT;
- field public static final android.icu.util.MeasureUnit FATHOM;
- field public static final android.icu.util.MeasureUnit FLUID_OUNCE;
- field public static final android.icu.util.MeasureUnit FOODCALORIE;
- field public static final android.icu.util.MeasureUnit FOOT;
- field public static final android.icu.util.MeasureUnit FURLONG;
- field public static final android.icu.util.MeasureUnit GALLON;
- field public static final android.icu.util.MeasureUnit GALLON_IMPERIAL;
- field public static final android.icu.util.MeasureUnit GENERIC_TEMPERATURE;
- field public static final android.icu.util.MeasureUnit GIGABIT;
- field public static final android.icu.util.MeasureUnit GIGABYTE;
- field public static final android.icu.util.MeasureUnit GIGAHERTZ;
- field public static final android.icu.util.MeasureUnit GIGAWATT;
- field public static final android.icu.util.MeasureUnit GRAM;
- field public static final android.icu.util.MeasureUnit G_FORCE;
- field public static final android.icu.util.MeasureUnit HECTARE;
- field public static final android.icu.util.MeasureUnit HECTOLITER;
- field public static final android.icu.util.MeasureUnit HECTOPASCAL;
- field public static final android.icu.util.MeasureUnit HERTZ;
- field public static final android.icu.util.MeasureUnit HORSEPOWER;
- field public static final android.icu.util.TimeUnit HOUR;
- field public static final android.icu.util.MeasureUnit INCH;
- field public static final android.icu.util.MeasureUnit INCH_HG;
- field public static final android.icu.util.MeasureUnit JOULE;
- field public static final android.icu.util.MeasureUnit KARAT;
- field public static final android.icu.util.MeasureUnit KELVIN;
- field public static final android.icu.util.MeasureUnit KILOBIT;
- field public static final android.icu.util.MeasureUnit KILOBYTE;
- field public static final android.icu.util.MeasureUnit KILOCALORIE;
- field public static final android.icu.util.MeasureUnit KILOGRAM;
- field public static final android.icu.util.MeasureUnit KILOHERTZ;
- field public static final android.icu.util.MeasureUnit KILOJOULE;
- field public static final android.icu.util.MeasureUnit KILOMETER;
- field public static final android.icu.util.MeasureUnit KILOMETER_PER_HOUR;
- field public static final android.icu.util.MeasureUnit KILOWATT;
- field public static final android.icu.util.MeasureUnit KILOWATT_HOUR;
- field public static final android.icu.util.MeasureUnit KNOT;
- field public static final android.icu.util.MeasureUnit LIGHT_YEAR;
- field public static final android.icu.util.MeasureUnit LITER;
- field public static final android.icu.util.MeasureUnit LITER_PER_100KILOMETERS;
- field public static final android.icu.util.MeasureUnit LITER_PER_KILOMETER;
- field public static final android.icu.util.MeasureUnit LUX;
- field public static final android.icu.util.MeasureUnit MEGABIT;
- field public static final android.icu.util.MeasureUnit MEGABYTE;
- field public static final android.icu.util.MeasureUnit MEGAHERTZ;
- field public static final android.icu.util.MeasureUnit MEGALITER;
- field public static final android.icu.util.MeasureUnit MEGAWATT;
- field public static final android.icu.util.MeasureUnit METER;
- field public static final android.icu.util.MeasureUnit METER_PER_SECOND;
- field public static final android.icu.util.MeasureUnit METER_PER_SECOND_SQUARED;
- field public static final android.icu.util.MeasureUnit METRIC_TON;
- field public static final android.icu.util.MeasureUnit MICROGRAM;
- field public static final android.icu.util.MeasureUnit MICROMETER;
- field public static final android.icu.util.MeasureUnit MICROSECOND;
- field public static final android.icu.util.MeasureUnit MILE;
- field public static final android.icu.util.MeasureUnit MILE_PER_GALLON;
- field public static final android.icu.util.MeasureUnit MILE_PER_GALLON_IMPERIAL;
- field public static final android.icu.util.MeasureUnit MILE_PER_HOUR;
- field public static final android.icu.util.MeasureUnit MILE_SCANDINAVIAN;
- field public static final android.icu.util.MeasureUnit MILLIAMPERE;
- field public static final android.icu.util.MeasureUnit MILLIBAR;
- field public static final android.icu.util.MeasureUnit MILLIGRAM;
- field public static final android.icu.util.MeasureUnit MILLIGRAM_PER_DECILITER;
- field public static final android.icu.util.MeasureUnit MILLILITER;
- field public static final android.icu.util.MeasureUnit MILLIMETER;
- field public static final android.icu.util.MeasureUnit MILLIMETER_OF_MERCURY;
- field public static final android.icu.util.MeasureUnit MILLIMOLE_PER_LITER;
- field public static final android.icu.util.MeasureUnit MILLISECOND;
- field public static final android.icu.util.MeasureUnit MILLIWATT;
- field public static final android.icu.util.TimeUnit MINUTE;
- field public static final android.icu.util.TimeUnit MONTH;
- field public static final android.icu.util.MeasureUnit NANOMETER;
- field public static final android.icu.util.MeasureUnit NANOSECOND;
- field public static final android.icu.util.MeasureUnit NAUTICAL_MILE;
- field public static final android.icu.util.MeasureUnit OHM;
- field public static final android.icu.util.MeasureUnit OUNCE;
- field public static final android.icu.util.MeasureUnit OUNCE_TROY;
- field public static final android.icu.util.MeasureUnit PARSEC;
- field public static final android.icu.util.MeasureUnit PART_PER_MILLION;
- field public static final android.icu.util.MeasureUnit PERCENT;
- field public static final android.icu.util.MeasureUnit PERMILLE;
- field public static final android.icu.util.MeasureUnit PETABYTE;
- field public static final android.icu.util.MeasureUnit PICOMETER;
- field public static final android.icu.util.MeasureUnit PINT;
- field public static final android.icu.util.MeasureUnit PINT_METRIC;
- field public static final android.icu.util.MeasureUnit POINT;
- field public static final android.icu.util.MeasureUnit POUND;
- field public static final android.icu.util.MeasureUnit POUND_PER_SQUARE_INCH;
- field public static final android.icu.util.MeasureUnit QUART;
- field public static final android.icu.util.MeasureUnit RADIAN;
- field public static final android.icu.util.MeasureUnit REVOLUTION_ANGLE;
- field public static final android.icu.util.TimeUnit SECOND;
- field public static final android.icu.util.MeasureUnit SQUARE_CENTIMETER;
- field public static final android.icu.util.MeasureUnit SQUARE_FOOT;
- field public static final android.icu.util.MeasureUnit SQUARE_INCH;
- field public static final android.icu.util.MeasureUnit SQUARE_KILOMETER;
- field public static final android.icu.util.MeasureUnit SQUARE_METER;
- field public static final android.icu.util.MeasureUnit SQUARE_MILE;
- field public static final android.icu.util.MeasureUnit SQUARE_YARD;
- field public static final android.icu.util.MeasureUnit STONE;
- field public static final android.icu.util.MeasureUnit TABLESPOON;
- field public static final android.icu.util.MeasureUnit TEASPOON;
- field public static final android.icu.util.MeasureUnit TERABIT;
- field public static final android.icu.util.MeasureUnit TERABYTE;
- field public static final android.icu.util.MeasureUnit TON;
- field public static final android.icu.util.MeasureUnit VOLT;
- field public static final android.icu.util.MeasureUnit WATT;
- field public static final android.icu.util.TimeUnit WEEK;
- field public static final android.icu.util.MeasureUnit YARD;
- field public static final android.icu.util.TimeUnit YEAR;
- }
-
- public class Output<T> {
- ctor public Output();
- ctor public Output(T);
- field public T value;
- }
-
- public interface RangeValueIterator {
- method public boolean next(android.icu.util.RangeValueIterator.Element);
- method public void reset();
- }
-
- public static class RangeValueIterator.Element {
- ctor public RangeValueIterator.Element();
- field public int limit;
- field public int start;
- field public int value;
- }
-
- public class TaiwanCalendar extends android.icu.util.GregorianCalendar {
- ctor public TaiwanCalendar();
- ctor public TaiwanCalendar(android.icu.util.TimeZone);
- ctor public TaiwanCalendar(java.util.Locale);
- ctor public TaiwanCalendar(android.icu.util.ULocale);
- ctor public TaiwanCalendar(android.icu.util.TimeZone, java.util.Locale);
- ctor public TaiwanCalendar(android.icu.util.TimeZone, android.icu.util.ULocale);
- ctor public TaiwanCalendar(java.util.Date);
- ctor public TaiwanCalendar(int, int, int);
- ctor public TaiwanCalendar(int, int, int, int, int, int);
- field public static final int BEFORE_MINGUO = 0; // 0x0
- field public static final int MINGUO = 1; // 0x1
- }
-
- public class TimeUnit extends android.icu.util.MeasureUnit {
- method public static android.icu.util.TimeUnit[] values();
- }
-
- public abstract class TimeZone implements java.lang.Cloneable android.icu.util.Freezable<android.icu.util.TimeZone> java.io.Serializable {
- ctor public TimeZone();
- method public Object clone();
- method public android.icu.util.TimeZone cloneAsThawed();
- method public static int countEquivalentIDs(String);
- method public android.icu.util.TimeZone freeze();
- method public static java.util.Set<java.lang.String> getAvailableIDs(android.icu.util.TimeZone.SystemTimeZoneType, String, Integer);
- method public static String[] getAvailableIDs(int);
- method public static String[] getAvailableIDs(String);
- method public static String[] getAvailableIDs();
- method public static String getCanonicalID(String);
- method public static String getCanonicalID(String, boolean[]);
- method public int getDSTSavings();
- method public static android.icu.util.TimeZone getDefault();
- method public final String getDisplayName();
- method public final String getDisplayName(java.util.Locale);
- method public final String getDisplayName(android.icu.util.ULocale);
- method public final String getDisplayName(boolean, int);
- method public String getDisplayName(boolean, int, java.util.Locale);
- method public String getDisplayName(boolean, int, android.icu.util.ULocale);
- method public static String getEquivalentID(String, int);
- method public static android.icu.util.TimeZone getFrozenTimeZone(String);
- method public String getID();
- method public static String getIDForWindowsID(String, String);
- method public abstract int getOffset(int, int, int, int, int, int);
- method public int getOffset(long);
- method public void getOffset(long, boolean, int[]);
- method public abstract int getRawOffset();
- method public static String getRegion(String);
- method public static String getTZDataVersion();
- method public static android.icu.util.TimeZone getTimeZone(String);
- method public static android.icu.util.TimeZone getTimeZone(String, int);
- method public static String getWindowsID(String);
- method public boolean hasSameRules(android.icu.util.TimeZone);
- method public abstract boolean inDaylightTime(java.util.Date);
- method public boolean isFrozen();
- method public boolean observesDaylightTime();
- method public void setID(String);
- method public abstract void setRawOffset(int);
- method public abstract boolean useDaylightTime();
- field public static final int GENERIC_LOCATION = 7; // 0x7
- field public static final android.icu.util.TimeZone GMT_ZONE;
- field public static final int LONG = 1; // 0x1
- field public static final int LONG_GENERIC = 3; // 0x3
- field public static final int LONG_GMT = 5; // 0x5
- field public static final int SHORT = 0; // 0x0
- field public static final int SHORT_COMMONLY_USED = 6; // 0x6
- field public static final int SHORT_GENERIC = 2; // 0x2
- field public static final int SHORT_GMT = 4; // 0x4
- field public static final int TIMEZONE_ICU = 0; // 0x0
- field public static final int TIMEZONE_JDK = 1; // 0x1
- field public static final android.icu.util.TimeZone UNKNOWN_ZONE;
- field public static final String UNKNOWN_ZONE_ID = "Etc/Unknown";
- }
-
- public enum TimeZone.SystemTimeZoneType {
- enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType ANY;
- enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType CANONICAL;
- enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType CANONICAL_LOCATION;
- }
-
- public final class ULocale implements java.lang.Comparable<android.icu.util.ULocale> java.io.Serializable {
- ctor public ULocale(String);
- ctor public ULocale(String, String);
- ctor public ULocale(String, String, String);
- method public static android.icu.util.ULocale acceptLanguage(String, android.icu.util.ULocale[], boolean[]);
- method public static android.icu.util.ULocale acceptLanguage(android.icu.util.ULocale[], android.icu.util.ULocale[], boolean[]);
- method public static android.icu.util.ULocale acceptLanguage(String, boolean[]);
- method public static android.icu.util.ULocale acceptLanguage(android.icu.util.ULocale[], boolean[]);
- method public static android.icu.util.ULocale addLikelySubtags(android.icu.util.ULocale);
- method public static String canonicalize(String);
- method public Object clone();
- method public int compareTo(android.icu.util.ULocale);
- method public static android.icu.util.ULocale createCanonical(String);
- method public static android.icu.util.ULocale forLanguageTag(String);
- method public static android.icu.util.ULocale forLocale(java.util.Locale);
- method public static android.icu.util.ULocale[] getAvailableLocales();
- method public String getBaseName();
- method public static String getBaseName(String);
- method public String getCharacterOrientation();
- method public String getCountry();
- method public static String getCountry(String);
- method public static android.icu.util.ULocale getDefault();
- method public static android.icu.util.ULocale getDefault(android.icu.util.ULocale.Category);
- method public String getDisplayCountry();
- method public String getDisplayCountry(android.icu.util.ULocale);
- method public static String getDisplayCountry(String, String);
- method public static String getDisplayCountry(String, android.icu.util.ULocale);
- method public static String getDisplayKeyword(String);
- method public static String getDisplayKeyword(String, String);
- method public static String getDisplayKeyword(String, android.icu.util.ULocale);
- method public String getDisplayKeywordValue(String);
- method public String getDisplayKeywordValue(String, android.icu.util.ULocale);
- method public static String getDisplayKeywordValue(String, String, String);
- method public static String getDisplayKeywordValue(String, String, android.icu.util.ULocale);
- method public String getDisplayLanguage();
- method public String getDisplayLanguage(android.icu.util.ULocale);
- method public static String getDisplayLanguage(String, String);
- method public static String getDisplayLanguage(String, android.icu.util.ULocale);
- method public String getDisplayLanguageWithDialect();
- method public String getDisplayLanguageWithDialect(android.icu.util.ULocale);
- method public static String getDisplayLanguageWithDialect(String, String);
- method public static String getDisplayLanguageWithDialect(String, android.icu.util.ULocale);
- method public String getDisplayName();
- method public String getDisplayName(android.icu.util.ULocale);
- method public static String getDisplayName(String, String);
- method public static String getDisplayName(String, android.icu.util.ULocale);
- method public String getDisplayNameWithDialect();
- method public String getDisplayNameWithDialect(android.icu.util.ULocale);
- method public static String getDisplayNameWithDialect(String, String);
- method public static String getDisplayNameWithDialect(String, android.icu.util.ULocale);
- method public String getDisplayScript();
- method public String getDisplayScript(android.icu.util.ULocale);
- method public static String getDisplayScript(String, String);
- method public static String getDisplayScript(String, android.icu.util.ULocale);
- method public String getDisplayVariant();
- method public String getDisplayVariant(android.icu.util.ULocale);
- method public static String getDisplayVariant(String, String);
- method public static String getDisplayVariant(String, android.icu.util.ULocale);
- method public String getExtension(char);
- method public java.util.Set<java.lang.Character> getExtensionKeys();
- method public static String getFallback(String);
- method public android.icu.util.ULocale getFallback();
- method public String getISO3Country();
- method public static String getISO3Country(String);
- method public String getISO3Language();
- method public static String getISO3Language(String);
- method public static String[] getISOCountries();
- method public static String[] getISOLanguages();
- method public String getKeywordValue(String);
- method public static String getKeywordValue(String, String);
- method public java.util.Iterator<java.lang.String> getKeywords();
- method public static java.util.Iterator<java.lang.String> getKeywords(String);
- method public String getLanguage();
- method public static String getLanguage(String);
- method public String getLineOrientation();
- method public String getName();
- method public static String getName(String);
- method public String getScript();
- method public static String getScript(String);
- method public java.util.Set<java.lang.String> getUnicodeLocaleAttributes();
- method public java.util.Set<java.lang.String> getUnicodeLocaleKeys();
- method public String getUnicodeLocaleType(String);
- method public String getVariant();
- method public static String getVariant(String);
- method public boolean isRightToLeft();
- method public static android.icu.util.ULocale minimizeSubtags(android.icu.util.ULocale);
- method public android.icu.util.ULocale setKeywordValue(String, String);
- method public static String setKeywordValue(String, String, String);
- method public String toLanguageTag();
- method public static String toLegacyKey(String);
- method public static String toLegacyType(String, String);
- method public java.util.Locale toLocale();
- method public static String toUnicodeLocaleKey(String);
- method public static String toUnicodeLocaleType(String, String);
- field public static final android.icu.util.ULocale CANADA;
- field public static final android.icu.util.ULocale CANADA_FRENCH;
- field public static final android.icu.util.ULocale CHINA;
- field public static final android.icu.util.ULocale CHINESE;
- field public static final android.icu.util.ULocale ENGLISH;
- field public static final android.icu.util.ULocale FRANCE;
- field public static final android.icu.util.ULocale FRENCH;
- field public static final android.icu.util.ULocale GERMAN;
- field public static final android.icu.util.ULocale GERMANY;
- field public static final android.icu.util.ULocale ITALIAN;
- field public static final android.icu.util.ULocale ITALY;
- field public static final android.icu.util.ULocale JAPAN;
- field public static final android.icu.util.ULocale JAPANESE;
- field public static final android.icu.util.ULocale KOREA;
- field public static final android.icu.util.ULocale KOREAN;
- field public static final android.icu.util.ULocale PRC;
- field public static final char PRIVATE_USE_EXTENSION = 120; // 0x0078 'x'
- field public static final android.icu.util.ULocale ROOT;
- field public static final android.icu.util.ULocale SIMPLIFIED_CHINESE;
- field public static final android.icu.util.ULocale TAIWAN;
- field public static final android.icu.util.ULocale TRADITIONAL_CHINESE;
- field public static final android.icu.util.ULocale UK;
- field public static final char UNICODE_LOCALE_EXTENSION = 117; // 0x0075 'u'
- field public static final android.icu.util.ULocale US;
- }
-
- public static final class ULocale.Builder {
- ctor public ULocale.Builder();
- method public android.icu.util.ULocale.Builder addUnicodeLocaleAttribute(String);
- method public android.icu.util.ULocale build();
- method public android.icu.util.ULocale.Builder clear();
- method public android.icu.util.ULocale.Builder clearExtensions();
- method public android.icu.util.ULocale.Builder removeUnicodeLocaleAttribute(String);
- method public android.icu.util.ULocale.Builder setExtension(char, String);
- method public android.icu.util.ULocale.Builder setLanguage(String);
- method public android.icu.util.ULocale.Builder setLanguageTag(String);
- method public android.icu.util.ULocale.Builder setLocale(android.icu.util.ULocale);
- method public android.icu.util.ULocale.Builder setRegion(String);
- method public android.icu.util.ULocale.Builder setScript(String);
- method public android.icu.util.ULocale.Builder setUnicodeLocaleKeyword(String, String);
- method public android.icu.util.ULocale.Builder setVariant(String);
- }
-
- public enum ULocale.Category {
- enum_constant public static final android.icu.util.ULocale.Category DISPLAY;
- enum_constant public static final android.icu.util.ULocale.Category FORMAT;
- }
-
- public final class UniversalTimeScale {
- method public static android.icu.math.BigDecimal bigDecimalFrom(double, int);
- method public static android.icu.math.BigDecimal bigDecimalFrom(long, int);
- method public static android.icu.math.BigDecimal bigDecimalFrom(android.icu.math.BigDecimal, int);
- method public static long from(long, int);
- method public static long getTimeScaleValue(int, int);
- method public static android.icu.math.BigDecimal toBigDecimal(long, int);
- method public static android.icu.math.BigDecimal toBigDecimal(android.icu.math.BigDecimal, int);
- method public static long toLong(long, int);
- field public static final int DB2_TIME = 8; // 0x8
- field public static final int DOTNET_DATE_TIME = 4; // 0x4
- field public static final int EPOCH_OFFSET_PLUS_1_VALUE = 6; // 0x6
- field public static final int EPOCH_OFFSET_VALUE = 1; // 0x1
- field public static final int EXCEL_TIME = 7; // 0x7
- field public static final int FROM_MAX_VALUE = 3; // 0x3
- field public static final int FROM_MIN_VALUE = 2; // 0x2
- field public static final int ICU4C_TIME = 2; // 0x2
- field public static final int JAVA_TIME = 0; // 0x0
- field public static final int MAC_OLD_TIME = 5; // 0x5
- field public static final int MAC_TIME = 6; // 0x6
- field @Deprecated public static final int MAX_SCALE = 10; // 0xa
- field public static final int TO_MAX_VALUE = 5; // 0x5
- field public static final int TO_MIN_VALUE = 4; // 0x4
- field public static final int UNITS_VALUE = 0; // 0x0
- field public static final int UNIX_MICROSECONDS_TIME = 9; // 0x9
- field public static final int UNIX_TIME = 1; // 0x1
- field public static final int WINDOWS_FILE_TIME = 3; // 0x3
- }
-
- public interface ValueIterator {
- method public boolean next(android.icu.util.ValueIterator.Element);
- method public void reset();
- method public void setRange(int, int);
- }
-
- public static final class ValueIterator.Element {
- ctor public ValueIterator.Element();
- field public int integer;
- field public Object value;
- }
-
- public final class VersionInfo implements java.lang.Comparable<android.icu.util.VersionInfo> {
- method public int compareTo(android.icu.util.VersionInfo);
- method public static android.icu.util.VersionInfo getInstance(String);
- method public static android.icu.util.VersionInfo getInstance(int, int, int, int);
- method public static android.icu.util.VersionInfo getInstance(int, int, int);
- method public static android.icu.util.VersionInfo getInstance(int, int);
- method public static android.icu.util.VersionInfo getInstance(int);
- method public int getMajor();
- method public int getMicro();
- method public int getMilli();
- method public int getMinor();
- field public static final android.icu.util.VersionInfo ICU_VERSION;
- field public static final android.icu.util.VersionInfo UCOL_BUILDER_VERSION;
- field public static final android.icu.util.VersionInfo UCOL_RUNTIME_VERSION;
- field public static final android.icu.util.VersionInfo UNICODE_10_0;
- field public static final android.icu.util.VersionInfo UNICODE_11_0;
- field public static final android.icu.util.VersionInfo UNICODE_12_0;
- field public static final android.icu.util.VersionInfo UNICODE_12_1;
- field public static final android.icu.util.VersionInfo UNICODE_13_0;
- field public static final android.icu.util.VersionInfo UNICODE_1_0;
- field public static final android.icu.util.VersionInfo UNICODE_1_0_1;
- field public static final android.icu.util.VersionInfo UNICODE_1_1_0;
- field public static final android.icu.util.VersionInfo UNICODE_1_1_5;
- field public static final android.icu.util.VersionInfo UNICODE_2_0;
- field public static final android.icu.util.VersionInfo UNICODE_2_1_2;
- field public static final android.icu.util.VersionInfo UNICODE_2_1_5;
- field public static final android.icu.util.VersionInfo UNICODE_2_1_8;
- field public static final android.icu.util.VersionInfo UNICODE_2_1_9;
- field public static final android.icu.util.VersionInfo UNICODE_3_0;
- field public static final android.icu.util.VersionInfo UNICODE_3_0_1;
- field public static final android.icu.util.VersionInfo UNICODE_3_1_0;
- field public static final android.icu.util.VersionInfo UNICODE_3_1_1;
- field public static final android.icu.util.VersionInfo UNICODE_3_2;
- field public static final android.icu.util.VersionInfo UNICODE_4_0;
- field public static final android.icu.util.VersionInfo UNICODE_4_0_1;
- field public static final android.icu.util.VersionInfo UNICODE_4_1;
- field public static final android.icu.util.VersionInfo UNICODE_5_0;
- field public static final android.icu.util.VersionInfo UNICODE_5_1;
- field public static final android.icu.util.VersionInfo UNICODE_5_2;
- field public static final android.icu.util.VersionInfo UNICODE_6_0;
- field public static final android.icu.util.VersionInfo UNICODE_6_1;
- field public static final android.icu.util.VersionInfo UNICODE_6_2;
- field public static final android.icu.util.VersionInfo UNICODE_6_3;
- field public static final android.icu.util.VersionInfo UNICODE_7_0;
- field public static final android.icu.util.VersionInfo UNICODE_8_0;
- field public static final android.icu.util.VersionInfo UNICODE_9_0;
- }
-
-}
-
package android.inputmethodservice {
public abstract class AbstractInputMethodService extends android.app.Service implements android.view.KeyEvent.Callback {
@@ -24002,7 +19203,7 @@ package android.location {
method public float getBearingAccuracyDegrees();
method public long getElapsedRealtimeNanos();
method public double getElapsedRealtimeUncertaintyNanos();
- method @Deprecated public android.os.Bundle getExtras();
+ method public android.os.Bundle getExtras();
method public double getLatitude();
method public double getLongitude();
method public String getProvider();
@@ -24031,7 +19232,7 @@ package android.location {
method public void setBearingAccuracyDegrees(float);
method public void setElapsedRealtimeNanos(long);
method public void setElapsedRealtimeUncertaintyNanos(double);
- method @Deprecated public void setExtras(@Nullable android.os.Bundle);
+ method public void setExtras(@Nullable android.os.Bundle);
method public void setLatitude(double);
method public void setLongitude(double);
method public void setProvider(String);
@@ -24102,10 +19303,10 @@ package android.location {
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull android.location.LocationListener);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull android.location.LocationListener, @Nullable android.os.Looper);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener);
- method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.location.LocationListener, @Nullable android.os.Looper);
- method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener);
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.location.LocationListener, @Nullable android.os.Looper);
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull android.app.PendingIntent);
- method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.app.PendingIntent);
+ method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.app.PendingIntent);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, @NonNull android.location.LocationRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener);
method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, @NonNull android.location.LocationRequest, @NonNull android.app.PendingIntent);
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestSingleUpdate(@NonNull String, @NonNull android.location.LocationListener, @Nullable android.os.Looper);
@@ -24123,6 +19324,7 @@ package android.location {
field public static final String EXTRA_LOCATION_ENABLED = "android.location.extra.LOCATION_ENABLED";
field public static final String EXTRA_PROVIDER_ENABLED = "android.location.extra.PROVIDER_ENABLED";
field public static final String EXTRA_PROVIDER_NAME = "android.location.extra.PROVIDER_NAME";
+ field public static final String FUSED_PROVIDER = "fused";
field public static final String GPS_PROVIDER = "gps";
field public static final String KEY_FLUSH_COMPLETE = "flushComplete";
field public static final String KEY_LOCATION_CHANGED = "location";
@@ -45880,6 +41082,28 @@ package android.telephony {
field public static final int IP_VERSION_MISMATCH = 2055; // 0x807
field public static final int IRAT_HANDOVER_FAILED = 2194; // 0x892
field public static final int IS707B_MAX_ACCESS_PROBES = 2089; // 0x829
+ field public static final int IWLAN_AUTHORIZATION_REJECTED = 9003; // 0x232b
+ field public static final int IWLAN_DNS_RESOLUTION_NAME_FAILURE = 16388; // 0x4004
+ field public static final int IWLAN_DNS_RESOLUTION_TIMEOUT = 16389; // 0x4005
+ field public static final int IWLAN_IKEV2_AUTH_FAILURE = 16385; // 0x4001
+ field public static final int IWLAN_IKEV2_CERT_INVALID = 16387; // 0x4003
+ field public static final int IWLAN_IKEV2_CONFIG_FAILURE = 16384; // 0x4000
+ field public static final int IWLAN_IKEV2_MSG_TIMEOUT = 16386; // 0x4002
+ field public static final int IWLAN_ILLEGAL_ME = 9006; // 0x232e
+ field public static final int IWLAN_IMEI_NOT_ACCEPTED = 11005; // 0x2afd
+ field public static final int IWLAN_MAX_CONNECTION_REACHED = 8193; // 0x2001
+ field public static final int IWLAN_NETWORK_FAILURE = 10500; // 0x2904
+ field public static final int IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED = 9000; // 0x2328
+ field public static final int IWLAN_NO_APN_SUBSCRIPTION = 9002; // 0x232a
+ field public static final int IWLAN_PDN_CONNECTION_REJECTION = 8192; // 0x2000
+ field public static final int IWLAN_PLMN_NOT_ALLOWED = 11011; // 0x2b03
+ field public static final int IWLAN_RAT_TYPE_NOT_ALLOWED = 11001; // 0x2af9
+ field public static final int IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS = 8244; // 0x2034
+ field public static final int IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION = 8241; // 0x2031
+ field public static final int IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS = 8245; // 0x2035
+ field public static final int IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION = 8242; // 0x2032
+ field public static final int IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED = 11055; // 0x2b2f
+ field public static final int IWLAN_USER_UNKNOWN = 9001; // 0x2329
field public static final int LIMITED_TO_IPV4 = 2234; // 0x8ba
field public static final int LIMITED_TO_IPV6 = 2235; // 0x8bb
field public static final int LLC_SNDCP = 25; // 0x19
@@ -54230,6 +49454,7 @@ package android.view {
method public void setFlags(int, int);
method public void setFormat(int);
method public void setGravity(int);
+ method @RequiresPermission(android.Manifest.permission.HIDE_OVERLAY_WINDOWS) public final void setHideOverlayWindows(boolean);
method public void setIcon(@DrawableRes int);
method public void setLayout(int, int);
method public void setLocalFocus(boolean, boolean);
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index d83c0adb3ae1..cbb3bea6327e 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -122,6 +122,20 @@ package android.media.session {
}
+package android.net {
+
+ public final class TcpRepairWindow {
+ ctor public TcpRepairWindow(int, int, int, int, int, int);
+ field public final int maxWindow;
+ field public final int rcvWnd;
+ field public final int rcvWndScale;
+ field public final int rcvWup;
+ field public final int sndWl1;
+ field public final int sndWnd;
+ }
+
+}
+
package android.os {
public class Binder implements android.os.IBinder {
diff --git a/core/api/removed.txt b/core/api/removed.txt
index f2dfb84eb8fe..990388a54c85 100644
--- a/core/api/removed.txt
+++ b/core/api/removed.txt
@@ -213,14 +213,6 @@ package android.hardware {
}
-package android.icu.util {
-
- public class JapaneseCalendar extends android.icu.util.GregorianCalendar {
- field @Deprecated public static final int CURRENT_ERA;
- }
-
-}
-
package android.location {
public class Location implements android.os.Parcelable {
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 54fe377bc75e..821d3f147282 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -94,7 +94,7 @@ package android {
field public static final String HANDLE_CAR_MODE_CHANGES = "android.permission.HANDLE_CAR_MODE_CHANGES";
field public static final String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
field public static final String HDMI_CEC = "android.permission.HDMI_CEC";
- field public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
+ field @Deprecated public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS";
field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS";
field public static final String INSTALL_DYNAMIC_SYSTEM = "android.permission.INSTALL_DYNAMIC_SYSTEM";
field public static final String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS";
@@ -4173,7 +4173,6 @@ package android.location {
method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, @NonNull android.os.UserHandle);
method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setProviderEnabledForUser(@NonNull String, boolean, @NonNull android.os.UserHandle);
method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean unregisterGnssBatchedLocationCallback(@NonNull android.location.BatchedLocationCallback);
- field public static final String FUSED_PROVIDER = "fused";
}
public final class LocationRequest implements android.os.Parcelable {
@@ -11294,7 +11293,6 @@ package android.telephony.data {
method @NonNull public android.telephony.data.ApnThrottleStatus.Builder setSlotIndex(int);
method @NonNull public android.telephony.data.ApnThrottleStatus.Builder setThrottleExpiryTimeMillis(long);
method @NonNull public android.telephony.data.ApnThrottleStatus.Builder setTransportType(int);
- field public static final long NO_THROTTLE_EXPIRY_TIME = -1L; // 0xffffffffffffffffL
}
public final class DataCallResponse implements android.os.Parcelable {
@@ -12330,6 +12328,7 @@ package android.telephony.ims {
}
public interface SipDelegateConnection {
+ method public void closeDialog(@NonNull String);
method public void notifyMessageReceiveError(@NonNull String, int);
method public void notifyMessageReceived(@NonNull String);
method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long);
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index 5a292952bd65..ffe2736fe8c5 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -94,6 +94,8 @@ package android.app {
method public static void resumeAppSwitches() throws android.os.RemoteException;
method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int);
method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public boolean updateMccMncConfiguration(@NonNull String, @NonNull String);
+ field public static final long DROP_CLOSE_SYSTEM_DIALOGS = 174664120L; // 0xa6929b8L
+ field public static final long LOCK_DOWN_CLOSE_SYSTEM_DIALOGS = 174664365L; // 0xa692aadL
field public static final int PROCESS_CAPABILITY_ALL = 7; // 0x7
field public static final int PROCESS_CAPABILITY_ALL_EXPLICIT = 1; // 0x1
field public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = 6; // 0x6
@@ -961,7 +963,6 @@ package android.location {
method @NonNull public String[] getBackgroundThrottlingWhitelist();
method @NonNull public String[] getIgnoreSettingsWhitelist();
method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public java.util.List<java.lang.String> getProviderPackages(@NonNull String);
- field public static final String FUSED_PROVIDER = "fused";
}
}
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 7af96d660f54..a5d88ef4c8af 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -31,6 +31,8 @@ import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.annotation.TestApi;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.Disabled;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
@@ -91,9 +93,6 @@ import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlSerializer;
-
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -870,6 +869,39 @@ public class ActivityManager {
private static final boolean DEVELOPMENT_FORCE_LOW_RAM =
SystemProperties.getBoolean("debug.force_low_ram", false);
+ /**
+ * Intent {@link Intent#ACTION_CLOSE_SYSTEM_DIALOGS} is too powerful to be unrestricted. We
+ * restrict its usage for a few legitimate use-cases only, regardless of targetSdk. For the
+ * other use-cases we drop the intent with a log message.
+ *
+ * Note that this is the lighter version of {@link ActivityManager
+ * #LOCK_DOWN_CLOSE_SYSTEM_DIALOGS} which is not gated on targetSdk in order to eliminate the
+ * abuse vector.
+ *
+ * @hide
+ */
+ @TestApi
+ @ChangeId
+ @Disabled
+ public static final long DROP_CLOSE_SYSTEM_DIALOGS = 174664120L;
+
+ /**
+ * Intent {@link Intent#ACTION_CLOSE_SYSTEM_DIALOGS} is too powerful to be unrestricted. So,
+ * apps targeting {@link Build.VERSION_CODES#S} or higher will crash if they try to send such
+ * intent and don't have permission {@code android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS}.
+ *
+ * Note that this is the more restrict version of {@link ActivityManager
+ * #DROP_CLOSE_SYSTEM_DIALOGS} that expects the app to stop sending aforementioned intent once
+ * it bumps its targetSdk to {@link Build.VERSION_CODES#S} or higher.
+ *
+ * @hide
+ */
+ @TestApi
+ @ChangeId
+ @Disabled
+ // @EnabledSince(targetSdkVersion = VERSION_CODES.S)
+ public static final long LOCK_DOWN_CLOSE_SYSTEM_DIALOGS = 174664365L;
+
/** @hide */
public int getFrontActivityScreenCompatMode() {
try {
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index ed6dea815e4c..6d564a3ce61c 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -6681,8 +6681,7 @@ public final class ActivityThread extends ClientTransactionHandler {
private InstrumentationInfo prepareInstrumentation(AppBindData data) {
final InstrumentationInfo ii;
try {
- ii = new ApplicationPackageManager(
- null, getPackageManager(), getPermissionManager())
+ ii = new ApplicationPackageManager(null, getPackageManager())
.getInstrumentationInfo(data.instrumentationName, 0);
} catch (PackageManager.NameNotFoundException e) {
throw new RuntimeException(
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index f60f569be892..1009f6625bcc 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -6511,9 +6511,10 @@ public class AppOpsManager {
* @param code The op code.
* @param uid The UID performing the operation.
* @param packageName The package performing the operation.
+ * @param flags The flags of this op
* @param result The result of the note.
*/
- void onOpNoted(int code, int uid, String packageName, int result);
+ void onOpNoted(int code, int uid, String packageName, @OpFlags int flags, @Mode int result);
}
/**
@@ -6550,9 +6551,10 @@ public class AppOpsManager {
* @param op The op code.
* @param uid The UID performing the operation.
* @param packageName The package performing the operation.
+ * @param flags The flags of this op
* @param result The result of the start.
*/
- void onOpStarted(int op, int uid, String packageName, int result);
+ void onOpStarted(int op, int uid, String packageName, @OpFlags int flags, @Mode int result);
}
AppOpsManager(Context context, IAppOpsService service) {
@@ -7135,8 +7137,8 @@ public class AppOpsManager {
}
cb = new IAppOpsStartedCallback.Stub() {
@Override
- public void opStarted(int op, int uid, String packageName, int mode) {
- callback.onOpStarted(op, uid, packageName, mode);
+ public void opStarted(int op, int uid, String packageName, int flags, int mode) {
+ callback.onOpStarted(op, uid, packageName, flags, mode);
}
};
mStartedWatchers.put(callback, cb);
@@ -7202,8 +7204,8 @@ public class AppOpsManager {
}
cb = new IAppOpsNotedCallback.Stub() {
@Override
- public void opNoted(int op, int uid, String packageName, int mode) {
- callback.onOpNoted(op, uid, packageName, mode);
+ public void opNoted(int op, int uid, String packageName, int flags, int mode) {
+ callback.onOpNoted(op, uid, packageName, flags, mode);
}
};
mNotedWatchers.put(callback, cb);
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 3642d318e820..186d1fede5e0 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -59,8 +59,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageItemInfo;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.PackageManager.Property;
import android.content.pm.ParceledListSlice;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
@@ -95,8 +93,6 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
import android.os.storage.VolumeInfo;
-import android.permission.IOnPermissionsChangeListener;
-import android.permission.IPermissionManager;
import android.permission.PermissionManager;
import android.provider.Settings;
import android.system.ErrnoException;
@@ -106,7 +102,6 @@ import android.system.StructStat;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
-import android.util.DebugUtils;
import android.util.LauncherIcons;
import android.util.Log;
@@ -129,7 +124,6 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
-import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -137,14 +131,6 @@ import java.util.Set;
public class ApplicationPackageManager extends PackageManager {
private static final String TAG = "ApplicationPackageManager";
private static final boolean DEBUG_ICONS = false;
- /**
- * Note: Changing this won't do anything on it's own - you should also change the filtering in
- * {@link #shouldTraceGrant}
- *
- * @hide
- */
- public static final boolean DEBUG_TRACE_GRANTS = false;
- public static final boolean DEBUG_TRACE_PERMISSION_UPDATES = false;
private static final int DEFAULT_EPHEMERAL_COOKIE_MAX_SIZE_BYTES = 16384; // 16KB
@@ -171,6 +157,8 @@ public class ApplicationPackageManager extends PackageManager {
@GuardedBy("mLock")
private UserManager mUserManager;
@GuardedBy("mLock")
+ private PermissionManager mPermissionManager;
+ @GuardedBy("mLock")
private PackageInstaller mInstaller;
@GuardedBy("mLock")
private ArtManager mArtManager;
@@ -190,6 +178,15 @@ public class ApplicationPackageManager extends PackageManager {
}
}
+ private PermissionManager getPermissionManager() {
+ synchronized (mLock) {
+ if (mPermissionManager == null) {
+ mPermissionManager = mContext.getSystemService(PermissionManager.class);
+ }
+ return mPermissionManager;
+ }
+ }
+
@Override
public int getUserId() {
return mContext.getUserId();
@@ -355,66 +352,41 @@ public class ApplicationPackageManager extends PackageManager {
@Override
@SuppressWarnings("unchecked")
public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
- try {
- final ParceledListSlice<PermissionGroupInfo> parceledList =
- mPermissionManager.getAllPermissionGroups(flags);
- if (parceledList == null) {
- return Collections.emptyList();
- }
- return parceledList.getList();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().getAllPermissionGroups(flags);
}
@Override
public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags)
throws NameNotFoundException {
- try {
- final PermissionGroupInfo pgi =
- mPermissionManager.getPermissionGroupInfo(groupName, flags);
- if (pgi != null) {
- return pgi;
- }
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ final PermissionGroupInfo permissionGroupInfo = getPermissionManager()
+ .getPermissionGroupInfo(groupName, flags);
+ if (permissionGroupInfo == null) {
+ throw new NameNotFoundException(groupName);
}
- throw new NameNotFoundException(groupName);
+ return permissionGroupInfo;
}
@Override
public PermissionInfo getPermissionInfo(String permName, int flags)
throws NameNotFoundException {
- try {
- final String packageName = mContext.getOpPackageName();
- final PermissionInfo pi =
- mPermissionManager.getPermissionInfo(permName, packageName, flags);
- if (pi != null) {
- return pi;
- }
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ final PermissionInfo permissionInfo = getPermissionManager().getPermissionInfo(permName,
+ flags);
+ if (permissionInfo == null) {
+ throw new NameNotFoundException(permName);
}
- throw new NameNotFoundException(permName);
+ return permissionInfo;
}
@Override
@SuppressWarnings("unchecked")
public List<PermissionInfo> queryPermissionsByGroup(String groupName, int flags)
throws NameNotFoundException {
- try {
- final ParceledListSlice<PermissionInfo> parceledList =
- mPermissionManager.queryPermissionsByGroup(groupName, flags);
- if (parceledList != null) {
- final List<PermissionInfo> pi = parceledList.getList();
- if (pi != null) {
- return pi;
- }
- }
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
+ final List<PermissionInfo> permissionInfos = getPermissionManager().queryPermissionsByGroup(
+ groupName, flags);
+ if (permissionInfos == null) {
+ throw new NameNotFoundException(groupName);
}
- throw new NameNotFoundException(groupName);
+ return permissionInfos;
}
@Override
@@ -724,11 +696,7 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean isPermissionRevokedByPolicy(String permName, String pkgName) {
- try {
- return mPermissionManager.isPermissionRevokedByPolicy(permName, pkgName, getUserId());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().isPermissionRevokedByPolicy(pkgName, permName);
}
/**
@@ -750,50 +718,23 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public boolean addPermission(PermissionInfo info) {
- try {
- return mPermissionManager.addPermission(info, false);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().addPermission(info, false);
}
@Override
public boolean addPermissionAsync(PermissionInfo info) {
- try {
- return mPermissionManager.addPermission(info, true);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().addPermission(info, true);
}
@Override
public void removePermission(String name) {
- try {
- mPermissionManager.removePermission(name);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ getPermissionManager().removePermission(name);
}
@Override
public void grantRuntimePermission(String packageName, String permissionName,
UserHandle user) {
- if (DEBUG_TRACE_GRANTS
- && shouldTraceGrant(packageName, permissionName, user.getIdentifier())) {
- Log.i(TAG, "App " + mContext.getPackageName() + " is granting " + packageName + " "
- + permissionName + " for user " + user.getIdentifier(), new RuntimeException());
- }
- try {
- mPM.grantRuntimePermission(packageName, permissionName, user.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /** @hide */
- public static boolean shouldTraceGrant(String packageName, String permissionName, int userId) {
- // To be modified when debugging
- return false;
+ getPermissionManager().grantRuntimePermission(packageName, permissionName, user);
}
@Override
@@ -804,124 +745,55 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public void revokeRuntimePermission(String packageName, String permName, UserHandle user,
String reason) {
- if (DEBUG_TRACE_PERMISSION_UPDATES
- && shouldTraceGrant(packageName, permName, user.getIdentifier())) {
- Log.i(TAG, "App " + mContext.getPackageName() + " is revoking " + packageName + " "
- + permName + " for user " + user.getIdentifier() + " with reason " + reason,
- new RuntimeException());
- }
- try {
- mPermissionManager
- .revokeRuntimePermission(packageName, permName, user.getIdentifier(), reason);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ getPermissionManager().revokeRuntimePermission(packageName, permName, user, reason);
}
@Override
public int getPermissionFlags(String permName, String packageName, UserHandle user) {
- try {
- return mPermissionManager
- .getPermissionFlags(permName, packageName, user.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().getPermissionFlags(packageName, permName, user);
}
@Override
public void updatePermissionFlags(String permName, String packageName,
int flagMask, int flagValues, UserHandle user) {
- if (DEBUG_TRACE_PERMISSION_UPDATES
- && shouldTraceGrant(packageName, permName, user.getIdentifier())) {
- Log.i(TAG, "App " + mContext.getPackageName() + " is updating flags for "
- + packageName + " "
- + permName + " for user " + user.getIdentifier() + ": "
- + DebugUtils.flagsToString(PackageManager.class, "FLAG_PERMISSION_", flagMask)
- + " := " + DebugUtils.flagsToString(
- PackageManager.class, "FLAG_PERMISSION_", flagValues),
- new RuntimeException());
- }
- try {
- final boolean checkAdjustPolicyFlagPermission =
- mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q;
- mPermissionManager.updatePermissionFlags(permName, packageName, flagMask,
- flagValues, checkAdjustPolicyFlagPermission, user.getIdentifier());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ getPermissionManager().updatePermissionFlags(packageName, permName, flagMask, flagValues,
+ user);
}
@Override
public @NonNull Set<String> getWhitelistedRestrictedPermissions(
@NonNull String packageName, @PermissionWhitelistFlags int flags) {
- try {
- final int userId = getUserId();
- final List<String> whitelist = mPermissionManager
- .getWhitelistedRestrictedPermissions(packageName, flags, userId);
- if (whitelist != null) {
- return new ArraySet<>(whitelist);
- }
- return Collections.emptySet();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().getAllowlistedRestrictedPermissions(packageName, flags);
}
@Override
public boolean addWhitelistedRestrictedPermission(@NonNull String packageName,
@NonNull String permName, @PermissionWhitelistFlags int flags) {
- try {
- final int userId = getUserId();
- return mPermissionManager
- .addWhitelistedRestrictedPermission(packageName, permName, flags, userId);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().addAllowlistedRestrictedPermission(packageName, permName,
+ flags);
}
@Override
- public boolean setAutoRevokeWhitelisted(
- @NonNull String packageName, boolean whitelisted) {
- try {
- final int userId = getUserId();
- return mPermissionManager.setAutoRevokeWhitelisted(packageName, whitelisted, userId);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ public boolean setAutoRevokeWhitelisted(@NonNull String packageName, boolean whitelisted) {
+ return getPermissionManager().setAutoRevokeExempted(packageName, whitelisted);
}
@Override
public boolean isAutoRevokeWhitelisted(@NonNull String packageName) {
- try {
- final int userId = getUserId();
- return mPermissionManager.isAutoRevokeWhitelisted(packageName, userId);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().isAutoRevokeExempted(packageName);
}
@Override
public boolean removeWhitelistedRestrictedPermission(@NonNull String packageName,
@NonNull String permName, @PermissionWhitelistFlags int flags) {
- try {
- final int userId = getUserId();
- return mPermissionManager
- .removeWhitelistedRestrictedPermission(packageName, permName, flags, userId);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().removeAllowlistedRestrictedPermission(packageName, permName,
+ flags);
}
@Override
@UnsupportedAppUsage
public boolean shouldShowRequestPermissionRationale(String permName) {
- try {
- final String packageName = mContext.getPackageName();
- return mPermissionManager
- .shouldShowRequestPermissionRationale(permName, packageName, getUserId());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return getPermissionManager().shouldShowRequestPermissionRationale(permName);
}
@Override
@@ -1880,34 +1752,12 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public void addOnPermissionsChangeListener(OnPermissionsChangedListener listener) {
- synchronized (mPermissionListeners) {
- if (mPermissionListeners.get(listener) != null) {
- return;
- }
- OnPermissionsChangeListenerDelegate delegate =
- new OnPermissionsChangeListenerDelegate(listener, Looper.getMainLooper());
- try {
- mPermissionManager.addOnPermissionsChangeListener(delegate);
- mPermissionListeners.put(listener, delegate);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
+ getPermissionManager().addOnPermissionsChangeListener(listener);
}
@Override
public void removeOnPermissionsChangeListener(OnPermissionsChangedListener listener) {
- synchronized (mPermissionListeners) {
- IOnPermissionsChangeListener delegate = mPermissionListeners.get(listener);
- if (delegate != null) {
- try {
- mPermissionManager.removeOnPermissionsChangeListener(delegate);
- mPermissionListeners.remove(listener);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
- }
+ getPermissionManager().removeOnPermissionsChangeListener(listener);
}
@UnsupportedAppUsage
@@ -1918,11 +1768,9 @@ public class ApplicationPackageManager extends PackageManager {
}
}
- protected ApplicationPackageManager(ContextImpl context, IPackageManager pm,
- IPermissionManager permissionManager) {
+ protected ApplicationPackageManager(ContextImpl context, IPackageManager pm) {
mContext = context;
mPM = pm;
- mPermissionManager = permissionManager;
}
/**
@@ -3234,7 +3082,6 @@ public class ApplicationPackageManager extends PackageManager {
private final ContextImpl mContext;
@UnsupportedAppUsage
private final IPackageManager mPM;
- private final IPermissionManager mPermissionManager;
/** Assume locked until we hear otherwise */
private volatile boolean mUserUnlocked = false;
@@ -3245,41 +3092,6 @@ public class ApplicationPackageManager extends PackageManager {
private static ArrayMap<ResourceName, WeakReference<CharSequence>> sStringCache
= new ArrayMap<ResourceName, WeakReference<CharSequence>>();
- private final Map<OnPermissionsChangedListener, IOnPermissionsChangeListener>
- mPermissionListeners = new ArrayMap<>();
-
- public class OnPermissionsChangeListenerDelegate extends IOnPermissionsChangeListener.Stub
- implements Handler.Callback{
- private static final int MSG_PERMISSIONS_CHANGED = 1;
-
- private final OnPermissionsChangedListener mListener;
- private final Handler mHandler;
-
-
- public OnPermissionsChangeListenerDelegate(OnPermissionsChangedListener listener,
- Looper looper) {
- mListener = listener;
- mHandler = new Handler(looper, this);
- }
-
- @Override
- public void onPermissionsChanged(int uid) {
- mHandler.obtainMessage(MSG_PERMISSIONS_CHANGED, uid, 0).sendToTarget();
- }
-
- @Override
- public boolean handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_PERMISSIONS_CHANGED: {
- final int uid = msg.arg1;
- mListener.onPermissionsChanged(uid);
- return true;
- }
- }
- return false;
- }
- }
-
@Override
public boolean canRequestPackageInstalls() {
try {
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 2fec9f79717a..124cf71edc9c 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -72,7 +72,6 @@ import android.os.Trace;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManager;
-import android.permission.IPermissionManager;
import android.permission.PermissionManager;
import android.system.ErrnoException;
import android.system.Os;
@@ -370,10 +369,9 @@ class ContextImpl extends Context {
}
final IPackageManager pm = ActivityThread.getPackageManager();
- final IPermissionManager permissionManager = ActivityThread.getPermissionManager();
- if (pm != null && permissionManager != null) {
+ if (pm != null) {
// Doesn't matter if we make more than one instance.
- return (mPackageManager = new ApplicationPackageManager(this, pm, permissionManager));
+ return (mPackageManager = new ApplicationPackageManager(this, pm));
}
return null;
diff --git a/core/java/android/app/OWNERS b/core/java/android/app/OWNERS
index 633d093435ee..abdd537a9a26 100644
--- a/core/java/android/app/OWNERS
+++ b/core/java/android/app/OWNERS
@@ -1 +1,38 @@
+
+# Remain no owner because multiple modules may touch this file.
+per-file ContextImpl.java = *
+
+# ActivityThread
+per-file ActivityThread.java = file:/services/core/java/com/android/server/am/OWNERS
+per-file ActivityThread.java = file:/services/core/java/com/android/server/wm/OWNERS
+
+# Alarm
+per-file *Alarm* = file:/apex/jobscheduler/OWNERS
+
+# AppOps
+per-file *AppOp* = file:/core/java/android/permission/OWNERS
+
+# Notification
+per-file *Notification* = file:/packages/SystemUI/OWNERS
+
+#Wallpaper
+per-file Wallpaper*.java = file:/core/java/android/service/wallpaper/OWNERS
+per-file IWallpaper*.aidl = file:/core/java/android/service/wallpaper/OWNERS
+
+# WindowManager
+per-file Activity*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Activity*.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file ClientTransactionHandler.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Fragment.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file IActivity*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file IAppTask.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file ITaskStackListener.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file LocalActivityManager.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Task*.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Window*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Window*.java = file:/services/core/java/com/android/server/wm/OWNERS
+
+# TODO(b/174932174): determine the ownership of KeyguardManager.java
+
+# Zygote
per-file *Zygote* = file:/ZYGOTE_OWNERS
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 392d6fbe53d6..a6bf4dddf855 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -63,7 +63,6 @@ import android.content.pm.CrossProfileApps;
import android.content.pm.DataLoaderManager;
import android.content.pm.ICrossProfileApps;
import android.content.pm.IDataLoaderManager;
-import android.content.pm.IPackageManager;
import android.content.pm.IShortcutService;
import android.content.pm.LauncherApps;
import android.content.pm.PackageManager;
@@ -176,6 +175,7 @@ import android.os.image.IDynamicSystemService;
import android.os.incremental.IIncrementalService;
import android.os.incremental.IncrementalManager;
import android.os.storage.StorageManager;
+import android.permission.LegacyPermissionManager;
import android.permission.PermissionControllerManager;
import android.permission.PermissionManager;
import android.print.IPrintManager;
@@ -1264,8 +1264,15 @@ public final class SystemServiceRegistry {
@Override
public PermissionManager createService(ContextImpl ctx)
throws ServiceNotFoundException {
- IPackageManager packageManager = AppGlobals.getPackageManager();
- return new PermissionManager(ctx.getOuterContext(), packageManager);
+ return new PermissionManager(ctx.getOuterContext());
+ }});
+
+ registerService(Context.LEGACY_PERMISSION_SERVICE, LegacyPermissionManager.class,
+ new CachedServiceFetcher<LegacyPermissionManager>() {
+ @Override
+ public LegacyPermissionManager createService(ContextImpl ctx)
+ throws ServiceNotFoundException {
+ return new LegacyPermissionManager();
}});
registerService(Context.PERMISSION_CONTROLLER_SERVICE, PermissionControllerManager.class,
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index ab94fd5922bc..94084b851ae0 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -2919,22 +2919,36 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
- * profile.
+ * profile. Apps targeting {@link android.os.Build.VERSION_CODES#S} and above will get a
+ * {@code IllegalArgumentException} when calling this method on the parent
+ * {@link DevicePolicyManager} instance.
*
* <p><strong>Note:</strong> Specifying password requirements using this method clears the
* password complexity requirements set using {@link #setRequiredPasswordComplexity(int)}.
*
+ * @deprecated Prefer using {@link #setRequiredPasswordComplexity(int)}, to require a password
+ * that satisfies a complexity level defined by the platform, rather than specifying custom
+ * password requirement.
+ * Setting custom, overly-complicated password requirements leads to passwords that are hard
+ * for users to remember and may not provide any security benefits given as Android uses
+ * hardware-backed throttling to thwart online and offline brute-forcing of the device's
+ * screen lock.
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED},
* {@link #PASSWORD_QUALITY_BIOMETRIC_WEAK},
* {@link #PASSWORD_QUALITY_SOMETHING}, {@link #PASSWORD_QUALITY_NUMERIC},
* {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC},
* {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}.
- * @throws SecurityException if {@code admin} is not an active administrator or if {@code admin}
- * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD}
+ * @throws SecurityException if {@code admin} is not an active administrator, if {@code admin}
+ * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} or if the
+ * calling app is targeting {@link android.os.Build.VERSION_CODES#S} and above,
+ * and is calling the method the {@link DevicePolicyManager} instance returned by
+ * {@link #getParentProfileInstance(ComponentName)}.
*/
+ @Deprecated
public void setPasswordQuality(@NonNull ComponentName admin, int quality) {
if (mService != null) {
try {
@@ -2957,9 +2971,12 @@ public class DevicePolicyManager {
* <p>Note: on devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature,
* the password is always treated as empty.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to aggregate
* all admins.
*/
+ @Deprecated
public int getPasswordQuality(@Nullable ComponentName admin) {
return getPasswordQuality(admin, myUserId());
}
@@ -2999,10 +3016,14 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ *
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param length The new desired minimum password length. A value of 0 means there is no
* restriction.
@@ -3012,6 +3033,7 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password
* quality requirement prior to calling this method.
*/
+ @Deprecated
public void setPasswordMinimumLength(@NonNull ComponentName admin, int length) {
if (mService != null) {
try {
@@ -3034,9 +3056,12 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to aggregate
* all admins.
*/
+ @Deprecated
public int getPasswordMinimumLength(@Nullable ComponentName admin) {
return getPasswordMinimumLength(admin, myUserId());
}
@@ -3074,10 +3099,14 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ *
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param length The new desired minimum number of upper case letters required in the password.
* A value of 0 means there is no restriction.
@@ -3087,6 +3116,7 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password
* quality requirement prior to calling this method.
*/
+ @Deprecated
public void setPasswordMinimumUpperCase(@NonNull ComponentName admin, int length) {
if (mService != null) {
try {
@@ -3114,11 +3144,14 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to
* aggregate all admins.
* @return The minimum number of upper case letters required in the
* password.
*/
+ @Deprecated
public int getPasswordMinimumUpperCase(@Nullable ComponentName admin) {
return getPasswordMinimumUpperCase(admin, myUserId());
}
@@ -3156,10 +3189,14 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ *
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param length The new desired minimum number of lower case letters required in the password.
* A value of 0 means there is no restriction.
@@ -3169,6 +3206,7 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password
* quality requirement prior to calling this method.
*/
+ @Deprecated
public void setPasswordMinimumLowerCase(@NonNull ComponentName admin, int length) {
if (mService != null) {
try {
@@ -3196,11 +3234,14 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to
* aggregate all admins.
* @return The minimum number of lower case letters required in the
* password.
*/
+ @Deprecated
public int getPasswordMinimumLowerCase(@Nullable ComponentName admin) {
return getPasswordMinimumLowerCase(admin, myUserId());
}
@@ -3238,10 +3279,14 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ *
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param length The new desired minimum number of letters required in the password. A value of
* 0 means there is no restriction.
@@ -3251,6 +3296,7 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password
* quality requirement prior to calling this method.
*/
+ @Deprecated
public void setPasswordMinimumLetters(@NonNull ComponentName admin, int length) {
if (mService != null) {
try {
@@ -3278,10 +3324,13 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to
* aggregate all admins.
* @return The minimum number of letters required in the password.
*/
+ @Deprecated
public int getPasswordMinimumLetters(@Nullable ComponentName admin) {
return getPasswordMinimumLetters(admin, myUserId());
}
@@ -3319,10 +3368,14 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ *
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param length The new desired minimum number of numerical digits required in the password. A
* value of 0 means there is no restriction.
@@ -3332,6 +3385,7 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password
* quality requirement prior to calling this method.
*/
+ @Deprecated
public void setPasswordMinimumNumeric(@NonNull ComponentName admin, int length) {
if (mService != null) {
try {
@@ -3359,10 +3413,13 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to
* aggregate all admins.
* @return The minimum number of numerical digits required in the password.
*/
+ @Deprecated
public int getPasswordMinimumNumeric(@Nullable ComponentName admin) {
return getPasswordMinimumNumeric(admin, myUserId());
}
@@ -3400,10 +3457,14 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ *
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param length The new desired minimum number of symbols required in the password. A value of
* 0 means there is no restriction.
@@ -3413,6 +3474,7 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password
* quality requirement prior to calling this method.
*/
+ @Deprecated
public void setPasswordMinimumSymbols(@NonNull ComponentName admin, int length) {
if (mService != null) {
try {
@@ -3439,10 +3501,13 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to
* aggregate all admins.
* @return The minimum number of symbols required in the password.
*/
+ @Deprecated
public int getPasswordMinimumSymbols(@Nullable ComponentName admin) {
return getPasswordMinimumSymbols(admin, myUserId());
}
@@ -3480,10 +3545,14 @@ public class DevicePolicyManager {
* {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has
* not, a security exception will be thrown.
* <p>
- * This method can be called on the {@link DevicePolicyManager} instance returned by
+ *
+ * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the
+ * {@link DevicePolicyManager} instance returned by
* {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent
* profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @param length The new desired minimum number of letters required in the password. A value of
* 0 means there is no restriction.
@@ -3493,6 +3562,7 @@ public class DevicePolicyManager {
* {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password
* quality requirement prior to calling this method.
*/
+ @Deprecated
public void setPasswordMinimumNonLetter(@NonNull ComponentName admin, int length) {
if (mService != null) {
try {
@@ -3520,10 +3590,13 @@ public class DevicePolicyManager {
* returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve
* restrictions on the parent profile.
*
+ * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details.
+ *
* @param admin The name of the admin component to check, or {@code null} to
* aggregate all admins.
* @return The minimum number of letters required in the password.
*/
+ @Deprecated
public int getPasswordMinimumNonLetter(@Nullable ComponentName admin) {
return getPasswordMinimumNonLetter(admin, myUserId());
}
diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java
index c3c270e52eb6..59646f106db5 100644
--- a/core/java/android/companion/CompanionDeviceManager.java
+++ b/core/java/android/companion/CompanionDeviceManager.java
@@ -34,6 +34,7 @@ import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.service.notification.NotificationListenerService;
+import android.util.ExceptionUtils;
import android.util.Log;
import java.util.Collections;
@@ -321,6 +322,77 @@ public final class CompanionDeviceManager {
}
}
+ /**
+ * Register to receive callbacks whenever the associated device comes in and out of range.
+ *
+ * The provided device must be {@link #associate associated} with the calling app before
+ * calling this method.
+ *
+ * Caller must implement a single {@link CompanionDeviceService} which will be bound to and
+ * receive callbacks to {@link CompanionDeviceService#onDeviceAppeared} and
+ * {@link CompanionDeviceService#onDeviceDisappeared}.
+ * The app doesn't need to remain running in order to receive its callbacks.
+ *
+ * Calling app must declare uses-permission
+ * {@link android.Manifest.permission#REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE}.
+ *
+ * Calling app must check for feature presence of
+ * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} before calling this API.
+ *
+ * @param deviceAddress a previously-associated companion device's address
+ *
+ * @throws DeviceNotAssociatedException if the given device was not previously associated
+ * with this app.
+ */
+ @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE)
+ public void startObservingDevicePresence(@NonNull String deviceAddress)
+ throws DeviceNotAssociatedException {
+ if (!checkFeaturePresent()) {
+ return;
+ }
+ Objects.requireNonNull(deviceAddress, "address cannot be null");
+ try {
+ mService.registerDevicePresenceListenerService(
+ mContext.getPackageName(), deviceAddress);
+ } catch (RemoteException e) {
+ ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class);
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Unregister for receiving callbacks whenever the associated device comes in and out of range.
+ *
+ * The provided device must be {@link #associate associated} with the calling app before
+ * calling this method.
+ *
+ * Calling app must declare uses-permission
+ * {@link android.Manifest.permission#REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE}.
+ *
+ * Calling app must check for feature presence of
+ * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} before calling this API.
+ *
+ * @param deviceAddress a previously-associated companion device's address
+ *
+ * @throws DeviceNotAssociatedException if the given device was not previously associated
+ * with this app.
+ */
+ @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE)
+ public void stopObservingDevicePresence(@NonNull String deviceAddress)
+ throws DeviceNotAssociatedException {
+ if (!checkFeaturePresent()) {
+ return;
+ }
+ Objects.requireNonNull(deviceAddress, "address cannot be null");
+ try {
+ mService.unregisterDevicePresenceListenerService(
+ mContext.getPackageName(), deviceAddress);
+ } catch (RemoteException e) {
+ ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class);
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
private boolean checkFeaturePresent() {
boolean featurePresent = mService != null;
if (!featurePresent && DEBUG) {
diff --git a/core/java/android/companion/DeviceNotAssociatedException.java b/core/java/android/companion/DeviceNotAssociatedException.java
new file mode 100644
index 000000000000..bebb6c9ff7eb
--- /dev/null
+++ b/core/java/android/companion/DeviceNotAssociatedException.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.companion;
+
+import android.annotation.Nullable;
+
+/**
+ * An exception for a case when a given device was not
+ * {@link CompanionDeviceManager#associate associated} to the calling app.
+ */
+public class DeviceNotAssociatedException extends Exception {
+ /** @hide */
+ public DeviceNotAssociatedException(@Nullable String deviceName) {
+ super("Device not associated with the current app: " + deviceName);
+ }
+}
diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl
index bcb9be80e6a4..527d8df94ea0 100644
--- a/core/java/android/companion/ICompanionDeviceManager.aidl
+++ b/core/java/android/companion/ICompanionDeviceManager.aidl
@@ -45,4 +45,8 @@ interface ICompanionDeviceManager {
boolean isDeviceAssociatedForWifiConnection(in String packageName, in String macAddress,
int userId);
+
+ void registerDevicePresenceListenerService(in String packageName, in String deviceAddress);
+
+ void unregisterDevicePresenceListenerService(in String packageName, in String deviceAddress);
}
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index d920fb3e97e6..f3e1a87ea271 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -4564,6 +4564,15 @@ public abstract class Context {
public static final String PERMISSION_SERVICE = "permission";
/**
+ * Official published name of the legacy (internal) permission service.
+ *
+ * @see #getSystemService(String)
+ * @hide
+ */
+ //@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public static final String LEGACY_PERMISSION_SERVICE = "legacy_permission";
+
+ /**
* Official published name of the (internal) permission controller service.
*
* @see #getSystemService(String)
diff --git a/core/java/android/content/OWNERS b/core/java/android/content/OWNERS
new file mode 100644
index 000000000000..c1e7e41972ba
--- /dev/null
+++ b/core/java/android/content/OWNERS
@@ -0,0 +1,3 @@
+# Remain no owner because multiple modules may touch this file.
+per-file Context.java = *
+per-file ContextWrapper.java = *
diff --git a/core/java/android/content/pm/OWNERS b/core/java/android/content/pm/OWNERS
index 3a590dac7c0b..24872e8c3c1d 100644
--- a/core/java/android/content/pm/OWNERS
+++ b/core/java/android/content/pm/OWNERS
@@ -5,3 +5,4 @@ toddke@google.com
patb@google.com
per-file PackageParser.java = chiuwinson@google.com
+per-file *Shortcut* = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index cf3f7069c63f..67a1ad676348 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -4438,6 +4438,7 @@ public abstract class PackageManager {
* @throws NameNotFoundException if a package with the given name cannot be
* found on the system.
*/
+ //@Deprecated
public abstract PermissionInfo getPermissionInfo(@NonNull String permName,
@PermissionInfoFlags int flags) throws NameNotFoundException;
@@ -4450,9 +4451,10 @@ public abstract class PackageManager {
* @param flags Additional option flags to modify the data returned.
* @return Returns a list of {@link PermissionInfo} containing information
* about all of the permissions in the given group.
- * @throws NameNotFoundException if a package with the given name cannot be
+ * @throws NameNotFoundException if a group with the given name cannot be
* found on the system.
*/
+ //@Deprecated
@NonNull
public abstract List<PermissionInfo> queryPermissionsByGroup(@NonNull String permissionGroup,
@PermissionInfoFlags int flags) throws NameNotFoundException;
@@ -4481,7 +4483,7 @@ public abstract class PackageManager {
* Retrieve all of the information we know about a particular group of
* permissions.
*
- * @param permName The fully qualified name (i.e.
+ * @param groupName The fully qualified name (i.e.
* com.google.permission_group.APPS) of the permission you are
* interested in.
* @param flags Additional option flags to modify the data returned.
@@ -4490,8 +4492,9 @@ public abstract class PackageManager {
* @throws NameNotFoundException if a package with the given name cannot be
* found on the system.
*/
+ //@Deprecated
@NonNull
- public abstract PermissionGroupInfo getPermissionGroupInfo(@NonNull String permName,
+ public abstract PermissionGroupInfo getPermissionGroupInfo(@NonNull String groupName,
@PermissionGroupInfoFlags int flags) throws NameNotFoundException;
/**
@@ -4501,6 +4504,7 @@ public abstract class PackageManager {
* @return Returns a list of {@link PermissionGroupInfo} containing
* information about all of the known permission groups.
*/
+ //@Deprecated
@NonNull
public abstract List<PermissionGroupInfo> getAllPermissionGroups(
@PermissionGroupInfoFlags int flags);
@@ -4757,6 +4761,7 @@ public abstract class PackageManager {
* @return Whether the permission is restricted by policy.
*/
@CheckResult
+ //@Deprecated
public abstract boolean isPermissionRevokedByPolicy(@NonNull String permName,
@NonNull String packageName);
@@ -4805,6 +4810,7 @@ public abstract class PackageManager {
*
* @see #removePermission(String)
*/
+ //@Deprecated
public abstract boolean addPermission(@NonNull PermissionInfo info);
/**
@@ -4814,6 +4820,7 @@ public abstract class PackageManager {
* expense of no guarantee the added permission will be retained if
* the device is rebooted before it is written.
*/
+ //@Deprecated
public abstract boolean addPermissionAsync(@NonNull PermissionInfo info);
/**
@@ -4829,6 +4836,7 @@ public abstract class PackageManager {
*
* @see #addPermission(PermissionInfo)
*/
+ //@Deprecated
public abstract void removePermission(@NonNull String permName);
/**
@@ -4881,6 +4889,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SuppressWarnings("HiddenAbstractMethod")
@SystemApi
@RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
@@ -4908,6 +4917,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SuppressWarnings("HiddenAbstractMethod")
@SystemApi
@RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
@@ -4936,6 +4946,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SystemApi
@RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
public void revokeRuntimePermission(@NonNull String packageName,
@@ -4953,6 +4964,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SuppressWarnings("HiddenAbstractMethod")
@SystemApi
@RequiresPermission(anyOf = {
@@ -4976,6 +4988,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SuppressWarnings("HiddenAbstractMethod")
@SystemApi
@RequiresPermission(anyOf = {
@@ -5040,6 +5053,7 @@ public abstract class PackageManager {
*
* @throws SecurityException if you try to access a whitelist that you have no access to.
*/
+ //@Deprecated
@RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
conditional = true)
public @NonNull Set<String> getWhitelistedRestrictedPermissions(
@@ -5106,6 +5120,7 @@ public abstract class PackageManager {
*
* @throws SecurityException if you try to modify a whitelist that you have no access to.
*/
+ //@Deprecated
@RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
conditional = true)
public boolean addWhitelistedRestrictedPermission(@NonNull String packageName,
@@ -5175,6 +5190,7 @@ public abstract class PackageManager {
*
* @throws SecurityException if you try to modify a whitelist that you have no access to.
*/
+ //@Deprecated
@RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
conditional = true)
public boolean removeWhitelistedRestrictedPermission(@NonNull String packageName,
@@ -5207,6 +5223,7 @@ public abstract class PackageManager {
*
* @throws SecurityException if you you have no access to modify this.
*/
+ //@Deprecated
@RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS,
conditional = true)
public boolean setAutoRevokeWhitelisted(@NonNull String packageName, boolean whitelisted) {
@@ -5234,6 +5251,7 @@ public abstract class PackageManager {
*
* @throws SecurityException if you you have no access to this.
*/
+ //@Deprecated
@RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS,
conditional = true)
public boolean isAutoRevokeWhitelisted(@NonNull String packageName) {
@@ -5252,6 +5270,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SuppressWarnings("HiddenAbstractMethod")
@UnsupportedAppUsage
public abstract boolean shouldShowRequestPermissionRationale(@NonNull String permName);
@@ -7554,6 +7573,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SuppressWarnings("HiddenAbstractMethod")
@SystemApi
@RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
@@ -7567,6 +7587,7 @@ public abstract class PackageManager {
*
* @hide
*/
+ //@Deprecated
@SuppressWarnings("HiddenAbstractMethod")
@SystemApi
@RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index 4dfbd75a9d67..45f072adf801 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -53,7 +53,6 @@ import android.compat.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.content.pm.split.DefaultSplitAssetLoader;
import android.content.pm.split.SplitAssetDependencyLoader;
import android.content.pm.split.SplitAssetLoader;
@@ -74,6 +73,7 @@ import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.os.storage.StorageManager;
+import android.permission.PermissionManager;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -2394,17 +2394,13 @@ public class PackageParser {
Slog.i(TAG, newPermsMsg.toString());
}
- List<SplitPermissionInfoParcelable> splitPermissions;
-
- try {
- splitPermissions = ActivityThread.getPermissionManager().getSplitPermissions();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ final List<PermissionManager.SplitPermissionInfo> splitPermissions =
+ ActivityThread.currentApplication().getSystemService(PermissionManager.class)
+ .getSplitPermissions();
final int listSize = splitPermissions.size();
for (int is = 0; is < listSize; is++) {
- final SplitPermissionInfoParcelable spi = splitPermissions.get(is);
+ final PermissionManager.SplitPermissionInfo spi = splitPermissions.get(is);
if (pkg.applicationInfo.targetSdkVersion >= spi.getTargetSdk()
|| !pkg.requestedPermissions.contains(spi.getSplitPermission())) {
continue;
diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
index eae7d452ff74..561a9e31b4b0 100644
--- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -71,7 +71,6 @@ import android.content.pm.parsing.result.ParseInput;
import android.content.pm.parsing.result.ParseInput.DeferredError;
import android.content.pm.parsing.result.ParseResult;
import android.content.pm.parsing.result.ParseTypeImpl;
-import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.content.pm.split.DefaultSplitAssetLoader;
import android.content.pm.split.SplitAssetDependencyLoader;
import android.content.pm.split.SplitAssetLoader;
@@ -85,9 +84,9 @@ import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.FileUtils;
-import android.os.RemoteException;
import android.os.Trace;
import android.os.ext.SdkExtensions;
+import android.permission.PermissionManager;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -2664,17 +2663,13 @@ public class ParsingPackageUtils {
}
private static void convertSplitPermissions(ParsingPackage pkg) {
- List<SplitPermissionInfoParcelable> splitPermissions;
-
- try {
- splitPermissions = ActivityThread.getPermissionManager().getSplitPermissions();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ final List<PermissionManager.SplitPermissionInfo> splitPermissions =
+ ActivityThread.currentApplication().getSystemService(PermissionManager.class)
+ .getSplitPermissions();
final int listSize = splitPermissions.size();
for (int is = 0; is < listSize; is++) {
- final SplitPermissionInfoParcelable spi = splitPermissions.get(is);
+ final PermissionManager.SplitPermissionInfo spi = splitPermissions.get(is);
List<String> requestedPermissions = pkg.getRequestedPermissions();
if (pkg.getTargetSdkVersion() >= spi.getTargetSdk()
|| !requestedPermissions.contains(spi.getSplitPermission())) {
diff --git a/core/java/android/hardware/OWNERS b/core/java/android/hardware/OWNERS
index 47dbf2d960e3..3295042b0b35 100644
--- a/core/java/android/hardware/OWNERS
+++ b/core/java/android/hardware/OWNERS
@@ -1,2 +1,5 @@
# Camera
per-file *Camera*=cychen@google.com,epeev@google.com,etalvala@google.com,shuzhenwang@google.com,yinchiayeh@google.com,zhijunhe@google.com,jchowdhary@google.com
+
+# Sensor Privacy
+per-file *SensorPrivacy* = file:platform/frameworks/native:/libs/sensorprivacy/OWNERS
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index 7afba1a214b8..41cc12f3b2e3 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -2856,10 +2856,10 @@ public abstract class CameraMetadata<TKey> {
* respective color channel provided in
* {@link CaptureRequest#SENSOR_TEST_PATTERN_DATA android.sensor.testPatternData}.</p>
* <p>For example:</p>
- * <pre><code>android.testPatternData = [0, 0xFFFFFFFF, 0xFFFFFFFF, 0]
+ * <pre><code>android.control.testPatternData = [0, 0xFFFFFFFF, 0xFFFFFFFF, 0]
* </code></pre>
* <p>All green pixels are 100% green. All red/blue pixels are black.</p>
- * <pre><code>android.testPatternData = [0xFFFFFFFF, 0, 0xFFFFFFFF, 0]
+ * <pre><code>android.control.testPatternData = [0xFFFFFFFF, 0, 0xFFFFFFFF, 0]
* </code></pre>
* <p>All red pixels are 100% red. Only the odd green pixels
* are 100% green. All blue pixels are 100% black.</p>
diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java
index e4b311a64c31..625a6a53d9ce 100644
--- a/core/java/android/hardware/hdmi/HdmiPortInfo.java
+++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java
@@ -192,6 +192,7 @@ public final class HdmiPortInfo implements Parcelable {
@Override
public int hashCode() {
- return mId;
+ return java.util.Objects.hash(
+ mId, mType, mAddress, mCecSupported, mArcSupported, mMhlSupported);
}
}
diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java
index 0676ad4e2322..6780167fa63e 100644
--- a/core/java/android/net/NetworkAgent.java
+++ b/core/java/android/net/NetworkAgent.java
@@ -51,7 +51,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* An agent manages the life cycle of a network. A network starts its
* life cycle when {@link register} is called on NetworkAgent. The network
* is then connecting. When full L3 connectivity has been established,
- * the agent shoud call {@link markConnected} to inform the system that
+ * the agent should call {@link markConnected} to inform the system that
* this network is ready to use. When the network disconnects its life
* ends and the agent should call {@link unregister}, at which point the
* system will clean up and free resources.
@@ -94,12 +94,6 @@ public abstract class NetworkAgent {
@Nullable
private volatile Network mNetwork;
- // Whether this NetworkAgent is using the legacy (never unhidden) API. The difference is
- // that the legacy API uses NetworkInfo to convey the state, while the current API is
- // exposing methods to manage it and generate it internally instead.
- // TODO : remove this as soon as all agents have been converted.
- private final boolean mIsLegacy;
-
private final Handler mHandler;
private volatile AsyncChannel mAsyncChannel;
private final String LOG_TAG;
@@ -110,8 +104,6 @@ public abstract class NetworkAgent {
private static final long BW_REFRESH_MIN_WIN_MS = 500;
private boolean mBandwidthUpdateScheduled = false;
private AtomicBoolean mBandwidthUpdatePending = new AtomicBoolean(false);
- // Not used by legacy agents. Non-legacy agents use this to convert the NetworkAgent system API
- // into the internal API of ConnectivityService.
@NonNull
private NetworkInfo mNetworkInfo;
@NonNull
@@ -337,35 +329,6 @@ public abstract class NetworkAgent {
*/
public static final int CMD_REMOVE_KEEPALIVE_PACKET_FILTER = BASE + 17;
- /** @hide TODO: remove and replace usage with the public constructor. */
- public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
- NetworkCapabilities nc, LinkProperties lp, int score) {
- this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE);
- // Register done by the constructor called in the previous line
- }
-
- /** @hide TODO: remove and replace usage with the public constructor. */
- public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
- NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config) {
- this(looper, context, logTag, ni, nc, lp, score, config, NetworkProvider.ID_NONE);
- // Register done by the constructor called in the previous line
- }
-
- /** @hide TODO: remove and replace usage with the public constructor. */
- public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
- NetworkCapabilities nc, LinkProperties lp, int score, int providerId) {
- this(looper, context, logTag, ni, nc, lp, score, null, providerId);
- // Register done by the constructor called in the previous line
- }
-
- /** @hide TODO: remove and replace usage with the public constructor. */
- public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni,
- NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config,
- int providerId) {
- this(looper, context, logTag, nc, lp, score, config, providerId, ni, true /* legacy */);
- register();
- }
-
private static NetworkInfo getLegacyNetworkInfo(final NetworkAgentConfig config) {
// The subtype can be changed with (TODO) setLegacySubtype, but it starts
// with 0 (TelephonyManager.NETWORK_TYPE_UNKNOWN) and an empty description.
@@ -393,7 +356,7 @@ public abstract class NetworkAgent {
@NonNull NetworkAgentConfig config, @Nullable NetworkProvider provider) {
this(looper, context, logTag, nc, lp, score, config,
provider == null ? NetworkProvider.ID_NONE : provider.getProviderId(),
- getLegacyNetworkInfo(config), false /* legacy */);
+ getLegacyNetworkInfo(config));
}
private static class InitialConfiguration {
@@ -418,11 +381,9 @@ public abstract class NetworkAgent {
private NetworkAgent(@NonNull Looper looper, @NonNull Context context, @NonNull String logTag,
@NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, int score,
- @NonNull NetworkAgentConfig config, int providerId, @NonNull NetworkInfo ni,
- boolean legacy) {
+ @NonNull NetworkAgentConfig config, int providerId, @NonNull NetworkInfo ni) {
mHandler = new NetworkAgentHandler(looper);
LOG_TAG = logTag;
- mIsLegacy = legacy;
mNetworkInfo = new NetworkInfo(ni);
this.providerId = providerId;
if (ni == null || nc == null || lp == null) {
@@ -696,11 +657,6 @@ public abstract class NetworkAgent {
* Call {@link #unregister} to disconnect.
*/
public void markConnected() {
- if (mIsLegacy) {
- throw new UnsupportedOperationException(
- "Legacy agents can't call markConnected.");
- }
- // |reason| cannot be used by the non-legacy agents
mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null /* reason */,
mNetworkInfo.getExtraInfo());
queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);
@@ -713,9 +669,6 @@ public abstract class NetworkAgent {
* the network is torn down and this agent can no longer be used.
*/
public void unregister() {
- if (mIsLegacy) {
- throw new UnsupportedOperationException("Legacy agents can't call unregister.");
- }
// When unregistering an agent nobody should use the extrainfo (or reason) any more.
mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null /* reason */,
null /* extraInfo */);
@@ -735,9 +688,6 @@ public abstract class NetworkAgent {
*/
@Deprecated
public void setLegacySubtype(final int legacySubtype, @NonNull final String legacySubtypeName) {
- if (mIsLegacy) {
- throw new UnsupportedOperationException("Legacy agents can't call setLegacySubtype.");
- }
mNetworkInfo.setSubtype(legacySubtype, legacySubtypeName);
queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);
}
@@ -760,9 +710,6 @@ public abstract class NetworkAgent {
*/
@Deprecated
public void setLegacyExtraInfo(@Nullable final String extraInfo) {
- if (mIsLegacy) {
- throw new UnsupportedOperationException("Legacy agents can't call setLegacyExtraInfo.");
- }
mNetworkInfo.setExtraInfo(extraInfo);
queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo);
}
@@ -773,9 +720,6 @@ public abstract class NetworkAgent {
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public final void sendNetworkInfo(NetworkInfo networkInfo) {
- if (!mIsLegacy) {
- throw new UnsupportedOperationException("Only legacy agents can call sendNetworkInfo.");
- }
queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo));
}
diff --git a/core/java/android/net/OWNERS b/core/java/android/net/OWNERS
index 5e2a71876103..4ea8a54828b3 100644
--- a/core/java/android/net/OWNERS
+++ b/core/java/android/net/OWNERS
@@ -1,11 +1,5 @@
set noparent
-codewiz@google.com
-jchalard@google.com
-jsharkey@android.com
-junyulai@google.com
-lorenzo@google.com
-reminv@google.com
-satk@google.com
+include platform/frameworks/base:/services/core/java/com/android/server/net/OWNERS
per-file SSL*, Uri*, Url* = prb@google.com, dauletz@google.com, narayan@google.com, ngeoffray@google.com
diff --git a/core/java/android/net/TcpRepairWindow.java b/core/java/android/net/TcpRepairWindow.java
index 86034f0a76ed..f062fa9034ea 100644
--- a/core/java/android/net/TcpRepairWindow.java
+++ b/core/java/android/net/TcpRepairWindow.java
@@ -16,12 +16,15 @@
package android.net;
+import android.annotation.SystemApi;
+
/**
* Corresponds to C's {@code struct tcp_repair_window} from
* include/uapi/linux/tcp.h
*
* @hide
*/
+@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public final class TcpRepairWindow {
public final int sndWl1;
public final int sndWnd;
diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS
index a0bcf990fba1..3b334a719011 100644
--- a/core/java/android/os/OWNERS
+++ b/core/java/android/os/OWNERS
@@ -25,4 +25,7 @@ per-file PowerComponents.java = file:/BATTERY_STATS_OWNERS
per-file GraphicsEnvironment.java = chrisforbes@google.com, cnorthrop@google.com, lpy@google.com, timvp@google.com, zzyiwei@google.com
+per-file *Network* = file:/services/core/java/com/android/server/net/OWNERS
+per-file *Power* = file:/services/core/java/com/android/server/power/OWNERS
+per-file *Telephony* = file:/telephony/OWNERS
per-file *Zygote* = file:/ZYGOTE_OWNERS
diff --git a/core/java/android/os/RemoteException.java b/core/java/android/os/RemoteException.java
index 98c66d1beaf4..e9fc2f38072b 100644
--- a/core/java/android/os/RemoteException.java
+++ b/core/java/android/os/RemoteException.java
@@ -37,6 +37,11 @@ public class RemoteException extends AndroidException {
super(message, cause, enableSuppression, writableStackTrace);
}
+ /** @hide */
+ public RemoteException(Throwable cause) {
+ this(cause.getMessage(), cause, true, false);
+ }
+
/**
* Rethrow this as an unchecked runtime exception.
* <p>
diff --git a/core/java/android/permission/ILegacyPermissionManager.aidl b/core/java/android/permission/ILegacyPermissionManager.aidl
new file mode 100644
index 000000000000..3bd4bf549df0
--- /dev/null
+++ b/core/java/android/permission/ILegacyPermissionManager.aidl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.permission;
+
+import android.content.pm.ParceledListSlice;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.content.pm.permission.SplitPermissionInfoParcelable;
+import android.os.UserHandle;
+import android.permission.IOnPermissionsChangeListener;
+
+/**
+ * Interface to communicate directly with the legacy permission manager service.
+ *
+ * @see PermissionManager
+ * @hide
+ */
+interface ILegacyPermissionManager {
+ int checkDeviceIdentifierAccess(String packageName, String callingFeatureId, String message, int pid, int uid);
+
+ void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId);
+
+ void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId);
+
+ void grantDefaultPermissionsToEnabledTelephonyDataServices(
+ in String[] packageNames, int userId);
+
+ void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
+ in String[] packageNames, int userId);
+
+ void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId);
+
+ void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId);
+}
diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl
index a94077dd7ad6..4ad17ef58945 100644
--- a/core/java/android/permission/IPermissionManager.aidl
+++ b/core/java/android/permission/IPermissionManager.aidl
@@ -52,8 +52,6 @@ interface IPermissionManager {
int checkUidPermission(String permName, int uid);
- int checkDeviceIdentifierAccess(String packageName, String callingFeatureId, String message, int pid, int uid);
-
void addOnPermissionsChangeListener(in IOnPermissionsChangeListener listener);
void removeOnPermissionsChangeListener(in IOnPermissionsChangeListener listener);
@@ -73,20 +71,6 @@ interface IPermissionManager {
void resetRuntimePermissions();
- void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId);
-
- void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId);
-
- void grantDefaultPermissionsToEnabledTelephonyDataServices(
- in String[] packageNames, int userId);
-
- void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
- in String[] packageNames, int userId);
-
- void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId);
-
- void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId);
-
boolean shouldShowRequestPermissionRationale(String permName,
String packageName, int userId);
diff --git a/core/java/android/permission/LegacyPermissionManager.java b/core/java/android/permission/LegacyPermissionManager.java
new file mode 100644
index 000000000000..b66dd82965d3
--- /dev/null
+++ b/core/java/android/permission/LegacyPermissionManager.java
@@ -0,0 +1,217 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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.permission;
+
+import android.Manifest;
+import android.annotation.CallbackExecutor;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+/**
+ * System level service for accessing the permission capabilities of the platform, version 2.
+ *
+ * @hide
+ */
+//@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+@SystemService(Context.LEGACY_PERMISSION_SERVICE)
+public final class LegacyPermissionManager {
+ private final ILegacyPermissionManager mLegacyPermissionManager;
+
+ /**
+ * Creates a new instance.
+ *
+ * @hide
+ */
+ public LegacyPermissionManager() throws ServiceManager.ServiceNotFoundException {
+ this(ILegacyPermissionManager.Stub.asInterface(ServiceManager.getServiceOrThrow(
+ "legacy_permission")));
+ }
+
+ /**
+ * Creates a new instance with the provided instantiation of the ILegacyPermissionManager.
+ *
+ * @param legacyPermissionManager injectable legacy permission manager service
+ *
+ * @hide
+ */
+ @VisibleForTesting
+ public LegacyPermissionManager(@NonNull ILegacyPermissionManager legacyPermissionManager) {
+ mLegacyPermissionManager = legacyPermissionManager;
+ }
+
+ /**
+ * Checks whether the package with the given pid/uid can read device identifiers.
+ *
+ * @param packageName the name of the package to be checked for identifier access
+ * @param message the message to be used for logging during identifier access
+ * verification
+ * @param callingFeatureId the feature in the package
+ * @param pid the process id of the package to be checked
+ * @param uid the uid of the package to be checked
+ * @return {@link PackageManager#PERMISSION_GRANTED} if the package is allowed identifier
+ * access, {@link PackageManager#PERMISSION_DENIED} otherwise
+ * @hide
+ */
+ //@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message,
+ @Nullable String callingFeatureId, int pid, int uid) {
+ try {
+ return mLegacyPermissionManager.checkDeviceIdentifierAccess(packageName, message,
+ callingFeatureId, pid, uid);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Grant default permissions to currently active LUI app
+ * @param packageName The package name for the LUI app
+ * @param user The user handle
+ * @param executor The executor for the callback
+ * @param callback The callback provided by caller to be notified when grant completes
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
+ public void grantDefaultPermissionsToLuiApp(
+ @NonNull String packageName, @NonNull UserHandle user,
+ @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ try {
+ mLegacyPermissionManager.grantDefaultPermissionsToActiveLuiApp(
+ packageName, user.getIdentifier());
+ executor.execute(() -> callback.accept(true));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Revoke default permissions to currently active LUI app
+ * @param packageNames The package names for the LUI apps
+ * @param user The user handle
+ * @param executor The executor for the callback
+ * @param callback The callback provided by caller to be notified when grant completes
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
+ public void revokeDefaultPermissionsFromLuiApps(
+ @NonNull String[] packageNames, @NonNull UserHandle user,
+ @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ try {
+ mLegacyPermissionManager.revokeDefaultPermissionsFromLuiApps(
+ packageNames, user.getIdentifier());
+ executor.execute(() -> callback.accept(true));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Grant default permissions to currently active Ims services
+ * @param packageNames The package names for the Ims services
+ * @param user The user handle
+ * @param executor The executor for the callback
+ * @param callback The callback provided by caller to be notified when grant completes
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
+ public void grantDefaultPermissionsToEnabledImsServices(
+ @NonNull String[] packageNames, @NonNull UserHandle user,
+ @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ try {
+ mLegacyPermissionManager.grantDefaultPermissionsToEnabledImsServices(
+ packageNames, user.getIdentifier());
+ executor.execute(() -> callback.accept(true));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Grant default permissions to currently enabled telephony data services
+ * @param packageNames The package name for the services
+ * @param user The user handle
+ * @param executor The executor for the callback
+ * @param callback The callback provided by caller to be notified when grant completes
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
+ public void grantDefaultPermissionsToEnabledTelephonyDataServices(
+ @NonNull String[] packageNames, @NonNull UserHandle user,
+ @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ try {
+ mLegacyPermissionManager.grantDefaultPermissionsToEnabledTelephonyDataServices(
+ packageNames, user.getIdentifier());
+ executor.execute(() -> callback.accept(true));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Revoke default permissions to currently active telephony data services
+ * @param packageNames The package name for the services
+ * @param user The user handle
+ * @param executor The executor for the callback
+ * @param callback The callback provided by caller to be notified when revoke completes
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
+ public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
+ @NonNull String[] packageNames, @NonNull UserHandle user,
+ @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ try {
+ mLegacyPermissionManager.revokeDefaultPermissionsFromDisabledTelephonyDataServices(
+ packageNames, user.getIdentifier());
+ executor.execute(() -> callback.accept(true));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Grant default permissions to currently enabled carrier apps
+ * @param packageNames Package names of the apps to be granted permissions
+ * @param user The user handle
+ * @param executor The executor for the callback
+ * @param callback The callback provided by caller to be notified when grant completes
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
+ public void grantDefaultPermissionsToEnabledCarrierApps(@NonNull String[] packageNames,
+ @NonNull UserHandle user, @NonNull @CallbackExecutor Executor executor,
+ @NonNull Consumer<Boolean> callback) {
+ try {
+ mLegacyPermissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames,
+ user.getIdentifier());
+ executor.execute(() -> callback.accept(true));
+ } catch (RemoteException e) {
+ e.rethrowFromSystemServer();
+ }
+ }
+}
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java
index e4220dd00a5b..d31e0129fb27 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -19,7 +19,7 @@ package android.permission;
import static android.os.Build.VERSION_CODES.S;
import android.Manifest;
-import android.annotation.CallbackExecutor;
+import android.annotation.CheckResult;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -29,6 +29,7 @@ import android.annotation.SystemService;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.ActivityThread;
+import android.app.AppGlobals;
import android.app.IActivityManager;
import android.app.PropertyInvalidatedCache;
import android.compat.annotation.ChangeId;
@@ -36,15 +37,25 @@ import android.compat.annotation.EnabledAfter;
import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
import android.content.pm.permission.SplitPermissionInfoParcelable;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.DebugUtils;
+import android.util.Log;
import android.util.Slog;
import com.android.internal.annotations.Immutable;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.CollectionUtils;
import java.util.ArrayList;
@@ -52,8 +63,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.Executor;
-import java.util.function.Consumer;
/**
* System level service for accessing the permission capabilities of the platform.
@@ -63,7 +72,7 @@ import java.util.function.Consumer;
@SystemApi
@SystemService(Context.PERMISSION_SERVICE)
public final class PermissionManager {
- private static final String TAG = PermissionManager.class.getName();
+ private static final String LOG_TAG = PermissionManager.class.getName();
/** @hide */
public static final String KILL_APP_REASON_PERMISSIONS_REVOKED =
@@ -83,244 +92,765 @@ public final class PermissionManager {
@EnabledAfter(targetSdkVersion = S)
public static final long CANNOT_INSTALL_WITH_BAD_PERMISSION_GROUPS = 146211400;
+ /**
+ * Note: Changing this won't do anything on its own - you should also change the filtering in
+ * {@link #shouldTraceGrant}.
+ *
+ * @hide
+ */
+ public static final boolean DEBUG_TRACE_GRANTS = false;
+ /**
+ * @hide
+ */
+ public static final boolean DEBUG_TRACE_PERMISSION_UPDATES = false;
+
private final @NonNull Context mContext;
private final IPackageManager mPackageManager;
private final IPermissionManager mPermissionManager;
+ private final LegacyPermissionManager mLegacyPermissionManager;
+
+ private final ArrayMap<PackageManager.OnPermissionsChangedListener,
+ IOnPermissionsChangeListener> mPermissionListeners = new ArrayMap<>();
+
private List<SplitPermissionInfo> mSplitPermissionInfos;
/**
* Creates a new instance.
*
- * @param context The current context in which to operate.
+ * @param context The current context in which to operate
+ *
* @hide
*/
- public PermissionManager(@NonNull Context context, IPackageManager packageManager)
+ public PermissionManager(@NonNull Context context)
throws ServiceManager.ServiceNotFoundException {
- this(context, packageManager, IPermissionManager.Stub.asInterface(
- ServiceManager.getServiceOrThrow("permissionmgr")));
+ mContext = context;
+ mPackageManager = AppGlobals.getPackageManager();
+ mPermissionManager = IPermissionManager.Stub.asInterface(ServiceManager.getServiceOrThrow(
+ "permissionmgr"));
+ mLegacyPermissionManager = context.getSystemService(LegacyPermissionManager.class);
+ }
+
+ /**
+ * Retrieve all of the information we know about a particular permission.
+ *
+ * @param permissionName the fully qualified name (e.g. com.android.permission.LOGIN) of the
+ * permission you are interested in
+ * @param flags additional option flags to modify the data returned
+ * @return a {@link PermissionInfo} containing information about the permission, or {@code null}
+ * if not found
+ *
+ * @hide Pending API
+ */
+ @Nullable
+ public PermissionInfo getPermissionInfo(@NonNull String permissionName,
+ @PackageManager.PermissionInfoFlags int flags) {
+ try {
+ final String packageName = mContext.getOpPackageName();
+ return mPermissionManager.getPermissionInfo(permissionName, packageName, flags);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Query for all of the permissions associated with a particular group.
+ *
+ * @param groupName the fully qualified name (e.g. com.android.permission.LOGIN) of the
+ * permission group you are interested in. Use {@code null} to find all of the
+ * permissions not associated with a group
+ * @param flags additional option flags to modify the data returned
+ * @return a list of {@link PermissionInfo} containing information about all of the permissions
+ * in the given group, or {@code null} if the group is not found
+ *
+ * @hide Pending API
+ */
+ @Nullable
+ public List<PermissionInfo> queryPermissionsByGroup(@NonNull String groupName,
+ @PackageManager.PermissionInfoFlags int flags) {
+ try {
+ final ParceledListSlice<PermissionInfo> parceledList =
+ mPermissionManager.queryPermissionsByGroup(groupName, flags);
+ if (parceledList == null) {
+ return null;
+ }
+ return parceledList.getList();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Add a new dynamic permission to the system. For this to work, your package must have defined
+ * a permission tree through the
+ * {@link android.R.styleable#AndroidManifestPermissionTree &lt;permission-tree&gt;} tag in its
+ * manifest. A package can only add permissions to trees that were defined by either its own
+ * package or another with the same user id; a permission is in a tree if it matches the name of
+ * the permission tree + ".": for example, "com.foo.bar" is a member of the permission tree
+ * "com.foo".
+ * <p>
+ * It is good to make your permission tree name descriptive, because you are taking possession
+ * of that entire set of permission names. Thus, it must be under a domain you control, with a
+ * suffix that will not match any normal permissions that may be declared in any applications
+ * that are part of that domain.
+ * <p>
+ * New permissions must be added before any .apks are installed that use those permissions.
+ * Permissions you add through this method are remembered across reboots of the device. If the
+ * given permission already exists, the info you supply here will be used to update it.
+ *
+ * @param permissionInfo description of the permission to be added
+ * @param async whether the persistence of the permission should be asynchronous, allowing it to
+ * return quicker and batch a series of adds, at the expense of no guarantee the
+ * added permission will be retained if the device is rebooted before it is
+ * written.
+ * @return {@code true} if a new permission was created, {@code false} if an existing one was
+ * updated
+ * @throws SecurityException if you are not allowed to add the given permission name
+ *
+ * @see #removePermission(String)
+ *
+ * @hide Pending API
+ */
+ public boolean addPermission(@NonNull PermissionInfo permissionInfo, boolean async) {
+ try {
+ return mPermissionManager.addPermission(permissionInfo, async);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Removes a permission that was previously added with
+ * {@link #addPermission(PermissionInfo, boolean)}. The same ownership rules apply -- you are
+ * only allowed to remove permissions that you are allowed to add.
+ *
+ * @param permissionName the name of the permission to remove
+ * @throws SecurityException if you are not allowed to remove the given permission name
+ *
+ * @see #addPermission(PermissionInfo, boolean)
+ *
+ * @hide Pending API
+ */
+ public void removePermission(@NonNull String permissionName) {
+ try {
+ mPermissionManager.removePermission(permissionName);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Retrieve all of the information we know about a particular group of permissions.
+ *
+ * @param groupName the fully qualified name (e.g. com.android.permission_group.APPS) of the
+ * permission you are interested in
+ * @param flags additional option flags to modify the data returned
+ * @return a {@link PermissionGroupInfo} containing information about the permission, or
+ * {@code null} if not found
+ *
+ * @hide Pending API
+ */
+ @Nullable
+ public PermissionGroupInfo getPermissionGroupInfo(@NonNull String groupName,
+ @PackageManager.PermissionGroupInfoFlags int flags) {
+ try {
+ return mPermissionManager.getPermissionGroupInfo(groupName, flags);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Retrieve all of the known permission groups in the system.
+ *
+ * @param flags additional option flags to modify the data returned
+ * @return a list of {@link PermissionGroupInfo} containing information about all of the known
+ * permission groups
+ *
+ * @hide Pending API
+ */
+ @NonNull
+ public List<PermissionGroupInfo> getAllPermissionGroups(
+ @PackageManager.PermissionGroupInfoFlags int flags) {
+ try {
+ final ParceledListSlice<PermissionGroupInfo> parceledList =
+ mPermissionManager.getAllPermissionGroups(flags);
+ if (parceledList == null) {
+ return Collections.emptyList();
+ }
+ return parceledList.getList();
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Checks whether a particular permissions has been revoked for a package by policy. Typically
+ * the device owner or the profile owner may apply such a policy. The user cannot grant policy
+ * revoked permissions, hence the only way for an app to get such a permission is by a policy
+ * change.
+ *
+ * @param packageName the name of the package you are checking against
+ * @param permissionName the name of the permission you are checking for
+ *
+ * @return whether the permission is restricted by policy
+ *
+ * @hide Pending API
+ */
+ @CheckResult
+ public boolean isPermissionRevokedByPolicy(@NonNull String packageName,
+ @NonNull String permissionName) {
+ try {
+ return mPermissionManager.isPermissionRevokedByPolicy(permissionName, packageName,
+ mContext.getUserId());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** @hide */
+ public static boolean shouldTraceGrant(String packageName, String permissionName, int userId) {
+ // To be modified when debugging
+ return false;
}
/**
- * Creates a new instance with the provided instantiation of the IPermissionManager.
+ * Grant a runtime permission to an application which the application does not already have. The
+ * permission must have been requested by the application. If the application is not allowed to
+ * hold the permission, a {@link java.lang.SecurityException} is thrown. If the package or
+ * permission is invalid, a {@link java.lang.IllegalArgumentException} is thrown.
+ * <p>
+ * <strong>Note: </strong>Using this API requires holding
+ * {@code android.permission.GRANT_RUNTIME_PERMISSIONS} and if the user ID is not the current
+ * user {@code android.permission.INTERACT_ACROSS_USERS_FULL}.
+ *
+ * @param packageName the package to which to grant the permission
+ * @param permissionName the permission name to grant
+ * @param user the user for which to grant the permission
+ *
+ * @see #revokeRuntimePermission(String, String, android.os.UserHandle)
*
- * @param context the current context in which to operate
- * @param packageManager package manager service to be used for package related permission
- * requests
- * @param permissionManager injectable permission manager service
* @hide
*/
- @VisibleForTesting
- public PermissionManager(@NonNull Context context, IPackageManager packageManager,
- IPermissionManager permissionManager) {
- mContext = context;
- mPackageManager = packageManager;
- mPermissionManager = permissionManager;
+ @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS)
+ //@SystemApi
+ public void grantRuntimePermission(@NonNull String packageName,
+ @NonNull String permissionName, @NonNull UserHandle user) {
+ if (DEBUG_TRACE_GRANTS
+ && shouldTraceGrant(packageName, permissionName, user.getIdentifier())) {
+ Log.i(LOG_TAG, "App " + mContext.getPackageName() + " is granting " + packageName + " "
+ + permissionName + " for user " + user.getIdentifier(), new RuntimeException());
+ }
+ try {
+ mPermissionManager.grantRuntimePermission(packageName, permissionName,
+ user.getIdentifier());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
/**
- * Gets the version of the runtime permission database.
+ * Revoke a runtime permission that was previously granted by
+ * {@link #grantRuntimePermission(String, String, android.os.UserHandle)}. The permission must
+ * have been requested by and granted to the application. If the application is not allowed to
+ * hold the permission, a {@link java.lang.SecurityException} is thrown. If the package or
+ * permission is invalid, a {@link java.lang.IllegalArgumentException} is thrown.
+ * <p>
+ * <strong>Note: </strong>Using this API requires holding
+ * {@code android.permission.REVOKE_RUNTIME_PERMISSIONS} and if the user ID is not the current
+ * user {@code android.permission.INTERACT_ACROSS_USERS_FULL}.
*
- * @return The database version, -1 when this is an upgrade from pre-Q, 0 when this is a fresh
- * install.
+ * @param packageName the package from which to revoke the permission
+ * @param permName the permission name to revoke
+ * @param user the user for which to revoke the permission
+ * @param reason the reason for the revoke, or {@code null} for unspecified
+ *
+ * @see #grantRuntimePermission(String, String, android.os.UserHandle)
*
* @hide
*/
- @SystemApi
+ @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)
+ //@SystemApi
+ public void revokeRuntimePermission(@NonNull String packageName,
+ @NonNull String permName, @NonNull UserHandle user, @Nullable String reason) {
+ if (DEBUG_TRACE_PERMISSION_UPDATES
+ && shouldTraceGrant(packageName, permName, user.getIdentifier())) {
+ Log.i(LOG_TAG, "App " + mContext.getPackageName() + " is revoking " + packageName + " "
+ + permName + " for user " + user.getIdentifier() + " with reason "
+ + reason, new RuntimeException());
+ }
+ try {
+ mPermissionManager
+ .revokeRuntimePermission(packageName, permName, user.getIdentifier(), reason);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Gets the state flags associated with a permission.
+ *
+ * @param packageName the package name for which to get the flags
+ * @param permissionName the permission for which to get the flags
+ * @param user the user for which to get permission flags
+ * @return the permission flags
+ *
+ * @hide
+ */
+ @PackageManager.PermissionFlags
@RequiresPermission(anyOf = {
- Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY,
- Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS
+ android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
+ android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
+ android.Manifest.permission.GET_RUNTIME_PERMISSIONS
})
- public @IntRange(from = 0) int getRuntimePermissionsVersion() {
+ //@SystemApi
+ public int getPermissionFlags(@NonNull String packageName, @NonNull String permissionName,
+ @NonNull UserHandle user) {
try {
- return mPackageManager.getRuntimePermissionsVersion(mContext.getUserId());
+ return mPermissionManager.getPermissionFlags(permissionName, packageName,
+ user.getIdentifier());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Sets the version of the runtime permission database.
+ * Updates the flags associated with a permission by replacing the flags in the specified mask
+ * with the provided flag values.
*
- * @param version The new version.
+ * @param packageName The package name for which to update the flags
+ * @param permissionName The permission for which to update the flags
+ * @param flagMask The flags which to replace
+ * @param flagValues The flags with which to replace
+ * @param user The user for which to update the permission flags
*
* @hide
*/
- @SystemApi
@RequiresPermission(anyOf = {
- Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY,
- Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS
+ android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS,
+ android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS
})
- public void setRuntimePermissionsVersion(@IntRange(from = 0) int version) {
+ //@SystemApi
+ public void updatePermissionFlags(@NonNull String packageName, @NonNull String permissionName,
+ @PackageManager.PermissionFlags int flagMask,
+ @PackageManager.PermissionFlags int flagValues, @NonNull UserHandle user) {
+ if (DEBUG_TRACE_PERMISSION_UPDATES && shouldTraceGrant(packageName, permissionName,
+ user.getIdentifier())) {
+ Log.i(LOG_TAG, "App " + mContext.getPackageName() + " is updating flags for "
+ + packageName + " " + permissionName + " for user "
+ + user.getIdentifier() + ": " + DebugUtils.flagsToString(
+ PackageManager.class, "FLAG_PERMISSION_", flagMask) + " := "
+ + DebugUtils.flagsToString(PackageManager.class, "FLAG_PERMISSION_",
+ flagValues), new RuntimeException());
+ }
try {
- mPackageManager.setRuntimePermissionsVersion(version, mContext.getUserId());
+ final boolean checkAdjustPolicyFlagPermission =
+ mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q;
+ mPermissionManager.updatePermissionFlags(permissionName, packageName, flagMask,
+ flagValues, checkAdjustPolicyFlagPermission, user.getIdentifier());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
- * Get set of permissions that have been split into more granular or dependent permissions.
+ * Gets the restricted permissions that have been allowlisted and the app is allowed to have
+ * them granted in their full form.
+ * <p>
+ * Permissions can be hard restricted which means that the app cannot hold them or soft
+ * restricted where the app can hold the permission but in a weaker form. Whether a permission
+ * is {@link PermissionInfo#FLAG_HARD_RESTRICTED hard restricted} or
+ * {@link PermissionInfo#FLAG_SOFT_RESTRICTED soft restricted} depends on the permission
+ * declaration. Allowlisting a hard restricted permission allows for the to hold that permission
+ * and allowlisting a soft restricted permission allows the app to hold the permission in its
+ * full, unrestricted form.
+ * <p>
+ * There are four allowlists:
+ * <ol>
+ * <li>
+ * One for cases where the system permission policy allowlists a permission. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM} flag. Can only be
+ * accessed by pre-installed holders of a dedicated permission.
+ * <li>
+ * One for cases where the system allowlists the permission when upgrading from an OS version in
+ * which the permission was not restricted to an OS version in which the permission is
+ * restricted. This list corresponds to the
+ * {@link PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE} flag. Can be accessed by
+ * pre-installed holders of a dedicated permission or the installer on record.
+ * <li>
+ * One for cases where the installer of the package allowlists a permission. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER} flag. Can be
+ * accessed by pre-installed holders of a dedicated permission or the installer on record.
+ * <li>
+ * One for cases where the system exempts the permission when granting a role. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE} flag. Can be
+ * accessed by pre-installed holders of a dedicated permission.
+ * </ol>
*
- * <p>E.g. before {@link android.os.Build.VERSION_CODES#Q} an app that was granted
- * {@link Manifest.permission#ACCESS_COARSE_LOCATION} could access the location while it was in
- * foreground and background. On platforms after {@link android.os.Build.VERSION_CODES#Q}
- * the location permission only grants location access while the app is in foreground. This
- * would break apps that target before {@link android.os.Build.VERSION_CODES#Q}. Hence whenever
- * such an old app asks for a location permission (i.e. the
- * {@link SplitPermissionInfo#getSplitPermission()}), then the
- * {@link Manifest.permission#ACCESS_BACKGROUND_LOCATION} permission (inside
- * {@link SplitPermissionInfo#getNewPermissions}) is added.
+ * @param packageName the app for which to get allowlisted permissions
+ * @param allowlistFlag the flag to determine which allowlist to query. Only one flag can be
+ * passed.
+ * @return the allowlisted permissions that are on any of the allowlists you query for
+ * @throws SecurityException if you try to access a allowlist that you have no access to
*
- * <p>Note: Regular apps do not have to worry about this. The platform and permission controller
- * automatically add the new permissions where needed.
+ * @see #addAllowlistedRestrictedPermission(String, String, int)
+ * @see #removeAllowlistedRestrictedPermission(String, String, int)
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER
+ * @see PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE
*
- * @return All permissions that are split.
+ * @hide Pending API
*/
- public @NonNull List<SplitPermissionInfo> getSplitPermissions() {
- if (mSplitPermissionInfos != null) {
- return mSplitPermissionInfos;
+ @NonNull
+ @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
+ conditional = true)
+ public Set<String> getAllowlistedRestrictedPermissions(@NonNull String packageName,
+ @PackageManager.PermissionWhitelistFlags int allowlistFlag) {
+ try {
+ final List<String> allowlist = mPermissionManager.getWhitelistedRestrictedPermissions(
+ packageName, allowlistFlag, mContext.getUserId());
+ if (allowlist == null) {
+ return Collections.emptySet();
+ }
+ return new ArraySet<>(allowlist);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
}
+ }
- List<SplitPermissionInfoParcelable> parcelableList;
+ /**
+ * Adds a allowlisted restricted permission for an app.
+ * <p>
+ * Permissions can be hard restricted which means that the app cannot hold them or soft
+ * restricted where the app can hold the permission but in a weaker form. Whether a permission
+ * is {@link PermissionInfo#FLAG_HARD_RESTRICTED hard restricted} or
+ * {@link PermissionInfo#FLAG_SOFT_RESTRICTED soft restricted} depends on the permission
+ * declaration. Allowlisting a hard restricted permission allows for the to hold that permission
+ * and allowlisting a soft restricted permission allows the app to hold the permission in its
+ * full, unrestricted form.
+ * <p>There are four allowlists:
+ * <ol>
+ * <li>
+ * One for cases where the system permission policy allowlists a permission. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM} flag. Can only be
+ * accessed by pre-installed holders of a dedicated permission.
+ * <li>
+ * One for cases where the system allowlists the permission when upgrading from an OS version in
+ * which the permission was not restricted to an OS version in which the permission is
+ * restricted. This list corresponds to the
+ * {@link PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE} flag. Can be accessed by
+ * pre-installed holders of a dedicated permission or the installer on record.
+ * <li>
+ * One for cases where the installer of the package allowlists a permission. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER} flag. Can be
+ * accessed by pre-installed holders of a dedicated permission or the installer on record.
+ * <li>
+ * One for cases where the system exempts the permission when granting a role. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE} flag. Can be
+ * accessed by pre-installed holders of a dedicated permission.
+ * </ol>
+ * <p>
+ * You need to specify the allowlists for which to set the allowlisted permissions which will
+ * clear the previous allowlisted permissions and replace them with the provided ones.
+ *
+ * @param packageName the app for which to get allowlisted permissions
+ * @param permissionName the allowlisted permission to add
+ * @param allowlistFlags the allowlists to which to add. Passing multiple flags updates all
+ * specified allowlists.
+ * @return whether the permission was added to the allowlist
+ * @throws SecurityException if you try to modify a allowlist that you have no access to.
+ *
+ * @see #getAllowlistedRestrictedPermissions(String, int)
+ * @see #removeAllowlistedRestrictedPermission(String, String, int)
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER
+ * @see PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE
+ *
+ * @hide Pending API
+ */
+ @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
+ conditional = true)
+ public boolean addAllowlistedRestrictedPermission(@NonNull String packageName,
+ @NonNull String permissionName,
+ @PackageManager.PermissionWhitelistFlags int allowlistFlags) {
try {
- parcelableList = ActivityThread.getPermissionManager().getSplitPermissions();
+ return mPermissionManager.addWhitelistedRestrictedPermission(packageName,
+ permissionName, allowlistFlags, mContext.getUserId());
} catch (RemoteException e) {
- Slog.e(TAG, "Error getting split permissions", e);
- return Collections.emptyList();
+ throw e.rethrowFromSystemServer();
}
+ }
- mSplitPermissionInfos = splitPermissionInfoListToNonParcelableList(parcelableList);
-
- return mSplitPermissionInfos;
+ /**
+ * Removes a allowlisted restricted permission for an app.
+ * <p>
+ * Permissions can be hard restricted which means that the app cannot hold them or soft
+ * restricted where the app can hold the permission but in a weaker form. Whether a permission
+ * is {@link PermissionInfo#FLAG_HARD_RESTRICTED hard restricted} or
+ * {@link PermissionInfo#FLAG_SOFT_RESTRICTED soft restricted} depends on the permission
+ * declaration. Allowlisting a hard restricted permission allows for the to hold that permission
+ * and allowlisting a soft restricted permission allows the app to hold the permission in its
+ * full, unrestricted form.
+ * <p>There are four allowlists:
+ * <ol>
+ * <li>
+ * One for cases where the system permission policy allowlists a permission. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM} flag. Can only be
+ * accessed by pre-installed holders of a dedicated permission.
+ * <li>
+ * One for cases where the system allowlists the permission when upgrading from an OS version in
+ * which the permission was not restricted to an OS version in which the permission is
+ * restricted. This list corresponds to the
+ * {@link PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE} flag. Can be accessed by
+ * pre-installed holders of a dedicated permission or the installer on record.
+ * <li>
+ * One for cases where the installer of the package allowlists a permission. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER} flag. Can be
+ * accessed by pre-installed holders of a dedicated permission or the installer on record.
+ * <li>
+ * One for cases where the system exempts the permission when granting a role. This list
+ * corresponds to the {@link PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE} flag. Can be
+ * accessed by pre-installed holders of a dedicated permission.
+ * </ol>
+ * <p>
+ * You need to specify the allowlists for which to set the allowlisted permissions which will
+ * clear the previous allowlisted permissions and replace them with the provided ones.
+ *
+ * @param packageName the app for which to get allowlisted permissions
+ * @param permissionName the allowlisted permission to remove
+ * @param allowlistFlags the allowlists from which to remove. Passing multiple flags updates all
+ * specified allowlists.
+ * @return whether the permission was removed from the allowlist
+ * @throws SecurityException if you try to modify a allowlist that you have no access to.
+ *
+ * @see #getAllowlistedRestrictedPermissions(String, int)
+ * @see #addAllowlistedRestrictedPermission(String, String, int)
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE
+ * @see PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER
+ * @see PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE
+ *
+ * @hide Pending API
+ */
+ @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS,
+ conditional = true)
+ public boolean removeAllowlistedRestrictedPermission(@NonNull String packageName,
+ @NonNull String permissionName,
+ @PackageManager.PermissionWhitelistFlags int allowlistFlags) {
+ try {
+ return mPermissionManager.removeWhitelistedRestrictedPermission(packageName,
+ permissionName, allowlistFlags, mContext.getUserId());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
}
/**
- * Grant default permissions to currently active LUI app
- * @param packageName The package name for the LUI app
- * @param user The user handle
- * @param executor The executor for the callback
- * @param callback The callback provided by caller to be notified when grant completes
- * @hide
+ * Checks whether an application is exempted from having its permissions be automatically
+ * revoked when the app is unused for an extended period of time.
+ * <p>
+ * Only the installer on record that installed the given package, or a holder of
+ * {@code WHITELIST_AUTO_REVOKE_PERMISSIONS} is allowed to call this.
+ *
+ * @param packageName the app for which to set exemption
+ * @return whether the app is exempted
+ * @throws SecurityException if you you have no access to this
+ *
+ * @see #setAutoRevokeExempted
+ *
+ * @hide Pending API
*/
- @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
- public void grantDefaultPermissionsToLuiApp(
- @NonNull String packageName, @NonNull UserHandle user,
- @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS,
+ conditional = true)
+ public boolean isAutoRevokeExempted(@NonNull String packageName) {
try {
- mPermissionManager.grantDefaultPermissionsToActiveLuiApp(
- packageName, user.getIdentifier());
- executor.execute(() -> callback.accept(true));
+ return mPermissionManager.isAutoRevokeWhitelisted(packageName, mContext.getUserId());
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ throw e.rethrowFromSystemServer();
}
}
/**
- * Revoke default permissions to currently active LUI app
- * @param packageNames The package names for the LUI apps
- * @param user The user handle
- * @param executor The executor for the callback
- * @param callback The callback provided by caller to be notified when grant completes
- * @hide
+ * Marks an application exempted from having its permissions be automatically revoked when the
+ * app is unused for an extended period of time.
+ * <p>
+ * Only the installer on record that installed the given package is allowed to call this.
+ * <p>
+ * Packages start in exempted state, and it is the installer's responsibility to un-exempt the
+ * packages it installs, unless auto-revoking permissions from that package would cause
+ * breakages beyond having to re-request the permission(s).
+ *
+ * @param packageName the app for which to set exemption
+ * @param exempted whether the app should be exempted
+ * @return whether any change took effect
+ * @throws SecurityException if you you have no access to modify this
+ *
+ * @see #isAutoRevokeExempted
+ *
+ * @hide Pending API
*/
- @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
- public void revokeDefaultPermissionsFromLuiApps(
- @NonNull String[] packageNames, @NonNull UserHandle user,
- @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS,
+ conditional = true)
+ public boolean setAutoRevokeExempted(@NonNull String packageName, boolean exempted) {
try {
- mPermissionManager.revokeDefaultPermissionsFromLuiApps(
- packageNames, user.getIdentifier());
- executor.execute(() -> callback.accept(true));
+ return mPermissionManager.setAutoRevokeWhitelisted(packageName, exempted,
+ mContext.getUserId());
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ throw e.rethrowFromSystemServer();
}
}
/**
- * Grant default permissions to currently active Ims services
- * @param packageNames The package names for the Ims services
- * @param user The user handle
- * @param executor The executor for the callback
- * @param callback The callback provided by caller to be notified when grant completes
+ * Get whether you should show UI with rationale for requesting a permission. You should do this
+ * only if you do not have the permission and the context in which the permission is requested
+ * does not clearly communicate to the user what would be the benefit from grating this
+ * permission.
+ *
+ * @param permissionName a permission your app wants to request
+ * @return whether you can show permission rationale UI
+ *
* @hide
*/
- @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
- public void grantDefaultPermissionsToEnabledImsServices(
- @NonNull String[] packageNames, @NonNull UserHandle user,
- @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ //@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public boolean shouldShowRequestPermissionRationale(@NonNull String permissionName) {
try {
- mPermissionManager.grantDefaultPermissionsToEnabledImsServices(
- packageNames, user.getIdentifier());
- executor.execute(() -> callback.accept(true));
+ final String packageName = mContext.getPackageName();
+ return mPermissionManager.shouldShowRequestPermissionRationale(permissionName,
+ packageName, mContext.getUserId());
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Add a listener for permission changes for installed packages.
+ *
+ * @param listener the listener to add
+ *
+ * @hide
+ */
+ //@SystemApi
+ @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
+ public void addOnPermissionsChangeListener(
+ @NonNull PackageManager.OnPermissionsChangedListener listener) {
+ synchronized (mPermissionListeners) {
+ if (mPermissionListeners.get(listener) != null) {
+ return;
+ }
+ final OnPermissionsChangeListenerDelegate delegate =
+ new OnPermissionsChangeListenerDelegate(listener, Looper.getMainLooper());
+ try {
+ mPermissionManager.addOnPermissionsChangeListener(delegate);
+ mPermissionListeners.put(listener, delegate);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Remove a listener for permission changes for installed packages.
+ *
+ * @param listener the listener to remove
+ *
+ * @hide
+ */
+ //@SystemApi
+ @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS)
+ public void removeOnPermissionsChangeListener(
+ @NonNull PackageManager.OnPermissionsChangedListener listener) {
+ synchronized (mPermissionListeners) {
+ final IOnPermissionsChangeListener delegate = mPermissionListeners.get(listener);
+ if (delegate != null) {
+ try {
+ mPermissionManager.removeOnPermissionsChangeListener(delegate);
+ mPermissionListeners.remove(listener);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
}
/**
- * Grant default permissions to currently enabled telephony data services
- * @param packageNames The package name for the services
- * @param user The user handle
- * @param executor The executor for the callback
- * @param callback The callback provided by caller to be notified when grant completes
+ * Gets the version of the runtime permission database.
+ *
+ * @return The database version, -1 when this is an upgrade from pre-Q, 0 when this is a fresh
+ * install.
+ *
* @hide
*/
- @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
- public void grantDefaultPermissionsToEnabledTelephonyDataServices(
- @NonNull String[] packageNames, @NonNull UserHandle user,
- @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY,
+ Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS
+ })
+ public @IntRange(from = 0) int getRuntimePermissionsVersion() {
try {
- mPermissionManager.grantDefaultPermissionsToEnabledTelephonyDataServices(
- packageNames, user.getIdentifier());
- executor.execute(() -> callback.accept(true));
+ return mPackageManager.getRuntimePermissionsVersion(mContext.getUserId());
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ throw e.rethrowFromSystemServer();
}
}
/**
- * Revoke default permissions to currently active telephony data services
- * @param packageNames The package name for the services
- * @param user The user handle
- * @param executor The executor for the callback
- * @param callback The callback provided by caller to be notified when revoke completes
+ * Sets the version of the runtime permission database.
+ *
+ * @param version The new version.
+ *
* @hide
*/
- @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
- public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
- @NonNull String[] packageNames, @NonNull UserHandle user,
- @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) {
+ @SystemApi
+ @RequiresPermission(anyOf = {
+ Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY,
+ Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS
+ })
+ public void setRuntimePermissionsVersion(@IntRange(from = 0) int version) {
try {
- mPermissionManager.revokeDefaultPermissionsFromDisabledTelephonyDataServices(
- packageNames, user.getIdentifier());
- executor.execute(() -> callback.accept(true));
+ mPackageManager.setRuntimePermissionsVersion(version, mContext.getUserId());
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ throw e.rethrowFromSystemServer();
}
}
/**
- * Grant default permissions to currently enabled carrier apps
- * @param packageNames Package names of the apps to be granted permissions
- * @param user The user handle
- * @param executor The executor for the callback
- * @param callback The callback provided by caller to be notified when grant completes
- * @hide
+ * Get set of permissions that have been split into more granular or dependent permissions.
+ *
+ * <p>E.g. before {@link android.os.Build.VERSION_CODES#Q} an app that was granted
+ * {@link Manifest.permission#ACCESS_COARSE_LOCATION} could access the location while it was in
+ * foreground and background. On platforms after {@link android.os.Build.VERSION_CODES#Q}
+ * the location permission only grants location access while the app is in foreground. This
+ * would break apps that target before {@link android.os.Build.VERSION_CODES#Q}. Hence whenever
+ * such an old app asks for a location permission (i.e. the
+ * {@link SplitPermissionInfo#getSplitPermission()}), then the
+ * {@link Manifest.permission#ACCESS_BACKGROUND_LOCATION} permission (inside
+ * {@link SplitPermissionInfo#getNewPermissions}) is added.
+ *
+ * <p>Note: Regular apps do not have to worry about this. The platform and permission controller
+ * automatically add the new permissions where needed.
+ *
+ * @return All permissions that are split.
*/
- @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS)
- public void grantDefaultPermissionsToEnabledCarrierApps(@NonNull String[] packageNames,
- @NonNull UserHandle user, @NonNull @CallbackExecutor Executor executor,
- @NonNull Consumer<Boolean> callback) {
+ public @NonNull List<SplitPermissionInfo> getSplitPermissions() {
+ if (mSplitPermissionInfos != null) {
+ return mSplitPermissionInfos;
+ }
+
+ List<SplitPermissionInfoParcelable> parcelableList;
try {
- mPermissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames,
- user.getIdentifier());
- executor.execute(() -> callback.accept(true));
+ parcelableList = ActivityThread.getPermissionManager().getSplitPermissions();
} catch (RemoteException e) {
- e.rethrowFromSystemServer();
+ Slog.e(LOG_TAG, "Error getting split permissions", e);
+ return Collections.emptyList();
}
+
+ mSplitPermissionInfos = splitPermissionInfoListToNonParcelableList(parcelableList);
+
+ return mSplitPermissionInfos;
}
/**
@@ -530,12 +1060,8 @@ public final class PermissionManager {
@SystemApi
public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message,
@Nullable String callingFeatureId, int pid, int uid) {
- try {
- return mPermissionManager.checkDeviceIdentifierAccess(packageName, message,
- callingFeatureId, pid, uid);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ return mLegacyPermissionManager.checkDeviceIdentifierAccess(packageName, message,
+ callingFeatureId, pid, uid);
}
/* @hide */
@@ -547,10 +1073,11 @@ public final class PermissionManager {
// permission this is.
final int appId = UserHandle.getAppId(uid);
if (appId == Process.ROOT_UID || appId == Process.SYSTEM_UID) {
- Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " holds " + permission);
+ Slog.w(LOG_TAG, "Missing ActivityManager; assuming " + uid + " holds "
+ + permission);
return PackageManager.PERMISSION_GRANTED;
}
- Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " does not hold "
+ Slog.w(LOG_TAG, "Missing ActivityManager; assuming " + uid + " does not hold "
+ permission);
return PackageManager.PERMISSION_DENIED;
}
@@ -730,4 +1257,35 @@ public final class PermissionManager {
sPackageNamePermissionCache.disableLocal();
}
+ private final class OnPermissionsChangeListenerDelegate
+ extends IOnPermissionsChangeListener.Stub implements Handler.Callback{
+ private static final int MSG_PERMISSIONS_CHANGED = 1;
+
+ private final PackageManager.OnPermissionsChangedListener mListener;
+ private final Handler mHandler;
+
+ public OnPermissionsChangeListenerDelegate(
+ PackageManager.OnPermissionsChangedListener listener, Looper looper) {
+ mListener = listener;
+ mHandler = new Handler(looper, this);
+ }
+
+ @Override
+ public void onPermissionsChanged(int uid) {
+ mHandler.obtainMessage(MSG_PERMISSIONS_CHANGED, uid, 0).sendToTarget();
+ }
+
+ @Override
+ public boolean handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_PERMISSIONS_CHANGED: {
+ final int uid = msg.arg1;
+ mListener.onPermissionsChanged(uid);
+ return true;
+ }
+ default:
+ return false;
+ }
+ }
+ }
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 27f753007201..daa17aaefa7f 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7760,6 +7760,32 @@ public final class Settings {
"minimal_post_processing_allowed";
/**
+ * No mode switching will happen.
+ *
+ * @see #MATCH_CONTENT_FRAME_RATE
+ * @hide
+ */
+ public static final int MATCH_CONTENT_FRAMERATE_NEVER = 0;
+
+ /**
+ * Allow only refresh rate switching between modes in the same configuration group.
+ * This way only switches without visual interruptions for the user will be allowed.
+ *
+ * @see #MATCH_CONTENT_FRAME_RATE
+ * @hide
+ */
+ public static final int MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY = 1;
+
+ /**
+ * Allow refresh rate switching between all refresh rates even if the switch will have
+ * visual interruptions for the user.
+ *
+ * @see #MATCH_CONTENT_FRAME_RATE
+ * @hide
+ */
+ public static final int MATCH_CONTENT_FRAMERATE_ALWAYS = 2;
+
+ /**
* User's preference for refresh rate switching.
*
* <p>Values:
@@ -7769,6 +7795,9 @@ public final class Settings {
* for the user.
*
* @see android.view.Surface#setFrameRate
+ * @see #MATCH_CONTENT_FRAMERATE_NEVER
+ * @see #MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY
+ * @see #MATCH_CONTENT_FRAMERATE_ALWAYS
* @hide
*/
public static final String MATCH_CONTENT_FRAME_RATE =
diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java
index 6ef9e7e3d9b8..017f40521a81 100644
--- a/core/java/android/security/keymaster/KeymasterDefs.java
+++ b/core/java/android/security/keymaster/KeymasterDefs.java
@@ -16,18 +16,18 @@
package android.security.keymaster;
-import android.hardware.keymint.Algorithm;
-import android.hardware.keymint.BlockMode;
-import android.hardware.keymint.Digest;
-import android.hardware.keymint.ErrorCode;
-import android.hardware.keymint.HardwareAuthenticatorType;
-import android.hardware.keymint.KeyFormat;
-import android.hardware.keymint.KeyOrigin;
-import android.hardware.keymint.KeyPurpose;
-import android.hardware.keymint.PaddingMode;
-import android.hardware.keymint.SecurityLevel;
-import android.hardware.keymint.Tag;
-import android.hardware.keymint.TagType;
+import android.hardware.security.keymint.Algorithm;
+import android.hardware.security.keymint.BlockMode;
+import android.hardware.security.keymint.Digest;
+import android.hardware.security.keymint.ErrorCode;
+import android.hardware.security.keymint.HardwareAuthenticatorType;
+import android.hardware.security.keymint.KeyFormat;
+import android.hardware.security.keymint.KeyOrigin;
+import android.hardware.security.keymint.KeyPurpose;
+import android.hardware.security.keymint.PaddingMode;
+import android.hardware.security.keymint.SecurityLevel;
+import android.hardware.security.keymint.Tag;
+import android.hardware.security.keymint.TagType;
import java.util.HashMap;
import java.util.Map;
diff --git a/core/java/android/service/textservice/OWNERS b/core/java/android/service/textservice/OWNERS
index a637754ba17a..10b8b7637431 100644
--- a/core/java/android/service/textservice/OWNERS
+++ b/core/java/android/service/textservice/OWNERS
@@ -1,5 +1,3 @@
# Bug component: 34867
-ogunwale@google.com
-roosa@google.com
-yukawa@google.com
+include ../../inputmethodservice/OWNERS \ No newline at end of file
diff --git a/core/java/android/telephony/OWNERS b/core/java/android/telephony/OWNERS
new file mode 100644
index 000000000000..640baf2297b4
--- /dev/null
+++ b/core/java/android/telephony/OWNERS
@@ -0,0 +1 @@
+include /telephony/OWNERS
diff --git a/core/java/android/util/ExceptionUtils.java b/core/java/android/util/ExceptionUtils.java
index 1a397b39ef3c..4b511acc280f 100644
--- a/core/java/android/util/ExceptionUtils.java
+++ b/core/java/android/util/ExceptionUtils.java
@@ -98,4 +98,6 @@ public class ExceptionUtils {
}
return t;
}
+
+
} \ No newline at end of file
diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java
index 4a5fa0f971ae..0939336132a8 100644
--- a/core/java/android/view/InsetsAnimationThreadControlRunner.java
+++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java
@@ -81,6 +81,7 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro
SyncRtSurfaceTransactionApplier.SurfaceParams surfaceParams = params[i];
applyParams(t, surfaceParams, mTmpFloat9);
}
+ t.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId());
t.apply();
t.close();
}
diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS
index 4f82b86f260c..72fa4c39f1bc 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -8,19 +8,67 @@ nduca@google.com
sumir@google.com
ogunwale@google.com
jjaggi@google.com
+roosa@google.com
# Display
-per-file Display.java = michaelwr@google.com, santoscordon@google.com
-per-file DisplayInfo.java = michaelwr@google.com, santoscordon@google.com
+per-file Display*.java = file:/services/core/java/com/android/server/display/OWNERS
+per-file Display*.aidl = file:/services/core/java/com/android/server/display/OWNERS
# Haptics
-per-file HapticFeedbackConstants.java = michaelwr@google.com, santoscordon@google.com
+per-file HapticFeedbackConstants.java = file:/services/core/java/com/android/server/input/OWNERS
+
+# Ime
+per-file Ime*.java = file:/core/java/android/view/inputmethod/OWNERS
# Input
-per-file IInputMonitorHost.aidl = michaelwr@google.com, svv@google.com
-per-file Input*.java = michaelwr@google.com, svv@google.com
-per-file Input*.aidl = michaelwr@google.com, svv@google.com
-per-file KeyEvent.java = michaelwr@google.com, svv@google.com
-per-file MotionEvent.java = michaelwr@google.com, svv@google.com
-per-file PointerIcon.java = michaelwr@google.com, svv@google.com
-per-file SimulatedDpad.java = michaelwr@google.com, svv@google.com
+per-file IInput*.aidl = file:/services/core/java/com/android/server/input/OWNERS
+per-file Input*.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file Input*.aidl = file:/services/core/java/com/android/server/input/OWNERS
+per-file KeyEvent.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file MotionEvent.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file PointerIcon.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file SimulatedDpad.java = file:/services/core/java/com/android/server/input/OWNERS
+
+# InputWindowHandle
+per-file InputWindowHandle.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file InputWindowHandle.java = file:/services/core/java/com/android/server/wm/OWNERS
+
+# Surface
+per-file Surface.java = file:/graphics/java/android/graphics/OWNERS
+per-file Surface.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file SurfaceView.java = file:/graphics/java/android/graphics/OWNERS
+per-file SurfaceView.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file SurfaceHolder.java = file:/graphics/java/android/graphics/OWNERS
+per-file SurfaceHolder.java = file:/services/core/java/com/android/server/wm/OWNERS
+
+# View
+per-file View.java = file:/services/accessibility/OWNERS
+per-file View.java = file:/core/java/android/service/autofill/OWNERS
+per-file View.java = file:/graphics/java/android/graphics/OWNERS
+per-file View.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file View.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file ViewRootImpl.java = file:/services/accessibility/OWNERS
+per-file ViewRootImpl.java = file:/core/java/android/service/autofill/OWNERS
+per-file ViewRootImpl.java = file:/graphics/java/android/graphics/OWNERS
+per-file ViewRootImpl.java = file:/services/core/java/com/android/server/input/OWNERS
+per-file ViewRootImpl.java = file:/services/core/java/com/android/server/wm/OWNERS
+
+# WindowManager
+per-file DisplayCutout.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file DisplayCutout.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file IDisplay*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Inset*.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Inset*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file IPinnedStackListener.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file IRecents*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file IRemote*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file IWindow*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file RemoteAnimation*.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file RemoteAnimation*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file SurfaceControl*.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file SurfaceControl*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
+per-file SurfaceSession.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file SyncRtSurfaceTransactionApplier.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file ViewRootInsetsControllerHost.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Window*.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Window*.aidl = file:/services/core/java/com/android/server/wm/OWNERS
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 607888c81357..15adc5a0ec2f 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -239,7 +239,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall
private static boolean useBlastAdapter(Context context) {
ContentResolver contentResolver = context.getContentResolver();
return Settings.Global.getInt(contentResolver,
- Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV, 1 /* default */) == 1;
+ Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV, 0 /* default */) == 1;
}
private final boolean mUseBlastAdapter;
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index 13d9eb9d3c7d..af18293398da 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -16,7 +16,11 @@
package android.view;
+import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+import static android.Manifest.permission.HIDE_OVERLAY_WINDOWS;
+import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
+import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.annotation.ColorInt;
import android.annotation.DrawableRes;
@@ -24,6 +28,7 @@ import android.annotation.IdRes;
import android.annotation.LayoutRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresPermission;
import android.annotation.StyleRes;
import android.annotation.SystemApi;
import android.annotation.TestApi;
@@ -991,6 +996,26 @@ public abstract class Window {
}
/**
+ * Prevent non-system overlay windows from being drawn on top of this window.
+ *
+ * @param hide whether non-system overlay windows should be hidden.
+ */
+ @RequiresPermission(HIDE_OVERLAY_WINDOWS)
+ public final void setHideOverlayWindows(boolean hide) {
+ // This permission check is here to throw early and let the developer know that they need
+ // to hold HIDE_OVERLAY_WINDOWS for the flag to have any effect. The WM verifies that the
+ // owner of the window has the permission before applying the flag, but this is done
+ // asynchronously.
+ if (mContext.checkSelfPermission(HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != PERMISSION_GRANTED
+ && mContext.checkSelfPermission(HIDE_OVERLAY_WINDOWS) != PERMISSION_GRANTED) {
+ throw new SecurityException(
+ "Permission denial: setHideOverlayWindows: HIDE_OVERLAY_WINDOWS");
+ }
+ setPrivateFlags(hide ? SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS : 0,
+ SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
+ }
+
+ /**
* Take ownership of this window's surface. The window's view hierarchy
* will no longer draw into the surface, though it will otherwise continue
* to operate (such as for receiving input events). The given SurfaceHolder
diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java
index 16fd383fa7ff..3c18b6b89af8 100644
--- a/core/java/android/view/contentcapture/MainContentCaptureSession.java
+++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java
@@ -43,6 +43,7 @@ import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.RemoteException;
+import android.text.TextUtils;
import android.util.LocalLog;
import android.util.Log;
import android.util.TimeUtils;
@@ -334,15 +335,22 @@ public final class MainContentCaptureSession extends ContentCaptureSession {
if (!mEvents.isEmpty() && eventType == TYPE_VIEW_TEXT_CHANGED) {
final ContentCaptureEvent lastEvent = mEvents.get(mEvents.size() - 1);
- // TODO(b/121045053): check if flags match
+ // We merge two consecutive text change event, unless one of them clears the text.
if (lastEvent.getType() == TYPE_VIEW_TEXT_CHANGED
&& lastEvent.getId().equals(event.getId())) {
- if (sVerbose) {
+ boolean bothNonEmpty = !TextUtils.isEmpty(lastEvent.getText())
+ && !TextUtils.isEmpty(event.getText());
+ boolean equalContent = TextUtils.equals(lastEvent.getText(), event.getText());
+ if (equalContent) {
+ addEvent = false;
+ } else if (bothNonEmpty) {
+ lastEvent.mergeEvent(event);
+ addEvent = false;
+ }
+ if (!addEvent && sVerbose) {
Log.v(TAG, "Buffering VIEW_TEXT_CHANGED event, updated text="
+ getSanitizedString(event.getText()));
}
- lastEvent.mergeEvent(event);
- addEvent = false;
}
}
diff --git a/core/java/android/view/textservice/OWNERS b/core/java/android/view/textservice/OWNERS
index a637754ba17a..582be8dc4594 100644
--- a/core/java/android/view/textservice/OWNERS
+++ b/core/java/android/view/textservice/OWNERS
@@ -1,5 +1,3 @@
# Bug component: 34867
-ogunwale@google.com
-roosa@google.com
-yukawa@google.com
+include ../inputmethod/OWNERS
diff --git a/core/java/android/widget/OWNERS b/core/java/android/widget/OWNERS
index fbb975b806f1..718076b49f77 100644
--- a/core/java/android/widget/OWNERS
+++ b/core/java/android/widget/OWNERS
@@ -7,3 +7,5 @@ aurimas@google.com
siyamed@google.com
per-file TextView.java, EditText.java, Editor.java = siyamed@google.com, nona@google.com, clarabayarri@google.com
+
+per-file SpellChecker.java = file:../view/inputmethod/OWNERS
diff --git a/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl b/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl
index fa5c30a03e78..cb280cd14180 100644
--- a/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl
+++ b/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl
@@ -18,5 +18,5 @@ package com.android.internal.app;
// Iterface to observe op note/checks of ops
oneway interface IAppOpsNotedCallback {
- void opNoted(int op, int uid, String packageName, int mode);
+ void opNoted(int op, int uid, String packageName, int flags, int mode);
}
diff --git a/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl
index ed521e656981..b0cb2a8ceb64 100644
--- a/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl
+++ b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl
@@ -18,5 +18,5 @@ package com.android.internal.app;
// Iterface to observe op starts
oneway interface IAppOpsStartedCallback {
- void opStarted(int op, int uid, String packageName, int mode);
+ void opStarted(int op, int uid, String packageName, int flags, int mode);
}
diff --git a/core/java/com/android/internal/app/OWNERS b/core/java/com/android/internal/app/OWNERS
new file mode 100644
index 000000000000..108ab92f0e9b
--- /dev/null
+++ b/core/java/com/android/internal/app/OWNERS
@@ -0,0 +1 @@
+per-file *AppOp* = file:/core/java/android/permission/OWNERS
diff --git a/core/java/com/android/internal/notification/OWNERS b/core/java/com/android/internal/notification/OWNERS
new file mode 100644
index 000000000000..396fd1213aca
--- /dev/null
+++ b/core/java/com/android/internal/notification/OWNERS
@@ -0,0 +1 @@
+include /services/core/java/com/android/server/notification/OWNERS
diff --git a/core/java/com/android/internal/os/OWNERS b/core/java/com/android/internal/os/OWNERS
index ae962f244a1a..8f78b2a3a5ea 100644
--- a/core/java/com/android/internal/os/OWNERS
+++ b/core/java/com/android/internal/os/OWNERS
@@ -1,3 +1,4 @@
+per-file *Power* = file:/services/core/java/com/android/server/power/OWNERS
per-file *Zygote* = file:/ZYGOTE_OWNERS
# BatteryStats
diff --git a/core/java/com/android/internal/telephony/OWNERS b/core/java/com/android/internal/telephony/OWNERS
new file mode 100644
index 000000000000..640baf2297b4
--- /dev/null
+++ b/core/java/com/android/internal/telephony/OWNERS
@@ -0,0 +1 @@
+include /telephony/OWNERS
diff --git a/core/java/com/android/internal/view/OWNERS b/core/java/com/android/internal/view/OWNERS
new file mode 100644
index 000000000000..99a76861c542
--- /dev/null
+++ b/core/java/com/android/internal/view/OWNERS
@@ -0,0 +1,5 @@
+# Bug component: 25700
+
+file:/core/java/android/view/OWNERS
+
+per-file *Input* = file:/services/core/java/com/android/server/inputmethod/OWNERS \ No newline at end of file
diff --git a/core/jni/OWNERS b/core/jni/OWNERS
index bcd1278d87e7..804829801b29 100644
--- a/core/jni/OWNERS
+++ b/core/jni/OWNERS
@@ -6,15 +6,19 @@ per-file *Camera*,*camera* = shuzhenwang@google.com, yinchiayeh@google.com, zhij
per-file android_net_* = codewiz@google.com, jchalard@google.com, lorenzo@google.com, reminv@google.com, satk@google.com
# Display
-per-file android_hardware_display_* = michaelwr@google.com, santoscordon@google.com
+per-file android_hardware_display_* = file:/services/core/java/com/android/server/display/OWNERS
# Input
-per-file android_hardware_input* = michaelwr@google.com, svv@google.com
-per-file android_view_Input* = michaelwr@google.com, svv@google.com
-per-file android_view_KeyCharacterMap.* = michaelwr@google.com, svv@google.com
-per-file android_view_*KeyEvent.* = michaelwr@google.com, svv@google.com
-per-file android_view_*MotionEvent.* = michaelwr@google.com, svv@google.com
-per-file android_view_PointerIcon.* = michaelwr@google.com, svv@google.com
+per-file android_hardware_input* = file:/services/core/java/com/android/server/input/OWNERS
+per-file android_view_Input* = file:/services/core/java/com/android/server/input/OWNERS
+per-file android_view_KeyCharacterMap.* = file:/services/core/java/com/android/server/input/OWNERS
+per-file android_view_*KeyEvent.* = file:/services/core/java/com/android/server/input/OWNERS
+per-file android_view_*MotionEvent.* = file:/services/core/java/com/android/server/input/OWNERS
+per-file android_view_PointerIcon.* = file:/services/core/java/com/android/server/input/OWNERS
+
+# WindowManager
+per-file android_graphics_BLASTBufferQueue.cpp = file:/services/core/java/com/android/server/wm/OWNERS
+per-file android_view_Surface* = file:/services/core/java/com/android/server/wm/OWNERS
per-file *Zygote* = file:/ZYGOTE_OWNERS
per-file Android.bp = file:platform/build/soong:/OWNERS
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index c8aedfb8a835..ef7edc2f2dd2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2732,6 +2732,10 @@
<permission android:name="android.permission.TOGGLE_AUTOMOTIVE_PROJECTION"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an app to prevent non-system-overlay windows from being drawn on top of it -->
+ <permission android:name="android.permission.HIDE_OVERLAY_WINDOWS"
+ android:protectionLevel="normal" />
+
<!-- ================================== -->
<!-- Permissions affecting the system wallpaper -->
<!-- ================================== -->
@@ -3286,6 +3290,7 @@
{@link android.view.WindowManager.LayoutsParams#SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS}
to hide non-system-overlay windows.
<p>Not for use by third-party applications.
+ @deprecated Use {@link android.Manifest.permission#HIDE_OVERLAY_WINDOWS} instead
@hide
-->
<permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"
@@ -3964,6 +3969,12 @@
<permission android:name="android.permission.MANAGE_COMPANION_DEVICES"
android:protectionLevel="signature" />
+ <!-- Allows an application to subscribe to notifications about the presence status change
+ of their associated companion device
+ -->
+ <permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE"
+ android:protectionLevel="normal" />
+
<!-- @SystemApi Allows an application to use SurfaceFlinger's low level features.
<p>Not for use by third-party applications.
@hide
diff --git a/core/res/res/drawable-car/car_button_background.xml b/core/res/res/drawable-car/car_button_background.xml
index 3e2610c5047b..e568aebfe81d 100644
--- a/core/res/res/drawable-car/car_button_background.xml
+++ b/core/res/res/drawable-car/car_button_background.xml
@@ -13,24 +13,48 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
-<!-- Default background styles for car buttons when enabled/disabled. -->
-<ripple
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:color="?android:attr/colorControlHighlight">
+<!-- Default background styles for car buttons when enabled/disabled,
+ focused/unfocused, and pressed/unpressed -->
+<!-- TODO(b/175161842) Add rotary fill color -->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:state_focused="true" android:state_enabled="false">
+ <shape android:shape="rectangle">
+ <corners android:radius="@*android:dimen/car_button_radius"/>
+ <solid android:color="@*android:color/car_grey_300"/>
+ <stroke android:width="8dp"
+ android:color="#0059B3"/>
+ </shape>
+ </item>
+ <item android:state_focused="true" android:state_pressed="true">
+ <shape android:shape="rectangle">
+ <corners android:radius="@*android:dimen/car_button_radius"/>
+ <solid android:color="?android:attr/colorButtonNormal"/>
+ <stroke android:width="4dp"
+ android:color="#0059B3"/>
+ </shape>
+ </item>
+ <item android:state_focused="true">
+ <shape android:shape="rectangle">
+ <corners android:radius="@*android:dimen/car_button_radius"/>
+ <solid android:color="?android:attr/colorButtonNormal"/>
+ <stroke android:width="8dp"
+ android:color="#0059B3"/>
+ </shape>
+ </item>
+ <item android:state_enabled="false">
+ <shape android:shape="rectangle">
+ <corners android:radius="@*android:dimen/car_button_radius"/>
+ <solid android:color="@*android:color/car_grey_300"/>
+ </shape>
+ </item>
<item>
- <selector>
- <item android:state_enabled="false">
- <shape android:shape="rectangle">
- <corners android:radius="@*android:dimen/car_button_radius"/>
- <solid android:color="@*android:color/car_grey_300"/>
- </shape>
- </item>
+ <ripple android:color="?android:attr/colorControlHighlight">
<item>
<shape android:shape="rectangle">
<corners android:radius="@*android:dimen/car_button_radius"/>
<solid android:color="?android:attr/colorButtonNormal"/>
</shape>
</item>
- </selector>
+ </ripple>
</item>
-</ripple>
+</selector>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 03ba83c6bd2e..cddb8b5802d0 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -4574,6 +4574,6 @@
<!-- Indicates that default fitness tracker app needs to request sensor and location permissions. -->
<bool name="config_trackerAppNeedsPermissions">false</bool>
- <!-- Component with platform query permissions for AppSearch -->
- <string name="config_defaultAppSearchPlatformQuerierComponent" translatable="false"></string>
+ <!-- Package with global data query permissions for AppSearch -->
+ <string name="config_globalAppSearchDataQuerierPackage" translatable="false"></string>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index aff0695bb14e..a2556a112941 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -4116,8 +4116,8 @@
<java-symbol type="bool" name="config_trackerAppNeedsPermissions"/>
- <!-- Component with platform query permissions for AppSearch -->
- <java-symbol type="string" name="config_defaultAppSearchPlatformQuerierComponent" />
+ <!-- Package with global data query permissions for AppSearch -->
+ <java-symbol type="string" name="config_globalAppSearchDataQuerierPackage" />
<!-- Color used by the accessibility focus rectangle -->
<java-symbol type="color" name="accessibility_focus_highlight_color" />
diff --git a/core/tests/powertests/PowerStatsLoadTests/Android.bp b/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp
index 66c91adc6540..ade97b81e775 100644
--- a/core/tests/powertests/PowerStatsLoadTests/Android.bp
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp
@@ -1,5 +1,5 @@
android_test {
- name: "PowerStatsLoadTests",
+ name: "BatteryStatsLoadTests",
srcs: ["src/**/*.java"],
static_libs: [
"androidx.test.rules",
diff --git a/core/tests/powertests/PowerStatsLoadTests/AndroidManifest.xml b/core/tests/batterystatstests/BatteryStatsLoadTests/AndroidManifest.xml
index 9cecaedf1380..adc20c6ae496 100644
--- a/core/tests/powertests/PowerStatsLoadTests/AndroidManifest.xml
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/AndroidManifest.xml
@@ -16,7 +16,7 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.frameworks.core.powerstatsloadtests">
+ package="com.android.frameworks.core.batterystatsloadtests">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
@@ -27,7 +27,7 @@
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
- android:targetPackage="com.android.frameworks.core.powerstatsloadtests"
+ android:targetPackage="com.android.frameworks.core.batterystatsloadtests"
android:label="Power Stats Load Tests" />
<queries>
diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/ConnectivitySetupRule.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java
index ca2942647f08..1afc22b7406d 100644
--- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/ConnectivitySetupRule.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsloadtests;
+package com.android.frameworks.core.batterystatsloadtests;
import static org.junit.Assert.assertEquals;
diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetrics.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
index 88cb719add60..dbe5773a3107 100644
--- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetrics.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsloadtests;
+package com.android.frameworks.core.batterystatsloadtests;
import android.os.Process;
diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetricsCollector.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
index a71559b5ad6b..254458cc8935 100644
--- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetricsCollector.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsloadtests;
+package com.android.frameworks.core.batterystatsloadtests;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -106,6 +106,7 @@ public class PowerMetricsCollector implements TestRule {
mContext = instrumentation.getContext();
mUid = Process.myUid();
mUserManager = mContext.getSystemService(UserManager.class);
+ // TODO(b/175324611): Use BatteryUsageStats instead
mStatsHelper = new BatteryStatsHelper(mContext, false /* collectBatteryBroadcast */);
mStatsHelper.create((Bundle) null);
}
diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/SystemServiceCallLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java
index 911ccba3ac78..488469d54f29 100644
--- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/SystemServiceCallLoadTest.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsloadtests;
+package com.android.frameworks.core.batterystatsloadtests;
import static org.junit.Assert.assertNotNull;
diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/WiFiLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java
index 90627192946d..27495da8d839 100644
--- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/WiFiLoadTest.java
+++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsloadtests;
+package com.android.frameworks.core.batterystatsloadtests;
import android.util.Log;
diff --git a/core/tests/powertests/PowerStatsViewer/Android.bp b/core/tests/batterystatstests/BatteryStatsViewer/Android.bp
index a3dc4fb4ff74..1e0498be5800 100644
--- a/core/tests/powertests/PowerStatsViewer/Android.bp
+++ b/core/tests/batterystatstests/BatteryStatsViewer/Android.bp
@@ -1,5 +1,5 @@
android_test {
- name: "PowerStatsViewer",
+ name: "BatteryStatsViewer",
srcs: ["src/**/*.java"],
defaults: ["SettingsLibDefaults"],
static_libs: [
diff --git a/core/tests/powertests/PowerStatsViewer/AndroidManifest.xml b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
index 28ea05fca61e..edb1b108b7bc 100644
--- a/core/tests/powertests/PowerStatsViewer/AndroidManifest.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml
@@ -16,7 +16,7 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.frameworks.core.powerstatsviewer"
+ package="com.android.frameworks.core.batterystatsviewer"
android:sharedUserId="android.uid.system">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
@@ -24,9 +24,9 @@
<application
android:theme="@style/Theme"
- android:label="Power Stats Viewer">
- <activity android:name=".PowerStatsViewerActivity"
- android:label="Power Stats Viewer"
+ android:label="Battery Stats Viewer">
+ <activity android:name=".BatteryStatsViewerActivity"
+ android:label="Battery Stats Viewer"
android:launchMode="singleTop"
android:exported="true">
<intent-filter>
@@ -35,7 +35,7 @@
</intent-filter>
</activity>
- <activity android:name=".PowerConsumerPickerActivity"
- android:label="Select a power consumer"/>
+ <activity android:name=".BatteryConsumerPickerActivity"
+ android:label="Select a battery consumer"/>
</application>
</manifest>
diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_entry_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_entry_layout.xml
index 1ced825adf31..1ced825adf31 100644
--- a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_entry_layout.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_entry_layout.xml
diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_info_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_info_layout.xml
index fbd0ebd61bc7..fbd0ebd61bc7 100644
--- a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_info_layout.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_info_layout.xml
diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_activity_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_activity_layout.xml
index ecc89f0cb33e..ecc89f0cb33e 100644
--- a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_activity_layout.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_activity_layout.xml
diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml
index bea38c18c20b..bea38c18c20b 100644
--- a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_layout.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml
diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_viewer_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml
index 238e238deeaa..e58a08fd362c 100644
--- a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_viewer_layout.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml
@@ -42,13 +42,13 @@
android:paddingStart="10dp"
android:paddingEnd="10dp">
- <include layout="@layout/power_consumer_info_layout"/>
+ <include layout="@layout/battery_consumer_info_layout"/>
</LinearLayout>
</androidx.cardview.widget.CardView>
<androidx.recyclerview.widget.RecyclerView
- android:id="@+id/power_stats_data_view"
+ android:id="@+id/battery_consumer_data_view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
@@ -59,7 +59,7 @@
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone"
- android:text="No power stats available"/>
+ android:text="No battery stats available"/>
</LinearLayout>
<FrameLayout
diff --git a/core/tests/powertests/PowerStatsViewer/res/values/styles.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml
index 629d729e7b9a..629d729e7b9a 100644
--- a/core/tests/powertests/PowerStatsViewer/res/values/styles.xml
+++ b/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml
diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
index 6d8e2c59be97..b077ea313b9d 100644
--- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsviewer;
+package com.android.frameworks.core.batterystatsviewer;
import android.content.Context;
import android.os.BatteryConsumer;
@@ -30,7 +30,7 @@ import com.android.internal.os.BatteryStatsHelper;
import java.util.ArrayList;
import java.util.List;
-public class PowerStatsData {
+public class BatteryConsumerData {
private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar";
private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media";
private static final String PACKAGE_SYSTEMUI = "com.android.systemui";
@@ -58,11 +58,11 @@ public class PowerStatsData {
public double total;
}
- private final PowerConsumerInfoHelper.PowerConsumerInfo mPowerConsumerInfo;
+ private final BatteryConsumerInfoHelper.BatteryConsumerInfo mBatteryConsumerInfo;
private final List<Entry> mEntries = new ArrayList<>();
- public PowerStatsData(Context context, BatteryStatsHelper batteryStatsHelper,
- BatteryUsageStats batteryUsageStats, String powerConsumerId) {
+ public BatteryConsumerData(Context context, BatteryStatsHelper batteryStatsHelper,
+ BatteryUsageStats batteryUsageStats, String batteryConsumerId) {
List<BatterySipper> usageList = batteryStatsHelper.getUsageList();
BatteryStats batteryStats = batteryStatsHelper.getStats();
@@ -102,7 +102,7 @@ public class PowerStatsData {
totalScreenPower = sipper.sumPower();
}
- if (powerConsumerId(sipper).equals(powerConsumerId)) {
+ if (batteryConsumerId(sipper).equals(batteryConsumerId)) {
requestedBatterySipper = sipper;
}
@@ -143,21 +143,20 @@ public class PowerStatsData {
BatteryConsumer requestedBatteryConsumer = null;
for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
- if (powerConsumerId(consumer).equals(powerConsumerId)) {
+ if (batteryConsumerId(consumer).equals(batteryConsumerId)) {
requestedBatteryConsumer = consumer;
break;
}
}
if (requestedBatterySipper == null) {
- mPowerConsumerInfo = null;
+ mBatteryConsumerInfo = null;
return;
}
- long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy();
-
- mPowerConsumerInfo = PowerConsumerInfoHelper.makePowerConsumerInfo(
+ mBatteryConsumerInfo = BatteryConsumerInfoHelper.makeBatteryConsumerInfo(
context.getPackageManager(), requestedBatterySipper);
+ long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy();
addEntry("Total power", EntryType.POWER,
requestedBatterySipper.totalSmearedPowerMah, totalSmearedPowerMah);
@@ -279,19 +278,19 @@ public class PowerStatsData {
}
}
- public PowerConsumerInfoHelper.PowerConsumerInfo getPowerConsumerInfo() {
- return mPowerConsumerInfo;
+ public BatteryConsumerInfoHelper.BatteryConsumerInfo getBatteryConsumerInfo() {
+ return mBatteryConsumerInfo;
}
public List<Entry> getEntries() {
return mEntries;
}
- public static String powerConsumerId(BatterySipper sipper) {
+ public static String batteryConsumerId(BatterySipper sipper) {
return sipper.drainType + "|" + sipper.userId + "|" + sipper.getUid();
}
- public static String powerConsumerId(BatteryConsumer consumer) {
+ public static String batteryConsumerId(BatteryConsumer consumer) {
if (consumer instanceof UidBatteryConsumer) {
return BatterySipper.DrainType.APP + "|"
+ UserHandle.getUserId(((UidBatteryConsumer) consumer).getUid()) + "|"
diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerInfoHelper.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerInfoHelper.java
index 6fec2405b0c6..8ee6c604cb3e 100644
--- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerInfoHelper.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerInfoHelper.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsviewer;
+package com.android.frameworks.core.batterystatsviewer;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
@@ -26,11 +26,11 @@ import com.android.internal.os.BatterySipper;
import java.util.Locale;
-class PowerConsumerInfoHelper {
+class BatteryConsumerInfoHelper {
private static final String SYSTEM_SERVER_PACKAGE_NAME = "android";
- public static class PowerConsumerInfo {
+ public static class BatteryConsumerInfo {
public String id;
public CharSequence label;
public double powerMah;
@@ -40,10 +40,10 @@ class PowerConsumerInfoHelper {
}
@NonNull
- public static PowerConsumerInfo makePowerConsumerInfo(PackageManager packageManager,
+ public static BatteryConsumerInfo makeBatteryConsumerInfo(PackageManager packageManager,
@NonNull BatterySipper sipper) {
- PowerConsumerInfo info = new PowerConsumerInfo();
- info.id = PowerStatsData.powerConsumerId(sipper);
+ BatteryConsumerInfo info = new BatteryConsumerInfo();
+ info.id = BatteryConsumerData.batteryConsumerId(sipper);
sipper.sumPower();
info.powerMah = sipper.totalSmearedPowerMah;
switch (sipper.drainType) {
diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerActivity.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java
index f56d113980c8..2db848b084a6 100644
--- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerActivity.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsviewer;
+package com.android.frameworks.core.batterystatsviewer;
import android.content.Context;
import android.content.Intent;
@@ -34,14 +34,14 @@ import com.google.android.material.tabs.TabLayout;
* Picker, showing a sorted lists of applications and other types of entities consuming power.
* Returns the selected entity ID or null.
*/
-public class PowerConsumerPickerActivity extends FragmentActivity {
+public class BatteryConsumerPickerActivity extends FragmentActivity {
public static final ActivityResultContract<Void, String> CONTRACT =
new ActivityResultContract<Void, String>() {
@NonNull
@Override
public Intent createIntent(@NonNull Context context, Void aVoid) {
- return new Intent(context, PowerConsumerPickerActivity.class);
+ return new Intent(context, BatteryConsumerPickerActivity.class);
}
@Override
@@ -58,7 +58,7 @@ public class PowerConsumerPickerActivity extends FragmentActivity {
super.onCreate(icicle);
getActionBar().setDisplayHomeAsUpEnabled(true);
- setContentView(R.layout.power_consumer_picker_activity_layout);
+ setContentView(R.layout.battery_consumer_picker_activity_layout);
ViewPager viewPager = findViewById(R.id.pager);
@@ -75,12 +75,12 @@ public class PowerConsumerPickerActivity extends FragmentActivity {
public Fragment getItem(int position) {
switch (position) {
case 0:
- return new PowerConsumerPickerFragment(
- PowerConsumerPickerFragment.PICKER_TYPE_APP);
+ return new BatteryConsumerPickerFragment(
+ BatteryConsumerPickerFragment.PICKER_TYPE_APP);
case 1:
default:
- return new PowerConsumerPickerFragment(
- PowerConsumerPickerFragment.PICKER_TYPE_DRAIN);
+ return new BatteryConsumerPickerFragment(
+ BatteryConsumerPickerFragment.PICKER_TYPE_DRAIN);
}
}
@@ -101,9 +101,9 @@ public class PowerConsumerPickerActivity extends FragmentActivity {
tabLayout.setupWithViewPager(viewPager);
}
- public void setSelectedPowerConsumer(String id) {
+ public void setSelectedBatteryConsumer(String batteryConsumerId) {
Intent intent = new Intent();
- intent.putExtra(Intent.EXTRA_RETURN_RESULT, id);
+ intent.putExtra(Intent.EXTRA_RETURN_RESULT, batteryConsumerId);
setResult(RESULT_OK, intent);
finish();
}
diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerFragment.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerFragment.java
index 25225b87f602..bb11fd598511 100644
--- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerFragment.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerFragment.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsviewer;
+package com.android.frameworks.core.batterystatsviewer;
import android.content.Context;
import android.content.pm.PackageManager;
@@ -36,7 +36,7 @@ import androidx.loader.content.Loader;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
-import com.android.frameworks.core.powerstatsviewer.PowerConsumerInfoHelper.PowerConsumerInfo;
+import com.android.frameworks.core.batterystatsviewer.BatteryConsumerInfoHelper.BatteryConsumerInfo;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
import com.android.settingslib.utils.AsyncLoaderCompat;
@@ -50,7 +50,7 @@ import java.util.Locale;
* Picker, showing a sorted lists of applications or other types of entities consuming power.
* Returns the selected entity ID or null.
*/
-public class PowerConsumerPickerFragment extends Fragment {
+public class BatteryConsumerPickerFragment extends Fragment {
private static final String TAG = "AppPicker";
public static final String PICKER_TYPE = "pickertype";
@@ -58,53 +58,53 @@ public class PowerConsumerPickerFragment extends Fragment {
public static final int PICKER_TYPE_APP = 0;
public static final int PICKER_TYPE_DRAIN = 1;
- private PowerConsumerListAdapter mPowerConsumerListAdapter;
+ private BatteryConsumerListAdapter mBatteryConsumerListAdapter;
private RecyclerView mAppList;
private View mLoadingView;
- private interface OnPowerConsumerSelectedListener {
- void onPowerConsumerSelected(String uid);
+ private interface OnBatteryConsumerSelectedListener {
+ void onBatteryConsumerSelected(String batteryConsumerId);
}
- public PowerConsumerPickerFragment(int pickerType) {
+ public BatteryConsumerPickerFragment(int pickerType) {
Bundle args = new Bundle();
args.putInt(PICKER_TYPE, pickerType);
setArguments(args);
}
- public PowerConsumerPickerFragment() {
+ public BatteryConsumerPickerFragment() {
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
- View view = inflater.inflate(R.layout.power_consumer_picker_layout, container, false);
+ View view = inflater.inflate(R.layout.battery_consumer_picker_layout, container, false);
mLoadingView = view.findViewById(R.id.loading_view);
mAppList = view.findViewById(R.id.list_view);
mAppList.setLayoutManager(new LinearLayoutManager(getContext()));
- mPowerConsumerListAdapter = new PowerConsumerListAdapter(
- PowerConsumerPickerFragment.this::setSelectedPowerConsumer);
- mAppList.setAdapter(mPowerConsumerListAdapter);
+ mBatteryConsumerListAdapter = new BatteryConsumerListAdapter(
+ BatteryConsumerPickerFragment.this::setSelectedBatteryConsumer);
+ mAppList.setAdapter(mBatteryConsumerListAdapter);
LoaderManager.getInstance(this).initLoader(0, getArguments(),
- new PowerConsumerListLoaderCallbacks());
+ new BatteryConsumerListLoaderCallbacks());
return view;
}
- public void setSelectedPowerConsumer(String id) {
- ((PowerConsumerPickerActivity) getActivity()).setSelectedPowerConsumer(id);
+ public void setSelectedBatteryConsumer(String id) {
+ ((BatteryConsumerPickerActivity) getActivity()).setSelectedBatteryConsumer(id);
}
- private static class PowerConsumerListLoader extends
- AsyncLoaderCompat<List<PowerConsumerInfo>> {
+ private static class BatteryConsumerListLoader extends
+ AsyncLoaderCompat<List<BatteryConsumerInfo>> {
private final BatteryStatsHelper mStatsHelper;
private final int mPickerType;
private final UserManager mUserManager;
private final PackageManager mPackageManager;
- PowerConsumerListLoader(Context context, int pickerType) {
+ BatteryConsumerListLoader(Context context, int pickerType) {
super(context);
mUserManager = context.getSystemService(UserManager.class);
mStatsHelper = new BatteryStatsHelper(context, false /* collectBatteryBroadcast */);
@@ -115,8 +115,8 @@ public class PowerConsumerPickerFragment extends Fragment {
}
@Override
- public List<PowerConsumerInfo> loadInBackground() {
- List<PowerConsumerInfoHelper.PowerConsumerInfo> powerConsumerList = new ArrayList<>();
+ public List<BatteryConsumerInfo> loadInBackground() {
+ List<BatteryConsumerInfo> batteryConsumerList = new ArrayList<>();
mStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId());
@@ -135,74 +135,75 @@ public class PowerConsumerPickerFragment extends Fragment {
}
}
- powerConsumerList.add(
- PowerConsumerInfoHelper.makePowerConsumerInfo(mPackageManager, sipper));
+ batteryConsumerList.add(
+ BatteryConsumerInfoHelper.makeBatteryConsumerInfo(mPackageManager, sipper));
}
- powerConsumerList.sort(
- Comparator.comparing((PowerConsumerInfo a) -> a.powerMah).reversed());
- return powerConsumerList;
+ batteryConsumerList.sort(
+ Comparator.comparing((BatteryConsumerInfo a) -> a.powerMah).reversed());
+ return batteryConsumerList;
}
@Override
- protected void onDiscardResult(List<PowerConsumerInfo> result) {
+ protected void onDiscardResult(List<BatteryConsumerInfo> result) {
}
}
- private class PowerConsumerListLoaderCallbacks implements
- LoaderManager.LoaderCallbacks<List<PowerConsumerInfo>> {
+ private class BatteryConsumerListLoaderCallbacks implements
+ LoaderManager.LoaderCallbacks<List<BatteryConsumerInfo>> {
@NonNull
@Override
- public Loader<List<PowerConsumerInfo>> onCreateLoader(int id, Bundle args) {
- return new PowerConsumerListLoader(getContext(), args.getInt(PICKER_TYPE));
+ public Loader<List<BatteryConsumerInfo>> onCreateLoader(int id, Bundle args) {
+ return new BatteryConsumerListLoader(getContext(), args.getInt(PICKER_TYPE));
}
@Override
- public void onLoadFinished(@NonNull Loader<List<PowerConsumerInfo>> loader,
- List<PowerConsumerInfoHelper.PowerConsumerInfo> powerConsumerList) {
- mPowerConsumerListAdapter.setPowerConsumerList(powerConsumerList);
+ public void onLoadFinished(@NonNull Loader<List<BatteryConsumerInfo>> loader,
+ List<BatteryConsumerInfo> batteryConsumerList) {
+ mBatteryConsumerListAdapter.setBatteryConsumerList(batteryConsumerList);
mAppList.setVisibility(View.VISIBLE);
mLoadingView.setVisibility(View.GONE);
}
@Override
public void onLoaderReset(
- @NonNull Loader<List<PowerConsumerInfoHelper.PowerConsumerInfo>> loader) {
+ @NonNull Loader<List<BatteryConsumerInfo>> loader) {
}
}
- public class PowerConsumerListAdapter extends RecyclerView.Adapter<PowerConsumerViewHolder> {
- private final OnPowerConsumerSelectedListener mListener;
- private List<PowerConsumerInfo> mPowerConsumerList;
+ public class BatteryConsumerListAdapter extends
+ RecyclerView.Adapter<BatteryConsumerViewHolder> {
+ private final OnBatteryConsumerSelectedListener mListener;
+ private List<BatteryConsumerInfo> mBatteryConsumerList;
- public PowerConsumerListAdapter(OnPowerConsumerSelectedListener listener) {
+ public BatteryConsumerListAdapter(OnBatteryConsumerSelectedListener listener) {
mListener = listener;
}
- void setPowerConsumerList(List<PowerConsumerInfo> powerConsumerList) {
- mPowerConsumerList = powerConsumerList;
+ void setBatteryConsumerList(List<BatteryConsumerInfo> batteryConsumerList) {
+ mBatteryConsumerList = batteryConsumerList;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
- return mPowerConsumerList.size();
+ return mBatteryConsumerList.size();
}
@NonNull
@Override
- public PowerConsumerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
+ public BatteryConsumerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup,
int position) {
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
- View view = layoutInflater.inflate(R.layout.power_consumer_info_layout, viewGroup,
+ View view = layoutInflater.inflate(R.layout.battery_consumer_info_layout, viewGroup,
false);
- return new PowerConsumerViewHolder(view, mListener);
+ return new BatteryConsumerViewHolder(view, mListener);
}
@Override
- public void onBindViewHolder(@NonNull PowerConsumerViewHolder viewHolder, int position) {
- PowerConsumerInfoHelper.PowerConsumerInfo item = mPowerConsumerList.get(position);
+ public void onBindViewHolder(@NonNull BatteryConsumerViewHolder viewHolder, int position) {
+ BatteryConsumerInfo item = mBatteryConsumerList.get(position);
viewHolder.id = item.id;
viewHolder.titleView.setText(item.label);
if (item.details != null) {
@@ -225,9 +226,9 @@ public class PowerConsumerPickerFragment extends Fragment {
}
// View Holder used when displaying apps
- public static class PowerConsumerViewHolder extends RecyclerView.ViewHolder
+ public static class BatteryConsumerViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
- private final OnPowerConsumerSelectedListener mListener;
+ private final OnBatteryConsumerSelectedListener mListener;
public String id;
public TextView titleView;
@@ -236,7 +237,7 @@ public class PowerConsumerPickerFragment extends Fragment {
public TextView packagesView;
public TextView powerView;
- PowerConsumerViewHolder(View view, OnPowerConsumerSelectedListener listener) {
+ BatteryConsumerViewHolder(View view, OnBatteryConsumerSelectedListener listener) {
super(view);
mListener = listener;
view.setOnClickListener(this);
@@ -250,7 +251,7 @@ public class PowerConsumerPickerFragment extends Fragment {
@Override
public void onClick(View v) {
- mListener.onPowerConsumerSelected(id);
+ mListener.onBatteryConsumerSelected(id);
}
}
}
diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java
index 91533913e35d..4978010f8591 100644
--- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java
+++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.android.frameworks.core.powerstatsviewer;
+package com.android.frameworks.core.batterystatsviewer;
import android.content.Context;
import android.content.SharedPreferences;
@@ -47,25 +47,25 @@ import java.util.Collections;
import java.util.List;
import java.util.Locale;
-public class PowerStatsViewerActivity extends ComponentActivity {
- private static final int POWER_STATS_REFRESH_RATE_MILLIS = 60 * 1000;
- public static final String PREF_SELECTED_POWER_CONSUMER = "powerConsumerId";
+public class BatteryStatsViewerActivity extends ComponentActivity {
+ private static final int BATTERY_STATS_REFRESH_RATE_MILLIS = 60 * 1000;
+ public static final String PREF_SELECTED_BATTERY_CONSUMER = "batteryConsumerId";
public static final int LOADER_BATTERY_STATS_HELPER = 0;
public static final int LOADER_BATTERY_USAGE_STATS = 1;
- private PowerStatsDataAdapter mPowerStatsDataAdapter;
- private Runnable mPowerStatsRefresh = this::periodicPowerStatsRefresh;
+ private BatteryStatsDataAdapter mBatteryStatsDataAdapter;
+ private Runnable mBatteryStatsRefresh = this::periodicBatteryStatsRefresh;
private SharedPreferences mSharedPref;
- private String mPowerConsumerId;
+ private String mBatteryConsumerId;
private TextView mTitleView;
private TextView mDetailsView;
private ImageView mIconView;
private TextView mPackagesView;
- private RecyclerView mPowerStatsDataView;
+ private RecyclerView mBatteryConsumerDataView;
private View mLoadingView;
private View mEmptyView;
private ActivityResultLauncher<Void> mStartAppPicker = registerForActivityResult(
- PowerConsumerPickerActivity.CONTRACT, this::onApplicationSelected);
+ BatteryConsumerPickerActivity.CONTRACT, this::onApplicationSelected);
private BatteryStatsHelper mBatteryStatsHelper;
private BatteryUsageStats mBatteryUsageStats;
@@ -75,7 +75,7 @@ public class PowerStatsViewerActivity extends ComponentActivity {
mSharedPref = getPreferences(Context.MODE_PRIVATE);
- setContentView(R.layout.power_stats_viewer_layout);
+ setContentView(R.layout.battery_stats_viewer_layout);
View appCard = findViewById(R.id.app_card);
appCard.setOnClickListener((e) -> startAppPicker());
@@ -85,17 +85,17 @@ public class PowerStatsViewerActivity extends ComponentActivity {
mIconView = findViewById(android.R.id.icon);
mPackagesView = findViewById(R.id.packages);
- mPowerStatsDataView = findViewById(R.id.power_stats_data_view);
- mPowerStatsDataView.setLayoutManager(new LinearLayoutManager(this));
- mPowerStatsDataAdapter = new PowerStatsDataAdapter();
- mPowerStatsDataView.setAdapter(mPowerStatsDataAdapter);
+ mBatteryConsumerDataView = findViewById(R.id.battery_consumer_data_view);
+ mBatteryConsumerDataView.setLayoutManager(new LinearLayoutManager(this));
+ mBatteryStatsDataAdapter = new BatteryStatsDataAdapter();
+ mBatteryConsumerDataView.setAdapter(mBatteryStatsDataAdapter);
mLoadingView = findViewById(R.id.loading_view);
mEmptyView = findViewById(R.id.empty_view);
- mPowerConsumerId = mSharedPref.getString(PREF_SELECTED_POWER_CONSUMER, null);
- loadPowerStats();
- if (mPowerConsumerId == null) {
+ mBatteryConsumerId = mSharedPref.getString(PREF_SELECTED_BATTERY_CONSUMER, null);
+ loadBatteryStats();
+ if (mBatteryConsumerId == null) {
startAppPicker();
}
}
@@ -103,38 +103,40 @@ public class PowerStatsViewerActivity extends ComponentActivity {
@Override
protected void onResume() {
super.onResume();
- periodicPowerStatsRefresh();
+ periodicBatteryStatsRefresh();
}
@Override
protected void onPause() {
super.onPause();
- getMainThreadHandler().removeCallbacks(mPowerStatsRefresh);
+ getMainThreadHandler().removeCallbacks(mBatteryStatsRefresh);
}
private void startAppPicker() {
mStartAppPicker.launch(null);
}
- private void onApplicationSelected(String powerConsumerId) {
- if (powerConsumerId == null) {
- if (mPowerConsumerId == null) {
+ private void onApplicationSelected(String batteryConsumerId) {
+ if (batteryConsumerId == null) {
+ if (mBatteryConsumerId == null) {
finish();
}
} else {
- mPowerConsumerId = powerConsumerId;
- mSharedPref.edit().putString(PREF_SELECTED_POWER_CONSUMER, mPowerConsumerId).apply();
+ mBatteryConsumerId = batteryConsumerId;
+ mSharedPref.edit()
+ .putString(PREF_SELECTED_BATTERY_CONSUMER, mBatteryConsumerId)
+ .apply();
mLoadingView.setVisibility(View.VISIBLE);
- loadPowerStats();
+ loadBatteryStats();
}
}
- private void periodicPowerStatsRefresh() {
- loadPowerStats();
- getMainThreadHandler().postDelayed(mPowerStatsRefresh, POWER_STATS_REFRESH_RATE_MILLIS);
+ private void periodicBatteryStatsRefresh() {
+ loadBatteryStats();
+ getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS);
}
- private void loadPowerStats() {
+ private void loadBatteryStats() {
LoaderManager loaderManager = LoaderManager.getInstance(this);
loaderManager.restartLoader(LOADER_BATTERY_STATS_HELPER, null,
new BatteryStatsHelperLoaderCallbacks());
@@ -171,7 +173,7 @@ public class PowerStatsViewerActivity extends ComponentActivity {
@NonNull
@Override
public Loader<BatteryStatsHelper> onCreateLoader(int id, Bundle args) {
- return new BatteryStatsHelperLoader(PowerStatsViewerActivity.this);
+ return new BatteryStatsHelperLoader(BatteryStatsViewerActivity.this);
}
@Override
@@ -207,7 +209,7 @@ public class PowerStatsViewerActivity extends ComponentActivity {
@NonNull
@Override
public Loader<BatteryUsageStats> onCreateLoader(int id, Bundle args) {
- return new BatteryUsageStatsLoader(PowerStatsViewerActivity.this);
+ return new BatteryUsageStatsLoader(BatteryStatsViewerActivity.this);
}
@Override
@@ -223,60 +225,60 @@ public class PowerStatsViewerActivity extends ComponentActivity {
public void onBatteryStatsHelperLoaded(BatteryStatsHelper batteryStatsHelper) {
mBatteryStatsHelper = batteryStatsHelper;
- onPowerStatsDataLoaded();
+ onBatteryStatsDataLoaded();
}
private void onBatteryUsageStatsLoaded(BatteryUsageStats batteryUsageStats) {
mBatteryUsageStats = batteryUsageStats;
- onPowerStatsDataLoaded();
+ onBatteryStatsDataLoaded();
}
- public void onPowerStatsDataLoaded() {
+ public void onBatteryStatsDataLoaded() {
if (mBatteryStatsHelper == null || mBatteryUsageStats == null) {
return;
}
- PowerStatsData powerStatsData = new PowerStatsData(this, mBatteryStatsHelper,
- mBatteryUsageStats, mPowerConsumerId);
+ BatteryConsumerData batteryConsumerData = new BatteryConsumerData(this, mBatteryStatsHelper,
+ mBatteryUsageStats, mBatteryConsumerId);
- PowerConsumerInfoHelper.PowerConsumerInfo
- powerConsumerInfo = powerStatsData.getPowerConsumerInfo();
- if (powerConsumerInfo == null) {
- mTitleView.setText("Power consumer not found");
+ BatteryConsumerInfoHelper.BatteryConsumerInfo
+ batteryConsumerInfo = batteryConsumerData.getBatteryConsumerInfo();
+ if (batteryConsumerInfo == null) {
+ mTitleView.setText("Battery consumer not found");
mPackagesView.setVisibility(View.GONE);
} else {
- mTitleView.setText(powerConsumerInfo.label);
- if (powerConsumerInfo.details != null) {
- mDetailsView.setText(powerConsumerInfo.details);
+ mTitleView.setText(batteryConsumerInfo.label);
+ if (batteryConsumerInfo.details != null) {
+ mDetailsView.setText(batteryConsumerInfo.details);
mDetailsView.setVisibility(View.VISIBLE);
} else {
mDetailsView.setVisibility(View.GONE);
}
mIconView.setImageDrawable(
- powerConsumerInfo.iconInfo.loadIcon(getPackageManager()));
+ batteryConsumerInfo.iconInfo.loadIcon(getPackageManager()));
- if (powerConsumerInfo.packages != null) {
- mPackagesView.setText(powerConsumerInfo.packages);
+ if (batteryConsumerInfo.packages != null) {
+ mPackagesView.setText(batteryConsumerInfo.packages);
mPackagesView.setVisibility(View.VISIBLE);
} else {
mPackagesView.setVisibility(View.GONE);
}
}
- mPowerStatsDataAdapter.setEntries(powerStatsData.getEntries());
- if (powerStatsData.getEntries().isEmpty()) {
+ mBatteryStatsDataAdapter.setEntries(batteryConsumerData.getEntries());
+ if (batteryConsumerData.getEntries().isEmpty()) {
mEmptyView.setVisibility(View.VISIBLE);
- mPowerStatsDataView.setVisibility(View.GONE);
+ mBatteryConsumerDataView.setVisibility(View.GONE);
} else {
mEmptyView.setVisibility(View.GONE);
- mPowerStatsDataView.setVisibility(View.VISIBLE);
+ mBatteryConsumerDataView.setVisibility(View.VISIBLE);
}
mLoadingView.setVisibility(View.GONE);
}
- private static class PowerStatsDataAdapter extends
- RecyclerView.Adapter<PowerStatsDataAdapter.ViewHolder> {
+ private static class BatteryStatsDataAdapter extends
+ RecyclerView.Adapter<BatteryStatsDataAdapter.ViewHolder> {
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView titleTextView;
public TextView amountTextView;
@@ -291,9 +293,9 @@ public class PowerStatsViewerActivity extends ComponentActivity {
}
}
- private List<PowerStatsData.Entry> mEntries = Collections.emptyList();
+ private List<BatteryConsumerData.Entry> mEntries = Collections.emptyList();
- public void setEntries(List<PowerStatsData.Entry> entries) {
+ public void setEntries(List<BatteryConsumerData.Entry> entries) {
mEntries = entries;
notifyDataSetChanged();
}
@@ -307,14 +309,14 @@ public class PowerStatsViewerActivity extends ComponentActivity {
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
- View itemView = layoutInflater.inflate(R.layout.power_stats_entry_layout, parent,
+ View itemView = layoutInflater.inflate(R.layout.battery_consumer_entry_layout, parent,
false);
return new ViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {
- PowerStatsData.Entry entry = mEntries.get(position);
+ BatteryConsumerData.Entry entry = mEntries.get(position);
switch (entry.entryType) {
case POWER:
viewHolder.titleTextView.setText(entry.title);
diff --git a/core/tests/powertests/OWNERS b/core/tests/batterystatstests/OWNERS
index c22f6a4bbbf6..c22f6a4bbbf6 100644
--- a/core/tests/powertests/OWNERS
+++ b/core/tests/batterystatstests/OWNERS
diff --git a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java
index 95da532045ac..4b0ed65e5fde 100644
--- a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java
+++ b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java
@@ -90,7 +90,7 @@ public class ApplicationPackageManagerTest extends TestCase {
private boolean mAllow3rdPartyOnInternal = true;
public MockedApplicationPackageManager() {
- super(null, null, null);
+ super(null, null);
}
public void setForceAllowOnExternal(boolean forceAllowOnExternal) {
diff --git a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java
new file mode 100755
index 000000000000..d8dc1eabe045
--- /dev/null
+++ b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.hdmi;
+
+import androidx.test.filters.SmallTest;
+
+import com.google.common.testing.EqualsTester;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link HdmiPortInfo} */
+@RunWith(JUnit4.class)
+@SmallTest
+public class HdmiPortInfoTest {
+
+ @Test
+ public void testEquals() {
+ int portId = 1;
+ int portType = 0;
+ int address = 0x123456;
+ boolean isCec = true;
+ boolean isMhl = false;
+ boolean isArcSupported = false;
+
+ new EqualsTester()
+ .addEqualityGroup(
+ new HdmiPortInfo(portId, portType, address, isCec, isMhl, isArcSupported),
+ new HdmiPortInfo(portId, portType, address, isCec, isMhl, isArcSupported))
+ .addEqualityGroup(
+ new HdmiPortInfo(
+ portId + 1, portType, address, isCec, isMhl, isArcSupported))
+ .addEqualityGroup(
+ new HdmiPortInfo(
+ portId, portType + 1, address, isCec, isMhl, isArcSupported))
+ .addEqualityGroup(
+ new HdmiPortInfo(
+ portId, portType, address + 1, isCec, isMhl, isArcSupported))
+ .addEqualityGroup(
+ new HdmiPortInfo(portId, portType, address, !isCec, isMhl, isArcSupported))
+ .addEqualityGroup(
+ new HdmiPortInfo(portId, portType, address, isCec, !isMhl, isArcSupported))
+ .addEqualityGroup(
+ new HdmiPortInfo(portId, portType, address, isCec, isMhl, !isArcSupported))
+ .testEquals();
+ }
+}
diff --git a/data/etc/car/com.android.car.provision.xml b/data/etc/car/com.android.car.provision.xml
index 7e77848ec337..4fd9cae53bd7 100644
--- a/data/etc/car/com.android.car.provision.xml
+++ b/data/etc/car/com.android.car.provision.xml
@@ -19,6 +19,7 @@
<permission name="android.car.permission.CAR_POWERTRAIN"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
<permission name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+ <permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MASTER_CLEAR"/>
<permission name="android.permission.QUERY_ALL_PACKAGES"/>
<permission name="android.permission.SEND_CATEGORY_CAR_NOTIFICATIONS"/>
diff --git a/data/etc/com.android.documentsui.xml b/data/etc/com.android.documentsui.xml
index 1e570ba9ac1c..d32cbecb16ec 100644
--- a/data/etc/com.android.documentsui.xml
+++ b/data/etc/com.android.documentsui.xml
@@ -22,5 +22,6 @@
<permission name="android.permission.LOG_COMPAT_CHANGE"/>
<permission name="android.permission.MODIFY_QUIET_MODE"/>
<permission name="android.permission.READ_COMPAT_CHANGE_CONFIG"/>
+ <permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"/>
</privapp-permissions>
</permissions>
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index c4300784f9b6..0a77be967ace 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -246,6 +246,7 @@ applications that come with the platform
<permission name="android.permission.REGISTER_STATS_PULL_ATOM" />
<!-- Permissions required for reading DeviceConfig -->
<permission name="android.permission.READ_DEVICE_CONFIG" />
+ <permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"/>
</privapp-permissions>
<privapp-permissions package="com.android.providers.telephony">
diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json
index 75b3babbc3a2..d8a735c78ca3 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -1063,6 +1063,12 @@
"group": "WM_DEBUG_TASKS",
"at": "com\/android\/server\/wm\/ActivityTaskSupervisor.java"
},
+ "-856590985": {
+ "message": "dcTarget: %s mImeRequester: %s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_IME",
+ "at": "com\/android\/server\/wm\/ImeInsetsSourceProvider.java"
+ },
"-856025122": {
"message": "SURFACE transparentRegionHint=%s: %s",
"level": "INFO",
@@ -1711,12 +1717,6 @@
"group": "WM_SHOW_TRANSACTIONS",
"at": "com\/android\/server\/wm\/Session.java"
},
- "-49129622": {
- "message": "performLayout: Activity exiting now removed %s",
- "level": "VERBOSE",
- "group": "WM_DEBUG_ADD_REMOVE",
- "at": "com\/android\/server\/wm\/TaskDisplayArea.java"
- },
"-33096143": {
"message": "applyAnimation: transition animation is disabled or skipped. container=%s",
"level": "VERBOSE",
@@ -1771,6 +1771,12 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
+ "44438983": {
+ "message": "performLayout: Activity exiting now removed %s",
+ "level": "VERBOSE",
+ "group": "WM_DEBUG_ADD_REMOVE",
+ "at": "com\/android\/server\/wm\/DisplayContent.java"
+ },
"45285419": {
"message": "startingWindow was set but startingSurface==null, couldn't remove",
"level": "VERBOSE",
@@ -1831,12 +1837,6 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowContextListenerController.java"
},
- "91350919": {
- "message": "Attempted to set IME flag to a display that does not exist: %d",
- "level": "WARN",
- "group": "WM_ERROR",
- "at": "com\/android\/server\/wm\/WindowManagerService.java"
- },
"94402792": {
"message": "Moving to RESUMED: %s (in existing)",
"level": "VERBOSE",
@@ -2383,12 +2383,6 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
- "632168013": {
- "message": "dcTarget: %s mImeTargetFromIme: %s",
- "level": "DEBUG",
- "group": "WM_DEBUG_IME",
- "at": "com\/android\/server\/wm\/ImeInsetsSourceProvider.java"
- },
"633654009": {
"message": "SURFACE POS (setPositionInTransaction) @ (%f,%f): %s",
"level": "INFO",
diff --git a/graphics/java/android/graphics/OWNERS b/graphics/java/android/graphics/OWNERS
index 61968890b837..c3fb6f8eba7c 100644
--- a/graphics/java/android/graphics/OWNERS
+++ b/graphics/java/android/graphics/OWNERS
@@ -4,3 +4,5 @@ romainguy@google.com
jreck@google.com
njawad@google.com
sumir@google.com
+
+per-file BLASTBufferQueue.java = file:/services/core/java/com/android/server/wm/OWNERS
diff --git a/keystore/java/android/security/KeyStoreOperation.java b/keystore/java/android/security/KeyStoreOperation.java
index 49a48871fd30..7ea9e1438845 100644
--- a/keystore/java/android/security/KeyStoreOperation.java
+++ b/keystore/java/android/security/KeyStoreOperation.java
@@ -17,7 +17,7 @@
package android.security;
import android.annotation.NonNull;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.security.keymaster.KeymasterDefs;
diff --git a/keystore/java/android/security/KeyStoreSecurityLevel.java b/keystore/java/android/security/KeyStoreSecurityLevel.java
index 7c3de8bee475..3ef4aa5b7ec3 100644
--- a/keystore/java/android/security/KeyStoreSecurityLevel.java
+++ b/keystore/java/android/security/KeyStoreSecurityLevel.java
@@ -18,7 +18,7 @@ package android.security;
import android.annotation.NonNull;
import android.app.compat.CompatChanges;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.os.RemoteException;
import android.os.ServiceSpecificException;
import android.security.keystore.BackendBusyException;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
index 69c7a2589d6f..0775a1a99886 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
@@ -17,7 +17,7 @@
package android.security.keystore2;
import android.annotation.NonNull;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.ArrayUtils;
import android.security.keystore.KeyProperties;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
index 2b5f6c31607b..bc56f015f3bd 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
@@ -18,7 +18,7 @@ package android.security.keystore2;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.KeyStoreException;
import android.security.KeyStoreOperation;
import android.security.keymaster.KeymasterDefs;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
index 18d26922f1ae..a3b04abfba3f 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
@@ -19,7 +19,7 @@ package android.security.keystore2;
import android.annotation.CallSuper;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.KeyStoreException;
import android.security.KeyStoreOperation;
import android.security.keymaster.KeymasterDefs;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java
index 2250c89aac41..d1ef1df817e6 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java
@@ -17,7 +17,7 @@
package android.security.keystore2;
import android.annotation.NonNull;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.KeyStoreException;
import android.security.KeyStoreOperation;
import android.security.keymaster.KeymasterDefs;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java
index eea45c287622..8475ad9fd57b 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java
@@ -16,7 +16,7 @@
package android.security.keystore2;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.KeyStoreException;
import android.security.KeyStoreOperation;
import android.security.keymaster.KeymasterDefs;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java
index 479fd8a6a73a..233f352989ab 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java
@@ -16,8 +16,8 @@
package android.security.keystore2;
-import android.hardware.keymint.KeyParameter;
-import android.hardware.keymint.SecurityLevel;
+import android.hardware.security.keymint.KeyParameter;
+import android.hardware.security.keymint.SecurityLevel;
import android.security.KeyStore2;
import android.security.KeyStoreSecurityLevel;
import android.security.keymaster.KeymasterArguments;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
index 61725e3e8c24..df0e1462a492 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -18,8 +18,8 @@ package android.security.keystore2;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.hardware.keymint.KeyParameter;
-import android.hardware.keymint.SecurityLevel;
+import android.hardware.security.keymint.KeyParameter;
+import android.hardware.security.keymint.SecurityLevel;
import android.os.Build;
import android.security.KeyPairGeneratorSpec;
import android.security.KeyStore2;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
index 2686ddc20c1d..951f91887894 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
@@ -18,7 +18,7 @@ package android.security.keystore2;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.KeyProperties;
import android.security.keystore.KeymasterUtils;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java
index 444dad4cffbe..ab7559116a41 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java
@@ -17,7 +17,7 @@
package android.security.keystore2;
import android.annotation.NonNull;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.KeyProperties;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java
index a168f8feb3db..9b4f01e744f7 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java
@@ -18,7 +18,7 @@ package android.security.keystore2;
import android.annotation.CallSuper;
import android.annotation.NonNull;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.KeyStoreException;
import android.security.KeyStoreOperation;
import android.security.keymaster.KeymasterDefs;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
index 9790a4ae5b65..aca531458382 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
@@ -18,9 +18,9 @@ package android.security.keystore2;
import android.annotation.NonNull;
import android.hardware.biometrics.BiometricManager;
-import android.hardware.keymint.HardwareAuthenticatorType;
-import android.hardware.keymint.KeyParameter;
-import android.hardware.keymint.SecurityLevel;
+import android.hardware.security.keymint.HardwareAuthenticatorType;
+import android.hardware.security.keymint.KeyParameter;
+import android.hardware.security.keymint.SecurityLevel;
import android.security.GateKeeper;
import android.security.KeyStore2;
import android.security.KeyStoreParameter;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
index a2d4528b99fd..4d4b0d8f183b 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
@@ -18,7 +18,7 @@ package android.security.keystore2;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.hardware.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameter;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.ArrayUtils;
import android.security.keystore.KeyProperties;
diff --git a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
index 8fa532b6e188..18c786aa3093 100644
--- a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
+++ b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
@@ -18,8 +18,8 @@ package android.security.keystore2;
import android.annotation.NonNull;
import android.hardware.biometrics.BiometricManager;
-import android.hardware.keymint.KeyParameter;
-import android.hardware.keymint.SecurityLevel;
+import android.hardware.security.keymint.KeyParameter;
+import android.hardware.security.keymint.SecurityLevel;
import android.security.GateKeeper;
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.KeyProperties;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java
index d65ad62cdbbb..a944e3bc50cf 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java
@@ -63,6 +63,16 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
private String mStartOneHandedDescription;
private String mStopOneHandedDescription;
+ private enum ONE_HANDED_TRIGGER_STATE {
+ UNSET, ENTERING, EXITING
+ }
+ /**
+ * Current One-Handed trigger state.
+ * Note: This is a dynamic state, whenever last state has been confirmed
+ * (i.e. onStartFinished() or onStopFinished()), the state should be set "UNSET" at final.
+ */
+ private ONE_HANDED_TRIGGER_STATE mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET;
+
/**
* Container of the tutorial panel showing at outside region when one handed starting
*/
@@ -74,6 +84,21 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
public void onTutorialAnimationUpdate(int offset) {
mUpdateHandler.post(() -> onAnimationUpdate(offset));
}
+
+ @Override
+ public void onOneHandedAnimationStart(
+ OneHandedAnimationController.OneHandedTransitionAnimator animator) {
+ mUpdateHandler.post(() -> {
+ final Rect startValue = (Rect) animator.getStartValue();
+ if (mTriggerState == ONE_HANDED_TRIGGER_STATE.UNSET) {
+ mTriggerState = (startValue.top == 0)
+ ? ONE_HANDED_TRIGGER_STATE.ENTERING : ONE_HANDED_TRIGGER_STATE.EXITING;
+ if (mCanShowTutorial && mTriggerState == ONE_HANDED_TRIGGER_STATE.ENTERING) {
+ createTutorialTarget();
+ }
+ }
+ });
+ }
};
public OneHandedTutorialHandler(Context context) {
@@ -100,9 +125,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
R.string.accessibility_action_start_one_handed);
mStopOneHandedDescription = context.getResources().getString(
R.string.accessibility_action_stop_one_handed);
- if (mCanShowTutorial) {
- createOrUpdateTutorialTarget();
- }
}
@Override
@@ -111,6 +133,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
updateFinished(View.VISIBLE, 0f);
updateTutorialCount();
announcementForScreenReader(true);
+ mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET;
});
}
@@ -119,6 +142,8 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
mUpdateHandler.post(() -> {
updateFinished(View.INVISIBLE, -mTargetViewContainer.getHeight());
announcementForScreenReader(false);
+ removeTutorialFromWindowManager();
+ mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET;
});
}
@@ -126,7 +151,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
if (!canShowTutorial()) {
return;
}
-
mTargetViewContainer.setVisibility(visible);
mTargetViewContainer.setTranslationY(finalPosition);
}
@@ -155,24 +179,23 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
* Adds the tutorial target view to the WindowManager and update its layout, so it's ready
* to be animated in.
*/
- private void createOrUpdateTutorialTarget() {
- mUpdateHandler.post(() -> {
- if (!mTargetViewContainer.isAttachedToWindow()) {
- mTargetViewContainer.setVisibility(View.INVISIBLE);
-
- try {
- mWindowManager.addView(mTargetViewContainer, getTutorialTargetLayoutParams());
- } catch (IllegalStateException e) {
- // This shouldn't happen, but if the target is already added, just update its
- // layout params.
- mWindowManager.updateViewLayout(
- mTargetViewContainer, getTutorialTargetLayoutParams());
- }
- } else {
- mWindowManager.updateViewLayout(mTargetViewContainer,
- getTutorialTargetLayoutParams());
+ private void createTutorialTarget() {
+ if (!mTargetViewContainer.isAttachedToWindow()) {
+ try {
+ mWindowManager.addView(mTargetViewContainer, getTutorialTargetLayoutParams());
+ } catch (IllegalStateException e) {
+ // This shouldn't happen, but if the target is already added, just update its
+ // layout params.
+ mWindowManager.updateViewLayout(
+ mTargetViewContainer, getTutorialTargetLayoutParams());
}
- });
+ }
+ }
+
+ private void removeTutorialFromWindowManager() {
+ if (mTargetViewContainer.isAttachedToWindow()) {
+ mWindowManager.removeViewImmediate(mTargetViewContainer);
+ }
}
OneHandedAnimationCallback getAnimationCallback() {
@@ -193,7 +216,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS;
lp.setFitInsetsTypes(0 /* types */);
lp.setTitle("one-handed-tutorial-overlay");
-
return lp;
}
@@ -206,10 +228,12 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback {
private boolean canShowTutorial() {
if (!mCanShowTutorial) {
+ // Since canSHowTutorial() will be called in onAnimationUpdate() and we still need to
+ // hide Tutorial text in the period of continuously onAnimationUpdate() API call,
+ // so we have to hide mTargetViewContainer here.
mTargetViewContainer.setVisibility(View.GONE);
return false;
}
-
return true;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java
index eb82357f2dea..71710af4ffb5 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java
@@ -26,6 +26,7 @@ import android.annotation.Nullable;
import android.graphics.Rect;
import android.os.Handler;
import android.util.Slog;
+import android.view.Choreographer;
import android.view.SurfaceControl;
import android.window.TaskOrganizer;
import android.window.WindowContainerToken;
@@ -338,6 +339,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor
SurfaceControl.Transaction t = mTransactionPool.acquire();
float value = (float) animation.getAnimatedValue();
onProgress(value, t);
+ t.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId());
t.apply();
mTransactionPool.release(t);
});
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java
index c6496ad6246f..ba071666b5aa 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java
@@ -37,6 +37,7 @@ import android.os.Handler;
import android.os.RemoteException;
import android.util.AttributeSet;
import android.util.Slog;
+import android.view.Choreographer;
import android.view.Display;
import android.view.MotionEvent;
import android.view.PointerIcon;
@@ -1108,6 +1109,7 @@ public class DividerView extends FrameLayout implements OnTouchListener,
}
resizeSplitSurfaces(t, mDockedRect, mDockedTaskRect, mOtherRect, mOtherTaskRect);
if (ownTransaction) {
+ t.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId());
t.apply();
mTiles.releaseTransaction(t);
}
diff --git a/libs/hwui/jni/Typeface.cpp b/libs/hwui/jni/Typeface.cpp
index a2964d6627a1..10c80774fd16 100644
--- a/libs/hwui/jni/Typeface.cpp
+++ b/libs/hwui/jni/Typeface.cpp
@@ -14,6 +14,7 @@
* limitations under the License.
*/
+#define ATRACE_TAG ATRACE_TAG_VIEW
#include "FontUtils.h"
#include "GraphicsJNI.h"
#include "fonts/Font.h"
@@ -25,8 +26,13 @@
#include <minikin/FontCollection.h>
#include <minikin/FontFamily.h>
#include <minikin/SystemFonts.h>
+#include <utils/TraceUtils.h>
+
+#include <mutex>
+#include <unordered_map>
using namespace android;
+using android::uirenderer::TraceUtils;
static inline Typeface* toTypeface(jlong ptr) {
return reinterpret_cast<Typeface*>(ptr);
@@ -149,6 +155,20 @@ static void Typeface_registerGenericFamily(JNIEnv *env, jobject, jstring familyN
toTypeface(ptr)->fFontCollection);
}
+static sk_sp<SkData> makeSkDataCached(const std::string& path) {
+ // We don't clear cache as Typeface objects created by Typeface_readTypefaces() will be stored
+ // in a static field and will not be garbage collected.
+ static std::unordered_map<std::string, sk_sp<SkData>> cache;
+ static std::mutex mutex;
+ ALOG_ASSERT(!path.empty());
+ std::lock_guard lock{mutex};
+ sk_sp<SkData>& entry = cache[path];
+ if (entry.get() == nullptr) {
+ entry = SkData::MakeFromFileName(path.c_str());
+ }
+ return entry;
+}
+
static std::function<std::shared_ptr<minikin::MinikinFont>()> readMinikinFontSkia(
minikin::BufferReader* reader) {
std::string_view fontPath = reader->readString();
@@ -158,8 +178,9 @@ static std::function<std::shared_ptr<minikin::MinikinFont>()> readMinikinFontSki
std::tie(axesPtr, axesCount) = reader->readArray<minikin::FontVariation>();
return [fontPath, fontIndex, axesPtr, axesCount]() -> std::shared_ptr<minikin::MinikinFont> {
std::string path(fontPath.data(), fontPath.size());
- sk_sp<SkData> data = SkData::MakeFromFileName(path.c_str());
- if (data == nullptr) {
+ ATRACE_FORMAT("Loading font %s", path.c_str());
+ sk_sp<SkData> data = makeSkDataCached(path);
+ if (data.get() == nullptr) {
// This may happen if:
// 1. When the process failed to open the file (e.g. invalid path or permission).
// 2. When the process failed to map the file (e.g. hitting max_map_count limit).
diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java
index 47ecbd80a07f..a7e9a0de538a 100644
--- a/location/java/android/location/Location.java
+++ b/location/java/android/location/Location.java
@@ -1049,11 +1049,7 @@ public class Location implements Parcelable {
* <ul>
* <li> satellites - the number of satellites used to derive the fix
* </ul>
- *
- * @deprecated Do not use. For GNSS related information, prefer listening for GNSS status
- * information via {@link LocationManager}.
*/
- @Deprecated
public Bundle getExtras() {
return mExtras;
}
@@ -1063,10 +1059,7 @@ public class Location implements Parcelable {
*
* <p>Note this stores a copy of the given extras, so any changes to extras after calling this
* method won't be reflected in the location bundle.
- *
- * @deprecated Do not use.
*/
- @Deprecated
public void setExtras(@Nullable Bundle extras) {
mExtras = (extras == null) ? null : new Bundle(extras);
}
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 7085a755990f..914beaff225e 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -159,21 +159,21 @@ public class LocationManager {
public static final long BLOCK_GPS_STATUS_USAGE = 144027538L;
/**
- * Name of the network location provider.
+ * Standard name of the network location provider.
*
- * <p>This provider determines location based on nearby of cell tower and WiFi access points.
- * Results are retrieved by means of a network lookup.
+ * <p>If present, this provider determines location based on nearby of cell tower and WiFi
+ * access points. Operation of this provider may require a data connection.
*/
public static final String NETWORK_PROVIDER = "network";
/**
- * Name of the GNSS location provider.
+ * Standard name of the GNSS location provider.
*
- * <p>This provider determines location using GNSS satellites. Depending on conditions, this
- * provider may take a while to return a location fix. Requires the
- * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission.
+ * <p>If present, this provider determines location using GNSS satellites. The responsiveness
+ * and accuracy of location fixes may depend on GNSS signal conditions.
*
- * <p>The extras Bundle for the GPS location provider can contain the following key/value pairs:
+ * <p>The extras Bundle for locations derived by this location provider may contain the
+ * following key/value pairs:
* <ul>
* <li> satellites - the number of satellites used to derive the fix
* </ul>
@@ -181,29 +181,22 @@ public class LocationManager {
public static final String GPS_PROVIDER = "gps";
/**
- * A special location provider for receiving locations without actually initiating a location
- * fix.
+ * A special location provider for receiving locations without actively initiating a location
+ * fix. This location provider is always present.
*
* <p>This provider can be used to passively receive location updates when other applications or
* services request them without actually requesting the locations yourself. This provider will
- * only return locations generated by other providers. You can query the
- * {@link Location#getProvider()} method to determine the actual provider that supplied the
- * location update. Requires the {@link android.Manifest.permission#ACCESS_FINE_LOCATION}
- * permission, although there is no guarantee of fine locations.
+ * only return locations generated by other providers.
*/
public static final String PASSIVE_PROVIDER = "passive";
/**
- * The fused location provider.
- *
- * <p>This provider may combine inputs from several location sources to provide the
- * best possible location fix. It is implicitly used for all API's that involve the
- * {@link LocationRequest} object.
+ * Standard name of the fused location provider.
*
- * @hide
+ * <p>If present, this provider may combine inputs from several other location providers to
+ * provide the best possible location fix. It is implicitly used for all requestLocationUpdates
+ * APIs that involve a {@link Criteria}.
*/
- @SystemApi
- @TestApi
public static final String FUSED_PROVIDER = "fused";
/**
@@ -918,6 +911,9 @@ public class LocationManager {
/**
* Register for a single location update using a Criteria and a callback.
*
+ * <p>Note: Since Android KitKat, Criteria requests will always result in using the
+ * {@link #FUSED_PROVIDER}.
+ *
* <p>See {@link #requestLocationUpdates(long, float, Criteria, PendingIntent)} for more detail
* on how to use this method.
*
@@ -985,6 +981,9 @@ public class LocationManager {
/**
* Register for a single location update using a Criteria and pending intent.
*
+ * <p>Note: Since Android KitKat, Criteria requests will always result in using the
+ * {@link #FUSED_PROVIDER}.
+ *
* <p>See {@link #requestLocationUpdates(long, float, Criteria, PendingIntent)} for more detail
* on how to use this method.
*
@@ -1113,6 +1112,9 @@ public class LocationManager {
* Register for location updates using a provider selected through the given Criteria, and a
* callback on the specified {@link Looper}.
*
+ * <p>Note: Since Android KitKat, Criteria requests will always result in using the
+ * {@link #FUSED_PROVIDER}.
+ *
* <p>See {@link #requestLocationUpdates(String, LocationRequest, Executor, LocationListener)}
* for more detail on how this method works.
*
@@ -1124,7 +1126,12 @@ public class LocationManager {
* @throws IllegalArgumentException if criteria is null
* @throws IllegalArgumentException if listener is null
* @throws SecurityException if no suitable permission is present
+ *
+ * @deprecated Use
+ * {@link #requestLocationUpdates(String, long, float, LocationListener, Looper)} instead to
+ * explicitly select a provider.
*/
+ @Deprecated
@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
public void requestLocationUpdates(long minTimeMs, float minDistanceM,
@NonNull Criteria criteria, @NonNull LocationListener listener,
@@ -1138,6 +1145,9 @@ public class LocationManager {
* Register for location updates using a provider selected through the given Criteria, and a
* callback on the specified {@link Executor}.
*
+ * <p>Note: Since Android KitKat, Criteria requests will always result in using the
+ * {@link #FUSED_PROVIDER}.
+ *
* <p>See {@link #requestLocationUpdates(String, LocationRequest, Executor, LocationListener)}
* for more detail on how this method works.
*
@@ -1151,7 +1161,12 @@ public class LocationManager {
* @throws IllegalArgumentException if executor is null
* @throws IllegalArgumentException if listener is null
* @throws SecurityException if no suitable permission is present
+ *
+ * @deprecated Use
+ * {@link #requestLocationUpdates(String, long, float, Executor, LocationListener)} instead to
+ * explicitly select a provider.
*/
+ @Deprecated
@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
public void requestLocationUpdates(
long minTimeMs,
@@ -1199,6 +1214,9 @@ public class LocationManager {
* Register for location updates using a provider selected through the given Criteria, and
* callbacks delivered via the provided {@link PendingIntent}.
*
+ * <p>Note: Since Android KitKat, Criteria requests will always result in using the
+ * {@link #FUSED_PROVIDER}.
+ *
* <p>See {@link #requestLocationUpdates(String, long, float, PendingIntent)} for more detail on
* how this method works.
*
@@ -1210,7 +1228,11 @@ public class LocationManager {
* @throws IllegalArgumentException if provider is null or doesn't exist
* @throws IllegalArgumentException if pendingIntent is null
* @throws SecurityException if no suitable permission is present
+ *
+ * @deprecated Use {@link #requestLocationUpdates(String, long, float, PendingIntent)} instead
+ * to explicitly select a provider.
*/
+ @Deprecated
@RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION})
public void requestLocationUpdates(long minTimeMs, float minDistanceM,
@NonNull Criteria criteria, @NonNull PendingIntent pendingIntent) {
@@ -1594,9 +1616,8 @@ public class LocationManager {
}
/**
- * Returns a list of the names of all known location providers. All providers are returned,
- * including ones that are not permitted to be accessed by the calling activity or are currently
- * disabled.
+ * Returns a list of the names of all available location providers. All providers are returned,
+ * including those that are currently disabled.
*
* @return list of provider names
*/
@@ -1609,8 +1630,8 @@ public class LocationManager {
}
/**
- * Returns a list of the names of location providers. Only providers that the caller has
- * permission to access will be returned.
+ * Returns a list of the names of available location providers. If {@code enabledOnly} is false,
+ * this is functionally the same as {@link #getAllProviders()}.
*
* @param enabledOnly if true then only enabled providers are included
* @return list of provider names
@@ -1624,8 +1645,7 @@ public class LocationManager {
}
/**
- * Returns a list of the names of providers that satisfy the given criteria. Only providers that
- * the caller has permission to access will be returned.
+ * Returns a list of the names of available location providers that satisfy the given criteria.
*
* @param criteria the criteria that providers must match
* @param enabledOnly if true then only enabled providers are included
diff --git a/location/java/android/location/OWNERS b/location/java/android/location/OWNERS
index 383321bc3d69..60321448a58a 100644
--- a/location/java/android/location/OWNERS
+++ b/location/java/android/location/OWNERS
@@ -1,6 +1,6 @@
# Bug component: 880425
-mstogaitis@google.com
+sooniln@google.com
wyattriley@google.com
-etn@google.com
+yuhany@google.com
weiwa@google.com
diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java
index d094c2cd3c63..20f02a46ea63 100644
--- a/media/java/android/media/tv/tuner/Tuner.java
+++ b/media/java/android/media/tv/tuner/Tuner.java
@@ -279,6 +279,7 @@ public class Tuner implements AutoCloseable {
@Nullable
private FrontendInfo mFrontendInfo;
private Integer mFrontendHandle;
+ private Boolean mIsSharedFrontend = false;
private int mFrontendType = FrontendSettings.TYPE_UNDEFINED;
private int mUserId;
private Lnb mLnb;
@@ -441,8 +442,11 @@ public class Tuner implements AutoCloseable {
*/
public void shareFrontendFromTuner(@NonNull Tuner tuner) {
mTunerResourceManager.shareFrontend(mClientId, tuner.mClientId);
- mFrontendHandle = tuner.mFrontendHandle;
- mFrontend = nativeOpenFrontendByHandle(mFrontendHandle);
+ synchronized (mIsSharedFrontend) {
+ mFrontendHandle = tuner.mFrontendHandle;
+ mFrontend = tuner.mFrontend;
+ mIsSharedFrontend = true;
+ }
}
/**
@@ -473,14 +477,19 @@ public class Tuner implements AutoCloseable {
private void releaseAll() {
if (mFrontendHandle != null) {
- int res = nativeCloseFrontend(mFrontendHandle);
- if (res != Tuner.RESULT_SUCCESS) {
- TunerUtils.throwExceptionForResult(res, "failed to close frontend");
+ synchronized (mIsSharedFrontend) {
+ if (!mIsSharedFrontend) {
+ int res = nativeCloseFrontend(mFrontendHandle);
+ if (res != Tuner.RESULT_SUCCESS) {
+ TunerUtils.throwExceptionForResult(res, "failed to close frontend");
+ }
+ }
+ mIsSharedFrontend = false;
}
mTunerResourceManager.releaseFrontend(mFrontendHandle, mClientId);
FrameworkStatsLog
.write(FrameworkStatsLog.TV_TUNER_STATE_CHANGED, mUserId,
- FrameworkStatsLog.TV_TUNER_STATE_CHANGED__STATE__UNKNOWN);
+ FrameworkStatsLog.TV_TUNER_STATE_CHANGED__STATE__UNKNOWN);
mFrontendHandle = null;
mFrontend = null;
}
diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp
index 126897a908f8..ddc51cdb861c 100644
--- a/media/jni/android_media_MediaMetadataRetriever.cpp
+++ b/media/jni/android_media_MediaMetadataRetriever.cpp
@@ -464,11 +464,13 @@ static jobject android_media_MediaMetadataRetriever_getThumbnailImageAtIndex(
|| thumbPixels * 6 >= maxPixels) {
frameMemory = retriever->getImageAtIndex(
index, colorFormat, false /*metaOnly*/, true /*thumbnail*/);
- // TODO: Using unsecurePointer() has some associated security pitfalls
- // (see declaration for details).
- // Either document why it is safe in this case or address the
- // issue (e.g. by copying).
- videoFrame = static_cast<VideoFrame *>(frameMemory->unsecurePointer());
+ if (frameMemory != 0) {
+ // TODO: Using unsecurePointer() has some associated security pitfalls
+ // (see declaration for details).
+ // Either document why it is safe in this case or address the
+ // issue (e.g. by copying).
+ videoFrame = static_cast<VideoFrame *>(frameMemory->unsecurePointer());
+ }
if (thumbPixels > maxPixels) {
int downscale = ceil(sqrt(thumbPixels / (float)maxPixels));
diff --git a/media/native/midi/amidi.cpp b/media/native/midi/amidi.cpp
index 35c4d42a0aa8..923377c8180e 100644
--- a/media/native/midi/amidi.cpp
+++ b/media/native/midi/amidi.cpp
@@ -131,7 +131,7 @@ static media_status_t AMIDI_getDeviceInfo(const AMidiDevice *device,
MidiDeviceInfo deviceInfo;
Status txResult = device->server->getDeviceInfo(&deviceInfo);
if (!txResult.isOk()) {
- ALOGE("AMIDI_getDeviceInfo transaction error: %d", txResult.transactionError());
+ ALOGE("%s server exception code: %d", __func__, txResult.exceptionCode());
return AMEDIA_ERROR_UNKNOWN;
}
@@ -253,7 +253,7 @@ static media_status_t AMIDI_openPort(const AMidiDevice *device, int32_t portNumb
? device->server->openOutputPort(portToken, portNumber, &ufd)
: device->server->openInputPort(portToken, portNumber, &ufd);
if (!txResult.isOk()) {
- ALOGE("AMIDI_openPort transaction error: %d", txResult.transactionError());
+ ALOGE("%s server exception code: %d", __func__, txResult.exceptionCode());
return AMEDIA_ERROR_UNKNOWN;
}
@@ -282,7 +282,7 @@ static void AMIDI_closePort(AMIDI_Port *port) {
Status txResult = port->device->server->closePort(port->binderToken);
if (!txResult.isOk()) {
- ALOGE("Transaction error closing MIDI port:%d", txResult.transactionError());
+ ALOGE("%s server exception code: %d", __func__, txResult.exceptionCode());
}
delete port;
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index cb1faf5e5163..af775cc64ae1 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -364,6 +364,9 @@
<!-- Permissions required for CTS tests to close system dialogs -->
<uses-permission android:name="android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS" />
+ <!-- Permission required for CTS test - HideOverlayWindowsTest -->
+ <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
index 0fd47654ebb9..c289ca2173be 100644
--- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java
@@ -438,7 +438,8 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon
}
@Override
- public void onOpNoted(int code, int uid, String packageName, int result) {
+ public void onOpNoted(int code, int uid, String packageName,
+ @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result) {
if (DEBUG) {
Log.w(TAG, "Noted op: " + code + " with result "
+ AppOpsManager.MODE_NAMES[result] + " for package " + packageName);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index c89f8e58f980..6074ef6156c3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -252,11 +252,9 @@ public class QuickQSPanel extends QSPanel {
final int availableWidth = getMeasuredWidth() - getPaddingStart() - getPaddingEnd();
final int leftoverWhitespace = availableWidth - maxTiles * mCellWidth;
- final int smallestHorizontalMarginNeeded;
- smallestHorizontalMarginNeeded = leftoverWhitespace / Math.max(1, maxTiles - 1);
- if (smallestHorizontalMarginNeeded > 0){
- mCellMarginHorizontal = smallestHorizontalMarginNeeded;
+ if (leftoverWhitespace > 0) {
+ mCellMarginHorizontal = leftoverWhitespace / Math.max(1, maxTiles);
mColumns = maxTiles;
} else{
mColumns = mCellWidth == 0 ? 1 :
@@ -266,7 +264,7 @@ public class QuickQSPanel extends QSPanel {
mCellMarginHorizontal = (availableWidth - mCellWidth) / 2;
} else {
mCellMarginHorizontal =
- (availableWidth - mColumns * mCellWidth) / (mColumns - 1);
+ (availableWidth - mColumns * mCellWidth) / mColumns;
}
}
@@ -310,7 +308,8 @@ public class QuickQSPanel extends QSPanel {
// Only one column/tile. Use the margin to center the tile.
return getPaddingStart() + mCellMarginHorizontal;
}
- return getPaddingStart() + column * (mCellWidth + mCellMarginHorizontal);
+ return getPaddingStart() + mCellMarginHorizontal / 2
+ + column * (mCellWidth + mCellMarginHorizontal);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
index 547a3705266a..6bdc303b4786 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java
@@ -37,6 +37,7 @@ import androidx.annotation.Nullable;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardSecurityModel;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.settingslib.Utils;
@@ -78,6 +79,7 @@ public class LockscreenLockIconController {
private final KeyguardStateController mKeyguardStateController;
private final Resources mResources;
private final HeadsUpManagerPhone mHeadsUpManagerPhone;
+ private final KeyguardSecurityModel mKeyguardSecurityModel;
private boolean mKeyguardShowing;
private boolean mKeyguardJustShown;
private boolean mBlockUpdates;
@@ -326,7 +328,8 @@ public class LockscreenLockIconController {
@Nullable DockManager dockManager,
KeyguardStateController keyguardStateController,
@Main Resources resources,
- HeadsUpManagerPhone headsUpManagerPhone) {
+ HeadsUpManagerPhone headsUpManagerPhone,
+ KeyguardSecurityModel keyguardSecurityModel) {
mLockscreenGestureLogger = lockscreenGestureLogger;
mKeyguardUpdateMonitor = keyguardUpdateMonitor;
mLockPatternUtils = lockPatternUtils;
@@ -341,6 +344,7 @@ public class LockscreenLockIconController {
mKeyguardStateController = keyguardStateController;
mResources = resources;
mHeadsUpManagerPhone = headsUpManagerPhone;
+ mKeyguardSecurityModel = keyguardSecurityModel;
mKeyguardIndicationController.setLockIconController(this);
}
@@ -541,13 +545,20 @@ public class LockscreenLockIconController {
* @return true if the visibility changed
*/
private boolean updateIconVisibility() {
+ if (mLockIcon == null) {
+ return false;
+ }
+
if (mKeyguardUpdateMonitor.isUdfpsEnrolled()) {
boolean changed = mLockIcon.getVisibility() == GONE;
mLockIcon.setVisibility(GONE);
return changed;
}
+
boolean onAodOrDocked = mStatusBarStateController.isDozing() || mDocked;
- boolean invisible = onAodOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance;
+ boolean invisible = onAodOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance
+ || (mKeyguardSecurityModel.getSecurityMode(KeyguardUpdateMonitor.getCurrentUser())
+ == KeyguardSecurityModel.SecurityMode.None);
boolean fingerprintOrBypass = mFingerprintUnlock
|| mKeyguardBypassController.getBypassEnabled();
if (fingerprintOrBypass && !mBouncerShowingScrimmed) {
@@ -559,11 +570,6 @@ public class LockscreenLockIconController {
invisible = true;
}
}
-
- if (mLockIcon == null) {
- return false;
- }
-
return mLockIcon.updateIconVisibility(!invisible);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
index ade329011b7d..02143a750cae 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java
@@ -150,7 +150,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.onOpActiveChanged(
AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
mTestableLooper.processAllMessages();
verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
TEST_UID, TEST_PACKAGE_NAME, true);
@@ -204,7 +204,8 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
TEST_UID, TEST_PACKAGE_NAME, true);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
- TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+ TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.OP_FLAG_SELF,
+ AppOpsManager.MODE_ALLOWED);
assertEquals(3, mController.getActiveAppOps().size());
}
@@ -215,7 +216,8 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
- TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
+ TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.OP_FLAG_SELF,
+ AppOpsManager.MODE_ALLOWED);
assertEquals(2,
mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID)).size());
assertEquals(1,
@@ -246,7 +248,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
public void opNotedScheduledForRemoval() {
mController.setBGHandler(mMockHandler);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
verify(mMockHandler).scheduleRemoval(any(AppOpItem.class), anyLong());
}
@@ -258,7 +260,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.onOpActiveChanged(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
true);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
assertFalse(mController.getActiveAppOps().isEmpty());
mController.setListening(false);
@@ -272,9 +274,9 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.setBGHandler(mMockHandler);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
// Only one post to notify subscribers
verify(mMockHandler, times(1)).post(any());
@@ -288,9 +290,9 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.setBGHandler(mMockHandler);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
// Only one post to notify subscribers
verify(mMockHandler, times(2)).scheduleRemoval(any(), anyLong());
@@ -308,7 +310,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
// Check that we "scheduled" the removal. Don't actually schedule until we are ready to
// process messages at a later time.
@@ -337,7 +339,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
mController.onOpActiveChanged(
AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
@@ -366,7 +368,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
mController.onOpActiveChanged(
AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
@@ -384,7 +386,7 @@ public class AppOpsControllerTest extends SysuiTestCase {
AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true);
mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
- AppOpsManager.MODE_ALLOWED);
+ AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED);
mTestableLooper.processAllMessages();
verify(mCallback).onActiveStateChanged(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java
index aca34242e5fa..1ac793730f02 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java
@@ -30,6 +30,7 @@ import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;
import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardSecurityModel;
import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.dock.DockManager;
@@ -80,6 +81,8 @@ public class LockscreenIconControllerTest extends SysuiTestCase {
private Resources mResources;
@Mock
private HeadsUpManagerPhone mHeadsUpManagerPhone;
+ @Mock
+ private KeyguardSecurityModel mKeyguardSecurityModel;
private LockscreenLockIconController mLockIconController;
private OnAttachStateChangeListener mOnAttachStateChangeListener;
@@ -94,7 +97,7 @@ public class LockscreenIconControllerTest extends SysuiTestCase {
mShadeController, mAccessibilityController, mKeyguardIndicationController,
mStatusBarStateController, mConfigurationController, mNotificationWakeUpCoordinator,
mKeyguardBypassController, mDockManager, mKeyguardStateController, mResources,
- mHeadsUpManagerPhone);
+ mHeadsUpManagerPhone, mKeyguardSecurityModel);
ArgumentCaptor<OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor =
ArgumentCaptor.forClass(OnAttachStateChangeListener.class);
@@ -139,6 +142,15 @@ public class LockscreenIconControllerTest extends SysuiTestCase {
sBStateListenerCaptor.getValue().onDozingChanged(true);
verify(mLockIcon).updateIconVisibility(false);
+ }
+
+ @Test
+ public void testVisibility_noBouncer() {
+ // no security (ie: no lock screen OR swipe to unlock)
+ when(mKeyguardSecurityModel.getSecurityMode(anyInt())).thenReturn(
+ KeyguardSecurityModel.SecurityMode.None);
+ mOnAttachStateChangeListener.onViewAttachedToWindow(mLockIcon);
+ verify(mLockIcon).updateIconVisibility(false);
}
}
diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
index 0a80b02a964c..e6e52de0440f 100644
--- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
+++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java
@@ -40,6 +40,7 @@ import android.bluetooth.BluetoothDevice;
import android.companion.Association;
import android.companion.AssociationRequest;
import android.companion.CompanionDeviceManager;
+import android.companion.DeviceNotAssociatedException;
import android.companion.ICompanionDeviceDiscoveryService;
import android.companion.ICompanionDeviceManager;
import android.companion.IFindDeviceCallback;
@@ -486,6 +487,43 @@ public class CompanionDeviceManagerService extends SystemService implements Bind
a -> Objects.equals(a.getDeviceMacAddress(), macAddress));
}
+ @Override
+ public void registerDevicePresenceListenerService(
+ String packageName, String deviceAddress)
+ throws RemoteException {
+ checkCanRegisterObserverService(packageName, deviceAddress);
+
+ //TODO(eugenesusla) implement
+ }
+
+ @Override
+ public void unregisterDevicePresenceListenerService(
+ String packageName, String deviceAddress)
+ throws RemoteException {
+ checkCanRegisterObserverService(packageName, deviceAddress);
+
+ //TODO(eugenesusla) implement
+ }
+
+ private void checkCanRegisterObserverService(String packageName, String deviceAddress)
+ throws RemoteException {
+ getContext().enforceCallingOrSelfPermission(
+ android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE,
+ "[un]registerDevicePresenceListenerService");
+ checkCallerIsSystemOr(packageName);
+
+ int userId = getCallingUserId();
+ Set<Association> deviceAssociations = CollectionUtils.filter(
+ getAllAssociations(userId, packageName),
+ association -> deviceAddress.equals(association.getDeviceMacAddress()));
+
+ if (deviceAssociations.isEmpty()) {
+ throw new RemoteException(new DeviceNotAssociatedException("App " + packageName
+ + " is not associated with device " + deviceAddress
+ + " for user " + userId));
+ }
+ }
+
private void checkCanCallNotificationApi(String callingPackage) throws RemoteException {
checkCallerIsSystemOr(callingPackage);
int userId = getCallingUserId();
diff --git a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java
index 4d9680c785bc..aa56da5773e9 100644
--- a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java
+++ b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java
@@ -119,7 +119,9 @@ class BluetoothAirplaneModeListener {
}
return;
}
- mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager);
+ if (mAirplaneHelper != null) {
+ mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager);
+ }
}
@VisibleForTesting
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 0a684287849a..dc24ffdb936d 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -1275,7 +1275,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
@Override
public boolean bindBluetoothProfileService(int bluetoothProfile,
IBluetoothProfileServiceConnection proxy) {
- if (!mEnable) {
+ if (mState != BluetoothAdapter.STATE_ON) {
if (DBG) {
Slog.d(TAG, "Trying to bind to profile: " + bluetoothProfile
+ ", while Bluetooth was disabled");
@@ -1441,7 +1441,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
mBluetoothLock.readLock().unlock();
}
- if (!mEnable || state != BluetoothAdapter.STATE_ON) {
+ if (state != BluetoothAdapter.STATE_ON) {
if (DBG) {
Slog.d(TAG, "Unable to bindService while Bluetooth is disabled");
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7ebe05695d5d..f87892950a00 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -5579,11 +5579,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private boolean checkUnsupportedStartingFrom(int version, String callingPackageName) {
- final PackageManager pm = mContext.getPackageManager();
- final int userId = UserHandle.getCallingUserId();
+ final UserHandle user = UserHandle.getUserHandleForUid(Binder.getCallingUid());
+ final PackageManager pm =
+ mContext.createContextAsUser(user, 0 /* flags */).getPackageManager();
try {
- final int callingVersion = pm.getApplicationInfoAsUser(
- callingPackageName, 0 /* flags */, userId).targetSdkVersion;
+ final int callingVersion = pm.getApplicationInfo(
+ callingPackageName, 0 /* flags */).targetSdkVersion;
if (callingVersion < version) return false;
} catch (PackageManager.NameNotFoundException e) { }
return true;
diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS
index 733590c4f6c6..a10764b9956c 100644
--- a/services/core/java/com/android/server/OWNERS
+++ b/services/core/java/com/android/server/OWNERS
@@ -10,8 +10,11 @@ per-file ZramWriteback.java = minchan@google.com, rajekumar@google.com, srnvs@go
# Userspace reboot
per-file UserspaceRebootLogger.java = ioffe@google.com, tomcherry@google.com
+# Sensor Privacy
+per-file SensorPrivacyService.java = file:platform/frameworks/native:/libs/sensorprivacy/OWNERS
+
per-file *Alarm* = file:/apex/jobscheduler/OWNERS
-per-file *AppOps* = file:/core/java/android/permission/OWNERS
+per-file *AppOp* = file:/core/java/android/permission/OWNERS
per-file *Bluetooth* = file:/core/java/android/bluetooth/OWNERS
per-file *Gnss* = file:/services/core/java/com/android/server/location/OWNERS
per-file *Location* = file:/services/core/java/com/android/server/location/OWNERS
diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java
index 938a3d283ca4..010213453940 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -16,6 +16,9 @@
package com.android.server;
+import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.AppOpsManager.OP_CAMERA;
+import static android.app.AppOpsManager.OP_RECORD_AUDIO;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
import static android.service.SensorPrivacyIndividualEnabledSensorProto.CAMERA;
import static android.service.SensorPrivacyIndividualEnabledSensorProto.MICROPHONE;
@@ -23,7 +26,16 @@ import static android.service.SensorPrivacyIndividualEnabledSensorProto.UNKNOWN;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.app.AppOpsManager;
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.drawable.Icon;
import android.hardware.ISensorPrivacyListener;
import android.hardware.ISensorPrivacyManager;
import android.hardware.SensorPrivacyManager;
@@ -78,6 +90,12 @@ public final class SensorPrivacyService extends SystemService {
private static final String XML_ATTRIBUTE_ENABLED = "enabled";
private static final String XML_ATTRIBUTE_SENSOR = "sensor";
+ private static final String SENSOR_PRIVACY_CHANNEL_ID = Context.SENSOR_PRIVACY_SERVICE;
+ private static final String ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY =
+ SensorPrivacyService.class.getName() + ".action.disable_sensor_privacy";
+ private static final String EXTRA_SENSOR = SensorPrivacyService.class.getName()
+ + ".extra.sensor";
+
private final SensorPrivacyServiceImpl mSensorPrivacyServiceImpl;
public SensorPrivacyService(Context context) {
@@ -90,7 +108,8 @@ public final class SensorPrivacyService extends SystemService {
publishBinderService(Context.SENSOR_PRIVACY_SERVICE, mSensorPrivacyServiceImpl);
}
- class SensorPrivacyServiceImpl extends ISensorPrivacyManager.Stub {
+ class SensorPrivacyServiceImpl extends ISensorPrivacyManager.Stub implements
+ AppOpsManager.OnOpNotedListener, AppOpsManager.OnOpStartedListener {
private final SensorPrivacyHandler mHandler;
private final Context mContext;
@@ -110,6 +129,98 @@ public final class SensorPrivacyService extends SystemService {
synchronized (mLock) {
readPersistedSensorPrivacyStateLocked();
}
+
+ int[] micAndCameraOps = new int[]{OP_RECORD_AUDIO, OP_CAMERA};
+ AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
+ appOpsManager.startWatchingNoted(micAndCameraOps, this);
+ appOpsManager.startWatchingStarted(micAndCameraOps, this);
+
+ mContext.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ setIndividualSensorPrivacy(intent.getIntExtra(EXTRA_SENSOR, UNKNOWN), false);
+ }
+ }, new IntentFilter(ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY));
+ }
+
+ @Override
+ public void onOpStarted(int code, int uid, String packageName,
+ @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result) {
+ onOpNoted(code, uid, packageName, flags, result);
+ }
+
+ @Override
+ public void onOpNoted(int code, int uid, String packageName,
+ @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result) {
+ if (result != MODE_ALLOWED || (flags & AppOpsManager.OP_FLAGS_ALL_TRUSTED) == 0) {
+ return;
+ }
+
+ int sensor;
+ if (code == OP_RECORD_AUDIO) {
+ sensor = MICROPHONE;
+ } else {
+ sensor = CAMERA;
+ }
+
+ onSensorUseStarted(uid, packageName, sensor);
+ }
+
+ /**
+ * Called when a sensor protected by individual sensor privacy is attempting to get used.
+ *
+ * @param uid The uid of the app using the sensor
+ * @param packageName The package name of the app using the sensor
+ * @param sensor The sensor that is attempting to be used
+ */
+ private void onSensorUseStarted(int uid, String packageName, int sensor) {
+ if (!isIndividualSensorPrivacyEnabled(sensor)) {
+ return;
+ }
+
+ // TODO moltmann: Use dialog instead of notification if we can determine the activity
+ // which triggered this usage
+
+ // TODO evanseverson: - Implement final UX for notification
+ // - Finalize strings and icons and add as resources
+
+ int icon;
+ CharSequence notificationMessage;
+ if (sensor == MICROPHONE) {
+ icon = com.android.internal.R.drawable.ic_mic;
+ notificationMessage = "Microphone is muted because of sensor privacy";
+ } else {
+ icon = com.android.internal.R.drawable.ic_camera;
+ notificationMessage = "Camera is blocked because of sensor privacy";
+ }
+
+ NotificationManager notificationManager =
+ mContext.getSystemService(NotificationManager.class);
+ NotificationChannel channel = new NotificationChannel(
+ SENSOR_PRIVACY_CHANNEL_ID, "Sensor privacy",
+ NotificationManager.IMPORTANCE_HIGH);
+ channel.setSound(null, null);
+ channel.setBypassDnd(true);
+ channel.enableVibration(false);
+ channel.setBlockable(false);
+
+ notificationManager.createNotificationChannel(channel);
+
+ notificationManager.notify(sensor,
+ new Notification.Builder(mContext, SENSOR_PRIVACY_CHANNEL_ID)
+ .setContentTitle(notificationMessage)
+ .setSmallIcon(icon)
+ .addAction(new Notification.Action.Builder(
+ Icon.createWithResource(mContext, icon),
+ "Disable sensor privacy",
+ PendingIntent.getBroadcast(mContext, sensor,
+ new Intent(ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY)
+ .setPackage(mContext.getPackageName())
+ .putExtra(EXTRA_SENSOR, sensor),
+ PendingIntent.FLAG_IMMUTABLE
+ | PendingIntent.FLAG_UPDATE_CURRENT))
+ .build())
+ .build());
}
/**
@@ -130,6 +241,15 @@ public final class SensorPrivacyService extends SystemService {
enforceSensorPrivacyPermission();
synchronized (mLock) {
mIndividualEnabled.put(sensor, enable);
+
+ if (!enable) {
+ // Remove any notifications prompting the user to disable sensory privacy
+ NotificationManager notificationManager =
+ mContext.getSystemService(NotificationManager.class);
+
+ notificationManager.cancel(sensor);
+ }
+
persistSensorPrivacyState();
}
}
diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java
index 75ebe70591df..655d8abf3e84 100644
--- a/services/core/java/com/android/server/TestNetworkService.java
+++ b/services/core/java/com/android/server/TestNetworkService.java
@@ -61,9 +61,8 @@ import java.util.concurrent.atomic.AtomicInteger;
/** @hide */
class TestNetworkService extends ITestNetworkManager.Stub {
- @NonNull private static final String TAG = TestNetworkService.class.getSimpleName();
@NonNull private static final String TEST_NETWORK_LOGTAG = "TestNetworkAgent";
- @NonNull private static final String TEST_NETWORK_PROVIDER_NAME = TAG;
+ @NonNull private static final String TEST_NETWORK_PROVIDER_NAME = "TestNetworkProvider";
@NonNull private static final AtomicInteger sTestTunIndex = new AtomicInteger();
@NonNull private final Context mContext;
@@ -168,17 +167,15 @@ class TestNetworkService extends ITestNetworkManager.Stub {
private TestNetworkAgent(
@NonNull Context context,
@NonNull Looper looper,
- @NonNull NetworkAgentConfig config,
@NonNull NetworkCapabilities nc,
@NonNull LinkProperties lp,
+ @NonNull NetworkAgentConfig config,
int uid,
@NonNull IBinder binder,
@NonNull NetworkProvider np)
throws RemoteException {
super(context, looper, TEST_NETWORK_LOGTAG, nc, lp, NETWORK_SCORE, config, np);
-
mUid = uid;
-
synchronized (mBinderLock) {
mBinder = binder; // Binder null-checks in create()
@@ -286,8 +283,8 @@ class TestNetworkService extends ITestNetworkManager.Stub {
lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null, iface));
}
- final TestNetworkAgent agent = new TestNetworkAgent(context, looper,
- new NetworkAgentConfig.Builder().build(), nc, lp, callingUid, binder,
+ final TestNetworkAgent agent = new TestNetworkAgent(context, looper, nc, lp,
+ new NetworkAgentConfig.Builder().build(), callingUid, binder,
mNetworkProvider);
agent.register();
agent.markConnected();
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index c364c8463f1b..4872efdce88b 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -1859,7 +1859,7 @@ public final class ActiveServices {
private final AppOpsManager.OnOpNotedListener mOpNotedCallback =
new AppOpsManager.OnOpNotedListener() {
@Override
- public void onOpNoted(int op, int uid, String pkgName, int result) {
+ public void onOpNoted(int op, int uid, String pkgName, int flags, int result) {
incrementOpCountIfNeeded(op, uid, result);
}
};
@@ -1867,7 +1867,8 @@ public final class ActiveServices {
private final AppOpsManager.OnOpStartedListener mOpStartedCallback =
new AppOpsManager.OnOpStartedListener() {
@Override
- public void onOpStarted(int op, int uid, String pkgName, int result) {
+ public void onOpStarted(int op, int uid, String pkgName, int flags,
+ int result) {
incrementOpCountIfNeeded(op, uid, result);
}
};
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 2f4373cf473a..10102cd12346 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -174,6 +174,7 @@ import android.app.ProfilerInfo;
import android.app.WaitResult;
import android.app.backup.BackupManager.OperationType;
import android.app.backup.IBackupManager;
+import android.app.compat.CompatChanges;
import android.app.usage.UsageEvents;
import android.app.usage.UsageEvents.Event;
import android.app.usage.UsageStatsManager;
@@ -13713,6 +13714,37 @@ public class ActivityManagerService extends IActivityManager.Stub
forceStopPackageLocked(packageName, -1, false, true, true,
false, false, userId, "package unstartable");
break;
+ case Intent.ACTION_CLOSE_SYSTEM_DIALOGS:
+ if (!canCloseSystemDialogs(callingPid, callingUid, callerApp)) {
+ // The app can't close system dialogs, throw only if it targets S+
+ if (CompatChanges.isChangeEnabled(
+ ActivityManager.LOCK_DOWN_CLOSE_SYSTEM_DIALOGS, callingUid)) {
+ throw new SecurityException(
+ "Permission Denial: " + Intent.ACTION_CLOSE_SYSTEM_DIALOGS
+ + " broadcast from " + callerPackage + " (pid="
+ + callingPid + ", uid=" + callingUid + ")"
+ + " requires "
+ + permission.BROADCAST_CLOSE_SYSTEM_DIALOGS + ".");
+ } else if (CompatChanges.isChangeEnabled(
+ ActivityManager.DROP_CLOSE_SYSTEM_DIALOGS, callingUid)) {
+ Slog.w(TAG, "Permission Denial: " + intent.getAction()
+ + " broadcast from " + callerPackage + " (pid=" + callingPid
+ + ", uid=" + callingUid + ")"
+ + " requires "
+ + permission.BROADCAST_CLOSE_SYSTEM_DIALOGS
+ + ", dropping broadcast.");
+ // Returning success seems to be the pattern here
+ return ActivityManager.BROADCAST_SUCCESS;
+ } else {
+ Slog.w(TAG, intent.getAction()
+ + " broadcast from " + callerPackage + " (pid=" + callingPid
+ + ", uid=" + callingUid + ")"
+ + " will require "
+ + permission.BROADCAST_CLOSE_SYSTEM_DIALOGS
+ + " in future builds.");
+ }
+ }
+ break;
}
if (Intent.ACTION_PACKAGE_ADDED.equals(action) ||
@@ -14005,6 +14037,32 @@ public class ActivityManagerService extends IActivityManager.Stub
return ActivityManager.BROADCAST_SUCCESS;
}
+ private boolean canCloseSystemDialogs(int pid, int uid, @Nullable ProcessRecord callerApp) {
+ if (checkPermission(permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, pid, uid)
+ == PERMISSION_GRANTED) {
+ return true;
+ }
+ if (callerApp == null) {
+ synchronized (mPidsSelfLocked) {
+ callerApp = mPidsSelfLocked.get(pid);
+ }
+ }
+ // Check if the instrumentation of the process has the permission. This covers the usual
+ // test started from the shell (which has the permission) case. This is needed for apps
+ // targeting SDK level < S but we are also allowing for targetSdk S+ as a convenience to
+ // avoid breaking a bunch of existing tests and asking them to adopt shell permissions to do
+ // this.
+ if (callerApp != null) {
+ ActiveInstrumentation instrumentation = callerApp.getActiveInstrumentation();
+ if (instrumentation != null && checkPermission(
+ permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, -1, instrumentation.mSourceUid)
+ == PERMISSION_GRANTED) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* @return uid from the extra field {@link Intent#EXTRA_UID} if present, Otherwise -1
*/
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 0b4d27f4990b..f2c1e90e2476 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -756,8 +756,9 @@ class AppErrors {
boolean handleAppCrashLocked(ProcessRecord app, String reason,
String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data) {
final long now = SystemClock.uptimeMillis();
- final boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
+ final boolean showBackground = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ANR_SHOW_BACKGROUND, 0,
+ mService.mUserController.getCurrentUserId()) != 0;
final boolean procIsBoundForeground =
(app.getCurProcState() == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE);
@@ -889,8 +890,9 @@ class AppErrors {
void handleShowAppErrorUi(Message msg) {
AppErrorDialog.Data data = (AppErrorDialog.Data) msg.obj;
- boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
+ boolean showBackground = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ANR_SHOW_BACKGROUND, 0,
+ mService.mUserController.getCurrentUserId()) != 0;
final int userId;
synchronized (mService) {
@@ -982,8 +984,9 @@ class AppErrors {
return;
}
- boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
+ boolean showBackground = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ANR_SHOW_BACKGROUND, 0,
+ mService.mUserController.getCurrentUserId()) != 0;
if (mService.mAtmInternal.canShowErrorDialogs() || showBackground) {
proc.getDialogController().showAnrDialogs(data);
} else {
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index d4e2d27ca7a1..4da78252bccb 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -3090,7 +3090,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final Ops ops = getOpsLocked(uid, packageName, attributionTag, bypass,
true /* edit */);
if (ops == null) {
- scheduleOpNotedIfNeededLocked(code, uid, packageName,
+ scheduleOpNotedIfNeededLocked(code, uid, packageName, flags,
AppOpsManager.MODE_IGNORED);
if (DEBUG) Slog.d(TAG, "noteOperation: no op for code " + code + " uid " + uid
+ " package " + packageName);
@@ -3098,7 +3098,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
final Op op = getOpLocked(ops, code, uid, true);
if (isOpRestrictedLocked(uid, code, packageName, bypass)) {
- scheduleOpNotedIfNeededLocked(code, uid, packageName,
+ scheduleOpNotedIfNeededLocked(code, uid, packageName, flags,
AppOpsManager.MODE_IGNORED);
return AppOpsManager.MODE_IGNORED;
}
@@ -3120,7 +3120,7 @@ public class AppOpsService extends IAppOpsService.Stub {
+ switchCode + " (" + code + ") uid " + uid + " package "
+ packageName);
attributedOp.rejected(uidState.state, flags);
- scheduleOpNotedIfNeededLocked(code, uid, packageName, uidMode);
+ scheduleOpNotedIfNeededLocked(code, uid, packageName, flags, uidMode);
return uidMode;
}
} else {
@@ -3132,7 +3132,7 @@ public class AppOpsService extends IAppOpsService.Stub {
+ switchCode + " (" + code + ") uid " + uid + " package "
+ packageName);
attributedOp.rejected(uidState.state, flags);
- scheduleOpNotedIfNeededLocked(code, uid, packageName, mode);
+ scheduleOpNotedIfNeededLocked(code, uid, packageName, flags, mode);
return mode;
}
}
@@ -3142,7 +3142,8 @@ public class AppOpsService extends IAppOpsService.Stub {
+ packageName + (attributionTag == null ? ""
: "." + attributionTag));
}
- scheduleOpNotedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_ALLOWED);
+ scheduleOpNotedIfNeededLocked(code, uid, packageName, flags,
+ AppOpsManager.MODE_ALLOWED);
attributedOp.accessed(proxyUid, proxyPackageName, proxyAttributionTag, uidState.state,
flags);
@@ -3545,7 +3546,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (ops == null) {
if (!dryRun) {
scheduleOpStartedIfNeededLocked(code, uid, packageName,
- AppOpsManager.MODE_IGNORED);
+ flags, AppOpsManager.MODE_IGNORED);
}
if (DEBUG) Slog.d(TAG, "startOperation: no op for code " + code + " uid " + uid
+ " package " + packageName);
@@ -3555,7 +3556,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (isOpRestrictedLocked(uid, code, packageName, bypass)) {
if (!dryRun) {
scheduleOpStartedIfNeededLocked(code, uid, packageName,
- AppOpsManager.MODE_IGNORED);
+ flags, AppOpsManager.MODE_IGNORED);
}
return AppOpsManager.MODE_IGNORED;
}
@@ -3575,7 +3576,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
if (!dryRun) {
attributedOp.rejected(uidState.state, flags);
- scheduleOpStartedIfNeededLocked(code, uid, packageName, uidMode);
+ scheduleOpStartedIfNeededLocked(code, uid, packageName, flags, uidMode);
}
return uidMode;
}
@@ -3590,7 +3591,7 @@ public class AppOpsService extends IAppOpsService.Stub {
+ packageName);
if (!dryRun) {
attributedOp.rejected(uidState.state, flags);
- scheduleOpStartedIfNeededLocked(code, uid, packageName, mode);
+ scheduleOpStartedIfNeededLocked(code, uid, packageName, flags, mode);
}
return mode;
}
@@ -3598,7 +3599,8 @@ public class AppOpsService extends IAppOpsService.Stub {
if (DEBUG) Slog.d(TAG, "startOperation: allowing code " + code + " uid " + uid
+ " package " + packageName);
if (!dryRun) {
- scheduleOpStartedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_ALLOWED);
+ scheduleOpStartedIfNeededLocked(code, uid, packageName, flags,
+ AppOpsManager.MODE_ALLOWED);
try {
attributedOp.started(clientId, proxyUid, proxyPackageName, proxyAttributionTag,
uidState.state, flags);
@@ -3736,7 +3738,8 @@ public class AppOpsService extends IAppOpsService.Stub {
}
}
- private void scheduleOpStartedIfNeededLocked(int code, int uid, String pkgName, int result) {
+ private void scheduleOpStartedIfNeededLocked(int code, int uid, String pkgName,
+ @OpFlags int flags, @Mode int result) {
ArraySet<StartedCallback> dispatchedCallbacks = null;
final int callbackListCount = mStartedWatchers.size();
for (int i = 0; i < callbackListCount; i++) {
@@ -3761,18 +3764,18 @@ public class AppOpsService extends IAppOpsService.Stub {
mHandler.sendMessage(PooledLambda.obtainMessage(
AppOpsService::notifyOpStarted,
- this, dispatchedCallbacks, code, uid, pkgName, result));
+ this, dispatchedCallbacks, code, uid, pkgName, flags, result));
}
private void notifyOpStarted(ArraySet<StartedCallback> callbacks,
- int code, int uid, String packageName, int result) {
+ int code, int uid, String packageName, @OpFlags int flags, @Mode int result) {
final long identity = Binder.clearCallingIdentity();
try {
final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) {
final StartedCallback callback = callbacks.valueAt(i);
try {
- callback.mCallback.opStarted(code, uid, packageName, result);
+ callback.mCallback.opStarted(code, uid, packageName, flags, result);
} catch (RemoteException e) {
/* do nothing */
}
@@ -3783,7 +3786,7 @@ public class AppOpsService extends IAppOpsService.Stub {
}
private void scheduleOpNotedIfNeededLocked(int code, int uid, String packageName,
- int result) {
+ @OpFlags int flags, @Mode int result) {
ArraySet<NotedCallback> dispatchedCallbacks = null;
final int callbackListCount = mNotedWatchers.size();
for (int i = 0; i < callbackListCount; i++) {
@@ -3804,11 +3807,11 @@ public class AppOpsService extends IAppOpsService.Stub {
}
mHandler.sendMessage(PooledLambda.obtainMessage(
AppOpsService::notifyOpChecked,
- this, dispatchedCallbacks, code, uid, packageName, result));
+ this, dispatchedCallbacks, code, uid, packageName, flags, result));
}
private void notifyOpChecked(ArraySet<NotedCallback> callbacks,
- int code, int uid, String packageName, int result) {
+ int code, int uid, String packageName, @OpFlags int flags, @Mode int result) {
// There are features watching for checks in our process. The callbacks in
// these features may require permissions our remote caller does not have.
final long identity = Binder.clearCallingIdentity();
@@ -3817,7 +3820,7 @@ public class AppOpsService extends IAppOpsService.Stub {
for (int i = 0; i < callbackCount; i++) {
final NotedCallback callback = callbacks.valueAt(i);
try {
- callback.mCallback.opNoted(code, uid, packageName, result);
+ callback.mCallback.opNoted(code, uid, packageName, flags, result);
} catch (RemoteException e) {
/* do nothing */
}
diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
index 4c63eb488118..d507b5f82bd0 100644
--- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java
+++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java
@@ -35,7 +35,6 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PackageManagerInternal;
-import android.content.pm.UserInfo;
import android.net.INetd;
import android.net.UidRange;
import android.os.Build;
@@ -174,11 +173,9 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse
netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms);
}
- List<UserInfo> users = mUserManager.getAliveUsers();
- if (users != null) {
- for (UserInfo user : users) {
- mUsers.add(user.id);
- }
+ final List<UserHandle> users = mUserManager.getUserHandles(true /* excludeDying */);
+ for (UserHandle user : users) {
+ mUsers.add(user.getIdentifier());
}
final SparseArray<ArraySet<String>> systemPermission =
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 5cb0994c5cb2..66bb4d704e80 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -1253,7 +1253,7 @@ public class Vpn {
final PackageManager packageManager = mUserIdContext.getPackageManager();
if (packageManager == null) {
- throw new UnsupportedOperationException("Cannot get PackageManager.");
+ throw new IllegalStateException("Cannot get PackageManager.");
}
final ResolveInfo info = packageManager.resolveService(intent, 0 /* flags */);
if (info == null) {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index d4a19d6bc366..2c7cd5bce514 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -403,7 +403,7 @@ public final class DisplayManagerService extends SystemService {
mUiHandler = UiThread.getHandler();
mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore);
mLogicalDisplayMapper = new LogicalDisplayMapper(context, mDisplayDeviceRepo,
- new LogicalDisplayListener(), mPersistentDataStore);
+ new LogicalDisplayListener());
mDisplayModeDirector = new DisplayModeDirector(context, mHandler);
Resources resources = mContext.getResources();
mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger(
diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
index cdcbb4f123a1..a12785889bd3 100644
--- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java
+++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java
@@ -20,13 +20,13 @@ import android.content.Context;
import android.os.Process;
import android.os.SystemProperties;
import android.text.TextUtils;
+import android.util.IndentingPrintWriter;
import android.util.Slog;
import android.util.SparseArray;
import android.view.Display;
import android.view.DisplayEventReceiver;
import android.view.DisplayInfo;
-import com.android.internal.util.IndentingPrintWriter;
import java.io.PrintWriter;
import java.util.Arrays;
@@ -102,13 +102,10 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
private final SparseArray<DisplayGroup> mDisplayGroups = new SparseArray<>();
private final DisplayDeviceRepository mDisplayDeviceRepo;
- private final PersistentDataStore mPersistentDataStore;
private final Listener mListener;
- LogicalDisplayMapper(Context context, DisplayDeviceRepository repo, Listener listener,
- PersistentDataStore persistentDataStore) {
+ LogicalDisplayMapper(Context context, DisplayDeviceRepository repo, Listener listener) {
mDisplayDeviceRepo = repo;
- mPersistentDataStore = persistentDataStore;
mListener = listener;
mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false);
mDisplayDeviceRepo.addListener(this);
@@ -238,7 +235,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
// Find the associated LogicalDisplays for the configured "folding" DeviceDisplays.
final LogicalDisplay displayFolded = getLocked(deviceFolded);
final LogicalDisplay displayUnfolded = getLocked(deviceUnfolded);
- if (displayFolded == null || displayFolded == null) {
+ if (displayFolded == null || displayUnfolded == null) {
// If the expected displays are not present, return early.
return;
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index 0e196f278ddf..52121f352783 100755
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -623,6 +623,14 @@ abstract class HdmiCecLocalDevice {
return false;
}
+ if (isPowerOffOrToggleCommand(message) || isPowerOnOrToggleCommand(message)) {
+ // Power commands should already be handled above. Don't continue and convert the CEC
+ // keycode to Android keycode.
+ // Do not <Feature Abort> as the local device should already be in the correct power
+ // state.
+ return true;
+ }
+
final long downTime = SystemClock.uptimeMillis();
final byte[] params = message.getParams();
final int keycode = HdmiCecKeycode.cecKeycodeAndParamsToAndroidKey(params);
diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java
index 3854f8c8ff76..324332f1e134 100644
--- a/services/core/java/com/android/server/location/LocationManagerService.java
+++ b/services/core/java/com/android/server/location/LocationManagerService.java
@@ -519,9 +519,6 @@ public class LocationManagerService extends ILocationManager.Stub {
public List<String> getAllProviders() {
ArrayList<String> providers = new ArrayList<>(mProviderManagers.size());
for (LocationProviderManager manager : mProviderManagers) {
- if (FUSED_PROVIDER.equals(manager.getName())) {
- continue;
- }
providers.add(manager.getName());
}
return providers;
@@ -538,9 +535,6 @@ public class LocationManagerService extends ILocationManager.Stub {
ArrayList<String> providers = new ArrayList<>(mProviderManagers.size());
for (LocationProviderManager manager : mProviderManagers) {
String name = manager.getName();
- if (FUSED_PROVIDER.equals(name)) {
- continue;
- }
if (enabledOnly && !manager.isEnabled(UserHandle.getCallingUserId())) {
continue;
}
@@ -565,7 +559,9 @@ public class LocationManagerService extends ILocationManager.Stub {
}
if (!providers.isEmpty()) {
- if (providers.contains(GPS_PROVIDER)) {
+ if (providers.contains(FUSED_PROVIDER)) {
+ return FUSED_PROVIDER;
+ } else if (providers.contains(GPS_PROVIDER)) {
return GPS_PROVIDER;
} else if (providers.contains(NETWORK_PROVIDER)) {
return NETWORK_PROVIDER;
@@ -1046,10 +1042,6 @@ public class LocationManagerService extends ILocationManager.Stub {
@Override
public boolean isProviderEnabledForUser(String provider, int userId) {
- // fused provider is accessed indirectly via criteria rather than the provider-based APIs,
- // so we discourage its use
- if (FUSED_PROVIDER.equals(provider)) return false;
-
return mLocalService.isProviderEnabledForUser(provider, userId);
}
diff --git a/services/core/java/com/android/server/location/OWNERS b/services/core/java/com/android/server/location/OWNERS
index c2c95e6042de..696a0c22c605 100644
--- a/services/core/java/com/android/server/location/OWNERS
+++ b/services/core/java/com/android/server/location/OWNERS
@@ -1,8 +1 @@
-aadmal@google.com
-arthuri@google.com
-bduddie@google.com
-gomo@google.com
-sooniln@google.com
-weiwa@google.com
-wyattriley@google.com
-yuhany@google.com
+file:/location/java/android/location/OWNERS
diff --git a/services/core/java/com/android/server/location/contexthub/OWNERS b/services/core/java/com/android/server/location/contexthub/OWNERS
new file mode 100644
index 000000000000..d4393d6a83d2
--- /dev/null
+++ b/services/core/java/com/android/server/location/contexthub/OWNERS
@@ -0,0 +1,2 @@
+arthuri@google.com
+bduddie@google.com
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index 0ac0c8d95423..9f07695fcecf 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -737,7 +737,7 @@ class ShortcutPackage extends ShortcutPackageItem {
|| ((pinnedByCallerSet != null) && pinnedByCallerSet.contains(si.getId()));
if (!getPinnedByAnyLauncher) {
- if (si.isFloating()) {
+ if (si.isFloating() && !si.isCached()) {
if (!isPinnedByCaller) {
continue;
}
diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java
index a098484b803b..7ca9f0536de1 100644
--- a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java
+++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java
@@ -99,52 +99,6 @@ public interface LegacyPermissionManagerInternal {
*/
void scheduleReadDefaultPermissionExceptions();
- // TODO(zhanghai): The following methods should be moved to a new AIDL to support
- // the legacy PermissionManager directly in a later CL.
-
- /**
- * Grant default permissions to currently active LUI app
- * @param packageName The package name for the LUI app
- * @param userId The user ID
- */
- void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId);
-
- /**
- * Revoke default permissions to currently active LUI app
- * @param packageNames The package names for the LUI apps
- * @param userId The user ID
- */
- void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId);
-
- /**
- * Grant default permissions to currently active Ims services
- * @param packageNames The package names for the Ims services
- * @param userId The user ID
- */
- void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId);
-
- /**
- * Grant default permissions to currently enabled telephony data services
- * @param packageNames The package name for the services
- * @param userId The user ID
- */
- void grantDefaultPermissionsToEnabledTelephonyDataServices(String[] packageNames, int userId);
-
- /**
- * Revoke default permissions to currently active telephony data services
- * @param packageNames The package name for the services
- * @param userId The IDhandle
- */
- void revokeDefaultPermissionsFromDisabledTelephonyDataServices(String[] packageNames,
- int userId);
-
- /**
- * Grant default permissions to currently enabled carrier apps
- * @param packageNames Package names of the apps to be granted permissions
- * @param userId The user ID
- */
- void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId);
-
/**
* Provider for package names.
*/
diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java
index 0c0a8dfeaaec..f453d7460d9d 100644
--- a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java
@@ -17,16 +17,31 @@
package com.android.server.pm.permission;
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.app.AppOpsManager;
+import android.app.admin.DevicePolicyManager;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.Binder;
+import android.os.Process;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+import android.permission.ILegacyPermissionManager;
+import android.util.Log;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.server.LocalServices;
import com.android.server.pm.PackageManagerServiceUtils;
/**
* Legacy permission manager service.
*/
-public class LegacyPermissionManagerService {
+public class LegacyPermissionManagerService extends ILegacyPermissionManager.Stub {
+ private static final String TAG = "PackageManager";
+
+ /** Injector that can be used to facilitate testing. */
+ private final Injector mInjector;
+
@NonNull
private final DefaultPermissionGrantPolicy mDefaultPermissionGrantPolicy;
@@ -51,8 +66,126 @@ public class LegacyPermissionManagerService {
}
private LegacyPermissionManagerService(@NonNull Context context) {
- mDefaultPermissionGrantPolicy = new DefaultPermissionGrantPolicy(context);
+ this(context, new Injector(context));
+
LocalServices.addService(LegacyPermissionManagerInternal.class, new Internal());
+ ServiceManager.addService("legacy_permission", this);
+ }
+
+ @VisibleForTesting
+ LegacyPermissionManagerService(@NonNull Context context, @NonNull Injector injector) {
+ mInjector = injector;
+ mDefaultPermissionGrantPolicy = new DefaultPermissionGrantPolicy(context);
+ }
+
+ @Override
+ public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message,
+ @Nullable String callingFeatureId, int pid, int uid) {
+ // If the check is being requested by an app then only allow the app to query its own
+ // access status.
+ int callingUid = mInjector.getCallingUid();
+ int callingPid = mInjector.getCallingPid();
+ if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID && (callingUid != uid
+ || callingPid != pid)) {
+ String response = String.format(
+ "Calling uid %d, pid %d cannot check device identifier access for package %s "
+ + "(uid=%d, pid=%d)",
+ callingUid, callingPid, packageName, uid, pid);
+ Log.w(TAG, response);
+ throw new SecurityException(response);
+ }
+ // Allow system and root access to the device identifiers.
+ final int appId = UserHandle.getAppId(uid);
+ if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ // Allow access to packages that have the READ_PRIVILEGED_PHONE_STATE permission.
+ if (mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid,
+ uid) == PackageManager.PERMISSION_GRANTED) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ // If the calling package is not null then perform the appop and device / profile owner
+ // check.
+ if (packageName != null) {
+ // Allow access to a package that has been granted the READ_DEVICE_IDENTIFIERS appop.
+ final long token = mInjector.clearCallingIdentity();
+ AppOpsManager appOpsManager = (AppOpsManager) mInjector.getSystemService(
+ Context.APP_OPS_SERVICE);
+ try {
+ if (appOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS, uid,
+ packageName, callingFeatureId, message) == AppOpsManager.MODE_ALLOWED) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ } finally {
+ mInjector.restoreCallingIdentity(token);
+ }
+ // Check if the calling packages meets the device / profile owner requirements for
+ // identifier access.
+ DevicePolicyManager devicePolicyManager =
+ (DevicePolicyManager) mInjector.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ if (devicePolicyManager != null && devicePolicyManager.hasDeviceIdentifierAccess(
+ packageName, pid, uid)) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ }
+ return PackageManager.PERMISSION_DENIED;
+ }
+
+ @Override
+ public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
+ "grantDefaultPermissionsToActiveLuiApp", callingUid);
+ Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
+ .grantDefaultPermissionsToActiveLuiApp(packageName, userId));
+ }
+
+ @Override
+ public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
+ "revokeDefaultPermissionsFromLuiApps", callingUid);
+ Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
+ .revokeDefaultPermissionsFromLuiApps(packageNames, userId));
+ }
+
+ @Override
+ public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
+ "grantDefaultPermissionsToEnabledImsServices", callingUid);
+ Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
+ .grantDefaultPermissionsToEnabledImsServices(packageNames, userId));
+ }
+
+ @Override
+ public void grantDefaultPermissionsToEnabledTelephonyDataServices(
+ String[] packageNames, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
+ "grantDefaultPermissionsToEnabledTelephonyDataServices", callingUid);
+ Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
+ .grantDefaultPermissionsToEnabledTelephonyDataServices(packageNames, userId));
+ }
+
+ @Override
+ public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
+ String[] packageNames, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
+ "revokeDefaultPermissionsFromDisabledTelephonyDataServices", callingUid);
+ Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
+ .revokeDefaultPermissionsFromDisabledTelephonyDataServices(packageNames,
+ userId));
+ }
+
+ @Override
+ public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
+ "grantPermissionsToEnabledCarrierApps", callingUid);
+ Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
+ .grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId));
}
private class Internal implements LegacyPermissionManagerInternal {
@@ -117,65 +250,74 @@ public class LegacyPermissionManagerService {
public void scheduleReadDefaultPermissionExceptions() {
mDefaultPermissionGrantPolicy.scheduleReadDefaultPermissionExceptions();
}
+ }
+
+ /**
+ * Allows injection of services and method responses to facilitate testing.
+ *
+ * <p>Test classes can create a mock of this class and pass it to the PermissionManagerService
+ * constructor to control behavior of services and external methods during execution.
+ * @hide
+ */
+ @VisibleForTesting
+ public static class Injector {
+ private final Context mContext;
- // TODO(zhanghai): The following methods should be moved to a new AIDL to support
- // the legacy PermissionManager directly in a later CL.
+ /**
+ * Public constructor that accepts a {@code context} within which to operate.
+ */
+ public Injector(@NonNull Context context) {
+ mContext = context;
+ }
- @Override
- public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
- final int callingUid = Binder.getCallingUid();
- PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
- "grantDefaultPermissionsToActiveLuiApp", callingUid);
- Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
- .grantDefaultPermissionsToActiveLuiApp(packageName, userId));
+ /**
+ * Returns the UID of the calling package.
+ */
+ public int getCallingUid() {
+ return Binder.getCallingUid();
}
- @Override
- public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
- final int callingUid = Binder.getCallingUid();
- PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
- "revokeDefaultPermissionsFromLuiApps", callingUid);
- Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
- .revokeDefaultPermissionsFromLuiApps(packageNames, userId));
+ /**
+ * Returns the process ID of the calling package.
+ */
+ public int getCallingPid() {
+ return Binder.getCallingPid();
}
- @Override
- public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
- final int callingUid = Binder.getCallingUid();
- PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
- "grantDefaultPermissionsToEnabledImsServices", callingUid);
- Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
- .grantDefaultPermissionsToEnabledImsServices(packageNames, userId));
+ /**
+ * Checks if the package running under the specified {@code pid} and {@code uid} has been
+ * granted the provided {@code permission}.
+ *
+ * @return {@link PackageManager#PERMISSION_GRANTED} if the package has been granted the
+ * permission, {@link PackageManager#PERMISSION_DENIED} otherwise
+ */
+ public int checkPermission(@NonNull String permission, int pid, int uid) {
+ return mContext.checkPermission(permission, pid, uid);
}
- @Override
- public void grantDefaultPermissionsToEnabledTelephonyDataServices(
- String[] packageNames, int userId) {
- final int callingUid = Binder.getCallingUid();
- PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
- "grantDefaultPermissionsToEnabledTelephonyDataServices", callingUid);
- Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
- .grantDefaultPermissionsToEnabledTelephonyDataServices(packageNames, userId));
+ /**
+ * Clears the calling identity to allow subsequent calls to be treated as coming from this
+ * package.
+ *
+ * @return a token that can be used to restore the calling identity
+ */
+ public long clearCallingIdentity() {
+ return Binder.clearCallingIdentity();
}
- @Override
- public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
- String[] packageNames, int userId) {
- final int callingUid = Binder.getCallingUid();
- PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
- "revokeDefaultPermissionsFromDisabledTelephonyDataServices", callingUid);
- Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
- .revokeDefaultPermissionsFromDisabledTelephonyDataServices(packageNames,
- userId));
+ /**
+ * Restores the calling identity to that of the calling package based on the provided
+ * {@code token}.
+ */
+ public void restoreCallingIdentity(long token) {
+ Binder.restoreCallingIdentity(token);
}
- @Override
- public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
- final int callingUid = Binder.getCallingUid();
- PackageManagerServiceUtils.enforceSystemOrPhoneCaller(
- "grantPermissionsToEnabledCarrierApps", callingUid);
- Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy
- .grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId));
+ /**
+ * Returns the system service with the provided {@code name}.
+ */
+ public Object getSystemService(@NonNull String name) {
+ return mContext.getSystemService(name);
}
}
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index 1df51772f823..1dbf8396bcfb 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -66,9 +66,7 @@ import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppOpsManager;
-import android.app.ApplicationPackageManager;
import android.app.IActivityManager;
-import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.app.role.RoleManager;
import android.compat.annotation.ChangeId;
@@ -126,7 +124,6 @@ import android.util.SparseArray;
import android.util.SparseBooleanArray;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.compat.IPlatformCompat;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -264,9 +261,6 @@ public class PermissionManagerService extends IPermissionManager.Stub {
@NonNull
private final PermissionRegistry mRegistry = new PermissionRegistry();
- /** Injector that can be used to facilitate testing. */
- private final Injector mInjector;
-
@GuardedBy("mLock")
@Nullable
private ArraySet<String> mPrivappPermissionsViolations;
@@ -364,17 +358,11 @@ public class PermissionManagerService extends IPermissionManager.Stub {
};
PermissionManagerService(@NonNull Context context) {
- this(context, new Injector(context));
- }
-
- @VisibleForTesting
- PermissionManagerService(@NonNull Context context, @NonNull Injector injector) {
- mInjector = injector;
// The package info cache is the cache for package and permission information.
// Disable the package info and package permission caches locally but leave the
// checkPermission cache active.
- mInjector.invalidatePackageInfoCache();
- mInjector.disablePackageNamePermissionCache();
+ PackageManager.invalidatePackageInfoCache();
+ PermissionManager.disablePackageNamePermissionCache();
mContext = context;
mPackageManagerInt = LocalServices.getService(PackageManagerInternal.class);
@@ -806,8 +794,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
private void updatePermissionFlagsInternal(String permName, String packageName, int flagMask,
int flagValues, int callingUid, int userId, boolean overridePolicy,
PermissionCallback callback) {
- if (ApplicationPackageManager.DEBUG_TRACE_PERMISSION_UPDATES
- && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) {
+ if (PermissionManager.DEBUG_TRACE_PERMISSION_UPDATES
+ && PermissionManager.shouldTraceGrant(packageName, permName, userId)) {
Log.i(TAG, "System is updating flags for " + packageName + " "
+ permName + " for user " + userId + " "
+ DebugUtils.flagsToString(
@@ -1113,59 +1101,6 @@ public class PermissionManagerService extends IPermissionManager.Stub {
}
@Override
- public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message,
- @Nullable String callingFeatureId, int pid, int uid) {
- // If the check is being requested by an app then only allow the app to query its own
- // access status.
- int callingUid = mInjector.getCallingUid();
- int callingPid = mInjector.getCallingPid();
- if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID && (callingUid != uid
- || callingPid != pid)) {
- String response = String.format(
- "Calling uid %d, pid %d cannot check device identifier access for package %s "
- + "(uid=%d, pid=%d)",
- callingUid, callingPid, packageName, uid, pid);
- Log.w(TAG, response);
- throw new SecurityException(response);
- }
- // Allow system and root access to the device identifiers.
- final int appId = UserHandle.getAppId(uid);
- if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) {
- return PackageManager.PERMISSION_GRANTED;
- }
- // Allow access to packages that have the READ_PRIVILEGED_PHONE_STATE permission.
- if (mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid,
- uid) == PackageManager.PERMISSION_GRANTED) {
- return PackageManager.PERMISSION_GRANTED;
- }
- // If the calling package is not null then perform the appop and device / profile owner
- // check.
- if (packageName != null) {
- // Allow access to a package that has been granted the READ_DEVICE_IDENTIFIERS appop.
- final long token = mInjector.clearCallingIdentity();
- AppOpsManager appOpsManager = (AppOpsManager) mInjector.getSystemService(
- Context.APP_OPS_SERVICE);
- try {
- if (appOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS, uid,
- packageName, callingFeatureId, message) == AppOpsManager.MODE_ALLOWED) {
- return PackageManager.PERMISSION_GRANTED;
- }
- } finally {
- mInjector.restoreCallingIdentity(token);
- }
- // Check if the calling packages meets the device / profile owner requirements for
- // identifier access.
- DevicePolicyManager devicePolicyManager =
- (DevicePolicyManager) mInjector.getSystemService(Context.DEVICE_POLICY_SERVICE);
- if (devicePolicyManager != null && devicePolicyManager.hasDeviceIdentifierAccess(
- packageName, pid, uid)) {
- return PackageManager.PERMISSION_GRANTED;
- }
- }
- return PackageManager.PERMISSION_DENIED;
- }
-
- @Override
public void addOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS,
@@ -1520,8 +1455,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
// TODO swap permission name and package name
private void grantRuntimePermissionInternal(String permName, String packageName,
boolean overridePolicy, int callingUid, final int userId, PermissionCallback callback) {
- if (ApplicationPackageManager.DEBUG_TRACE_GRANTS
- && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) {
+ if (PermissionManager.DEBUG_TRACE_GRANTS
+ && PermissionManager.shouldTraceGrant(packageName, permName, userId)) {
Log.i(TAG, "System is granting " + packageName + " "
+ permName + " for user " + userId + " on behalf of uid " + callingUid
+ " " + mPackageManagerInt.getNameForUid(callingUid),
@@ -1697,8 +1632,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
private void revokeRuntimePermissionInternal(String permName, String packageName,
boolean overridePolicy, int callingUid, final int userId, String reason,
PermissionCallback callback) {
- if (ApplicationPackageManager.DEBUG_TRACE_PERMISSION_UPDATES
- && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) {
+ if (PermissionManager.DEBUG_TRACE_PERMISSION_UPDATES
+ && PermissionManager.shouldTraceGrant(packageName, permName, userId)) {
Log.i(TAG, "System is revoking " + packageName + " "
+ permName + " for user " + userId + " on behalf of uid " + callingUid
+ " " + mPackageManagerInt.getNameForUid(callingUid),
@@ -2037,44 +1972,6 @@ public class PermissionManagerService extends IPermissionManager.Stub {
mPackageManagerInt.writePermissionSettings(asyncUpdatedUsers.toArray(), true);
}
- @Override
- public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) {
- LocalServices.getService(LegacyPermissionManagerInternal.class)
- .grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId);
- }
-
- @Override
- public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) {
- LocalServices.getService(LegacyPermissionManagerInternal.class)
- .grantDefaultPermissionsToEnabledImsServices(packageNames, userId);
- }
-
- @Override
- public void grantDefaultPermissionsToEnabledTelephonyDataServices(
- String[] packageNames, int userId) {
- LocalServices.getService(LegacyPermissionManagerInternal.class)
- .grantDefaultPermissionsToEnabledTelephonyDataServices(packageNames, userId);
- }
-
- @Override
- public void revokeDefaultPermissionsFromDisabledTelephonyDataServices(
- String[] packageNames, int userId) {
- LocalServices.getService(LegacyPermissionManagerInternal.class)
- .revokeDefaultPermissionsFromDisabledTelephonyDataServices(packageNames, userId);
- }
-
- @Override
- public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) {
- LocalServices.getService(LegacyPermissionManagerInternal.class)
- .grantDefaultPermissionsToActiveLuiApp(packageName, userId);
- }
-
- @Override
- public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) {
- LocalServices.getService(LegacyPermissionManagerInternal.class)
- .revokeDefaultPermissionsFromLuiApps(packageNames, userId);
- }
-
/**
* This change makes it so that apps are told to show rationale for asking for background
* location access every time they request.
@@ -2885,12 +2782,13 @@ public class PermissionManagerService extends IPermissionManager.Stub {
// TODO(zhanghai): This calls into SystemConfig, which generally
// shouldn't cause deadlock, but maybe we should keep a cache of the
// split permission list and just eliminate the possibility.
- final List<SplitPermissionInfoParcelable> permissionList =
- getSplitPermissions();
+ final List<PermissionManager.SplitPermissionInfo> permissionList =
+ getSplitPermissionInfos();
int numSplitPerms = permissionList.size();
for (int splitPermNum = 0; splitPermNum < numSplitPerms;
splitPermNum++) {
- SplitPermissionInfoParcelable sp = permissionList.get(splitPermNum);
+ PermissionManager.SplitPermissionInfo sp = permissionList.get(
+ splitPermNum);
String splitPermName = sp.getSplitPermission();
if (sp.getNewPermissions().contains(permName)
&& origState.isPermissionGranted(splitPermName)) {
@@ -3287,10 +3185,11 @@ public class PermissionManagerService extends IPermissionManager.Stub {
String pkgName = pkg.getPackageName();
ArrayMap<String, ArraySet<String>> newToSplitPerms = new ArrayMap<>();
- final List<SplitPermissionInfoParcelable> permissionList = getSplitPermissions();
+ final List<PermissionManager.SplitPermissionInfo> permissionList =
+ getSplitPermissionInfos();
int numSplitPerms = permissionList.size();
for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) {
- SplitPermissionInfoParcelable spi = permissionList.get(splitPermNum);
+ PermissionManager.SplitPermissionInfo spi = permissionList.get(splitPermNum);
List<String> newPerms = spi.getNewPermissions();
int numNewPerms = newPerms.size();
@@ -3356,10 +3255,15 @@ public class PermissionManagerService extends IPermissionManager.Stub {
return updatedUserIds;
}
+ @NonNull
@Override
public List<SplitPermissionInfoParcelable> getSplitPermissions() {
- return PermissionManager.splitPermissionInfoListToParcelableList(
- SystemConfig.getInstance().getSplitPermissions());
+ return PermissionManager.splitPermissionInfoListToParcelableList(getSplitPermissionInfos());
+ }
+
+ @NonNull
+ private List<PermissionManager.SplitPermissionInfo> getSplitPermissionInfos() {
+ return SystemConfig.getInstance().getSplitPermissions();
}
@NonNull
@@ -5456,94 +5360,4 @@ public class PermissionManagerService extends IPermissionManager.Stub {
|| mDelegatedPermissionNames.contains(permissionName);
}
}
-
- /**
- * Allows injection of services and method responses to facilitate testing.
- *
- * <p>Test classes can create a mock of this class and pass it to the PermissionManagerService
- * constructor to control behavior of services and external methods during execution.
- * @hide
- */
- @VisibleForTesting
- public static class Injector {
- private final Context mContext;
-
- /**
- * Public constructor that accepts a {@code context} within which to operate.
- */
- public Injector(@NonNull Context context) {
- mContext = context;
- }
-
- /**
- * Returns the UID of the calling package.
- */
- public int getCallingUid() {
- return Binder.getCallingUid();
- }
-
- /**
- * Returns the process ID of the calling package.
- */
- public int getCallingPid() {
- return Binder.getCallingPid();
- }
-
- /**
- * Invalidates the package info cache.
- */
- public void invalidatePackageInfoCache() {
- PackageManager.invalidatePackageInfoCache();
- }
-
- /**
- * Disables the permission cache.
- */
- public void disablePermissionCache() {
- PermissionManager.disablePermissionCache();
- }
-
- /**
- * Disables the package name permission cache.
- */
- public void disablePackageNamePermissionCache() {
- PermissionManager.disablePackageNamePermissionCache();
- }
-
- /**
- * Checks if the package running under the specified {@code pid} and {@code uid} has been
- * granted the provided {@code permission}.
- *
- * @return {@link PackageManager#PERMISSION_GRANTED} if the package has been granted the
- * permission, {@link PackageManager#PERMISSION_DENIED} otherwise
- */
- public int checkPermission(@NonNull String permission, int pid, int uid) {
- return mContext.checkPermission(permission, pid, uid);
- }
-
- /**
- * Clears the calling identity to allow subsequent calls to be treated as coming from this
- * package.
- *
- * @return a token that can be used to restore the calling identity
- */
- public long clearCallingIdentity() {
- return Binder.clearCallingIdentity();
- }
-
- /**
- * Restores the calling identity to that of the calling package based on the provided
- * {@code token}.
- */
- public void restoreCallingIdentity(long token) {
- Binder.restoreCallingIdentity(token);
- }
-
- /**
- * Returns the system service with the provided {@code name}.
- */
- public Object getSystemService(@NonNull String name) {
- return mContext.getSystemService(name);
- }
- }
}
diff --git a/services/core/java/com/android/server/policy/OWNERS b/services/core/java/com/android/server/policy/OWNERS
index 0862c05e0ee4..d25ec4a560a3 100644
--- a/services/core/java/com/android/server/policy/OWNERS
+++ b/services/core/java/com/android/server/policy/OWNERS
@@ -1 +1,2 @@
include /services/core/java/com/android/server/wm/OWNERS
+include /services/core/java/com/android/server/input/OWNERS
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 1ff3a3fb1d35..ecbf266c89cb 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -2647,7 +2647,11 @@ class ActivityStarter {
if (next != null) {
next.setCurrentLaunchCanTurnScreenOn(true);
}
- mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetStack, null, mOptions);
+ if (mTargetStack.isFocusable()) {
+ mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetStack, null, mOptions);
+ } else {
+ mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS);
+ }
} else {
ActivityOptions.abort(mOptions);
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index e60f2e70f25c..8d6d981be2b8 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -80,6 +80,7 @@ import static android.view.WindowManager.TRANSIT_TO_FRONT;
import static android.window.DisplayAreaOrganizer.FEATURE_ROOT;
import static android.window.DisplayAreaOrganizer.FEATURE_WINDOWED_MAGNIFICATION;
+import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_BOOT;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS;
@@ -552,24 +553,56 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
* This just indicates the window the input method is on top of, not
* necessarily the window its input is going to.
*/
- WindowState mInputMethodTarget;
+ private WindowState mImeLayeringTarget;
/**
* The window which receives input from the input method. This is also a candidate of the
* input method control target.
*/
- WindowState mInputMethodInputTarget;
+ private WindowState mImeInputTarget;
/**
* This controls the visibility and animation of the input method window.
*/
- InsetsControlTarget mInputMethodControlTarget;
+ private InsetsControlTarget mImeControlTarget;
+
+ /**
+ * Used by {@link #getImeTarget} to return the IME target which the input method window on
+ * top of for adjusting input method window surface layer Z-Ordering.
+ *
+ * @see #mImeLayeringTarget
+ */
+ static final int IME_TARGET_LAYERING = 0;
+
+ /**
+ * Used by {@link #getImeTarget} to return the IME target which received the input connection
+ * from IME.
+ *
+ * @see #mImeInputTarget
+ */
+ static final int IME_TARGET_INPUT = 1;
+
+ /**
+ * Used by {@link #getImeTarget} to return the IME target which controls the IME insets
+ * visibility and animation.
+ *
+ * @see #mImeControlTarget
+ */
+ static final int IME_TARGET_CONTROL = 2;
+
+ @IntDef(flag = false, prefix = { "IME_TARGET_" }, value = {
+ IME_TARGET_LAYERING,
+ IME_TARGET_INPUT,
+ IME_TARGET_CONTROL,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ @interface InputMethodTarget {}
/** The surface parent of the IME container. */
private SurfaceControl mInputMethodSurfaceParent;
- /** If true hold off on modifying the animation layer of mInputMethodTarget */
- boolean mInputMethodTargetWaitingAnim;
+ /** If {@code true} hold off on modifying the animation layer of {@link #mImeLayeringTarget} */
+ boolean mImeLayeringTargetWaitingAnim;
private final PointerEventDispatcher mPointerEventDispatcher;
@@ -814,7 +847,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
private final Consumer<WindowState> mApplyPostLayoutPolicy =
w -> getDisplayPolicy().applyPostLayoutPolicyLw(w, w.mAttrs, w.getParentWindow(),
- mInputMethodTarget);
+ mImeLayeringTarget);
private final Consumer<WindowState> mApplySurfaceChangesTransaction = w -> {
final WindowSurfacePlacer surfacePlacer = mWmService.mWindowPlacerLocked;
@@ -2256,8 +2289,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@Nullable
Task getRootTask(int rootTaskId) {
- return getItemFromTaskDisplayAreas(taskDisplayArea ->
- taskDisplayArea.getRootTask(rootTaskId));
+ return getRootTask(rootTask -> rootTask.getRootTaskId() == rootTaskId);
}
int getRootTaskCount() {
@@ -2834,7 +2866,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
void prepareFreezingTaskBounds() {
- forAllTaskDisplayAreas(TaskDisplayArea::prepareFreezingTaskBounds);
+ forAllRootTasks(Task::prepareFreezingTaskBounds);
}
void rotateBounds(int oldRotation, int newRotation, Rect bounds) {
@@ -2943,15 +2975,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
proto.write(FOCUSED_ROOT_TASK_ID, INVALID_TASK_ID);
}
proto.write(DISPLAY_READY, isReady());
- if (mInputMethodTarget != null) {
- mInputMethodTarget.dumpDebug(proto, INPUT_METHOD_TARGET, logLevel);
+ if (mImeLayeringTarget != null) {
+ mImeLayeringTarget.dumpDebug(proto, INPUT_METHOD_TARGET, logLevel);
}
- if (mInputMethodInputTarget != null) {
- mInputMethodInputTarget.dumpDebug(proto, INPUT_METHOD_INPUT_TARGET, logLevel);
+ if (mImeInputTarget != null) {
+ mImeInputTarget.dumpDebug(proto, INPUT_METHOD_INPUT_TARGET, logLevel);
}
- if (mInputMethodControlTarget != null
- && mInputMethodControlTarget.getWindow() != null) {
- mInputMethodControlTarget.getWindow().dumpDebug(proto, INPUT_METHOD_CONTROL_TARGET,
+ if (mImeControlTarget != null
+ && mImeControlTarget.getWindow() != null) {
+ mImeControlTarget.getWindow().dumpDebug(proto, INPUT_METHOD_CONTROL_TARGET,
logLevel);
}
if (mCurrentFocus != null) {
@@ -3207,7 +3239,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
boolean imWindowChanged = false;
final WindowState imWindow = mInputMethodWindow;
if (imWindow != null) {
- final WindowState prevTarget = mInputMethodTarget;
+ final WindowState prevTarget = mImeLayeringTarget;
final WindowState newTarget = computeImeTarget(true /* updateImeTarget*/);
imWindowChanged = prevTarget != newTarget;
@@ -3461,7 +3493,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
/**
- * Determine and return the window that should be the IME target.
+ * Determine and return the window that should be the IME target for layering the IME window.
* @param updateImeTarget If true the system IME target will be updated to match what we found.
* @return The window that should be used as the IME target or null if there isn't any.
*/
@@ -3470,13 +3502,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// There isn't an IME so there shouldn't be a target...That was easy!
if (updateImeTarget) {
if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from "
- + mInputMethodTarget + " to null since mInputMethodWindow is null");
- setInputMethodTarget(null, mInputMethodTargetWaitingAnim);
+ + mImeLayeringTarget + " to null since mInputMethodWindow is null");
+ setImeLayeringTarget(null, mImeLayeringTargetWaitingAnim);
}
return null;
}
- final WindowState curTarget = mInputMethodTarget;
+ final WindowState curTarget = mImeLayeringTarget;
if (!canUpdateImeTarget()) {
if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Defer updating IME target");
return curTarget;
@@ -3531,7 +3563,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " + curTarget
+ " to null." + (SHOW_STACK_CRAWLS ? " Callers="
+ Debug.getCallers(4) : ""));
- setInputMethodTarget(null, mInputMethodTargetWaitingAnim);
+ setImeLayeringTarget(null, mImeLayeringTargetWaitingAnim);
}
return null;
@@ -3558,7 +3590,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
if (mAppTransition.isTransitionSet()) {
// If we are currently setting up for an animation, hold everything until we
// can find out what will happen.
- setInputMethodTarget(highestTarget, true);
+ setImeLayeringTarget(highestTarget, true);
return highestTarget;
}
}
@@ -3566,7 +3598,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " + curTarget + " to "
+ target + (SHOW_STACK_CRAWLS ? " Callers=" + Debug.getCallers(4) : ""));
- setInputMethodTarget(target, false);
+ setImeLayeringTarget(target, false);
}
return target;
@@ -3577,24 +3609,24 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
* the candidate app window token if needed.
*/
void computeImeTargetIfNeeded(ActivityRecord candidate) {
- if (mInputMethodTarget != null && mInputMethodTarget.mActivityRecord == candidate) {
+ if (mImeLayeringTarget != null && mImeLayeringTarget.mActivityRecord == candidate) {
computeImeTarget(true /* updateImeTarget */);
}
}
private boolean isImeControlledByApp() {
- return mInputMethodInputTarget != null && !WindowConfiguration.isSplitScreenWindowingMode(
- mInputMethodInputTarget.getWindowingMode());
+ return mImeInputTarget != null && !WindowConfiguration.isSplitScreenWindowingMode(
+ mImeInputTarget.getWindowingMode());
}
boolean isImeAttachedToApp() {
return isImeControlledByApp()
- && mInputMethodTarget != null
- && mInputMethodTarget.mActivityRecord != null
- && mInputMethodTarget.getWindowingMode() == WINDOWING_MODE_FULLSCREEN
+ && mImeLayeringTarget != null
+ && mImeLayeringTarget.mActivityRecord != null
+ && mImeLayeringTarget.getWindowingMode() == WINDOWING_MODE_FULLSCREEN
// An activity with override bounds should be letterboxed inside its parent bounds,
// so it doesn't fill the screen.
- && mInputMethodTarget.mActivityRecord.matchParentBounds();
+ && mImeLayeringTarget.mActivityRecord.matchParentBounds();
}
/**
@@ -3621,6 +3653,24 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
return statusBar != null ? statusBar : defaultDc.mRemoteInsetsControlTarget;
}
+ /**
+ * Returns the corresponding IME insets control target according the IME target type.
+ *
+ * @param type The type of the IME target.
+ * @see #IME_TARGET_LAYERING
+ * @see #IME_TARGET_INPUT
+ * @see #IME_TARGET_CONTROL
+ */
+ InsetsControlTarget getImeTarget(@InputMethodTarget int type) {
+ switch (type) {
+ case IME_TARGET_LAYERING: return mImeLayeringTarget;
+ case IME_TARGET_INPUT: return mImeInputTarget;
+ case IME_TARGET_CONTROL: return mImeControlTarget;
+ default:
+ return null;
+ }
+ }
+
@DisplayImePolicy int getImePolicy() {
if (!isTrusted()) {
return DISPLAY_IME_POLICY_FALLBACK_DISPLAY;
@@ -3638,6 +3688,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
return mWmService.mForceDesktopModeOnExternalDisplays && !isDefaultDisplay && !isPrivate();
}
+ @VisibleForTesting
+ void setImeLayeringTarget(WindowState target) {
+ mImeLayeringTarget = target;
+ }
+
/**
* Sets the window the IME is on top of.
* @param target window to place the IME surface on top of. If {@code null}, the IME will be
@@ -3645,13 +3700,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
* @param targetWaitingAnim if {@code true}, hold off on modifying the animation layer of
* the target.
*/
- private void setInputMethodTarget(@Nullable WindowState target, boolean targetWaitingAnim) {
- if (target == mInputMethodTarget && mInputMethodTargetWaitingAnim == targetWaitingAnim) {
+ private void setImeLayeringTarget(@Nullable WindowState target, boolean targetWaitingAnim) {
+ if (target == mImeLayeringTarget && mImeLayeringTargetWaitingAnim == targetWaitingAnim) {
return;
}
ProtoLog.i(WM_DEBUG_IME, "setInputMethodTarget %s", target);
- mInputMethodTarget = target;
- mInputMethodTargetWaitingAnim = targetWaitingAnim;
+ mImeLayeringTarget = target;
+ mImeLayeringTargetWaitingAnim = targetWaitingAnim;
// 1. Reparent the IME container window to the target root DA to get the correct bounds and
// config. (Only happens when the target window is in a different root DA)
@@ -3673,23 +3728,33 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
updateImeControlTarget();
}
+ @VisibleForTesting
+ void setImeInputTarget(WindowState target) {
+ mImeInputTarget = target;
+ }
+
+ @VisibleForTesting
+ void setImeControlTarget(InsetsControlTarget target) {
+ mImeControlTarget = target;
+ }
+
/**
* The IME input target is the window which receives input from IME. It is also a candidate
* which controls the visibility and animation of the input method window.
*/
- void setInputMethodInputTarget(WindowState target) {
- if (mInputMethodInputTarget != target) {
+ void updateImeInputAndControlTarget(WindowState target) {
+ if (mImeInputTarget != target) {
ProtoLog.i(WM_DEBUG_IME, "setInputMethodInputTarget %s", target);
- mInputMethodInputTarget = target;
+ mImeInputTarget = target;
updateImeControlTarget();
}
}
void updateImeControlTarget() {
- mInputMethodControlTarget = computeImeControlTarget();
- mInsetsStateController.onImeControlTargetChanged(mInputMethodControlTarget);
+ mImeControlTarget = computeImeControlTarget();
+ mInsetsStateController.onImeControlTargetChanged(mImeControlTarget);
- final WindowState win = InsetsControlTarget.asWindowOrNull(mInputMethodControlTarget);
+ final WindowState win = InsetsControlTarget.asWindowOrNull(mImeControlTarget);
final IBinder token = win != null ? win.mClient.asBinder() : null;
// Note: not allowed to call into IMMS with the WM lock held, hence the post.
mWmService.mH.post(() ->
@@ -3712,12 +3777,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@VisibleForTesting
InsetsControlTarget computeImeControlTarget() {
if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null
- || (mInputMethodInputTarget != null
- && getImeHostOrFallback(mInputMethodInputTarget.getWindow())
+ || (mImeInputTarget != null
+ && getImeHostOrFallback(mImeInputTarget.getWindow())
== mRemoteInsetsControlTarget)) {
return mRemoteInsetsControlTarget;
} else {
- return mInputMethodInputTarget;
+ return mImeInputTarget;
}
}
@@ -3734,7 +3799,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
// screen. If it's not covering the entire screen the IME might extend beyond the apps
// bounds.
if (allowAttachToApp && isImeAttachedToApp()) {
- return mInputMethodTarget.mActivityRecord.getSurfaceControl();
+ return mImeLayeringTarget.mActivityRecord.getSurfaceControl();
}
// Otherwise, we just attach it to where the display area policy put it.
@@ -4191,8 +4256,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
// Initialize state of exiting applications.
- forAllTaskDisplayAreas(taskDisplayArea -> {
- taskDisplayArea.setExitingTokensHasVisible(hasVisible);
+ forAllRootTasks(task -> {
+ final ArrayList<ActivityRecord> activities = task.mExitingActivities;
+ for (int j = activities.size() - 1; j >= 0; --j) {
+ activities.get(j).hasVisible = hasVisible;
+ }
});
}
@@ -4205,7 +4273,22 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
}
// Time to remove any exiting applications?
- forAllTaskDisplayAreas(TaskDisplayArea::removeExistingAppTokensIfPossible);
+ forAllRootTasks(task -> {
+ final ArrayList<ActivityRecord> activities = task.mExitingActivities;
+ for (int j = activities.size() - 1; j >= 0; --j) {
+ final ActivityRecord activity = activities.get(j);
+ if (!activity.hasVisible && !mDisplayContent.mClosingApps.contains(activity)
+ && (!activity.mIsExiting || activity.isEmpty())) {
+ // Make sure there is no animation running on this activity, so any windows
+ // associated with it will be removed as soon as their animations are
+ // complete.
+ cancelAnimation();
+ ProtoLog.v(WM_DEBUG_ADD_REMOVE,
+ "performLayout: Activity exiting now removed %s", activity);
+ activity.removeIfPossible();
+ }
+ }
+ });
}
@Override
@@ -4355,7 +4438,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
private boolean skipImeWindowsDuringTraversal(DisplayContent dc) {
// We skip IME windows so they're processed just above their target, except
// in split-screen mode where we process the IME containers above the docked divider.
- return dc.mInputMethodTarget != null
+ return dc.getImeTarget(IME_TARGET_LAYERING) != null
&& !dc.getDefaultTaskDisplayArea().isSplitScreenModeActivated();
}
@@ -4470,7 +4553,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@Override
void assignChildLayers(SurfaceControl.Transaction t) {
mImeWindowsContainers.setNeedsLayer();
- final WindowState imeTarget = mInputMethodTarget;
+ final WindowState imeTarget = mImeLayeringTarget;
// In the case where we have an IME target that is not in split-screen mode IME
// assignment is easy. We just need the IME to go directly above the target. This way
// children of the target will naturally go above the IME and everyone is happy.
@@ -5128,15 +5211,56 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
* ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
*/
void removeRootTasksInWindowingModes(int... windowingModes) {
- forAllTaskDisplayAreas(taskDisplayArea -> {
- taskDisplayArea.removeRootTasksInWindowingModes(windowingModes);
+ if (windowingModes == null || windowingModes.length == 0) {
+ return;
+ }
+
+ // Collect the root tasks that are necessary to be removed instead of performing the removal
+ // by looping the children, so that we don't miss any root tasks after the children size
+ // changed or reordered.
+ final ArrayList<Task> rootTasks = new ArrayList<>();
+ forAllRootTasks(rootTask -> {
+ for (int windowingMode : windowingModes) {
+ if (rootTask.mCreatedByOrganizer
+ || rootTask.getWindowingMode() != windowingMode
+ || !rootTask.isActivityTypeStandardOrUndefined()) {
+ continue;
+ }
+ rootTasks.add(rootTask);
+ }
});
+ for (int i = rootTasks.size() - 1; i >= 0; --i) {
+ mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i));
+ }
}
void removeRootTasksWithActivityTypes(int... activityTypes) {
- forAllTaskDisplayAreas(taskDisplayArea -> {
- taskDisplayArea.removeRootTasksWithActivityTypes(activityTypes);
+ if (activityTypes == null || activityTypes.length == 0) {
+ return;
+ }
+
+ // Collect the root tasks that are necessary to be removed instead of performing the removal
+ // by looping the children, so that we don't miss any root tasks after the children size
+ // changed or reordered.
+ final ArrayList<Task> rootTasks = new ArrayList<>();
+ forAllRootTasks(rootTask -> {
+ for (int activityType : activityTypes) {
+ // Collect the root tasks that are currently being organized.
+ if (rootTask.mCreatedByOrganizer) {
+ for (int k = rootTask.getChildCount() - 1; k >= 0; --k) {
+ final Task task = (Task) rootTask.getChildAt(k);
+ if (task.getActivityType() == activityType) {
+ rootTasks.add(task);
+ }
+ }
+ } else if (rootTask.getActivityType() == activityType) {
+ rootTasks.add(rootTask);
+ }
+ }
});
+ for (int i = rootTasks.size() - 1; i >= 0; --i) {
+ mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i));
+ }
}
ActivityRecord topRunningActivity() {
diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
index 91106eff9805..17c3b20c9e40 100644
--- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
+++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java
@@ -19,10 +19,14 @@ package com.android.server.wm;
import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME;
+import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
+import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
+import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.ImeInsetsSourceProviderProto.IME_TARGET_FROM_IME;
import static com.android.server.wm.ImeInsetsSourceProviderProto.INSETS_SOURCE_PROVIDER;
import static com.android.server.wm.ImeInsetsSourceProviderProto.IS_IME_LAYOUT_DRAWN;
+import android.annotation.NonNull;
import android.os.Trace;
import android.util.proto.ProtoOutputStream;
import android.view.InsetsSource;
@@ -37,9 +41,9 @@ import java.io.PrintWriter;
* Controller for IME inset source on the server. It's called provider as it provides the
* {@link InsetsSource} to the client that uses it in {@link InsetsSourceConsumer}.
*/
-class ImeInsetsSourceProvider extends InsetsSourceProvider {
+final class ImeInsetsSourceProvider extends InsetsSourceProvider {
- private InsetsControlTarget mImeTargetFromIme;
+ private InsetsControlTarget mImeRequester;
private Runnable mShowImeRunner;
private boolean mIsImeLayoutDrawn;
private boolean mImeShowing;
@@ -56,12 +60,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
* @param imeTarget imeTarget on which IME request is coming from.
*/
void scheduleShowImePostLayout(InsetsControlTarget imeTarget) {
- boolean targetChanged = mImeTargetFromIme != imeTarget
- && mImeTargetFromIme != null && imeTarget != null && mShowImeRunner != null
- && imeTarget.getWindow() != null && mImeTargetFromIme.getWindow() != null
- && mImeTargetFromIme.getWindow().mActivityRecord
- == imeTarget.getWindow().mActivityRecord;
- mImeTargetFromIme = imeTarget;
+ boolean targetChanged = isTargetChangedWithinActivity(imeTarget);
+ mImeRequester = imeTarget;
if (targetChanged) {
// target changed, check if new target can show IME.
ProtoLog.d(WM_DEBUG_IME, "IME target changed within ActivityRecord");
@@ -72,24 +72,24 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
return;
}
- ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeTargetFromIme.getWindow() == null
- ? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName());
+ ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeRequester.getWindow() == null
+ ? mImeRequester : mImeRequester.getWindow().getName());
mShowImeRunner = () -> {
ProtoLog.d(WM_DEBUG_IME, "Run showImeRunner");
// Target should still be the same.
- if (isImeTargetFromDisplayContentAndImeSame()) {
- final InsetsControlTarget target = mDisplayContent.mInputMethodControlTarget;
+ if (isReadyToShowIme()) {
+ final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_CONTROL);
ProtoLog.i(WM_DEBUG_IME, "call showInsets(ime) on %s",
target.getWindow() != null ? target.getWindow().getName() : "");
setImeShowing(true);
target.showInsets(WindowInsets.Type.ime(), true /* fromIme */);
Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "WMS.showImePostLayout", 0);
- if (target != mImeTargetFromIme && mImeTargetFromIme != null) {
+ if (target != mImeRequester && mImeRequester != null) {
ProtoLog.w(WM_DEBUG_IME,
"showInsets(ime) was requested by different window: %s ",
- (mImeTargetFromIme.getWindow() != null
- ? mImeTargetFromIme.getWindow().getName() : ""));
+ (mImeRequester.getWindow() != null
+ ? mImeRequester.getWindow().getName() : ""));
}
}
abortShowImePostLayout();
@@ -100,8 +100,7 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
void checkShowImePostLayout() {
// check if IME is drawn
if (mIsImeLayoutDrawn
- || (mImeTargetFromIme != null
- && isImeTargetFromDisplayContentAndImeSame()
+ || (isReadyToShowIme()
&& mWin != null
&& mWin.isDrawn()
&& !mWin.mGivenInsetsPending)) {
@@ -118,13 +117,13 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
*/
void abortShowImePostLayout() {
ProtoLog.d(WM_DEBUG_IME, "abortShowImePostLayout");
- mImeTargetFromIme = null;
+ mImeRequester = null;
mIsImeLayoutDrawn = false;
mShowImeRunner = null;
}
@VisibleForTesting
- boolean isImeTargetFromDisplayContentAndImeSame() {
+ boolean isReadyToShowIme() {
// IMMS#mLastImeTargetWindow always considers focused window as
// IME target, however DisplayContent#computeImeTarget() can compute
// a different IME target.
@@ -134,35 +133,75 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
// Also, if imeTarget is closing, it would be considered as outdated target.
// TODO(b/139861270): Remove the child & sublayer check once IMMS is aware of
// actual IME target.
- final WindowState dcTarget = mDisplayContent.mInputMethodTarget;
- final InsetsControlTarget controlTarget = mDisplayContent.mInputMethodControlTarget;
- if (dcTarget == null || mImeTargetFromIme == null) {
+ final InsetsControlTarget dcTarget = mDisplayContent.getImeTarget(IME_TARGET_LAYERING);
+ if (dcTarget == null || mImeRequester == null) {
return false;
}
- ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeTargetFromIme: %s",
- dcTarget.getName(), mImeTargetFromIme.getWindow() == null
- ? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName());
-
- return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget)
- || (mImeTargetFromIme != null && mImeTargetFromIme.getWindow() != null
- && dcTarget.getParentWindow() == mImeTargetFromIme
- && dcTarget.mSubLayer > mImeTargetFromIme.getWindow().mSubLayer)
- || mImeTargetFromIme == mDisplayContent.getImeFallback()
- || mImeTargetFromIme == mDisplayContent.mInputMethodInputTarget
- || controlTarget == mImeTargetFromIme
- && (mImeTargetFromIme.getWindow() == null
- || !mImeTargetFromIme.getWindow().isClosing());
+ ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeRequester: %s",
+ dcTarget.getWindow().getName(), mImeRequester.getWindow() == null
+ ? mImeRequester : mImeRequester.getWindow().getName());
+
+ return isImeLayeringTarget(mImeRequester, dcTarget)
+ || isAboveImeLayeringTarget(mImeRequester, dcTarget)
+ || isImeFallbackTarget(mImeRequester)
+ || isImeInputTarget(mImeRequester)
+ || sameAsImeControlTarget();
}
+ // ---------------------------------------------------------------------------------------
+ // Methods for checking IME insets target changing state.
+ //
+ private static boolean isImeLayeringTarget(@NonNull InsetsControlTarget target,
+ @NonNull InsetsControlTarget dcTarget) {
+ return !dcTarget.getWindow().isClosing() && target == dcTarget;
+ }
+
+ private static boolean isAboveImeLayeringTarget(@NonNull InsetsControlTarget target,
+ @NonNull InsetsControlTarget dcTarget) {
+ return target.getWindow() != null
+ && dcTarget.getWindow().getParentWindow() == target
+ && dcTarget.getWindow().mSubLayer > target.getWindow().mSubLayer;
+ }
+
+ private boolean isImeFallbackTarget(InsetsControlTarget target) {
+ return target == mDisplayContent.getImeFallback();
+ }
+
+ private boolean isImeInputTarget(InsetsControlTarget target) {
+ return target == mDisplayContent.getImeTarget(IME_TARGET_INPUT);
+ }
+
+ private boolean sameAsImeControlTarget() {
+ final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_CONTROL);
+ return target == mImeRequester
+ && (mImeRequester.getWindow() == null
+ || !mImeRequester.getWindow().isClosing());
+ }
+
+ private boolean isTargetChangedWithinActivity(InsetsControlTarget target) {
+ // We don't consider the target out of the activity.
+ if (target == null || target.getWindow() == null) {
+ return false;
+ }
+ return mImeRequester != target
+ && mImeRequester != null && mShowImeRunner != null
+ && mImeRequester.getWindow() != null
+ && mImeRequester.getWindow().mActivityRecord
+ == target.getWindow().mActivityRecord;
+ }
+ // ---------------------------------------------------------------------------------------
+
@Override
public void dump(PrintWriter pw, String prefix) {
super.dump(pw, prefix);
pw.print(prefix);
pw.print("mImeShowing=");
pw.print(mImeShowing);
- if (mImeTargetFromIme != null) {
- pw.print(" showImePostLayout pending for mImeTargetFromIme=");
- pw.print(mImeTargetFromIme);
+ if (mImeRequester != null) {
+ pw.print(prefix);
+ pw.print("showImePostLayout pending for mImeRequester=");
+ pw.print(mImeRequester);
+ pw.println();
}
pw.println();
}
@@ -171,8 +210,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider {
void dumpDebug(ProtoOutputStream proto, long fieldId, @WindowTraceLogLevel int logLevel) {
final long token = proto.start(fieldId);
super.dumpDebug(proto, INSETS_SOURCE_PROVIDER, logLevel);
- if (mImeTargetFromIme != null) {
- mImeTargetFromIme.getWindow().dumpDebug(proto, IME_TARGET_FROM_IME, logLevel);
+ if (mImeRequester != null) {
+ mImeRequester.getWindow().dumpDebug(proto, IME_TARGET_FROM_IME, logLevel);
}
proto.write(IS_IME_LAYOUT_DRAWN, mIsImeLayoutDrawn);
proto.end(token);
diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java
index c414c6421dc8..57d48c6bb9f4 100644
--- a/services/core/java/com/android/server/wm/Session.java
+++ b/services/core/java/com/android/server/wm/Session.java
@@ -18,6 +18,7 @@ package com.android.server.wm;
import static android.Manifest.permission.DEVICE_POWER;
import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
+import static android.Manifest.permission.HIDE_OVERLAY_WINDOWS;
import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW;
import static android.Manifest.permission.START_TASKS_FROM_RECENTS;
import static android.app.ActivityTaskManager.INVALID_TASK_ID;
@@ -124,7 +125,9 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission(
INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED;
mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission(
- HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED;
+ HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED
+ || service.mContext.checkCallingOrSelfPermission(HIDE_OVERLAY_WINDOWS)
+ == PERMISSION_GRANTED;
mOverlaysCanBeHidden = !mCanAddInternalSystemWindow
&& !mService.mAtmInternal.isCallerRecents(mUid);
mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER)
diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
index 34d084a3f9f8..92e2ee6f8af9 100644
--- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
+++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java
@@ -259,6 +259,7 @@ class SurfaceAnimationRunner {
private void applyTransaction() {
mFrameTransaction.setAnimationTransaction();
+ mFrameTransaction.setFrameTimelineVsync(mChoreographer.getVsyncId());
mFrameTransaction.apply();
mApplyScheduled = false;
}
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 378638f82c37..c4be680a1716 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -4125,7 +4125,7 @@ class Task extends WindowContainer<WindowContainer> {
info.positionInParent = getRelativePosition();
info.parentBounds = getParentBounds();
- info.pictureInPictureParams = getPictureInPictureParams();
+ info.pictureInPictureParams = getPictureInPictureParams(top);
info.topActivityInfo = mReuseActivitiesReport.top != null
? mReuseActivitiesReport.top.info
: null;
@@ -4142,7 +4142,10 @@ class Task extends WindowContainer<WindowContainer> {
}
@Nullable PictureInPictureParams getPictureInPictureParams() {
- final Task top = getTopMostTask();
+ return getPictureInPictureParams(getTopMostTask());
+ }
+
+ private @Nullable PictureInPictureParams getPictureInPictureParams(Task top) {
if (top == null) return null;
final ActivityRecord rootActivity = top.getRootActivity();
return (rootActivity == null || rootActivity.pictureInPictureArgs.empty())
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 5522eeb6d900..7fed84015e8b 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -33,7 +33,6 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
-import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS;
@@ -610,34 +609,6 @@ final class TaskDisplayArea extends DisplayArea<Task> {
return false;
}
- void setExitingTokensHasVisible(boolean hasVisible) {
- for (int i = mChildren.size() - 1; i >= 0; --i) {
- final ArrayList<ActivityRecord> activities = mChildren.get(i).mExitingActivities;
- for (int j = activities.size() - 1; j >= 0; --j) {
- activities.get(j).hasVisible = hasVisible;
- }
- }
- }
-
- void removeExistingAppTokensIfPossible() {
- for (int i = mChildren.size() - 1; i >= 0; --i) {
- final ArrayList<ActivityRecord> activities = mChildren.get(i).mExitingActivities;
- for (int j = activities.size() - 1; j >= 0; --j) {
- final ActivityRecord activity = activities.get(j);
- if (!activity.hasVisible && !mDisplayContent.mClosingApps.contains(activity)
- && (!activity.mIsExiting || activity.isEmpty())) {
- // Make sure there is no animation running on this activity, so any windows
- // associated with it will be removed as soon as their animations are
- // complete.
- cancelAnimation();
- ProtoLog.v(WM_DEBUG_ADD_REMOVE,
- "performLayout: Activity exiting now removed %s", activity);
- activity.removeIfPossible();
- }
- }
- }
- }
-
@Override
int getOrientation(int candidate) {
mLastOrientationSource = null;
@@ -894,11 +865,6 @@ final class TaskDisplayArea extends DisplayArea<Task> {
}
}
- @Nullable
- Task getRootTask(int rootTaskId) {
- return getRootTask(stack -> stack.getRootTaskId() == rootTaskId);
- }
-
/**
* Returns an existing stack compatible with the windowing mode and activity type or creates one
* if a compatible stack doesn't exist.
@@ -1296,69 +1262,6 @@ final class TaskDisplayArea extends DisplayArea<Task> {
}
}
- /**
- * Removes root tasks in the input windowing modes from the system if they are of activity type
- * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED
- */
- void removeRootTasksInWindowingModes(int... windowingModes) {
- if (windowingModes == null || windowingModes.length == 0) {
- return;
- }
-
- // Collect the root tasks that are necessary to be removed instead of performing the removal
- // by looping the children, so that we don't miss any root tasks after the children size
- // changed or reordered.
- final ArrayList<Task> rootTasks = new ArrayList<>();
- for (int j = windowingModes.length - 1; j >= 0; --j) {
- final int windowingMode = windowingModes[j];
- for (int i = mChildren.size() - 1; i >= 0; --i) {
- final Task rootTask = mChildren.get(i);
- if (rootTask.mCreatedByOrganizer
- || !rootTask.isActivityTypeStandardOrUndefined()
- || rootTask.getWindowingMode() != windowingMode) {
- continue;
- }
- rootTasks.add(rootTask);
- }
- }
-
- for (int i = rootTasks.size() - 1; i >= 0; --i) {
- mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i));
- }
- }
-
- void removeRootTasksWithActivityTypes(int... activityTypes) {
- if (activityTypes == null || activityTypes.length == 0) {
- return;
- }
-
- // Collect the root tasks that are necessary to be removed instead of performing the removal
- // by looping the children, so that we don't miss any root tasks after the children size
- // changed or reordered.
- final ArrayList<Task> rootTasks = new ArrayList<>();
- for (int j = activityTypes.length - 1; j >= 0; --j) {
- final int activityType = activityTypes[j];
- for (int i = mChildren.size() - 1; i >= 0; --i) {
- final Task rootTask = mChildren.get(i);
- // Collect the root tasks that are currently being organized.
- if (rootTask.mCreatedByOrganizer) {
- for (int k = rootTask.getChildCount() - 1; k >= 0; --k) {
- final Task task = (Task) rootTask.getChildAt(k);
- if (task.getActivityType() == activityType) {
- rootTasks.add(task);
- }
- }
- } else if (rootTask.getActivityType() == activityType) {
- rootTasks.add(rootTask);
- }
- }
- }
-
- for (int i = rootTasks.size() - 1; i >= 0; --i) {
- mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i));
- }
- }
-
void onSplitScreenModeDismissed() {
// The focused task could be a non-resizeable fullscreen root task that is on top of the
// other split-screen tasks, therefore had to dismiss split-screen, make sure the current
@@ -1842,13 +1745,6 @@ final class TaskDisplayArea extends DisplayArea<Task> {
}
}
- void prepareFreezingTaskBounds() {
- for (int stackNdx = getChildCount() - 1; stackNdx >= 0; --stackNdx) {
- final Task stack = getChildAt(stackNdx);
- stack.prepareFreezingTaskBounds();
- }
- }
-
/**
* Removes the stacks in the node applying the content removal node from the display.
*
diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java
index ca44f0d60226..58aca20af926 100644
--- a/services/core/java/com/android/server/wm/TaskOrganizerController.java
+++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java
@@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED;
import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER;
+import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.WindowOrganizerController.CONTROLLABLE_CONFIGS;
import static com.android.server.wm.WindowOrganizerController.CONTROLLABLE_WINDOW_CONFIGS;
@@ -580,11 +581,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub {
synchronized (mGlobalLock) {
DisplayContent dc = mService.mWindowManager.mRoot
.getDisplayContent(displayId);
- if (dc == null || dc.mInputMethodTarget == null) {
+ if (dc == null || dc.getImeTarget(IME_TARGET_LAYERING) == null) {
return null;
}
// Avoid WindowState#getRootTask() so we don't attribute system windows to a task.
- final Task task = dc.mInputMethodTarget.getTask();
+ final Task task = dc.getImeTarget(IME_TARGET_LAYERING).getWindow().getTask();
if (task == null) {
return null;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index f23319936536..617b21c838e1 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -105,6 +105,9 @@ import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN;
import static com.android.server.LockGuard.INDEX_WINDOW;
import static com.android.server.LockGuard.installLock;
import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
+import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL;
+import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
+import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN;
import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS;
import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION;
@@ -6322,20 +6325,20 @@ public class WindowManagerService extends IWindowManager.Stub
mRoot.dumpTopFocusedDisplayId(pw);
mRoot.forAllDisplays(dc -> {
final int displayId = dc.getDisplayId();
- final WindowState inputMethodTarget = dc.mInputMethodTarget;
- final WindowState inputMethodInputTarget = dc.mInputMethodInputTarget;
- final InsetsControlTarget inputMethodControlTarget = dc.mInputMethodControlTarget;
- if (inputMethodTarget != null) {
- pw.print(" mInputMethodTarget in display# "); pw.print(displayId);
- pw.print(' '); pw.println(inputMethodTarget);
+ final InsetsControlTarget imeLayeringTarget = dc.getImeTarget(IME_TARGET_LAYERING);
+ final InsetsControlTarget imeInputTarget = dc.getImeTarget(IME_TARGET_INPUT);
+ final InsetsControlTarget imeControlTarget = dc.getImeTarget(IME_TARGET_CONTROL);
+ if (imeLayeringTarget != null) {
+ pw.print(" imeLayeringTarget in display# "); pw.print(displayId);
+ pw.print(' '); pw.println(imeLayeringTarget);
}
- if (inputMethodInputTarget != null) {
- pw.print(" mInputMethodInputTarget in display# "); pw.print(displayId);
- pw.print(' '); pw.println(inputMethodInputTarget);
+ if (imeInputTarget != null) {
+ pw.print(" imeInputTarget in display# "); pw.print(displayId);
+ pw.print(' '); pw.println(imeInputTarget);
}
- if (inputMethodControlTarget != null) {
- pw.print(" inputMethodControlTarget in display# "); pw.print(displayId);
- pw.print(' '); pw.println(inputMethodControlTarget);
+ if (imeControlTarget != null) {
+ pw.print(" imeControlTarget in display# "); pw.print(displayId);
+ pw.print(' '); pw.println(imeControlTarget);
}
});
pw.print(" mInTouchMode="); pw.println(mInTouchMode);
@@ -7630,7 +7633,7 @@ public class WindowManagerService extends IWindowManager.Stub
synchronized (mGlobalLock) {
final WindowState imeTarget = mWindowMap.get(imeTargetWindowToken);
if (imeTarget != null) {
- imeTarget.getDisplayContent().setInputMethodInputTarget(imeTarget);
+ imeTarget.getDisplayContent().updateImeInputAndControlTarget(imeTarget);
}
}
}
@@ -7773,10 +7776,10 @@ public class WindowManagerService extends IWindowManager.Stub
// requested to be hidden.
dc.getInsetsStateController().getImeSourceProvider().abortShowImePostLayout();
}
- if (dc != null && dc.mInputMethodControlTarget != null) {
+ if (dc != null && dc.getImeTarget(IME_TARGET_CONTROL) != null) {
ProtoLog.d(WM_DEBUG_IME, "hideIme Control target: %s ",
- dc.mInputMethodControlTarget);
- dc.mInputMethodControlTarget.hideInsets(
+ dc.getImeTarget(IME_TARGET_CONTROL));
+ dc.getImeTarget(IME_TARGET_CONTROL).hideInsets(
WindowInsets.Type.ime(), true /* fromIme */);
}
if (dc != null) {
@@ -7900,7 +7903,7 @@ public class WindowManagerService extends IWindowManager.Stub
if (dc == null) {
return null;
}
- final InsetsControlTarget target = dc.mInputMethodControlTarget;
+ final InsetsControlTarget target = dc.getImeTarget(IME_TARGET_CONTROL);
if (target == null) {
return null;
}
@@ -7913,10 +7916,10 @@ public class WindowManagerService extends IWindowManager.Stub
public String getImeTargetNameForLogging(int displayId) {
synchronized (mGlobalLock) {
final DisplayContent dc = mRoot.getDisplayContent(displayId);
- if (dc == null) {
+ if (dc == null || dc.getImeTarget(IME_TARGET_LAYERING) == null) {
return null;
}
- return dc.mInputMethodTarget != null ? dc.mInputMethodTarget.getName() : null;
+ return dc.getImeTarget(IME_TARGET_LAYERING).getWindow().getName();
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 3bbdcb8dfedd..32b84a8d0a2c 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -119,6 +119,8 @@ import static com.android.server.policy.WindowManagerPolicy.TRANSIT_ENTER;
import static com.android.server.policy.WindowManagerPolicy.TRANSIT_EXIT;
import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE;
import static com.android.server.wm.AnimationSpecProto.MOVE;
+import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
+import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.DisplayContent.logsGestureExclusionRestrictions;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER;
import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM;
@@ -1112,9 +1114,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
final int layoutXDiff;
final int layoutYDiff;
final WindowState imeWin = mWmService.mRoot.getCurrentInputMethodWindow();
+ final InsetsControlTarget imeTarget = dc.getImeTarget(IME_TARGET_LAYERING);
final boolean isInputMethodAdjustTarget = windowsAreFloating
- ? dc.mInputMethodTarget != null && task == dc.mInputMethodTarget.getTask()
- : isInputMethodTarget();
+ ? imeTarget != null && task == imeTarget.getWindow().getTask()
+ : isImeLayeringTarget();
final boolean isImeTarget =
imeWin != null && imeWin.isVisibleNow() && isInputMethodAdjustTarget;
if (isFullscreenAndFillsDisplay || layoutInParentFrame()) {
@@ -1451,9 +1454,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
void onDisplayChanged(DisplayContent dc) {
if (dc != null && mDisplayContent != null && dc != mDisplayContent
- && mDisplayContent.mInputMethodInputTarget == this) {
- dc.setInputMethodInputTarget(mDisplayContent.mInputMethodInputTarget);
- mDisplayContent.mInputMethodInputTarget = null;
+ && getImeInputTarget() == this) {
+ dc.updateImeInputAndControlTarget(getImeInputTarget());
+ mDisplayContent.setImeInputTarget(null);
}
super.onDisplayChanged(dc);
// Window was not laid out for this display yet, so make sure mLayoutSeq does not match.
@@ -2158,14 +2161,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
}
final DisplayContent dc = getDisplayContent();
- if (isInputMethodTarget()) {
- // Make sure to set mInputMethodTarget as null when the removed window is the IME
- // target, in case computeImeTarget may use the outdated target.
- dc.mInputMethodTarget = null;
+ if (isImeLayeringTarget()) {
+ // Make sure to set mImeLayeringTarget as null when the removed window is the
+ // IME target, in case computeImeTarget may use the outdated target.
+ dc.setImeLayeringTarget(null);
dc.computeImeTarget(true /* updateImeTarget */);
}
- if (dc.mInputMethodInputTarget == this) {
- dc.setInputMethodInputTarget(null);
+ if (dc.getImeTarget(IME_TARGET_INPUT) == this) {
+ dc.updateImeInputAndControlTarget(null);
}
final int type = mAttrs.type;
@@ -4615,7 +4618,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
// directly above it. The exception is if we are in split screen
// in which case we process the IME at the DisplayContent level to
// ensure it is above the docked divider.
- if (isInputMethodTarget() && !inSplitScreenWindowingMode()) {
+ if (isImeLayeringTarget() && !inSplitScreenWindowingMode()) {
if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) {
return true;
}
@@ -5211,9 +5214,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
@Override
boolean needsZBoost() {
- final WindowState inputMethodTarget = getDisplayContent().mInputMethodTarget;
- if (mIsImWindow && inputMethodTarget != null) {
- final ActivityRecord activity = inputMethodTarget.mActivityRecord;
+ final InsetsControlTarget target = getDisplayContent().getImeTarget(IME_TARGET_LAYERING);
+ if (mIsImWindow && target != null) {
+ final ActivityRecord activity = target.getWindow().mActivityRecord;
if (activity != null) {
return activity.needsZBoost();
}
@@ -5365,14 +5368,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
if (isChildWindow()) {
// If we are a child of the input method target we need this promotion.
- if (getParentWindow().isInputMethodTarget()) {
+ if (getParentWindow().isImeLayeringTarget()) {
return true;
}
} else if (mActivityRecord != null) {
// Likewise if we share a token with the Input method target and are ordered
// above it but not necessarily a child (e.g. a Dialog) then we also need
// this promotion.
- final WindowState imeTarget = getDisplayContent().mInputMethodTarget;
+ final WindowState imeTarget = getImeLayeringTarget();
boolean inTokenWithAndAboveImeTarget = imeTarget != null && imeTarget != this
&& imeTarget.mToken == mToken
&& mAttrs.type != TYPE_APPLICATION_STARTING
@@ -5499,8 +5502,18 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
return !mTapExcludeRegion.isEmpty();
}
- boolean isInputMethodTarget() {
- return getDisplayContent().mInputMethodTarget == this;
+ boolean isImeLayeringTarget() {
+ return getDisplayContent().getImeTarget(IME_TARGET_LAYERING) == this;
+ }
+
+ WindowState getImeLayeringTarget() {
+ final InsetsControlTarget target = getDisplayContent().getImeTarget(IME_TARGET_LAYERING);
+ return target != null ? target.getWindow() : null;
+ }
+
+ WindowState getImeInputTarget() {
+ final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_INPUT);
+ return target != null ? target.getWindow() : null;
}
long getFrameNumber() {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 62cf3aa53e7c..d35d806741e6 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -3368,7 +3368,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
final boolean qualityMayApplyToParent =
canSetPasswordQualityOnParent(who.getPackageName(), caller.getUserId());
if (!qualityMayApplyToParent) {
- Preconditions.checkArgument(!parent,
+ Preconditions.checkCallAuthorization(!parent,
"Profile Owner may not apply password quality requirements device-wide");
}
diff --git a/services/robotests/src/com/android/server/location/OWNERS b/services/robotests/src/com/android/server/location/OWNERS
new file mode 100644
index 000000000000..696a0c22c605
--- /dev/null
+++ b/services/robotests/src/com/android/server/location/OWNERS
@@ -0,0 +1 @@
+file:/location/java/android/location/OWNERS
diff --git a/services/tests/servicestests/src/com/android/server/OWNERS b/services/tests/servicestests/src/com/android/server/OWNERS
index 2463fc617f0b..6561778cb47d 100644
--- a/services/tests/servicestests/src/com/android/server/OWNERS
+++ b/services/tests/servicestests/src/com/android/server/OWNERS
@@ -1,5 +1,5 @@
per-file *Alarm* = file:/apex/jobscheduler/OWNERS
-per-file *AppOps* = file:/core/java/android/permission/OWNERS
+per-file *AppOp* = file:/core/java/android/permission/OWNERS
per-file *Bluetooth* = file:/core/java/android/bluetooth/OWNERS
per-file *Gnss* = file:/services/core/java/com/android/server/location/OWNERS
per-file *Network* = file:/services/core/java/com/android/server/net/OWNERS
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
index 1e602f84071d..41e15631d258 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java
@@ -66,11 +66,11 @@ public class AppOpsNotedWatcherTest {
inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(1)).onOpNoted(eq(AppOpsManager.OP_FINE_LOCATION),
eq(Process.myUid()), eq(getContext().getPackageName()),
- eq(AppOpsManager.MODE_ALLOWED));
+ eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED));
inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(1)).onOpNoted(eq(AppOpsManager.OP_CAMERA),
eq(Process.myUid()), eq(getContext().getPackageName()),
- eq(AppOpsManager.MODE_ALLOWED));
+ eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED));
// Stop watching
appOpsManager.stopWatchingNoted(listener);
@@ -94,7 +94,7 @@ public class AppOpsNotedWatcherTest {
verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(2)).onOpNoted(eq(AppOpsManager.OP_FINE_LOCATION),
eq(Process.myUid()), eq(getContext().getPackageName()),
- eq(AppOpsManager.MODE_ALLOWED));
+ eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED));
// Finish up
appOpsManager.stopWatchingNoted(listener);
diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java
index 1aa697b04f1d..fec8aa9ceaff 100644
--- a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java
+++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java
@@ -63,11 +63,11 @@ public class AppOpsStartedWatcherTest {
inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(1)).onOpStarted(eq(AppOpsManager.OP_FINE_LOCATION),
eq(Process.myUid()), eq(getContext().getPackageName()),
- eq(AppOpsManager.MODE_ALLOWED));
+ eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED));
inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(1)).onOpStarted(eq(AppOpsManager.OP_CAMERA),
eq(Process.myUid()), eq(getContext().getPackageName()),
- eq(AppOpsManager.MODE_ALLOWED));
+ eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED));
// Stop watching
appOpsManager.stopWatchingStarted(listener);
@@ -91,7 +91,7 @@ public class AppOpsStartedWatcherTest {
verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
.times(2)).onOpStarted(eq(AppOpsManager.OP_CAMERA),
eq(Process.myUid()), eq(getContext().getPackageName()),
- eq(AppOpsManager.MODE_ALLOWED));
+ eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED));
verifyNoMoreInteractions(listener);
// Finish up
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index e2c5e97b8896..d9daf17058c9 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -5127,7 +5127,7 @@ public class DevicePolicyManagerTest extends DpmTestBase {
admin1.getPackageName(), managedProfileUserId);
try {
- assertExpectException(IllegalArgumentException.class, null, () ->
+ assertExpectException(SecurityException.class, null, () ->
parentDpm.setPasswordQuality(
admin1, DevicePolicyManager.PASSWORD_QUALITY_COMPLEX));
} finally {
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
index 2cb1113e7325..ef77f32bb211 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java
@@ -112,6 +112,7 @@ public class HdmiCecLocalDeviceTest {
private HdmiCecMessageValidator mMessageValidator;
private static byte[] param;
private boolean mStandbyMessageReceived;
+ private boolean mWakeupMessageReceived;
private boolean isControlEnabled;
private int mPowerStatus;
@@ -131,9 +132,21 @@ public class HdmiCecLocalDeviceTest {
}
@Override
+ boolean isPowerStandbyOrTransient() {
+ return mPowerStatus == HdmiControlManager.POWER_STATUS_STANDBY
+ || mPowerStatus
+ == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY;
+ }
+
+ @Override
void standby() {
mStandbyMessageReceived = true;
}
+
+ @Override
+ void wakeUp() {
+ mWakeupMessageReceived = true;
+ }
};
mHdmiControlService.setIoLooper(mTestLooper.getLooper());
mHdmiCecController = HdmiCecController.createWithNativeWrapper(
@@ -276,4 +289,99 @@ public class HdmiCecLocalDeviceTest {
assertThat(result).isTrue();
}
+ @Test
+ public void handleUserControlPressed_power_localDeviceInStandby_shouldTurnOn() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isTrue();
+ assertThat(mStandbyMessageReceived).isFalse();
+ }
+
+ @Test
+ public void handleUserControlPressed_power_localDeviceOn_shouldNotChangePowerStatus() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isFalse();
+ assertThat(mStandbyMessageReceived).isFalse();
+ }
+
+ @Test
+ public void handleUserControlPressed_powerToggleFunction_localDeviceInStandby_shouldTurnOn() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isTrue();
+ assertThat(mStandbyMessageReceived).isFalse();
+ }
+
+ @Test
+ public void handleUserControlPressed_powerToggleFunction_localDeviceOn_shouldTurnOff() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isFalse();
+ assertThat(mStandbyMessageReceived).isTrue();
+ }
+
+ @Test
+ public void handleUserControlPressed_powerOnFunction_localDeviceInStandby_shouldTurnOn() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isTrue();
+ assertThat(mStandbyMessageReceived).isFalse();
+ }
+
+ @Test
+ public void handleUserControlPressed_powerOnFunction_localDeviceOn_noPowerStatusChange() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isFalse();
+ assertThat(mStandbyMessageReceived).isFalse();
+ }
+
+ @Test
+ public void handleUserControlPressed_powerOffFunction_localDeviceStandby_noPowerStatusChange() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isFalse();
+ assertThat(mStandbyMessageReceived).isFalse();
+ }
+
+ @Test
+ public void handleUserControlPressed_powerOffFunction_localDeviceOn_shouldTurnOff() {
+ mPowerStatus = HdmiControlManager.POWER_STATUS_ON;
+ boolean result = mHdmiLocalDevice.handleUserControlPressed(
+ HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1,
+ HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION));
+
+ assertThat(result).isTrue();
+ assertThat(mWakeupMessageReceived).isFalse();
+ assertThat(mStandbyMessageReceived).isTrue();
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java
index 6cea9280f080..4f6441ff4e62 100644
--- a/services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java
@@ -29,14 +29,10 @@ import android.app.admin.DevicePolicyManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Process;
-import android.permission.PermissionManagerInternal;
import androidx.test.InstrumentationRegistry;
import androidx.test.runner.AndroidJUnit4;
-import com.android.server.LocalServices;
-
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -44,19 +40,17 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@RunWith(AndroidJUnit4.class)
-public class PermissionManagerServiceTest {
- private static final String TAG = "PermissionManagerServiceTag";
-
+public class LegacyPermissionManagerServiceTest {
private static final int SYSTEM_UID = 1000;
private static final int SYSTEM_PID = 1234;
private static final int APP_UID = Process.FIRST_APPLICATION_UID;
private static final int APP_PID = 5678;
- private PermissionManagerService mPermissionManagerService;
+ private LegacyPermissionManagerService mLegacyPermissionManagerService;
private Context mContext;
@Mock
- private PermissionManagerService.Injector mInjector;
+ private LegacyPermissionManagerService.Injector mInjector;
@Mock
private AppOpsManager mAppOpsManager;
@@ -69,16 +63,7 @@ public class PermissionManagerServiceTest {
MockitoAnnotations.initMocks(this);
mContext = InstrumentationRegistry.getContext();
- mPermissionManagerService = new PermissionManagerService(mContext, mInjector);
- }
-
- @After
- public void tearDown() {
- // The LocalServices added by the constructor of the PermissionManagerService can either be
- // removed here after each test when tests are run serially, or to run them in parallel
- // the Injector can provide methods to add these that can be ignored by the mock.
- LocalServices.removeServiceForTest(PermissionManagerServiceInternal.class);
- LocalServices.removeServiceForTest(PermissionManagerInternal.class);
+ mLegacyPermissionManagerService = new LegacyPermissionManagerService(mContext, mInjector);
}
@Test
@@ -88,7 +73,7 @@ public class PermissionManagerServiceTest {
setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID);
assertThrows(SecurityException.class,
- () -> mPermissionManagerService.checkDeviceIdentifierAccess(
+ () -> mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null,
APP_PID, SYSTEM_UID));
}
@@ -100,7 +85,7 @@ public class PermissionManagerServiceTest {
setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID);
assertThrows(SecurityException.class,
- () -> mPermissionManagerService.checkDeviceIdentifierAccess(
+ () -> mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null,
SYSTEM_PID, APP_UID));
}
@@ -111,7 +96,7 @@ public class PermissionManagerServiceTest {
// checks can run through completion and return denied.
setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID);
- int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
APP_UID);
@@ -122,7 +107,7 @@ public class PermissionManagerServiceTest {
public void checkDeviceIdentifierAccess_systemUid_returnsGranted() {
// The system UID should always have access to device identifiers.
setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID);
- int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, SYSTEM_PID,
SYSTEM_UID);
@@ -137,7 +122,7 @@ public class PermissionManagerServiceTest {
when(mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
APP_PID, APP_UID)).thenReturn(PackageManager.PERMISSION_GRANTED);
- int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
APP_UID);
@@ -153,7 +138,7 @@ public class PermissionManagerServiceTest {
eq(APP_UID), eq(mContext.getPackageName()), any(), any())).thenReturn(
AppOpsManager.MODE_ALLOWED);
- int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
APP_UID);
@@ -168,7 +153,7 @@ public class PermissionManagerServiceTest {
when(mDevicePolicyManager.hasDeviceIdentifierAccess(mContext.getPackageName(), APP_PID,
APP_UID)).thenReturn(true);
- int result = mPermissionManagerService.checkDeviceIdentifierAccess(
+ int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess(
mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID,
APP_UID);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
index b354a890a721..45b6bce1f811 100755
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java
@@ -305,6 +305,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
@Mock
StatusBarManagerInternal mStatusBar;
+ private NotificationManagerService.WorkerHandler mWorkerHandler;
+
// Use a Testable subclass so we can simulate calls from the system without failing.
private static class TestableNotificationManagerService extends NotificationManagerService {
int countSystemChecks = 0;
@@ -482,14 +484,13 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true);
- mService.init(mService.new WorkerHandler(mTestableLooper.getLooper()),
- mRankingHandler, mPackageManager, mPackageManagerClient, mockLightsManager,
- mListeners, mAssistants, mConditionProviders,
- mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager,
- mGroupHelper, mAm, mAtm, mAppUsageStats,
- mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal,
- mAppOpsManager, mUm, mHistoryManager, mStatsManager,
- mock(TelephonyManager.class), mAmi, mToastRateLimiter);
+ mWorkerHandler = mService.new WorkerHandler(mTestableLooper.getLooper());
+ mService.init(mWorkerHandler, mRankingHandler, mPackageManager, mPackageManagerClient,
+ mockLightsManager, mListeners, mAssistants, mConditionProviders, mCompanionMgr,
+ mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, mGroupHelper, mAm, mAtm,
+ mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal,
+ mAppOpsManager, mUm, mHistoryManager, mStatsManager, mock(TelephonyManager.class),
+ mAmi, mToastRateLimiter);
mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
mService.setAudioManager(mAudioManager);
@@ -575,6 +576,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
InstrumentationRegistry.getInstrumentation()
.getUiAutomation().dropShellPermissionIdentity();
+ // Remove scheduled messages that would be processed when the test is already done, and
+ // could cause issues, for example, messages that remove/cancel shown toasts (this causes
+ // problematic interactions with mocks when they're no longer working as expected).
+ mWorkerHandler.removeCallbacksAndMessages(null);
}
private void simulatePackageSuspendBroadcast(boolean suspend, String pkg,
diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
index 2053bfb45884..b451d9f4aaf0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java
@@ -62,6 +62,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.same;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.times;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
+import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_FIXED_TRANSFORM;
import static com.android.server.wm.WindowContainer.POSITION_TOP;
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL;
@@ -168,7 +170,7 @@ public class DisplayContentTests extends WindowTestsBase {
final WindowState imeAppTarget =
createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget");
- mDisplayContent.mInputMethodTarget = imeAppTarget;
+ mDisplayContent.setImeLayeringTarget(imeAppTarget);
assertForAllWindowsOrder(Arrays.asList(
mWallpaperWindow,
@@ -187,7 +189,7 @@ public class DisplayContentTests extends WindowTestsBase {
@UseTestDisplay(addAllCommonWindows = true)
@Test
public void testForAllWindows_WithChildWindowImeTarget() throws Exception {
- mDisplayContent.mInputMethodTarget = mChildAppWindowAbove;
+ mDisplayContent.setImeLayeringTarget(mChildAppWindowAbove);
assertForAllWindowsOrder(Arrays.asList(
mWallpaperWindow,
@@ -205,7 +207,7 @@ public class DisplayContentTests extends WindowTestsBase {
@UseTestDisplay(addAllCommonWindows = true)
@Test
public void testForAllWindows_WithStatusBarImeTarget() throws Exception {
- mDisplayContent.mInputMethodTarget = mStatusBarWindow;
+ mDisplayContent.setImeLayeringTarget(mStatusBarWindow);
assertForAllWindowsOrder(Arrays.asList(
mWallpaperWindow,
@@ -223,7 +225,7 @@ public class DisplayContentTests extends WindowTestsBase {
@UseTestDisplay(addAllCommonWindows = true)
@Test
public void testForAllWindows_WithNotificationShadeImeTarget() throws Exception {
- mDisplayContent.mInputMethodTarget = mNotificationShadeWindow;
+ mDisplayContent.setImeLayeringTarget(mNotificationShadeWindow);
assertForAllWindowsOrder(Arrays.asList(
mWallpaperWindow,
@@ -855,15 +857,17 @@ public class DisplayContentTests extends WindowTestsBase {
mDisplayContent.setInputMethodWindowLocked(mImeWindow);
newDisplay.setInputMethodWindowLocked(null);
assertEquals("appWin should be IME target window",
- appWin, mDisplayContent.mInputMethodTarget);
- assertNull("newDisplay Ime target: ", newDisplay.mInputMethodTarget);
+ appWin, mDisplayContent.getImeTarget(IME_TARGET_LAYERING));
+ assertNull("newDisplay Ime target: ", newDisplay.getImeTarget(IME_TARGET_LAYERING));
// Switch input method window on new display & make sure the input method target also
// switched as expected.
newDisplay.setInputMethodWindowLocked(mImeWindow);
mDisplayContent.setInputMethodWindowLocked(null);
- assertEquals("appWin1 should be IME target window", appWin1, newDisplay.mInputMethodTarget);
- assertNull("default display Ime target: ", mDisplayContent.mInputMethodTarget);
+ assertEquals("appWin1 should be IME target window", appWin1,
+ newDisplay.getImeTarget(IME_TARGET_LAYERING));
+ assertNull("default display Ime target: ",
+ mDisplayContent.getImeTarget(IME_TARGET_LAYERING));
}
@Test
@@ -937,17 +941,17 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testComputeImeParent_app() throws Exception {
final DisplayContent dc = createNewDisplay();
- dc.mInputMethodTarget = createWindow(null, TYPE_BASE_APPLICATION, "app");
- dc.mInputMethodInputTarget = dc.mInputMethodTarget;
- assertEquals(dc.mInputMethodTarget.mActivityRecord.getSurfaceControl(),
- dc.computeImeParent());
+ dc.setImeLayeringTarget(createWindow(null, TYPE_BASE_APPLICATION, "app"));
+ dc.setImeInputTarget(dc.getImeTarget(IME_TARGET_LAYERING).getWindow());
+ assertEquals(dc.getImeTarget(IME_TARGET_LAYERING).getWindow()
+ .mActivityRecord.getSurfaceControl(), dc.computeImeParent());
}
@Test
public void testComputeImeParent_app_notFullscreen() throws Exception {
final DisplayContent dc = createNewDisplay();
- dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "app");
- dc.mInputMethodTarget.setWindowingMode(
+ dc.setImeLayeringTarget(createWindow(null, TYPE_STATUS_BAR, "app"));
+ dc.getImeTarget(IME_TARGET_LAYERING).getWindow().setWindowingMode(
WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
assertEquals(dc.getImeContainer().getParentSurfaceControl(), dc.computeImeParent());
}
@@ -957,7 +961,7 @@ public class DisplayContentTests extends WindowTestsBase {
public void testComputeImeParent_app_notMatchParentBounds() {
spyOn(mAppWindow.mActivityRecord);
doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds();
- mDisplayContent.mInputMethodTarget = mAppWindow;
+ mDisplayContent.setImeLayeringTarget(mAppWindow);
// The surface parent of IME should be the display instead of app window.
assertEquals(mDisplayContent.getImeContainer().getParentSurfaceControl(),
mDisplayContent.computeImeParent());
@@ -966,7 +970,7 @@ public class DisplayContentTests extends WindowTestsBase {
@Test
public void testComputeImeParent_noApp() throws Exception {
final DisplayContent dc = createNewDisplay();
- dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "statusBar");
+ dc.setImeLayeringTarget(createWindow(null, TYPE_STATUS_BAR, "statusBar"));
assertEquals(dc.getImeContainer().getParentSurfaceControl(), dc.computeImeParent());
}
@@ -976,12 +980,12 @@ public class DisplayContentTests extends WindowTestsBase {
WindowState app = createWindow(null, TYPE_BASE_APPLICATION, dc, "app");
- dc.mInputMethodInputTarget = app;
+ dc.setImeInputTarget(app);
assertEquals(app, dc.computeImeControlTarget());
app.removeImmediately();
- assertNull(dc.mInputMethodInputTarget);
+ assertNull(dc.getImeTarget(IME_TARGET_INPUT));
assertNull(dc.computeImeControlTarget());
}
@@ -989,20 +993,21 @@ public class DisplayContentTests extends WindowTestsBase {
public void testComputeImeControlTarget() throws Exception {
final DisplayContent dc = createNewDisplay();
dc.setRemoteInsetsController(createDisplayWindowInsetsController());
- dc.mInputMethodInputTarget = createWindow(null, TYPE_BASE_APPLICATION, "app");
- dc.mInputMethodTarget = dc.mInputMethodInputTarget;
- assertEquals(dc.mInputMethodInputTarget, dc.computeImeControlTarget());
+ dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app"));
+ dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow());
+ assertEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(), dc.computeImeControlTarget());
}
@Test
public void testComputeImeControlTarget_splitscreen() throws Exception {
final DisplayContent dc = createNewDisplay();
- dc.mInputMethodInputTarget = createWindow(null, TYPE_BASE_APPLICATION, "app");
- dc.mInputMethodInputTarget.setWindowingMode(
+ dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app"));
+ dc.getImeTarget(IME_TARGET_INPUT).getWindow().setWindowingMode(
WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
- dc.mInputMethodTarget = dc.mInputMethodInputTarget;
+ dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow());
dc.setRemoteInsetsController(createDisplayWindowInsetsController());
- assertNotEquals(dc.mInputMethodInputTarget, dc.computeImeControlTarget());
+ assertNotEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(),
+ dc.computeImeControlTarget());
}
@UseTestDisplay(addWindows = W_ACTIVITY)
@@ -1010,8 +1015,9 @@ public class DisplayContentTests extends WindowTestsBase {
public void testComputeImeControlTarget_notMatchParentBounds() throws Exception {
spyOn(mAppWindow.mActivityRecord);
doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds();
- mDisplayContent.mInputMethodInputTarget = mAppWindow;
- mDisplayContent.mInputMethodTarget = mDisplayContent.mInputMethodInputTarget;
+ mDisplayContent.setImeInputTarget(mAppWindow);
+ mDisplayContent.setImeLayeringTarget(
+ mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow());
mDisplayContent.setRemoteInsetsController(createDisplayWindowInsetsController());
assertEquals(mAppWindow, mDisplayContent.computeImeControlTarget());
}
@@ -1637,7 +1643,7 @@ public class DisplayContentTests extends WindowTestsBase {
TYPE_BASE_APPLICATION, "nextImeTargetApp");
spyOn(child1);
doReturn(true).when(child1).inSplitScreenWindowingMode();
- mDisplayContent.mInputMethodTarget = child1;
+ mDisplayContent.setImeLayeringTarget(child1);
spyOn(nextImeTargetApp);
spyOn(mAppWindow);
@@ -1648,7 +1654,7 @@ public class DisplayContentTests extends WindowTestsBase {
child1.removeImmediately();
verify(mDisplayContent).computeImeTarget(true);
- assertNull(mDisplayContent.mInputMethodInputTarget);
+ assertNull(mDisplayContent.getImeTarget(IME_TARGET_INPUT));
verify(child1, never()).needsRelativeLayeringToIme();
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
index 59d195b670a8..5f9626711896 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java
@@ -52,19 +52,19 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase {
public void testTransparentControlTargetWindowCanShowIme() {
final WindowState appWin = createWindow(null, TYPE_APPLICATION, "app");
final WindowState popup = createWindow(appWin, TYPE_APPLICATION, "popup");
- mDisplayContent.mInputMethodControlTarget = popup;
- mDisplayContent.mInputMethodTarget = appWin;
+ mDisplayContent.setImeControlTarget(popup);
+ mDisplayContent.setImeLayeringTarget(appWin);
popup.mAttrs.format = PixelFormat.TRANSPARENT;
mImeProvider.scheduleShowImePostLayout(appWin);
- assertTrue(mImeProvider.isImeTargetFromDisplayContentAndImeSame());
+ assertTrue(mImeProvider.isReadyToShowIme());
}
@Test
public void testInputMethodInputTargetCanShowIme() {
WindowState target = createWindow(null, TYPE_APPLICATION, "app");
- mDisplayContent.mInputMethodTarget = target;
+ mDisplayContent.setImeLayeringTarget(target);
mImeProvider.scheduleShowImePostLayout(target);
- assertTrue(mImeProvider.isImeTargetFromDisplayContentAndImeSame());
+ assertTrue(mImeProvider.isReadyToShowIme());
}
@Test
@@ -74,8 +74,8 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase {
mImeProvider.setWindow(ime, null, null);
WindowState target = createWindow(null, TYPE_APPLICATION, "app");
- mDisplayContent.mInputMethodTarget = target;
- mDisplayContent.mInputMethodControlTarget = target;
+ mDisplayContent.setImeLayeringTarget(target);
+ mDisplayContent.setImeControlTarget(target);
mImeProvider.scheduleShowImePostLayout(target);
assertFalse(mImeProvider.isImeShowing());
diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
index 90caf35e2936..276643847712 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java
@@ -31,6 +31,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -181,16 +182,18 @@ public class InsetsStateControllerTest extends WindowTestsBase {
// This can be the IME z-order target while app cannot be the IME z-order target.
// This is also the only IME control target in this test, so IME won't be invisible caused
// by the control-target change.
- mDisplayContent.mInputMethodInputTarget = createWindow(null, TYPE_APPLICATION, "base");
+ mDisplayContent.updateImeInputAndControlTarget(
+ createWindow(null, TYPE_APPLICATION, "base"));
// Make IME and stay visible during the test.
mImeWindow.setHasSurface(true);
getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null);
- getController().onImeControlTargetChanged(mDisplayContent.mInputMethodInputTarget);
+ getController().onImeControlTargetChanged(mDisplayContent.getImeTarget(IME_TARGET_INPUT));
final InsetsState requestedState = new InsetsState();
requestedState.getSource(ITYPE_IME).setVisible(true);
- mDisplayContent.mInputMethodInputTarget.updateRequestedVisibility(requestedState);
- getController().onInsetsModified(mDisplayContent.mInputMethodInputTarget);
+ mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow()
+ .updateRequestedVisibility(requestedState);
+ getController().onInsetsModified(mDisplayContent.getImeTarget(IME_TARGET_INPUT));
// Send our spy window (app) into the system so that we can detect the invocation.
final WindowState win = createWindow(null, TYPE_APPLICATION, "app");
diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
index dd6e490b8282..c7175a0c424d 100644
--- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java
@@ -30,6 +30,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.never;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
+import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING;
import static com.android.server.wm.Task.ActivityState.STOPPED;
import static org.junit.Assert.assertEquals;
@@ -270,7 +271,7 @@ public class SizeCompatTests extends WindowTestsBase {
// The position should be horizontal centered.
assertEquals((displayWidth - bounds.width()) / 2, bounds.left);
- mActivity.mDisplayContent.mInputMethodTarget = addWindowToActivity(mActivity);
+ mActivity.mDisplayContent.setImeLayeringTarget(addWindowToActivity(mActivity));
// Make sure IME cannot attach to the app, otherwise IME window will also be shifted.
assertFalse(mActivity.mDisplayContent.isImeAttachedToApp());
@@ -290,9 +291,9 @@ public class SizeCompatTests extends WindowTestsBase {
assertFitted();
rotateDisplay(mActivity.mDisplayContent, ROTATION_90);
- mActivity.mDisplayContent.mInputMethodTarget = addWindowToActivity(mActivity);
- mActivity.mDisplayContent.mInputMethodInputTarget =
- mActivity.mDisplayContent.mInputMethodTarget;
+ mActivity.mDisplayContent.setImeLayeringTarget(addWindowToActivity(mActivity));
+ mActivity.mDisplayContent.setImeInputTarget(
+ mActivity.mDisplayContent.getImeTarget(IME_TARGET_LAYERING).getWindow());
// Because the aspect ratio of display doesn't exceed the max aspect ratio of activity.
// The activity should still fill its parent container and IME can attach to the activity.
assertTrue(mActivity.matchParentBounds());
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java
index 78e873e2b0a3..f13847559aa0 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java
@@ -56,7 +56,7 @@ public class WindowContainerTraversalTests extends WindowTestsBase {
WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD,
TYPE_BASE_APPLICATION, mDisplayContent, "splitScreenSecondaryWindow");
- mDisplayContent.mInputMethodTarget = splitScreenWindow;
+ mDisplayContent.setImeLayeringTarget(splitScreenWindow);
Consumer<WindowState> c = mock(Consumer.class);
mDisplayContent.forAllWindows(c, false);
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
index d2be50d02ef3..4a6906b88710 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java
@@ -292,7 +292,7 @@ public class WindowFrameTests extends WindowTestsBase {
// Make IME attach to the window and can produce insets.
final DisplayContent dc = mTestDisplayContent;
- dc.mInputMethodTarget = w;
+ dc.setImeLayeringTarget(w);
WindowState mockIme = mock(WindowState.class);
Mockito.doReturn(true).when(mockIme).isVisibleNow();
dc.mInputMethodWindow = mockIme;
diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
index a57de094a210..76f8207b4ad8 100644
--- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java
@@ -789,7 +789,7 @@ public class WindowStateTests extends WindowTestsBase {
public void testNeedsRelativeLayeringToIme_notAttached() {
WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken,
"SameTokenWindow");
- mDisplayContent.mInputMethodTarget = mAppWindow;
+ mDisplayContent.setImeLayeringTarget(mAppWindow);
sameTokenWindow.mActivityRecord.getStack().setWindowingMode(
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
assertTrue(sameTokenWindow.needsRelativeLayeringToIme());
@@ -802,7 +802,7 @@ public class WindowStateTests extends WindowTestsBase {
public void testNeedsRelativeLayeringToIme_startingWindow() {
WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING,
mAppWindow.mToken, "SameTokenWindow");
- mDisplayContent.mInputMethodTarget = mAppWindow;
+ mDisplayContent.setImeLayeringTarget(mAppWindow);
sameTokenWindow.mActivityRecord.getStack().setWindowingMode(
WINDOWING_MODE_SPLIT_SCREEN_PRIMARY);
assertFalse(sameTokenWindow.needsRelativeLayeringToIme());
diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
index e44d47a59fe5..811a14666db9 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java
@@ -218,7 +218,7 @@ public class ZOrderingTests extends WindowTestsBase {
@Test
public void testAssignWindowLayers_ForImeWithNoTarget() {
- mDisplayContent.mInputMethodTarget = null;
+ mDisplayContent.setImeLayeringTarget(null);
mDisplayContent.assignChildLayers(mTransaction);
// The Ime has an higher base layer than app windows and lower base layer than system
@@ -236,7 +236,7 @@ public class ZOrderingTests extends WindowTestsBase {
@Test
public void testAssignWindowLayers_ForImeWithAppTarget() {
final WindowState imeAppTarget = createWindow("imeAppTarget");
- mDisplayContent.mInputMethodTarget = imeAppTarget;
+ mDisplayContent.setImeLayeringTarget(imeAppTarget);
mDisplayContent.assignChildLayers(mTransaction);
@@ -262,7 +262,7 @@ public class ZOrderingTests extends WindowTestsBase {
TYPE_APPLICATION_MEDIA_OVERLAY, imeAppTarget.mToken,
"imeAppTargetChildBelowWindow");
- mDisplayContent.mInputMethodTarget = imeAppTarget;
+ mDisplayContent.setImeLayeringTarget(imeAppTarget);
mDisplayContent.assignChildLayers(mTransaction);
// Ime should be above all app windows except for child windows that are z-ordered above it
@@ -284,7 +284,7 @@ public class ZOrderingTests extends WindowTestsBase {
final WindowState imeAppTarget = createWindow("imeAppTarget");
final WindowState appAboveImeTarget = createWindow("appAboveImeTarget");
- mDisplayContent.mInputMethodTarget = imeAppTarget;
+ mDisplayContent.setImeLayeringTarget(imeAppTarget);
mDisplayContent.assignChildLayers(mTransaction);
// Ime should be above all app windows except for non-fullscreen app window above it and
@@ -307,7 +307,7 @@ public class ZOrderingTests extends WindowTestsBase {
mDisplayContent, "imeSystemOverlayTarget",
true /* ownerCanAddInternalSystemWindow */);
- mDisplayContent.mInputMethodTarget = imeSystemOverlayTarget;
+ mDisplayContent.setImeLayeringTarget(imeSystemOverlayTarget);
mDisplayContent.assignChildLayers(mTransaction);
// The IME target base layer is higher than all window except for the nav bar window, so the
@@ -330,7 +330,7 @@ public class ZOrderingTests extends WindowTestsBase {
@Test
public void testAssignWindowLayers_ForStatusBarImeTarget() {
- mDisplayContent.mInputMethodTarget = mStatusBarWindow;
+ mDisplayContent.setImeLayeringTarget(mStatusBarWindow);
mDisplayContent.assignChildLayers(mTransaction);
assertWindowHigher(mImeWindow, mChildAppWindowAbove);
diff --git a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
index 76291631b37d..8531b507a92f 100644
--- a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
+++ b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java
@@ -26,7 +26,7 @@ import android.os.Build;
import android.os.CarrierAssociatedAppEntry;
import android.os.SystemConfigManager;
import android.os.UserHandle;
-import android.permission.PermissionManager;
+import android.permission.LegacyPermissionManager;
import android.provider.Settings;
import android.telephony.TelephonyManager;
import android.util.ArrayMap;
@@ -141,8 +141,8 @@ public final class CarrierAppUtils {
Map<String, List<CarrierAssociatedAppEntry>>
systemCarrierAssociatedAppsDisabledUntilUsed, Context context) {
PackageManager packageManager = context.getPackageManager();
- PermissionManager permissionManager =
- (PermissionManager) context.getSystemService(Context.PERMISSION_SERVICE);
+ LegacyPermissionManager permissionManager = (LegacyPermissionManager)
+ context.getSystemService(Context.LEGACY_PERMISSION_SERVICE);
List<ApplicationInfo> candidates = getDefaultCarrierAppCandidatesHelper(
userId, systemCarrierAppsDisabledUntilUsed, context);
if (candidates == null || candidates.isEmpty()) {
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index 4bb7cc47d702..556df885dec3 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -27,7 +27,7 @@ import android.os.Binder;
import android.os.Build;
import android.os.Process;
import android.os.UserHandle;
-import android.permission.PermissionManager;
+import android.permission.LegacyPermissionManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Log;
@@ -327,8 +327,8 @@ public final class TelephonyPermissions {
return true;
}
- PermissionManager permissionManager = (PermissionManager) context.getSystemService(
- Context.PERMISSION_SERVICE);
+ LegacyPermissionManager permissionManager = (LegacyPermissionManager)
+ context.getSystemService(Context.LEGACY_PERMISSION_SERVICE);
if (permissionManager.checkDeviceIdentifierAccess(callingPackage, message, callingFeatureId,
pid, uid) == PackageManager.PERMISSION_GRANTED) {
return true;
diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java
index 8b7a243c30e6..d502da9fb9ec 100644
--- a/telephony/java/android/telephony/DataFailCause.java
+++ b/telephony/java/android/telephony/DataFailCause.java
@@ -916,6 +916,84 @@ public final class DataFailCause {
/** System preference change back to SRAT during handoff */
public static final int HANDOFF_PREFERENCE_CHANGED = 0x8CB;
+ //IKE error notifications message as specified in 3GPP TS 24.302 (Section 8.1.2.2).
+
+ /** The PDN connection corresponding to the requested APN has been rejected. */
+ public static final int IWLAN_PDN_CONNECTION_REJECTION = 0x2000;
+ /**
+ * The PDN connection has been rejected. No additional PDN connections can be established
+ * for the UE due to the network policies or capabilities.
+ */
+ public static final int IWLAN_MAX_CONNECTION_REACHED = 0x2001;
+ /**
+ * The PDN connection has been rejected due to a semantic error in TFT operation.
+ */
+ public static final int IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION = 0x2031;
+ /**
+ * The PDN connection has been rejected due to a syntactic error in TFT operation.
+ */
+ public static final int IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION = 0x2032;
+ /**
+ * The PDN connection has been rejected due to sematic errors in the packet filter.
+ */
+ public static final int IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS = 0x2034;
+ /**
+ * The PDN connection has been rejected due to syntactic errors in the packet filter.
+ */
+ public static final int IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS = 0x2035;
+ /**
+ * No non-3GPP subscription is associated with the IMSI.
+ * The UE is not allowed to use non-3GPP access to EPC.
+ */
+ public static final int IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED = 0x2328;
+ /** The user identified by the IMSI is unknown. */
+ public static final int IWLAN_USER_UNKNOWN = 0x2329;
+ /**
+ * The requested APN is not included in the user's profile,
+ * and therefore is not authorized for that user.
+ */
+ public static final int IWLAN_NO_APN_SUBSCRIPTION = 0x232A;
+ /** The user is barred from using the non-3GPP access or the subscribed APN. */
+ public static final int IWLAN_AUTHORIZATION_REJECTED = 0x232B;
+ /** The Mobile Equipment used is not acceptable to the network */
+ public static final int IWLAN_ILLEGAL_ME = 0x232E;
+ /**
+ * The network has determined that the requested procedure cannot be completed successfully
+ * due to network failure.
+ */
+ public static final int IWLAN_NETWORK_FAILURE = 0x2904;
+ /** The access type is restricted to the user. */
+ public static final int IWLAN_RAT_TYPE_NOT_ALLOWED = 0x2AF9;
+ /** The network does not accept emergency PDN bringup request using an IMEI */
+ public static final int IWLAN_IMEI_NOT_ACCEPTED = 0x2AFD;
+ /**
+ * The ePDG performs PLMN filtering (based on roaming agreements) and rejects
+ * the request from the UE.
+ * The UE requests service in a PLMN where the UE is not allowed to operate.
+ */
+ public static final int IWLAN_PLMN_NOT_ALLOWED = 0x2B03;
+ /** The ePDG does not support un-authenticated IMSI based emergency PDN bringup **/
+ public static final int IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED = 0x2B2F;
+
+ // Device is unable to establish an IPSec tunnel with the ePDG for any reason
+ // e.g authentication fail or certificate validation or DNS Resolution and timeout failure.
+
+ /** IKE configuration error resulting in failure */
+ public static final int IWLAN_IKEV2_CONFIG_FAILURE = 0x4000;
+ /**
+ * Sent in the response to an IKE_AUTH message when, for some reason,
+ * the authentication failed.
+ */
+ public static final int IWLAN_IKEV2_AUTH_FAILURE = 0x4001;
+ /** IKE message timeout, tunnel setup failed due to no response from EPDG */
+ public static final int IWLAN_IKEV2_MSG_TIMEOUT = 0x4002;
+ /** IKE Certification validation failure */
+ public static final int IWLAN_IKEV2_CERT_INVALID = 0x4003;
+ /** Unable to resolve FQDN for the ePDG to an IP address */
+ public static final int IWLAN_DNS_RESOLUTION_NAME_FAILURE = 0x4004;
+ /** No response received from the DNS Server due to a timeout*/
+ public static final int IWLAN_DNS_RESOLUTION_TIMEOUT = 0x4005;
+
// OEM sepecific error codes. To be used by OEMs when they don't
// want to reveal error code which would be replaced by ERROR_UNSPECIFIED
public static final int OEM_DCFAILCAUSE_1 = 0x1001;
@@ -1341,6 +1419,34 @@ public final class DataFailCause {
sFailCauseMap.put(VSNCP_RECONNECT_NOT_ALLOWED, "VSNCP_RECONNECT_NOT_ALLOWED");
sFailCauseMap.put(IPV6_PREFIX_UNAVAILABLE, "IPV6_PREFIX_UNAVAILABLE");
sFailCauseMap.put(HANDOFF_PREFERENCE_CHANGED, "HANDOFF_PREFERENCE_CHANGED");
+ sFailCauseMap.put(IWLAN_PDN_CONNECTION_REJECTION, "IWLAN_PDN_CONNECTION_REJECTION");
+ sFailCauseMap.put(IWLAN_MAX_CONNECTION_REACHED, "IWLAN_MAX_CONNECTION_REACHED");
+ sFailCauseMap.put(IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION,
+ "IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION");
+ sFailCauseMap.put(IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION,
+ "IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION");
+ sFailCauseMap.put(IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS,
+ "IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS");
+ sFailCauseMap.put(IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS,
+ "IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS");
+ sFailCauseMap.put(IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED,
+ "IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED");
+ sFailCauseMap.put(IWLAN_USER_UNKNOWN, "IWLAN_USER_UNKNOWN");
+ sFailCauseMap.put(IWLAN_NO_APN_SUBSCRIPTION, "IWLAN_NO_APN_SUBSCRIPTION");
+ sFailCauseMap.put(IWLAN_AUTHORIZATION_REJECTED, "IWLAN_AUTHORIZATION_REJECTED");
+ sFailCauseMap.put(IWLAN_ILLEGAL_ME, "IWLAN_ILLEGAL_ME");
+ sFailCauseMap.put(IWLAN_NETWORK_FAILURE, "IWLAN_NETWORK_FAILURE");
+ sFailCauseMap.put(IWLAN_RAT_TYPE_NOT_ALLOWED, "IWLAN_RAT_TYPE_NOT_ALLOWED");
+ sFailCauseMap.put(IWLAN_IMEI_NOT_ACCEPTED, "IWLAN_IMEI_NOT_ACCEPTED");
+ sFailCauseMap.put(IWLAN_PLMN_NOT_ALLOWED, "IWLAN_PLMN_NOT_ALLOWED");
+ sFailCauseMap.put(IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED,
+ "IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED");
+ sFailCauseMap.put(IWLAN_IKEV2_CONFIG_FAILURE, "IWLAN_IKEV2_CONFIG_FAILURE");
+ sFailCauseMap.put(IWLAN_IKEV2_AUTH_FAILURE, "IWLAN_IKEV2_AUTH_FAILURE");
+ sFailCauseMap.put(IWLAN_IKEV2_MSG_TIMEOUT, "IWLAN_IKEV2_MSG_TIMEOUT");
+ sFailCauseMap.put(IWLAN_IKEV2_CERT_INVALID, "IWLAN_IKEV2_CERT_INVALID");
+ sFailCauseMap.put(IWLAN_DNS_RESOLUTION_NAME_FAILURE, "IWLAN_DNS_RESOLUTION_NAME_FAILURE");
+ sFailCauseMap.put(IWLAN_DNS_RESOLUTION_TIMEOUT, "IWLAN_DNS_RESOLUTION_TIMEOUT");
sFailCauseMap.put(OEM_DCFAILCAUSE_1, "OEM_DCFAILCAUSE_1");
sFailCauseMap.put(OEM_DCFAILCAUSE_2, "OEM_DCFAILCAUSE_2");
sFailCauseMap.put(OEM_DCFAILCAUSE_3, "OEM_DCFAILCAUSE_3");
diff --git a/telephony/java/android/telephony/data/ApnThrottleStatus.java b/telephony/java/android/telephony/data/ApnThrottleStatus.java
index 51461d17690a..eec140869466 100644
--- a/telephony/java/android/telephony/data/ApnThrottleStatus.java
+++ b/telephony/java/android/telephony/data/ApnThrottleStatus.java
@@ -261,6 +261,10 @@ public final class ApnThrottleStatus implements Parcelable {
private long mThrottleExpiryTimeMillis;
private @RetryType int mRetryType;
private @ThrottleType int mThrottleType;
+
+ /**
+ * @hide
+ */
public static final long NO_THROTTLE_EXPIRY_TIME =
DataCallResponse.RETRY_DURATION_UNDEFINED;
diff --git a/telephony/java/android/telephony/ims/DelegateRegistrationState.java b/telephony/java/android/telephony/ims/DelegateRegistrationState.java
index 3558a9b79ce0..66281edc0de1 100644
--- a/telephony/java/android/telephony/ims/DelegateRegistrationState.java
+++ b/telephony/java/android/telephony/ims/DelegateRegistrationState.java
@@ -62,7 +62,8 @@ public final class DelegateRegistrationState implements Parcelable {
/**
* This feature tag is being deregistered because the PDN that the IMS registration is on is
*changing.
- * All open SIP dialogs need to be closed before the PDN change can proceed.
+ * All open SIP dialogs need to be closed before the PDN change can proceed using
+ * {@link SipDelegateConnection#closeDialog(String)}.
*/
public static final int DEREGISTERING_REASON_PDN_CHANGE = 3;
@@ -73,7 +74,8 @@ public final class DelegateRegistrationState implements Parcelable {
* a user triggered hange, such as data being enabled/disabled.
* <p>
* All open SIP dialogs associated with the new deprovisioned feature tag need to be closed
- * before the IMS registration modification can proceed.
+ * using {@link SipDelegateConnection#closeDialog(String)} before the IMS registration
+ * modification can proceed.
*/
public static final int DEREGISTERING_REASON_PROVISIONING_CHANGE = 4;
@@ -81,8 +83,8 @@ public final class DelegateRegistrationState implements Parcelable {
* This feature tag is deregistering because the SipDelegate associated with this feature tag
* needs to change its supported feature set.
* <p>
- * All open SIP Dialogs associated with this feature tag must be closed before this operation
- * can proceed.
+ * All open SIP Dialogs associated with this feature tag must be closed
+ * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed.
*/
public static final int DEREGISTERING_REASON_FEATURE_TAGS_CHANGING = 5;
@@ -90,8 +92,8 @@ public final class DelegateRegistrationState implements Parcelable {
* This feature tag is deregistering because the SipDelegate is in the process of being
* destroyed.
* <p>
- * All open SIP Dialogs associated with this feature tag must be closed before this operation
- * can proceed.
+ * All open SIP Dialogs associated with this feature tag must be closed
+ * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed.
*/
public static final int DEREGISTERING_REASON_DESTROY_PENDING = 6;
diff --git a/telephony/java/android/telephony/ims/SipDelegateConnection.java b/telephony/java/android/telephony/ims/SipDelegateConnection.java
index c3cc1edf590b..04a772cd873d 100644
--- a/telephony/java/android/telephony/ims/SipDelegateConnection.java
+++ b/telephony/java/android/telephony/ims/SipDelegateConnection.java
@@ -62,6 +62,22 @@ public interface SipDelegateConnection {
void notifyMessageReceived(@NonNull String viaTransactionId);
/**
+ * The SIP Dialog associated with the provided Call-ID is being closed and routing resources
+ * associated with the SIP dialog are free to be released.
+ * <p>
+ * Calling this method is also mandatory for situations where the framework IMS stack is waiting
+ * for pending SIP dialogs to be closed before it can perform a handover or apply a provisioning
+ * change. See {@link DelegateRegistrationState} for more information about
+ * the scenarios where this can occur.
+ * <p>
+ * This method will need to be called for each SIP dialog managed by this application when it is
+ * closed.
+ * @param callId The call-ID header value associated with the ongoing SIP Dialog that is
+ * closing.
+ */
+ void closeDialog(@NonNull String callId);
+
+ /**
* Notify the SIP delegate that the SIP message has been received from
* {@link DelegateMessageCallback#onMessageReceived(SipMessage)}, however there was an error
* processing it.
diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
index 5d6766a65155..ad75be439da8 100644
--- a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
+++ b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl
@@ -26,7 +26,5 @@ oneway interface ISipDelegate {
void sendMessage(in SipMessage sipMessage, long configVersion);
void notifyMessageReceived(in String viaTransactionId);
void notifyMessageReceiveError(in String viaTransactionId, int reason);
-
- // only used by SipDelegate.
void closeDialog(in String callId);
}
diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
index 29ba8e2d50c4..a35039bd7668 100644
--- a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
+++ b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java
@@ -199,6 +199,19 @@ public class SipDelegateConnectionAidlWrapper implements SipDelegateConnection,
}
}
+ @Override
+ public void closeDialog(String callId) {
+ try {
+ ISipDelegate conn = getSipDelegateBinder();
+ if (conn == null) {
+ return;
+ }
+ conn.closeDialog(callId);
+ } catch (RemoteException e) {
+ // Nothing to do here, app will eventually get remote death callback.
+ }
+ }
+
// Also called upon IImsRcsController death (telephony process dies).
@Override
public void binderDied() {
diff --git a/telephony/java/android/telephony/ims/stub/SipDelegate.java b/telephony/java/android/telephony/ims/stub/SipDelegate.java
index d7e7b62dd550..b036b5e71125 100644
--- a/telephony/java/android/telephony/ims/stub/SipDelegate.java
+++ b/telephony/java/android/telephony/ims/stub/SipDelegate.java
@@ -19,7 +19,9 @@ package android.telephony.ims.stub;
import android.annotation.NonNull;
import android.annotation.SystemApi;
import android.telephony.ims.DelegateMessageCallback;
+import android.telephony.ims.DelegateRegistrationState;
import android.telephony.ims.ImsService;
+import android.telephony.ims.SipDelegateConnection;
import android.telephony.ims.SipDelegateImsConfiguration;
import android.telephony.ims.SipDelegateManager;
import android.telephony.ims.SipMessage;
@@ -65,10 +67,13 @@ public interface SipDelegate {
* The framework is requesting that routing resources associated with the SIP dialog using the
* provided Call-ID to be cleaned up.
* <p>
- * Typically a SIP Dialog close event will be signalled by that dialog receiving a BYE or 200 OK
- * message, however, in some cases, the framework will request that the ImsService close the
+ * Typically, a SIP Dialog close event will be signalled by that dialog receiving a BYE or
+ * 200 OK message, however, the IMS application will still call
+ * {@link SipDelegateConnection#closeDialog(String)} to signal to the framework that resources
+ * can be released. In some cases, the framework will request that the ImsService close the
* dialog due to the open dialog holding up an event such as applying a provisioning change or
- * handing over to another transport type.
+ * handing over to another transport type. See {@link DelegateRegistrationState}.
+ *
* @param callId The call-ID header value associated with the ongoing SIP Dialog that the
* framework is requesting be closed.
*/
diff --git a/tests/FlickerTests/OWNERS b/tests/FlickerTests/OWNERS
index 0862c05e0ee4..f35a318acbf7 100644
--- a/tests/FlickerTests/OWNERS
+++ b/tests/FlickerTests/OWNERS
@@ -1 +1,2 @@
include /services/core/java/com/android/server/wm/OWNERS
+natanieljr@google.com \ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
index bb03237ca4c6..bd7e8d7683d1 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt
@@ -48,11 +48,12 @@ fun WmAssertion.navBarWindowIsAlwaysVisible(
}
fun WmAssertion.visibleWindowsShownMoreThanOneConsecutiveEntry(
+ ignoreWindows: List<String> = emptyList(),
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
- all("visibleWindowShownMoreThanOneConsecutiveEntry", bugId, enabled) {
- this.visibleWindowsShownMoreThanOneConsecutiveEntry()
+ all("visibleWindowsShownMoreThanOneConsecutiveEntry", bugId, enabled) {
+ this.visibleWindowsShownMoreThanOneConsecutiveEntry(ignoreWindows)
}
}
@@ -204,11 +205,12 @@ fun LayersAssertion.statusBarLayerRotatesScales(
}
fun LayersAssertion.visibleLayersShownMoreThanOneConsecutiveEntry(
+ ignoreLayers: List<String> = emptyList(),
bugId: Int = 0,
enabled: Boolean = bugId == 0
) {
all("visibleLayersShownMoreThanOneConsecutiveEntry", bugId, enabled) {
- this.visibleLayersShownMoreThanOneConsecutiveEntry()
+ this.visibleLayersShownMoreThanOneConsecutiveEntry(ignoreLayers)
}
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt
index f4de36e99952..3565ca40474e 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt
@@ -22,6 +22,7 @@ import android.support.test.launcherhelper.LauncherStrategyFactory
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.Until
+import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import org.junit.Assert
open class ImeAppHelper(
@@ -38,7 +39,7 @@ open class ImeAppHelper(
Assert.assertNotNull("Text field not found, this usually happens when the device " +
"was left in an unknown state (e.g. in split screen)", editText)
editText.click()
- if (!device.waitForIME()) {
+ if (!WindowManagerStateHelper().waitImeWindowShown()) {
Assert.fail("IME did not appear")
}
}
@@ -46,6 +47,8 @@ open class ImeAppHelper(
open fun closeIME(device: UiDevice) {
device.pressBack()
// Using only the AccessibilityInfo it is not possible to identify if the IME is active
- device.waitForIdle(1000)
+ if (!WindowManagerStateHelper().waitImeWindowGone()) {
+ Assert.fail("IME did not close")
+ }
}
} \ No newline at end of file
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
index a73264d304f8..b341e621d9ed 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
@@ -27,6 +27,8 @@ import com.android.server.wm.flicker.helpers.ImeAppAutoFocusHelper
import com.android.server.wm.flicker.helpers.buildTestTag
import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
@@ -66,8 +68,10 @@ class CloseImeAutoOpenWindowToAppTest(
withTag { buildTestTag("imeToAppAutoOpen", testApp, configuration) }
repeat { configuration.repetitions }
setup {
- eachRun {
+ test {
device.wakeUpAndGoToHomeScreen()
+ }
+ eachRun {
this.setRotation(configuration.startRotation)
testApp.open()
testApp.openIME(device)
@@ -80,14 +84,15 @@ class CloseImeAutoOpenWindowToAppTest(
}
}
transitions {
- device.pressBack()
- device.waitForIdle()
+ testApp.closeIME(device)
}
assertions {
windowManagerTrace {
navBarWindowIsAlwaysVisible()
statusBarWindowIsAlwaysVisible()
- imeAppWindowIsAlwaysVisible(testApp, bugId = 141458352)
+ visibleWindowsShownMoreThanOneConsecutiveEntry(listOf("InputMethod"))
+
+ imeAppWindowIsAlwaysVisible(testApp)
}
layersTrace {
@@ -96,8 +101,10 @@ class CloseImeAutoOpenWindowToAppTest(
noUncoveredRegions(configuration.startRotation)
navBarLayerRotatesAndScales(configuration.startRotation)
statusBarLayerRotatesScales(configuration.startRotation)
+ visibleLayersShownMoreThanOneConsecutiveEntry()
+
imeLayerBecomesInvisible(bugId = 141458352)
- imeAppLayerIsAlwaysVisible(testApp, bugId = 141458352)
+ imeAppLayerIsAlwaysVisible(testApp)
}
}
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
index 6cc2e2236127..51a4ca86681b 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
@@ -27,6 +27,8 @@ import com.android.server.wm.flicker.helpers.ImeAppAutoFocusHelper
import com.android.server.wm.flicker.helpers.buildTestTag
import com.android.server.wm.flicker.helpers.setRotation
import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
@@ -68,8 +70,10 @@ class CloseImeAutoOpenWindowToHomeTest(
}
repeat { configuration.repetitions }
setup {
- eachRun {
+ test {
device.wakeUpAndGoToHomeScreen()
+ }
+ eachRun {
this.setRotation(configuration.startRotation)
testApp.open()
testApp.openIME(device)
@@ -89,6 +93,8 @@ class CloseImeAutoOpenWindowToHomeTest(
windowManagerTrace {
navBarWindowIsAlwaysVisible()
statusBarWindowIsAlwaysVisible()
+ visibleWindowsShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE))
+
imeWindowBecomesInvisible(bugId = 141458352)
imeAppWindowBecomesInvisible(testApp, bugId = 157449248)
}
@@ -100,10 +106,14 @@ class CloseImeAutoOpenWindowToHomeTest(
Surface.ROTATION_0, bugId = 140855415)
statusBarLayerRotatesScales(configuration.startRotation,
Surface.ROTATION_0)
- navBarLayerIsAlwaysVisible(enabled = false)
- statusBarLayerIsAlwaysVisible(enabled = false)
+ navBarLayerIsAlwaysVisible(
+ enabled = Surface.ROTATION_0 == configuration.startRotation)
+ statusBarLayerIsAlwaysVisible(
+ enabled = Surface.ROTATION_0 == configuration.startRotation)
+ visibleLayersShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE))
+
imeLayerBecomesInvisible(bugId = 141458352)
- imeAppLayerBecomesInvisible(testApp, bugId = 153739621)
+ imeAppLayerBecomesInvisible(testApp)
}
}
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
index 136cf86037a1..663d45607f93 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt
@@ -31,6 +31,8 @@ import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
import com.android.server.wm.flicker.noUncoveredRegions
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
import com.android.server.wm.flicker.repetitions
import com.android.server.wm.flicker.startRotation
import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible
@@ -65,8 +67,10 @@ class CloseImeWindowToAppTest(
withTestName { buildTestTag("imeToApp", testApp, configuration) }
repeat { configuration.repetitions }
setup {
- eachRun {
+ test {
device.wakeUpAndGoToHomeScreen()
+ }
+ eachRun {
this.setRotation(configuration.startRotation)
testApp.open()
testApp.openIME(device)
@@ -79,13 +83,14 @@ class CloseImeWindowToAppTest(
}
}
transitions {
- device.pressBack()
- device.waitForIdle()
+ testApp.closeIME(device)
}
assertions {
windowManagerTrace {
navBarWindowIsAlwaysVisible()
statusBarWindowIsAlwaysVisible()
+ visibleWindowsShownMoreThanOneConsecutiveEntry(listOf("InputMethod"))
+
imeAppWindowIsAlwaysVisible(testApp)
}
@@ -95,6 +100,8 @@ class CloseImeWindowToAppTest(
noUncoveredRegions(configuration.startRotation)
navBarLayerRotatesAndScales(configuration.startRotation)
statusBarLayerRotatesScales(configuration.startRotation)
+ visibleLayersShownMoreThanOneConsecutiveEntry()
+
imeLayerBecomesInvisible(enabled = false)
imeAppLayerIsAlwaysVisible(testApp)
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
index 8d9881ec2063..bfe5264ed358 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
@@ -33,6 +33,8 @@ import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
import com.android.server.wm.flicker.noUncoveredRegions
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
import com.android.server.wm.flicker.repetitions
import com.android.server.wm.flicker.startRotation
import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible
@@ -95,6 +97,8 @@ class CloseImeWindowToHomeTest(
windowManagerTrace {
navBarWindowIsAlwaysVisible()
statusBarWindowIsAlwaysVisible()
+ visibleWindowsShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE))
+
imeWindowBecomesInvisible()
imeAppWindowBecomesInvisible(testApp)
}
@@ -106,10 +110,14 @@ class CloseImeWindowToHomeTest(
Surface.ROTATION_0, bugId = 140855415)
statusBarLayerRotatesScales(configuration.startRotation,
Surface.ROTATION_0)
- navBarLayerIsAlwaysVisible(enabled = false)
- statusBarLayerIsAlwaysVisible(enabled = false)
+ navBarLayerIsAlwaysVisible(
+ enabled = Surface.ROTATION_0 == configuration.startRotation)
+ statusBarLayerIsAlwaysVisible(
+ enabled = Surface.ROTATION_0 == configuration.startRotation)
+ visibleLayersShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE))
+
imeLayerBecomesInvisible(bugId = 153739621)
- imeAppLayerBecomesInvisible(testApp, bugId = 153739621)
+ imeAppLayerBecomesInvisible(testApp)
}
}
}
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
index 5767a94025e9..64a8f304298b 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
@@ -30,6 +30,8 @@ import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.navBarLayerRotatesAndScales
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
+import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry
+import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry
import com.android.server.wm.flicker.noUncoveredRegions
import com.android.server.wm.flicker.repetitions
import com.android.server.wm.flicker.startRotation
@@ -89,6 +91,7 @@ class OpenImeWindowTest(
windowManagerTrace {
navBarWindowIsAlwaysVisible()
statusBarWindowIsAlwaysVisible()
+ visibleWindowsShownMoreThanOneConsecutiveEntry()
all("imeWindowBecomesVisible") {
this.skipUntilFirstAssertion()
@@ -104,6 +107,7 @@ class OpenImeWindowTest(
noUncoveredRegions(configuration.startRotation)
navBarLayerRotatesAndScales(configuration.startRotation)
statusBarLayerRotatesScales(configuration.startRotation)
+ visibleLayersShownMoreThanOneConsecutiveEntry()
imeLayerBecomesVisible()
}
diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
index 2a24d1ac22d2..3d4dc4d67dcc 100644
--- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
+++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java
@@ -29,7 +29,7 @@ import static com.android.server.ConnectivityServiceTestUtils.transportToLegacyT
import static junit.framework.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
import android.content.Context;
import android.net.ConnectivityManager;
@@ -38,7 +38,6 @@ import android.net.Network;
import android.net.NetworkAgent;
import android.net.NetworkAgentConfig;
import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
import android.net.NetworkProvider;
import android.net.NetworkSpecifier;
import android.net.SocketKeepalive;
@@ -53,9 +52,9 @@ import com.android.testutils.HandlerUtils;
import com.android.testutils.TestableNetworkCallback;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
- private final NetworkInfo mNetworkInfo;
private final NetworkCapabilities mNetworkCapabilities;
private final HandlerThread mHandlerThread;
private final Context mContext;
@@ -63,6 +62,7 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
private final ConditionVariable mDisconnected = new ConditionVariable();
private final ConditionVariable mPreventReconnectReceived = new ConditionVariable();
+ private final AtomicBoolean mConnected = new AtomicBoolean(false);
private int mScore;
private NetworkAgent mNetworkAgent;
private int mStartKeepaliveError = SocketKeepalive.ERROR_UNSUPPORTED;
@@ -76,7 +76,6 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
NetworkCapabilities ncTemplate, Context context) throws Exception {
final int type = transportToLegacyType(transport);
final String typeName = ConnectivityManager.getNetworkTypeName(type);
- mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock");
mNetworkCapabilities = (ncTemplate != null) ? ncTemplate : new NetworkCapabilities();
mNetworkCapabilities.addCapability(NET_CAPABILITY_NOT_SUSPENDED);
mNetworkCapabilities.addTransportType(transport);
@@ -108,22 +107,29 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
mHandlerThread = new HandlerThread(mLogTag);
mHandlerThread.start();
- mNetworkAgent = makeNetworkAgent(linkProperties);
+ mNetworkAgent = makeNetworkAgent(linkProperties, type, typeName);
}
- protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties)
+ protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties,
+ final int type, final String typeName)
throws Exception {
- return new InstrumentedNetworkAgent(this, linkProperties);
+ return new InstrumentedNetworkAgent(this, linkProperties, type, typeName);
}
public static class InstrumentedNetworkAgent extends NetworkAgent {
private final NetworkAgentWrapper mWrapper;
-
- public InstrumentedNetworkAgent(NetworkAgentWrapper wrapper, LinkProperties lp) {
- super(wrapper.mHandlerThread.getLooper(), wrapper.mContext, wrapper.mLogTag,
- wrapper.mNetworkInfo, wrapper.mNetworkCapabilities, lp, wrapper.mScore,
- new NetworkAgentConfig(), NetworkProvider.ID_NONE);
+ private static final String PROVIDER_NAME = "InstrumentedNetworkAgentProvider";
+
+ public InstrumentedNetworkAgent(NetworkAgentWrapper wrapper, LinkProperties lp,
+ final int type, final String typeName) {
+ super(wrapper.mContext, wrapper.mHandlerThread.getLooper(), wrapper.mLogTag,
+ wrapper.mNetworkCapabilities, lp, wrapper.mScore,
+ new NetworkAgentConfig.Builder()
+ .setLegacyType(type).setLegacyTypeName(typeName).build(),
+ new NetworkProvider(wrapper.mContext, wrapper.mHandlerThread.getLooper(),
+ PROVIDER_NAME));
mWrapper = wrapper;
+ register();
}
@Override
@@ -212,10 +218,12 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
}
public void connect() {
- assertNotEquals("MockNetworkAgents can only be connected once",
- mNetworkInfo.getDetailedState(), NetworkInfo.DetailedState.CONNECTED);
- mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null);
- mNetworkAgent.sendNetworkInfo(mNetworkInfo);
+ if (!mConnected.compareAndSet(false /* expect */, true /* update */)) {
+ // compareAndSet returns false when the value couldn't be updated because it did not
+ // match the expected value.
+ fail("Test NetworkAgents can only be connected once");
+ }
+ mNetworkAgent.markConnected();
}
public void suspend() {
@@ -227,8 +235,7 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork {
}
public void disconnect() {
- mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null);
- mNetworkAgent.sendNetworkInfo(mNetworkInfo);
+ mNetworkAgent.unregister();
}
@Override
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 5bfcd5202cbf..3aed6019beb5 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -18,6 +18,7 @@ package com.android.server;
import static android.Manifest.permission.CHANGE_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.content.Intent.ACTION_USER_ADDED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED;
@@ -645,8 +646,8 @@ public class ConnectivityServiceTest {
}
@Override
- protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties)
- throws Exception {
+ protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties,
+ final int type, final String typeName) throws Exception {
mNetworkMonitor = mock(INetworkMonitor.class);
final Answer validateAnswer = inv -> {
@@ -665,7 +666,8 @@ public class ConnectivityServiceTest {
any() /* name */,
nmCbCaptor.capture());
- final InstrumentedNetworkAgent na = new InstrumentedNetworkAgent(this, linkProperties) {
+ final InstrumentedNetworkAgent na = new InstrumentedNetworkAgent(this, linkProperties,
+ type, typeName) {
@Override
public void networkStatus(int status, String redirectUrl) {
mRedirectUrl = redirectUrl;
@@ -2547,7 +2549,8 @@ public class ConnectivityServiceTest {
@Test
public void testNoMutableNetworkRequests() throws Exception {
- PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("a"), 0);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+ mContext, 0 /* requestCode */, new Intent("a"), FLAG_IMMUTABLE);
NetworkRequest request1 = new NetworkRequest.Builder()
.addCapability(NET_CAPABILITY_VALIDATED)
.build();
@@ -3209,7 +3212,7 @@ public class ConnectivityServiceTest {
assertThrows(SecurityException.class, () ->
mCm.registerNetworkCallback(r, PendingIntent.getService(
- mServiceContext, 0, new Intent(), 0)));
+ mServiceContext, 0 /* requestCode */, new Intent(), FLAG_IMMUTABLE)));
// Requesting a Network with signal strength should get IllegalArgumentException.
assertThrows(IllegalArgumentException.class, () ->
@@ -3217,7 +3220,7 @@ public class ConnectivityServiceTest {
assertThrows(IllegalArgumentException.class, () ->
mCm.requestNetwork(r, PendingIntent.getService(
- mServiceContext, 0, new Intent(), 0)));
+ mServiceContext, 0 /* requestCode */, new Intent(), FLAG_IMMUTABLE)));
}
@Test
@@ -4681,12 +4684,14 @@ public class ConnectivityServiceTest {
}
j = 0;
while (j++ < INTENTS / 2) {
- PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, new Intent("a" + j), 0);
+ final PendingIntent pi = PendingIntent.getBroadcast(mContext, 0 /* requestCode */,
+ new Intent("a" + j), FLAG_IMMUTABLE);
mCm.requestNetwork(networkRequest, pi);
registered.add(pi);
}
while (j++ < INTENTS) {
- PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, new Intent("b" + j), 0);
+ final PendingIntent pi = PendingIntent.getBroadcast(mContext, 0 /* requestCode */,
+ new Intent("b" + j), FLAG_IMMUTABLE);
mCm.registerNetworkCallback(networkRequest, pi);
registered.add(pi);
}
@@ -4700,11 +4705,13 @@ public class ConnectivityServiceTest {
);
assertThrows(TooManyRequestsException.class, () ->
mCm.requestNetwork(networkRequest,
- PendingIntent.getBroadcast(mContext, 0, new Intent("c"), 0))
+ PendingIntent.getBroadcast(mContext, 0 /* requestCode */,
+ new Intent("c"), FLAG_IMMUTABLE))
);
assertThrows(TooManyRequestsException.class, () ->
mCm.registerNetworkCallback(networkRequest,
- PendingIntent.getBroadcast(mContext, 0, new Intent("d"), 0))
+ PendingIntent.getBroadcast(mContext, 0 /* requestCode */,
+ new Intent("d"), FLAG_IMMUTABLE))
);
for (Object o : registered) {
@@ -4733,16 +4740,16 @@ public class ConnectivityServiceTest {
waitForIdle();
for (int i = 0; i < MAX_REQUESTS; i++) {
- PendingIntent pendingIntent =
- PendingIntent.getBroadcast(mContext, 0, new Intent("e" + i), 0);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+ mContext, 0 /* requestCode */, new Intent("e" + i), FLAG_IMMUTABLE);
mCm.requestNetwork(networkRequest, pendingIntent);
mCm.unregisterNetworkCallback(pendingIntent);
}
waitForIdle();
for (int i = 0; i < MAX_REQUESTS; i++) {
- PendingIntent pendingIntent =
- PendingIntent.getBroadcast(mContext, 0, new Intent("f" + i), 0);
+ final PendingIntent pendingIntent = PendingIntent.getBroadcast(
+ mContext, 0 /* requestCode */, new Intent("f" + i), FLAG_IMMUTABLE);
mCm.registerNetworkCallback(networkRequest, pendingIntent);
mCm.unregisterNetworkCallback(pendingIntent);
}
diff --git a/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java b/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java
index c53462cfb0b2..950d7163c78a 100644
--- a/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java
+++ b/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java
@@ -130,6 +130,7 @@ public class MultipathPolicyTrackerTest {
when(mContext.getResources()).thenReturn(mResources);
when(mContext.getApplicationInfo()).thenReturn(new ApplicationInfo());
+ // Mock user id to all users that Context#registerReceiver will register with all users too.
doReturn(UserHandle.ALL.getIdentifier()).when(mUserAllContext).getUserId();
when(mContext.createContextAsUser(eq(UserHandle.ALL), anyInt()))
.thenReturn(mUserAllContext);
diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
index de35f910d53a..3556c72776dc 100644
--- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java
@@ -58,7 +58,6 @@ import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
-import android.content.pm.UserInfo;
import android.net.INetd;
import android.net.UidRange;
import android.os.Build;
@@ -123,10 +122,10 @@ public class PermissionMonitorTest {
MockitoAnnotations.initMocks(this);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager);
- when(mUserManager.getAliveUsers()).thenReturn(
- Arrays.asList(new UserInfo[] {
- new UserInfo(MOCK_USER1, "", 0),
- new UserInfo(MOCK_USER2, "", 0),
+ when(mUserManager.getUserHandles(eq(true))).thenReturn(
+ Arrays.asList(new UserHandle[] {
+ new UserHandle(MOCK_USER1),
+ new UserHandle(MOCK_USER2),
}));
mPermissionMonitor = spy(new PermissionMonitor(mContext, mNetdService, mDeps));