diff options
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", ], @@ -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)); |