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--api/Android.bp18
-rw-r--r--core/api/current.txt4855
-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.txt5
-rw-r--r--core/java/android/app/ActivityManager.java38
-rw-r--r--core/java/android/app/AppOpsManager.java14
-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/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/PackageParser.java14
-rw-r--r--core/java/android/content/pm/parsing/ParsingPackageUtils.java15
-rw-r--r--core/java/android/hardware/ISensorPrivacyManager.aidl8
-rw-r--r--core/java/android/hardware/OWNERS3
-rw-r--r--core/java/android/hardware/SensorPrivacyManager.java51
-rw-r--r--core/java/android/hardware/camera2/impl/CameraMetadataNative.java12
-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/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.java168
-rw-r--r--core/java/android/provider/Settings.java29
-rw-r--r--core/java/android/telephony/OWNERS1
-rw-r--r--core/java/android/view/InsetsAnimationThreadControlRunner.java1
-rw-r--r--core/java/android/view/OWNERS67
-rw-r--r--core/java/android/view/Window.java25
-rw-r--r--core/java/android/window/TaskOrganizer.java9
-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/inputmethod/CallbackUtils.java15
-rw-r--r--core/java/com/android/internal/inputmethod/Completable.java168
-rw-r--r--core/java/com/android/internal/inputmethod/IInputBindResultResultCallback.aidl2
-rw-r--r--core/java/com/android/internal/inputmethod/ResultCallbacks.java10
-rw-r--r--core/java/com/android/internal/inputmethod/ThrowableHolder.aidl19
-rw-r--r--core/java/com/android/internal/inputmethod/ThrowableHolder.java91
-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/util/dump/DualDumpOutputStream.java3
-rw-r--r--core/jni/OWNERS18
-rw-r--r--core/jni/android_media_AudioSystem.cpp13
-rw-r--r--core/proto/android/hardware/sensorprivacy.proto50
-rw-r--r--core/res/AndroidManifest.xml9
-rw-r--r--core/res/res/drawable-car/car_button_background.xml50
-rw-r--r--core/res/res/values/strings.xml9
-rwxr-xr-xcore/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java62
-rw-r--r--core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java102
-rw-r--r--core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java156
-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.json12
-rw-r--r--graphics/java/android/graphics/OWNERS2
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java6
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java4
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java41
-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/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java4
-rw-r--r--libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java23
-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/AudioManager.java50
-rw-r--r--media/java/android/media/AudioSystem.java15
-rw-r--r--media/java/android/media/AudioTrack.java3
-rw-r--r--packages/Shell/AndroidManifest.xml3
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java13
-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/src/com/android/systemui/statusbar/policy/SmartReplyView.java8
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java58
-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/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.java410
-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/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/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.java217
-rw-r--r--services/core/java/com/android/server/policy/OWNERS1
-rw-r--r--services/core/java/com/android/server/wm/ActivityRecord.java46
-rw-r--r--services/core/java/com/android/server/wm/ActivityStarter.java6
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskManagerService.java7
-rw-r--r--services/core/java/com/android/server/wm/ActivityTaskSupervisor.java4
-rw-r--r--services/core/java/com/android/server/wm/RootWindowContainer.java19
-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.java222
-rw-r--r--services/core/java/com/android/server/wm/TaskDisplayArea.java27
-rw-r--r--services/core/java/com/android/server/wm/WindowProcessController.java12
-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/ActivityRecordTests.java4
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java6
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java20
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java5
-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/data/ApnThrottleStatus.java4
-rw-r--r--telephony/java/android/telephony/data/DataCallResponse.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
156 files changed, 3009 insertions, 6137 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/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 43cc7a3989e8..1770008b0843 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";
@@ -6941,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);
@@ -7072,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>);
@@ -18525,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 {
@@ -24008,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();
@@ -24037,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);
@@ -24108,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);
@@ -24129,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";
@@ -24476,6 +19672,7 @@ package android.media {
method public java.util.List<android.media.MicrophoneInfo> getMicrophones() throws java.io.IOException;
method public int getMode();
method public String getParameters(String);
+ method public static int getPlaybackOffloadSupport(@NonNull android.media.AudioFormat, @NonNull android.media.AudioAttributes);
method public String getProperty(String);
method public int getRingerMode();
method @Deprecated public int getRouting(int);
@@ -24594,6 +19791,9 @@ package android.media {
field public static final int MODE_NORMAL = 0; // 0x0
field public static final int MODE_RINGTONE = 1; // 0x1
field @Deprecated public static final int NUM_STREAMS = 5; // 0x5
+ field public static final int PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED = 2; // 0x2
+ field public static final int PLAYBACK_OFFLOAD_NOT_SUPPORTED = 0; // 0x0
+ field public static final int PLAYBACK_OFFLOAD_SUPPORTED = 1; // 0x1
field public static final String PROPERTY_OUTPUT_FRAMES_PER_BUFFER = "android.media.property.OUTPUT_FRAMES_PER_BUFFER";
field public static final String PROPERTY_OUTPUT_SAMPLE_RATE = "android.media.property.OUTPUT_SAMPLE_RATE";
field public static final String PROPERTY_SUPPORT_AUDIO_SOURCE_UNPROCESSED = "android.media.property.SUPPORT_AUDIO_SOURCE_UNPROCESSED";
@@ -54232,6 +49432,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 eef73c1f6089..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";
}
}
@@ -1009,6 +1010,8 @@ package android.media {
field public static final int DEVICE_ROLE_DISABLED = 2; // 0x2
field public static final int DEVICE_ROLE_NONE = 0; // 0x0
field public static final int DEVICE_ROLE_PREFERRED = 1; // 0x1
+ field public static final int OFFLOAD_GAPLESS_SUPPORTED = 2; // 0x2
+ field public static final int OFFLOAD_SUPPORTED = 1; // 0x1
field public static final int STREAM_DEFAULT = -1; // 0xffffffff
}
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/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/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/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/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/ISensorPrivacyManager.aidl b/core/java/android/hardware/ISensorPrivacyManager.aidl
index 1ba7b989a764..4e368d0610b3 100644
--- a/core/java/android/hardware/ISensorPrivacyManager.aidl
+++ b/core/java/android/hardware/ISensorPrivacyManager.aidl
@@ -32,4 +32,12 @@ interface ISensorPrivacyManager {
void setSensorPrivacy(boolean enable);
// =============== End of transactions used on native side as well ============================
+
+ // TODO(evanseverson) add to native interface
+ boolean isIndividualSensorPrivacyEnabled(int sensor);
+
+ // TODO(evanseverson) add to native interface
+ void setIndividualSensorPrivacy(int sensor, boolean enable);
+
+ // TODO(evanseverson) listeners
} \ No newline at end of file
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/SensorPrivacyManager.java b/core/java/android/hardware/SensorPrivacyManager.java
index 274202f7c190..c647239d9049 100644
--- a/core/java/android/hardware/SensorPrivacyManager.java
+++ b/core/java/android/hardware/SensorPrivacyManager.java
@@ -16,6 +16,7 @@
package android.hardware;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
@@ -23,10 +24,14 @@ import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.service.SensorPrivacyIndividualEnabledSensorProto;
import android.util.ArrayMap;
import com.android.internal.annotations.GuardedBy;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* This class provides access to the sensor privacy services; sensor privacy allows the
* user to disable access to all sensors on the device. This class provides methods to query the
@@ -38,6 +43,25 @@ import com.android.internal.annotations.GuardedBy;
@SystemService(Context.SENSOR_PRIVACY_SERVICE)
public final class SensorPrivacyManager {
+ /** Microphone */
+ public static final int INDIVIDUAL_SENSOR_MICROPHONE =
+ SensorPrivacyIndividualEnabledSensorProto.MICROPHONE;
+
+ /** Camera */
+ public static final int INDIVIDUAL_SENSOR_CAMERA =
+ SensorPrivacyIndividualEnabledSensorProto.CAMERA;
+
+ /**
+ * Individual sensors not listed in {@link Sensor}
+ * @hide
+ */
+ @IntDef(prefix = "INDIVIDUAL_SENSOR_", value = {
+ INDIVIDUAL_SENSOR_MICROPHONE,
+ INDIVIDUAL_SENSOR_CAMERA
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface IndividualSensor {}
+
/**
* A class implementing this interface can register with the {@link
* android.hardware.SensorPrivacyManager} to receive notification when the sensor privacy
@@ -168,4 +192,31 @@ public final class SensorPrivacyManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Returns whether sensor privacy is currently enabled for a specific sensor.
+ *
+ * @return true if sensor privacy is currently enabled, false otherwise.
+ */
+ public boolean isIndividualSensorPrivacyEnabled(@IndividualSensor int sensor) {
+ try {
+ return mService.isIndividualSensorPrivacyEnabled(sensor);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Sets sensor privacy to the specified state for an individual sensor.
+ *
+ * @param enable the state to which sensor privacy should be set.
+ */
+ @RequiresPermission(android.Manifest.permission.MANAGE_SENSOR_PRIVACY)
+ public void setIndividualSensorPrivacy(@IndividualSensor int sensor, boolean enable) {
+ try {
+ mService.setIndividualSensorPrivacy(sensor, enable);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
}
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index 19f4cd6e991a..5cc7bf8cefed 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -1719,37 +1719,25 @@ public class CameraMetadataNative implements Parcelable {
private static native long nativeAllocateCopy(long ptr)
throws NullPointerException;
- @FastNative
private static synchronized native void nativeWriteToParcel(Parcel dest, long ptr);
- @FastNative
private static synchronized native void nativeReadFromParcel(Parcel source, long ptr);
- @FastNative
private static synchronized native void nativeSwap(long ptr, long otherPtr)
throws NullPointerException;
- @FastNative
private static synchronized native void nativeClose(long ptr);
- @FastNative
private static synchronized native boolean nativeIsEmpty(long ptr);
- @FastNative
private static synchronized native int nativeGetEntryCount(long ptr);
- @FastNative
private static synchronized native long nativeGetBufferSize(long ptr);
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- @FastNative
private static synchronized native byte[] nativeReadValues(int tag, long ptr);
- @FastNative
private static synchronized native void nativeWriteValues(int tag, byte[] src, long ptr);
private static synchronized native void nativeDump(long ptr) throws IOException; // dump to LOGD
- @FastNative
private static synchronized native ArrayList nativeGetAllVendorKeys(long ptr, Class keyClass);
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- @FastNative
private static synchronized native int nativeGetTagFromKeyLocal(long ptr, String keyName)
throws IllegalArgumentException;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- @FastNative
private static synchronized native int nativeGetTypeFromTagLocal(long ptr, int tag)
throws IllegalArgumentException;
@FastNative
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/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..3940bd62950c 100644
--- a/core/java/android/permission/PermissionManager.java
+++ b/core/java/android/permission/PermissionManager.java
@@ -19,7 +19,6 @@ package android.permission;
import static android.os.Build.VERSION_CODES.S;
import android.Manifest;
-import android.annotation.CallbackExecutor;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -29,6 +28,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;
@@ -44,7 +44,6 @@ import android.os.UserHandle;
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 +51,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.
@@ -89,35 +86,24 @@ public final class PermissionManager {
private final IPermissionManager mPermissionManager;
+ private final LegacyPermissionManager mLegacyPermissionManager;
+
private List<SplitPermissionInfo> mSplitPermissionInfos;
/**
* Creates a new instance.
*
- * @param context The current context in which to operate.
- * @hide
- */
- public PermissionManager(@NonNull Context context, IPackageManager packageManager)
- throws ServiceManager.ServiceNotFoundException {
- this(context, packageManager, IPermissionManager.Stub.asInterface(
- ServiceManager.getServiceOrThrow("permissionmgr")));
- }
-
- /**
- * Creates a new instance with the provided instantiation of the IPermissionManager.
+ * @param context The current context in which to operate
*
- * @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) {
+ public PermissionManager(@NonNull Context context)
+ throws ServiceManager.ServiceNotFoundException {
mContext = context;
- mPackageManager = packageManager;
- mPermissionManager = permissionManager;
+ mPackageManager = AppGlobals.getPackageManager();
+ mPermissionManager = IPermissionManager.Stub.asInterface(ServiceManager.getServiceOrThrow(
+ "permissionmgr"));
+ mLegacyPermissionManager = context.getSystemService(LegacyPermissionManager.class);
}
/**
@@ -198,132 +184,6 @@ public final class PermissionManager {
}
/**
- * 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 {
- mPermissionManager.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 {
- mPermissionManager.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 {
- mPermissionManager.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 {
- mPermissionManager.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 {
- mPermissionManager.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 {
- mPermissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames,
- user.getIdentifier());
- executor.execute(() -> callback.accept(true));
- } catch (RemoteException e) {
- e.rethrowFromSystemServer();
- }
- }
-
- /**
* Gets the list of packages that have permissions that specified
* {@code requestDontAutoRevokePermissions=true} in their
* {@code application} manifest declaration.
@@ -530,12 +390,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 */
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/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/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..5196c3e88eec 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -10,17 +10,64 @@ ogunwale@google.com
jjaggi@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/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/window/TaskOrganizer.java b/core/java/android/window/TaskOrganizer.java
index c4bdb5a72689..12c4b5b7794a 100644
--- a/core/java/android/window/TaskOrganizer.java
+++ b/core/java/android/window/TaskOrganizer.java
@@ -210,6 +210,15 @@ public class TaskOrganizer extends WindowOrganizer {
}
}
+ /**
+ * Gets the executor to run callbacks on.
+ * @hide
+ */
+ @NonNull
+ public Executor getExecutor() {
+ return mExecutor;
+ }
+
private final ITaskOrganizer mInterface = new ITaskOrganizer.Stub() {
@Override
public void addStartingWindow(ActivityManager.RunningTaskInfo taskInfo, IBinder appToken) {
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/inputmethod/CallbackUtils.java b/core/java/com/android/internal/inputmethod/CallbackUtils.java
index ec6779216ae5..a315e5a4fc94 100644
--- a/core/java/com/android/internal/inputmethod/CallbackUtils.java
+++ b/core/java/com/android/internal/inputmethod/CallbackUtils.java
@@ -45,8 +45,21 @@ public final class CallbackUtils {
@AnyThread
public static void onResult(@NonNull IInputBindResultResultCallback callback,
@NonNull Supplier<InputBindResult> resultSupplier) {
+ InputBindResult result = null;
+ Throwable exception = null;
+
+ try {
+ result = resultSupplier.get();
+ } catch (Throwable throwable) {
+ exception = throwable;
+ }
+
try {
- callback.onResult(resultSupplier.get());
+ if (exception != null) {
+ callback.onError(ThrowableHolder.of(exception));
+ return;
+ }
+ callback.onResult(result);
} catch (RemoteException ignored) { }
}
}
diff --git a/core/java/com/android/internal/inputmethod/Completable.java b/core/java/com/android/internal/inputmethod/Completable.java
index b9e1cf09dc07..bd8c23e66e51 100644
--- a/core/java/com/android/internal/inputmethod/Completable.java
+++ b/core/java/com/android/internal/inputmethod/Completable.java
@@ -16,13 +16,17 @@
package com.android.internal.inputmethod;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
import android.annotation.AnyThread;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
+import java.lang.annotation.Retention;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -51,21 +55,100 @@ public final class Completable {
/**
* Lock {@link Object} to guard complete operations within this class.
*/
- protected final Object mValueLock = new Object();
+ protected final Object mStateLock = new Object();
/**
- * {@code true} after {@link #onComplete()} gets called.
+ * Indicates the completion state of this object.
*/
- @GuardedBy("mValueLock")
- protected boolean mHasValue = false;
+ @GuardedBy("mStateLock")
+ @CompletionState
+ protected int mState = CompletionState.NOT_COMPLETED;
/**
- * @return {@link true} if {@link #onComplete()} gets called already.
+ * {@link Throwable} message passed to {@link #onError(ThrowableHolder)}.
+ *
+ * <p>This is not {@code null} only when {@link #mState} is
+ * {@link CompletionState#COMPLETED_WITH_ERROR}.</p>
+ */
+ @GuardedBy("mStateLock")
+ @Nullable
+ protected String mMessage = null;
+
+ @Retention(SOURCE)
+ @IntDef({
+ CompletionState.NOT_COMPLETED,
+ CompletionState.COMPLETED_WITH_VALUE,
+ CompletionState.COMPLETED_WITH_ERROR})
+ protected @interface CompletionState {
+ /**
+ * This object is not completed yet.
+ */
+ int NOT_COMPLETED = 0;
+ /**
+ * This object is already completed with a value.
+ */
+ int COMPLETED_WITH_VALUE = 1;
+ /**
+ * This object is already completed with an error.
+ */
+ int COMPLETED_WITH_ERROR = 2;
+ }
+
+ /**
+ * Converts the given {@link CompletionState} into a human-readable string.
+ *
+ * @param state {@link CompletionState} to be converted.
+ * @return a human-readable {@link String} for the given {@code state}.
+ */
+ @AnyThread
+ protected static String stateToString(@CompletionState int state) {
+ switch (state) {
+ case CompletionState.NOT_COMPLETED:
+ return "NOT_COMPLETED";
+ case CompletionState.COMPLETED_WITH_VALUE:
+ return "COMPLETED_WITH_VALUE";
+ case CompletionState.COMPLETED_WITH_ERROR:
+ return "COMPLETED_WITH_ERROR";
+ default:
+ return "Unknown(value=" + state + ")";
+ }
+ }
+
+ /**
+ * @return {@link true} if {@link #onComplete()} gets called and {@link #mState} is
+ * {@link CompletionState#COMPLETED_WITH_VALUE} .
*/
@AnyThread
public boolean hasValue() {
- synchronized (mValueLock) {
- return mHasValue;
+ synchronized (mStateLock) {
+ return mState == CompletionState.COMPLETED_WITH_VALUE;
+ }
+ }
+
+ /**
+ * Provides the base implementation of {@code getValue()} for derived classes.
+ *
+ * <p>Must be called after acquiring {@link #mStateLock}.</p>
+ *
+ * @throws RuntimeException when {@link #mState} is
+ * {@link CompletionState#COMPLETED_WITH_ERROR}.
+ * @throws UnsupportedOperationException when {@link #mState} is not
+ * {@link CompletionState#COMPLETED_WITH_VALUE} and
+ * {@link CompletionState#COMPLETED_WITH_ERROR}.
+ */
+ @GuardedBy("mStateLock")
+ protected void enforceGetValueLocked() {
+ switch (mState) {
+ case CompletionState.NOT_COMPLETED:
+ throw new UnsupportedOperationException(
+ "getValue() is allowed only if hasValue() returns true");
+ case CompletionState.COMPLETED_WITH_VALUE:
+ return;
+ case CompletionState.COMPLETED_WITH_ERROR:
+ throw new RuntimeException(mMessage);
+ default:
+ throw new UnsupportedOperationException(
+ "getValue() is not allowed on state=" + stateToString(mState));
}
}
@@ -78,6 +161,27 @@ public final class Completable {
}
/**
+ * Notify when exception happened.
+ *
+ * @param throwableHolder contains the {@link Throwable} object when exception happened.
+ */
+ @AnyThread
+ protected void onError(ThrowableHolder throwableHolder) {
+ synchronized (mStateLock) {
+ switch (mState) {
+ case CompletionState.NOT_COMPLETED:
+ mMessage = throwableHolder.getMessage();
+ mState = CompletionState.COMPLETED_WITH_ERROR;
+ break;
+ default:
+ throw new UnsupportedOperationException(
+ "onError() is not allowed on state=" + stateToString(mState));
+ }
+ }
+ onComplete();
+ }
+
+ /**
* Blocks the calling thread until at least one of the following conditions is met.
*
* <p>
@@ -140,7 +244,7 @@ public final class Completable {
* Completable object of integer primitive.
*/
public static final class Int extends ValueBase {
- @GuardedBy("mValueLock")
+ @GuardedBy("mStateLock")
private int mValue = 0;
/**
@@ -150,29 +254,30 @@ public final class Completable {
*/
@AnyThread
void onComplete(int value) {
- synchronized (mValueLock) {
- if (mHasValue) {
- throw new UnsupportedOperationException(
- "onComplete() cannot be called multiple times");
+ synchronized (mStateLock) {
+ switch (mState) {
+ case CompletionState.NOT_COMPLETED:
+ mValue = value;
+ mState = CompletionState.COMPLETED_WITH_VALUE;
+ break;
+ default:
+ throw new UnsupportedOperationException(
+ "onComplete() is not allowed on state=" + stateToString(mState));
}
- mValue = value;
- mHasValue = true;
}
onComplete();
}
/**
* @return value associated with this object.
+ * @throws RuntimeException when called while {@link #onError} happened.
* @throws UnsupportedOperationException when called while {@link #hasValue()} returns
* {@code false}.
*/
@AnyThread
public int getValue() {
- synchronized (mValueLock) {
- if (!mHasValue) {
- throw new UnsupportedOperationException(
- "getValue() is allowed only if hasValue() returns true");
- }
+ synchronized (mStateLock) {
+ enforceGetValueLocked();
return mValue;
}
}
@@ -184,7 +289,7 @@ public final class Completable {
* @param <T> type associated with this completable object.
*/
public static class Values<T> extends ValueBase {
- @GuardedBy("mValueLock")
+ @GuardedBy("mStateLock")
@Nullable
private T mValue = null;
@@ -195,30 +300,31 @@ public final class Completable {
*/
@AnyThread
void onComplete(@Nullable T value) {
- synchronized (mValueLock) {
- if (mHasValue) {
- throw new UnsupportedOperationException(
- "onComplete() cannot be called multiple times");
+ synchronized (mStateLock) {
+ switch (mState) {
+ case CompletionState.NOT_COMPLETED:
+ mValue = value;
+ mState = CompletionState.COMPLETED_WITH_VALUE;
+ break;
+ default:
+ throw new UnsupportedOperationException(
+ "onComplete() is not allowed on state=" + stateToString(mState));
}
- mValue = value;
- mHasValue = true;
}
onComplete();
}
/**
* @return value associated with this object.
+ * @throws RuntimeException when called while {@link #onError} happened
* @throws UnsupportedOperationException when called while {@link #hasValue()} returns
* {@code false}.
*/
@AnyThread
@Nullable
public T getValue() {
- synchronized (mValueLock) {
- if (!mHasValue) {
- throw new UnsupportedOperationException(
- "getValue() is allowed only if hasValue() returns true");
- }
+ synchronized (mStateLock) {
+ enforceGetValueLocked();
return mValue;
}
}
diff --git a/core/java/com/android/internal/inputmethod/IInputBindResultResultCallback.aidl b/core/java/com/android/internal/inputmethod/IInputBindResultResultCallback.aidl
index b52b3b100ed0..269198404873 100644
--- a/core/java/com/android/internal/inputmethod/IInputBindResultResultCallback.aidl
+++ b/core/java/com/android/internal/inputmethod/IInputBindResultResultCallback.aidl
@@ -17,7 +17,9 @@
package com.android.internal.inputmethod;
import com.android.internal.view.InputBindResult;
+import com.android.internal.inputmethod.ThrowableHolder;
oneway interface IInputBindResultResultCallback {
void onResult(in InputBindResult result);
+ void onError(in ThrowableHolder exception);
} \ No newline at end of file
diff --git a/core/java/com/android/internal/inputmethod/ResultCallbacks.java b/core/java/com/android/internal/inputmethod/ResultCallbacks.java
index c59dcf4ce420..1929b6f22f8b 100644
--- a/core/java/com/android/internal/inputmethod/ResultCallbacks.java
+++ b/core/java/com/android/internal/inputmethod/ResultCallbacks.java
@@ -181,6 +181,16 @@ public final class ResultCallbacks {
}
value.onComplete(result);
}
+
+ @BinderThread
+ @Override
+ public void onError(ThrowableHolder throwableHolder) {
+ final Completable.InputBindResult value = unwrap(atomicRef);
+ if (value == null) {
+ return;
+ }
+ value.onError(throwableHolder);
+ }
};
}
}
diff --git a/core/java/com/android/internal/inputmethod/ThrowableHolder.aidl b/core/java/com/android/internal/inputmethod/ThrowableHolder.aidl
new file mode 100644
index 000000000000..ed1129345061
--- /dev/null
+++ b/core/java/com/android/internal/inputmethod/ThrowableHolder.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2008 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.inputmethod;
+
+parcelable ThrowableHolder; \ No newline at end of file
diff --git a/core/java/com/android/internal/inputmethod/ThrowableHolder.java b/core/java/com/android/internal/inputmethod/ThrowableHolder.java
new file mode 100644
index 000000000000..b6f449864e54
--- /dev/null
+++ b/core/java/com/android/internal/inputmethod/ThrowableHolder.java
@@ -0,0 +1,91 @@
+/*
+ * 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 com.android.internal.inputmethod;
+
+import android.annotation.AnyThread;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * A {@link Parcelable} helper class to encapsulate the exception information.
+ */
+public final class ThrowableHolder implements Parcelable {
+
+ @Nullable
+ private final String mMessage;
+
+ ThrowableHolder(@NonNull Throwable throwable) {
+ mMessage = throwable.getMessage();
+ }
+
+ ThrowableHolder(Parcel source) {
+ mMessage = source.readString();
+ }
+
+ /**
+ * Returns a {@link ThrowableHolder} with given {@link Throwable}.
+ */
+ @NonNull
+ @AnyThread
+ public static ThrowableHolder of(@NonNull Throwable throwable) {
+ return new ThrowableHolder(throwable);
+ }
+
+ /**
+ * Gets the message in this {@link ThrowableHolder}.
+ */
+ @Nullable
+ @AnyThread
+ String getMessage() {
+ return mMessage;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /**
+ * Used to package this object into a {@link Parcel}.
+ *
+ * @param dest The {@link Parcel} to be written.
+ * @param flags The flags used for parceling.
+ */
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mMessage);
+ }
+
+ /**
+ * Used to make this class parcelable.
+ */
+ public static final Parcelable.Creator<ThrowableHolder> CREATOR =
+ new Parcelable.Creator<ThrowableHolder>() {
+
+ @Override
+ public ThrowableHolder createFromParcel(Parcel source) {
+ return new ThrowableHolder(source);
+ }
+
+ @Override
+ public ThrowableHolder[] newArray(int size) {
+ return new ThrowableHolder[size];
+ }
+ };
+}
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/util/dump/DualDumpOutputStream.java b/core/java/com/android/internal/util/dump/DualDumpOutputStream.java
index 3ac38edaddb4..20419db80e88 100644
--- a/core/java/com/android/internal/util/dump/DualDumpOutputStream.java
+++ b/core/java/com/android/internal/util/dump/DualDumpOutputStream.java
@@ -18,11 +18,10 @@ package com.android.internal.util.dump;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.util.IndentingPrintWriter;
import android.util.Log;
import android.util.proto.ProtoOutputStream;
-import com.android.internal.util.IndentingPrintWriter;
-
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
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/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index b1b0284e5295..a95ee4f12c51 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -2083,10 +2083,9 @@ android_media_AudioSystem_getStreamVolumeDB(JNIEnv *env, jobject thiz,
(audio_devices_t)device);
}
-static jboolean
-android_media_AudioSystem_isOffloadSupported(JNIEnv *env, jobject thiz,
- jint encoding, jint sampleRate, jint channelMask, jint channelIndexMask, jint streamType)
-{
+static jint android_media_AudioSystem_getOffloadSupport(JNIEnv *env, jobject thiz, jint encoding,
+ jint sampleRate, jint channelMask,
+ jint channelIndexMask, jint streamType) {
audio_offload_info_t format = AUDIO_INFO_INITIALIZER;
format.format = (audio_format_t) audioFormatToNative(encoding);
format.sample_rate = (uint32_t) sampleRate;
@@ -2098,7 +2097,7 @@ android_media_AudioSystem_isOffloadSupported(JNIEnv *env, jobject thiz,
// client side code cannot access "audio.offload.min.duration.secs" property to make a query
// agnostic of duration, so using acceptable estimate of 2mn
format.duration_us = 120 * 1000000;
- return AudioSystem::isOffloadSupported(format);
+ return AudioSystem::getOffloadSupport(format);
}
static jint
@@ -2574,8 +2573,8 @@ static const JNINativeMethod gMethods[] =
(void *)android_media_AudioSystem_registerRecordingCallback},
{"systemReady", "()I", (void *)android_media_AudioSystem_systemReady},
{"getStreamVolumeDB", "(III)F", (void *)android_media_AudioSystem_getStreamVolumeDB},
- {"native_is_offload_supported", "(IIIII)Z",
- (void *)android_media_AudioSystem_isOffloadSupported},
+ {"native_get_offload_support", "(IIIII)I",
+ (void *)android_media_AudioSystem_getOffloadSupport},
{"getMicrophones", "(Ljava/util/ArrayList;)I",
(void *)android_media_AudioSystem_getMicrophones},
{"getSurroundFormats", "(Ljava/util/Map;Z)I",
diff --git a/core/proto/android/hardware/sensorprivacy.proto b/core/proto/android/hardware/sensorprivacy.proto
new file mode 100644
index 000000000000..07e938ddfc5d
--- /dev/null
+++ b/core/proto/android/hardware/sensorprivacy.proto
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+syntax = "proto2";
+package android.service;
+
+option java_multiple_files = true;
+option java_outer_classname = "SensorPrivacyServiceProto";
+
+import "frameworks/base/core/proto/android/privacy.proto";
+
+message SensorPrivacyServiceDumpProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ // Is global sensor privacy enabled
+ optional bool is_enabled = 1;
+
+ // Per sensor privacy enabled
+ repeated SensorPrivacyIndividualEnabledSensorProto individual_enabled_sensor = 2;
+}
+
+message SensorPrivacyIndividualEnabledSensorProto {
+ option (android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ enum Sensor {
+ UNKNOWN = 0;
+
+ MICROPHONE = 1;
+ CAMERA = 2;
+ }
+
+ // Sensor for which privacy might be enabled
+ optional Sensor sensor = 1;
+
+ // If sensor privacy is enabled for this sensor
+ optional bool is_enabled = 2;
+} \ No newline at end of file
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 1b40fe2f750a..ef7edc2f2dd2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2259,7 +2259,9 @@
<!-- Allows to query ongoing call details and manage ongoing calls
<p>Protection level: signature|appop -->
<permission android:name="android.permission.MANAGE_ONGOING_CALLS"
- android:protectionLevel="signature|appop" />
+ android:protectionLevel="signature|appop"
+ android:label="@string/permlab_manageOngoingCalls"
+ android:description="@string/permdesc_manageOngoingCalls" />
<!-- Allows the app to request network scans from telephony.
<p>Not for use by third-party applications.
@@ -2730,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 -->
<!-- ================================== -->
@@ -3284,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"
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/strings.xml b/core/res/res/values/strings.xml
index 89b986b8fcb8..31aee4a2e8b4 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -928,6 +928,15 @@
interfere with the performance or operation of your device when an
emergency cell broadcast is received.</string>
+ <!-- Title for an application which grants an app the ability to see and manage calls on
+ the user's device. Usually reserved for apps associated with wearable devices that
+ can show information about calls. -->
+ <string name="permlab_manageOngoingCalls">Manage ongoing calls</string>
+ <!-- Description of an application permission, listed so the user can choose whether they
+ want to allow the application to do this. -->
+ <string name="permdesc_manageOngoingCalls">Allows an app to see details about ongoing calls
+ on your device and to control these calls.</string>
+
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
<string name="permlab_readCellBroadcasts">read cell broadcast messages</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. -->
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/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java b/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java
index 7aeb86ae0cb1..6d8e2c59be97 100644
--- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java
+++ b/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java
@@ -17,8 +17,12 @@
package com.android.frameworks.core.powerstatsviewer;
import android.content.Context;
+import android.os.BatteryConsumer;
import android.os.BatteryStats;
+import android.os.BatteryUsageStats;
import android.os.Process;
+import android.os.UidBatteryConsumer;
+import android.os.UserHandle;
import com.android.internal.os.BatterySipper;
import com.android.internal.os.BatteryStatsHelper;
@@ -58,7 +62,7 @@ public class PowerStatsData {
private final List<Entry> mEntries = new ArrayList<>();
public PowerStatsData(Context context, BatteryStatsHelper batteryStatsHelper,
- String powerConsumerId) {
+ BatteryUsageStats batteryUsageStats, String powerConsumerId) {
List<BatterySipper> usageList = batteryStatsHelper.getUsageList();
BatteryStats batteryStats = batteryStatsHelper.getStats();
@@ -92,14 +96,14 @@ public class PowerStatsData {
long totalAudioTimeMs = 0;
long totalVideoTimeMs = 0;
- BatterySipper requestedPowerConsumer = null;
+ BatterySipper requestedBatterySipper = null;
for (BatterySipper sipper : usageList) {
if (sipper.drainType == BatterySipper.DrainType.SCREEN) {
totalScreenPower = sipper.sumPower();
}
if (powerConsumerId(sipper).equals(powerConsumerId)) {
- requestedPowerConsumer = sipper;
+ requestedBatterySipper = sipper;
}
totalPowerMah += sipper.sumPower();
@@ -136,81 +140,95 @@ public class PowerStatsData {
totalVideoTimeMs += sipper.videoTimeMs;
}
- long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy();
+ BatteryConsumer requestedBatteryConsumer = null;
+
+ for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) {
+ if (powerConsumerId(consumer).equals(powerConsumerId)) {
+ requestedBatteryConsumer = consumer;
+ break;
+ }
+ }
- if (requestedPowerConsumer == null) {
+ if (requestedBatterySipper == null) {
mPowerConsumerInfo = null;
return;
}
+ long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy();
+
mPowerConsumerInfo = PowerConsumerInfoHelper.makePowerConsumerInfo(
- context.getPackageManager(), requestedPowerConsumer);
+ context.getPackageManager(), requestedBatterySipper);
addEntry("Total power", EntryType.POWER,
- requestedPowerConsumer.totalSmearedPowerMah, totalSmearedPowerMah);
- maybeAddMeasuredEnergyEntry(requestedPowerConsumer.drainType, batteryStats);
+ requestedBatterySipper.totalSmearedPowerMah, totalSmearedPowerMah);
+ maybeAddMeasuredEnergyEntry(requestedBatterySipper.drainType, batteryStats);
addEntry("... excluding system", EntryType.POWER,
- requestedPowerConsumer.totalSmearedPowerMah, totalPowerExcludeSystemMah);
+ requestedBatterySipper.totalSmearedPowerMah, totalPowerExcludeSystemMah);
addEntry("Screen, smeared", EntryType.POWER,
- requestedPowerConsumer.screenPowerMah, totalScreenPower);
+ requestedBatterySipper.screenPowerMah, totalScreenPower);
if (totalScreenMeasuredEnergyUJ != BatteryStats.ENERGY_DATA_UNAVAILABLE) {
final double measuredCharge = UJ_2_MAH * totalScreenMeasuredEnergyUJ;
final double ratio = measuredCharge / totalScreenPower;
addEntry("Screen, smeared (PowerStatsHal adjusted)", EntryType.POWER,
- requestedPowerConsumer.screenPowerMah * ratio, measuredCharge);
+ requestedBatterySipper.screenPowerMah * ratio, measuredCharge);
}
addEntry("Other, smeared", EntryType.POWER,
- requestedPowerConsumer.proportionalSmearMah, totalProportionalSmearMah);
+ requestedBatterySipper.proportionalSmearMah, totalProportionalSmearMah);
addEntry("Excluding smeared", EntryType.POWER,
- requestedPowerConsumer.totalPowerMah, totalPowerMah);
- addEntry("CPU", EntryType.POWER,
- requestedPowerConsumer.cpuPowerMah, totalCpuPowerMah);
+ requestedBatterySipper.totalPowerMah, totalPowerMah);
+ if (requestedBatteryConsumer != null) {
+ addEntry("CPU", EntryType.POWER,
+ requestedBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_CPU),
+ totalCpuPowerMah);
+ }
+ addEntry("CPU (sipper)", EntryType.POWER,
+ requestedBatterySipper.cpuPowerMah, totalCpuPowerMah);
addEntry("System services", EntryType.POWER,
- requestedPowerConsumer.systemServiceCpuPowerMah, totalSystemServiceCpuPowerMah);
+ requestedBatterySipper.systemServiceCpuPowerMah, totalSystemServiceCpuPowerMah);
addEntry("Usage", EntryType.POWER,
- requestedPowerConsumer.usagePowerMah, totalUsagePowerMah);
+ requestedBatterySipper.usagePowerMah, totalUsagePowerMah);
addEntry("Wake lock", EntryType.POWER,
- requestedPowerConsumer.wakeLockPowerMah, totalWakeLockPowerMah);
+ requestedBatterySipper.wakeLockPowerMah, totalWakeLockPowerMah);
addEntry("Mobile radio", EntryType.POWER,
- requestedPowerConsumer.mobileRadioPowerMah, totalMobileRadioPowerMah);
+ requestedBatterySipper.mobileRadioPowerMah, totalMobileRadioPowerMah);
addEntry("WiFi", EntryType.POWER,
- requestedPowerConsumer.wifiPowerMah, totalWifiPowerMah);
+ requestedBatterySipper.wifiPowerMah, totalWifiPowerMah);
addEntry("Bluetooth", EntryType.POWER,
- requestedPowerConsumer.bluetoothPowerMah, totalBluetoothPowerMah);
+ requestedBatterySipper.bluetoothPowerMah, totalBluetoothPowerMah);
addEntry("GPS", EntryType.POWER,
- requestedPowerConsumer.gpsPowerMah, totalGpsPowerMah);
+ requestedBatterySipper.gpsPowerMah, totalGpsPowerMah);
addEntry("Camera", EntryType.POWER,
- requestedPowerConsumer.cameraPowerMah, totalCameraPowerMah);
+ requestedBatterySipper.cameraPowerMah, totalCameraPowerMah);
addEntry("Flashlight", EntryType.POWER,
- requestedPowerConsumer.flashlightPowerMah, totalFlashlightPowerMah);
+ requestedBatterySipper.flashlightPowerMah, totalFlashlightPowerMah);
addEntry("Sensors", EntryType.POWER,
- requestedPowerConsumer.sensorPowerMah, totalSensorPowerMah);
+ requestedBatterySipper.sensorPowerMah, totalSensorPowerMah);
addEntry("Audio", EntryType.POWER,
- requestedPowerConsumer.audioPowerMah, totalAudioPowerMah);
+ requestedBatterySipper.audioPowerMah, totalAudioPowerMah);
addEntry("Video", EntryType.POWER,
- requestedPowerConsumer.videoPowerMah, totalVideoPowerMah);
+ requestedBatterySipper.videoPowerMah, totalVideoPowerMah);
addEntry("CPU time", EntryType.DURATION,
- requestedPowerConsumer.cpuTimeMs, totalCpuTimeMs);
+ requestedBatterySipper.cpuTimeMs, totalCpuTimeMs);
addEntry("CPU foreground time", EntryType.DURATION,
- requestedPowerConsumer.cpuFgTimeMs, totalCpuFgTimeMs);
+ requestedBatterySipper.cpuFgTimeMs, totalCpuFgTimeMs);
addEntry("Wake lock time", EntryType.DURATION,
- requestedPowerConsumer.wakeLockTimeMs, totalWakeLockTimeMs);
+ requestedBatterySipper.wakeLockTimeMs, totalWakeLockTimeMs);
addEntry("WiFi running time", EntryType.DURATION,
- requestedPowerConsumer.wifiRunningTimeMs, totalWifiRunningTimeMs);
+ requestedBatterySipper.wifiRunningTimeMs, totalWifiRunningTimeMs);
addEntry("Bluetooth time", EntryType.DURATION,
- requestedPowerConsumer.bluetoothRunningTimeMs, totalBluetoothRunningTimeMs);
+ requestedBatterySipper.bluetoothRunningTimeMs, totalBluetoothRunningTimeMs);
addEntry("GPS time", EntryType.DURATION,
- requestedPowerConsumer.gpsTimeMs, totalGpsTimeMs);
+ requestedBatterySipper.gpsTimeMs, totalGpsTimeMs);
addEntry("Camera time", EntryType.DURATION,
- requestedPowerConsumer.cameraTimeMs, totalCameraTimeMs);
+ requestedBatterySipper.cameraTimeMs, totalCameraTimeMs);
addEntry("Flashlight time", EntryType.DURATION,
- requestedPowerConsumer.flashlightTimeMs, totalFlashlightTimeMs);
+ requestedBatterySipper.flashlightTimeMs, totalFlashlightTimeMs);
addEntry("Audio time", EntryType.DURATION,
- requestedPowerConsumer.audioTimeMs, totalAudioTimeMs);
+ requestedBatterySipper.audioTimeMs, totalAudioTimeMs);
addEntry("Video time", EntryType.DURATION,
- requestedPowerConsumer.videoTimeMs, totalVideoTimeMs);
+ requestedBatterySipper.videoTimeMs, totalVideoTimeMs);
}
private boolean isSystemSipper(BatterySipper sipper) {
@@ -272,4 +290,14 @@ public class PowerStatsData {
public static String powerConsumerId(BatterySipper sipper) {
return sipper.drainType + "|" + sipper.userId + "|" + sipper.getUid();
}
+
+ public static String powerConsumerId(BatteryConsumer consumer) {
+ if (consumer instanceof UidBatteryConsumer) {
+ return BatterySipper.DrainType.APP + "|"
+ + UserHandle.getUserId(((UidBatteryConsumer) consumer).getUid()) + "|"
+ + ((UidBatteryConsumer) consumer).getUid();
+ } else {
+ return "";
+ }
+ }
}
diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java b/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java
index 05679101f86a..91533913e35d 100644
--- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java
+++ b/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java
@@ -19,6 +19,8 @@ package com.android.frameworks.core.powerstatsviewer;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.BatteryStats;
+import android.os.BatteryStatsManager;
+import android.os.BatteryUsageStats;
import android.os.Bundle;
import android.os.UserHandle;
import android.os.UserManager;
@@ -48,7 +50,8 @@ 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";
- private static final String LOADER_ARG_POWER_CONSUMER_ID = "powerConsumerId";
+ 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;
@@ -63,6 +66,8 @@ public class PowerStatsViewerActivity extends ComponentActivity {
private View mEmptyView;
private ActivityResultLauncher<Void> mStartAppPicker = registerForActivityResult(
PowerConsumerPickerActivity.CONTRACT, this::onApplicationSelected);
+ private BatteryStatsHelper mBatteryStatsHelper;
+ private BatteryUsageStats mBatteryUsageStats;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -130,19 +135,19 @@ public class PowerStatsViewerActivity extends ComponentActivity {
}
private void loadPowerStats() {
- Bundle args = new Bundle();
- args.putString(LOADER_ARG_POWER_CONSUMER_ID, mPowerConsumerId);
- LoaderManager.getInstance(this).restartLoader(0, args, new PowerStatsDataLoaderCallbacks());
+ LoaderManager loaderManager = LoaderManager.getInstance(this);
+ loaderManager.restartLoader(LOADER_BATTERY_STATS_HELPER, null,
+ new BatteryStatsHelperLoaderCallbacks());
+ loaderManager.restartLoader(LOADER_BATTERY_USAGE_STATS, null,
+ new BatteryUsageStatsLoaderCallbacks());
}
- private static class PowerStatsDataLoader extends AsyncLoaderCompat<PowerStatsData> {
- private final String mPowerConsumerId;
+ private static class BatteryStatsHelperLoader extends AsyncLoaderCompat<BatteryStatsHelper> {
private final BatteryStatsHelper mBatteryStatsHelper;
private final UserManager mUserManager;
- PowerStatsDataLoader(Context context, String powerConsumerId) {
+ BatteryStatsHelperLoader(Context context) {
super(context);
- mPowerConsumerId = powerConsumerId;
mUserManager = context.getSystemService(UserManager.class);
mBatteryStatsHelper = new BatteryStatsHelper(context,
false /* collectBatteryBroadcast */);
@@ -151,68 +156,123 @@ public class PowerStatsViewerActivity extends ComponentActivity {
}
@Override
- public PowerStatsData loadInBackground() {
+ public BatteryStatsHelper loadInBackground() {
mBatteryStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED,
UserHandle.myUserId());
- return new PowerStatsData(getContext(), mBatteryStatsHelper, mPowerConsumerId);
+ return mBatteryStatsHelper;
}
@Override
- protected void onDiscardResult(PowerStatsData result) {
+ protected void onDiscardResult(BatteryStatsHelper result) {
}
}
- private class PowerStatsDataLoaderCallbacks implements LoaderCallbacks<PowerStatsData> {
+ private class BatteryStatsHelperLoaderCallbacks implements LoaderCallbacks<BatteryStatsHelper> {
@NonNull
@Override
- public Loader<PowerStatsData> onCreateLoader(int id, Bundle args) {
- return new PowerStatsDataLoader(PowerStatsViewerActivity.this,
- args.getString(LOADER_ARG_POWER_CONSUMER_ID));
+ public Loader<BatteryStatsHelper> onCreateLoader(int id, Bundle args) {
+ return new BatteryStatsHelperLoader(PowerStatsViewerActivity.this);
}
@Override
- public void onLoadFinished(@NonNull Loader<PowerStatsData> loader,
- PowerStatsData powerStatsData) {
+ public void onLoadFinished(@NonNull Loader<BatteryStatsHelper> loader,
+ BatteryStatsHelper batteryStatsHelper) {
+ onBatteryStatsHelperLoaded(batteryStatsHelper);
+ }
- PowerConsumerInfoHelper.PowerConsumerInfo
- powerConsumerInfo = powerStatsData.getPowerConsumerInfo();
- if (powerConsumerInfo == null) {
- mTitleView.setText("Power consumer not found");
- mPackagesView.setVisibility(View.GONE);
+ @Override
+ public void onLoaderReset(@NonNull Loader<BatteryStatsHelper> loader) {
+ }
+ }
+
+ private static class BatteryUsageStatsLoader extends AsyncLoaderCompat<BatteryUsageStats> {
+ private final BatteryStatsManager mBatteryStatsManager;
+
+ BatteryUsageStatsLoader(Context context) {
+ super(context);
+ mBatteryStatsManager = context.getSystemService(BatteryStatsManager.class);
+ }
+
+ @Override
+ public BatteryUsageStats loadInBackground() {
+ return mBatteryStatsManager.getBatteryUsageStats();
+ }
+
+ @Override
+ protected void onDiscardResult(BatteryUsageStats result) {
+ }
+ }
+
+ private class BatteryUsageStatsLoaderCallbacks implements LoaderCallbacks<BatteryUsageStats> {
+ @NonNull
+ @Override
+ public Loader<BatteryUsageStats> onCreateLoader(int id, Bundle args) {
+ return new BatteryUsageStatsLoader(PowerStatsViewerActivity.this);
+ }
+
+ @Override
+ public void onLoadFinished(@NonNull Loader<BatteryUsageStats> loader,
+ BatteryUsageStats batteryUsageStats) {
+ onBatteryUsageStatsLoaded(batteryUsageStats);
+ }
+
+ @Override
+ public void onLoaderReset(@NonNull Loader<BatteryUsageStats> loader) {
+ }
+ }
+
+ public void onBatteryStatsHelperLoaded(BatteryStatsHelper batteryStatsHelper) {
+ mBatteryStatsHelper = batteryStatsHelper;
+ onPowerStatsDataLoaded();
+ }
+
+ private void onBatteryUsageStatsLoaded(BatteryUsageStats batteryUsageStats) {
+ mBatteryUsageStats = batteryUsageStats;
+ onPowerStatsDataLoaded();
+ }
+
+ public void onPowerStatsDataLoaded() {
+ if (mBatteryStatsHelper == null || mBatteryUsageStats == null) {
+ return;
+ }
+
+ PowerStatsData powerStatsData = new PowerStatsData(this, mBatteryStatsHelper,
+ mBatteryUsageStats, mPowerConsumerId);
+
+ PowerConsumerInfoHelper.PowerConsumerInfo
+ powerConsumerInfo = powerStatsData.getPowerConsumerInfo();
+ if (powerConsumerInfo == null) {
+ mTitleView.setText("Power consumer not found");
+ mPackagesView.setVisibility(View.GONE);
+ } else {
+ mTitleView.setText(powerConsumerInfo.label);
+ if (powerConsumerInfo.details != null) {
+ mDetailsView.setText(powerConsumerInfo.details);
+ mDetailsView.setVisibility(View.VISIBLE);
} else {
- mTitleView.setText(powerConsumerInfo.label);
- if (powerConsumerInfo.details != null) {
- mDetailsView.setText(powerConsumerInfo.details);
- mDetailsView.setVisibility(View.VISIBLE);
- } else {
- mDetailsView.setVisibility(View.GONE);
- }
- mIconView.setImageDrawable(
- powerConsumerInfo.iconInfo.loadIcon(getPackageManager()));
-
- if (powerConsumerInfo.packages != null) {
- mPackagesView.setText(powerConsumerInfo.packages);
- mPackagesView.setVisibility(View.VISIBLE);
- } else {
- mPackagesView.setVisibility(View.GONE);
- }
+ mDetailsView.setVisibility(View.GONE);
}
+ mIconView.setImageDrawable(
+ powerConsumerInfo.iconInfo.loadIcon(getPackageManager()));
- mPowerStatsDataAdapter.setEntries(powerStatsData.getEntries());
- if (powerStatsData.getEntries().isEmpty()) {
- mEmptyView.setVisibility(View.VISIBLE);
- mPowerStatsDataView.setVisibility(View.GONE);
+ if (powerConsumerInfo.packages != null) {
+ mPackagesView.setText(powerConsumerInfo.packages);
+ mPackagesView.setVisibility(View.VISIBLE);
} else {
- mEmptyView.setVisibility(View.GONE);
- mPowerStatsDataView.setVisibility(View.VISIBLE);
+ mPackagesView.setVisibility(View.GONE);
}
-
- mLoadingView.setVisibility(View.GONE);
}
- @Override
- public void onLoaderReset(@NonNull Loader<PowerStatsData> loader) {
+ mPowerStatsDataAdapter.setEntries(powerStatsData.getEntries());
+ if (powerStatsData.getEntries().isEmpty()) {
+ mEmptyView.setVisibility(View.VISIBLE);
+ mPowerStatsDataView.setVisibility(View.GONE);
+ } else {
+ mEmptyView.setVisibility(View.GONE);
+ mPowerStatsDataView.setVisibility(View.VISIBLE);
}
+
+ mLoadingView.setVisibility(View.GONE);
}
private static class PowerStatsDataAdapter extends
diff --git a/data/etc/car/com.android.car.provision.xml b/data/etc/car/com.android.car.provision.xml
index 474cd543d593..7e77848ec337 100644
--- a/data/etc/car/com.android.car.provision.xml
+++ b/data/etc/car/com.android.car.provision.xml
@@ -18,6 +18,7 @@
<privapp-permissions package="com.android.car.provision">
<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.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 a5667b2f0a8a..75b3babbc3a2 100644
--- a/data/etc/services.core.protolog.json
+++ b/data/etc/services.core.protolog.json
@@ -1021,12 +1021,6 @@
"group": "WM_ERROR",
"at": "com\/android\/server\/wm\/WindowManagerService.java"
},
- "-903853754": {
- "message": "pauseBackStacks: stack=%s mResumedActivity=%s",
- "level": "DEBUG",
- "group": "WM_DEBUG_STATES",
- "at": "com\/android\/server\/wm\/TaskDisplayArea.java"
- },
"-883738232": {
"message": "Adding more than one toast window for UID at a time.",
"level": "WARN",
@@ -2125,6 +2119,12 @@
"group": "WM_DEBUG_APP_TRANSITIONS",
"at": "com\/android\/server\/wm\/AppTransition.java"
},
+ "349443311": {
+ "message": "pauseBackStacks: task=%s mResumedActivity=%s",
+ "level": "DEBUG",
+ "group": "WM_DEBUG_STATES",
+ "at": "com\/android\/server\/wm\/TaskDisplayArea.java"
+ },
"355720268": {
"message": "stopFreezingDisplayLocked: Unfreezing now",
"level": "DEBUG",
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/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
index 59a765d49a14..7440f19a6e7c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/TaskView.java
@@ -87,16 +87,12 @@ public class TaskView extends SurfaceView implements SurfaceHolder.Callback,
super(context, null, 0, 0, true /* disableBackgroundLayer */);
mTaskOrganizer = organizer;
+ mExecutor = organizer.getExecutor();
setUseAlpha();
getHolder().addCallback(this);
mGuard.open("release");
}
- // TODO: Use TaskOrganizer executor when part of wmshell proper
- public void setExecutor(Executor executor) {
- mExecutor = executor;
- }
-
/**
* Only one listener may be set on the view, throws an exception otherwise.
*/
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
index 318a0bd42940..4bf01f7cffac 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleExpandedView.java
@@ -59,7 +59,6 @@ import com.android.internal.policy.ScreenDecorationsUtils;
import com.android.wm.shell.R;
import com.android.wm.shell.TaskView;
import com.android.wm.shell.common.AlphaOptimizedButton;
-import com.android.wm.shell.common.HandlerExecutor;
import com.android.wm.shell.common.TriangleShape;
import java.io.FileDescriptor;
@@ -304,11 +303,6 @@ public class BubbleExpandedView extends LinearLayout {
setLayoutDirection(LAYOUT_DIRECTION_LOCALE);
}
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- mTaskView.setExecutor(new HandlerExecutor(getHandler()));
- }
/**
* Initialize {@link BubbleController} and {@link BubbleStackView} here, this method must need
* to be called after view inflate.
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
index 50d9fe8629ac..e97fe0a9111c 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/DividerView.java
@@ -112,7 +112,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
}
if (mMoving) {
final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos;
- mSplitLayout.updateDividePosition(position);
+ mSplitLayout.updateDivideBounds(position);
}
break;
case MotionEvent.ACTION_UP:
@@ -131,7 +131,7 @@ public class DividerView extends FrameLayout implements View.OnTouchListener {
final int position = mSplitLayout.getDividePosition() + touchPos - mStartPos;
final DividerSnapAlgorithm.SnapTarget snapTarget =
mSplitLayout.findSnapTarget(position, velocity);
- mSplitLayout.setSnapTarget(snapTarget);
+ mSplitLayout.snapToTarget(position, snapTarget);
break;
}
return true;
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
index e11037f55cfa..4c70b5d32108 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/common/split/SplitLayout.java
@@ -22,6 +22,9 @@ import static android.view.WindowManager.DOCKED_TOP;
import static com.android.internal.policy.DividerSnapAlgorithm.SnapTarget.FLAG_DISMISS_END;
import static com.android.internal.policy.DividerSnapAlgorithm.SnapTarget.FLAG_DISMISS_START;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -31,6 +34,7 @@ import android.view.SurfaceControl;
import androidx.annotation.Nullable;
import com.android.internal.policy.DividerSnapAlgorithm;
+import com.android.wm.shell.animation.Interpolators;
/**
* Records and handles layout of splits. Helps to calculate proper bounds when configuration or
@@ -145,17 +149,23 @@ public class SplitLayout {
* Updates bounds with the passing position. Usually used to update recording bounds while
* performing animation or dragging divider bar to resize the splits.
*/
- public void updateDividePosition(int position) {
+ void updateDivideBounds(int position) {
updateBounds(position);
mLayoutChangeListener.onBoundsChanging(this);
}
+ void setDividePosition(int position) {
+ mDividePosition = position;
+ updateBounds(mDividePosition);
+ mLayoutChangeListener.onBoundsChanged(this);
+ }
+
/**
* Sets new divide position and updates bounds correspondingly. Notifies listener if the new
* target indicates dismissing split.
*/
- public void setSnapTarget(DividerSnapAlgorithm.SnapTarget snapTarget) {
- switch(snapTarget.flag) {
+ public void snapToTarget(int currentPosition, DividerSnapAlgorithm.SnapTarget snapTarget) {
+ switch (snapTarget.flag) {
case FLAG_DISMISS_START:
mLayoutChangeListener.onSnappedToDismiss(false /* snappedToEnd */);
break;
@@ -163,9 +173,7 @@ public class SplitLayout {
mLayoutChangeListener.onSnappedToDismiss(true /* snappedToEnd */);
break;
default:
- mDividePosition = snapTarget.position;
- updateBounds(mDividePosition);
- mLayoutChangeListener.onBoundsChanged(this);
+ flingDividePosition(currentPosition, snapTarget.position);
break;
}
}
@@ -189,6 +197,27 @@ public class SplitLayout {
isLandscape ? DOCKED_LEFT : DOCKED_TOP /* dockSide */);
}
+ private void flingDividePosition(int from, int to) {
+ ValueAnimator animator = ValueAnimator
+ .ofInt(from, to)
+ .setDuration(250);
+ animator.setInterpolator(Interpolators.FAST_OUT_SLOW_IN);
+ animator.addUpdateListener(
+ animation -> updateDivideBounds((int) animation.getAnimatedValue()));
+ animator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ setDividePosition(to);
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animation) {
+ setDividePosition(to);
+ }
+ });
+ animator.start();
+ }
+
private static boolean isLandscape(Rect bounds) {
return bounds.width() > bounds.height();
}
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/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
index 34f772faf9a9..11bf4ff2fd35 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TaskViewTest.java
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.app.ActivityManager;
import android.app.ActivityOptions;
@@ -96,8 +97,8 @@ public class TaskViewTest extends ShellTestCase {
return null;
}).when(mExecutor).execute(any());
+ when(mOrganizer.getExecutor()).thenReturn(mExecutor);
mTaskView = new TaskView(mContext, mOrganizer);
- mTaskView.setExecutor(mExecutor);
mTaskView.setListener(mViewListener);
}
@@ -111,7 +112,6 @@ public class TaskViewTest extends ShellTestCase {
@Test
public void testSetPendingListener_throwsException() {
TaskView taskView = new TaskView(mContext, mOrganizer);
- mTaskView.setExecutor(mExecutor);
taskView.setListener(mViewListener);
try {
taskView.setListener(mViewListener);
diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
index d87f4c60fad4..9fdd59bee176 100644
--- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
+++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/common/split/SplitLayoutTests.java
@@ -69,24 +69,27 @@ public class SplitLayoutTests extends ShellTestCase {
}
@Test
- public void testUpdateDividePosition() {
- mSplitLayout.updateDividePosition(anyInt());
+ public void testUpdateDivideBounds() {
+ mSplitLayout.updateDivideBounds(anyInt());
verify(mLayoutChangeListener).onBoundsChanging(any(SplitLayout.class));
}
@Test
- public void testSetSnapTarget() {
- DividerSnapAlgorithm.SnapTarget snapTarget = getSnapTarget(0,
+ @UiThreadTest
+ public void testSnapToTarget() {
+ DividerSnapAlgorithm.SnapTarget snapTarget = getSnapTarget(0 /* position */,
DividerSnapAlgorithm.SnapTarget.FLAG_NONE);
- mSplitLayout.setSnapTarget(snapTarget);
- verify(mLayoutChangeListener).onBoundsChanged(any(SplitLayout.class));
+ mSplitLayout.snapToTarget(0 /* currentPosition */, snapTarget);
+ verify(mLayoutChangeListener).onBoundsChanging(any(SplitLayout.class));
// verify it callbacks properly when the snap target indicates dismissing split.
- snapTarget = getSnapTarget(0, DividerSnapAlgorithm.SnapTarget.FLAG_DISMISS_START);
- mSplitLayout.setSnapTarget(snapTarget);
+ snapTarget = getSnapTarget(0 /* position */,
+ DividerSnapAlgorithm.SnapTarget.FLAG_DISMISS_START);
+ mSplitLayout.snapToTarget(0 /* currentPosition */, snapTarget);
verify(mLayoutChangeListener).onSnappedToDismiss(eq(false));
- snapTarget = getSnapTarget(0, DividerSnapAlgorithm.SnapTarget.FLAG_DISMISS_END);
- mSplitLayout.setSnapTarget(snapTarget);
+ snapTarget = getSnapTarget(0 /* position */,
+ DividerSnapAlgorithm.SnapTarget.FLAG_DISMISS_END);
+ mSplitLayout.snapToTarget(0 /* currentPosition */, snapTarget);
verify(mLayoutChangeListener).onSnappedToDismiss(eq(true));
}
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/AudioManager.java b/media/java/android/media/AudioManager.java
index c67d90a5ea0f..3bd68d893521 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -2319,7 +2319,55 @@ public class AudioManager {
if (attributes == null) {
throw new NullPointerException("Illegal null AudioAttributes");
}
- return AudioSystem.isOffloadSupported(format, attributes);
+ return AudioSystem.getOffloadSupport(format, attributes) != PLAYBACK_OFFLOAD_NOT_SUPPORTED;
+ }
+
+ /** Return value for {@link #getPlaybackOffloadSupport(AudioFormat, AudioAttributes)}:
+ offload playback not supported */
+ public static final int PLAYBACK_OFFLOAD_NOT_SUPPORTED = AudioSystem.OFFLOAD_NOT_SUPPORTED;
+ /** Return value for {@link #getPlaybackOffloadSupport(AudioFormat, AudioAttributes)}:
+ offload playback supported */
+ public static final int PLAYBACK_OFFLOAD_SUPPORTED = AudioSystem.OFFLOAD_SUPPORTED;
+ /** Return value for {@link #getPlaybackOffloadSupport(AudioFormat, AudioAttributes)}:
+ offload playback supported with gapless transitions */
+ public static final int PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED =
+ AudioSystem.OFFLOAD_GAPLESS_SUPPORTED;
+
+ /** @hide */
+ @IntDef(flag = false, prefix = "PLAYBACK_OFFLOAD_", value = {
+ PLAYBACK_OFFLOAD_NOT_SUPPORTED,
+ PLAYBACK_OFFLOAD_SUPPORTED,
+ PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED }
+ )
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface AudioOffloadMode {}
+
+ /**
+ * Returns whether offloaded playback of an audio format is supported on the device or not and
+ * when supported whether gapless transitions are possible or not.
+ * <p>Offloaded playback is the feature where the decoding and playback of an audio stream
+ * is not competing with other software resources. In general, it is supported by dedicated
+ * hardware, such as audio DSPs.
+ * <p>Note that this query only provides information about the support of an audio format,
+ * it does not indicate whether the resources necessary for the offloaded playback are
+ * available at that instant.
+ * @param format the audio format (codec, sample rate, channels) being checked.
+ * @param attributes the {@link AudioAttributes} to be used for playback
+ * @return {@link #PLAYBACK_OFFLOAD_NOT_SUPPORTED} if offload playback if not supported,
+ * {@link #PLAYBACK_OFFLOAD_SUPPORTED} if offload playback is supported or
+ * {@link #PLAYBACK_OFFLOAD_GAPLESS_SUPPORTED} if gapless transitions are
+ * also supported.
+ */
+ @AudioOffloadMode
+ public static int getPlaybackOffloadSupport(@NonNull AudioFormat format,
+ @NonNull AudioAttributes attributes) {
+ if (format == null) {
+ throw new NullPointerException("Illegal null AudioFormat");
+ }
+ if (attributes == null) {
+ throw new NullPointerException("Illegal null AudioAttributes");
+ }
+ return AudioSystem.getOffloadSupport(format, attributes);
}
//====================================================================
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index bd27f6d068bc..8987a713e505 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -1639,13 +1639,22 @@ public class AudioSystem
*/
public static native int setAllowedCapturePolicy(int uid, int flags);
- static boolean isOffloadSupported(@NonNull AudioFormat format, @NonNull AudioAttributes attr) {
- return native_is_offload_supported(format.getEncoding(), format.getSampleRate(),
+ /**
+ * @hide
+ * Compressed audio offload decoding modes supported by audio HAL implementation.
+ * Keep in sync with system/media/include/media/audio.h.
+ */
+ public static final int OFFLOAD_NOT_SUPPORTED = 0;
+ public static final int OFFLOAD_SUPPORTED = 1;
+ public static final int OFFLOAD_GAPLESS_SUPPORTED = 2;
+
+ static int getOffloadSupport(@NonNull AudioFormat format, @NonNull AudioAttributes attr) {
+ return native_get_offload_support(format.getEncoding(), format.getSampleRate(),
format.getChannelMask(), format.getChannelIndexMask(),
attr.getVolumeControlStream());
}
- private static native boolean native_is_offload_supported(int encoding, int sampleRate,
+ private static native int native_get_offload_support(int encoding, int sampleRate,
int channelMask, int channelIndexMask, int streamType);
/** @hide */
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index e8c62067580f..e3b6fba18eb0 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -1256,7 +1256,8 @@ public class AudioTrack extends PlayerBase
throw new UnsupportedOperationException(
"Offload and low latency modes are incompatible");
}
- if (!AudioSystem.isOffloadSupported(mFormat, mAttributes)) {
+ if (AudioSystem.getOffloadSupport(mFormat, mAttributes)
+ == AudioSystem.OFFLOAD_NOT_SUPPORTED) {
throw new UnsupportedOperationException(
"Cannot create AudioTrack, offload format / attributes not supported");
}
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/accessibility/MagnificationModeSwitch.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
index 267debc7dc2d..edc3216e0b81 100644
--- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
+++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationModeSwitch.java
@@ -149,7 +149,7 @@ class MagnificationModeSwitch {
}
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
- mImageView.animate().cancel();
+ stopFadeOutAnimation();
mLastDown.set(event.getRawX(), event.getRawY());
mLastDrag.set(event.getRawX(), event.getRawY());
return true;
@@ -217,13 +217,18 @@ class MagnificationModeSwitch {
AccessibilityManager.FLAG_CONTENT_ICONS
| AccessibilityManager.FLAG_CONTENT_CONTROLS);
}
+ // Refresh the time slot of the fade-out task whenever this method is called.
+ stopFadeOutAnimation();
+ mImageView.postOnAnimationDelayed(mFadeOutAnimationTask, mUiTimeout);
+ }
+
+ private void stopFadeOutAnimation() {
+ mImageView.removeCallbacks(mFadeOutAnimationTask);
if (mIsFadeOutAnimating) {
mImageView.animate().cancel();
mImageView.setAlpha(1f);
+ mIsFadeOutAnimating = false;
}
- // Refresh the time slot of the fade-out task whenever this method is called.
- mImageView.removeCallbacks(mFadeOutAnimationTask);
- mImageView.postOnAnimationDelayed(mFadeOutAnimationTask, mUiTimeout);
}
void onConfigurationChanged(int configDiff) {
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/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index e7f84a55eb5f..34c78813d11a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -102,8 +102,7 @@ public class SmartReplyView extends ViewGroup {
mHeightUpperLimit = NotificationUtils.getFontScaledHeight(mContext,
R.dimen.smart_reply_button_max_height);
- mCurrentBackgroundColor = context.getColor(R.color.smart_reply_button_background);
- mDefaultBackgroundColor = mCurrentBackgroundColor;
+ mDefaultBackgroundColor = context.getColor(R.color.smart_reply_button_background);
mDefaultTextColor = mContext.getColor(R.color.smart_reply_button_text);
mDefaultTextColorDarkBg = mContext.getColor(R.color.smart_reply_button_text_dark_bg);
mDefaultStrokeColor = mContext.getColor(R.color.smart_reply_button_stroke);
@@ -142,8 +141,9 @@ public class SmartReplyView extends ViewGroup {
mSingleToDoubleLineButtonWidthIncrease =
2 * (doubleLineButtonPaddingHorizontal - singleLineButtonPaddingHorizontal);
-
mBreakIterator = BreakIterator.getLineInstance();
+
+ setBackgroundTintColor(mDefaultBackgroundColor);
reallocateCandidateButtonQueueForSqueezing();
}
@@ -182,7 +182,7 @@ public class SmartReplyView extends ViewGroup {
public void resetSmartSuggestions(View newSmartReplyContainer) {
mSmartReplyContainer = newSmartReplyContainer;
removeAllViews();
- mCurrentBackgroundColor = mDefaultBackgroundColor;
+ setBackgroundTintColor(mDefaultBackgroundColor);
}
/** Add buttons to the {@link SmartReplyView} */
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
index 0451d45a628b..96f3c156c978 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/MagnificationModeSwitchTest.java
@@ -33,6 +33,7 @@ import static junit.framework.Assert.assertNotNull;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -91,6 +92,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
private MagnificationModeSwitch mMagnificationModeSwitch;
private View.OnTouchListener mTouchListener;
private List<MotionEvent> mMotionEvents = new ArrayList<>();
+ private Runnable mFadeOutAnimation;
@Before
public void setUp() throws Exception {
@@ -119,6 +121,7 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
event.recycle();
}
mMotionEvents.clear();
+ mFadeOutAnimation = null;
}
@Test
@@ -164,15 +167,9 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
}
@Test
- public void showMagnificationButton_windowMode_verifyAnimationEndAction() {
- // Execute the runnable immediately to run the animation.
- doAnswer((invocation) -> {
- final Runnable action = invocation.getArgument(0);
- action.run();
- return null;
- }).when(mSpyImageView).postOnAnimationDelayed(any(Runnable.class), anyLong());
-
+ public void showMagnificationButton_windowModeAndFadingOut_verifyAnimationEndAction() {
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_WINDOW);
+ executeFadeOutAnimation();
// Verify the end action after fade-out.
final ArgumentCaptor<Runnable> endActionCaptor = ArgumentCaptor.forClass(Runnable.class);
@@ -207,9 +204,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
final long downTime = SystemClock.uptimeMillis();
mTouchListener.onTouch(mSpyImageView,
obtainMotionEvent(downTime, 0, ACTION_DOWN, 100, 100));
-
- verify(mViewPropertyAnimator).cancel();
-
resetAndStubMockImageViewAndAnimator();
mTouchListener.onTouch(mSpyImageView,
obtainMotionEvent(downTime, downTime, ACTION_UP, 100, 100));
@@ -218,6 +212,31 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
}
@Test
+ public void sendDownEvent_fullscreenMode_fadeOutAnimationIsNull() {
+ mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
+ resetAndStubMockImageViewAndAnimator();
+
+ final long downTime = SystemClock.uptimeMillis();
+ mTouchListener.onTouch(mSpyImageView,
+ obtainMotionEvent(downTime, 0, ACTION_DOWN, 100, 100));
+
+ assertNull(mFadeOutAnimation);
+ }
+
+ @Test
+ public void sendDownEvent_fullscreenModeAndFadingOut_cancelAnimation() {
+ mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
+ executeFadeOutAnimation();
+ resetAndStubMockImageViewAndAnimator();
+
+ final long downTime = SystemClock.uptimeMillis();
+ mTouchListener.onTouch(mSpyImageView,
+ obtainMotionEvent(downTime, 0, ACTION_DOWN, 100, 100));
+
+ verify(mViewPropertyAnimator).cancel();
+ }
+
+ @Test
public void performDragging_showMagnificationButton_updateViewLayout() {
mMagnificationModeSwitch.showButton(ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN);
resetAndStubMockImageViewAndAnimator();
@@ -229,7 +248,6 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
final long downTime = SystemClock.uptimeMillis();
mTouchListener.onTouch(mSpyImageView, obtainMotionEvent(
downTime, 0, ACTION_DOWN, 100, 100));
- verify(mViewPropertyAnimator).cancel();
mTouchListener.onTouch(mSpyImageView,
obtainMotionEvent(downTime, downTime, ACTION_MOVE, 100 + offset,
@@ -384,6 +402,16 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
return null;
}).when(mSpyImageView).post(any(Runnable.class));
doReturn(mViewPropertyAnimator).when(mSpyImageView).animate();
+ doAnswer((invocation) -> {
+ mFadeOutAnimation = invocation.getArgument(0);
+ return null;
+ }).when(mSpyImageView).postOnAnimationDelayed(any(Runnable.class), anyLong());
+ doAnswer((invocation) -> {
+ if (mFadeOutAnimation == invocation.getArgument(0)) {
+ mFadeOutAnimation = null;
+ }
+ return null;
+ }).when(mSpyImageView).removeCallbacks(any(Runnable.class));
}
private void resetAndStubMockAnimator() {
@@ -412,4 +440,10 @@ public class MagnificationModeSwitchTest extends SysuiTestCase {
mMotionEvents.add(event);
return event;
}
+
+ private void executeFadeOutAnimation() {
+ assertNotNull(mFadeOutAnimation);
+ mFadeOutAnimation.run();
+ mFadeOutAnimation = null;
+ }
}
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/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 51e2b12bcee4..010213453940 100644
--- a/services/core/java/com/android/server/SensorPrivacyService.java
+++ b/services/core/java/com/android/server/SensorPrivacyService.java
@@ -16,39 +16,68 @@
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;
+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;
+import android.os.Binder;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
+import android.os.ShellCommand;
+import android.service.SensorPrivacyIndividualEnabledSensorProto;
+import android.service.SensorPrivacyServiceDumpProto;
import android.util.ArrayMap;
import android.util.AtomicFile;
+import android.util.IndentingPrintWriter;
import android.util.Log;
+import android.util.SparseBooleanArray;
import android.util.TypedXmlPullParser;
import android.util.TypedXmlSerializer;
import android.util.Xml;
+import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.util.FastXmlSerializer;
+import com.android.internal.util.DumpUtils;
import com.android.internal.util.XmlUtils;
+import com.android.internal.util.dump.DualDumpOutputStream;
import com.android.internal.util.function.pooled.PooledLambda;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlSerializer;
import java.io.File;
+import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
+import java.io.PrintWriter;
import java.util.NoSuchElementException;
+import java.util.Objects;
/** @hide */
public final class SensorPrivacyService extends SystemService {
@@ -57,7 +86,15 @@ public final class SensorPrivacyService extends SystemService {
private static final String SENSOR_PRIVACY_XML_FILE = "sensor_privacy.xml";
private static final String XML_TAG_SENSOR_PRIVACY = "sensor-privacy";
+ private static final String XML_TAG_INDIVIDUAL_SENSOR_PRIVACY = "individual-sensor-privacy";
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;
@@ -71,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;
@@ -80,6 +118,7 @@ public final class SensorPrivacyService extends SystemService {
private final AtomicFile mAtomicFile;
@GuardedBy("mLock")
private boolean mEnabled;
+ private SparseBooleanArray mIndividualEnabled = new SparseBooleanArray();
SensorPrivacyServiceImpl(Context context) {
mContext = context;
@@ -88,8 +127,100 @@ public final class SensorPrivacyService extends SystemService {
SENSOR_PRIVACY_XML_FILE);
mAtomicFile = new AtomicFile(sensorPrivacyFile);
synchronized (mLock) {
- mEnabled = readPersistedSensorPrivacyEnabledLocked();
+ 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());
}
/**
@@ -101,24 +232,28 @@ public final class SensorPrivacyService extends SystemService {
enforceSensorPrivacyPermission();
synchronized (mLock) {
mEnabled = enable;
- FileOutputStream outputStream = null;
- try {
- outputStream = mAtomicFile.startWrite();
- TypedXmlSerializer serializer = Xml.resolveSerializer(outputStream);
- serializer.startDocument(null, true);
- serializer.startTag(null, XML_TAG_SENSOR_PRIVACY);
- serializer.attributeBoolean(null, XML_ATTRIBUTE_ENABLED, enable);
- serializer.endTag(null, XML_TAG_SENSOR_PRIVACY);
- serializer.endDocument();
- mAtomicFile.finishWrite(outputStream);
- } catch (IOException e) {
- Log.e(TAG, "Caught an exception persisting the sensor privacy state: ", e);
- mAtomicFile.failWrite(outputStream);
- }
+ persistSensorPrivacyStateLocked();
}
mHandler.onSensorPrivacyChanged(enable);
}
+ public void setIndividualSensorPrivacy(int sensor, boolean enable) {
+ 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();
+ }
+ }
+
/**
* Enforces the caller contains the necessary permission to change the state of sensor
* privacy.
@@ -143,30 +278,48 @@ public final class SensorPrivacyService extends SystemService {
}
}
+ @Override
+ public boolean isIndividualSensorPrivacyEnabled(int sensor) {
+ synchronized (mLock) {
+ return mIndividualEnabled.get(sensor, false);
+ }
+ }
+
/**
* Returns the state of sensor privacy from persistent storage.
*/
- private boolean readPersistedSensorPrivacyEnabledLocked() {
+ private void readPersistedSensorPrivacyStateLocked() {
// if the file does not exist then sensor privacy has not yet been enabled on
// the device.
if (!mAtomicFile.exists()) {
- return false;
+ return;
}
- boolean enabled;
try (FileInputStream inputStream = mAtomicFile.openRead()) {
TypedXmlPullParser parser = Xml.resolvePullParser(inputStream);
XmlUtils.beginDocument(parser, XML_TAG_SENSOR_PRIVACY);
parser.next();
- String tagName = parser.getName();
- enabled = parser.getAttributeBoolean(null, XML_ATTRIBUTE_ENABLED, false);
+ mEnabled = parser.getAttributeBoolean(null, XML_ATTRIBUTE_ENABLED, false);
+
+ XmlUtils.nextElement(parser);
+ while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
+ String tagName = parser.getName();
+ if (XML_TAG_INDIVIDUAL_SENSOR_PRIVACY.equals(tagName)) {
+ int sensor = XmlUtils.readIntAttribute(parser, XML_ATTRIBUTE_SENSOR);
+ boolean enabled = XmlUtils.readBooleanAttribute(parser,
+ XML_ATTRIBUTE_ENABLED);
+ mIndividualEnabled.put(sensor, enabled);
+ XmlUtils.skipCurrentTag(parser);
+ } else {
+ XmlUtils.nextElement(parser);
+ }
+ }
+
} catch (IOException | XmlPullParserException e) {
Log.e(TAG, "Caught an exception reading the state from storage: ", e);
// Delete the file to prevent the same error on subsequent calls and assume sensor
// privacy is not enabled.
mAtomicFile.delete();
- enabled = false;
}
- return enabled;
}
/**
@@ -174,20 +327,33 @@ public final class SensorPrivacyService extends SystemService {
*/
private void persistSensorPrivacyState() {
synchronized (mLock) {
- FileOutputStream outputStream = null;
- try {
- outputStream = mAtomicFile.startWrite();
- TypedXmlSerializer serializer = Xml.resolveSerializer(outputStream);
- serializer.startDocument(null, true);
- serializer.startTag(null, XML_TAG_SENSOR_PRIVACY);
- serializer.attributeBoolean(null, XML_ATTRIBUTE_ENABLED, mEnabled);
- serializer.endTag(null, XML_TAG_SENSOR_PRIVACY);
- serializer.endDocument();
- mAtomicFile.finishWrite(outputStream);
- } catch (IOException e) {
- Log.e(TAG, "Caught an exception persisting the sensor privacy state: ", e);
- mAtomicFile.failWrite(outputStream);
+ persistSensorPrivacyStateLocked();
+ }
+ }
+
+ private void persistSensorPrivacyStateLocked() {
+ FileOutputStream outputStream = null;
+ try {
+ outputStream = mAtomicFile.startWrite();
+ TypedXmlSerializer serializer = Xml.resolveSerializer(outputStream);
+ serializer.startDocument(null, true);
+ serializer.startTag(null, XML_TAG_SENSOR_PRIVACY);
+ serializer.attributeBoolean(null, XML_ATTRIBUTE_ENABLED, mEnabled);
+ int numIndividual = mIndividualEnabled.size();
+ for (int i = 0; i < numIndividual; i++) {
+ serializer.startTag(null, XML_TAG_INDIVIDUAL_SENSOR_PRIVACY);
+ int sensor = mIndividualEnabled.keyAt(i);
+ boolean enabled = mIndividualEnabled.valueAt(i);
+ serializer.attributeInt(null, XML_ATTRIBUTE_SENSOR, sensor);
+ serializer.attributeBoolean(null, XML_ATTRIBUTE_ENABLED, enabled);
+ serializer.endTag(null, XML_TAG_INDIVIDUAL_SENSOR_PRIVACY);
}
+ serializer.endTag(null, XML_TAG_SENSOR_PRIVACY);
+ serializer.endDocument();
+ mAtomicFile.finishWrite(outputStream);
+ } catch (IOException e) {
+ Log.e(TAG, "Caught an exception persisting the sensor privacy state: ", e);
+ mAtomicFile.failWrite(outputStream);
}
}
@@ -212,6 +378,170 @@ public final class SensorPrivacyService extends SystemService {
}
mHandler.removeListener(listener);
}
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ Objects.requireNonNull(fd);
+
+ if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
+
+ int opti = 0;
+ boolean dumpAsProto = false;
+ while (opti < args.length) {
+ String opt = args[opti];
+ if (opt == null || opt.length() <= 0 || opt.charAt(0) != '-') {
+ break;
+ }
+ opti++;
+ if ("--proto".equals(opt)) {
+ dumpAsProto = true;
+ } else {
+ pw.println("Unknown argument: " + opt + "; use -h for help");
+ }
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ if (dumpAsProto) {
+ dump(new DualDumpOutputStream(new ProtoOutputStream(fd)));
+ } else {
+ pw.println("SENSOR PRIVACY MANAGER STATE (dumpsys "
+ + Context.SENSOR_PRIVACY_SERVICE + ")");
+
+ dump(new DualDumpOutputStream(new IndentingPrintWriter(pw, " ")));
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * Dump state to {@link DualDumpOutputStream}.
+ *
+ * @param dumpStream The destination to dump to
+ */
+ private void dump(@NonNull DualDumpOutputStream dumpStream) {
+ synchronized (mLock) {
+ dumpStream.write("is_enabled", SensorPrivacyServiceDumpProto.IS_ENABLED, mEnabled);
+
+ int numIndividualEnabled = mIndividualEnabled.size();
+ for (int i = 0; i < numIndividualEnabled; i++) {
+ long token = dumpStream.start("individual_enabled_sensor",
+ SensorPrivacyServiceDumpProto.INDIVIDUAL_ENABLED_SENSOR);
+
+ dumpStream.write("sensor",
+ SensorPrivacyIndividualEnabledSensorProto.SENSOR,
+ mIndividualEnabled.keyAt(i));
+ dumpStream.write("is_enabled",
+ SensorPrivacyIndividualEnabledSensorProto.IS_ENABLED,
+ mIndividualEnabled.valueAt(i));
+
+ dumpStream.end(token);
+ }
+ }
+
+ dumpStream.flush();
+ }
+
+ /**
+ * Convert a string into a {@link SensorPrivacyManager.IndividualSensor id}.
+ *
+ * @param sensor The name to convert
+ *
+ * @return The id corresponding to the name
+ */
+ private @SensorPrivacyManager.IndividualSensor int sensorStrToId(@Nullable String sensor) {
+ if (sensor == null) {
+ return UNKNOWN;
+ }
+
+ switch (sensor) {
+ case "microphone":
+ return MICROPHONE;
+ case "camera":
+ return CAMERA;
+ default: {
+ return UNKNOWN;
+ }
+ }
+ }
+
+ @Override
+ public void onShellCommand(FileDescriptor in, FileDescriptor out,
+ FileDescriptor err, String[] args, ShellCallback callback,
+ ResultReceiver resultReceiver) {
+ (new ShellCommand() {
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+
+ final PrintWriter pw = getOutPrintWriter();
+ switch (cmd) {
+ case "enable" : {
+ int sensor = sensorStrToId(getNextArg());
+ if (sensor == UNKNOWN) {
+ pw.println("Invalid sensor");
+ return -1;
+ }
+
+ setIndividualSensorPrivacy(sensor, true);
+ }
+ break;
+ case "disable" : {
+ int sensor = sensorStrToId(getNextArg());
+ if (sensor == UNKNOWN) {
+ pw.println("Invalid sensor");
+ return -1;
+ }
+
+ setIndividualSensorPrivacy(sensor, false);
+ }
+ break;
+ case "reset": {
+ int sensor = sensorStrToId(getNextArg());
+ if (sensor == UNKNOWN) {
+ pw.println("Invalid sensor");
+ return -1;
+ }
+
+ enforceSensorPrivacyPermission();
+
+ synchronized (mLock) {
+ mIndividualEnabled.delete(sensor);
+ persistSensorPrivacyState();
+ }
+ }
+ break;
+ default:
+ return handleDefaultCommands(cmd);
+ }
+
+ return 0;
+ }
+
+ @Override
+ public void onHelp() {
+ final PrintWriter pw = getOutPrintWriter();
+
+ pw.println("Sensor privacy manager (" + Context.SENSOR_PRIVACY_SERVICE
+ + ") commands:");
+ pw.println(" help");
+ pw.println(" Print this help text.");
+ pw.println("");
+ pw.println(" enable SENSOR");
+ pw.println(" Enable privacy for a certain sensor.");
+ pw.println("");
+ pw.println(" disable SENSOR");
+ pw.println(" Disable privacy for a certain sensor.");
+ pw.println("");
+ pw.println(" reset SENSOR");
+ pw.println(" Reset privacy state for a certain sensor.");
+ pw.println("");
+ }
+ }).exec(this, in, out, err, args, callback, resultReceiver);
+ }
}
/**
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/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/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..708e050f8a8c 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -68,7 +68,6 @@ 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 +125,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 +262,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 +359,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);
@@ -1113,59 +1102,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,
@@ -2037,44 +1973,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 +2783,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 +3186,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 +3256,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 +5361,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/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java
index 520b833fa887..5daf1c4679be 100644
--- a/services/core/java/com/android/server/wm/ActivityRecord.java
+++ b/services/core/java/com/android/server/wm/ActivityRecord.java
@@ -2568,7 +2568,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
}
final Task rootTask = getRootTask();
- final boolean mayAdjustTop = (isState(RESUMED) || rootTask.mResumedActivity == null)
+ final boolean mayAdjustTop = (isState(RESUMED) || rootTask.getResumedActivity() == null)
&& rootTask.isFocusedStackOnDisplay()
// Do not adjust focus task because the task will be reused to launch new activity.
&& !task.isClearingToReuseTask();
@@ -2640,12 +2640,12 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// Tell window manager to prepare for this one to be removed.
setVisibility(false);
- if (rootTask.mPausingActivity == null) {
+ if (task.getPausingActivity() == null) {
ProtoLog.v(WM_DEBUG_STATES, "Finish needs to pause: %s", this);
if (DEBUG_USER_LEAVING) {
Slog.v(TAG_USER_LEAVING, "finish() => pause with userLeaving=false");
}
- rootTask.startPausingLocked(false /* userLeaving */, false /* uiSleeping */,
+ task.startPausingLocked(false /* userLeaving */, false /* uiSleeping */,
null /* resuming */, "finish");
}
@@ -2733,7 +2733,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
final boolean isCurrentVisible = mVisibleRequested || isState(PAUSED);
if (isCurrentVisible) {
final Task stack = getStack();
- final ActivityRecord activity = stack.mResumedActivity;
+ final ActivityRecord activity = stack.getResumedActivity();
boolean ensureVisibility = false;
if (activity != null && !activity.occludesParent()) {
// If the resume activity is not opaque, we need to make sure the visibilities of
@@ -2961,10 +2961,10 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
boolean safelyDestroy(String reason) {
if (isDestroyable()) {
if (DEBUG_SWITCH) {
- final Task stack = getRootTask();
+ final Task task = getTask();
Slog.v(TAG_SWITCH, "Safely destroying " + this + " in state " + getState()
- + " resumed=" + stack.mResumedActivity
- + " pausing=" + stack.mPausingActivity
+ + " resumed=" + task.getResumedActivity()
+ + " pausing=" + task.getPausingActivity()
+ " for reason " + reason);
}
return destroyImmediately(reason);
@@ -4842,7 +4842,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// If the app is capable of entering PIP, we should try pausing it now
// so it can PIP correctly.
if (deferHidingClient) {
- getRootTask().startPausingLocked(userLeaving, false /* uiSleeping */,
+ task.startPausingLocked(userLeaving, false /* uiSleeping */,
null /* resuming */, "makeInvisible");
break;
}
@@ -5073,25 +5073,24 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
ProtoLog.v(WM_DEBUG_STATES, "Activity paused: token=%s, timeout=%b", appToken,
timeout);
- final Task stack = getStack();
-
- if (stack != null) {
+ if (task != null) {
removePauseTimeout();
- if (stack.mPausingActivity == this) {
+ final ActivityRecord pausingActivity = task.getPausingActivity();
+ if (pausingActivity == this) {
ProtoLog.v(WM_DEBUG_STATES, "Moving to PAUSED: %s %s", this,
(timeout ? "(due to timeout)" : " (pause complete)"));
mAtmService.deferWindowLayout();
try {
- stack.completePauseLocked(true /* resumeNext */, null /* resumingActivity */);
+ task.completePauseLocked(true /* resumeNext */, null /* resumingActivity */);
} finally {
mAtmService.continueWindowLayout();
}
return;
} else {
EventLogTags.writeWmFailedToPause(mUserId, System.identityHashCode(this),
- shortComponentName, stack.mPausingActivity != null
- ? stack.mPausingActivity.shortComponentName : "(none)");
+ shortComponentName, pausingActivity != null
+ ? pausingActivity.shortComponentName : "(none)");
if (isState(PAUSING)) {
setState(PAUSED, "activityPausedLocked");
if (finishing) {
@@ -5189,10 +5188,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
void activityStopped(Bundle newIcicle, PersistableBundle newPersistentState,
CharSequence description) {
- final Task stack = getRootTask();
final boolean isStopping = mState == STOPPING;
if (!isStopping && mState != RESTARTING_PROCESS) {
- Slog.i(TAG, "Activity reported stop, but no longer stopping: " + this);
+ Slog.i(TAG, "Activity reported stop, but no longer stopping: " + this + " " + mState);
removeStopTimeout();
return;
}
@@ -5229,6 +5227,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
mRootWindowContainer.updatePreviousProcess(this);
}
}
+ mTaskSupervisor.checkReadyForSleepLocked(true /* allowDelay */);
}
}
@@ -5721,14 +5720,14 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// First find the real culprit... if this activity has stopped, then the key dispatching
// timeout should not be caused by this.
if (stopped) {
- final Task stack = mRootWindowContainer.getTopDisplayFocusedRootTask();
- if (stack == null) {
+ final Task rootTask = mRootWindowContainer.getTopDisplayFocusedRootTask();
+ if (rootTask == null) {
return this;
}
// Try to use the one which is closest to top.
- ActivityRecord r = stack.getResumedActivity();
+ ActivityRecord r = rootTask.getResumedActivity();
if (r == null) {
- r = stack.mPausingActivity;
+ r = rootTask.getPausingActivity();
}
if (r != null) {
return r;
@@ -5806,9 +5805,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A
// This would be redundant.
return false;
}
- final Task stack = getRootTask();
- if (isState(RESUMED) || stack == null || this == stack.mPausingActivity || !mHaveState
- || !stopped) {
+ if (isState(RESUMED) || getRootTask() == null || this == task.getPausingActivity()
+ || !mHaveState || !stopped) {
// We're not ready for this kind of thing.
return false;
}
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/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
index 9e7ddbaeb434..791d74afebdd 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java
@@ -1133,9 +1133,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
synchronized (mGlobalLock) {
// If this is coming from the currently resumed activity, it is
// effectively saying that app switches are allowed at this point.
- final Task stack = getTopDisplayFocusedRootTask();
- if (stack != null && stack.mResumedActivity != null
- && stack.mResumedActivity.info.applicationInfo.uid == Binder.getCallingUid()) {
+ final Task topFocusedRootTask = getTopDisplayFocusedRootTask();
+ if (topFocusedRootTask != null && topFocusedRootTask.getResumedActivity() != null
+ && topFocusedRootTask.getResumedActivity().info.applicationInfo.uid
+ == Binder.getCallingUid()) {
mAppSwitchesAllowedTime = 0;
}
}
diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
index 370ee265bc00..400633c849ab 100644
--- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
+++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
@@ -2066,7 +2066,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
void updateTopResumedActivityIfNeeded() {
final ActivityRecord prevTopActivity = mTopResumedActivity;
final Task topStack = mRootWindowContainer.getTopDisplayFocusedRootTask();
- if (topStack == null || topStack.mResumedActivity == prevTopActivity) {
+ if (topStack == null || topStack.getResumedActivity() == prevTopActivity) {
if (mService.isSleepingLocked()) {
// There won't be a next resumed activity. The top process should still be updated
// according to the current top focused activity.
@@ -2088,7 +2088,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
}
// Update the current top activity.
- mTopResumedActivity = topStack.mResumedActivity;
+ mTopResumedActivity = topStack.getResumedActivity();
scheduleTopResumedActivityStateIfNeeded();
mService.updateTopApp(mTopResumedActivity);
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 9ec9103821d0..d652393dbdc1 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -1888,13 +1888,13 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
// First, found out what is currently the foreground app, so that we don't blow away the
// previous app if this activity is being hosted by the process that is actually still the
// foreground.
- WindowProcessController fgApp = getItemFromRootTasks(stack -> {
- if (isTopDisplayFocusedRootTask(stack)) {
- final ActivityRecord resumedActivity = stack.getResumedActivity();
+ WindowProcessController fgApp = getItemFromRootTasks(rootTask -> {
+ if (isTopDisplayFocusedRootTask(rootTask)) {
+ final ActivityRecord resumedActivity = rootTask.getResumedActivity();
if (resumedActivity != null) {
return resumedActivity.app;
- } else if (stack.mPausingActivity != null) {
- return stack.mPausingActivity.app;
+ } else if (rootTask.getPausingActivity() != null) {
+ return rootTask.getPausingActivity().app;
}
}
return null;
@@ -2709,8 +2709,9 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
if (DEBUG_SWITCH) {
Slog.v(TAG_SWITCH, "Destroying " + r + " in state " + r.getState()
- + " resumed=" + r.getStack().mResumedActivity + " pausing="
- + r.getStack().mPausingActivity + " for reason " + mDestroyAllActivitiesReason);
+ + " resumed=" + r.getTask().getResumedActivity() + " pausing="
+ + r.getTask().getPausingActivity() + " for reason "
+ + mDestroyAllActivitiesReason);
}
r.destroyImmediately(mDestroyAllActivitiesReason);
@@ -3301,8 +3302,8 @@ class RootWindowContainer extends WindowContainer<DisplayContent>
boolean allPausedActivitiesComplete() {
boolean[] pausing = {true};
- final boolean hasActivityNotCompleted = forAllRootTasks(stack -> {
- final ActivityRecord r = stack.mPausingActivity;
+ final boolean hasActivityNotCompleted = forAllLeafTasks(task -> {
+ final ActivityRecord r = task.getPausingActivity();
if (r != null && !r.isState(PAUSED, STOPPED, STOPPING, FINISHING)) {
ProtoLog.d(WM_DEBUG_STATES, "allPausedActivitiesComplete: "
+ "r=%s state=%s", r, r.getState());
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 ca34e9da6b50..c4be680a1716 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -553,8 +553,11 @@ class Task extends WindowContainer<WindowContainer> {
/**
* When we are in the process of pausing an activity, before starting the
* next one, this variable holds the activity that is currently being paused.
+ *
+ * Only set at leaf tasks.
*/
- ActivityRecord mPausingActivity = null;
+ @Nullable
+ private ActivityRecord mPausingActivity = null;
/**
* This is the last activity that we put into the paused state. This is
@@ -570,8 +573,12 @@ class Task extends WindowContainer<WindowContainer> {
*/
ActivityRecord mLastNoHistoryActivity = null;
- /** Current activity that is resumed, or null if there is none. */
- ActivityRecord mResumedActivity = null;
+ /**
+ * Current activity that is resumed, or null if there is none.
+ * Only set at leaf tasks.
+ */
+ @Nullable
+ private ActivityRecord mResumedActivity = null;
/** Last activity that is used to compute the Task bounds. */
@Nullable
@@ -1111,14 +1118,6 @@ class Task extends WindowContainer<WindowContainer> {
return false;
}
- final boolean toTopOfStack = position == MAX_VALUE;
- if (toTopOfStack && toStack.getResumedActivity() != null
- && toStack.topRunningActivity() != null) {
- // Pause the resumed activity on the target stack while re-parenting task on top of it.
- toStack.startPausingLocked(false /* userLeaving */, false /* uiSleeping */,
- null /* resuming */, "reparent");
- }
-
final int toStackWindowingMode = toStack.getWindowingMode();
final ActivityRecord topActivity = getTopNonFinishingActivity();
@@ -1142,8 +1141,6 @@ class Task extends WindowContainer<WindowContainer> {
final ActivityRecord r = topRunningActivityLocked();
final boolean wasFocused = r != null && root.isTopDisplayFocusedRootTask(sourceStack)
&& (topRunningActivityLocked() == r);
- final boolean wasResumed = r != null && sourceStack.getResumedActivity() == r;
- final boolean wasPaused = r != null && sourceStack.mPausingActivity == r;
// In some cases the focused stack isn't the front stack. E.g. pinned stack.
// Whenever we are moving the top activity from the front stack we want to make sure to
@@ -1164,9 +1161,15 @@ class Task extends WindowContainer<WindowContainer> {
// If the task had focus before (or we're requested to move focus), move focus to the
// new stack by moving the stack to the front.
- if (r != null) {
- toStack.moveToFrontAndResumeStateIfNeeded(r, moveStackToFront, wasResumed,
- wasPaused, reason);
+ if (r != null && moveStackToFront) {
+ // Move the stack in which we are placing the activity to the front.
+ toStack.moveToFront(reason);
+
+ // If the original state is resumed, there is no state change to update focused app.
+ // So here makes sure the activity focus is set if it is the top.
+ if (r.isState(RESUMED) && r == mRootWindowContainer.getTopResumedActivity()) {
+ mAtmService.setResumedActivityUncheckLocked(r, reason);
+ }
}
if (!animate) {
mTaskSupervisor.mNoAnimActivities.add(topActivity);
@@ -1462,15 +1465,6 @@ class Task extends WindowContainer<WindowContainer> {
}
if (newParent != null) {
- final Task newParentTask = ((WindowContainer) newParent).asTask();
- if (newParentTask != null) {
- final ActivityRecord top = newParentTask.getTopNonFinishingActivity(
- false /* includeOverlays */);
- if (top != null && top.isState(RESUMED)) {
- newParentTask.setResumedActivity(top, "addedToTask");
- }
- }
-
// TODO: Ensure that this is actually necessary here
// Notify the voice session if required
if (voiceSession != null) {
@@ -1507,6 +1501,15 @@ class Task extends WindowContainer<WindowContainer> {
mLastTaskBoundsComputeActivity = null;
}
+ // mPausingActivity is set at leaf task
+ if (mPausingActivity != null && mPausingActivity == r) {
+ mPausingActivity = null;
+ }
+
+ if (mResumedActivity != null && mResumedActivity == r) {
+ setResumedActivity(null, "cleanUpActivityReferences");
+ }
+
final WindowContainer parent = getParent();
if (parent != null && parent.asTask() != null) {
parent.asTask().cleanUpActivityReferences(r);
@@ -1514,21 +1517,38 @@ class Task extends WindowContainer<WindowContainer> {
}
r.removeTimeouts();
mExitingActivities.remove(r);
-
- if (mResumedActivity != null && mResumedActivity == r) {
- setResumedActivity(null, "cleanUpActivityReferences");
- }
- if (mPausingActivity != null && mPausingActivity == r) {
- mPausingActivity = null;
- }
}
/** @return the currently resumed activity. */
ActivityRecord getResumedActivity() {
- return mResumedActivity;
+ if (isLeafTask()) {
+ return mResumedActivity;
+ }
+
+ final Task task = getTask(t -> t.mResumedActivity != null, true /* traverseTopToBottom */);
+ return task != null ? task.mResumedActivity : null;
+ }
+
+ @VisibleForTesting
+ void setPausingActivity(ActivityRecord pausing) {
+ mPausingActivity = pausing;
+ }
+
+ /**
+ * @return the currently pausing activity of this task or the topmost pausing activity of the
+ * child tasks
+ */
+ ActivityRecord getPausingActivity() {
+ if (isLeafTask()) {
+ return mPausingActivity;
+ }
+
+ final Task task = getTask(t -> t.mPausingActivity != null, true /* traverseTopToBottom */);
+ return task != null ? task.mPausingActivity : null;
}
void setResumedActivity(ActivityRecord r, String reason) {
+ warnForNonLeafTask("setResumedActivity");
if (mResumedActivity == r) {
return;
}
@@ -2168,17 +2188,7 @@ class Task extends WindowContainer<WindowContainer> {
* @param reason The reason for the change.
*/
void onActivityStateChanged(ActivityRecord record, ActivityState state, String reason) {
- final Task parentTask = getParent().asTask();
- if (parentTask != null) {
- parentTask.onActivityStateChanged(record, state, reason);
- // We still want to update the resumed activity if the parent task is created by
- // organizer in order to keep the information synced once got reparented out from the
- // organized task.
- if (!parentTask.mCreatedByOrganizer) {
- return;
- }
- }
-
+ warnForNonLeafTask("onActivityStateChanged");
if (record == mResumedActivity && state != RESUMED) {
setResumedActivity(null, reason + " - onActivityStateChanged");
}
@@ -3134,12 +3144,12 @@ class Task extends WindowContainer<WindowContainer> {
// and focused application if needed.
focusableTask.moveToFront(myReason);
// Top display focused stack is changed, update top resumed activity if needed.
- if (rootTask.mResumedActivity != null) {
+ if (rootTask.getResumedActivity() != null) {
mTaskSupervisor.updateTopResumedActivityIfNeeded();
// Set focused app directly because if the next focused activity is already resumed
// (e.g. the next top activity is on a different display), there won't have activity
// state change to update it.
- mAtmService.setResumedActivityUncheckLocked(rootTask.mResumedActivity, reason);
+ mAtmService.setResumedActivityUncheckLocked(rootTask.getResumedActivity(), reason);
}
return rootTask;
}
@@ -4115,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;
@@ -4132,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())
@@ -5445,6 +5458,12 @@ class Task extends WindowContainer<WindowContainer> {
}
void awakeFromSleepingLocked() {
+ if (!isLeafTask()) {
+ forAllLeafTasks((task) -> task.awakeFromSleepingLocked(),
+ true /* traverseTopToBottom */);
+ return;
+ }
+
if (mPausingActivity != null) {
Slog.d(TAG, "awakeFromSleepingLocked: previously pausing activity didn't pause");
mPausingActivity.activityPaused(true);
@@ -5469,8 +5488,17 @@ class Task extends WindowContainer<WindowContainer> {
* process of going to sleep (checkReadyForSleep will be called when that process finishes).
*/
boolean goToSleepIfPossible(boolean shuttingDown) {
- boolean shouldSleep = true;
+ if (!isLeafTask()) {
+ final int[] sleepInProgress = {0};
+ forAllLeafTasks((t) -> {
+ if (!t.goToSleepIfPossible(shuttingDown)) {
+ sleepInProgress[0]++;
+ }
+ }, true);
+ return sleepInProgress[0] == 0;
+ }
+ boolean shouldSleep = true;
if (mResumedActivity != null) {
// Still have something resumed; can't sleep until it is paused.
ProtoLog.v(WM_DEBUG_STATES, "Sleep needs to pause %s", mResumedActivity);
@@ -5530,6 +5558,16 @@ class Task extends WindowContainer<WindowContainer> {
*/
final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping,
ActivityRecord resuming, String reason) {
+ if (!isLeafTask()) {
+ final int[] pausing = {0};
+ forAllLeafTasks((t) -> {
+ if (t.startPausingLocked(userLeaving, uiSleeping, resuming, reason)) {
+ pausing[0]++;
+ }
+ }, true /* traverseTopToBottom */);
+ return pausing[0] > 0;
+ }
+
if (mPausingActivity != null) {
Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity
+ " state=" + mPausingActivity.getState());
@@ -5660,6 +5698,10 @@ class Task extends WindowContainer<WindowContainer> {
@VisibleForTesting
void completePauseLocked(boolean resumeNext, ActivityRecord resuming) {
+ // Complete the pausing process of a pausing activity, so it doesn't make sense to
+ // operate on non-leaf tasks.
+ warnForNonLeafTask("completePauseLocked");
+
ActivityRecord prev = mPausingActivity;
ProtoLog.v(WM_DEBUG_STATES, "Complete pause: %s", prev);
@@ -5919,24 +5961,34 @@ class Task extends WindowContainer<WindowContainer> {
return false;
}
- boolean result = false;
+ boolean someActivityResumed = false;
try {
// Protect against recursion.
mInResumeTopActivity = true;
- // TODO(b/172885410): Allow the top activities of all visible leaf tasks to be resumed
- if (mCreatedByOrganizer && !isLeafTask()
- && getConfiguration().windowConfiguration.getWindowingMode()
- == WINDOWING_MODE_FULLSCREEN) {
- for (int i = mChildren.size() - 1; i >= 0; i--) {
- final Task child = (Task) getChildAt(i);
- if (!child.shouldBeVisible(null /* starting */)) {
+ if (isLeafTask()) {
+ someActivityResumed = resumeTopActivityInnerLocked(prev, options);
+ } else {
+ int idx = mChildren.size() - 1;
+ while (idx >= 0) {
+ final Task child = (Task) getChildAt(idx--);
+ if (!child.isFocusableAndVisible()) {
break;
}
- result |= child.resumeTopActivityUncheckedLocked(prev, options);
+
+ // Only allow one activity to be resumed among sibling tasks in split-screen.
+ if (inSplitScreenWindowingMode() && someActivityResumed) {
+ break;
+ }
+
+ someActivityResumed |= child.resumeTopActivityUncheckedLocked(prev, options);
+ // Doing so in order to prevent IndexOOB since hierarchy might changes while
+ // resuming activities, for example dismissing split-screen while starting
+ // non-resizeable activity.
+ if (idx >= mChildren.size()) {
+ idx = mChildren.size() - 1;
+ }
}
- } else {
- result = resumeTopActivityInnerLocked(prev, options);
}
// When resuming the top activity, it may be necessary to pause the top activity (for
@@ -5954,7 +6006,7 @@ class Task extends WindowContainer<WindowContainer> {
mInResumeTopActivity = false;
}
- return result;
+ return someActivityResumed;
}
@GuardedBy("mService")
@@ -6068,7 +6120,7 @@ class Task extends WindowContainer<WindowContainer> {
// So, why aren't we using prev here??? See the param comment on the method. prev
// doesn't represent the last resumed activity. However, the last focus stack does if
// it isn't null.
- lastResumed = lastFocusedStack.mResumedActivity;
+ lastResumed = lastFocusedStack.getResumedActivity();
if (userLeaving && inMultiWindowMode() && lastFocusedStack.shouldBeVisible(next)) {
// The user isn't leaving if this stack is the multi-window mode and the last
// focused stack should still be visible.
@@ -6237,7 +6289,7 @@ class Task extends WindowContainer<WindowContainer> {
next.startLaunchTickingLocked();
ActivityRecord lastResumedActivity =
- lastFocusedStack == null ? null : lastFocusedStack.mResumedActivity;
+ lastFocusedStack == null ? null : lastFocusedStack.getResumedActivity();
final ActivityState lastState = next.getState();
mAtmService.updateCpuStats();
@@ -7091,6 +7143,7 @@ class Task extends WindowContainer<WindowContainer> {
* @return {@code true} if the process of the pausing activity is died.
*/
boolean handleAppDied(WindowProcessController app) {
+ warnForNonLeafTask("handleAppDied");
boolean isPausingDied = false;
if (mPausingActivity != null && mPausingActivity.app == app) {
ProtoLog.v(WM_DEBUG_STATES, "App died while pausing: %s",
@@ -7128,7 +7181,7 @@ class Task extends WindowContainer<WindowContainer> {
printed = true;
}
- printed |= printThisActivity(pw, mPausingActivity, dumpPackage, false,
+ printed |= printThisActivity(pw, getPausingActivity(), dumpPackage, false,
" mPausingActivity: ", null);
printed |= printThisActivity(pw, getResumedActivity(), dumpPackage, false,
" mResumedActivity: ", null);
@@ -7307,7 +7360,7 @@ class Task extends WindowContainer<WindowContainer> {
task.updateOverrideConfigurationForStack(this);
final ActivityRecord topRunningActivity = task.topRunningActivityLocked();
- final boolean wasResumed = topRunningActivity == task.getRootTask().mResumedActivity;
+ final boolean wasResumed = topRunningActivity == task.mResumedActivity;
boolean toTop = position >= getChildCount();
boolean includingParents = toTop || getDisplayArea().getNextFocusableRootTask(this,
@@ -7330,7 +7383,7 @@ class Task extends WindowContainer<WindowContainer> {
if (wasResumed) {
if (mResumedActivity != null) {
Log.wtf(TAG, "mResumedActivity was already set when moving mResumedActivity from"
- + " other stack to this stack mResumedActivity=" + mResumedActivity
+ + " other stack to this task mResumedActivity=" + mResumedActivity
+ " other mResumedActivity=" + topRunningActivity);
}
topRunningActivity.setState(RESUMED, "positionChildAt");
@@ -7356,34 +7409,6 @@ class Task extends WindowContainer<WindowContainer> {
taskDisplayArea.positionChildAt(POSITION_TOP, this, false /* includingParents */);
}
- /** NOTE: Should only be called from {@link Task#reparent}. */
- void moveToFrontAndResumeStateIfNeeded(ActivityRecord r, boolean moveToFront, boolean setResume,
- boolean setPause, String reason) {
- if (!moveToFront) {
- return;
- }
-
- final ActivityState origState = r.getState();
- // If the activity owns the last resumed activity, transfer that together,
- // so that we don't resume the same activity again in the new stack.
- // Apps may depend on onResume()/onPause() being called in pairs.
- if (setResume) {
- r.setState(RESUMED, "moveToFrontAndResumeStateIfNeeded");
- }
- // If the activity was previously pausing, then ensure we transfer that as well
- if (setPause) {
- mPausingActivity = r;
- r.schedulePauseTimeout();
- }
- // Move the stack in which we are placing the activity to the front.
- moveToFront(reason);
- // If the original state is resumed, there is no state change to update focused app.
- // So here makes sure the activity focus is set if it is the top.
- if (origState == RESUMED && r == mRootWindowContainer.getTopResumedActivity()) {
- mAtmService.setResumedActivityUncheckLocked(r, reason);
- }
- }
-
void dismissPip() {
if (!isActivityTypeStandardOrUndefined()) {
throw new IllegalArgumentException(
@@ -7533,6 +7558,15 @@ class Task extends WindowContainer<WindowContainer> {
}
/**
+ * Simply check and give warning logs if this is not operated on leaf task.
+ */
+ private void warnForNonLeafTask(String func) {
+ if (!isLeafTask()) {
+ Slog.w(TAG, func + " on non-leaf task " + this);
+ }
+ }
+
+ /**
* Sets the current picture-in-picture aspect ratio.
*/
void setPictureInPictureAspectRatio(float aspectRatio) {
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index 1c589b3d94f4..5522eeb6d900 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -1179,7 +1179,7 @@ final class TaskDisplayArea extends DisplayArea<Task> {
if (resumedActivity == null || resumedActivity.app == null) {
// If there is no registered resumed activity in the stack or it is not running -
// try to use previously resumed one.
- resumedActivity = focusedStack.mPausingActivity;
+ resumedActivity = focusedStack.getPausingActivity();
if (resumedActivity == null || resumedActivity.app == null) {
// If previously resumed activity doesn't work either - find the topmost running
// activity that can be focused.
@@ -1245,20 +1245,21 @@ final class TaskDisplayArea extends DisplayArea<Task> {
* @return {@code true} if any activity was paused as a result of this call.
*/
boolean pauseBackTasks(boolean userLeaving, ActivityRecord resuming) {
- boolean someActivityPaused = false;
- for (int stackNdx = mChildren.size() - 1; stackNdx >= 0; --stackNdx) {
- final Task stack = mChildren.get(stackNdx);
- final ActivityRecord resumedActivity = stack.getResumedActivity();
+ final int[] someActivityPaused = {0};
+ forAllLeafTasks((task) -> {
+ final ActivityRecord resumedActivity = task.getResumedActivity();
if (resumedActivity != null
- && (stack.getVisibility(resuming) != TASK_VISIBILITY_VISIBLE
- || !stack.isTopActivityFocusable())) {
- ProtoLog.d(WM_DEBUG_STATES, "pauseBackStacks: stack=%s "
- + "mResumedActivity=%s", stack, resumedActivity);
- someActivityPaused |= stack.startPausingLocked(userLeaving, false /* uiSleeping*/,
- resuming, "pauseBackStacks");
+ && (task.getVisibility(resuming) != TASK_VISIBILITY_VISIBLE
+ || !task.isTopActivityFocusable())) {
+ ProtoLog.d(WM_DEBUG_STATES, "pauseBackStacks: task=%s "
+ + "mResumedActivity=%s", task, resumedActivity);
+ if (task.startPausingLocked(userLeaving, false /* uiSleeping*/,
+ resuming, "pauseBackStacks")) {
+ someActivityPaused[0]++;
+ }
}
- }
- return someActivityPaused;
+ }, true /* traverseTopToBottom */);
+ return someActivityPaused[0] > 0;
}
/**
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index f3fa978f35dc..835e8036ddbd 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -819,9 +819,9 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
if (canUpdate) {
// Make sure the previous top activity in the process no longer be resumed.
if (mPreQTopResumedActivity != null && mPreQTopResumedActivity.isState(RESUMED)) {
- final Task stack = mPreQTopResumedActivity.getRootTask();
- if (stack != null) {
- stack.startPausingLocked(false /* userLeaving */, false /* uiSleeping */,
+ final Task task = mPreQTopResumedActivity.getTask();
+ if (task != null) {
+ task.startPausingLocked(false /* userLeaving */, false /* uiSleeping */,
activity, "top-resumed-changed");
}
}
@@ -1286,12 +1286,12 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio
hasVisibleActivities = true;
}
- final Task rootTask = r.getRootTask();
- if (rootTask != null) {
+ final Task task = r.getTask();
+ if (task != null) {
// There may be a pausing activity that hasn't shown any window and was requested
// to be hidden. But pausing is also a visible state, it should be regarded as
// visible, so the caller can know the next activity should be resumed.
- hasVisibleActivities |= rootTask.handleAppDied(this);
+ hasVisibleActivities |= task.handleAppDied(this);
}
r.handleAppDied();
}
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/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
index 2f34f708a562..78cebf3568c2 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java
@@ -1051,7 +1051,7 @@ public class ActivityRecordTests extends WindowTestsBase {
final ActivityRecord nextTop = nextStack.getTopNonFinishingActivity();
nextTop.setState(STOPPED, "test");
- task.mPausingActivity = currentTop;
+ task.setPausingActivity(currentTop);
currentTop.finishing = true;
currentTop.setState(PAUSED, "test");
currentTop.completeFinishing("completePauseLocked");
@@ -1211,7 +1211,7 @@ public class ActivityRecordTests extends WindowTestsBase {
focusedActivity.nowVisible = true;
focusedActivity.mVisibleRequested = true;
focusedActivity.setState(RESUMED, "test");
- stack.mResumedActivity = focusedActivity;
+ stack.setResumedActivity(focusedActivity, "test");
topActivity.completeFinishing("test");
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
index 8e3e668804ff..5504460f1036 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStackTests.java
@@ -1014,7 +1014,7 @@ public class ActivityStackTests extends WindowTestsBase {
final ActivityRecord secondActivity = new ActivityBuilder(mAtm).setTask(task).build();
firstActivity.setState(STOPPED, "testFinishDisabledPackageActivities");
secondActivity.setState(RESUMED, "testFinishDisabledPackageActivities");
- task.mResumedActivity = secondActivity;
+ task.setResumedActivity(secondActivity, "test");
// Note the activities have non-null ActivityRecord.app, so it won't remove directly.
mRootWindowContainer.mFinishDisabledPackageActivitiesHelper.process(
@@ -1140,8 +1140,8 @@ public class ActivityStackTests extends WindowTestsBase {
final Task task = new TaskBuilder(mSupervisor).build();
final ActivityRecord bottomActivity = new ActivityBuilder(mAtm).setTask(task).build();
doReturn(true).when(bottomActivity).attachedToProcess();
- task.mPausingActivity = null;
- task.mResumedActivity = bottomActivity;
+ task.setPausingActivity(null);
+ task.setResumedActivity(bottomActivity, "test");
final ActivityRecord topActivity = new ActivityBuilder(mAtm).setTask(task).build();
topActivity.info.flags |= FLAG_RESUME_WHILE_PAUSING;
diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
index 080f04efa9b4..d34e2c4923dc 100644
--- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java
@@ -247,7 +247,7 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
activity.finishing = true;
activity.mVisibleRequested = false;
activity.setVisible(false);
- activity.getRootTask().mPausingActivity = activity;
+ activity.getTask().setPausingActivity(activity);
homeActivity.setState(Task.ActivityState.PAUSED, "test");
// Even the visibility states are invisible, the next activity should be resumed because
@@ -262,8 +262,8 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
public void testUpdateSleep() {
doCallRealMethod().when(mWm.mRoot).hasAwakeDisplay();
mSupervisor.mGoingToSleepWakeLock = mock(PowerManager.WakeLock.class);
- final ActivityRecord homeActivity = new ActivityBuilder(mAtm)
- .setTask(mWm.mRoot.getDefaultTaskDisplayArea().getOrCreateRootHomeTask()).build();
+ final Task rootHomeTask = mWm.mRoot.getDefaultTaskDisplayArea().getOrCreateRootHomeTask();
+ final ActivityRecord homeActivity = new ActivityBuilder(mAtm).setTask(rootHomeTask).build();
final ActivityRecord topActivity = new ActivityBuilder(mAtm).setCreateTask(true).build();
topActivity.setState(Task.ActivityState.RESUMED, "test");
@@ -277,6 +277,9 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
// Sleep all displays.
mWm.mRoot.forAllDisplays(display -> doReturn(true).when(display).shouldSleep());
mAtm.updateSleepIfNeededLocked();
+ // Simulate holding sleep wake lock if it is acquired.
+ verify(mSupervisor.mGoingToSleepWakeLock).acquire();
+ doReturn(true).when(mSupervisor.mGoingToSleepWakeLock).isHeld();
assertEquals(Task.ActivityState.PAUSING, topActivity.getState());
assertTrue(mAtm.mInternal.isSleeping());
@@ -285,8 +288,17 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase {
// The top app should not change while sleeping.
assertEquals(topActivity.app, mAtm.mInternal.getTopApp());
+ // If all activities are stopped, the sleep wake lock must be released.
+ final Task topRootTask = topActivity.getRootTask();
+ doReturn(true).when(rootHomeTask).goToSleepIfPossible(anyBoolean());
+ doReturn(true).when(topRootTask).goToSleepIfPossible(anyBoolean());
+ topActivity.setState(Task.ActivityState.STOPPING, "test");
+ topActivity.activityStopped(null /* newIcicle */, null /* newPersistentState */,
+ null /* description */);
+ verify(mSupervisor.mGoingToSleepWakeLock).release();
+
// Move the current top to back, the top app should update to the next activity.
- topActivity.getRootTask().moveToBack("test", null /* self */);
+ topRootTask.moveToBack("test", null /* self */);
assertEquals(homeActivity.app, mAtm.mInternal.getTopApp());
// Wake all displays.
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 814f23049e3b..171aa76032db 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -91,10 +91,9 @@ public class RootWindowContainerTests extends WindowTestsBase {
@Test
public void testAllPausedActivitiesComplete() {
DisplayContent displayContent = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY);
- TaskDisplayArea taskDisplayArea = displayContent.getDefaultTaskDisplayArea();
- Task stack = taskDisplayArea.getRootTask(task -> true, false /* traverseTopToBottom */);
ActivityRecord activity = createActivityRecord(displayContent);
- stack.mPausingActivity = activity;
+ Task task = activity.getTask();
+ task.setPausingActivity(activity);
activity.setState(PAUSING, "test PAUSING");
assertThat(mWm.mRoot.allPausedActivitiesComplete()).isFalse();
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/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/data/DataCallResponse.java b/telephony/java/android/telephony/data/DataCallResponse.java
index 090c970c2b53..556f2d5bdbef 100644
--- a/telephony/java/android/telephony/data/DataCallResponse.java
+++ b/telephony/java/android/telephony/data/DataCallResponse.java
@@ -253,7 +253,9 @@ public final class DataCallResponse implements Parcelable {
public int getCause() { return mCause; }
/**
- * @return The suggested data retry time in milliseconds.
+ * @return The suggested data retry time in milliseconds. 0 when network does not
+ * suggest a retry time (Note this is different from the replacement
+ * {@link #getRetryDurationMillis()}).
*
* @deprecated Use {@link #getRetryDurationMillis()} instead.
*/
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));