diff options
197 files changed, 3519 insertions, 6561 deletions
diff --git a/ApiDocs.bp b/ApiDocs.bp index 7ed7ec526686..3d6bdbf19264 100644 --- a/ApiDocs.bp +++ b/ApiDocs.bp @@ -67,7 +67,7 @@ stubs_defaults { ":opt-net-voip-srcs", ":art.module.public.api{.public.stubs.source}", ":conscrypt.module.public.api{.public.stubs.source}", - ":android_icu4j_public_api_files", + ":i18n.module.public.api{.public.stubs.source}", "test-mock/src/**/*.java", "test-runner/src/**/*.java", ], @@ -1,22 +1,29 @@ # This top-level list should remain narrowly defined as team leads; individual # teams are strongly encouraged to define narrower OWNERS files at deeper # levels within the source tree; see OWNERS.md for more details +akulian@google.com dsandler@android.com dsandler@google.com hackbod@android.com hackbod@google.com +jjaggi@google.com jsharkey@android.com jsharkey@google.com michaelwr@google.com nandana@google.com narayan@google.com ogunwale@google.com +roosa@google.com svetoslavganov@android.com svetoslavganov@google.com yamasani@google.com +# API changes are already covered by API-Review+1 (http://mdb/android-api-council) +# via https://android.git.corp.google.com/All-Projects/+/refs/meta/config/rules.pl. +per-file */api/*current.txt = * + # Support bulk translation updates -per-file */res*/values*/*.xml = byi@google.com +per-file */res*/values*/*.xml = byi@google.com, delphij@google.com per-file Android.bp = file:platform/build/soong:/OWNERS per-file Android.mk = file:platform/build/soong:/OWNERS diff --git a/OWNERS.md b/OWNERS.md index 6428c59fd793..601b5c641f21 100644 --- a/OWNERS.md +++ b/OWNERS.md @@ -1,3 +1,5 @@ +# Background + As general background, `OWNERS` files expedite code reviews by helping code authors quickly find relevant reviewers, and they also ensure that stakeholders are involved in code changes in their areas. @@ -27,8 +29,40 @@ main `services/core/` project: * `media/` * `wifi/` +# Design + Area maintainers are strongly encouraged to list people in a single authoritative `OWNERS` file in **exactly one** location. Then, other paths should reference that single authoritative `OWNERS` file using an include directive. This approach ensures that updates are applied consistently across the tree, reducing maintenance burden. + +# Examples + +The exact syntax of `OWNERS` files can be difficult to get correct, so here are +some common examples: + +``` +# Complete include of top-level owners from this repo +include /ZYGOTE_OWNERS +# Partial include of top-level owners from this repo +per-file ZygoteFile.java = file:/ZYGOTE_OWNERS +``` +``` +# Complete include of subdirectory owners from this repo +include /services/core/java/com/android/server/net/OWNERS +# Partial include of subdirectory owners from this repo +per-file NetworkFile.java = file:/services/core/java/com/android/server/net/OWNERS +``` +``` +# Complete include of top-level owners from another repo +include platform/libcore:/OWNERS +# Partial include of top-level owners from another repo +per-file LibcoreFile.java = file:platform/libcore:/OWNERS +``` +``` +# Complete include of subdirectory owners from another repo +include platform/frameworks/av:/camera/OWNERS +# Partial include of subdirectory owners from another repo +per-file CameraFile.java = file:platform/frameworks/av:/camera/OWNERS +``` diff --git a/StubLibraries.bp b/StubLibraries.bp index 380839e5c06b..12ee889387ec 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -48,7 +48,6 @@ stubs_defaults { ":opt-telephony-srcs", ":opt-net-voip-srcs", ":art.module.public.api{.public.stubs.source}", - ":android_icu4j_public_api_files", "**/package.html", ], sdk_version: "core_platform", @@ -251,6 +250,7 @@ java_library_static { "framework-statsd.stubs", "framework-tethering.stubs", "framework-wifi.stubs", + "i18n.module.public.api.stubs", "private-stub-annotations-jar", ], defaults: ["android_defaults_stubs_current"], @@ -270,6 +270,7 @@ java_library_static { "framework-statsd.stubs.system", "framework-tethering.stubs.system", "framework-wifi.stubs.system", + "i18n.module.public.api.stubs", "private-stub-annotations-jar", ], defaults: [ @@ -305,6 +306,7 @@ java_library_static { "framework-statsd.stubs.system", "framework-tethering.stubs.system", "framework-wifi.stubs.system", + "i18n.module.public.api.stubs", "private-stub-annotations-jar", ], defaults: [ diff --git a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java index 1d86595a4063..b7cd4f5f8bce 100644 --- a/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java +++ b/apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java @@ -18,6 +18,7 @@ package android.app.appsearch; import android.annotation.CallbackExecutor; import android.annotation.NonNull; +import android.app.appsearch.exceptions.AppSearchException; import android.os.Bundle; import android.os.ParcelableException; import android.os.RemoteException; @@ -166,9 +167,9 @@ public final class AppSearchSession { * of the returned {@link AppSearchBatchResult} are the URIs of the input * documents. The values are {@code null} if they were successfully indexed, * or a failed {@link AppSearchResult} otherwise. - * Or {@link BatchResultCallback#onSystemError} will be invoked with a - * {@link Throwable} if an unexpected internal error occurred in AppSearch - * service. + * Or {@link BatchResultCallback#onSystemError} will be invoked with an + * {@link AppSearchException} if an error occurred in AppSearch initialization + * or a cause {@link Throwable} if other error occurred in AppSearch service. */ public void putDocuments( @NonNull PutDocumentsRequest request, @@ -209,9 +210,9 @@ public final class AppSearchSession { * {@link AppSearchResult} otherwise. URIs that are not found will return a * failed {@link AppSearchResult} with a result code of * {@link AppSearchResult#RESULT_NOT_FOUND}. - * Or {@link BatchResultCallback#onSystemError} will be invoked with a - * {@link Throwable} if an unexpected internal error occurred in AppSearch - * service. + * Or {@link BatchResultCallback#onSystemError} will be invoked with an + * {@link AppSearchException} if an error occurred in AppSearch initialization + * or a cause {@link Throwable} if other error occurred in AppSearch service. */ public void getByUri( @NonNull GetByUriRequest request, @@ -337,9 +338,9 @@ public final class AppSearchSession { * are {@code null} on success, or a failed {@link AppSearchResult} otherwise. * URIs that are not found will return a failed {@link AppSearchResult} with a * result code of {@link AppSearchResult#RESULT_NOT_FOUND}. - * Or {@link BatchResultCallback#onSystemError} will be invoked with a - * {@link Throwable} if an unexpected internal error occurred in AppSearch - * service. + * Or {@link BatchResultCallback#onSystemError} will be invoked with an + * {@link AppSearchException} if an error occurred in AppSearch initialization + * or a cause {@link Throwable} if other error occurred in AppSearch service. */ public void removeByUri( @NonNull RemoveByUriRequest request, diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index 53d097e844c8..551347c5c202 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -77,7 +77,7 @@ public class AppSearchManagerService extends SystemService { for (int i = 0; i < schemaBundles.size(); i++) { schemas.add(new AppSearchSchema(schemaBundles.get(i))); } - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid); impl.setSchema(databaseName, schemas, schemasNotPlatformSurfaceable, forceOverride); invokeCallbackOnResult(callback, @@ -103,7 +103,7 @@ public class AppSearchManagerService extends SystemService { try { AppSearchBatchResult.Builder<String, Void> resultBuilder = new AppSearchBatchResult.Builder<>(); - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid); for (int i = 0; i < documentBundles.size(); i++) { GenericDocument document = new GenericDocument(documentBundles.get(i)); @@ -138,7 +138,7 @@ public class AppSearchManagerService extends SystemService { try { AppSearchBatchResult.Builder<String, Bundle> resultBuilder = new AppSearchBatchResult.Builder<>(); - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid); for (int i = 0; i < uris.size(); i++) { String uri = uris.get(i); @@ -172,7 +172,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = UserHandle.getUserId(callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid); SearchResultPage searchResultPage = impl.query( databaseName, @@ -198,7 +198,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = UserHandle.getUserId(callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); SearchResultPage searchResultPage = impl.globalQuery( queryExpression, new SearchSpec(searchSpecBundle)); @@ -221,7 +221,7 @@ public class AppSearchManagerService extends SystemService { // TODO(b/162450968) check nextPageToken is being advanced by the same uid as originally // opened it try { - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); SearchResultPage searchResultPage = impl.getNextPage(nextPageToken); invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(searchResultPage.getBundle())); @@ -238,7 +238,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = UserHandle.getUserId(callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); impl.invalidateNextPageToken(nextPageToken); } catch (Throwable t) { Log.d(TAG, "Unable to invalidate the query page token", t); @@ -257,10 +257,10 @@ public class AppSearchManagerService extends SystemService { int callingUid = Binder.getCallingUidOrThrow(); int callingUserId = UserHandle.getUserId(callingUid); final long callingIdentity = Binder.clearCallingIdentity(); + AppSearchBatchResult.Builder<String, Void> resultBuilder = + new AppSearchBatchResult.Builder<>(); try { - AppSearchBatchResult.Builder<String, Void> resultBuilder = - new AppSearchBatchResult.Builder<>(); - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid); for (int i = 0; i < uris.size(); i++) { String uri = uris.get(i); @@ -293,7 +293,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = UserHandle.getUserId(callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - AppSearchImpl impl = ImplInstanceManager.getInstance(callingUserId); + AppSearchImpl impl = ImplInstanceManager.getInstance(getContext(), callingUserId); databaseName = rewriteDatabaseNameWithUid(databaseName, callingUid); impl.removeByQuery(databaseName, queryExpression, new SearchSpec(searchSpecBundle)); @@ -312,7 +312,7 @@ public class AppSearchManagerService extends SystemService { int callingUserId = UserHandle.getUserId(callingUid); final long callingIdentity = Binder.clearCallingIdentity(); try { - ImplInstanceManager.getOrCreateInstance(getContext(), callingUserId); + ImplInstanceManager.getInstance(getContext(), callingUserId); invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null)); } catch (Throwable t) { invokeCallbackOnError(callback, t); @@ -374,14 +374,13 @@ public class AppSearchManagerService extends SystemService { } /** - * Invokes the {@link IAppSearchBatchResultCallback} with an unexpected internal throwable. + * Invokes the {@link IAppSearchBatchResultCallback} with an throwable. * * <p>The throwable is converted to {@link ParcelableException}. */ private void invokeCallbackOnError(IAppSearchBatchResultCallback callback, Throwable throwable) { try { - //TODO(b/175067650) verify ParcelableException could propagate throwable correctly. callback.onSystemError(new ParcelableException(throwable)); } catch (RemoteException e) { Log.d(TAG, "Unable to send error to the callback", e); diff --git a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java index d26269132c5a..2871eb622f11 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java @@ -41,7 +41,7 @@ public final class ImplInstanceManager { private ImplInstanceManager() {} /** - * Gets an instance of AppSearchImpl for the given user, or creates one if none exists. + * Gets an instance of AppSearchImpl for the given user. * * <p>If no AppSearchImpl instance exists for this user, Icing will be initialized and one will * be created. @@ -51,7 +51,7 @@ public final class ImplInstanceManager { * @return An initialized {@link AppSearchImpl} for this user */ @NonNull - public static AppSearchImpl getOrCreateInstance(@NonNull Context context, @UserIdInt int userId) + public static AppSearchImpl getInstance(@NonNull Context context, @UserIdInt int userId) throws AppSearchException { AppSearchImpl instance = sInstances.get(userId); if (instance == null) { @@ -66,28 +66,6 @@ public final class ImplInstanceManager { return instance; } - /** - * Gets an instance of AppSearchImpl for the given user. - * - * <p>This method should only be called by an initialized SearchSession, which has been already - * created the AppSearchImpl instance for the given user. - * - * @param userId The multi-user userId of the device user calling AppSearch - * @return An initialized {@link AppSearchImpl} for this user - */ - @NonNull - public static AppSearchImpl getInstance(@UserIdInt int userId) { - AppSearchImpl instance = sInstances.get(userId); - if (instance == null) { - // Impossible scenario, user cannot call an uninitialized SearchSession, - // getInstance should always find the instance for the given user and never try to - // create an instance for this user again. - throw new IllegalStateException( - "AppSearchImpl has never been created for this user: " + userId); - } - return instance; - } - private static AppSearchImpl createImpl(@NonNull Context context, @UserIdInt int userId) throws AppSearchException { File appSearchDir = getAppSearchDir(context, userId); diff --git a/api/Android.bp b/api/Android.bp index 5ee41b79b58c..9417030fc937 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -38,6 +38,7 @@ genrule { ":framework-statsd{.public.api.txt}", ":framework-tethering{.public.api.txt}", ":framework-wifi{.public.api.txt}", + ":i18n.module.public.api{.public.api.txt}", ":non-updatable-current.txt", ], out: ["current.txt"], @@ -50,7 +51,10 @@ genrule { dest: "current.txt", }, { - targets: ["sdk", "win_sdk"], + targets: [ + "sdk", + "win_sdk", + ], dir: "apistubs/android/public/api", dest: "android.txt", }, @@ -72,6 +76,7 @@ genrule { ":framework-statsd{.public.stubs.source}", ":framework-tethering{.public.stubs.source}", ":framework-wifi{.public.stubs.source}", + ":i18n.module.public.api{.public.stubs.source}", ], out: ["current.srcjar"], tools: ["merge_zips"], @@ -92,6 +97,7 @@ genrule { ":framework-statsd{.public.removed-api.txt}", ":framework-tethering{.public.removed-api.txt}", ":framework-wifi{.public.removed-api.txt}", + ":i18n.module.public.api{.public.removed-api.txt}", ":non-updatable-removed.txt", ], out: ["removed.txt"], @@ -130,7 +136,10 @@ genrule { dest: "system-current.txt", }, { - targets: ["sdk", "win_sdk"], + targets: [ + "sdk", + "win_sdk", + ], dir: "apistubs/android/system/api", dest: "android.txt", }, @@ -189,7 +198,10 @@ genrule { dest: "module-lib-current.txt", }, { - targets: ["sdk", "win_sdk"], + targets: [ + "sdk", + "win_sdk", + ], dir: "apistubs/android/module-lib/api", dest: "android.txt", }, diff --git a/core/api/current.txt b/core/api/current.txt index 9a34270442d0..e88811569049 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -87,6 +87,7 @@ package android { field public static final String GET_PACKAGE_SIZE = "android.permission.GET_PACKAGE_SIZE"; field @Deprecated public static final String GET_TASKS = "android.permission.GET_TASKS"; field public static final String GLOBAL_SEARCH = "android.permission.GLOBAL_SEARCH"; + field public static final String HIDE_OVERLAY_WINDOWS = "android.permission.HIDE_OVERLAY_WINDOWS"; field public static final String INSTALL_LOCATION_PROVIDER = "android.permission.INSTALL_LOCATION_PROVIDER"; field public static final String INSTALL_PACKAGES = "android.permission.INSTALL_PACKAGES"; field public static final String INSTALL_SHORTCUT = "com.android.launcher.permission.INSTALL_SHORTCUT"; @@ -140,6 +141,7 @@ package android { field public static final String REQUEST_DELETE_PACKAGES = "android.permission.REQUEST_DELETE_PACKAGES"; field public static final String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"; field public static final String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES"; + field public static final String REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE = "android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE"; field public static final String REQUEST_PASSWORD_COMPLEXITY = "android.permission.REQUEST_PASSWORD_COMPLEXITY"; field @Deprecated public static final String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES"; field public static final String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE"; @@ -6940,14 +6942,14 @@ package android.app.admin { method public long getPasswordExpirationTimeout(@Nullable android.content.ComponentName); method public int getPasswordHistoryLength(@Nullable android.content.ComponentName); method public int getPasswordMaximumLength(int); - method public int getPasswordMinimumLength(@Nullable android.content.ComponentName); - method public int getPasswordMinimumLetters(@Nullable android.content.ComponentName); - method public int getPasswordMinimumLowerCase(@Nullable android.content.ComponentName); - method public int getPasswordMinimumNonLetter(@Nullable android.content.ComponentName); - method public int getPasswordMinimumNumeric(@Nullable android.content.ComponentName); - method public int getPasswordMinimumSymbols(@Nullable android.content.ComponentName); - method public int getPasswordMinimumUpperCase(@Nullable android.content.ComponentName); - method public int getPasswordQuality(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordMinimumLength(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordMinimumLetters(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordMinimumLowerCase(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordMinimumNonLetter(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordMinimumNumeric(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordMinimumSymbols(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordMinimumUpperCase(@Nullable android.content.ComponentName); + method @Deprecated public int getPasswordQuality(@Nullable android.content.ComponentName); method @Nullable public android.app.admin.SystemUpdateInfo getPendingSystemUpdate(@NonNull android.content.ComponentName); method public int getPermissionGrantState(@Nullable android.content.ComponentName, @NonNull String, @NonNull String); method public int getPermissionPolicy(android.content.ComponentName); @@ -7071,14 +7073,14 @@ package android.app.admin { method @NonNull public String[] setPackagesSuspended(@NonNull android.content.ComponentName, @NonNull String[], boolean); method public void setPasswordExpirationTimeout(@NonNull android.content.ComponentName, long); method public void setPasswordHistoryLength(@NonNull android.content.ComponentName, int); - method public void setPasswordMinimumLength(@NonNull android.content.ComponentName, int); - method public void setPasswordMinimumLetters(@NonNull android.content.ComponentName, int); - method public void setPasswordMinimumLowerCase(@NonNull android.content.ComponentName, int); - method public void setPasswordMinimumNonLetter(@NonNull android.content.ComponentName, int); - method public void setPasswordMinimumNumeric(@NonNull android.content.ComponentName, int); - method public void setPasswordMinimumSymbols(@NonNull android.content.ComponentName, int); - method public void setPasswordMinimumUpperCase(@NonNull android.content.ComponentName, int); - method public void setPasswordQuality(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordMinimumLength(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordMinimumLetters(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordMinimumLowerCase(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordMinimumNonLetter(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordMinimumNumeric(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordMinimumSymbols(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordMinimumUpperCase(@NonNull android.content.ComponentName, int); + method @Deprecated public void setPasswordQuality(@NonNull android.content.ComponentName, int); method public boolean setPermissionGrantState(@NonNull android.content.ComponentName, @NonNull String, @NonNull String, int); method public void setPermissionPolicy(@NonNull android.content.ComponentName, int); method public boolean setPermittedAccessibilityServices(@NonNull android.content.ComponentName, java.util.List<java.lang.String>); @@ -9519,6 +9521,8 @@ package android.companion { method @NonNull public java.util.List<java.lang.String> getAssociations(); method public boolean hasNotificationAccess(android.content.ComponentName); method public void requestNotificationAccess(android.content.ComponentName); + method @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) public void startObservingDevicePresence(@NonNull String) throws android.companion.DeviceNotAssociatedException; + method @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) public void stopObservingDevicePresence(@NonNull String) throws android.companion.DeviceNotAssociatedException; field public static final String EXTRA_DEVICE = "android.companion.extra.DEVICE"; } @@ -9539,6 +9543,9 @@ package android.companion { public interface DeviceFilter<D extends android.os.Parcelable> extends android.os.Parcelable { } + public class DeviceNotAssociatedException extends java.lang.Exception { + } + public final class WifiDeviceFilter implements android.companion.DeviceFilter<android.net.wifi.ScanResult> { method public int describeContents(); method public void writeToParcel(@NonNull android.os.Parcel, int); @@ -18519,4812 +18526,6 @@ package android.hardware.usb { } -package android.icu.lang { - - public final class UCharacter implements android.icu.lang.UCharacterEnums.ECharacterCategory android.icu.lang.UCharacterEnums.ECharacterDirection { - method public static int charCount(int); - method public static int codePointAt(CharSequence, int); - method public static int codePointAt(char[], int); - method public static int codePointAt(char[], int, int); - method public static int codePointBefore(CharSequence, int); - method public static int codePointBefore(char[], int); - method public static int codePointBefore(char[], int, int); - method public static int codePointCount(CharSequence, int, int); - method public static int codePointCount(char[], int, int); - method public static int digit(int, int); - method public static int digit(int); - method public static int foldCase(int, boolean); - method public static String foldCase(String, boolean); - method public static int foldCase(int, int); - method public static String foldCase(String, int); - method public static char forDigit(int, int); - method public static android.icu.util.VersionInfo getAge(int); - method public static int getBidiPairedBracket(int); - method public static int getCharFromExtendedName(String); - method public static int getCharFromName(String); - method public static int getCharFromNameAlias(String); - method public static int getCodePoint(char, char); - method public static int getCodePoint(char); - method public static int getCombiningClass(int); - method public static int getDirection(int); - method public static byte getDirectionality(int); - method public static String getExtendedName(int); - method public static android.icu.util.ValueIterator getExtendedNameIterator(); - method public static int getHanNumericValue(int); - method public static int getIntPropertyMaxValue(int); - method public static int getIntPropertyMinValue(int); - method public static int getIntPropertyValue(int, int); - method public static int getMirror(int); - method public static String getName(int); - method public static String getName(String, String); - method public static String getNameAlias(int); - method public static android.icu.util.ValueIterator getNameIterator(); - method public static int getNumericValue(int); - method public static int getPropertyEnum(CharSequence); - method public static String getPropertyName(int, int); - method public static int getPropertyValueEnum(int, CharSequence); - method public static String getPropertyValueName(int, int, int); - method public static int getType(int); - method public static android.icu.util.RangeValueIterator getTypeIterator(); - method public static double getUnicodeNumericValue(int); - method public static android.icu.util.VersionInfo getUnicodeVersion(); - method public static boolean hasBinaryProperty(int, int); - method public static boolean isBMP(int); - method public static boolean isBaseForm(int); - method public static boolean isDefined(int); - method public static boolean isDigit(int); - method public static boolean isHighSurrogate(char); - method public static boolean isISOControl(int); - method public static boolean isIdentifierIgnorable(int); - method public static boolean isJavaIdentifierPart(int); - method public static boolean isJavaIdentifierStart(int); - method public static boolean isLegal(int); - method public static boolean isLegal(String); - method public static boolean isLetter(int); - method public static boolean isLetterOrDigit(int); - method public static boolean isLowSurrogate(char); - method public static boolean isLowerCase(int); - method public static boolean isMirrored(int); - method public static boolean isPrintable(int); - method public static boolean isSpaceChar(int); - method public static boolean isSupplementary(int); - method public static boolean isSupplementaryCodePoint(int); - method public static boolean isSurrogatePair(char, char); - method public static boolean isTitleCase(int); - method public static boolean isUAlphabetic(int); - method public static boolean isULowercase(int); - method public static boolean isUUppercase(int); - method public static boolean isUWhiteSpace(int); - method public static boolean isUnicodeIdentifierPart(int); - method public static boolean isUnicodeIdentifierStart(int); - method public static boolean isUpperCase(int); - method public static boolean isValidCodePoint(int); - method public static boolean isWhitespace(int); - method public static int offsetByCodePoints(CharSequence, int, int); - method public static int offsetByCodePoints(char[], int, int, int, int); - method public static int toChars(int, char[], int); - method public static char[] toChars(int); - method public static int toCodePoint(char, char); - method public static int toLowerCase(int); - method public static String toLowerCase(String); - method public static String toLowerCase(java.util.Locale, String); - method public static String toLowerCase(android.icu.util.ULocale, String); - method public static String toString(int); - method public static int toTitleCase(int); - method public static String toTitleCase(String, android.icu.text.BreakIterator); - method public static String toTitleCase(java.util.Locale, String, android.icu.text.BreakIterator); - method public static String toTitleCase(android.icu.util.ULocale, String, android.icu.text.BreakIterator); - method public static String toTitleCase(android.icu.util.ULocale, String, android.icu.text.BreakIterator, int); - method public static String toTitleCase(java.util.Locale, String, android.icu.text.BreakIterator, int); - method public static int toUpperCase(int); - method public static String toUpperCase(String); - method public static String toUpperCase(java.util.Locale, String); - method public static String toUpperCase(android.icu.util.ULocale, String); - field public static final int FOLD_CASE_DEFAULT = 0; // 0x0 - field public static final int FOLD_CASE_EXCLUDE_SPECIAL_I = 1; // 0x1 - field public static final int MAX_CODE_POINT = 1114111; // 0x10ffff - field public static final char MAX_HIGH_SURROGATE = 56319; // 0xdbff '\udbff' - field public static final char MAX_LOW_SURROGATE = 57343; // 0xdfff '\udfff' - field public static final int MAX_RADIX = 36; // 0x24 - field public static final char MAX_SURROGATE = 57343; // 0xdfff '\udfff' - field public static final int MAX_VALUE = 1114111; // 0x10ffff - field public static final int MIN_CODE_POINT = 0; // 0x0 - field public static final char MIN_HIGH_SURROGATE = 55296; // 0xd800 '\ud800' - field public static final char MIN_LOW_SURROGATE = 56320; // 0xdc00 '\udc00' - field public static final int MIN_RADIX = 2; // 0x2 - field public static final int MIN_SUPPLEMENTARY_CODE_POINT = 65536; // 0x10000 - field public static final char MIN_SURROGATE = 55296; // 0xd800 '\ud800' - field public static final int MIN_VALUE = 0; // 0x0 - field public static final double NO_NUMERIC_VALUE = -1.23456789E8; - field public static final int REPLACEMENT_CHAR = 65533; // 0xfffd - field public static final int SUPPLEMENTARY_MIN_VALUE = 65536; // 0x10000 - field public static final int TITLECASE_NO_BREAK_ADJUSTMENT = 512; // 0x200 - field public static final int TITLECASE_NO_LOWERCASE = 256; // 0x100 - } - - public static interface UCharacter.BidiPairedBracketType { - field public static final int CLOSE = 2; // 0x2 - field public static final int NONE = 0; // 0x0 - field public static final int OPEN = 1; // 0x1 - } - - public static interface UCharacter.DecompositionType { - field public static final int CANONICAL = 1; // 0x1 - field public static final int CIRCLE = 3; // 0x3 - field public static final int COMPAT = 2; // 0x2 - field public static final int FINAL = 4; // 0x4 - field public static final int FONT = 5; // 0x5 - field public static final int FRACTION = 6; // 0x6 - field public static final int INITIAL = 7; // 0x7 - field public static final int ISOLATED = 8; // 0x8 - field public static final int MEDIAL = 9; // 0x9 - field public static final int NARROW = 10; // 0xa - field public static final int NOBREAK = 11; // 0xb - field public static final int NONE = 0; // 0x0 - field public static final int SMALL = 12; // 0xc - field public static final int SQUARE = 13; // 0xd - field public static final int SUB = 14; // 0xe - field public static final int SUPER = 15; // 0xf - field public static final int VERTICAL = 16; // 0x10 - field public static final int WIDE = 17; // 0x11 - } - - public static interface UCharacter.EastAsianWidth { - field public static final int AMBIGUOUS = 1; // 0x1 - field public static final int FULLWIDTH = 3; // 0x3 - field public static final int HALFWIDTH = 2; // 0x2 - field public static final int NARROW = 4; // 0x4 - field public static final int NEUTRAL = 0; // 0x0 - field public static final int WIDE = 5; // 0x5 - } - - public static interface UCharacter.GraphemeClusterBreak { - field public static final int CONTROL = 1; // 0x1 - field public static final int CR = 2; // 0x2 - field public static final int EXTEND = 3; // 0x3 - field public static final int E_BASE = 13; // 0xd - field public static final int E_BASE_GAZ = 14; // 0xe - field public static final int E_MODIFIER = 15; // 0xf - field public static final int GLUE_AFTER_ZWJ = 16; // 0x10 - field public static final int L = 4; // 0x4 - field public static final int LF = 5; // 0x5 - field public static final int LV = 6; // 0x6 - field public static final int LVT = 7; // 0x7 - field public static final int OTHER = 0; // 0x0 - field public static final int PREPEND = 11; // 0xb - field public static final int REGIONAL_INDICATOR = 12; // 0xc - field public static final int SPACING_MARK = 10; // 0xa - field public static final int T = 8; // 0x8 - field public static final int V = 9; // 0x9 - field public static final int ZWJ = 17; // 0x11 - } - - public static interface UCharacter.HangulSyllableType { - field public static final int LEADING_JAMO = 1; // 0x1 - field public static final int LVT_SYLLABLE = 5; // 0x5 - field public static final int LV_SYLLABLE = 4; // 0x4 - field public static final int NOT_APPLICABLE = 0; // 0x0 - field public static final int TRAILING_JAMO = 3; // 0x3 - field public static final int VOWEL_JAMO = 2; // 0x2 - } - - public static interface UCharacter.IndicPositionalCategory { - field public static final int BOTTOM = 1; // 0x1 - field public static final int BOTTOM_AND_LEFT = 2; // 0x2 - field public static final int BOTTOM_AND_RIGHT = 3; // 0x3 - field public static final int LEFT = 4; // 0x4 - field public static final int LEFT_AND_RIGHT = 5; // 0x5 - field public static final int NA = 0; // 0x0 - field public static final int OVERSTRUCK = 6; // 0x6 - field public static final int RIGHT = 7; // 0x7 - field public static final int TOP = 8; // 0x8 - field public static final int TOP_AND_BOTTOM = 9; // 0x9 - field public static final int TOP_AND_BOTTOM_AND_LEFT = 15; // 0xf - field public static final int TOP_AND_BOTTOM_AND_RIGHT = 10; // 0xa - field public static final int TOP_AND_LEFT = 11; // 0xb - field public static final int TOP_AND_LEFT_AND_RIGHT = 12; // 0xc - field public static final int TOP_AND_RIGHT = 13; // 0xd - field public static final int VISUAL_ORDER_LEFT = 14; // 0xe - } - - public static interface UCharacter.IndicSyllabicCategory { - field public static final int AVAGRAHA = 1; // 0x1 - field public static final int BINDU = 2; // 0x2 - field public static final int BRAHMI_JOINING_NUMBER = 3; // 0x3 - field public static final int CANTILLATION_MARK = 4; // 0x4 - field public static final int CONSONANT = 5; // 0x5 - field public static final int CONSONANT_DEAD = 6; // 0x6 - field public static final int CONSONANT_FINAL = 7; // 0x7 - field public static final int CONSONANT_HEAD_LETTER = 8; // 0x8 - field public static final int CONSONANT_INITIAL_POSTFIXED = 9; // 0x9 - field public static final int CONSONANT_KILLER = 10; // 0xa - field public static final int CONSONANT_MEDIAL = 11; // 0xb - field public static final int CONSONANT_PLACEHOLDER = 12; // 0xc - field public static final int CONSONANT_PRECEDING_REPHA = 13; // 0xd - field public static final int CONSONANT_PREFIXED = 14; // 0xe - field public static final int CONSONANT_SUBJOINED = 15; // 0xf - field public static final int CONSONANT_SUCCEEDING_REPHA = 16; // 0x10 - field public static final int CONSONANT_WITH_STACKER = 17; // 0x11 - field public static final int GEMINATION_MARK = 18; // 0x12 - field public static final int INVISIBLE_STACKER = 19; // 0x13 - field public static final int JOINER = 20; // 0x14 - field public static final int MODIFYING_LETTER = 21; // 0x15 - field public static final int NON_JOINER = 22; // 0x16 - field public static final int NUKTA = 23; // 0x17 - field public static final int NUMBER = 24; // 0x18 - field public static final int NUMBER_JOINER = 25; // 0x19 - field public static final int OTHER = 0; // 0x0 - field public static final int PURE_KILLER = 26; // 0x1a - field public static final int REGISTER_SHIFTER = 27; // 0x1b - field public static final int SYLLABLE_MODIFIER = 28; // 0x1c - field public static final int TONE_LETTER = 29; // 0x1d - field public static final int TONE_MARK = 30; // 0x1e - field public static final int VIRAMA = 31; // 0x1f - field public static final int VISARGA = 32; // 0x20 - field public static final int VOWEL = 33; // 0x21 - field public static final int VOWEL_DEPENDENT = 34; // 0x22 - field public static final int VOWEL_INDEPENDENT = 35; // 0x23 - } - - public static interface UCharacter.JoiningGroup { - field public static final int AFRICAN_FEH = 86; // 0x56 - field public static final int AFRICAN_NOON = 87; // 0x57 - field public static final int AFRICAN_QAF = 88; // 0x58 - field public static final int AIN = 1; // 0x1 - field public static final int ALAPH = 2; // 0x2 - field public static final int ALEF = 3; // 0x3 - field public static final int BEH = 4; // 0x4 - field public static final int BETH = 5; // 0x5 - field public static final int BURUSHASKI_YEH_BARREE = 54; // 0x36 - field public static final int DAL = 6; // 0x6 - field public static final int DALATH_RISH = 7; // 0x7 - field public static final int E = 8; // 0x8 - field public static final int FARSI_YEH = 55; // 0x37 - field public static final int FE = 51; // 0x33 - field public static final int FEH = 9; // 0x9 - field public static final int FINAL_SEMKATH = 10; // 0xa - field public static final int GAF = 11; // 0xb - field public static final int GAMAL = 12; // 0xc - field public static final int HAH = 13; // 0xd - field public static final int HAMZA_ON_HEH_GOAL = 14; // 0xe - field public static final int HANIFI_ROHINGYA_KINNA_YA = 100; // 0x64 - field public static final int HANIFI_ROHINGYA_PA = 101; // 0x65 - field public static final int HE = 15; // 0xf - field public static final int HEH = 16; // 0x10 - field public static final int HEH_GOAL = 17; // 0x11 - field public static final int HETH = 18; // 0x12 - field public static final int KAF = 19; // 0x13 - field public static final int KAPH = 20; // 0x14 - field public static final int KHAPH = 52; // 0x34 - field public static final int KNOTTED_HEH = 21; // 0x15 - field public static final int LAM = 22; // 0x16 - field public static final int LAMADH = 23; // 0x17 - field public static final int MALAYALAM_BHA = 89; // 0x59 - field public static final int MALAYALAM_JA = 90; // 0x5a - field public static final int MALAYALAM_LLA = 91; // 0x5b - field public static final int MALAYALAM_LLLA = 92; // 0x5c - field public static final int MALAYALAM_NGA = 93; // 0x5d - field public static final int MALAYALAM_NNA = 94; // 0x5e - field public static final int MALAYALAM_NNNA = 95; // 0x5f - field public static final int MALAYALAM_NYA = 96; // 0x60 - field public static final int MALAYALAM_RA = 97; // 0x61 - field public static final int MALAYALAM_SSA = 98; // 0x62 - field public static final int MALAYALAM_TTA = 99; // 0x63 - field public static final int MANICHAEAN_ALEPH = 58; // 0x3a - field public static final int MANICHAEAN_AYIN = 59; // 0x3b - field public static final int MANICHAEAN_BETH = 60; // 0x3c - field public static final int MANICHAEAN_DALETH = 61; // 0x3d - field public static final int MANICHAEAN_DHAMEDH = 62; // 0x3e - field public static final int MANICHAEAN_FIVE = 63; // 0x3f - field public static final int MANICHAEAN_GIMEL = 64; // 0x40 - field public static final int MANICHAEAN_HETH = 65; // 0x41 - field public static final int MANICHAEAN_HUNDRED = 66; // 0x42 - field public static final int MANICHAEAN_KAPH = 67; // 0x43 - field public static final int MANICHAEAN_LAMEDH = 68; // 0x44 - field public static final int MANICHAEAN_MEM = 69; // 0x45 - field public static final int MANICHAEAN_NUN = 70; // 0x46 - field public static final int MANICHAEAN_ONE = 71; // 0x47 - field public static final int MANICHAEAN_PE = 72; // 0x48 - field public static final int MANICHAEAN_QOPH = 73; // 0x49 - field public static final int MANICHAEAN_RESH = 74; // 0x4a - field public static final int MANICHAEAN_SADHE = 75; // 0x4b - field public static final int MANICHAEAN_SAMEKH = 76; // 0x4c - field public static final int MANICHAEAN_TAW = 77; // 0x4d - field public static final int MANICHAEAN_TEN = 78; // 0x4e - field public static final int MANICHAEAN_TETH = 79; // 0x4f - field public static final int MANICHAEAN_THAMEDH = 80; // 0x50 - field public static final int MANICHAEAN_TWENTY = 81; // 0x51 - field public static final int MANICHAEAN_WAW = 82; // 0x52 - field public static final int MANICHAEAN_YODH = 83; // 0x53 - field public static final int MANICHAEAN_ZAYIN = 84; // 0x54 - field public static final int MEEM = 24; // 0x18 - field public static final int MIM = 25; // 0x19 - field public static final int NOON = 26; // 0x1a - field public static final int NO_JOINING_GROUP = 0; // 0x0 - field public static final int NUN = 27; // 0x1b - field public static final int NYA = 56; // 0x38 - field public static final int PE = 28; // 0x1c - field public static final int QAF = 29; // 0x1d - field public static final int QAPH = 30; // 0x1e - field public static final int REH = 31; // 0x1f - field public static final int REVERSED_PE = 32; // 0x20 - field public static final int ROHINGYA_YEH = 57; // 0x39 - field public static final int SAD = 33; // 0x21 - field public static final int SADHE = 34; // 0x22 - field public static final int SEEN = 35; // 0x23 - field public static final int SEMKATH = 36; // 0x24 - field public static final int SHIN = 37; // 0x25 - field public static final int STRAIGHT_WAW = 85; // 0x55 - field public static final int SWASH_KAF = 38; // 0x26 - field public static final int SYRIAC_WAW = 39; // 0x27 - field public static final int TAH = 40; // 0x28 - field public static final int TAW = 41; // 0x29 - field public static final int TEH_MARBUTA = 42; // 0x2a - field public static final int TEH_MARBUTA_GOAL = 14; // 0xe - field public static final int TETH = 43; // 0x2b - field public static final int WAW = 44; // 0x2c - field public static final int YEH = 45; // 0x2d - field public static final int YEH_BARREE = 46; // 0x2e - field public static final int YEH_WITH_TAIL = 47; // 0x2f - field public static final int YUDH = 48; // 0x30 - field public static final int YUDH_HE = 49; // 0x31 - field public static final int ZAIN = 50; // 0x32 - field public static final int ZHAIN = 53; // 0x35 - } - - public static interface UCharacter.JoiningType { - field public static final int DUAL_JOINING = 2; // 0x2 - field public static final int JOIN_CAUSING = 1; // 0x1 - field public static final int LEFT_JOINING = 3; // 0x3 - field public static final int NON_JOINING = 0; // 0x0 - field public static final int RIGHT_JOINING = 4; // 0x4 - field public static final int TRANSPARENT = 5; // 0x5 - } - - public static interface UCharacter.LineBreak { - field public static final int ALPHABETIC = 2; // 0x2 - field public static final int AMBIGUOUS = 1; // 0x1 - field public static final int BREAK_AFTER = 4; // 0x4 - field public static final int BREAK_BEFORE = 5; // 0x5 - field public static final int BREAK_BOTH = 3; // 0x3 - field public static final int BREAK_SYMBOLS = 27; // 0x1b - field public static final int CARRIAGE_RETURN = 10; // 0xa - field public static final int CLOSE_PARENTHESIS = 36; // 0x24 - field public static final int CLOSE_PUNCTUATION = 8; // 0x8 - field public static final int COMBINING_MARK = 9; // 0x9 - field public static final int COMPLEX_CONTEXT = 24; // 0x18 - field public static final int CONDITIONAL_JAPANESE_STARTER = 37; // 0x25 - field public static final int CONTINGENT_BREAK = 7; // 0x7 - field public static final int EXCLAMATION = 11; // 0xb - field public static final int E_BASE = 40; // 0x28 - field public static final int E_MODIFIER = 41; // 0x29 - field public static final int GLUE = 12; // 0xc - field public static final int H2 = 31; // 0x1f - field public static final int H3 = 32; // 0x20 - field public static final int HEBREW_LETTER = 38; // 0x26 - field public static final int HYPHEN = 13; // 0xd - field public static final int IDEOGRAPHIC = 14; // 0xe - field public static final int INFIX_NUMERIC = 16; // 0x10 - field public static final int INSEPARABLE = 15; // 0xf - field public static final int INSEPERABLE = 15; // 0xf - field public static final int JL = 33; // 0x21 - field public static final int JT = 34; // 0x22 - field public static final int JV = 35; // 0x23 - field public static final int LINE_FEED = 17; // 0x11 - field public static final int MANDATORY_BREAK = 6; // 0x6 - field public static final int NEXT_LINE = 29; // 0x1d - field public static final int NONSTARTER = 18; // 0x12 - field public static final int NUMERIC = 19; // 0x13 - field public static final int OPEN_PUNCTUATION = 20; // 0x14 - field public static final int POSTFIX_NUMERIC = 21; // 0x15 - field public static final int PREFIX_NUMERIC = 22; // 0x16 - field public static final int QUOTATION = 23; // 0x17 - field public static final int REGIONAL_INDICATOR = 39; // 0x27 - field public static final int SPACE = 26; // 0x1a - field public static final int SURROGATE = 25; // 0x19 - field public static final int UNKNOWN = 0; // 0x0 - field public static final int WORD_JOINER = 30; // 0x1e - field public static final int ZWJ = 42; // 0x2a - field public static final int ZWSPACE = 28; // 0x1c - } - - public static interface UCharacter.NumericType { - field public static final int DECIMAL = 1; // 0x1 - field public static final int DIGIT = 2; // 0x2 - field public static final int NONE = 0; // 0x0 - field public static final int NUMERIC = 3; // 0x3 - } - - public static interface UCharacter.SentenceBreak { - field public static final int ATERM = 1; // 0x1 - field public static final int CLOSE = 2; // 0x2 - field public static final int CR = 11; // 0xb - field public static final int EXTEND = 12; // 0xc - field public static final int FORMAT = 3; // 0x3 - field public static final int LF = 13; // 0xd - field public static final int LOWER = 4; // 0x4 - field public static final int NUMERIC = 5; // 0x5 - field public static final int OLETTER = 6; // 0x6 - field public static final int OTHER = 0; // 0x0 - field public static final int SCONTINUE = 14; // 0xe - field public static final int SEP = 7; // 0x7 - field public static final int SP = 8; // 0x8 - field public static final int STERM = 9; // 0x9 - field public static final int UPPER = 10; // 0xa - } - - public static final class UCharacter.UnicodeBlock extends java.lang.Character.Subset { - method public static android.icu.lang.UCharacter.UnicodeBlock forName(String); - method public int getID(); - method public static android.icu.lang.UCharacter.UnicodeBlock getInstance(int); - method public static android.icu.lang.UCharacter.UnicodeBlock of(int); - field public static final android.icu.lang.UCharacter.UnicodeBlock ADLAM; - field public static final int ADLAM_ID = 263; // 0x107 - field public static final android.icu.lang.UCharacter.UnicodeBlock AEGEAN_NUMBERS; - field public static final int AEGEAN_NUMBERS_ID = 119; // 0x77 - field public static final android.icu.lang.UCharacter.UnicodeBlock AHOM; - field public static final int AHOM_ID = 253; // 0xfd - field public static final android.icu.lang.UCharacter.UnicodeBlock ALCHEMICAL_SYMBOLS; - field public static final int ALCHEMICAL_SYMBOLS_ID = 208; // 0xd0 - field public static final android.icu.lang.UCharacter.UnicodeBlock ALPHABETIC_PRESENTATION_FORMS; - field public static final int ALPHABETIC_PRESENTATION_FORMS_ID = 80; // 0x50 - field public static final android.icu.lang.UCharacter.UnicodeBlock ANATOLIAN_HIEROGLYPHS; - field public static final int ANATOLIAN_HIEROGLYPHS_ID = 254; // 0xfe - field public static final android.icu.lang.UCharacter.UnicodeBlock ANCIENT_GREEK_MUSICAL_NOTATION; - field public static final int ANCIENT_GREEK_MUSICAL_NOTATION_ID = 126; // 0x7e - field public static final android.icu.lang.UCharacter.UnicodeBlock ANCIENT_GREEK_NUMBERS; - field public static final int ANCIENT_GREEK_NUMBERS_ID = 127; // 0x7f - field public static final android.icu.lang.UCharacter.UnicodeBlock ANCIENT_SYMBOLS; - field public static final int ANCIENT_SYMBOLS_ID = 165; // 0xa5 - field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC; - field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_EXTENDED_A; - field public static final int ARABIC_EXTENDED_A_ID = 210; // 0xd2 - field public static final int ARABIC_ID = 12; // 0xc - field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS; - field public static final int ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS_ID = 211; // 0xd3 - field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_PRESENTATION_FORMS_A; - field public static final int ARABIC_PRESENTATION_FORMS_A_ID = 81; // 0x51 - field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_PRESENTATION_FORMS_B; - field public static final int ARABIC_PRESENTATION_FORMS_B_ID = 85; // 0x55 - field public static final android.icu.lang.UCharacter.UnicodeBlock ARABIC_SUPPLEMENT; - field public static final int ARABIC_SUPPLEMENT_ID = 128; // 0x80 - field public static final android.icu.lang.UCharacter.UnicodeBlock ARMENIAN; - field public static final int ARMENIAN_ID = 10; // 0xa - field public static final android.icu.lang.UCharacter.UnicodeBlock ARROWS; - field public static final int ARROWS_ID = 46; // 0x2e - field public static final android.icu.lang.UCharacter.UnicodeBlock AVESTAN; - field public static final int AVESTAN_ID = 188; // 0xbc - field public static final android.icu.lang.UCharacter.UnicodeBlock BALINESE; - field public static final int BALINESE_ID = 147; // 0x93 - field public static final android.icu.lang.UCharacter.UnicodeBlock BAMUM; - field public static final int BAMUM_ID = 177; // 0xb1 - field public static final android.icu.lang.UCharacter.UnicodeBlock BAMUM_SUPPLEMENT; - field public static final int BAMUM_SUPPLEMENT_ID = 202; // 0xca - field public static final android.icu.lang.UCharacter.UnicodeBlock BASIC_LATIN; - field public static final int BASIC_LATIN_ID = 1; // 0x1 - field public static final android.icu.lang.UCharacter.UnicodeBlock BASSA_VAH; - field public static final int BASSA_VAH_ID = 221; // 0xdd - field public static final android.icu.lang.UCharacter.UnicodeBlock BATAK; - field public static final int BATAK_ID = 199; // 0xc7 - field public static final android.icu.lang.UCharacter.UnicodeBlock BENGALI; - field public static final int BENGALI_ID = 16; // 0x10 - field public static final android.icu.lang.UCharacter.UnicodeBlock BHAIKSUKI; - field public static final int BHAIKSUKI_ID = 264; // 0x108 - field public static final android.icu.lang.UCharacter.UnicodeBlock BLOCK_ELEMENTS; - field public static final int BLOCK_ELEMENTS_ID = 53; // 0x35 - field public static final android.icu.lang.UCharacter.UnicodeBlock BOPOMOFO; - field public static final android.icu.lang.UCharacter.UnicodeBlock BOPOMOFO_EXTENDED; - field public static final int BOPOMOFO_EXTENDED_ID = 67; // 0x43 - field public static final int BOPOMOFO_ID = 64; // 0x40 - field public static final android.icu.lang.UCharacter.UnicodeBlock BOX_DRAWING; - field public static final int BOX_DRAWING_ID = 52; // 0x34 - field public static final android.icu.lang.UCharacter.UnicodeBlock BRAHMI; - field public static final int BRAHMI_ID = 201; // 0xc9 - field public static final android.icu.lang.UCharacter.UnicodeBlock BRAILLE_PATTERNS; - field public static final int BRAILLE_PATTERNS_ID = 57; // 0x39 - field public static final android.icu.lang.UCharacter.UnicodeBlock BUGINESE; - field public static final int BUGINESE_ID = 129; // 0x81 - field public static final android.icu.lang.UCharacter.UnicodeBlock BUHID; - field public static final int BUHID_ID = 100; // 0x64 - field public static final android.icu.lang.UCharacter.UnicodeBlock BYZANTINE_MUSICAL_SYMBOLS; - field public static final int BYZANTINE_MUSICAL_SYMBOLS_ID = 91; // 0x5b - field public static final android.icu.lang.UCharacter.UnicodeBlock CARIAN; - field public static final int CARIAN_ID = 168; // 0xa8 - field public static final android.icu.lang.UCharacter.UnicodeBlock CAUCASIAN_ALBANIAN; - field public static final int CAUCASIAN_ALBANIAN_ID = 222; // 0xde - field public static final android.icu.lang.UCharacter.UnicodeBlock CHAKMA; - field public static final int CHAKMA_ID = 212; // 0xd4 - field public static final android.icu.lang.UCharacter.UnicodeBlock CHAM; - field public static final int CHAM_ID = 164; // 0xa4 - field public static final android.icu.lang.UCharacter.UnicodeBlock CHEROKEE; - field public static final int CHEROKEE_ID = 32; // 0x20 - field public static final android.icu.lang.UCharacter.UnicodeBlock CHEROKEE_SUPPLEMENT; - field public static final int CHEROKEE_SUPPLEMENT_ID = 255; // 0xff - field public static final android.icu.lang.UCharacter.UnicodeBlock CHESS_SYMBOLS; - field public static final int CHESS_SYMBOLS_ID = 281; // 0x119 - field public static final android.icu.lang.UCharacter.UnicodeBlock CHORASMIAN; - field public static final int CHORASMIAN_ID = 301; // 0x12d - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY; - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY_FORMS; - field public static final int CJK_COMPATIBILITY_FORMS_ID = 83; // 0x53 - field public static final int CJK_COMPATIBILITY_ID = 69; // 0x45 - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS; - field public static final int CJK_COMPATIBILITY_IDEOGRAPHS_ID = 79; // 0x4f - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT; - field public static final int CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT_ID = 95; // 0x5f - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_RADICALS_SUPPLEMENT; - field public static final int CJK_RADICALS_SUPPLEMENT_ID = 58; // 0x3a - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_STROKES; - field public static final int CJK_STROKES_ID = 130; // 0x82 - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_SYMBOLS_AND_PUNCTUATION; - field public static final int CJK_SYMBOLS_AND_PUNCTUATION_ID = 61; // 0x3d - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS; - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A; - field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A_ID = 70; // 0x46 - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B; - field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B_ID = 94; // 0x5e - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C; - field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C_ID = 197; // 0xc5 - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D; - field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D_ID = 209; // 0xd1 - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E; - field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_E_ID = 256; // 0x100 - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F; - field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_F_ID = 274; // 0x112 - field public static final android.icu.lang.UCharacter.UnicodeBlock CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G; - field public static final int CJK_UNIFIED_IDEOGRAPHS_EXTENSION_G_ID = 302; // 0x12e - field public static final int CJK_UNIFIED_IDEOGRAPHS_ID = 71; // 0x47 - field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_DIACRITICAL_MARKS; - field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_DIACRITICAL_MARKS_EXTENDED; - field public static final int COMBINING_DIACRITICAL_MARKS_EXTENDED_ID = 224; // 0xe0 - field public static final int COMBINING_DIACRITICAL_MARKS_ID = 7; // 0x7 - field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_DIACRITICAL_MARKS_SUPPLEMENT; - field public static final int COMBINING_DIACRITICAL_MARKS_SUPPLEMENT_ID = 131; // 0x83 - field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_HALF_MARKS; - field public static final int COMBINING_HALF_MARKS_ID = 82; // 0x52 - field public static final android.icu.lang.UCharacter.UnicodeBlock COMBINING_MARKS_FOR_SYMBOLS; - field public static final int COMBINING_MARKS_FOR_SYMBOLS_ID = 43; // 0x2b - field public static final android.icu.lang.UCharacter.UnicodeBlock COMMON_INDIC_NUMBER_FORMS; - field public static final int COMMON_INDIC_NUMBER_FORMS_ID = 178; // 0xb2 - field public static final android.icu.lang.UCharacter.UnicodeBlock CONTROL_PICTURES; - field public static final int CONTROL_PICTURES_ID = 49; // 0x31 - field public static final android.icu.lang.UCharacter.UnicodeBlock COPTIC; - field public static final android.icu.lang.UCharacter.UnicodeBlock COPTIC_EPACT_NUMBERS; - field public static final int COPTIC_EPACT_NUMBERS_ID = 223; // 0xdf - field public static final int COPTIC_ID = 132; // 0x84 - field public static final android.icu.lang.UCharacter.UnicodeBlock COUNTING_ROD_NUMERALS; - field public static final int COUNTING_ROD_NUMERALS_ID = 154; // 0x9a - field public static final android.icu.lang.UCharacter.UnicodeBlock CUNEIFORM; - field public static final int CUNEIFORM_ID = 152; // 0x98 - field public static final android.icu.lang.UCharacter.UnicodeBlock CUNEIFORM_NUMBERS_AND_PUNCTUATION; - field public static final int CUNEIFORM_NUMBERS_AND_PUNCTUATION_ID = 153; // 0x99 - field public static final android.icu.lang.UCharacter.UnicodeBlock CURRENCY_SYMBOLS; - field public static final int CURRENCY_SYMBOLS_ID = 42; // 0x2a - field public static final android.icu.lang.UCharacter.UnicodeBlock CYPRIOT_SYLLABARY; - field public static final int CYPRIOT_SYLLABARY_ID = 123; // 0x7b - field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC; - field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_EXTENDED_A; - field public static final int CYRILLIC_EXTENDED_A_ID = 158; // 0x9e - field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_EXTENDED_B; - field public static final int CYRILLIC_EXTENDED_B_ID = 160; // 0xa0 - field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_EXTENDED_C; - field public static final int CYRILLIC_EXTENDED_C_ID = 265; // 0x109 - field public static final int CYRILLIC_ID = 9; // 0x9 - field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_SUPPLEMENT; - field public static final android.icu.lang.UCharacter.UnicodeBlock CYRILLIC_SUPPLEMENTARY; - field public static final int CYRILLIC_SUPPLEMENTARY_ID = 97; // 0x61 - field public static final int CYRILLIC_SUPPLEMENT_ID = 97; // 0x61 - field public static final android.icu.lang.UCharacter.UnicodeBlock DESERET; - field public static final int DESERET_ID = 90; // 0x5a - field public static final android.icu.lang.UCharacter.UnicodeBlock DEVANAGARI; - field public static final android.icu.lang.UCharacter.UnicodeBlock DEVANAGARI_EXTENDED; - field public static final int DEVANAGARI_EXTENDED_ID = 179; // 0xb3 - field public static final int DEVANAGARI_ID = 15; // 0xf - field public static final android.icu.lang.UCharacter.UnicodeBlock DINGBATS; - field public static final int DINGBATS_ID = 56; // 0x38 - field public static final android.icu.lang.UCharacter.UnicodeBlock DIVES_AKURU; - field public static final int DIVES_AKURU_ID = 303; // 0x12f - field public static final android.icu.lang.UCharacter.UnicodeBlock DOGRA; - field public static final int DOGRA_ID = 282; // 0x11a - field public static final android.icu.lang.UCharacter.UnicodeBlock DOMINO_TILES; - field public static final int DOMINO_TILES_ID = 171; // 0xab - field public static final android.icu.lang.UCharacter.UnicodeBlock DUPLOYAN; - field public static final int DUPLOYAN_ID = 225; // 0xe1 - field public static final android.icu.lang.UCharacter.UnicodeBlock EARLY_DYNASTIC_CUNEIFORM; - field public static final int EARLY_DYNASTIC_CUNEIFORM_ID = 257; // 0x101 - field public static final android.icu.lang.UCharacter.UnicodeBlock EGYPTIAN_HIEROGLYPHS; - field public static final int EGYPTIAN_HIEROGLYPHS_ID = 194; // 0xc2 - field public static final android.icu.lang.UCharacter.UnicodeBlock EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS; - field public static final int EGYPTIAN_HIEROGLYPH_FORMAT_CONTROLS_ID = 292; // 0x124 - field public static final android.icu.lang.UCharacter.UnicodeBlock ELBASAN; - field public static final int ELBASAN_ID = 226; // 0xe2 - field public static final android.icu.lang.UCharacter.UnicodeBlock ELYMAIC; - field public static final int ELYMAIC_ID = 293; // 0x125 - field public static final android.icu.lang.UCharacter.UnicodeBlock EMOTICONS; - field public static final int EMOTICONS_ID = 206; // 0xce - field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_ALPHANUMERICS; - field public static final int ENCLOSED_ALPHANUMERICS_ID = 51; // 0x33 - field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_ALPHANUMERIC_SUPPLEMENT; - field public static final int ENCLOSED_ALPHANUMERIC_SUPPLEMENT_ID = 195; // 0xc3 - field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_CJK_LETTERS_AND_MONTHS; - field public static final int ENCLOSED_CJK_LETTERS_AND_MONTHS_ID = 68; // 0x44 - field public static final android.icu.lang.UCharacter.UnicodeBlock ENCLOSED_IDEOGRAPHIC_SUPPLEMENT; - field public static final int ENCLOSED_IDEOGRAPHIC_SUPPLEMENT_ID = 196; // 0xc4 - field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC; - field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC_EXTENDED; - field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC_EXTENDED_A; - field public static final int ETHIOPIC_EXTENDED_A_ID = 200; // 0xc8 - field public static final int ETHIOPIC_EXTENDED_ID = 133; // 0x85 - field public static final int ETHIOPIC_ID = 31; // 0x1f - field public static final android.icu.lang.UCharacter.UnicodeBlock ETHIOPIC_SUPPLEMENT; - field public static final int ETHIOPIC_SUPPLEMENT_ID = 134; // 0x86 - field public static final android.icu.lang.UCharacter.UnicodeBlock GENERAL_PUNCTUATION; - field public static final int GENERAL_PUNCTUATION_ID = 40; // 0x28 - field public static final android.icu.lang.UCharacter.UnicodeBlock GEOMETRIC_SHAPES; - field public static final android.icu.lang.UCharacter.UnicodeBlock GEOMETRIC_SHAPES_EXTENDED; - field public static final int GEOMETRIC_SHAPES_EXTENDED_ID = 227; // 0xe3 - field public static final int GEOMETRIC_SHAPES_ID = 54; // 0x36 - field public static final android.icu.lang.UCharacter.UnicodeBlock GEORGIAN; - field public static final android.icu.lang.UCharacter.UnicodeBlock GEORGIAN_EXTENDED; - field public static final int GEORGIAN_EXTENDED_ID = 283; // 0x11b - field public static final int GEORGIAN_ID = 29; // 0x1d - field public static final android.icu.lang.UCharacter.UnicodeBlock GEORGIAN_SUPPLEMENT; - field public static final int GEORGIAN_SUPPLEMENT_ID = 135; // 0x87 - field public static final android.icu.lang.UCharacter.UnicodeBlock GLAGOLITIC; - field public static final int GLAGOLITIC_ID = 136; // 0x88 - field public static final android.icu.lang.UCharacter.UnicodeBlock GLAGOLITIC_SUPPLEMENT; - field public static final int GLAGOLITIC_SUPPLEMENT_ID = 266; // 0x10a - field public static final android.icu.lang.UCharacter.UnicodeBlock GOTHIC; - field public static final int GOTHIC_ID = 89; // 0x59 - field public static final android.icu.lang.UCharacter.UnicodeBlock GRANTHA; - field public static final int GRANTHA_ID = 228; // 0xe4 - field public static final android.icu.lang.UCharacter.UnicodeBlock GREEK; - field public static final android.icu.lang.UCharacter.UnicodeBlock GREEK_EXTENDED; - field public static final int GREEK_EXTENDED_ID = 39; // 0x27 - field public static final int GREEK_ID = 8; // 0x8 - field public static final android.icu.lang.UCharacter.UnicodeBlock GUJARATI; - field public static final int GUJARATI_ID = 18; // 0x12 - field public static final android.icu.lang.UCharacter.UnicodeBlock GUNJALA_GONDI; - field public static final int GUNJALA_GONDI_ID = 284; // 0x11c - field public static final android.icu.lang.UCharacter.UnicodeBlock GURMUKHI; - field public static final int GURMUKHI_ID = 17; // 0x11 - field public static final android.icu.lang.UCharacter.UnicodeBlock HALFWIDTH_AND_FULLWIDTH_FORMS; - field public static final int HALFWIDTH_AND_FULLWIDTH_FORMS_ID = 87; // 0x57 - field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_COMPATIBILITY_JAMO; - field public static final int HANGUL_COMPATIBILITY_JAMO_ID = 65; // 0x41 - field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_JAMO; - field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_JAMO_EXTENDED_A; - field public static final int HANGUL_JAMO_EXTENDED_A_ID = 180; // 0xb4 - field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_JAMO_EXTENDED_B; - field public static final int HANGUL_JAMO_EXTENDED_B_ID = 185; // 0xb9 - field public static final int HANGUL_JAMO_ID = 30; // 0x1e - field public static final android.icu.lang.UCharacter.UnicodeBlock HANGUL_SYLLABLES; - field public static final int HANGUL_SYLLABLES_ID = 74; // 0x4a - field public static final android.icu.lang.UCharacter.UnicodeBlock HANIFI_ROHINGYA; - field public static final int HANIFI_ROHINGYA_ID = 285; // 0x11d - field public static final android.icu.lang.UCharacter.UnicodeBlock HANUNOO; - field public static final int HANUNOO_ID = 99; // 0x63 - field public static final android.icu.lang.UCharacter.UnicodeBlock HATRAN; - field public static final int HATRAN_ID = 258; // 0x102 - field public static final android.icu.lang.UCharacter.UnicodeBlock HEBREW; - field public static final int HEBREW_ID = 11; // 0xb - field public static final android.icu.lang.UCharacter.UnicodeBlock HIGH_PRIVATE_USE_SURROGATES; - field public static final int HIGH_PRIVATE_USE_SURROGATES_ID = 76; // 0x4c - field public static final android.icu.lang.UCharacter.UnicodeBlock HIGH_SURROGATES; - field public static final int HIGH_SURROGATES_ID = 75; // 0x4b - field public static final android.icu.lang.UCharacter.UnicodeBlock HIRAGANA; - field public static final int HIRAGANA_ID = 62; // 0x3e - field public static final android.icu.lang.UCharacter.UnicodeBlock IDEOGRAPHIC_DESCRIPTION_CHARACTERS; - field public static final int IDEOGRAPHIC_DESCRIPTION_CHARACTERS_ID = 60; // 0x3c - field public static final android.icu.lang.UCharacter.UnicodeBlock IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION; - field public static final int IDEOGRAPHIC_SYMBOLS_AND_PUNCTUATION_ID = 267; // 0x10b - field public static final android.icu.lang.UCharacter.UnicodeBlock IMPERIAL_ARAMAIC; - field public static final int IMPERIAL_ARAMAIC_ID = 186; // 0xba - field public static final android.icu.lang.UCharacter.UnicodeBlock INDIC_SIYAQ_NUMBERS; - field public static final int INDIC_SIYAQ_NUMBERS_ID = 286; // 0x11e - field public static final android.icu.lang.UCharacter.UnicodeBlock INSCRIPTIONAL_PAHLAVI; - field public static final int INSCRIPTIONAL_PAHLAVI_ID = 190; // 0xbe - field public static final android.icu.lang.UCharacter.UnicodeBlock INSCRIPTIONAL_PARTHIAN; - field public static final int INSCRIPTIONAL_PARTHIAN_ID = 189; // 0xbd - field public static final android.icu.lang.UCharacter.UnicodeBlock INVALID_CODE; - field public static final int INVALID_CODE_ID = -1; // 0xffffffff - field public static final android.icu.lang.UCharacter.UnicodeBlock IPA_EXTENSIONS; - field public static final int IPA_EXTENSIONS_ID = 5; // 0x5 - field public static final android.icu.lang.UCharacter.UnicodeBlock JAVANESE; - field public static final int JAVANESE_ID = 181; // 0xb5 - field public static final android.icu.lang.UCharacter.UnicodeBlock KAITHI; - field public static final int KAITHI_ID = 193; // 0xc1 - field public static final android.icu.lang.UCharacter.UnicodeBlock KANA_EXTENDED_A; - field public static final int KANA_EXTENDED_A_ID = 275; // 0x113 - field public static final android.icu.lang.UCharacter.UnicodeBlock KANA_SUPPLEMENT; - field public static final int KANA_SUPPLEMENT_ID = 203; // 0xcb - field public static final android.icu.lang.UCharacter.UnicodeBlock KANBUN; - field public static final int KANBUN_ID = 66; // 0x42 - field public static final android.icu.lang.UCharacter.UnicodeBlock KANGXI_RADICALS; - field public static final int KANGXI_RADICALS_ID = 59; // 0x3b - field public static final android.icu.lang.UCharacter.UnicodeBlock KANNADA; - field public static final int KANNADA_ID = 22; // 0x16 - field public static final android.icu.lang.UCharacter.UnicodeBlock KATAKANA; - field public static final int KATAKANA_ID = 63; // 0x3f - field public static final android.icu.lang.UCharacter.UnicodeBlock KATAKANA_PHONETIC_EXTENSIONS; - field public static final int KATAKANA_PHONETIC_EXTENSIONS_ID = 107; // 0x6b - field public static final android.icu.lang.UCharacter.UnicodeBlock KAYAH_LI; - field public static final int KAYAH_LI_ID = 162; // 0xa2 - field public static final android.icu.lang.UCharacter.UnicodeBlock KHAROSHTHI; - field public static final int KHAROSHTHI_ID = 137; // 0x89 - field public static final android.icu.lang.UCharacter.UnicodeBlock KHITAN_SMALL_SCRIPT; - field public static final int KHITAN_SMALL_SCRIPT_ID = 304; // 0x130 - field public static final android.icu.lang.UCharacter.UnicodeBlock KHMER; - field public static final int KHMER_ID = 36; // 0x24 - field public static final android.icu.lang.UCharacter.UnicodeBlock KHMER_SYMBOLS; - field public static final int KHMER_SYMBOLS_ID = 113; // 0x71 - field public static final android.icu.lang.UCharacter.UnicodeBlock KHOJKI; - field public static final int KHOJKI_ID = 229; // 0xe5 - field public static final android.icu.lang.UCharacter.UnicodeBlock KHUDAWADI; - field public static final int KHUDAWADI_ID = 230; // 0xe6 - field public static final android.icu.lang.UCharacter.UnicodeBlock LAO; - field public static final int LAO_ID = 26; // 0x1a - field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_1_SUPPLEMENT; - field public static final int LATIN_1_SUPPLEMENT_ID = 2; // 0x2 - field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_A; - field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_ADDITIONAL; - field public static final int LATIN_EXTENDED_ADDITIONAL_ID = 38; // 0x26 - field public static final int LATIN_EXTENDED_A_ID = 3; // 0x3 - field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_B; - field public static final int LATIN_EXTENDED_B_ID = 4; // 0x4 - field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_C; - field public static final int LATIN_EXTENDED_C_ID = 148; // 0x94 - field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_D; - field public static final int LATIN_EXTENDED_D_ID = 149; // 0x95 - field public static final android.icu.lang.UCharacter.UnicodeBlock LATIN_EXTENDED_E; - field public static final int LATIN_EXTENDED_E_ID = 231; // 0xe7 - field public static final android.icu.lang.UCharacter.UnicodeBlock LEPCHA; - field public static final int LEPCHA_ID = 156; // 0x9c - field public static final android.icu.lang.UCharacter.UnicodeBlock LETTERLIKE_SYMBOLS; - field public static final int LETTERLIKE_SYMBOLS_ID = 44; // 0x2c - field public static final android.icu.lang.UCharacter.UnicodeBlock LIMBU; - field public static final int LIMBU_ID = 111; // 0x6f - field public static final android.icu.lang.UCharacter.UnicodeBlock LINEAR_A; - field public static final int LINEAR_A_ID = 232; // 0xe8 - field public static final android.icu.lang.UCharacter.UnicodeBlock LINEAR_B_IDEOGRAMS; - field public static final int LINEAR_B_IDEOGRAMS_ID = 118; // 0x76 - field public static final android.icu.lang.UCharacter.UnicodeBlock LINEAR_B_SYLLABARY; - field public static final int LINEAR_B_SYLLABARY_ID = 117; // 0x75 - field public static final android.icu.lang.UCharacter.UnicodeBlock LISU; - field public static final int LISU_ID = 176; // 0xb0 - field public static final android.icu.lang.UCharacter.UnicodeBlock LISU_SUPPLEMENT; - field public static final int LISU_SUPPLEMENT_ID = 305; // 0x131 - field public static final android.icu.lang.UCharacter.UnicodeBlock LOW_SURROGATES; - field public static final int LOW_SURROGATES_ID = 77; // 0x4d - field public static final android.icu.lang.UCharacter.UnicodeBlock LYCIAN; - field public static final int LYCIAN_ID = 167; // 0xa7 - field public static final android.icu.lang.UCharacter.UnicodeBlock LYDIAN; - field public static final int LYDIAN_ID = 169; // 0xa9 - field public static final android.icu.lang.UCharacter.UnicodeBlock MAHAJANI; - field public static final int MAHAJANI_ID = 233; // 0xe9 - field public static final android.icu.lang.UCharacter.UnicodeBlock MAHJONG_TILES; - field public static final int MAHJONG_TILES_ID = 170; // 0xaa - field public static final android.icu.lang.UCharacter.UnicodeBlock MAKASAR; - field public static final int MAKASAR_ID = 287; // 0x11f - field public static final android.icu.lang.UCharacter.UnicodeBlock MALAYALAM; - field public static final int MALAYALAM_ID = 23; // 0x17 - field public static final android.icu.lang.UCharacter.UnicodeBlock MANDAIC; - field public static final int MANDAIC_ID = 198; // 0xc6 - field public static final android.icu.lang.UCharacter.UnicodeBlock MANICHAEAN; - field public static final int MANICHAEAN_ID = 234; // 0xea - field public static final android.icu.lang.UCharacter.UnicodeBlock MARCHEN; - field public static final int MARCHEN_ID = 268; // 0x10c - field public static final android.icu.lang.UCharacter.UnicodeBlock MASARAM_GONDI; - field public static final int MASARAM_GONDI_ID = 276; // 0x114 - field public static final android.icu.lang.UCharacter.UnicodeBlock MATHEMATICAL_ALPHANUMERIC_SYMBOLS; - field public static final int MATHEMATICAL_ALPHANUMERIC_SYMBOLS_ID = 93; // 0x5d - field public static final android.icu.lang.UCharacter.UnicodeBlock MATHEMATICAL_OPERATORS; - field public static final int MATHEMATICAL_OPERATORS_ID = 47; // 0x2f - field public static final android.icu.lang.UCharacter.UnicodeBlock MAYAN_NUMERALS; - field public static final int MAYAN_NUMERALS_ID = 288; // 0x120 - field public static final android.icu.lang.UCharacter.UnicodeBlock MEDEFAIDRIN; - field public static final int MEDEFAIDRIN_ID = 289; // 0x121 - field public static final android.icu.lang.UCharacter.UnicodeBlock MEETEI_MAYEK; - field public static final android.icu.lang.UCharacter.UnicodeBlock MEETEI_MAYEK_EXTENSIONS; - field public static final int MEETEI_MAYEK_EXTENSIONS_ID = 213; // 0xd5 - field public static final int MEETEI_MAYEK_ID = 184; // 0xb8 - field public static final android.icu.lang.UCharacter.UnicodeBlock MENDE_KIKAKUI; - field public static final int MENDE_KIKAKUI_ID = 235; // 0xeb - field public static final android.icu.lang.UCharacter.UnicodeBlock MEROITIC_CURSIVE; - field public static final int MEROITIC_CURSIVE_ID = 214; // 0xd6 - field public static final android.icu.lang.UCharacter.UnicodeBlock MEROITIC_HIEROGLYPHS; - field public static final int MEROITIC_HIEROGLYPHS_ID = 215; // 0xd7 - field public static final android.icu.lang.UCharacter.UnicodeBlock MIAO; - field public static final int MIAO_ID = 216; // 0xd8 - field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A; - field public static final int MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A_ID = 102; // 0x66 - field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B; - field public static final int MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B_ID = 105; // 0x69 - field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_SYMBOLS; - field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_SYMBOLS_AND_ARROWS; - field public static final int MISCELLANEOUS_SYMBOLS_AND_ARROWS_ID = 115; // 0x73 - field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS; - field public static final int MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS_ID = 205; // 0xcd - field public static final int MISCELLANEOUS_SYMBOLS_ID = 55; // 0x37 - field public static final android.icu.lang.UCharacter.UnicodeBlock MISCELLANEOUS_TECHNICAL; - field public static final int MISCELLANEOUS_TECHNICAL_ID = 48; // 0x30 - field public static final android.icu.lang.UCharacter.UnicodeBlock MODI; - field public static final android.icu.lang.UCharacter.UnicodeBlock MODIFIER_TONE_LETTERS; - field public static final int MODIFIER_TONE_LETTERS_ID = 138; // 0x8a - field public static final int MODI_ID = 236; // 0xec - field public static final android.icu.lang.UCharacter.UnicodeBlock MONGOLIAN; - field public static final int MONGOLIAN_ID = 37; // 0x25 - field public static final android.icu.lang.UCharacter.UnicodeBlock MONGOLIAN_SUPPLEMENT; - field public static final int MONGOLIAN_SUPPLEMENT_ID = 269; // 0x10d - field public static final android.icu.lang.UCharacter.UnicodeBlock MRO; - field public static final int MRO_ID = 237; // 0xed - field public static final android.icu.lang.UCharacter.UnicodeBlock MULTANI; - field public static final int MULTANI_ID = 259; // 0x103 - field public static final android.icu.lang.UCharacter.UnicodeBlock MUSICAL_SYMBOLS; - field public static final int MUSICAL_SYMBOLS_ID = 92; // 0x5c - field public static final android.icu.lang.UCharacter.UnicodeBlock MYANMAR; - field public static final android.icu.lang.UCharacter.UnicodeBlock MYANMAR_EXTENDED_A; - field public static final int MYANMAR_EXTENDED_A_ID = 182; // 0xb6 - field public static final android.icu.lang.UCharacter.UnicodeBlock MYANMAR_EXTENDED_B; - field public static final int MYANMAR_EXTENDED_B_ID = 238; // 0xee - field public static final int MYANMAR_ID = 28; // 0x1c - field public static final android.icu.lang.UCharacter.UnicodeBlock NABATAEAN; - field public static final int NABATAEAN_ID = 239; // 0xef - field public static final android.icu.lang.UCharacter.UnicodeBlock NANDINAGARI; - field public static final int NANDINAGARI_ID = 294; // 0x126 - field public static final android.icu.lang.UCharacter.UnicodeBlock NEWA; - field public static final int NEWA_ID = 270; // 0x10e - field public static final android.icu.lang.UCharacter.UnicodeBlock NEW_TAI_LUE; - field public static final int NEW_TAI_LUE_ID = 139; // 0x8b - field public static final android.icu.lang.UCharacter.UnicodeBlock NKO; - field public static final int NKO_ID = 146; // 0x92 - field public static final android.icu.lang.UCharacter.UnicodeBlock NO_BLOCK; - field public static final android.icu.lang.UCharacter.UnicodeBlock NUMBER_FORMS; - field public static final int NUMBER_FORMS_ID = 45; // 0x2d - field public static final android.icu.lang.UCharacter.UnicodeBlock NUSHU; - field public static final int NUSHU_ID = 277; // 0x115 - field public static final android.icu.lang.UCharacter.UnicodeBlock NYIAKENG_PUACHUE_HMONG; - field public static final int NYIAKENG_PUACHUE_HMONG_ID = 295; // 0x127 - field public static final android.icu.lang.UCharacter.UnicodeBlock OGHAM; - field public static final int OGHAM_ID = 34; // 0x22 - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_HUNGARIAN; - field public static final int OLD_HUNGARIAN_ID = 260; // 0x104 - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_ITALIC; - field public static final int OLD_ITALIC_ID = 88; // 0x58 - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_NORTH_ARABIAN; - field public static final int OLD_NORTH_ARABIAN_ID = 240; // 0xf0 - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_PERMIC; - field public static final int OLD_PERMIC_ID = 241; // 0xf1 - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_PERSIAN; - field public static final int OLD_PERSIAN_ID = 140; // 0x8c - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_SOGDIAN; - field public static final int OLD_SOGDIAN_ID = 290; // 0x122 - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_SOUTH_ARABIAN; - field public static final int OLD_SOUTH_ARABIAN_ID = 187; // 0xbb - field public static final android.icu.lang.UCharacter.UnicodeBlock OLD_TURKIC; - field public static final int OLD_TURKIC_ID = 191; // 0xbf - field public static final android.icu.lang.UCharacter.UnicodeBlock OL_CHIKI; - field public static final int OL_CHIKI_ID = 157; // 0x9d - field public static final android.icu.lang.UCharacter.UnicodeBlock OPTICAL_CHARACTER_RECOGNITION; - field public static final int OPTICAL_CHARACTER_RECOGNITION_ID = 50; // 0x32 - field public static final android.icu.lang.UCharacter.UnicodeBlock ORIYA; - field public static final int ORIYA_ID = 19; // 0x13 - field public static final android.icu.lang.UCharacter.UnicodeBlock ORNAMENTAL_DINGBATS; - field public static final int ORNAMENTAL_DINGBATS_ID = 242; // 0xf2 - field public static final android.icu.lang.UCharacter.UnicodeBlock OSAGE; - field public static final int OSAGE_ID = 271; // 0x10f - field public static final android.icu.lang.UCharacter.UnicodeBlock OSMANYA; - field public static final int OSMANYA_ID = 122; // 0x7a - field public static final android.icu.lang.UCharacter.UnicodeBlock OTTOMAN_SIYAQ_NUMBERS; - field public static final int OTTOMAN_SIYAQ_NUMBERS_ID = 296; // 0x128 - field public static final android.icu.lang.UCharacter.UnicodeBlock PAHAWH_HMONG; - field public static final int PAHAWH_HMONG_ID = 243; // 0xf3 - field public static final android.icu.lang.UCharacter.UnicodeBlock PALMYRENE; - field public static final int PALMYRENE_ID = 244; // 0xf4 - field public static final android.icu.lang.UCharacter.UnicodeBlock PAU_CIN_HAU; - field public static final int PAU_CIN_HAU_ID = 245; // 0xf5 - field public static final android.icu.lang.UCharacter.UnicodeBlock PHAGS_PA; - field public static final int PHAGS_PA_ID = 150; // 0x96 - field public static final android.icu.lang.UCharacter.UnicodeBlock PHAISTOS_DISC; - field public static final int PHAISTOS_DISC_ID = 166; // 0xa6 - field public static final android.icu.lang.UCharacter.UnicodeBlock PHOENICIAN; - field public static final int PHOENICIAN_ID = 151; // 0x97 - field public static final android.icu.lang.UCharacter.UnicodeBlock PHONETIC_EXTENSIONS; - field public static final int PHONETIC_EXTENSIONS_ID = 114; // 0x72 - field public static final android.icu.lang.UCharacter.UnicodeBlock PHONETIC_EXTENSIONS_SUPPLEMENT; - field public static final int PHONETIC_EXTENSIONS_SUPPLEMENT_ID = 141; // 0x8d - field public static final android.icu.lang.UCharacter.UnicodeBlock PLAYING_CARDS; - field public static final int PLAYING_CARDS_ID = 204; // 0xcc - field public static final android.icu.lang.UCharacter.UnicodeBlock PRIVATE_USE; - field public static final android.icu.lang.UCharacter.UnicodeBlock PRIVATE_USE_AREA; - field public static final int PRIVATE_USE_AREA_ID = 78; // 0x4e - field public static final int PRIVATE_USE_ID = 78; // 0x4e - field public static final android.icu.lang.UCharacter.UnicodeBlock PSALTER_PAHLAVI; - field public static final int PSALTER_PAHLAVI_ID = 246; // 0xf6 - field public static final android.icu.lang.UCharacter.UnicodeBlock REJANG; - field public static final int REJANG_ID = 163; // 0xa3 - field public static final android.icu.lang.UCharacter.UnicodeBlock RUMI_NUMERAL_SYMBOLS; - field public static final int RUMI_NUMERAL_SYMBOLS_ID = 192; // 0xc0 - field public static final android.icu.lang.UCharacter.UnicodeBlock RUNIC; - field public static final int RUNIC_ID = 35; // 0x23 - field public static final android.icu.lang.UCharacter.UnicodeBlock SAMARITAN; - field public static final int SAMARITAN_ID = 172; // 0xac - field public static final android.icu.lang.UCharacter.UnicodeBlock SAURASHTRA; - field public static final int SAURASHTRA_ID = 161; // 0xa1 - field public static final android.icu.lang.UCharacter.UnicodeBlock SHARADA; - field public static final int SHARADA_ID = 217; // 0xd9 - field public static final android.icu.lang.UCharacter.UnicodeBlock SHAVIAN; - field public static final int SHAVIAN_ID = 121; // 0x79 - field public static final android.icu.lang.UCharacter.UnicodeBlock SHORTHAND_FORMAT_CONTROLS; - field public static final int SHORTHAND_FORMAT_CONTROLS_ID = 247; // 0xf7 - field public static final android.icu.lang.UCharacter.UnicodeBlock SIDDHAM; - field public static final int SIDDHAM_ID = 248; // 0xf8 - field public static final android.icu.lang.UCharacter.UnicodeBlock SINHALA; - field public static final android.icu.lang.UCharacter.UnicodeBlock SINHALA_ARCHAIC_NUMBERS; - field public static final int SINHALA_ARCHAIC_NUMBERS_ID = 249; // 0xf9 - field public static final int SINHALA_ID = 24; // 0x18 - field public static final android.icu.lang.UCharacter.UnicodeBlock SMALL_FORM_VARIANTS; - field public static final int SMALL_FORM_VARIANTS_ID = 84; // 0x54 - field public static final android.icu.lang.UCharacter.UnicodeBlock SMALL_KANA_EXTENSION; - field public static final int SMALL_KANA_EXTENSION_ID = 297; // 0x129 - field public static final android.icu.lang.UCharacter.UnicodeBlock SOGDIAN; - field public static final int SOGDIAN_ID = 291; // 0x123 - field public static final android.icu.lang.UCharacter.UnicodeBlock SORA_SOMPENG; - field public static final int SORA_SOMPENG_ID = 218; // 0xda - field public static final android.icu.lang.UCharacter.UnicodeBlock SOYOMBO; - field public static final int SOYOMBO_ID = 278; // 0x116 - field public static final android.icu.lang.UCharacter.UnicodeBlock SPACING_MODIFIER_LETTERS; - field public static final int SPACING_MODIFIER_LETTERS_ID = 6; // 0x6 - field public static final android.icu.lang.UCharacter.UnicodeBlock SPECIALS; - field public static final int SPECIALS_ID = 86; // 0x56 - field public static final android.icu.lang.UCharacter.UnicodeBlock SUNDANESE; - field public static final int SUNDANESE_ID = 155; // 0x9b - field public static final android.icu.lang.UCharacter.UnicodeBlock SUNDANESE_SUPPLEMENT; - field public static final int SUNDANESE_SUPPLEMENT_ID = 219; // 0xdb - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPERSCRIPTS_AND_SUBSCRIPTS; - field public static final int SUPERSCRIPTS_AND_SUBSCRIPTS_ID = 41; // 0x29 - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_ARROWS_A; - field public static final int SUPPLEMENTAL_ARROWS_A_ID = 103; // 0x67 - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_ARROWS_B; - field public static final int SUPPLEMENTAL_ARROWS_B_ID = 104; // 0x68 - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_ARROWS_C; - field public static final int SUPPLEMENTAL_ARROWS_C_ID = 250; // 0xfa - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_MATHEMATICAL_OPERATORS; - field public static final int SUPPLEMENTAL_MATHEMATICAL_OPERATORS_ID = 106; // 0x6a - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_PUNCTUATION; - field public static final int SUPPLEMENTAL_PUNCTUATION_ID = 142; // 0x8e - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS; - field public static final int SUPPLEMENTAL_SYMBOLS_AND_PICTOGRAPHS_ID = 261; // 0x105 - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_A; - field public static final int SUPPLEMENTARY_PRIVATE_USE_AREA_A_ID = 109; // 0x6d - field public static final android.icu.lang.UCharacter.UnicodeBlock SUPPLEMENTARY_PRIVATE_USE_AREA_B; - field public static final int SUPPLEMENTARY_PRIVATE_USE_AREA_B_ID = 110; // 0x6e - field public static final android.icu.lang.UCharacter.UnicodeBlock SUTTON_SIGNWRITING; - field public static final int SUTTON_SIGNWRITING_ID = 262; // 0x106 - field public static final android.icu.lang.UCharacter.UnicodeBlock SYLOTI_NAGRI; - field public static final int SYLOTI_NAGRI_ID = 143; // 0x8f - field public static final android.icu.lang.UCharacter.UnicodeBlock SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A; - field public static final int SYMBOLS_AND_PICTOGRAPHS_EXTENDED_A_ID = 298; // 0x12a - field public static final android.icu.lang.UCharacter.UnicodeBlock SYMBOLS_FOR_LEGACY_COMPUTING; - field public static final int SYMBOLS_FOR_LEGACY_COMPUTING_ID = 306; // 0x132 - field public static final android.icu.lang.UCharacter.UnicodeBlock SYRIAC; - field public static final int SYRIAC_ID = 13; // 0xd - field public static final android.icu.lang.UCharacter.UnicodeBlock SYRIAC_SUPPLEMENT; - field public static final int SYRIAC_SUPPLEMENT_ID = 279; // 0x117 - field public static final android.icu.lang.UCharacter.UnicodeBlock TAGALOG; - field public static final int TAGALOG_ID = 98; // 0x62 - field public static final android.icu.lang.UCharacter.UnicodeBlock TAGBANWA; - field public static final int TAGBANWA_ID = 101; // 0x65 - field public static final android.icu.lang.UCharacter.UnicodeBlock TAGS; - field public static final int TAGS_ID = 96; // 0x60 - field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_LE; - field public static final int TAI_LE_ID = 112; // 0x70 - field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_THAM; - field public static final int TAI_THAM_ID = 174; // 0xae - field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_VIET; - field public static final int TAI_VIET_ID = 183; // 0xb7 - field public static final android.icu.lang.UCharacter.UnicodeBlock TAI_XUAN_JING_SYMBOLS; - field public static final int TAI_XUAN_JING_SYMBOLS_ID = 124; // 0x7c - field public static final android.icu.lang.UCharacter.UnicodeBlock TAKRI; - field public static final int TAKRI_ID = 220; // 0xdc - field public static final android.icu.lang.UCharacter.UnicodeBlock TAMIL; - field public static final int TAMIL_ID = 20; // 0x14 - field public static final android.icu.lang.UCharacter.UnicodeBlock TAMIL_SUPPLEMENT; - field public static final int TAMIL_SUPPLEMENT_ID = 299; // 0x12b - field public static final android.icu.lang.UCharacter.UnicodeBlock TANGUT; - field public static final android.icu.lang.UCharacter.UnicodeBlock TANGUT_COMPONENTS; - field public static final int TANGUT_COMPONENTS_ID = 273; // 0x111 - field public static final int TANGUT_ID = 272; // 0x110 - field public static final android.icu.lang.UCharacter.UnicodeBlock TANGUT_SUPPLEMENT; - field public static final int TANGUT_SUPPLEMENT_ID = 307; // 0x133 - field public static final android.icu.lang.UCharacter.UnicodeBlock TELUGU; - field public static final int TELUGU_ID = 21; // 0x15 - field public static final android.icu.lang.UCharacter.UnicodeBlock THAANA; - field public static final int THAANA_ID = 14; // 0xe - field public static final android.icu.lang.UCharacter.UnicodeBlock THAI; - field public static final int THAI_ID = 25; // 0x19 - field public static final android.icu.lang.UCharacter.UnicodeBlock TIBETAN; - field public static final int TIBETAN_ID = 27; // 0x1b - field public static final android.icu.lang.UCharacter.UnicodeBlock TIFINAGH; - field public static final int TIFINAGH_ID = 144; // 0x90 - field public static final android.icu.lang.UCharacter.UnicodeBlock TIRHUTA; - field public static final int TIRHUTA_ID = 251; // 0xfb - field public static final android.icu.lang.UCharacter.UnicodeBlock TRANSPORT_AND_MAP_SYMBOLS; - field public static final int TRANSPORT_AND_MAP_SYMBOLS_ID = 207; // 0xcf - field public static final android.icu.lang.UCharacter.UnicodeBlock UGARITIC; - field public static final int UGARITIC_ID = 120; // 0x78 - field public static final android.icu.lang.UCharacter.UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS; - field public static final android.icu.lang.UCharacter.UnicodeBlock UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED; - field public static final int UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED_ID = 173; // 0xad - field public static final int UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_ID = 33; // 0x21 - field public static final android.icu.lang.UCharacter.UnicodeBlock VAI; - field public static final int VAI_ID = 159; // 0x9f - field public static final android.icu.lang.UCharacter.UnicodeBlock VARIATION_SELECTORS; - field public static final int VARIATION_SELECTORS_ID = 108; // 0x6c - field public static final android.icu.lang.UCharacter.UnicodeBlock VARIATION_SELECTORS_SUPPLEMENT; - field public static final int VARIATION_SELECTORS_SUPPLEMENT_ID = 125; // 0x7d - field public static final android.icu.lang.UCharacter.UnicodeBlock VEDIC_EXTENSIONS; - field public static final int VEDIC_EXTENSIONS_ID = 175; // 0xaf - field public static final android.icu.lang.UCharacter.UnicodeBlock VERTICAL_FORMS; - field public static final int VERTICAL_FORMS_ID = 145; // 0x91 - field public static final android.icu.lang.UCharacter.UnicodeBlock WANCHO; - field public static final int WANCHO_ID = 300; // 0x12c - field public static final android.icu.lang.UCharacter.UnicodeBlock WARANG_CITI; - field public static final int WARANG_CITI_ID = 252; // 0xfc - field public static final android.icu.lang.UCharacter.UnicodeBlock YEZIDI; - field public static final int YEZIDI_ID = 308; // 0x134 - field public static final android.icu.lang.UCharacter.UnicodeBlock YIJING_HEXAGRAM_SYMBOLS; - field public static final int YIJING_HEXAGRAM_SYMBOLS_ID = 116; // 0x74 - field public static final android.icu.lang.UCharacter.UnicodeBlock YI_RADICALS; - field public static final int YI_RADICALS_ID = 73; // 0x49 - field public static final android.icu.lang.UCharacter.UnicodeBlock YI_SYLLABLES; - field public static final int YI_SYLLABLES_ID = 72; // 0x48 - field public static final android.icu.lang.UCharacter.UnicodeBlock ZANABAZAR_SQUARE; - field public static final int ZANABAZAR_SQUARE_ID = 280; // 0x118 - } - - public static interface UCharacter.VerticalOrientation { - field public static final int ROTATED = 0; // 0x0 - field public static final int TRANSFORMED_ROTATED = 1; // 0x1 - field public static final int TRANSFORMED_UPRIGHT = 2; // 0x2 - field public static final int UPRIGHT = 3; // 0x3 - } - - public static interface UCharacter.WordBreak { - field public static final int ALETTER = 1; // 0x1 - field public static final int CR = 8; // 0x8 - field public static final int DOUBLE_QUOTE = 16; // 0x10 - field public static final int EXTEND = 9; // 0x9 - field public static final int EXTENDNUMLET = 7; // 0x7 - field public static final int E_BASE = 17; // 0x11 - field public static final int E_BASE_GAZ = 18; // 0x12 - field public static final int E_MODIFIER = 19; // 0x13 - field public static final int FORMAT = 2; // 0x2 - field public static final int GLUE_AFTER_ZWJ = 20; // 0x14 - field public static final int HEBREW_LETTER = 14; // 0xe - field public static final int KATAKANA = 3; // 0x3 - field public static final int LF = 10; // 0xa - field public static final int MIDLETTER = 4; // 0x4 - field public static final int MIDNUM = 5; // 0x5 - field public static final int MIDNUMLET = 11; // 0xb - field public static final int NEWLINE = 12; // 0xc - field public static final int NUMERIC = 6; // 0x6 - field public static final int OTHER = 0; // 0x0 - field public static final int REGIONAL_INDICATOR = 13; // 0xd - field public static final int SINGLE_QUOTE = 15; // 0xf - field public static final int WSEGSPACE = 22; // 0x16 - field public static final int ZWJ = 21; // 0x15 - } - - public final class UCharacterCategory implements android.icu.lang.UCharacterEnums.ECharacterCategory { - method public static String toString(int); - } - - public final class UCharacterDirection implements android.icu.lang.UCharacterEnums.ECharacterDirection { - method public static String toString(int); - } - - public class UCharacterEnums { - } - - public static interface UCharacterEnums.ECharacterCategory { - field public static final byte COMBINING_SPACING_MARK = 8; // 0x8 - field public static final byte CONNECTOR_PUNCTUATION = 22; // 0x16 - field public static final byte CONTROL = 15; // 0xf - field public static final byte CURRENCY_SYMBOL = 25; // 0x19 - field public static final byte DASH_PUNCTUATION = 19; // 0x13 - field public static final byte DECIMAL_DIGIT_NUMBER = 9; // 0x9 - field public static final byte ENCLOSING_MARK = 7; // 0x7 - field public static final byte END_PUNCTUATION = 21; // 0x15 - field public static final byte FINAL_PUNCTUATION = 29; // 0x1d - field public static final byte FINAL_QUOTE_PUNCTUATION = 29; // 0x1d - field public static final byte FORMAT = 16; // 0x10 - field public static final byte GENERAL_OTHER_TYPES = 0; // 0x0 - field public static final byte INITIAL_PUNCTUATION = 28; // 0x1c - field public static final byte INITIAL_QUOTE_PUNCTUATION = 28; // 0x1c - field public static final byte LETTER_NUMBER = 10; // 0xa - field public static final byte LINE_SEPARATOR = 13; // 0xd - field public static final byte LOWERCASE_LETTER = 2; // 0x2 - field public static final byte MATH_SYMBOL = 24; // 0x18 - field public static final byte MODIFIER_LETTER = 4; // 0x4 - field public static final byte MODIFIER_SYMBOL = 26; // 0x1a - field public static final byte NON_SPACING_MARK = 6; // 0x6 - field public static final byte OTHER_LETTER = 5; // 0x5 - field public static final byte OTHER_NUMBER = 11; // 0xb - field public static final byte OTHER_PUNCTUATION = 23; // 0x17 - field public static final byte OTHER_SYMBOL = 27; // 0x1b - field public static final byte PARAGRAPH_SEPARATOR = 14; // 0xe - field public static final byte PRIVATE_USE = 17; // 0x11 - field public static final byte SPACE_SEPARATOR = 12; // 0xc - field public static final byte START_PUNCTUATION = 20; // 0x14 - field public static final byte SURROGATE = 18; // 0x12 - field public static final byte TITLECASE_LETTER = 3; // 0x3 - field public static final byte UNASSIGNED = 0; // 0x0 - field public static final byte UPPERCASE_LETTER = 1; // 0x1 - } - - public static interface UCharacterEnums.ECharacterDirection { - field public static final int ARABIC_NUMBER = 5; // 0x5 - field public static final int BLOCK_SEPARATOR = 7; // 0x7 - field public static final int BOUNDARY_NEUTRAL = 18; // 0x12 - field public static final int COMMON_NUMBER_SEPARATOR = 6; // 0x6 - field public static final byte DIRECTIONALITY_ARABIC_NUMBER = 5; // 0x5 - field public static final byte DIRECTIONALITY_BOUNDARY_NEUTRAL = 18; // 0x12 - field public static final byte DIRECTIONALITY_COMMON_NUMBER_SEPARATOR = 6; // 0x6 - field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER = 2; // 0x2 - field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR = 3; // 0x3 - field public static final byte DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR = 4; // 0x4 - field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT = 0; // 0x0 - field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING = 11; // 0xb - field public static final byte DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE = 12; // 0xc - field public static final byte DIRECTIONALITY_NONSPACING_MARK = 17; // 0x11 - field public static final byte DIRECTIONALITY_OTHER_NEUTRALS = 10; // 0xa - field public static final byte DIRECTIONALITY_PARAGRAPH_SEPARATOR = 7; // 0x7 - field public static final byte DIRECTIONALITY_POP_DIRECTIONAL_FORMAT = 16; // 0x10 - field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT = 1; // 0x1 - field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC = 13; // 0xd - field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING = 14; // 0xe - field public static final byte DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE = 15; // 0xf - field public static final byte DIRECTIONALITY_SEGMENT_SEPARATOR = 8; // 0x8 - field public static final byte DIRECTIONALITY_UNDEFINED = -1; // 0xffffffff - field public static final byte DIRECTIONALITY_WHITESPACE = 9; // 0x9 - field public static final int DIR_NON_SPACING_MARK = 17; // 0x11 - field public static final int EUROPEAN_NUMBER = 2; // 0x2 - field public static final int EUROPEAN_NUMBER_SEPARATOR = 3; // 0x3 - field public static final int EUROPEAN_NUMBER_TERMINATOR = 4; // 0x4 - field public static final byte FIRST_STRONG_ISOLATE = 19; // 0x13 - field public static final int LEFT_TO_RIGHT = 0; // 0x0 - field public static final int LEFT_TO_RIGHT_EMBEDDING = 11; // 0xb - field public static final byte LEFT_TO_RIGHT_ISOLATE = 20; // 0x14 - field public static final int LEFT_TO_RIGHT_OVERRIDE = 12; // 0xc - field public static final int OTHER_NEUTRAL = 10; // 0xa - field public static final int POP_DIRECTIONAL_FORMAT = 16; // 0x10 - field public static final byte POP_DIRECTIONAL_ISOLATE = 22; // 0x16 - field public static final int RIGHT_TO_LEFT = 1; // 0x1 - field public static final int RIGHT_TO_LEFT_ARABIC = 13; // 0xd - field public static final int RIGHT_TO_LEFT_EMBEDDING = 14; // 0xe - field public static final byte RIGHT_TO_LEFT_ISOLATE = 21; // 0x15 - field public static final int RIGHT_TO_LEFT_OVERRIDE = 15; // 0xf - field public static final int SEGMENT_SEPARATOR = 8; // 0x8 - field public static final int WHITE_SPACE_NEUTRAL = 9; // 0x9 - } - - public interface UProperty { - field public static final int AGE = 16384; // 0x4000 - field public static final int ALPHABETIC = 0; // 0x0 - field public static final int ASCII_HEX_DIGIT = 1; // 0x1 - field public static final int BIDI_CLASS = 4096; // 0x1000 - field public static final int BIDI_CONTROL = 2; // 0x2 - field public static final int BIDI_MIRRORED = 3; // 0x3 - field public static final int BIDI_MIRRORING_GLYPH = 16385; // 0x4001 - field public static final int BIDI_PAIRED_BRACKET = 16397; // 0x400d - field public static final int BIDI_PAIRED_BRACKET_TYPE = 4117; // 0x1015 - field public static final int BINARY_START = 0; // 0x0 - field public static final int BLOCK = 4097; // 0x1001 - field public static final int CANONICAL_COMBINING_CLASS = 4098; // 0x1002 - field public static final int CASED = 49; // 0x31 - field public static final int CASE_FOLDING = 16386; // 0x4002 - field public static final int CASE_IGNORABLE = 50; // 0x32 - field public static final int CASE_SENSITIVE = 34; // 0x22 - field public static final int CHANGES_WHEN_CASEFOLDED = 54; // 0x36 - field public static final int CHANGES_WHEN_CASEMAPPED = 55; // 0x37 - field public static final int CHANGES_WHEN_LOWERCASED = 51; // 0x33 - field public static final int CHANGES_WHEN_NFKC_CASEFOLDED = 56; // 0x38 - field public static final int CHANGES_WHEN_TITLECASED = 53; // 0x35 - field public static final int CHANGES_WHEN_UPPERCASED = 52; // 0x34 - field public static final int DASH = 4; // 0x4 - field public static final int DECOMPOSITION_TYPE = 4099; // 0x1003 - field public static final int DEFAULT_IGNORABLE_CODE_POINT = 5; // 0x5 - field public static final int DEPRECATED = 6; // 0x6 - field public static final int DIACRITIC = 7; // 0x7 - field public static final int DOUBLE_START = 12288; // 0x3000 - field public static final int EAST_ASIAN_WIDTH = 4100; // 0x1004 - field public static final int EMOJI = 57; // 0x39 - field public static final int EMOJI_COMPONENT = 61; // 0x3d - field public static final int EMOJI_MODIFIER = 59; // 0x3b - field public static final int EMOJI_MODIFIER_BASE = 60; // 0x3c - field public static final int EMOJI_PRESENTATION = 58; // 0x3a - field public static final int EXTENDED_PICTOGRAPHIC = 64; // 0x40 - field public static final int EXTENDER = 8; // 0x8 - field public static final int FULL_COMPOSITION_EXCLUSION = 9; // 0x9 - field public static final int GENERAL_CATEGORY = 4101; // 0x1005 - field public static final int GENERAL_CATEGORY_MASK = 8192; // 0x2000 - field public static final int GRAPHEME_BASE = 10; // 0xa - field public static final int GRAPHEME_CLUSTER_BREAK = 4114; // 0x1012 - field public static final int GRAPHEME_EXTEND = 11; // 0xb - field public static final int GRAPHEME_LINK = 12; // 0xc - field public static final int HANGUL_SYLLABLE_TYPE = 4107; // 0x100b - field public static final int HEX_DIGIT = 13; // 0xd - field public static final int HYPHEN = 14; // 0xe - field public static final int IDEOGRAPHIC = 17; // 0x11 - field public static final int IDS_BINARY_OPERATOR = 18; // 0x12 - field public static final int IDS_TRINARY_OPERATOR = 19; // 0x13 - field public static final int ID_CONTINUE = 15; // 0xf - field public static final int ID_START = 16; // 0x10 - field public static final int INDIC_POSITIONAL_CATEGORY = 4118; // 0x1016 - field public static final int INDIC_SYLLABIC_CATEGORY = 4119; // 0x1017 - field public static final int INT_START = 4096; // 0x1000 - field public static final int JOINING_GROUP = 4102; // 0x1006 - field public static final int JOINING_TYPE = 4103; // 0x1007 - field public static final int JOIN_CONTROL = 20; // 0x14 - field public static final int LEAD_CANONICAL_COMBINING_CLASS = 4112; // 0x1010 - field public static final int LINE_BREAK = 4104; // 0x1008 - field public static final int LOGICAL_ORDER_EXCEPTION = 21; // 0x15 - field public static final int LOWERCASE = 22; // 0x16 - field public static final int LOWERCASE_MAPPING = 16388; // 0x4004 - field public static final int MASK_START = 8192; // 0x2000 - field public static final int MATH = 23; // 0x17 - field public static final int NAME = 16389; // 0x4005 - field public static final int NFC_INERT = 39; // 0x27 - field public static final int NFC_QUICK_CHECK = 4110; // 0x100e - field public static final int NFD_INERT = 37; // 0x25 - field public static final int NFD_QUICK_CHECK = 4108; // 0x100c - field public static final int NFKC_INERT = 40; // 0x28 - field public static final int NFKC_QUICK_CHECK = 4111; // 0x100f - field public static final int NFKD_INERT = 38; // 0x26 - field public static final int NFKD_QUICK_CHECK = 4109; // 0x100d - field public static final int NONCHARACTER_CODE_POINT = 24; // 0x18 - field public static final int NUMERIC_TYPE = 4105; // 0x1009 - field public static final int NUMERIC_VALUE = 12288; // 0x3000 - field public static final int OTHER_PROPERTY_START = 28672; // 0x7000 - field public static final int PATTERN_SYNTAX = 42; // 0x2a - field public static final int PATTERN_WHITE_SPACE = 43; // 0x2b - field public static final int POSIX_ALNUM = 44; // 0x2c - field public static final int POSIX_BLANK = 45; // 0x2d - field public static final int POSIX_GRAPH = 46; // 0x2e - field public static final int POSIX_PRINT = 47; // 0x2f - field public static final int POSIX_XDIGIT = 48; // 0x30 - field public static final int PREPENDED_CONCATENATION_MARK = 63; // 0x3f - field public static final int QUOTATION_MARK = 25; // 0x19 - field public static final int RADICAL = 26; // 0x1a - field public static final int REGIONAL_INDICATOR = 62; // 0x3e - field public static final int SCRIPT = 4106; // 0x100a - field public static final int SCRIPT_EXTENSIONS = 28672; // 0x7000 - field public static final int SEGMENT_STARTER = 41; // 0x29 - field public static final int SENTENCE_BREAK = 4115; // 0x1013 - field public static final int SIMPLE_CASE_FOLDING = 16390; // 0x4006 - field public static final int SIMPLE_LOWERCASE_MAPPING = 16391; // 0x4007 - field public static final int SIMPLE_TITLECASE_MAPPING = 16392; // 0x4008 - field public static final int SIMPLE_UPPERCASE_MAPPING = 16393; // 0x4009 - field public static final int SOFT_DOTTED = 27; // 0x1b - field public static final int STRING_START = 16384; // 0x4000 - field public static final int S_TERM = 35; // 0x23 - field public static final int TERMINAL_PUNCTUATION = 28; // 0x1c - field public static final int TITLECASE_MAPPING = 16394; // 0x400a - field public static final int TRAIL_CANONICAL_COMBINING_CLASS = 4113; // 0x1011 - field public static final int UNIFIED_IDEOGRAPH = 29; // 0x1d - field public static final int UPPERCASE = 30; // 0x1e - field public static final int UPPERCASE_MAPPING = 16396; // 0x400c - field public static final int VARIATION_SELECTOR = 36; // 0x24 - field public static final int VERTICAL_ORIENTATION = 4120; // 0x1018 - field public static final int WHITE_SPACE = 31; // 0x1f - field public static final int WORD_BREAK = 4116; // 0x1014 - field public static final int XID_CONTINUE = 32; // 0x20 - field public static final int XID_START = 33; // 0x21 - } - - public static interface UProperty.NameChoice { - field public static final int LONG = 1; // 0x1 - field public static final int SHORT = 0; // 0x0 - } - - public final class UScript { - method public static boolean breaksBetweenLetters(int); - method public static int[] getCode(java.util.Locale); - method public static int[] getCode(android.icu.util.ULocale); - method public static int[] getCode(String); - method public static int getCodeFromName(String); - method public static String getName(int); - method public static String getSampleString(int); - method public static int getScript(int); - method public static int getScriptExtensions(int, java.util.BitSet); - method public static String getShortName(int); - method public static android.icu.lang.UScript.ScriptUsage getUsage(int); - method public static boolean hasScript(int, int); - method public static boolean isCased(int); - method public static boolean isRightToLeft(int); - field public static final int ADLAM = 167; // 0xa7 - field public static final int AFAKA = 147; // 0x93 - field public static final int AHOM = 161; // 0xa1 - field public static final int ANATOLIAN_HIEROGLYPHS = 156; // 0x9c - field public static final int ARABIC = 2; // 0x2 - field public static final int ARMENIAN = 3; // 0x3 - field public static final int AVESTAN = 117; // 0x75 - field public static final int BALINESE = 62; // 0x3e - field public static final int BAMUM = 130; // 0x82 - field public static final int BASSA_VAH = 134; // 0x86 - field public static final int BATAK = 63; // 0x3f - field public static final int BENGALI = 4; // 0x4 - field public static final int BHAIKSUKI = 168; // 0xa8 - field public static final int BLISSYMBOLS = 64; // 0x40 - field public static final int BOOK_PAHLAVI = 124; // 0x7c - field public static final int BOPOMOFO = 5; // 0x5 - field public static final int BRAHMI = 65; // 0x41 - field public static final int BRAILLE = 46; // 0x2e - field public static final int BUGINESE = 55; // 0x37 - field public static final int BUHID = 44; // 0x2c - field public static final int CANADIAN_ABORIGINAL = 40; // 0x28 - field public static final int CARIAN = 104; // 0x68 - field public static final int CAUCASIAN_ALBANIAN = 159; // 0x9f - field public static final int CHAKMA = 118; // 0x76 - field public static final int CHAM = 66; // 0x42 - field public static final int CHEROKEE = 6; // 0x6 - field public static final int CHORASMIAN = 189; // 0xbd - field public static final int CIRTH = 67; // 0x43 - field public static final int COMMON = 0; // 0x0 - field public static final int COPTIC = 7; // 0x7 - field public static final int CUNEIFORM = 101; // 0x65 - field public static final int CYPRIOT = 47; // 0x2f - field public static final int CYRILLIC = 8; // 0x8 - field public static final int DEMOTIC_EGYPTIAN = 69; // 0x45 - field public static final int DESERET = 9; // 0x9 - field public static final int DEVANAGARI = 10; // 0xa - field public static final int DIVES_AKURU = 190; // 0xbe - field public static final int DOGRA = 178; // 0xb2 - field public static final int DUPLOYAN = 135; // 0x87 - field public static final int EASTERN_SYRIAC = 97; // 0x61 - field public static final int EGYPTIAN_HIEROGLYPHS = 71; // 0x47 - field public static final int ELBASAN = 136; // 0x88 - field public static final int ELYMAIC = 185; // 0xb9 - field public static final int ESTRANGELO_SYRIAC = 95; // 0x5f - field public static final int ETHIOPIC = 11; // 0xb - field public static final int GEORGIAN = 12; // 0xc - field public static final int GLAGOLITIC = 56; // 0x38 - field public static final int GOTHIC = 13; // 0xd - field public static final int GRANTHA = 137; // 0x89 - field public static final int GREEK = 14; // 0xe - field public static final int GUJARATI = 15; // 0xf - field public static final int GUNJALA_GONDI = 179; // 0xb3 - field public static final int GURMUKHI = 16; // 0x10 - field public static final int HAN = 17; // 0x11 - field public static final int HANGUL = 18; // 0x12 - field public static final int HANIFI_ROHINGYA = 182; // 0xb6 - field public static final int HANUNOO = 43; // 0x2b - field public static final int HAN_WITH_BOPOMOFO = 172; // 0xac - field public static final int HARAPPAN_INDUS = 77; // 0x4d - field public static final int HATRAN = 162; // 0xa2 - field public static final int HEBREW = 19; // 0x13 - field public static final int HIERATIC_EGYPTIAN = 70; // 0x46 - field public static final int HIRAGANA = 20; // 0x14 - field public static final int IMPERIAL_ARAMAIC = 116; // 0x74 - field public static final int INHERITED = 1; // 0x1 - field public static final int INSCRIPTIONAL_PAHLAVI = 122; // 0x7a - field public static final int INSCRIPTIONAL_PARTHIAN = 125; // 0x7d - field public static final int INVALID_CODE = -1; // 0xffffffff - field public static final int JAMO = 173; // 0xad - field public static final int JAPANESE = 105; // 0x69 - field public static final int JAVANESE = 78; // 0x4e - field public static final int JURCHEN = 148; // 0x94 - field public static final int KAITHI = 120; // 0x78 - field public static final int KANNADA = 21; // 0x15 - field public static final int KATAKANA = 22; // 0x16 - field public static final int KATAKANA_OR_HIRAGANA = 54; // 0x36 - field public static final int KAYAH_LI = 79; // 0x4f - field public static final int KHAROSHTHI = 57; // 0x39 - field public static final int KHITAN_SMALL_SCRIPT = 191; // 0xbf - field public static final int KHMER = 23; // 0x17 - field public static final int KHOJKI = 157; // 0x9d - field public static final int KHUDAWADI = 145; // 0x91 - field public static final int KHUTSURI = 72; // 0x48 - field public static final int KOREAN = 119; // 0x77 - field public static final int KPELLE = 138; // 0x8a - field public static final int LANNA = 106; // 0x6a - field public static final int LAO = 24; // 0x18 - field public static final int LATIN = 25; // 0x19 - field public static final int LATIN_FRAKTUR = 80; // 0x50 - field public static final int LATIN_GAELIC = 81; // 0x51 - field public static final int LEPCHA = 82; // 0x52 - field public static final int LIMBU = 48; // 0x30 - field public static final int LINEAR_A = 83; // 0x53 - field public static final int LINEAR_B = 49; // 0x31 - field public static final int LISU = 131; // 0x83 - field public static final int LOMA = 139; // 0x8b - field public static final int LYCIAN = 107; // 0x6b - field public static final int LYDIAN = 108; // 0x6c - field public static final int MAHAJANI = 160; // 0xa0 - field public static final int MAKASAR = 180; // 0xb4 - field public static final int MALAYALAM = 26; // 0x1a - field public static final int MANDAEAN = 84; // 0x54 - field public static final int MANDAIC = 84; // 0x54 - field public static final int MANICHAEAN = 121; // 0x79 - field public static final int MARCHEN = 169; // 0xa9 - field public static final int MASARAM_GONDI = 175; // 0xaf - field public static final int MATHEMATICAL_NOTATION = 128; // 0x80 - field public static final int MAYAN_HIEROGLYPHS = 85; // 0x55 - field public static final int MEDEFAIDRIN = 181; // 0xb5 - field public static final int MEITEI_MAYEK = 115; // 0x73 - field public static final int MENDE = 140; // 0x8c - field public static final int MEROITIC = 86; // 0x56 - field public static final int MEROITIC_CURSIVE = 141; // 0x8d - field public static final int MEROITIC_HIEROGLYPHS = 86; // 0x56 - field public static final int MIAO = 92; // 0x5c - field public static final int MODI = 163; // 0xa3 - field public static final int MONGOLIAN = 27; // 0x1b - field public static final int MOON = 114; // 0x72 - field public static final int MRO = 149; // 0x95 - field public static final int MULTANI = 164; // 0xa4 - field public static final int MYANMAR = 28; // 0x1c - field public static final int NABATAEAN = 143; // 0x8f - field public static final int NAKHI_GEBA = 132; // 0x84 - field public static final int NANDINAGARI = 187; // 0xbb - field public static final int NEWA = 170; // 0xaa - field public static final int NEW_TAI_LUE = 59; // 0x3b - field public static final int NKO = 87; // 0x57 - field public static final int NUSHU = 150; // 0x96 - field public static final int NYIAKENG_PUACHUE_HMONG = 186; // 0xba - field public static final int OGHAM = 29; // 0x1d - field public static final int OLD_CHURCH_SLAVONIC_CYRILLIC = 68; // 0x44 - field public static final int OLD_HUNGARIAN = 76; // 0x4c - field public static final int OLD_ITALIC = 30; // 0x1e - field public static final int OLD_NORTH_ARABIAN = 142; // 0x8e - field public static final int OLD_PERMIC = 89; // 0x59 - field public static final int OLD_PERSIAN = 61; // 0x3d - field public static final int OLD_SOGDIAN = 184; // 0xb8 - field public static final int OLD_SOUTH_ARABIAN = 133; // 0x85 - field public static final int OL_CHIKI = 109; // 0x6d - field public static final int ORIYA = 31; // 0x1f - field public static final int ORKHON = 88; // 0x58 - field public static final int OSAGE = 171; // 0xab - field public static final int OSMANYA = 50; // 0x32 - field public static final int PAHAWH_HMONG = 75; // 0x4b - field public static final int PALMYRENE = 144; // 0x90 - field public static final int PAU_CIN_HAU = 165; // 0xa5 - field public static final int PHAGS_PA = 90; // 0x5a - field public static final int PHOENICIAN = 91; // 0x5b - field public static final int PHONETIC_POLLARD = 92; // 0x5c - field public static final int PSALTER_PAHLAVI = 123; // 0x7b - field public static final int REJANG = 110; // 0x6e - field public static final int RONGORONGO = 93; // 0x5d - field public static final int RUNIC = 32; // 0x20 - field public static final int SAMARITAN = 126; // 0x7e - field public static final int SARATI = 94; // 0x5e - field public static final int SAURASHTRA = 111; // 0x6f - field public static final int SHARADA = 151; // 0x97 - field public static final int SHAVIAN = 51; // 0x33 - field public static final int SIDDHAM = 166; // 0xa6 - field public static final int SIGN_WRITING = 112; // 0x70 - field public static final int SIMPLIFIED_HAN = 73; // 0x49 - field public static final int SINDHI = 145; // 0x91 - field public static final int SINHALA = 33; // 0x21 - field public static final int SOGDIAN = 183; // 0xb7 - field public static final int SORA_SOMPENG = 152; // 0x98 - field public static final int SOYOMBO = 176; // 0xb0 - field public static final int SUNDANESE = 113; // 0x71 - field public static final int SYLOTI_NAGRI = 58; // 0x3a - field public static final int SYMBOLS = 129; // 0x81 - field public static final int SYMBOLS_EMOJI = 174; // 0xae - field public static final int SYRIAC = 34; // 0x22 - field public static final int TAGALOG = 42; // 0x2a - field public static final int TAGBANWA = 45; // 0x2d - field public static final int TAI_LE = 52; // 0x34 - field public static final int TAI_VIET = 127; // 0x7f - field public static final int TAKRI = 153; // 0x99 - field public static final int TAMIL = 35; // 0x23 - field public static final int TANGUT = 154; // 0x9a - field public static final int TELUGU = 36; // 0x24 - field public static final int TENGWAR = 98; // 0x62 - field public static final int THAANA = 37; // 0x25 - field public static final int THAI = 38; // 0x26 - field public static final int TIBETAN = 39; // 0x27 - field public static final int TIFINAGH = 60; // 0x3c - field public static final int TIRHUTA = 158; // 0x9e - field public static final int TRADITIONAL_HAN = 74; // 0x4a - field public static final int UCAS = 40; // 0x28 - field public static final int UGARITIC = 53; // 0x35 - field public static final int UNKNOWN = 103; // 0x67 - field public static final int UNWRITTEN_LANGUAGES = 102; // 0x66 - field public static final int VAI = 99; // 0x63 - field public static final int VISIBLE_SPEECH = 100; // 0x64 - field public static final int WANCHO = 188; // 0xbc - field public static final int WARANG_CITI = 146; // 0x92 - field public static final int WESTERN_SYRIAC = 96; // 0x60 - field public static final int WOLEAI = 155; // 0x9b - field public static final int YEZIDI = 192; // 0xc0 - field public static final int YI = 41; // 0x29 - field public static final int ZANABAZAR_SQUARE = 177; // 0xb1 - } - - public enum UScript.ScriptUsage { - enum_constant public static final android.icu.lang.UScript.ScriptUsage ASPIRATIONAL; - enum_constant public static final android.icu.lang.UScript.ScriptUsage EXCLUDED; - enum_constant public static final android.icu.lang.UScript.ScriptUsage LIMITED_USE; - enum_constant public static final android.icu.lang.UScript.ScriptUsage NOT_ENCODED; - enum_constant public static final android.icu.lang.UScript.ScriptUsage RECOMMENDED; - enum_constant public static final android.icu.lang.UScript.ScriptUsage UNKNOWN; - } - -} - -package android.icu.math { - - public class BigDecimal extends java.lang.Number implements java.lang.Comparable<android.icu.math.BigDecimal> java.io.Serializable { - ctor public BigDecimal(java.math.BigDecimal); - ctor public BigDecimal(java.math.BigInteger); - ctor public BigDecimal(java.math.BigInteger, int); - ctor public BigDecimal(char[]); - ctor public BigDecimal(char[], int, int); - ctor public BigDecimal(double); - ctor public BigDecimal(int); - ctor public BigDecimal(long); - ctor public BigDecimal(String); - method public android.icu.math.BigDecimal abs(); - method public android.icu.math.BigDecimal abs(android.icu.math.MathContext); - method public android.icu.math.BigDecimal add(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal add(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public byte byteValueExact(); - method public int compareTo(android.icu.math.BigDecimal); - method public int compareTo(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal, int); - method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal, int, int); - method public android.icu.math.BigDecimal divide(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public android.icu.math.BigDecimal divideInteger(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal divideInteger(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public double doubleValue(); - method public float floatValue(); - method public String format(int, int); - method public String format(int, int, int, int, int, int); - method public int intValue(); - method public int intValueExact(); - method public long longValue(); - method public long longValueExact(); - method public android.icu.math.BigDecimal max(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal max(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public android.icu.math.BigDecimal min(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal min(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public android.icu.math.BigDecimal movePointLeft(int); - method public android.icu.math.BigDecimal movePointRight(int); - method public android.icu.math.BigDecimal multiply(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal multiply(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public android.icu.math.BigDecimal negate(); - method public android.icu.math.BigDecimal negate(android.icu.math.MathContext); - method public android.icu.math.BigDecimal plus(); - method public android.icu.math.BigDecimal plus(android.icu.math.MathContext); - method public android.icu.math.BigDecimal pow(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal pow(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public android.icu.math.BigDecimal remainder(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal remainder(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public int scale(); - method public android.icu.math.BigDecimal setScale(int); - method public android.icu.math.BigDecimal setScale(int, int); - method public short shortValueExact(); - method public int signum(); - method public android.icu.math.BigDecimal subtract(android.icu.math.BigDecimal); - method public android.icu.math.BigDecimal subtract(android.icu.math.BigDecimal, android.icu.math.MathContext); - method public java.math.BigDecimal toBigDecimal(); - method public java.math.BigInteger toBigInteger(); - method public java.math.BigInteger toBigIntegerExact(); - method public char[] toCharArray(); - method public java.math.BigInteger unscaledValue(); - method public static android.icu.math.BigDecimal valueOf(double); - method public static android.icu.math.BigDecimal valueOf(long); - method public static android.icu.math.BigDecimal valueOf(long, int); - field public static final android.icu.math.BigDecimal ONE; - field public static final int ROUND_CEILING = 2; // 0x2 - field public static final int ROUND_DOWN = 1; // 0x1 - field public static final int ROUND_FLOOR = 3; // 0x3 - field public static final int ROUND_HALF_DOWN = 5; // 0x5 - field public static final int ROUND_HALF_EVEN = 6; // 0x6 - field public static final int ROUND_HALF_UP = 4; // 0x4 - field public static final int ROUND_UNNECESSARY = 7; // 0x7 - field public static final int ROUND_UP = 0; // 0x0 - field public static final android.icu.math.BigDecimal TEN; - field public static final android.icu.math.BigDecimal ZERO; - } - - public final class MathContext implements java.io.Serializable { - ctor public MathContext(int); - ctor public MathContext(int, int); - ctor public MathContext(int, int, boolean); - ctor public MathContext(int, int, boolean, int); - method public int getDigits(); - method public int getForm(); - method public boolean getLostDigits(); - method public int getRoundingMode(); - field public static final android.icu.math.MathContext DEFAULT; - field public static final int ENGINEERING = 2; // 0x2 - field public static final int PLAIN = 0; // 0x0 - field public static final int ROUND_CEILING = 2; // 0x2 - field public static final int ROUND_DOWN = 1; // 0x1 - field public static final int ROUND_FLOOR = 3; // 0x3 - field public static final int ROUND_HALF_DOWN = 5; // 0x5 - field public static final int ROUND_HALF_EVEN = 6; // 0x6 - field public static final int ROUND_HALF_UP = 4; // 0x4 - field public static final int ROUND_UNNECESSARY = 7; // 0x7 - field public static final int ROUND_UP = 0; // 0x0 - field public static final int SCIENTIFIC = 1; // 0x1 - } - -} - -package android.icu.number { - - public class CompactNotation extends android.icu.number.Notation { - } - - public abstract class CurrencyPrecision extends android.icu.number.Precision { - method public android.icu.number.Precision withCurrency(android.icu.util.Currency); - } - - public class FormattedNumber implements java.lang.CharSequence { - method public char charAt(int); - method public int length(); - method public CharSequence subSequence(int, int); - method public java.math.BigDecimal toBigDecimal(); - method public java.text.AttributedCharacterIterator toCharacterIterator(); - } - - public class FormattedNumberRange implements java.lang.CharSequence { - method public char charAt(int); - method public java.math.BigDecimal getFirstBigDecimal(); - method public android.icu.number.NumberRangeFormatter.RangeIdentityResult getIdentityResult(); - method public java.math.BigDecimal getSecondBigDecimal(); - method public int length(); - method public CharSequence subSequence(int, int); - method public java.text.AttributedCharacterIterator toCharacterIterator(); - } - - public abstract class FractionPrecision extends android.icu.number.Precision { - method public android.icu.number.Precision withMaxDigits(int); - method public android.icu.number.Precision withMinDigits(int); - } - - public class IntegerWidth { - method public android.icu.number.IntegerWidth truncateAt(int); - method public static android.icu.number.IntegerWidth zeroFillTo(int); - } - - public class LocalizedNumberFormatter extends android.icu.number.NumberFormatterSettings<android.icu.number.LocalizedNumberFormatter> { - method public android.icu.number.FormattedNumber format(long); - method public android.icu.number.FormattedNumber format(double); - method public android.icu.number.FormattedNumber format(Number); - method public android.icu.number.FormattedNumber format(android.icu.util.Measure); - method public java.text.Format toFormat(); - } - - public class LocalizedNumberRangeFormatter extends android.icu.number.NumberRangeFormatterSettings<android.icu.number.LocalizedNumberRangeFormatter> { - method public android.icu.number.FormattedNumberRange formatRange(int, int); - method public android.icu.number.FormattedNumberRange formatRange(double, double); - method public android.icu.number.FormattedNumberRange formatRange(Number, Number); - } - - public class Notation { - method public static android.icu.number.CompactNotation compactLong(); - method public static android.icu.number.CompactNotation compactShort(); - method public static android.icu.number.ScientificNotation engineering(); - method public static android.icu.number.ScientificNotation scientific(); - method public static android.icu.number.SimpleNotation simple(); - } - - public final class NumberFormatter { - method public static android.icu.number.UnlocalizedNumberFormatter with(); - method public static android.icu.number.LocalizedNumberFormatter withLocale(java.util.Locale); - method public static android.icu.number.LocalizedNumberFormatter withLocale(android.icu.util.ULocale); - } - - public enum NumberFormatter.DecimalSeparatorDisplay { - enum_constant public static final android.icu.number.NumberFormatter.DecimalSeparatorDisplay ALWAYS; - enum_constant public static final android.icu.number.NumberFormatter.DecimalSeparatorDisplay AUTO; - } - - public enum NumberFormatter.GroupingStrategy { - enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy AUTO; - enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy MIN2; - enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy OFF; - enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy ON_ALIGNED; - enum_constant public static final android.icu.number.NumberFormatter.GroupingStrategy THOUSANDS; - } - - public enum NumberFormatter.SignDisplay { - enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ACCOUNTING; - enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ACCOUNTING_ALWAYS; - enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ACCOUNTING_EXCEPT_ZERO; - enum_constant public static final android.icu.number.NumberFormatter.SignDisplay ALWAYS; - enum_constant public static final android.icu.number.NumberFormatter.SignDisplay AUTO; - enum_constant public static final android.icu.number.NumberFormatter.SignDisplay EXCEPT_ZERO; - enum_constant public static final android.icu.number.NumberFormatter.SignDisplay NEVER; - } - - public enum NumberFormatter.UnitWidth { - enum_constant public static final android.icu.number.NumberFormatter.UnitWidth FULL_NAME; - enum_constant public static final android.icu.number.NumberFormatter.UnitWidth HIDDEN; - enum_constant public static final android.icu.number.NumberFormatter.UnitWidth ISO_CODE; - enum_constant public static final android.icu.number.NumberFormatter.UnitWidth NARROW; - enum_constant public static final android.icu.number.NumberFormatter.UnitWidth SHORT; - } - - public abstract class NumberFormatterSettings<T extends android.icu.number.NumberFormatterSettings<?>> { - method public T decimal(android.icu.number.NumberFormatter.DecimalSeparatorDisplay); - method public T grouping(android.icu.number.NumberFormatter.GroupingStrategy); - method public T integerWidth(android.icu.number.IntegerWidth); - method public T notation(android.icu.number.Notation); - method public T perUnit(android.icu.util.MeasureUnit); - method public T precision(android.icu.number.Precision); - method public T roundingMode(java.math.RoundingMode); - method public T scale(android.icu.number.Scale); - method public T sign(android.icu.number.NumberFormatter.SignDisplay); - method public T symbols(android.icu.text.DecimalFormatSymbols); - method public T symbols(android.icu.text.NumberingSystem); - method public T unit(android.icu.util.MeasureUnit); - method public T unitWidth(android.icu.number.NumberFormatter.UnitWidth); - } - - public abstract class NumberRangeFormatter { - method public static android.icu.number.UnlocalizedNumberRangeFormatter with(); - method public static android.icu.number.LocalizedNumberRangeFormatter withLocale(java.util.Locale); - method public static android.icu.number.LocalizedNumberRangeFormatter withLocale(android.icu.util.ULocale); - } - - public enum NumberRangeFormatter.RangeCollapse { - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse ALL; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse AUTO; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse NONE; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeCollapse UNIT; - } - - public enum NumberRangeFormatter.RangeIdentityFallback { - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback APPROXIMATELY; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback APPROXIMATELY_OR_SINGLE_VALUE; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback RANGE; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityFallback SINGLE_VALUE; - } - - public enum NumberRangeFormatter.RangeIdentityResult { - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityResult EQUAL_AFTER_ROUNDING; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityResult EQUAL_BEFORE_ROUNDING; - enum_constant public static final android.icu.number.NumberRangeFormatter.RangeIdentityResult NOT_EQUAL; - } - - public abstract class NumberRangeFormatterSettings<T extends android.icu.number.NumberRangeFormatterSettings<?>> { - method public T collapse(android.icu.number.NumberRangeFormatter.RangeCollapse); - method public T identityFallback(android.icu.number.NumberRangeFormatter.RangeIdentityFallback); - method public T numberFormatterBoth(android.icu.number.UnlocalizedNumberFormatter); - method public T numberFormatterFirst(android.icu.number.UnlocalizedNumberFormatter); - method public T numberFormatterSecond(android.icu.number.UnlocalizedNumberFormatter); - } - - public abstract class Precision { - method public static android.icu.number.CurrencyPrecision currency(android.icu.util.Currency.CurrencyUsage); - method public static android.icu.number.FractionPrecision fixedFraction(int); - method public static android.icu.number.Precision fixedSignificantDigits(int); - method public static android.icu.number.Precision increment(java.math.BigDecimal); - method public static android.icu.number.FractionPrecision integer(); - method public static android.icu.number.FractionPrecision maxFraction(int); - method public static android.icu.number.Precision maxSignificantDigits(int); - method public static android.icu.number.FractionPrecision minFraction(int); - method public static android.icu.number.FractionPrecision minMaxFraction(int, int); - method public static android.icu.number.Precision minMaxSignificantDigits(int, int); - method public static android.icu.number.Precision minSignificantDigits(int); - method public static android.icu.number.Precision unlimited(); - } - - public class Scale { - method public static android.icu.number.Scale byBigDecimal(java.math.BigDecimal); - method public static android.icu.number.Scale byDouble(double); - method public static android.icu.number.Scale byDoubleAndPowerOfTen(double, int); - method public static android.icu.number.Scale none(); - method public static android.icu.number.Scale powerOfTen(int); - } - - public class ScientificNotation extends android.icu.number.Notation { - method public android.icu.number.ScientificNotation withExponentSignDisplay(android.icu.number.NumberFormatter.SignDisplay); - method public android.icu.number.ScientificNotation withMinExponentDigits(int); - } - - public class SimpleNotation extends android.icu.number.Notation { - } - - public class UnlocalizedNumberFormatter extends android.icu.number.NumberFormatterSettings<android.icu.number.UnlocalizedNumberFormatter> { - method public android.icu.number.LocalizedNumberFormatter locale(java.util.Locale); - method public android.icu.number.LocalizedNumberFormatter locale(android.icu.util.ULocale); - } - - public class UnlocalizedNumberRangeFormatter extends android.icu.number.NumberRangeFormatterSettings<android.icu.number.UnlocalizedNumberRangeFormatter> { - method public android.icu.number.LocalizedNumberRangeFormatter locale(java.util.Locale); - method public android.icu.number.LocalizedNumberRangeFormatter locale(android.icu.util.ULocale); - } - -} - -package android.icu.text { - - public final class AlphabeticIndex<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Bucket<V>> { - ctor public AlphabeticIndex(android.icu.util.ULocale); - ctor public AlphabeticIndex(java.util.Locale); - ctor public AlphabeticIndex(android.icu.text.RuleBasedCollator); - method public android.icu.text.AlphabeticIndex<V> addLabels(android.icu.text.UnicodeSet); - method public android.icu.text.AlphabeticIndex<V> addLabels(android.icu.util.ULocale...); - method public android.icu.text.AlphabeticIndex<V> addLabels(java.util.Locale...); - method public android.icu.text.AlphabeticIndex<V> addRecord(CharSequence, V); - method public android.icu.text.AlphabeticIndex.ImmutableIndex<V> buildImmutableIndex(); - method public android.icu.text.AlphabeticIndex<V> clearRecords(); - method public int getBucketCount(); - method public int getBucketIndex(CharSequence); - method public java.util.List<java.lang.String> getBucketLabels(); - method public android.icu.text.RuleBasedCollator getCollator(); - method public String getInflowLabel(); - method public int getMaxLabelCount(); - method public String getOverflowLabel(); - method public int getRecordCount(); - method public String getUnderflowLabel(); - method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator(); - method public android.icu.text.AlphabeticIndex<V> setInflowLabel(String); - method public android.icu.text.AlphabeticIndex<V> setMaxLabelCount(int); - method public android.icu.text.AlphabeticIndex<V> setOverflowLabel(String); - method public android.icu.text.AlphabeticIndex<V> setUnderflowLabel(String); - } - - public static class AlphabeticIndex.Bucket<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Record<V>> { - method public String getLabel(); - method public android.icu.text.AlphabeticIndex.Bucket.LabelType getLabelType(); - method public java.util.Iterator<android.icu.text.AlphabeticIndex.Record<V>> iterator(); - method public int size(); - } - - public enum AlphabeticIndex.Bucket.LabelType { - enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType INFLOW; - enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType NORMAL; - enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType OVERFLOW; - enum_constant public static final android.icu.text.AlphabeticIndex.Bucket.LabelType UNDERFLOW; - } - - public static final class AlphabeticIndex.ImmutableIndex<V> implements java.lang.Iterable<android.icu.text.AlphabeticIndex.Bucket<V>> { - method public android.icu.text.AlphabeticIndex.Bucket<V> getBucket(int); - method public int getBucketCount(); - method public int getBucketIndex(CharSequence); - method public java.util.Iterator<android.icu.text.AlphabeticIndex.Bucket<V>> iterator(); - } - - public static class AlphabeticIndex.Record<V> { - method public V getData(); - method public CharSequence getName(); - } - - public class Bidi { - ctor public Bidi(); - ctor public Bidi(int, int); - ctor public Bidi(String, int); - ctor public Bidi(java.text.AttributedCharacterIterator); - ctor public Bidi(char[], int, byte[], int, int, int); - method public boolean baseIsLeftToRight(); - method public int countParagraphs(); - method public int countRuns(); - method public android.icu.text.Bidi createLineBidi(int, int); - method public static byte getBaseDirection(CharSequence); - method public int getBaseLevel(); - method public android.icu.text.BidiClassifier getCustomClassifier(); - method public int getCustomizedClass(int); - method public byte getDirection(); - method public int getLength(); - method public byte getLevelAt(int); - method public byte[] getLevels(); - method public int getLogicalIndex(int); - method public int[] getLogicalMap(); - method public android.icu.text.BidiRun getLogicalRun(int); - method public byte getParaLevel(); - method public android.icu.text.BidiRun getParagraph(int); - method public android.icu.text.BidiRun getParagraphByIndex(int); - method public int getParagraphIndex(int); - method public int getProcessedLength(); - method public int getReorderingMode(); - method public int getReorderingOptions(); - method public int getResultLength(); - method public int getRunCount(); - method public int getRunLevel(int); - method public int getRunLimit(int); - method public int getRunStart(int); - method public char[] getText(); - method public String getTextAsString(); - method public int getVisualIndex(int); - method public int[] getVisualMap(); - method public android.icu.text.BidiRun getVisualRun(int); - method public static int[] invertMap(int[]); - method public boolean isInverse(); - method public boolean isLeftToRight(); - method public boolean isMixed(); - method public boolean isOrderParagraphsLTR(); - method public boolean isRightToLeft(); - method public void orderParagraphsLTR(boolean); - method public static int[] reorderLogical(byte[]); - method public static int[] reorderVisual(byte[]); - method public static void reorderVisually(byte[], int, Object[], int, int); - method public static boolean requiresBidi(char[], int, int); - method public void setContext(String, String); - method public void setCustomClassifier(android.icu.text.BidiClassifier); - method public void setInverse(boolean); - method public android.icu.text.Bidi setLine(int, int); - method public void setPara(String, byte, byte[]); - method public void setPara(char[], byte, byte[]); - method public void setPara(java.text.AttributedCharacterIterator); - method public void setReorderingMode(int); - method public void setReorderingOptions(int); - method public String writeReordered(int); - method public static String writeReverse(String, int); - field public static final int DIRECTION_DEFAULT_LEFT_TO_RIGHT = 126; // 0x7e - field public static final int DIRECTION_DEFAULT_RIGHT_TO_LEFT = 127; // 0x7f - field public static final int DIRECTION_LEFT_TO_RIGHT = 0; // 0x0 - field public static final int DIRECTION_RIGHT_TO_LEFT = 1; // 0x1 - field public static final short DO_MIRRORING = 2; // 0x2 - field public static final short INSERT_LRM_FOR_NUMERIC = 4; // 0x4 - field public static final short KEEP_BASE_COMBINING = 1; // 0x1 - field public static final byte LEVEL_DEFAULT_LTR = 126; // 0x7e - field public static final byte LEVEL_DEFAULT_RTL = 127; // 0x7f - field public static final byte LEVEL_OVERRIDE = -128; // 0xffffff80 - field public static final byte LTR = 0; // 0x0 - field public static final int MAP_NOWHERE = -1; // 0xffffffff - field public static final byte MAX_EXPLICIT_LEVEL = 125; // 0x7d - field public static final byte MIXED = 2; // 0x2 - field public static final byte NEUTRAL = 3; // 0x3 - field public static final int OPTION_DEFAULT = 0; // 0x0 - field public static final int OPTION_INSERT_MARKS = 1; // 0x1 - field public static final int OPTION_REMOVE_CONTROLS = 2; // 0x2 - field public static final int OPTION_STREAMING = 4; // 0x4 - field public static final short OUTPUT_REVERSE = 16; // 0x10 - field public static final short REMOVE_BIDI_CONTROLS = 8; // 0x8 - field public static final short REORDER_DEFAULT = 0; // 0x0 - field public static final short REORDER_GROUP_NUMBERS_WITH_R = 2; // 0x2 - field public static final short REORDER_INVERSE_FOR_NUMBERS_SPECIAL = 6; // 0x6 - field public static final short REORDER_INVERSE_LIKE_DIRECT = 5; // 0x5 - field public static final short REORDER_INVERSE_NUMBERS_AS_L = 4; // 0x4 - field public static final short REORDER_NUMBERS_SPECIAL = 1; // 0x1 - field public static final short REORDER_RUNS_ONLY = 3; // 0x3 - field public static final byte RTL = 1; // 0x1 - } - - public class BidiClassifier { - ctor public BidiClassifier(Object); - method public int classify(int); - method public Object getContext(); - method public void setContext(Object); - } - - public class BidiRun { - method public byte getDirection(); - method public byte getEmbeddingLevel(); - method public int getLength(); - method public int getLimit(); - method public int getStart(); - method public boolean isEvenRun(); - method public boolean isOddRun(); - } - - public abstract class BreakIterator implements java.lang.Cloneable { - ctor protected BreakIterator(); - method public Object clone(); - method public abstract int current(); - method public abstract int first(); - method public abstract int following(int); - method public static java.util.Locale[] getAvailableLocales(); - method public static android.icu.text.BreakIterator getCharacterInstance(); - method public static android.icu.text.BreakIterator getCharacterInstance(java.util.Locale); - method public static android.icu.text.BreakIterator getCharacterInstance(android.icu.util.ULocale); - method public static android.icu.text.BreakIterator getLineInstance(); - method public static android.icu.text.BreakIterator getLineInstance(java.util.Locale); - method public static android.icu.text.BreakIterator getLineInstance(android.icu.util.ULocale); - method public int getRuleStatus(); - method public int getRuleStatusVec(int[]); - method public static android.icu.text.BreakIterator getSentenceInstance(); - method public static android.icu.text.BreakIterator getSentenceInstance(java.util.Locale); - method public static android.icu.text.BreakIterator getSentenceInstance(android.icu.util.ULocale); - method public abstract java.text.CharacterIterator getText(); - method @Deprecated public static android.icu.text.BreakIterator getTitleInstance(); - method @Deprecated public static android.icu.text.BreakIterator getTitleInstance(java.util.Locale); - method @Deprecated public static android.icu.text.BreakIterator getTitleInstance(android.icu.util.ULocale); - method public static android.icu.text.BreakIterator getWordInstance(); - method public static android.icu.text.BreakIterator getWordInstance(java.util.Locale); - method public static android.icu.text.BreakIterator getWordInstance(android.icu.util.ULocale); - method public boolean isBoundary(int); - method public abstract int last(); - method public abstract int next(int); - method public abstract int next(); - method public int preceding(int); - method public abstract int previous(); - method public void setText(String); - method public void setText(CharSequence); - method public abstract void setText(java.text.CharacterIterator); - field public static final int DONE = -1; // 0xffffffff - field public static final int KIND_CHARACTER = 0; // 0x0 - field public static final int KIND_LINE = 2; // 0x2 - field public static final int KIND_SENTENCE = 3; // 0x3 - field @Deprecated public static final int KIND_TITLE = 4; // 0x4 - field public static final int KIND_WORD = 1; // 0x1 - field public static final int WORD_IDEO = 400; // 0x190 - field public static final int WORD_IDEO_LIMIT = 500; // 0x1f4 - field public static final int WORD_KANA = 300; // 0x12c - field public static final int WORD_KANA_LIMIT = 400; // 0x190 - field public static final int WORD_LETTER = 200; // 0xc8 - field public static final int WORD_LETTER_LIMIT = 300; // 0x12c - field public static final int WORD_NONE = 0; // 0x0 - field public static final int WORD_NONE_LIMIT = 100; // 0x64 - field public static final int WORD_NUMBER = 100; // 0x64 - field public static final int WORD_NUMBER_LIMIT = 200; // 0xc8 - } - - public abstract class CaseMap { - method public static android.icu.text.CaseMap.Fold fold(); - method public abstract android.icu.text.CaseMap omitUnchangedText(); - method public static android.icu.text.CaseMap.Lower toLower(); - method public static android.icu.text.CaseMap.Title toTitle(); - method public static android.icu.text.CaseMap.Upper toUpper(); - } - - public static final class CaseMap.Fold extends android.icu.text.CaseMap { - method public String apply(CharSequence); - method public <A extends java.lang.Appendable> A apply(CharSequence, A, android.icu.text.Edits); - method public android.icu.text.CaseMap.Fold omitUnchangedText(); - method public android.icu.text.CaseMap.Fold turkic(); - } - - public static final class CaseMap.Lower extends android.icu.text.CaseMap { - method public String apply(java.util.Locale, CharSequence); - method public <A extends java.lang.Appendable> A apply(java.util.Locale, CharSequence, A, android.icu.text.Edits); - method public android.icu.text.CaseMap.Lower omitUnchangedText(); - } - - public static final class CaseMap.Title extends android.icu.text.CaseMap { - method public android.icu.text.CaseMap.Title adjustToCased(); - method public String apply(java.util.Locale, android.icu.text.BreakIterator, CharSequence); - method public <A extends java.lang.Appendable> A apply(java.util.Locale, android.icu.text.BreakIterator, CharSequence, A, android.icu.text.Edits); - method public android.icu.text.CaseMap.Title noBreakAdjustment(); - method public android.icu.text.CaseMap.Title noLowercase(); - method public android.icu.text.CaseMap.Title omitUnchangedText(); - method public android.icu.text.CaseMap.Title sentences(); - method public android.icu.text.CaseMap.Title wholeString(); - } - - public static final class CaseMap.Upper extends android.icu.text.CaseMap { - method public String apply(java.util.Locale, CharSequence); - method public <A extends java.lang.Appendable> A apply(java.util.Locale, CharSequence, A, android.icu.text.Edits); - method public android.icu.text.CaseMap.Upper omitUnchangedText(); - } - - public final class CollationElementIterator { - method public int getMaxExpansion(int); - method public int getOffset(); - method public int next(); - method public int previous(); - method public static int primaryOrder(int); - method public void reset(); - method public static int secondaryOrder(int); - method public void setOffset(int); - method public void setText(String); - method public void setText(android.icu.text.UCharacterIterator); - method public void setText(java.text.CharacterIterator); - method public static int tertiaryOrder(int); - field public static final int IGNORABLE = 0; // 0x0 - field public static final int NULLORDER = -1; // 0xffffffff - } - - public final class CollationKey implements java.lang.Comparable<android.icu.text.CollationKey> { - ctor public CollationKey(String, byte[]); - method public int compareTo(android.icu.text.CollationKey); - method public boolean equals(android.icu.text.CollationKey); - method public android.icu.text.CollationKey getBound(int, int); - method public String getSourceString(); - method public android.icu.text.CollationKey merge(android.icu.text.CollationKey); - method public byte[] toByteArray(); - } - - public static final class CollationKey.BoundMode { - field public static final int LOWER = 0; // 0x0 - field public static final int UPPER = 1; // 0x1 - field public static final int UPPER_LONG = 2; // 0x2 - } - - public abstract class Collator implements java.lang.Cloneable java.util.Comparator<java.lang.Object> android.icu.util.Freezable<android.icu.text.Collator> { - ctor protected Collator(); - method public Object clone() throws java.lang.CloneNotSupportedException; - method public android.icu.text.Collator cloneAsThawed(); - method public abstract int compare(String, String); - method public int compare(Object, Object); - method public boolean equals(String, String); - method public android.icu.text.Collator freeze(); - method public static java.util.Locale[] getAvailableLocales(); - method public static final android.icu.util.ULocale[] getAvailableULocales(); - method public abstract android.icu.text.CollationKey getCollationKey(String); - method public int getDecomposition(); - method public static String getDisplayName(java.util.Locale, java.util.Locale); - method public static String getDisplayName(android.icu.util.ULocale, android.icu.util.ULocale); - method public static String getDisplayName(java.util.Locale); - method public static String getDisplayName(android.icu.util.ULocale); - method public static int[] getEquivalentReorderCodes(int); - method public static final android.icu.util.ULocale getFunctionalEquivalent(String, android.icu.util.ULocale, boolean[]); - method public static final android.icu.util.ULocale getFunctionalEquivalent(String, android.icu.util.ULocale); - method public static final android.icu.text.Collator getInstance(); - method public static final android.icu.text.Collator getInstance(android.icu.util.ULocale); - method public static final android.icu.text.Collator getInstance(java.util.Locale); - method public static final String[] getKeywordValues(String); - method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean); - method public static final String[] getKeywords(); - method public int getMaxVariable(); - method public int[] getReorderCodes(); - method public int getStrength(); - method public android.icu.text.UnicodeSet getTailoredSet(); - method public abstract android.icu.util.VersionInfo getUCAVersion(); - method public abstract int getVariableTop(); - method public abstract android.icu.util.VersionInfo getVersion(); - method public boolean isFrozen(); - method public void setDecomposition(int); - method public android.icu.text.Collator setMaxVariable(int); - method public void setReorderCodes(int...); - method public void setStrength(int); - field public static final int CANONICAL_DECOMPOSITION = 17; // 0x11 - field public static final int FULL_DECOMPOSITION = 15; // 0xf - field public static final int IDENTICAL = 15; // 0xf - field public static final int NO_DECOMPOSITION = 16; // 0x10 - field public static final int PRIMARY = 0; // 0x0 - field public static final int QUATERNARY = 3; // 0x3 - field public static final int SECONDARY = 1; // 0x1 - field public static final int TERTIARY = 2; // 0x2 - } - - public static interface Collator.ReorderCodes { - field public static final int CURRENCY = 4099; // 0x1003 - field public static final int DEFAULT = -1; // 0xffffffff - field public static final int DIGIT = 4100; // 0x1004 - field public static final int FIRST = 4096; // 0x1000 - field public static final int NONE = 103; // 0x67 - field public static final int OTHERS = 103; // 0x67 - field public static final int PUNCTUATION = 4097; // 0x1001 - field public static final int SPACE = 4096; // 0x1000 - field public static final int SYMBOL = 4098; // 0x1002 - } - - public class CompactDecimalFormat extends android.icu.text.DecimalFormat { - method public static android.icu.text.CompactDecimalFormat getInstance(android.icu.util.ULocale, android.icu.text.CompactDecimalFormat.CompactStyle); - method public static android.icu.text.CompactDecimalFormat getInstance(java.util.Locale, android.icu.text.CompactDecimalFormat.CompactStyle); - } - - public enum CompactDecimalFormat.CompactStyle { - enum_constant public static final android.icu.text.CompactDecimalFormat.CompactStyle LONG; - enum_constant public static final android.icu.text.CompactDecimalFormat.CompactStyle SHORT; - } - - public class CurrencyPluralInfo implements java.lang.Cloneable java.io.Serializable { - ctor public CurrencyPluralInfo(); - ctor public CurrencyPluralInfo(java.util.Locale); - ctor public CurrencyPluralInfo(android.icu.util.ULocale); - method public Object clone(); - method public String getCurrencyPluralPattern(String); - method public static android.icu.text.CurrencyPluralInfo getInstance(); - method public static android.icu.text.CurrencyPluralInfo getInstance(java.util.Locale); - method public static android.icu.text.CurrencyPluralInfo getInstance(android.icu.util.ULocale); - method public android.icu.util.ULocale getLocale(); - method public android.icu.text.PluralRules getPluralRules(); - method public void setCurrencyPluralPattern(String, String); - method public void setLocale(android.icu.util.ULocale); - method public void setPluralRules(String); - } - - public abstract class DateFormat extends android.icu.text.UFormat { - ctor protected DateFormat(); - method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public abstract StringBuffer format(android.icu.util.Calendar, StringBuffer, java.text.FieldPosition); - method public StringBuffer format(java.util.Date, StringBuffer, java.text.FieldPosition); - method public final String format(java.util.Date); - method public static java.util.Locale[] getAvailableLocales(); - method public boolean getBooleanAttribute(android.icu.text.DateFormat.BooleanAttribute); - method public android.icu.util.Calendar getCalendar(); - method public android.icu.text.DisplayContext getContext(android.icu.text.DisplayContext.Type); - method public static final android.icu.text.DateFormat getDateInstance(); - method public static final android.icu.text.DateFormat getDateInstance(int); - method public static final android.icu.text.DateFormat getDateInstance(int, java.util.Locale); - method public static final android.icu.text.DateFormat getDateInstance(int, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getDateInstance(android.icu.util.Calendar, int, java.util.Locale); - method public static final android.icu.text.DateFormat getDateInstance(android.icu.util.Calendar, int, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getDateInstance(android.icu.util.Calendar, int); - method public static final android.icu.text.DateFormat getDateTimeInstance(); - method public static final android.icu.text.DateFormat getDateTimeInstance(int, int); - method public static final android.icu.text.DateFormat getDateTimeInstance(int, int, java.util.Locale); - method public static final android.icu.text.DateFormat getDateTimeInstance(int, int, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getDateTimeInstance(android.icu.util.Calendar, int, int, java.util.Locale); - method public static final android.icu.text.DateFormat getDateTimeInstance(android.icu.util.Calendar, int, int, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getDateTimeInstance(android.icu.util.Calendar, int, int); - method public static final android.icu.text.DateFormat getInstance(); - method public static final android.icu.text.DateFormat getInstance(android.icu.util.Calendar, java.util.Locale); - method public static final android.icu.text.DateFormat getInstance(android.icu.util.Calendar); - method public static final android.icu.text.DateFormat getInstanceForSkeleton(String); - method public static final android.icu.text.DateFormat getInstanceForSkeleton(String, java.util.Locale); - method public static final android.icu.text.DateFormat getInstanceForSkeleton(String, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, String, java.util.Locale); - method public static final android.icu.text.DateFormat getInstanceForSkeleton(android.icu.util.Calendar, String, android.icu.util.ULocale); - method public android.icu.text.NumberFormat getNumberFormat(); - method public static final android.icu.text.DateFormat getPatternInstance(String); - method public static final android.icu.text.DateFormat getPatternInstance(String, java.util.Locale); - method public static final android.icu.text.DateFormat getPatternInstance(String, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, String, java.util.Locale); - method public static final android.icu.text.DateFormat getPatternInstance(android.icu.util.Calendar, String, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getTimeInstance(); - method public static final android.icu.text.DateFormat getTimeInstance(int); - method public static final android.icu.text.DateFormat getTimeInstance(int, java.util.Locale); - method public static final android.icu.text.DateFormat getTimeInstance(int, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getTimeInstance(android.icu.util.Calendar, int, java.util.Locale); - method public static final android.icu.text.DateFormat getTimeInstance(android.icu.util.Calendar, int, android.icu.util.ULocale); - method public static final android.icu.text.DateFormat getTimeInstance(android.icu.util.Calendar, int); - method public android.icu.util.TimeZone getTimeZone(); - method public boolean isCalendarLenient(); - method public boolean isLenient(); - method public java.util.Date parse(String) throws java.text.ParseException; - method public abstract void parse(String, android.icu.util.Calendar, java.text.ParsePosition); - method public java.util.Date parse(String, java.text.ParsePosition); - method public Object parseObject(String, java.text.ParsePosition); - method public android.icu.text.DateFormat setBooleanAttribute(android.icu.text.DateFormat.BooleanAttribute, boolean); - method public void setCalendar(android.icu.util.Calendar); - method public void setCalendarLenient(boolean); - method public void setContext(android.icu.text.DisplayContext); - method public void setLenient(boolean); - method public void setNumberFormat(android.icu.text.NumberFormat); - method public void setTimeZone(android.icu.util.TimeZone); - field public static final String ABBR_GENERIC_TZ = "v"; - field public static final String ABBR_MONTH = "MMM"; - field public static final String ABBR_MONTH_DAY = "MMMd"; - field public static final String ABBR_MONTH_WEEKDAY_DAY = "MMMEd"; - field public static final String ABBR_QUARTER = "QQQ"; - field public static final String ABBR_SPECIFIC_TZ = "z"; - field public static final String ABBR_UTC_TZ = "ZZZZ"; - field public static final String ABBR_WEEKDAY = "E"; - field public static final int AM_PM_FIELD = 14; // 0xe - field public static final int AM_PM_MIDNIGHT_NOON_FIELD = 35; // 0x23 - field public static final int DATE_FIELD = 3; // 0x3 - field public static final String DAY = "d"; - field public static final int DAY_OF_WEEK_FIELD = 9; // 0x9 - field public static final int DAY_OF_WEEK_IN_MONTH_FIELD = 11; // 0xb - field public static final int DAY_OF_YEAR_FIELD = 10; // 0xa - field public static final int DEFAULT = 2; // 0x2 - field public static final int DOW_LOCAL_FIELD = 19; // 0x13 - field public static final int ERA_FIELD = 0; // 0x0 - field public static final int EXTENDED_YEAR_FIELD = 20; // 0x14 - field public static final int FLEXIBLE_DAY_PERIOD_FIELD = 36; // 0x24 - field public static final int FRACTIONAL_SECOND_FIELD = 8; // 0x8 - field public static final int FULL = 0; // 0x0 - field public static final String GENERIC_TZ = "vvvv"; - field public static final String HOUR = "j"; - field public static final int HOUR0_FIELD = 16; // 0x10 - field public static final int HOUR1_FIELD = 15; // 0xf - field public static final String HOUR24 = "H"; - field public static final String HOUR24_MINUTE = "Hm"; - field public static final String HOUR24_MINUTE_SECOND = "Hms"; - field public static final String HOUR_MINUTE = "jm"; - field public static final String HOUR_MINUTE_SECOND = "jms"; - field public static final int HOUR_OF_DAY0_FIELD = 5; // 0x5 - field public static final int HOUR_OF_DAY1_FIELD = 4; // 0x4 - field public static final int JULIAN_DAY_FIELD = 21; // 0x15 - field public static final String LOCATION_TZ = "VVVV"; - field public static final int LONG = 1; // 0x1 - field public static final int MEDIUM = 2; // 0x2 - field public static final int MILLISECONDS_IN_DAY_FIELD = 22; // 0x16 - field public static final int MILLISECOND_FIELD = 8; // 0x8 - field public static final String MINUTE = "m"; - field public static final int MINUTE_FIELD = 6; // 0x6 - field public static final String MINUTE_SECOND = "ms"; - field public static final String MONTH = "MMMM"; - field public static final String MONTH_DAY = "MMMMd"; - field public static final int MONTH_FIELD = 2; // 0x2 - field public static final String MONTH_WEEKDAY_DAY = "MMMMEEEEd"; - field public static final int NONE = -1; // 0xffffffff - field public static final String NUM_MONTH = "M"; - field public static final String NUM_MONTH_DAY = "Md"; - field public static final String NUM_MONTH_WEEKDAY_DAY = "MEd"; - field public static final String QUARTER = "QQQQ"; - field public static final int QUARTER_FIELD = 27; // 0x1b - field public static final int RELATIVE = 128; // 0x80 - field public static final int RELATIVE_DEFAULT = 130; // 0x82 - field public static final int RELATIVE_FULL = 128; // 0x80 - field public static final int RELATIVE_LONG = 129; // 0x81 - field public static final int RELATIVE_MEDIUM = 130; // 0x82 - field public static final int RELATIVE_SHORT = 131; // 0x83 - field public static final String SECOND = "s"; - field public static final int SECOND_FIELD = 7; // 0x7 - field public static final int SHORT = 3; // 0x3 - field public static final String SPECIFIC_TZ = "zzzz"; - field public static final int STANDALONE_DAY_FIELD = 25; // 0x19 - field public static final int STANDALONE_MONTH_FIELD = 26; // 0x1a - field public static final int STANDALONE_QUARTER_FIELD = 28; // 0x1c - field public static final int TIMEZONE_FIELD = 17; // 0x11 - field public static final int TIMEZONE_GENERIC_FIELD = 24; // 0x18 - field public static final int TIMEZONE_ISO_FIELD = 32; // 0x20 - field public static final int TIMEZONE_ISO_LOCAL_FIELD = 33; // 0x21 - field public static final int TIMEZONE_LOCALIZED_GMT_OFFSET_FIELD = 31; // 0x1f - field public static final int TIMEZONE_RFC_FIELD = 23; // 0x17 - field public static final int TIMEZONE_SPECIAL_FIELD = 29; // 0x1d - field public static final String WEEKDAY = "EEEE"; - field public static final int WEEK_OF_MONTH_FIELD = 13; // 0xd - field public static final int WEEK_OF_YEAR_FIELD = 12; // 0xc - field public static final String YEAR = "y"; - field public static final String YEAR_ABBR_MONTH = "yMMM"; - field public static final String YEAR_ABBR_MONTH_DAY = "yMMMd"; - field public static final String YEAR_ABBR_MONTH_WEEKDAY_DAY = "yMMMEd"; - field public static final String YEAR_ABBR_QUARTER = "yQQQ"; - field public static final int YEAR_FIELD = 1; // 0x1 - field public static final String YEAR_MONTH = "yMMMM"; - field public static final String YEAR_MONTH_DAY = "yMMMMd"; - field public static final String YEAR_MONTH_WEEKDAY_DAY = "yMMMMEEEEd"; - field public static final int YEAR_NAME_FIELD = 30; // 0x1e - field public static final String YEAR_NUM_MONTH = "yM"; - field public static final String YEAR_NUM_MONTH_DAY = "yMd"; - field public static final String YEAR_NUM_MONTH_WEEKDAY_DAY = "yMEd"; - field public static final String YEAR_QUARTER = "yQQQQ"; - field public static final int YEAR_WOY_FIELD = 18; // 0x12 - field protected android.icu.util.Calendar calendar; - field protected android.icu.text.NumberFormat numberFormat; - } - - public enum DateFormat.BooleanAttribute { - enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_ALLOW_NUMERIC; - enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_ALLOW_WHITESPACE; - enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_MULTIPLE_PATTERNS_FOR_MATCH; - enum_constant public static final android.icu.text.DateFormat.BooleanAttribute PARSE_PARTIAL_LITERAL_MATCH; - } - - public static class DateFormat.Field extends java.text.Format.Field { - ctor protected DateFormat.Field(String, int); - method public int getCalendarField(); - method public static android.icu.text.DateFormat.Field ofCalendarField(int); - field public static final android.icu.text.DateFormat.Field AM_PM; - field public static final android.icu.text.DateFormat.Field AM_PM_MIDNIGHT_NOON; - field public static final android.icu.text.DateFormat.Field DAY_OF_MONTH; - field public static final android.icu.text.DateFormat.Field DAY_OF_WEEK; - field public static final android.icu.text.DateFormat.Field DAY_OF_WEEK_IN_MONTH; - field public static final android.icu.text.DateFormat.Field DAY_OF_YEAR; - field public static final android.icu.text.DateFormat.Field DOW_LOCAL; - field public static final android.icu.text.DateFormat.Field ERA; - field public static final android.icu.text.DateFormat.Field EXTENDED_YEAR; - field public static final android.icu.text.DateFormat.Field FLEXIBLE_DAY_PERIOD; - field public static final android.icu.text.DateFormat.Field HOUR0; - field public static final android.icu.text.DateFormat.Field HOUR1; - field public static final android.icu.text.DateFormat.Field HOUR_OF_DAY0; - field public static final android.icu.text.DateFormat.Field HOUR_OF_DAY1; - field public static final android.icu.text.DateFormat.Field JULIAN_DAY; - field public static final android.icu.text.DateFormat.Field MILLISECOND; - field public static final android.icu.text.DateFormat.Field MILLISECONDS_IN_DAY; - field public static final android.icu.text.DateFormat.Field MINUTE; - field public static final android.icu.text.DateFormat.Field MONTH; - field public static final android.icu.text.DateFormat.Field QUARTER; - field public static final android.icu.text.DateFormat.Field SECOND; - field public static final android.icu.text.DateFormat.Field TIME_ZONE; - field public static final android.icu.text.DateFormat.Field WEEK_OF_MONTH; - field public static final android.icu.text.DateFormat.Field WEEK_OF_YEAR; - field public static final android.icu.text.DateFormat.Field YEAR; - field public static final android.icu.text.DateFormat.Field YEAR_WOY; - } - - public class DateFormatSymbols implements java.lang.Cloneable java.io.Serializable { - ctor public DateFormatSymbols(); - ctor public DateFormatSymbols(java.util.Locale); - ctor public DateFormatSymbols(android.icu.util.ULocale); - ctor public DateFormatSymbols(android.icu.util.Calendar, java.util.Locale); - ctor public DateFormatSymbols(android.icu.util.Calendar, android.icu.util.ULocale); - ctor public DateFormatSymbols(Class<? extends android.icu.util.Calendar>, java.util.Locale); - ctor public DateFormatSymbols(Class<? extends android.icu.util.Calendar>, android.icu.util.ULocale); - ctor public DateFormatSymbols(java.util.ResourceBundle, java.util.Locale); - ctor public DateFormatSymbols(java.util.ResourceBundle, android.icu.util.ULocale); - method public Object clone(); - method public String[] getAmPmStrings(); - method public static java.util.Locale[] getAvailableLocales(); - method public String[] getEraNames(); - method public String[] getEras(); - method public static android.icu.text.DateFormatSymbols getInstance(); - method public static android.icu.text.DateFormatSymbols getInstance(java.util.Locale); - method public static android.icu.text.DateFormatSymbols getInstance(android.icu.util.ULocale); - method public String getLocalPatternChars(); - method public String[] getMonths(); - method public String[] getMonths(int, int); - method public String[] getQuarters(int, int); - method public String[] getShortMonths(); - method public String[] getShortWeekdays(); - method public String[] getWeekdays(); - method public String[] getWeekdays(int, int); - method public String[] getYearNames(int, int); - method public String[] getZodiacNames(int, int); - method public String[][] getZoneStrings(); - method protected void initializeData(android.icu.util.ULocale, String); - method public void setAmPmStrings(String[]); - method public void setEraNames(String[]); - method public void setEras(String[]); - method public void setLocalPatternChars(String); - method public void setMonths(String[]); - method public void setMonths(String[], int, int); - method public void setQuarters(String[], int, int); - method public void setShortMonths(String[]); - method public void setShortWeekdays(String[]); - method public void setWeekdays(String[], int, int); - method public void setWeekdays(String[]); - method public void setYearNames(String[], int, int); - method public void setZodiacNames(String[], int, int); - method public void setZoneStrings(String[][]); - field public static final int ABBREVIATED = 0; // 0x0 - field public static final int FORMAT = 0; // 0x0 - field public static final int NARROW = 2; // 0x2 - field public static final int SHORT = 3; // 0x3 - field public static final int STANDALONE = 1; // 0x1 - field public static final int WIDE = 1; // 0x1 - } - - public class DateIntervalFormat extends android.icu.text.UFormat { - method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public final StringBuffer format(android.icu.util.DateInterval, StringBuffer, java.text.FieldPosition); - method public final StringBuffer format(android.icu.util.Calendar, android.icu.util.Calendar, StringBuffer, java.text.FieldPosition); - method public android.icu.text.DateFormat getDateFormat(); - method public android.icu.text.DateIntervalInfo getDateIntervalInfo(); - method public static final android.icu.text.DateIntervalFormat getInstance(String); - method public static final android.icu.text.DateIntervalFormat getInstance(String, java.util.Locale); - method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.util.ULocale); - method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.text.DateIntervalInfo); - method public static final android.icu.text.DateIntervalFormat getInstance(String, java.util.Locale, android.icu.text.DateIntervalInfo); - method public static final android.icu.text.DateIntervalFormat getInstance(String, android.icu.util.ULocale, android.icu.text.DateIntervalInfo); - method public android.icu.util.TimeZone getTimeZone(); - method @Deprecated public Object parseObject(String, java.text.ParsePosition); - method public void setDateIntervalInfo(android.icu.text.DateIntervalInfo); - method public void setTimeZone(android.icu.util.TimeZone); - } - - public class DateIntervalInfo implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.DateIntervalInfo> java.io.Serializable { - ctor public DateIntervalInfo(android.icu.util.ULocale); - ctor public DateIntervalInfo(java.util.Locale); - method public Object clone(); - method public android.icu.text.DateIntervalInfo cloneAsThawed(); - method public android.icu.text.DateIntervalInfo freeze(); - method public boolean getDefaultOrder(); - method public String getFallbackIntervalPattern(); - method public android.icu.text.DateIntervalInfo.PatternInfo getIntervalPattern(String, int); - method public boolean isFrozen(); - method public void setFallbackIntervalPattern(String); - method public void setIntervalPattern(String, int, String); - } - - public static final class DateIntervalInfo.PatternInfo implements java.lang.Cloneable java.io.Serializable { - ctor public DateIntervalInfo.PatternInfo(String, String, boolean); - method public boolean firstDateInPtnIsLaterDate(); - method public String getFirstPart(); - method public String getSecondPart(); - } - - public class DateTimePatternGenerator implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.DateTimePatternGenerator> { - ctor protected DateTimePatternGenerator(); - method public android.icu.text.DateTimePatternGenerator addPattern(String, boolean, android.icu.text.DateTimePatternGenerator.PatternInfo); - method public Object clone(); - method public android.icu.text.DateTimePatternGenerator cloneAsThawed(); - method public android.icu.text.DateTimePatternGenerator freeze(); - method public String getAppendItemFormat(int); - method public String getAppendItemName(int); - method public String getBaseSkeleton(String); - method public java.util.Set<java.lang.String> getBaseSkeletons(java.util.Set<java.lang.String>); - method public String getBestPattern(String); - method public String getBestPattern(String, int); - method public String getDateTimeFormat(); - method public String getDecimal(); - method public static android.icu.text.DateTimePatternGenerator getEmptyInstance(); - method public String getFieldDisplayName(int, android.icu.text.DateTimePatternGenerator.DisplayWidth); - method public static android.icu.text.DateTimePatternGenerator getInstance(); - method public static android.icu.text.DateTimePatternGenerator getInstance(android.icu.util.ULocale); - method public static android.icu.text.DateTimePatternGenerator getInstance(java.util.Locale); - method public String getSkeleton(String); - method public java.util.Map<java.lang.String,java.lang.String> getSkeletons(java.util.Map<java.lang.String,java.lang.String>); - method public boolean isFrozen(); - method public String replaceFieldTypes(String, String); - method public String replaceFieldTypes(String, String, int); - method public void setAppendItemFormat(int, String); - method public void setAppendItemName(int, String); - method public void setDateTimeFormat(String); - method public void setDecimal(String); - field public static final int DAY = 7; // 0x7 - field public static final int DAYPERIOD = 10; // 0xa - field public static final int DAY_OF_WEEK_IN_MONTH = 9; // 0x9 - field public static final int DAY_OF_YEAR = 8; // 0x8 - field public static final int ERA = 0; // 0x0 - field public static final int FRACTIONAL_SECOND = 14; // 0xe - field public static final int HOUR = 11; // 0xb - field public static final int MATCH_ALL_FIELDS_LENGTH = 65535; // 0xffff - field public static final int MATCH_HOUR_FIELD_LENGTH = 2048; // 0x800 - field public static final int MATCH_NO_OPTIONS = 0; // 0x0 - field public static final int MINUTE = 12; // 0xc - field public static final int MONTH = 3; // 0x3 - field public static final int QUARTER = 2; // 0x2 - field public static final int SECOND = 13; // 0xd - field public static final int WEEKDAY = 6; // 0x6 - field public static final int WEEK_OF_MONTH = 5; // 0x5 - field public static final int WEEK_OF_YEAR = 4; // 0x4 - field public static final int YEAR = 1; // 0x1 - field public static final int ZONE = 15; // 0xf - } - - public enum DateTimePatternGenerator.DisplayWidth { - enum_constant public static final android.icu.text.DateTimePatternGenerator.DisplayWidth ABBREVIATED; - enum_constant public static final android.icu.text.DateTimePatternGenerator.DisplayWidth NARROW; - enum_constant public static final android.icu.text.DateTimePatternGenerator.DisplayWidth WIDE; - } - - public static final class DateTimePatternGenerator.PatternInfo { - ctor public DateTimePatternGenerator.PatternInfo(); - field public static final int BASE_CONFLICT = 1; // 0x1 - field public static final int CONFLICT = 2; // 0x2 - field public static final int OK = 0; // 0x0 - field public String conflictingPattern; - field public int status; - } - - public class DecimalFormat extends android.icu.text.NumberFormat { - ctor public DecimalFormat(); - ctor public DecimalFormat(String); - ctor public DecimalFormat(String, android.icu.text.DecimalFormatSymbols); - ctor public DecimalFormat(String, android.icu.text.DecimalFormatSymbols, android.icu.text.CurrencyPluralInfo, int); - method public void applyLocalizedPattern(String); - method public void applyPattern(String); - method public boolean areSignificantDigitsUsed(); - method public StringBuffer format(double, StringBuffer, java.text.FieldPosition); - method public StringBuffer format(long, StringBuffer, java.text.FieldPosition); - method public StringBuffer format(java.math.BigInteger, StringBuffer, java.text.FieldPosition); - method public StringBuffer format(java.math.BigDecimal, StringBuffer, java.text.FieldPosition); - method public StringBuffer format(android.icu.math.BigDecimal, StringBuffer, java.text.FieldPosition); - method public android.icu.text.CurrencyPluralInfo getCurrencyPluralInfo(); - method public android.icu.util.Currency.CurrencyUsage getCurrencyUsage(); - method public android.icu.text.DecimalFormatSymbols getDecimalFormatSymbols(); - method public int getFormatWidth(); - method public int getGroupingSize(); - method public java.math.MathContext getMathContext(); - method public android.icu.math.MathContext getMathContextICU(); - method public int getMaximumSignificantDigits(); - method public byte getMinimumExponentDigits(); - method public int getMinimumSignificantDigits(); - method public int getMultiplier(); - method public String getNegativePrefix(); - method public String getNegativeSuffix(); - method public char getPadCharacter(); - method public int getPadPosition(); - method @Deprecated public int getParseMaxDigits(); - method public String getPositivePrefix(); - method public String getPositiveSuffix(); - method public java.math.BigDecimal getRoundingIncrement(); - method public int getSecondaryGroupingSize(); - method public boolean isDecimalPatternMatchRequired(); - method public boolean isDecimalSeparatorAlwaysShown(); - method public boolean isExponentSignAlwaysShown(); - method public boolean isParseBigDecimal(); - method public boolean isScientificNotation(); - method public Number parse(String, java.text.ParsePosition); - method public void setCurrencyPluralInfo(android.icu.text.CurrencyPluralInfo); - method public void setCurrencyUsage(android.icu.util.Currency.CurrencyUsage); - method public void setDecimalFormatSymbols(android.icu.text.DecimalFormatSymbols); - method public void setDecimalPatternMatchRequired(boolean); - method public void setDecimalSeparatorAlwaysShown(boolean); - method public void setExponentSignAlwaysShown(boolean); - method public void setFormatWidth(int); - method public void setGroupingSize(int); - method public void setMathContext(java.math.MathContext); - method public void setMathContextICU(android.icu.math.MathContext); - method public void setMaximumSignificantDigits(int); - method public void setMinimumExponentDigits(byte); - method public void setMinimumSignificantDigits(int); - method public void setMultiplier(int); - method public void setNegativePrefix(String); - method public void setNegativeSuffix(String); - method public void setPadCharacter(char); - method public void setPadPosition(int); - method public void setParseBigDecimal(boolean); - method @Deprecated public void setParseMaxDigits(int); - method public void setPositivePrefix(String); - method public void setPositiveSuffix(String); - method public void setRoundingIncrement(java.math.BigDecimal); - method public void setRoundingIncrement(android.icu.math.BigDecimal); - method public void setRoundingIncrement(double); - method public void setScientificNotation(boolean); - method public void setSecondaryGroupingSize(int); - method public void setSignificantDigitsUsed(boolean); - method public String toLocalizedPattern(); - method public String toPattern(); - field public static final int PAD_AFTER_PREFIX = 1; // 0x1 - field public static final int PAD_AFTER_SUFFIX = 3; // 0x3 - field public static final int PAD_BEFORE_PREFIX = 0; // 0x0 - field public static final int PAD_BEFORE_SUFFIX = 2; // 0x2 - } - - public class DecimalFormatSymbols implements java.lang.Cloneable java.io.Serializable { - ctor public DecimalFormatSymbols(); - ctor public DecimalFormatSymbols(java.util.Locale); - ctor public DecimalFormatSymbols(android.icu.util.ULocale); - method public Object clone(); - method public static android.icu.text.DecimalFormatSymbols forNumberingSystem(java.util.Locale, android.icu.text.NumberingSystem); - method public static android.icu.text.DecimalFormatSymbols forNumberingSystem(android.icu.util.ULocale, android.icu.text.NumberingSystem); - method public static java.util.Locale[] getAvailableLocales(); - method public android.icu.util.Currency getCurrency(); - method public String getCurrencySymbol(); - method public char getDecimalSeparator(); - method public String getDecimalSeparatorString(); - method public char getDigit(); - method public String[] getDigitStrings(); - method public char[] getDigits(); - method public String getExponentMultiplicationSign(); - method public String getExponentSeparator(); - method public char getGroupingSeparator(); - method public String getGroupingSeparatorString(); - method public String getInfinity(); - method public static android.icu.text.DecimalFormatSymbols getInstance(); - method public static android.icu.text.DecimalFormatSymbols getInstance(java.util.Locale); - method public static android.icu.text.DecimalFormatSymbols getInstance(android.icu.util.ULocale); - method public String getInternationalCurrencySymbol(); - method public java.util.Locale getLocale(); - method public char getMinusSign(); - method public String getMinusSignString(); - method public char getMonetaryDecimalSeparator(); - method public String getMonetaryDecimalSeparatorString(); - method public char getMonetaryGroupingSeparator(); - method public String getMonetaryGroupingSeparatorString(); - method public String getNaN(); - method public char getPadEscape(); - method public String getPatternForCurrencySpacing(int, boolean); - method public char getPatternSeparator(); - method public char getPerMill(); - method public String getPerMillString(); - method public char getPercent(); - method public String getPercentString(); - method public char getPlusSign(); - method public String getPlusSignString(); - method public char getSignificantDigit(); - method public android.icu.util.ULocale getULocale(); - method public char getZeroDigit(); - method public void setCurrency(android.icu.util.Currency); - method public void setCurrencySymbol(String); - method public void setDecimalSeparator(char); - method public void setDecimalSeparatorString(String); - method public void setDigit(char); - method public void setDigitStrings(String[]); - method public void setExponentMultiplicationSign(String); - method public void setExponentSeparator(String); - method public void setGroupingSeparator(char); - method public void setGroupingSeparatorString(String); - method public void setInfinity(String); - method public void setInternationalCurrencySymbol(String); - method public void setMinusSign(char); - method public void setMinusSignString(String); - method public void setMonetaryDecimalSeparator(char); - method public void setMonetaryDecimalSeparatorString(String); - method public void setMonetaryGroupingSeparator(char); - method public void setMonetaryGroupingSeparatorString(String); - method public void setNaN(String); - method public void setPadEscape(char); - method public void setPatternForCurrencySpacing(int, boolean, String); - method public void setPatternSeparator(char); - method public void setPerMill(char); - method public void setPerMillString(String); - method public void setPercent(char); - method public void setPercentString(String); - method public void setPlusSign(char); - method public void setPlusSignString(String); - method public void setSignificantDigit(char); - method public void setZeroDigit(char); - field public static final int CURRENCY_SPC_CURRENCY_MATCH = 0; // 0x0 - field public static final int CURRENCY_SPC_INSERT = 2; // 0x2 - field public static final int CURRENCY_SPC_SURROUNDING_MATCH = 1; // 0x1 - } - - public enum DisplayContext { - method public android.icu.text.DisplayContext.Type type(); - method public int value(); - enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_BEGINNING_OF_SENTENCE; - enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_MIDDLE_OF_SENTENCE; - enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_STANDALONE; - enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_FOR_UI_LIST_OR_MENU; - enum_constant public static final android.icu.text.DisplayContext CAPITALIZATION_NONE; - enum_constant public static final android.icu.text.DisplayContext DIALECT_NAMES; - enum_constant public static final android.icu.text.DisplayContext LENGTH_FULL; - enum_constant public static final android.icu.text.DisplayContext LENGTH_SHORT; - enum_constant public static final android.icu.text.DisplayContext NO_SUBSTITUTE; - enum_constant public static final android.icu.text.DisplayContext STANDARD_NAMES; - enum_constant public static final android.icu.text.DisplayContext SUBSTITUTE; - } - - public enum DisplayContext.Type { - enum_constant public static final android.icu.text.DisplayContext.Type CAPITALIZATION; - enum_constant public static final android.icu.text.DisplayContext.Type DIALECT_HANDLING; - enum_constant public static final android.icu.text.DisplayContext.Type DISPLAY_LENGTH; - enum_constant public static final android.icu.text.DisplayContext.Type SUBSTITUTE_HANDLING; - } - - public final class Edits { - ctor public Edits(); - method public void addReplace(int, int); - method public void addUnchanged(int); - method public android.icu.text.Edits.Iterator getCoarseChangesIterator(); - method public android.icu.text.Edits.Iterator getCoarseIterator(); - method public android.icu.text.Edits.Iterator getFineChangesIterator(); - method public android.icu.text.Edits.Iterator getFineIterator(); - method public boolean hasChanges(); - method public int lengthDelta(); - method public android.icu.text.Edits mergeAndAppend(android.icu.text.Edits, android.icu.text.Edits); - method public int numberOfChanges(); - method public void reset(); - } - - public static final class Edits.Iterator { - method public int destinationIndex(); - method public int destinationIndexFromSourceIndex(int); - method public boolean findDestinationIndex(int); - method public boolean findSourceIndex(int); - method public boolean hasChange(); - method public int newLength(); - method public boolean next(); - method public int oldLength(); - method public int replacementIndex(); - method public int sourceIndex(); - method public int sourceIndexFromDestinationIndex(int); - } - - public abstract class IDNA { - method public static android.icu.text.IDNA getUTS46Instance(int); - method public abstract StringBuilder labelToASCII(CharSequence, StringBuilder, android.icu.text.IDNA.Info); - method public abstract StringBuilder labelToUnicode(CharSequence, StringBuilder, android.icu.text.IDNA.Info); - method public abstract StringBuilder nameToASCII(CharSequence, StringBuilder, android.icu.text.IDNA.Info); - method public abstract StringBuilder nameToUnicode(CharSequence, StringBuilder, android.icu.text.IDNA.Info); - field public static final int CHECK_BIDI = 4; // 0x4 - field public static final int CHECK_CONTEXTJ = 8; // 0x8 - field public static final int CHECK_CONTEXTO = 64; // 0x40 - field public static final int DEFAULT = 0; // 0x0 - field public static final int NONTRANSITIONAL_TO_ASCII = 16; // 0x10 - field public static final int NONTRANSITIONAL_TO_UNICODE = 32; // 0x20 - field public static final int USE_STD3_RULES = 2; // 0x2 - } - - public enum IDNA.Error { - enum_constant public static final android.icu.text.IDNA.Error BIDI; - enum_constant public static final android.icu.text.IDNA.Error CONTEXTJ; - enum_constant public static final android.icu.text.IDNA.Error CONTEXTO_DIGITS; - enum_constant public static final android.icu.text.IDNA.Error CONTEXTO_PUNCTUATION; - enum_constant public static final android.icu.text.IDNA.Error DISALLOWED; - enum_constant public static final android.icu.text.IDNA.Error DOMAIN_NAME_TOO_LONG; - enum_constant public static final android.icu.text.IDNA.Error EMPTY_LABEL; - enum_constant public static final android.icu.text.IDNA.Error HYPHEN_3_4; - enum_constant public static final android.icu.text.IDNA.Error INVALID_ACE_LABEL; - enum_constant public static final android.icu.text.IDNA.Error LABEL_HAS_DOT; - enum_constant public static final android.icu.text.IDNA.Error LABEL_TOO_LONG; - enum_constant public static final android.icu.text.IDNA.Error LEADING_COMBINING_MARK; - enum_constant public static final android.icu.text.IDNA.Error LEADING_HYPHEN; - enum_constant public static final android.icu.text.IDNA.Error PUNYCODE; - enum_constant public static final android.icu.text.IDNA.Error TRAILING_HYPHEN; - } - - public static final class IDNA.Info { - ctor public IDNA.Info(); - method public java.util.Set<android.icu.text.IDNA.Error> getErrors(); - method public boolean hasErrors(); - method public boolean isTransitionalDifferent(); - } - - public final class ListFormatter { - method public String format(java.lang.Object...); - method public String format(java.util.Collection<?>); - method public static android.icu.text.ListFormatter getInstance(android.icu.util.ULocale); - method public static android.icu.text.ListFormatter getInstance(java.util.Locale); - method public static android.icu.text.ListFormatter getInstance(); - method public String getPatternForNumItems(int); - } - - public abstract class LocaleDisplayNames { - method public abstract android.icu.text.DisplayContext getContext(android.icu.text.DisplayContext.Type); - method public abstract android.icu.text.LocaleDisplayNames.DialectHandling getDialectHandling(); - method public static android.icu.text.LocaleDisplayNames getInstance(android.icu.util.ULocale); - method public static android.icu.text.LocaleDisplayNames getInstance(java.util.Locale); - method public static android.icu.text.LocaleDisplayNames getInstance(android.icu.util.ULocale, android.icu.text.LocaleDisplayNames.DialectHandling); - method public static android.icu.text.LocaleDisplayNames getInstance(android.icu.util.ULocale, android.icu.text.DisplayContext...); - method public static android.icu.text.LocaleDisplayNames getInstance(java.util.Locale, android.icu.text.DisplayContext...); - method public abstract android.icu.util.ULocale getLocale(); - method public java.util.List<android.icu.text.LocaleDisplayNames.UiListItem> getUiList(java.util.Set<android.icu.util.ULocale>, boolean, java.util.Comparator<java.lang.Object>); - method public abstract java.util.List<android.icu.text.LocaleDisplayNames.UiListItem> getUiListCompareWholeItems(java.util.Set<android.icu.util.ULocale>, java.util.Comparator<android.icu.text.LocaleDisplayNames.UiListItem>); - method public abstract String keyDisplayName(String); - method public abstract String keyValueDisplayName(String, String); - method public abstract String languageDisplayName(String); - method public abstract String localeDisplayName(android.icu.util.ULocale); - method public abstract String localeDisplayName(java.util.Locale); - method public abstract String localeDisplayName(String); - method public abstract String regionDisplayName(String); - method public abstract String scriptDisplayName(String); - method public abstract String scriptDisplayName(int); - method public abstract String variantDisplayName(String); - } - - public enum LocaleDisplayNames.DialectHandling { - enum_constant public static final android.icu.text.LocaleDisplayNames.DialectHandling DIALECT_NAMES; - enum_constant public static final android.icu.text.LocaleDisplayNames.DialectHandling STANDARD_NAMES; - } - - public static class LocaleDisplayNames.UiListItem { - ctor public LocaleDisplayNames.UiListItem(android.icu.util.ULocale, android.icu.util.ULocale, String, String); - method public static java.util.Comparator<android.icu.text.LocaleDisplayNames.UiListItem> getComparator(java.util.Comparator<java.lang.Object>, boolean); - field public final android.icu.util.ULocale minimized; - field public final android.icu.util.ULocale modified; - field public final String nameInDisplayLocale; - field public final String nameInSelf; - } - - public class MeasureFormat extends android.icu.text.UFormat { - method public final boolean equals(Object); - method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public StringBuilder formatMeasurePerUnit(android.icu.util.Measure, android.icu.util.MeasureUnit, StringBuilder, java.text.FieldPosition); - method public final String formatMeasures(android.icu.util.Measure...); - method public StringBuilder formatMeasures(StringBuilder, java.text.FieldPosition, android.icu.util.Measure...); - method public static android.icu.text.MeasureFormat getCurrencyFormat(android.icu.util.ULocale); - method public static android.icu.text.MeasureFormat getCurrencyFormat(java.util.Locale); - method public static android.icu.text.MeasureFormat getCurrencyFormat(); - method public static android.icu.text.MeasureFormat getInstance(android.icu.util.ULocale, android.icu.text.MeasureFormat.FormatWidth); - method public static android.icu.text.MeasureFormat getInstance(java.util.Locale, android.icu.text.MeasureFormat.FormatWidth); - method public static android.icu.text.MeasureFormat getInstance(android.icu.util.ULocale, android.icu.text.MeasureFormat.FormatWidth, android.icu.text.NumberFormat); - method public static android.icu.text.MeasureFormat getInstance(java.util.Locale, android.icu.text.MeasureFormat.FormatWidth, android.icu.text.NumberFormat); - method public final android.icu.util.ULocale getLocale(); - method public android.icu.text.NumberFormat getNumberFormat(); - method public String getUnitDisplayName(android.icu.util.MeasureUnit); - method public android.icu.text.MeasureFormat.FormatWidth getWidth(); - method public final int hashCode(); - method public android.icu.util.Measure parseObject(String, java.text.ParsePosition); - } - - public enum MeasureFormat.FormatWidth { - enum_constant public static final android.icu.text.MeasureFormat.FormatWidth NARROW; - enum_constant public static final android.icu.text.MeasureFormat.FormatWidth NUMERIC; - enum_constant public static final android.icu.text.MeasureFormat.FormatWidth SHORT; - enum_constant public static final android.icu.text.MeasureFormat.FormatWidth WIDE; - } - - public class MessageFormat extends android.icu.text.UFormat { - ctor public MessageFormat(String); - ctor public MessageFormat(String, java.util.Locale); - ctor public MessageFormat(String, android.icu.util.ULocale); - method public void applyPattern(String); - method public void applyPattern(String, android.icu.text.MessagePattern.ApostropheMode); - method public static String autoQuoteApostrophe(String); - method public final StringBuffer format(Object[], StringBuffer, java.text.FieldPosition); - method public final StringBuffer format(java.util.Map<java.lang.String,java.lang.Object>, StringBuffer, java.text.FieldPosition); - method public static String format(String, java.lang.Object...); - method public static String format(String, java.util.Map<java.lang.String,java.lang.Object>); - method public final StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public android.icu.text.MessagePattern.ApostropheMode getApostropheMode(); - method public java.util.Set<java.lang.String> getArgumentNames(); - method public java.text.Format getFormatByArgumentName(String); - method public java.text.Format[] getFormats(); - method public java.text.Format[] getFormatsByArgumentIndex(); - method public java.util.Locale getLocale(); - method public android.icu.util.ULocale getULocale(); - method public Object[] parse(String, java.text.ParsePosition); - method public Object[] parse(String) throws java.text.ParseException; - method public Object parseObject(String, java.text.ParsePosition); - method public java.util.Map<java.lang.String,java.lang.Object> parseToMap(String, java.text.ParsePosition); - method public java.util.Map<java.lang.String,java.lang.Object> parseToMap(String) throws java.text.ParseException; - method public void setFormat(int, java.text.Format); - method public void setFormatByArgumentIndex(int, java.text.Format); - method public void setFormatByArgumentName(String, java.text.Format); - method public void setFormats(java.text.Format[]); - method public void setFormatsByArgumentIndex(java.text.Format[]); - method public void setFormatsByArgumentName(java.util.Map<java.lang.String,java.text.Format>); - method public void setLocale(java.util.Locale); - method public void setLocale(android.icu.util.ULocale); - method public String toPattern(); - method public boolean usesNamedArguments(); - } - - public static class MessageFormat.Field extends java.text.Format.Field { - ctor protected MessageFormat.Field(String); - field public static final android.icu.text.MessageFormat.Field ARGUMENT; - } - - public final class MessagePattern implements java.lang.Cloneable android.icu.util.Freezable<android.icu.text.MessagePattern> { - ctor public MessagePattern(); - ctor public MessagePattern(android.icu.text.MessagePattern.ApostropheMode); - ctor public MessagePattern(String); - method public String autoQuoteApostropheDeep(); - method public void clear(); - method public void clearPatternAndSetApostropheMode(android.icu.text.MessagePattern.ApostropheMode); - method public Object clone(); - method public android.icu.text.MessagePattern cloneAsThawed(); - method public int countParts(); - method public android.icu.text.MessagePattern freeze(); - method public android.icu.text.MessagePattern.ApostropheMode getApostropheMode(); - method public int getLimitPartIndex(int); - method public double getNumericValue(android.icu.text.MessagePattern.Part); - method public android.icu.text.MessagePattern.Part getPart(int); - method public android.icu.text.MessagePattern.Part.Type getPartType(int); - method public int getPatternIndex(int); - method public String getPatternString(); - method public double getPluralOffset(int); - method public String getSubstring(android.icu.text.MessagePattern.Part); - method public boolean hasNamedArguments(); - method public boolean hasNumberedArguments(); - method public boolean isFrozen(); - method public android.icu.text.MessagePattern parse(String); - method public android.icu.text.MessagePattern parseChoiceStyle(String); - method public android.icu.text.MessagePattern parsePluralStyle(String); - method public android.icu.text.MessagePattern parseSelectStyle(String); - method public boolean partSubstringMatches(android.icu.text.MessagePattern.Part, String); - method public static int validateArgumentName(String); - field public static final int ARG_NAME_NOT_NUMBER = -1; // 0xffffffff - field public static final int ARG_NAME_NOT_VALID = -2; // 0xfffffffe - field public static final double NO_NUMERIC_VALUE = -1.23456789E8; - } - - public enum MessagePattern.ApostropheMode { - enum_constant public static final android.icu.text.MessagePattern.ApostropheMode DOUBLE_OPTIONAL; - enum_constant public static final android.icu.text.MessagePattern.ApostropheMode DOUBLE_REQUIRED; - } - - public enum MessagePattern.ArgType { - method public boolean hasPluralStyle(); - enum_constant public static final android.icu.text.MessagePattern.ArgType CHOICE; - enum_constant public static final android.icu.text.MessagePattern.ArgType NONE; - enum_constant public static final android.icu.text.MessagePattern.ArgType PLURAL; - enum_constant public static final android.icu.text.MessagePattern.ArgType SELECT; - enum_constant public static final android.icu.text.MessagePattern.ArgType SELECTORDINAL; - enum_constant public static final android.icu.text.MessagePattern.ArgType SIMPLE; - } - - public static final class MessagePattern.Part { - method public android.icu.text.MessagePattern.ArgType getArgType(); - method public int getIndex(); - method public int getLength(); - method public int getLimit(); - method public android.icu.text.MessagePattern.Part.Type getType(); - method public int getValue(); - } - - public enum MessagePattern.Part.Type { - method public boolean hasNumericValue(); - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_DOUBLE; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_INT; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_LIMIT; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_NAME; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_NUMBER; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_SELECTOR; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_START; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_STYLE; - enum_constant public static final android.icu.text.MessagePattern.Part.Type ARG_TYPE; - enum_constant public static final android.icu.text.MessagePattern.Part.Type INSERT_CHAR; - enum_constant public static final android.icu.text.MessagePattern.Part.Type MSG_LIMIT; - enum_constant public static final android.icu.text.MessagePattern.Part.Type MSG_START; - enum_constant public static final android.icu.text.MessagePattern.Part.Type REPLACE_NUMBER; - enum_constant public static final android.icu.text.MessagePattern.Part.Type SKIP_SYNTAX; - } - - public final class Normalizer implements java.lang.Cloneable { - method @Deprecated public Object clone(); - method public static int compare(char[], int, int, char[], int, int, int); - method public static int compare(String, String, int); - method public static int compare(char[], char[], int); - method public static int compare(int, int, int); - method public static int compare(int, String, int); - field public static final int COMPARE_CODE_POINT_ORDER = 32768; // 0x8000 - field public static final int COMPARE_IGNORE_CASE = 65536; // 0x10000 - field public static final int FOLD_CASE_DEFAULT = 0; // 0x0 - field public static final int FOLD_CASE_EXCLUDE_SPECIAL_I = 1; // 0x1 - field public static final int INPUT_IS_FCD = 131072; // 0x20000 - field public static final android.icu.text.Normalizer.QuickCheckResult MAYBE; - field public static final android.icu.text.Normalizer.QuickCheckResult NO; - field public static final android.icu.text.Normalizer.QuickCheckResult YES; - } - - public static final class Normalizer.QuickCheckResult { - } - - public abstract class Normalizer2 { - method public abstract StringBuilder append(StringBuilder, CharSequence); - method public int composePair(int, int); - method public int getCombiningClass(int); - method public abstract String getDecomposition(int); - method public static android.icu.text.Normalizer2 getInstance(java.io.InputStream, String, android.icu.text.Normalizer2.Mode); - method public static android.icu.text.Normalizer2 getNFCInstance(); - method public static android.icu.text.Normalizer2 getNFDInstance(); - method public static android.icu.text.Normalizer2 getNFKCCasefoldInstance(); - method public static android.icu.text.Normalizer2 getNFKCInstance(); - method public static android.icu.text.Normalizer2 getNFKDInstance(); - method public String getRawDecomposition(int); - method public abstract boolean hasBoundaryAfter(int); - method public abstract boolean hasBoundaryBefore(int); - method public abstract boolean isInert(int); - method public abstract boolean isNormalized(CharSequence); - method public String normalize(CharSequence); - method public abstract StringBuilder normalize(CharSequence, StringBuilder); - method public abstract Appendable normalize(CharSequence, Appendable); - method public abstract StringBuilder normalizeSecondAndAppend(StringBuilder, CharSequence); - method public abstract android.icu.text.Normalizer.QuickCheckResult quickCheck(CharSequence); - method public abstract int spanQuickCheckYes(CharSequence); - } - - public enum Normalizer2.Mode { - enum_constant public static final android.icu.text.Normalizer2.Mode COMPOSE; - enum_constant public static final android.icu.text.Normalizer2.Mode COMPOSE_CONTIGUOUS; - enum_constant public static final android.icu.text.Normalizer2.Mode DECOMPOSE; - enum_constant public static final android.icu.text.Normalizer2.Mode FCD; - } - - public abstract class NumberFormat extends android.icu.text.UFormat { - ctor public NumberFormat(); - method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public final String format(double); - method public final String format(long); - method public final String format(java.math.BigInteger); - method public final String format(java.math.BigDecimal); - method public final String format(android.icu.math.BigDecimal); - method public final String format(android.icu.util.CurrencyAmount); - method public abstract StringBuffer format(double, StringBuffer, java.text.FieldPosition); - method public abstract StringBuffer format(long, StringBuffer, java.text.FieldPosition); - method public abstract StringBuffer format(java.math.BigInteger, StringBuffer, java.text.FieldPosition); - method public abstract StringBuffer format(java.math.BigDecimal, StringBuffer, java.text.FieldPosition); - method public abstract StringBuffer format(android.icu.math.BigDecimal, StringBuffer, java.text.FieldPosition); - method public StringBuffer format(android.icu.util.CurrencyAmount, StringBuffer, java.text.FieldPosition); - method public static java.util.Locale[] getAvailableLocales(); - method public android.icu.text.DisplayContext getContext(android.icu.text.DisplayContext.Type); - method public android.icu.util.Currency getCurrency(); - method public static final android.icu.text.NumberFormat getCurrencyInstance(); - method public static android.icu.text.NumberFormat getCurrencyInstance(java.util.Locale); - method public static android.icu.text.NumberFormat getCurrencyInstance(android.icu.util.ULocale); - method public static final android.icu.text.NumberFormat getInstance(); - method public static android.icu.text.NumberFormat getInstance(java.util.Locale); - method public static android.icu.text.NumberFormat getInstance(android.icu.util.ULocale); - method public static final android.icu.text.NumberFormat getInstance(int); - method public static android.icu.text.NumberFormat getInstance(java.util.Locale, int); - method public static android.icu.text.NumberFormat getInstance(android.icu.util.ULocale, int); - method public static final android.icu.text.NumberFormat getIntegerInstance(); - method public static android.icu.text.NumberFormat getIntegerInstance(java.util.Locale); - method public static android.icu.text.NumberFormat getIntegerInstance(android.icu.util.ULocale); - method public int getMaximumFractionDigits(); - method public int getMaximumIntegerDigits(); - method public int getMinimumFractionDigits(); - method public int getMinimumIntegerDigits(); - method public static final android.icu.text.NumberFormat getNumberInstance(); - method public static android.icu.text.NumberFormat getNumberInstance(java.util.Locale); - method public static android.icu.text.NumberFormat getNumberInstance(android.icu.util.ULocale); - method protected static String getPattern(android.icu.util.ULocale, int); - method public static final android.icu.text.NumberFormat getPercentInstance(); - method public static android.icu.text.NumberFormat getPercentInstance(java.util.Locale); - method public static android.icu.text.NumberFormat getPercentInstance(android.icu.util.ULocale); - method public int getRoundingMode(); - method public static final android.icu.text.NumberFormat getScientificInstance(); - method public static android.icu.text.NumberFormat getScientificInstance(java.util.Locale); - method public static android.icu.text.NumberFormat getScientificInstance(android.icu.util.ULocale); - method public boolean isGroupingUsed(); - method public boolean isParseIntegerOnly(); - method public boolean isParseStrict(); - method public abstract Number parse(String, java.text.ParsePosition); - method public Number parse(String) throws java.text.ParseException; - method public android.icu.util.CurrencyAmount parseCurrency(CharSequence, java.text.ParsePosition); - method public final Object parseObject(String, java.text.ParsePosition); - method public void setContext(android.icu.text.DisplayContext); - method public void setCurrency(android.icu.util.Currency); - method public void setGroupingUsed(boolean); - method public void setMaximumFractionDigits(int); - method public void setMaximumIntegerDigits(int); - method public void setMinimumFractionDigits(int); - method public void setMinimumIntegerDigits(int); - method public void setParseIntegerOnly(boolean); - method public void setParseStrict(boolean); - method public void setRoundingMode(int); - field public static final int ACCOUNTINGCURRENCYSTYLE = 7; // 0x7 - field public static final int CASHCURRENCYSTYLE = 8; // 0x8 - field public static final int CURRENCYSTYLE = 1; // 0x1 - field public static final int FRACTION_FIELD = 1; // 0x1 - field public static final int INTEGERSTYLE = 4; // 0x4 - field public static final int INTEGER_FIELD = 0; // 0x0 - field public static final int ISOCURRENCYSTYLE = 5; // 0x5 - field public static final int NUMBERSTYLE = 0; // 0x0 - field public static final int PERCENTSTYLE = 2; // 0x2 - field public static final int PLURALCURRENCYSTYLE = 6; // 0x6 - field public static final int SCIENTIFICSTYLE = 3; // 0x3 - field public static final int STANDARDCURRENCYSTYLE = 9; // 0x9 - } - - public static class NumberFormat.Field extends java.text.Format.Field { - ctor protected NumberFormat.Field(String); - field public static final android.icu.text.NumberFormat.Field CURRENCY; - field public static final android.icu.text.NumberFormat.Field DECIMAL_SEPARATOR; - field public static final android.icu.text.NumberFormat.Field EXPONENT; - field public static final android.icu.text.NumberFormat.Field EXPONENT_SIGN; - field public static final android.icu.text.NumberFormat.Field EXPONENT_SYMBOL; - field public static final android.icu.text.NumberFormat.Field FRACTION; - field public static final android.icu.text.NumberFormat.Field GROUPING_SEPARATOR; - field public static final android.icu.text.NumberFormat.Field INTEGER; - field public static final android.icu.text.NumberFormat.Field PERCENT; - field public static final android.icu.text.NumberFormat.Field PERMILLE; - field public static final android.icu.text.NumberFormat.Field SIGN; - } - - public class NumberingSystem { - ctor public NumberingSystem(); - method public static String[] getAvailableNames(); - method public String getDescription(); - method public static android.icu.text.NumberingSystem getInstance(int, boolean, String); - method public static android.icu.text.NumberingSystem getInstance(java.util.Locale); - method public static android.icu.text.NumberingSystem getInstance(android.icu.util.ULocale); - method public static android.icu.text.NumberingSystem getInstance(); - method public static android.icu.text.NumberingSystem getInstanceByName(String); - method public String getName(); - method public int getRadix(); - method public boolean isAlgorithmic(); - method public static boolean isValidDigitString(String); - field public static final android.icu.text.NumberingSystem LATIN; - } - - public class PluralFormat extends android.icu.text.UFormat { - ctor public PluralFormat(); - ctor public PluralFormat(android.icu.util.ULocale); - ctor public PluralFormat(java.util.Locale); - ctor public PluralFormat(android.icu.text.PluralRules); - ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules); - ctor public PluralFormat(java.util.Locale, android.icu.text.PluralRules); - ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType); - ctor public PluralFormat(java.util.Locale, android.icu.text.PluralRules.PluralType); - ctor public PluralFormat(String); - ctor public PluralFormat(android.icu.util.ULocale, String); - ctor public PluralFormat(android.icu.text.PluralRules, String); - ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules, String); - ctor public PluralFormat(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType, String); - method public void applyPattern(String); - method public boolean equals(android.icu.text.PluralFormat); - method public final String format(double); - method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public Number parse(String, java.text.ParsePosition); - method public Object parseObject(String, java.text.ParsePosition); - method public void setNumberFormat(android.icu.text.NumberFormat); - method public String toPattern(); - } - - public class PluralRules implements java.io.Serializable { - method public static android.icu.text.PluralRules createRules(String); - method public boolean equals(android.icu.text.PluralRules); - method public static android.icu.text.PluralRules forLocale(android.icu.util.ULocale); - method public static android.icu.text.PluralRules forLocale(java.util.Locale); - method public static android.icu.text.PluralRules forLocale(android.icu.util.ULocale, android.icu.text.PluralRules.PluralType); - method public static android.icu.text.PluralRules forLocale(java.util.Locale, android.icu.text.PluralRules.PluralType); - method public java.util.Collection<java.lang.Double> getAllKeywordValues(String); - method public java.util.Set<java.lang.String> getKeywords(); - method public java.util.Collection<java.lang.Double> getSamples(String); - method public double getUniqueKeywordValue(String); - method public static android.icu.text.PluralRules parseDescription(String) throws java.text.ParseException; - method public String select(double); - field public static final android.icu.text.PluralRules DEFAULT; - field public static final String KEYWORD_FEW = "few"; - field public static final String KEYWORD_MANY = "many"; - field public static final String KEYWORD_ONE = "one"; - field public static final String KEYWORD_OTHER = "other"; - field public static final String KEYWORD_TWO = "two"; - field public static final String KEYWORD_ZERO = "zero"; - field public static final double NO_UNIQUE_VALUE = -0.00123456777; - } - - public enum PluralRules.PluralType { - enum_constant public static final android.icu.text.PluralRules.PluralType CARDINAL; - enum_constant public static final android.icu.text.PluralRules.PluralType ORDINAL; - } - - public final class RelativeDateTimeFormatter { - method public String combineDateAndTime(String, String); - method public String format(double, android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.RelativeUnit); - method public String format(android.icu.text.RelativeDateTimeFormatter.Direction, android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit); - method public String format(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit); - method public String formatNumeric(double, android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit); - method public android.icu.text.DisplayContext getCapitalizationContext(); - method public android.icu.text.RelativeDateTimeFormatter.Style getFormatStyle(); - method public static android.icu.text.RelativeDateTimeFormatter getInstance(); - method public static android.icu.text.RelativeDateTimeFormatter getInstance(android.icu.util.ULocale); - method public static android.icu.text.RelativeDateTimeFormatter getInstance(java.util.Locale); - method public static android.icu.text.RelativeDateTimeFormatter getInstance(android.icu.util.ULocale, android.icu.text.NumberFormat); - method public static android.icu.text.RelativeDateTimeFormatter getInstance(android.icu.util.ULocale, android.icu.text.NumberFormat, android.icu.text.RelativeDateTimeFormatter.Style, android.icu.text.DisplayContext); - method public static android.icu.text.RelativeDateTimeFormatter getInstance(java.util.Locale, android.icu.text.NumberFormat); - method public android.icu.text.NumberFormat getNumberFormat(); - } - - public enum RelativeDateTimeFormatter.AbsoluteUnit { - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit DAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit FRIDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit MONDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit MONTH; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit NOW; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit SATURDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit SUNDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit THURSDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit TUESDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit WEDNESDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit WEEK; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.AbsoluteUnit YEAR; - } - - public enum RelativeDateTimeFormatter.Direction { - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction LAST; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction LAST_2; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction NEXT; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction NEXT_2; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction PLAIN; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Direction THIS; - } - - public enum RelativeDateTimeFormatter.RelativeDateTimeUnit { - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit DAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit FRIDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit HOUR; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit MINUTE; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit MONDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit MONTH; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit QUARTER; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit SATURDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit SECOND; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit SUNDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit THURSDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit TUESDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit WEDNESDAY; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit WEEK; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeDateTimeUnit YEAR; - } - - public enum RelativeDateTimeFormatter.RelativeUnit { - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit DAYS; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit HOURS; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit MINUTES; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit MONTHS; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit SECONDS; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit WEEKS; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.RelativeUnit YEARS; - } - - public enum RelativeDateTimeFormatter.Style { - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style LONG; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style NARROW; - enum_constant public static final android.icu.text.RelativeDateTimeFormatter.Style SHORT; - } - - public interface Replaceable { - method public int char32At(int); - method public char charAt(int); - method public void copy(int, int, int); - method public void getChars(int, int, char[], int); - method public boolean hasMetaData(); - method public int length(); - method public void replace(int, int, String); - method public void replace(int, int, char[], int, int); - } - - public final class RuleBasedCollator extends android.icu.text.Collator { - ctor public RuleBasedCollator(String) throws java.lang.Exception; - method public android.icu.text.RuleBasedCollator cloneAsThawed(); - method public int compare(String, String); - method public android.icu.text.CollationElementIterator getCollationElementIterator(String); - method public android.icu.text.CollationElementIterator getCollationElementIterator(java.text.CharacterIterator); - method public android.icu.text.CollationElementIterator getCollationElementIterator(android.icu.text.UCharacterIterator); - method public android.icu.text.CollationKey getCollationKey(String); - method public void getContractionsAndExpansions(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet, boolean) throws java.lang.Exception; - method public boolean getNumericCollation(); - method public String getRules(); - method public String getRules(boolean); - method public android.icu.util.VersionInfo getUCAVersion(); - method public int getVariableTop(); - method public android.icu.util.VersionInfo getVersion(); - method public boolean isAlternateHandlingShifted(); - method public boolean isCaseLevel(); - method public boolean isFrenchCollation(); - method public boolean isLowerCaseFirst(); - method public boolean isUpperCaseFirst(); - method public void setAlternateHandlingDefault(); - method public void setAlternateHandlingShifted(boolean); - method public void setCaseFirstDefault(); - method public void setCaseLevel(boolean); - method public void setCaseLevelDefault(); - method public void setDecompositionDefault(); - method public void setFrenchCollation(boolean); - method public void setFrenchCollationDefault(); - method public void setLowerCaseFirst(boolean); - method public android.icu.text.RuleBasedCollator setMaxVariable(int); - method public void setNumericCollation(boolean); - method public void setNumericCollationDefault(); - method public void setStrengthDefault(); - method public void setUpperCaseFirst(boolean); - } - - public final class ScientificNumberFormatter { - method public String format(Object); - method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.util.ULocale, String, String); - method public static android.icu.text.ScientificNumberFormatter getMarkupInstance(android.icu.text.DecimalFormat, String, String); - method public static android.icu.text.ScientificNumberFormatter getSuperscriptInstance(android.icu.util.ULocale); - method public static android.icu.text.ScientificNumberFormatter getSuperscriptInstance(android.icu.text.DecimalFormat); - } - - public abstract class SearchIterator { - ctor protected SearchIterator(java.text.CharacterIterator, android.icu.text.BreakIterator); - method public final int first(); - method public final int following(int); - method public android.icu.text.BreakIterator getBreakIterator(); - method public android.icu.text.SearchIterator.ElementComparisonType getElementComparisonType(); - method public abstract int getIndex(); - method public int getMatchLength(); - method public int getMatchStart(); - method public String getMatchedText(); - method public java.text.CharacterIterator getTarget(); - method protected abstract int handleNext(int); - method protected abstract int handlePrevious(int); - method public boolean isOverlapping(); - method public final int last(); - method public int next(); - method public final int preceding(int); - method public int previous(); - method public void reset(); - method public void setBreakIterator(android.icu.text.BreakIterator); - method public void setElementComparisonType(android.icu.text.SearchIterator.ElementComparisonType); - method public void setIndex(int); - method protected void setMatchLength(int); - method public void setOverlapping(boolean); - method public void setTarget(java.text.CharacterIterator); - field public static final int DONE = -1; // 0xffffffff - field protected android.icu.text.BreakIterator breakIterator; - field protected int matchLength; - field protected java.text.CharacterIterator targetText; - } - - public enum SearchIterator.ElementComparisonType { - enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType ANY_BASE_WEIGHT_IS_WILDCARD; - enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType PATTERN_BASE_WEIGHT_IS_WILDCARD; - enum_constant public static final android.icu.text.SearchIterator.ElementComparisonType STANDARD_ELEMENT_COMPARISON; - } - - public class SelectFormat extends java.text.Format { - ctor public SelectFormat(String); - method public void applyPattern(String); - method public final String format(String); - method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public Object parseObject(String, java.text.ParsePosition); - method public String toPattern(); - } - - public class SimpleDateFormat extends android.icu.text.DateFormat { - ctor public SimpleDateFormat(); - ctor public SimpleDateFormat(String); - ctor public SimpleDateFormat(String, java.util.Locale); - ctor public SimpleDateFormat(String, android.icu.util.ULocale); - ctor public SimpleDateFormat(String, String, android.icu.util.ULocale); - ctor public SimpleDateFormat(String, android.icu.text.DateFormatSymbols); - method public void applyLocalizedPattern(String); - method public void applyPattern(String); - method public StringBuffer format(android.icu.util.Calendar, StringBuffer, java.text.FieldPosition); - method public java.util.Date get2DigitYearStart(); - method public android.icu.text.DateFormatSymbols getDateFormatSymbols(); - method public android.icu.text.NumberFormat getNumberFormat(char); - method protected android.icu.text.DateFormatSymbols getSymbols(); - method public android.icu.text.TimeZoneFormat getTimeZoneFormat(); - method protected int matchQuarterString(String, int, int, String[], android.icu.util.Calendar); - method protected int matchString(String, int, int, String[], android.icu.util.Calendar); - method public void parse(String, android.icu.util.Calendar, java.text.ParsePosition); - method protected android.icu.text.DateFormat.Field patternCharToDateFormatField(char); - method public void set2DigitYearStart(java.util.Date); - method public void setDateFormatSymbols(android.icu.text.DateFormatSymbols); - method public void setNumberFormat(String, android.icu.text.NumberFormat); - method public void setTimeZoneFormat(android.icu.text.TimeZoneFormat); - method protected String subFormat(char, int, int, java.text.FieldPosition, android.icu.text.DateFormatSymbols, android.icu.util.Calendar) throws java.lang.IllegalArgumentException; - method protected int subParse(String, int, char, int, boolean, boolean, boolean[], android.icu.util.Calendar); - method public String toLocalizedPattern(); - method public String toPattern(); - method protected String zeroPaddingNumber(long, int, int); - } - - public class StringPrepParseException extends java.text.ParseException { - ctor public StringPrepParseException(String, int); - ctor public StringPrepParseException(String, int, String, int); - ctor public StringPrepParseException(String, int, String, int, int); - method public int getError(); - field public static final int ACE_PREFIX_ERROR = 6; // 0x6 - field public static final int BUFFER_OVERFLOW_ERROR = 9; // 0x9 - field public static final int CHECK_BIDI_ERROR = 4; // 0x4 - field public static final int DOMAIN_NAME_TOO_LONG_ERROR = 11; // 0xb - field public static final int ILLEGAL_CHAR_FOUND = 1; // 0x1 - field public static final int INVALID_CHAR_FOUND = 0; // 0x0 - field public static final int LABEL_TOO_LONG_ERROR = 8; // 0x8 - field public static final int PROHIBITED_ERROR = 2; // 0x2 - field public static final int STD3_ASCII_RULES_ERROR = 5; // 0x5 - field public static final int UNASSIGNED_ERROR = 3; // 0x3 - field public static final int VERIFICATION_ERROR = 7; // 0x7 - field public static final int ZERO_LENGTH_LABEL = 10; // 0xa - } - - public final class StringSearch extends android.icu.text.SearchIterator { - ctor public StringSearch(String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator, android.icu.text.BreakIterator); - ctor public StringSearch(String, java.text.CharacterIterator, android.icu.text.RuleBasedCollator); - ctor public StringSearch(String, java.text.CharacterIterator, java.util.Locale); - ctor public StringSearch(String, java.text.CharacterIterator, android.icu.util.ULocale); - ctor public StringSearch(String, String); - method public android.icu.text.RuleBasedCollator getCollator(); - method public int getIndex(); - method public String getPattern(); - method protected int handleNext(int); - method protected int handlePrevious(int); - method public boolean isCanonical(); - method public void setCanonical(boolean); - method public void setCollator(android.icu.text.RuleBasedCollator); - method public void setPattern(String); - } - - public interface SymbolTable { - method public char[] lookup(String); - method public android.icu.text.UnicodeMatcher lookupMatcher(int); - method public String parseReference(String, java.text.ParsePosition, int); - field public static final char SYMBOL_REF = 36; // 0x0024 '$' - } - - public class TimeZoneFormat extends android.icu.text.UFormat implements android.icu.util.Freezable<android.icu.text.TimeZoneFormat> java.io.Serializable { - ctor protected TimeZoneFormat(android.icu.util.ULocale); - method public android.icu.text.TimeZoneFormat cloneAsThawed(); - method public final String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long); - method public String format(android.icu.text.TimeZoneFormat.Style, android.icu.util.TimeZone, long, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>); - method public StringBuffer format(Object, StringBuffer, java.text.FieldPosition); - method public final String formatOffsetISO8601Basic(int, boolean, boolean, boolean); - method public final String formatOffsetISO8601Extended(int, boolean, boolean, boolean); - method public String formatOffsetLocalizedGMT(int); - method public String formatOffsetShortLocalizedGMT(int); - method public android.icu.text.TimeZoneFormat freeze(); - method public java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption> getDefaultParseOptions(); - method public String getGMTOffsetDigits(); - method public String getGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType); - method public String getGMTPattern(); - method public String getGMTZeroFormat(); - method public static android.icu.text.TimeZoneFormat getInstance(android.icu.util.ULocale); - method public static android.icu.text.TimeZoneFormat getInstance(java.util.Locale); - method public android.icu.text.TimeZoneNames getTimeZoneNames(); - method public boolean isFrozen(); - method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, String, java.text.ParsePosition, java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption>, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>); - method public android.icu.util.TimeZone parse(android.icu.text.TimeZoneFormat.Style, String, java.text.ParsePosition, android.icu.util.Output<android.icu.text.TimeZoneFormat.TimeType>); - method public final android.icu.util.TimeZone parse(String, java.text.ParsePosition); - method public final android.icu.util.TimeZone parse(String) throws java.text.ParseException; - method public Object parseObject(String, java.text.ParsePosition); - method public final int parseOffsetISO8601(String, java.text.ParsePosition); - method public int parseOffsetLocalizedGMT(String, java.text.ParsePosition); - method public int parseOffsetShortLocalizedGMT(String, java.text.ParsePosition); - method public android.icu.text.TimeZoneFormat setDefaultParseOptions(java.util.EnumSet<android.icu.text.TimeZoneFormat.ParseOption>); - method public android.icu.text.TimeZoneFormat setGMTOffsetDigits(String); - method public android.icu.text.TimeZoneFormat setGMTOffsetPattern(android.icu.text.TimeZoneFormat.GMTOffsetPatternType, String); - method public android.icu.text.TimeZoneFormat setGMTPattern(String); - method public android.icu.text.TimeZoneFormat setGMTZeroFormat(String); - method public android.icu.text.TimeZoneFormat setTimeZoneNames(android.icu.text.TimeZoneNames); - } - - public enum TimeZoneFormat.GMTOffsetPatternType { - enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_H; - enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_HM; - enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType NEGATIVE_HMS; - enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType POSITIVE_H; - enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType POSITIVE_HM; - enum_constant public static final android.icu.text.TimeZoneFormat.GMTOffsetPatternType POSITIVE_HMS; - } - - public enum TimeZoneFormat.ParseOption { - enum_constant public static final android.icu.text.TimeZoneFormat.ParseOption ALL_STYLES; - enum_constant public static final android.icu.text.TimeZoneFormat.ParseOption TZ_DATABASE_ABBREVIATIONS; - } - - public enum TimeZoneFormat.Style { - enum_constant public static final android.icu.text.TimeZoneFormat.Style EXEMPLAR_LOCATION; - enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_LOCATION; - enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_LONG; - enum_constant public static final android.icu.text.TimeZoneFormat.Style GENERIC_SHORT; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_FIXED; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_FULL; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_LOCAL_FIXED; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_LOCAL_FULL; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_LOCAL_SHORT; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_BASIC_SHORT; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_FIXED; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_FULL; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_LOCAL_FIXED; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ISO_EXTENDED_LOCAL_FULL; - enum_constant public static final android.icu.text.TimeZoneFormat.Style LOCALIZED_GMT; - enum_constant public static final android.icu.text.TimeZoneFormat.Style LOCALIZED_GMT_SHORT; - enum_constant public static final android.icu.text.TimeZoneFormat.Style SPECIFIC_LONG; - enum_constant public static final android.icu.text.TimeZoneFormat.Style SPECIFIC_SHORT; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ZONE_ID; - enum_constant public static final android.icu.text.TimeZoneFormat.Style ZONE_ID_SHORT; - } - - public enum TimeZoneFormat.TimeType { - enum_constant public static final android.icu.text.TimeZoneFormat.TimeType DAYLIGHT; - enum_constant public static final android.icu.text.TimeZoneFormat.TimeType STANDARD; - enum_constant public static final android.icu.text.TimeZoneFormat.TimeType UNKNOWN; - } - - public abstract class TimeZoneNames implements java.io.Serializable { - method public abstract java.util.Set<java.lang.String> getAvailableMetaZoneIDs(); - method public abstract java.util.Set<java.lang.String> getAvailableMetaZoneIDs(String); - method public final String getDisplayName(String, android.icu.text.TimeZoneNames.NameType, long); - method public String getExemplarLocationName(String); - method public static android.icu.text.TimeZoneNames getInstance(android.icu.util.ULocale); - method public static android.icu.text.TimeZoneNames getInstance(java.util.Locale); - method public abstract String getMetaZoneDisplayName(String, android.icu.text.TimeZoneNames.NameType); - method public abstract String getMetaZoneID(String, long); - method public abstract String getReferenceZoneID(String, String); - method public static android.icu.text.TimeZoneNames getTZDBInstance(android.icu.util.ULocale); - method public abstract String getTimeZoneDisplayName(String, android.icu.text.TimeZoneNames.NameType); - } - - public enum TimeZoneNames.NameType { - enum_constant public static final android.icu.text.TimeZoneNames.NameType EXEMPLAR_LOCATION; - enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_DAYLIGHT; - enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_GENERIC; - enum_constant public static final android.icu.text.TimeZoneNames.NameType LONG_STANDARD; - enum_constant public static final android.icu.text.TimeZoneNames.NameType SHORT_DAYLIGHT; - enum_constant public static final android.icu.text.TimeZoneNames.NameType SHORT_GENERIC; - enum_constant public static final android.icu.text.TimeZoneNames.NameType SHORT_STANDARD; - } - - public abstract class Transliterator { - method public static final android.icu.text.Transliterator createFromRules(String, String, int); - method public void filteredTransliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, boolean); - method public final void finishTransliteration(android.icu.text.Replaceable, android.icu.text.Transliterator.Position); - method public static final java.util.Enumeration<java.lang.String> getAvailableIDs(); - method public static final java.util.Enumeration<java.lang.String> getAvailableSources(); - method public static final java.util.Enumeration<java.lang.String> getAvailableTargets(String); - method public static final java.util.Enumeration<java.lang.String> getAvailableVariants(String, String); - method public static final String getDisplayName(String); - method public static String getDisplayName(String, java.util.Locale); - method public static String getDisplayName(String, android.icu.util.ULocale); - method public android.icu.text.Transliterator[] getElements(); - method public final android.icu.text.UnicodeFilter getFilter(); - method public final String getID(); - method public static final android.icu.text.Transliterator getInstance(String); - method public static android.icu.text.Transliterator getInstance(String, int); - method public final android.icu.text.Transliterator getInverse(); - method public final int getMaximumContextLength(); - method public final android.icu.text.UnicodeSet getSourceSet(); - method public android.icu.text.UnicodeSet getTargetSet(); - method public void setFilter(android.icu.text.UnicodeFilter); - method public String toRules(boolean); - method public final int transliterate(android.icu.text.Replaceable, int, int); - method public final void transliterate(android.icu.text.Replaceable); - method public final String transliterate(String); - method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, String); - method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position, int); - method public final void transliterate(android.icu.text.Replaceable, android.icu.text.Transliterator.Position); - field public static final int FORWARD = 0; // 0x0 - field public static final int REVERSE = 1; // 0x1 - } - - public static class Transliterator.Position { - ctor public Transliterator.Position(); - ctor public Transliterator.Position(int, int, int); - ctor public Transliterator.Position(int, int, int, int); - ctor public Transliterator.Position(android.icu.text.Transliterator.Position); - method public void set(android.icu.text.Transliterator.Position); - method public final void validate(int); - field public int contextLimit; - field public int contextStart; - field public int limit; - field public int start; - } - - public abstract class UCharacterIterator implements java.lang.Cloneable { - ctor protected UCharacterIterator(); - method public Object clone() throws java.lang.CloneNotSupportedException; - method public abstract int current(); - method public int currentCodePoint(); - method public java.text.CharacterIterator getCharacterIterator(); - method public abstract int getIndex(); - method public static final android.icu.text.UCharacterIterator getInstance(android.icu.text.Replaceable); - method public static final android.icu.text.UCharacterIterator getInstance(String); - method public static final android.icu.text.UCharacterIterator getInstance(char[]); - method public static final android.icu.text.UCharacterIterator getInstance(char[], int, int); - method public static final android.icu.text.UCharacterIterator getInstance(StringBuffer); - method public static final android.icu.text.UCharacterIterator getInstance(java.text.CharacterIterator); - method public abstract int getLength(); - method public abstract int getText(char[], int); - method public final int getText(char[]); - method public String getText(); - method public int moveCodePointIndex(int); - method public int moveIndex(int); - method public abstract int next(); - method public int nextCodePoint(); - method public abstract int previous(); - method public int previousCodePoint(); - method public abstract void setIndex(int); - method public void setToLimit(); - method public void setToStart(); - field public static final int DONE = -1; // 0xffffffff - } - - public abstract class UFormat extends java.text.Format { - ctor public UFormat(); - } - - public abstract class UnicodeFilter implements android.icu.text.UnicodeMatcher { - method public abstract boolean contains(int); - method public int matches(android.icu.text.Replaceable, int[], int, boolean); - } - - public interface UnicodeMatcher { - method public void addMatchSetTo(android.icu.text.UnicodeSet); - method public int matches(android.icu.text.Replaceable, int[], int, boolean); - method public boolean matchesIndexValue(int); - method public String toPattern(boolean); - field public static final char ETHER = 65535; // 0xffff '\uffff' - field public static final int U_MATCH = 2; // 0x2 - field public static final int U_MISMATCH = 0; // 0x0 - field public static final int U_PARTIAL_MATCH = 1; // 0x1 - } - - public class UnicodeSet extends android.icu.text.UnicodeFilter implements java.lang.Comparable<android.icu.text.UnicodeSet> android.icu.util.Freezable<android.icu.text.UnicodeSet> java.lang.Iterable<java.lang.String> { - ctor public UnicodeSet(); - ctor public UnicodeSet(android.icu.text.UnicodeSet); - ctor public UnicodeSet(int, int); - ctor public UnicodeSet(int...); - ctor public UnicodeSet(String); - ctor public UnicodeSet(String, boolean); - ctor public UnicodeSet(String, int); - ctor public UnicodeSet(String, java.text.ParsePosition, android.icu.text.SymbolTable); - ctor public UnicodeSet(String, java.text.ParsePosition, android.icu.text.SymbolTable, int); - method public StringBuffer _generatePattern(StringBuffer, boolean); - method public StringBuffer _generatePattern(StringBuffer, boolean, boolean); - method public android.icu.text.UnicodeSet add(int, int); - method public final android.icu.text.UnicodeSet add(int); - method public final android.icu.text.UnicodeSet add(CharSequence); - method public android.icu.text.UnicodeSet add(Iterable<?>); - method public android.icu.text.UnicodeSet addAll(int, int); - method public final android.icu.text.UnicodeSet addAll(CharSequence); - method public android.icu.text.UnicodeSet addAll(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet addAll(Iterable<?>); - method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet addAll(T...); - method public <T extends java.util.Collection<java.lang.String>> T addAllTo(T); - method public void addMatchSetTo(android.icu.text.UnicodeSet); - method public android.icu.text.UnicodeSet applyIntPropertyValue(int, int); - method public final android.icu.text.UnicodeSet applyPattern(String); - method public android.icu.text.UnicodeSet applyPattern(String, boolean); - method public android.icu.text.UnicodeSet applyPattern(String, int); - method public android.icu.text.UnicodeSet applyPropertyAlias(String, String); - method public android.icu.text.UnicodeSet applyPropertyAlias(String, String, android.icu.text.SymbolTable); - method public int charAt(int); - method public android.icu.text.UnicodeSet clear(); - method public Object clone(); - method public android.icu.text.UnicodeSet cloneAsThawed(); - method public android.icu.text.UnicodeSet closeOver(int); - method public android.icu.text.UnicodeSet compact(); - method public int compareTo(android.icu.text.UnicodeSet); - method public int compareTo(android.icu.text.UnicodeSet, android.icu.text.UnicodeSet.ComparisonStyle); - method public int compareTo(Iterable<java.lang.String>); - method public android.icu.text.UnicodeSet complement(int, int); - method public final android.icu.text.UnicodeSet complement(int); - method public android.icu.text.UnicodeSet complement(); - method public final android.icu.text.UnicodeSet complement(CharSequence); - method public final android.icu.text.UnicodeSet complementAll(CharSequence); - method public android.icu.text.UnicodeSet complementAll(android.icu.text.UnicodeSet); - method public boolean contains(int); - method public boolean contains(int, int); - method public final boolean contains(CharSequence); - method public boolean containsAll(android.icu.text.UnicodeSet); - method public boolean containsAll(String); - method public <T extends java.lang.CharSequence> boolean containsAll(Iterable<T>); - method public boolean containsNone(int, int); - method public boolean containsNone(android.icu.text.UnicodeSet); - method public boolean containsNone(CharSequence); - method public <T extends java.lang.CharSequence> boolean containsNone(Iterable<T>); - method public final boolean containsSome(int, int); - method public final boolean containsSome(android.icu.text.UnicodeSet); - method public final boolean containsSome(CharSequence); - method public final <T extends java.lang.CharSequence> boolean containsSome(Iterable<T>); - method public android.icu.text.UnicodeSet freeze(); - method public static android.icu.text.UnicodeSet from(CharSequence); - method public static android.icu.text.UnicodeSet fromAll(CharSequence); - method public int getRangeCount(); - method public int getRangeEnd(int); - method public int getRangeStart(int); - method public int indexOf(int); - method public boolean isEmpty(); - method public boolean isFrozen(); - method public java.util.Iterator<java.lang.String> iterator(); - method public boolean matchesIndexValue(int); - method public Iterable<android.icu.text.UnicodeSet.EntryRange> ranges(); - method public android.icu.text.UnicodeSet remove(int, int); - method public final android.icu.text.UnicodeSet remove(int); - method public final android.icu.text.UnicodeSet remove(CharSequence); - method public final android.icu.text.UnicodeSet removeAll(CharSequence); - method public android.icu.text.UnicodeSet removeAll(android.icu.text.UnicodeSet); - method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet removeAll(Iterable<T>); - method public final android.icu.text.UnicodeSet removeAllStrings(); - method public android.icu.text.UnicodeSet retain(int, int); - method public final android.icu.text.UnicodeSet retain(int); - method public final android.icu.text.UnicodeSet retain(CharSequence); - method public final android.icu.text.UnicodeSet retainAll(CharSequence); - method public android.icu.text.UnicodeSet retainAll(android.icu.text.UnicodeSet); - method public <T extends java.lang.CharSequence> android.icu.text.UnicodeSet retainAll(Iterable<T>); - method public android.icu.text.UnicodeSet set(int, int); - method public android.icu.text.UnicodeSet set(android.icu.text.UnicodeSet); - method public int size(); - method public int span(CharSequence, android.icu.text.UnicodeSet.SpanCondition); - method public int span(CharSequence, int, android.icu.text.UnicodeSet.SpanCondition); - method public int spanBack(CharSequence, android.icu.text.UnicodeSet.SpanCondition); - method public int spanBack(CharSequence, int, android.icu.text.UnicodeSet.SpanCondition); - method public java.util.Collection<java.lang.String> strings(); - method public String toPattern(boolean); - field public static final int ADD_CASE_MAPPINGS = 4; // 0x4 - field public static final android.icu.text.UnicodeSet ALL_CODE_POINTS; - field public static final int CASE = 2; // 0x2 - field public static final int CASE_INSENSITIVE = 2; // 0x2 - field public static final android.icu.text.UnicodeSet EMPTY; - field public static final int IGNORE_SPACE = 1; // 0x1 - field public static final int MAX_VALUE = 1114111; // 0x10ffff - field public static final int MIN_VALUE = 0; // 0x0 - } - - public enum UnicodeSet.ComparisonStyle { - enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle LEXICOGRAPHIC; - enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle LONGER_FIRST; - enum_constant public static final android.icu.text.UnicodeSet.ComparisonStyle SHORTER_FIRST; - } - - public static class UnicodeSet.EntryRange { - field public int codepoint; - field public int codepointEnd; - } - - public enum UnicodeSet.SpanCondition { - enum_constant public static final android.icu.text.UnicodeSet.SpanCondition CONDITION_COUNT; - enum_constant public static final android.icu.text.UnicodeSet.SpanCondition CONTAINED; - enum_constant public static final android.icu.text.UnicodeSet.SpanCondition NOT_CONTAINED; - enum_constant public static final android.icu.text.UnicodeSet.SpanCondition SIMPLE; - } - - public class UnicodeSetIterator { - ctor public UnicodeSetIterator(android.icu.text.UnicodeSet); - ctor public UnicodeSetIterator(); - method public String getString(); - method public boolean next(); - method public boolean nextRange(); - method public void reset(android.icu.text.UnicodeSet); - method public void reset(); - field public static int IS_STRING; - field public int codepoint; - field public int codepointEnd; - field public String string; - } - - public class UnicodeSetSpanner { - ctor public UnicodeSetSpanner(android.icu.text.UnicodeSet); - method public int countIn(CharSequence); - method public int countIn(CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod); - method public int countIn(CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition); - method public String deleteFrom(CharSequence); - method public String deleteFrom(CharSequence, android.icu.text.UnicodeSet.SpanCondition); - method public android.icu.text.UnicodeSet getUnicodeSet(); - method public String replaceFrom(CharSequence, CharSequence); - method public String replaceFrom(CharSequence, CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod); - method public String replaceFrom(CharSequence, CharSequence, android.icu.text.UnicodeSetSpanner.CountMethod, android.icu.text.UnicodeSet.SpanCondition); - method public CharSequence trim(CharSequence); - method public CharSequence trim(CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption); - method public CharSequence trim(CharSequence, android.icu.text.UnicodeSetSpanner.TrimOption, android.icu.text.UnicodeSet.SpanCondition); - } - - public enum UnicodeSetSpanner.CountMethod { - enum_constant public static final android.icu.text.UnicodeSetSpanner.CountMethod MIN_ELEMENTS; - enum_constant public static final android.icu.text.UnicodeSetSpanner.CountMethod WHOLE_SPAN; - } - - public enum UnicodeSetSpanner.TrimOption { - enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption BOTH; - enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption LEADING; - enum_constant public static final android.icu.text.UnicodeSetSpanner.TrimOption TRAILING; - } - -} - -package android.icu.util { - - public class BuddhistCalendar extends android.icu.util.GregorianCalendar { - ctor public BuddhistCalendar(); - ctor public BuddhistCalendar(android.icu.util.TimeZone); - ctor public BuddhistCalendar(java.util.Locale); - ctor public BuddhistCalendar(android.icu.util.ULocale); - ctor public BuddhistCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public BuddhistCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public BuddhistCalendar(java.util.Date); - ctor public BuddhistCalendar(int, int, int); - ctor public BuddhistCalendar(int, int, int, int, int, int); - field public static final int BE = 0; // 0x0 - } - - public abstract class Calendar implements java.lang.Cloneable java.lang.Comparable<android.icu.util.Calendar> java.io.Serializable { - ctor protected Calendar(); - ctor protected Calendar(android.icu.util.TimeZone, java.util.Locale); - ctor protected Calendar(android.icu.util.TimeZone, android.icu.util.ULocale); - method public void add(int, int); - method public boolean after(Object); - method public boolean before(Object); - method public final void clear(); - method public final void clear(int); - method public Object clone(); - method public int compareTo(android.icu.util.Calendar); - method protected void complete(); - method protected void computeFields(); - method protected final void computeGregorianFields(int); - method protected int computeGregorianMonthStart(int, int); - method protected int computeJulianDay(); - method @Deprecated protected int computeMillisInDay(); - method protected void computeTime(); - method @Deprecated protected int computeZoneOffset(long, int); - method public int fieldDifference(java.util.Date, int); - method protected String fieldName(int); - method protected static final long floorDivide(long, long); - method protected static final int floorDivide(int, int); - method protected static final int floorDivide(int, int, int[]); - method protected static final int floorDivide(long, int, int[]); - method public final int get(int); - method public int getActualMaximum(int); - method public int getActualMinimum(int); - method public static java.util.Locale[] getAvailableLocales(); - method public android.icu.text.DateFormat getDateTimeFormat(int, int, java.util.Locale); - method public android.icu.text.DateFormat getDateTimeFormat(int, int, android.icu.util.ULocale); - method public String getDisplayName(java.util.Locale); - method public String getDisplayName(android.icu.util.ULocale); - method public final int getFieldCount(); - method protected int[][][] getFieldResolutionTable(); - method public int getFirstDayOfWeek(); - method public final int getGreatestMinimum(int); - method protected final int getGregorianDayOfMonth(); - method protected final int getGregorianDayOfYear(); - method protected final int getGregorianMonth(); - method protected final int getGregorianYear(); - method public static android.icu.util.Calendar getInstance(); - method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone); - method public static android.icu.util.Calendar getInstance(java.util.Locale); - method public static android.icu.util.Calendar getInstance(android.icu.util.ULocale); - method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone, java.util.Locale); - method public static android.icu.util.Calendar getInstance(android.icu.util.TimeZone, android.icu.util.ULocale); - method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean); - method public final int getLeastMaximum(int); - method protected int getLimit(int, int); - method public final int getMaximum(int); - method public int getMinimalDaysInFirstWeek(); - method public final int getMinimum(int); - method public int getRepeatedWallTimeOption(); - method public int getSkippedWallTimeOption(); - method protected final int getStamp(int); - method public final java.util.Date getTime(); - method public long getTimeInMillis(); - method public android.icu.util.TimeZone getTimeZone(); - method public String getType(); - method public android.icu.util.Calendar.WeekData getWeekData(); - method public static android.icu.util.Calendar.WeekData getWeekDataForRegion(String); - method protected static final int gregorianMonthLength(int, int); - method protected static final int gregorianPreviousMonthLength(int, int); - method protected void handleComputeFields(int); - method protected int handleComputeJulianDay(int); - method protected abstract int handleComputeMonthStart(int, int, boolean); - method protected int[] handleCreateFields(); - method protected android.icu.text.DateFormat handleGetDateFormat(String, java.util.Locale); - method protected android.icu.text.DateFormat handleGetDateFormat(String, String, java.util.Locale); - method protected android.icu.text.DateFormat handleGetDateFormat(String, android.icu.util.ULocale); - method protected abstract int handleGetExtendedYear(); - method protected abstract int handleGetLimit(int, int); - method protected int handleGetMonthLength(int, int); - method protected int handleGetYearLength(int); - method protected final int internalGet(int); - method protected final int internalGet(int, int); - method protected final long internalGetTimeInMillis(); - method protected final void internalSet(int, int); - method public boolean isEquivalentTo(android.icu.util.Calendar); - method protected static final boolean isGregorianLeapYear(int); - method public boolean isLenient(); - method public final boolean isSet(int); - method public boolean isWeekend(java.util.Date); - method public boolean isWeekend(); - method protected static final int julianDayToDayOfWeek(int); - method protected static final long julianDayToMillis(int); - method protected static final int millisToJulianDay(long); - method protected int newerField(int, int); - method protected int newestStamp(int, int, int); - method protected void pinField(int); - method protected void prepareGetActual(int, boolean); - method protected int resolveFields(int[][][]); - method public final void roll(int, boolean); - method public void roll(int, int); - method public final void set(int, int); - method public final void set(int, int, int); - method public final void set(int, int, int, int, int); - method public final void set(int, int, int, int, int, int); - method public void setFirstDayOfWeek(int); - method public void setLenient(boolean); - method public void setMinimalDaysInFirstWeek(int); - method public void setRepeatedWallTimeOption(int); - method public void setSkippedWallTimeOption(int); - method public final void setTime(java.util.Date); - method public void setTimeInMillis(long); - method public void setTimeZone(android.icu.util.TimeZone); - method public android.icu.util.Calendar setWeekData(android.icu.util.Calendar.WeekData); - method protected void validateField(int); - method protected final void validateField(int, int, int); - method protected void validateFields(); - method protected int weekNumber(int, int, int); - method protected final int weekNumber(int, int); - field public static final int AM = 0; // 0x0 - field public static final int AM_PM = 9; // 0x9 - field public static final int APRIL = 3; // 0x3 - field public static final int AUGUST = 7; // 0x7 - field @Deprecated protected static final int BASE_FIELD_COUNT = 23; // 0x17 - field public static final int DATE = 5; // 0x5 - field public static final int DAY_OF_MONTH = 5; // 0x5 - field public static final int DAY_OF_WEEK = 7; // 0x7 - field public static final int DAY_OF_WEEK_IN_MONTH = 8; // 0x8 - field public static final int DAY_OF_YEAR = 6; // 0x6 - field public static final int DECEMBER = 11; // 0xb - field public static final int DOW_LOCAL = 18; // 0x12 - field public static final int DST_OFFSET = 16; // 0x10 - field protected static final int EPOCH_JULIAN_DAY = 2440588; // 0x253d8c - field public static final int ERA = 0; // 0x0 - field public static final int EXTENDED_YEAR = 19; // 0x13 - field public static final int FEBRUARY = 1; // 0x1 - field public static final int FRIDAY = 6; // 0x6 - field protected static final int GREATEST_MINIMUM = 1; // 0x1 - field public static final int HOUR = 10; // 0xa - field public static final int HOUR_OF_DAY = 11; // 0xb - field protected static final int INTERNALLY_SET = 1; // 0x1 - field public static final int IS_LEAP_MONTH = 22; // 0x16 - field public static final int JANUARY = 0; // 0x0 - field protected static final int JAN_1_1_JULIAN_DAY = 1721426; // 0x1a4452 - field public static final int JULIAN_DAY = 20; // 0x14 - field public static final int JULY = 6; // 0x6 - field public static final int JUNE = 5; // 0x5 - field protected static final int LEAST_MAXIMUM = 2; // 0x2 - field public static final int MARCH = 2; // 0x2 - field protected static final int MAXIMUM = 3; // 0x3 - field protected static final java.util.Date MAX_DATE; - field @Deprecated protected static final int MAX_FIELD_COUNT = 32; // 0x20 - field protected static final int MAX_JULIAN = 2130706432; // 0x7f000000 - field protected static final long MAX_MILLIS = 183882168921600000L; // 0x28d47dbbf19b000L - field public static final int MAY = 4; // 0x4 - field public static final int MILLISECOND = 14; // 0xe - field public static final int MILLISECONDS_IN_DAY = 21; // 0x15 - field protected static final int MINIMUM = 0; // 0x0 - field protected static final int MINIMUM_USER_STAMP = 2; // 0x2 - field public static final int MINUTE = 12; // 0xc - field protected static final java.util.Date MIN_DATE; - field protected static final int MIN_JULIAN = -2130706432; // 0x81000000 - field protected static final long MIN_MILLIS = -184303902528000000L; // 0xfd713893bf19b000L - field public static final int MONDAY = 2; // 0x2 - field public static final int MONTH = 2; // 0x2 - field public static final int NOVEMBER = 10; // 0xa - field public static final int OCTOBER = 9; // 0x9 - field protected static final long ONE_DAY = 86400000L; // 0x5265c00L - field protected static final int ONE_HOUR = 3600000; // 0x36ee80 - field protected static final int ONE_MINUTE = 60000; // 0xea60 - field protected static final int ONE_SECOND = 1000; // 0x3e8 - field protected static final long ONE_WEEK = 604800000L; // 0x240c8400L - field public static final int PM = 1; // 0x1 - field protected static final int RESOLVE_REMAP = 32; // 0x20 - field public static final int SATURDAY = 7; // 0x7 - field public static final int SECOND = 13; // 0xd - field public static final int SEPTEMBER = 8; // 0x8 - field public static final int SUNDAY = 1; // 0x1 - field public static final int THURSDAY = 5; // 0x5 - field public static final int TUESDAY = 3; // 0x3 - field public static final int UNDECIMBER = 12; // 0xc - field protected static final int UNSET = 0; // 0x0 - field public static final int WALLTIME_FIRST = 1; // 0x1 - field public static final int WALLTIME_LAST = 0; // 0x0 - field public static final int WALLTIME_NEXT_VALID = 2; // 0x2 - field public static final int WEDNESDAY = 4; // 0x4 - field public static final int WEEK_OF_MONTH = 4; // 0x4 - field public static final int WEEK_OF_YEAR = 3; // 0x3 - field public static final int YEAR = 1; // 0x1 - field public static final int YEAR_WOY = 17; // 0x11 - field public static final int ZONE_OFFSET = 15; // 0xf - } - - public static final class Calendar.WeekData { - ctor public Calendar.WeekData(int, int, int, int, int, int); - field public final int firstDayOfWeek; - field public final int minimalDaysInFirstWeek; - field public final int weekendCease; - field public final int weekendCeaseMillis; - field public final int weekendOnset; - field public final int weekendOnsetMillis; - } - - public class ChineseCalendar extends android.icu.util.Calendar { - ctor public ChineseCalendar(); - ctor public ChineseCalendar(java.util.Date); - ctor public ChineseCalendar(int, int, int, int); - ctor public ChineseCalendar(int, int, int, int, int, int, int); - ctor public ChineseCalendar(int, int, int, int, int); - ctor public ChineseCalendar(int, int, int, int, int, int, int, int); - ctor public ChineseCalendar(java.util.Locale); - ctor public ChineseCalendar(android.icu.util.TimeZone); - ctor public ChineseCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public ChineseCalendar(android.icu.util.ULocale); - ctor public ChineseCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - method protected int handleComputeMonthStart(int, int, boolean); - method protected android.icu.text.DateFormat handleGetDateFormat(String, String, android.icu.util.ULocale); - method protected int handleGetExtendedYear(); - method protected int handleGetLimit(int, int); - } - - public final class CopticCalendar extends android.icu.util.Calendar { - ctor public CopticCalendar(); - ctor public CopticCalendar(android.icu.util.TimeZone); - ctor public CopticCalendar(java.util.Locale); - ctor public CopticCalendar(android.icu.util.ULocale); - ctor public CopticCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public CopticCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public CopticCalendar(int, int, int); - ctor public CopticCalendar(java.util.Date); - ctor public CopticCalendar(int, int, int, int, int, int); - method @Deprecated protected void handleComputeFields(int); - method protected int handleComputeMonthStart(int, int, boolean); - method @Deprecated protected int handleGetExtendedYear(); - method protected int handleGetLimit(int, int); - field public static final int AMSHIR = 5; // 0x5 - field public static final int BABA = 1; // 0x1 - field public static final int BARAMHAT = 6; // 0x6 - field public static final int BARAMOUDA = 7; // 0x7 - field public static final int BASHANS = 8; // 0x8 - field public static final int EPEP = 10; // 0xa - field public static final int HATOR = 2; // 0x2 - field public static final int KIAHK = 3; // 0x3 - field public static final int MESRA = 11; // 0xb - field public static final int NASIE = 12; // 0xc - field public static final int PAONA = 9; // 0x9 - field public static final int TOBA = 4; // 0x4 - field public static final int TOUT = 0; // 0x0 - } - - public class Currency extends android.icu.util.MeasureUnit { - ctor protected Currency(String); - method public static android.icu.util.Currency fromJavaCurrency(java.util.Currency); - method public static java.util.Set<android.icu.util.Currency> getAvailableCurrencies(); - method public static String[] getAvailableCurrencyCodes(android.icu.util.ULocale, java.util.Date); - method public static String[] getAvailableCurrencyCodes(java.util.Locale, java.util.Date); - method public static java.util.Locale[] getAvailableLocales(); - method public static android.icu.util.ULocale[] getAvailableULocales(); - method public String getCurrencyCode(); - method public int getDefaultFractionDigits(); - method public int getDefaultFractionDigits(android.icu.util.Currency.CurrencyUsage); - method public String getDisplayName(); - method public String getDisplayName(java.util.Locale); - method public static android.icu.util.Currency getInstance(java.util.Locale); - method public static android.icu.util.Currency getInstance(android.icu.util.ULocale); - method public static android.icu.util.Currency getInstance(String); - method public static final String[] getKeywordValuesForLocale(String, android.icu.util.ULocale, boolean); - method public String getName(java.util.Locale, int, boolean[]); - method public String getName(android.icu.util.ULocale, int, boolean[]); - method public String getName(java.util.Locale, int, String, boolean[]); - method public String getName(android.icu.util.ULocale, int, String, boolean[]); - method public int getNumericCode(); - method public double getRoundingIncrement(); - method public double getRoundingIncrement(android.icu.util.Currency.CurrencyUsage); - method public String getSymbol(); - method public String getSymbol(java.util.Locale); - method public String getSymbol(android.icu.util.ULocale); - method public static boolean isAvailable(String, java.util.Date, java.util.Date); - method public java.util.Currency toJavaCurrency(); - field public static final int LONG_NAME = 1; // 0x1 - field public static final int NARROW_SYMBOL_NAME = 3; // 0x3 - field public static final int PLURAL_LONG_NAME = 2; // 0x2 - field public static final int SYMBOL_NAME = 0; // 0x0 - } - - public enum Currency.CurrencyUsage { - enum_constant public static final android.icu.util.Currency.CurrencyUsage CASH; - enum_constant public static final android.icu.util.Currency.CurrencyUsage STANDARD; - } - - public class CurrencyAmount extends android.icu.util.Measure { - ctor public CurrencyAmount(Number, android.icu.util.Currency); - ctor public CurrencyAmount(double, android.icu.util.Currency); - ctor public CurrencyAmount(Number, java.util.Currency); - ctor public CurrencyAmount(double, java.util.Currency); - method public android.icu.util.Currency getCurrency(); - } - - public final class DateInterval implements java.io.Serializable { - ctor public DateInterval(long, long); - method public long getFromDate(); - method public long getToDate(); - } - - public final class EthiopicCalendar extends android.icu.util.Calendar { - ctor public EthiopicCalendar(); - ctor public EthiopicCalendar(android.icu.util.TimeZone); - ctor public EthiopicCalendar(java.util.Locale); - ctor public EthiopicCalendar(android.icu.util.ULocale); - ctor public EthiopicCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public EthiopicCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public EthiopicCalendar(int, int, int); - ctor public EthiopicCalendar(java.util.Date); - ctor public EthiopicCalendar(int, int, int, int, int, int); - method @Deprecated protected void handleComputeFields(int); - method protected int handleComputeMonthStart(int, int, boolean); - method @Deprecated protected int handleGetExtendedYear(); - method @Deprecated protected int handleGetLimit(int, int); - method public boolean isAmeteAlemEra(); - method public void setAmeteAlemEra(boolean); - field public static final int GENBOT = 8; // 0x8 - field public static final int HAMLE = 10; // 0xa - field public static final int HEDAR = 2; // 0x2 - field public static final int MEGABIT = 6; // 0x6 - field public static final int MESKEREM = 0; // 0x0 - field public static final int MIAZIA = 7; // 0x7 - field public static final int NEHASSE = 11; // 0xb - field public static final int PAGUMEN = 12; // 0xc - field public static final int SENE = 9; // 0x9 - field public static final int TAHSAS = 3; // 0x3 - field public static final int TEKEMT = 1; // 0x1 - field public static final int TER = 4; // 0x4 - field public static final int YEKATIT = 5; // 0x5 - } - - public interface Freezable<T> extends java.lang.Cloneable { - method public T cloneAsThawed(); - method public T freeze(); - method public boolean isFrozen(); - } - - public class GregorianCalendar extends android.icu.util.Calendar { - ctor public GregorianCalendar(); - ctor public GregorianCalendar(android.icu.util.TimeZone); - ctor public GregorianCalendar(java.util.Locale); - ctor public GregorianCalendar(android.icu.util.ULocale); - ctor public GregorianCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public GregorianCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public GregorianCalendar(int, int, int); - ctor public GregorianCalendar(int, int, int, int, int); - ctor public GregorianCalendar(int, int, int, int, int, int); - method public final java.util.Date getGregorianChange(); - method protected int handleComputeMonthStart(int, int, boolean); - method protected int handleGetExtendedYear(); - method protected int handleGetLimit(int, int); - method public boolean isLeapYear(int); - method public void setGregorianChange(java.util.Date); - field public static final int AD = 1; // 0x1 - field public static final int BC = 0; // 0x0 - field protected transient boolean invertGregorian; - field protected transient boolean isGregorian; - } - - public class HebrewCalendar extends android.icu.util.Calendar { - ctor public HebrewCalendar(); - ctor public HebrewCalendar(android.icu.util.TimeZone); - ctor public HebrewCalendar(java.util.Locale); - ctor public HebrewCalendar(android.icu.util.ULocale); - ctor public HebrewCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public HebrewCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public HebrewCalendar(int, int, int); - ctor public HebrewCalendar(java.util.Date); - ctor public HebrewCalendar(int, int, int, int, int, int); - method protected int handleComputeMonthStart(int, int, boolean); - method protected int handleGetExtendedYear(); - method protected int handleGetLimit(int, int); - method @Deprecated protected void validateField(int); - field public static final int ADAR = 6; // 0x6 - field public static final int ADAR_1 = 5; // 0x5 - field public static final int AV = 11; // 0xb - field public static final int ELUL = 12; // 0xc - field public static final int HESHVAN = 1; // 0x1 - field public static final int IYAR = 8; // 0x8 - field public static final int KISLEV = 2; // 0x2 - field public static final int NISAN = 7; // 0x7 - field public static final int SHEVAT = 4; // 0x4 - field public static final int SIVAN = 9; // 0x9 - field public static final int TAMUZ = 10; // 0xa - field public static final int TEVET = 3; // 0x3 - field public static final int TISHRI = 0; // 0x0 - } - - public class ICUUncheckedIOException extends java.lang.RuntimeException { - ctor public ICUUncheckedIOException(); - ctor public ICUUncheckedIOException(String); - ctor public ICUUncheckedIOException(Throwable); - ctor public ICUUncheckedIOException(String, Throwable); - } - - public class IllformedLocaleException extends java.lang.RuntimeException { - ctor public IllformedLocaleException(); - ctor public IllformedLocaleException(String); - ctor public IllformedLocaleException(String, int); - method public int getErrorIndex(); - } - - public class IndianCalendar extends android.icu.util.Calendar { - ctor public IndianCalendar(); - ctor public IndianCalendar(android.icu.util.TimeZone); - ctor public IndianCalendar(java.util.Locale); - ctor public IndianCalendar(android.icu.util.ULocale); - ctor public IndianCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public IndianCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public IndianCalendar(java.util.Date); - ctor public IndianCalendar(int, int, int); - ctor public IndianCalendar(int, int, int, int, int, int); - method protected int handleComputeMonthStart(int, int, boolean); - method protected int handleGetExtendedYear(); - method protected int handleGetLimit(int, int); - field public static final int AGRAHAYANA = 8; // 0x8 - field public static final int ASADHA = 3; // 0x3 - field public static final int ASVINA = 6; // 0x6 - field public static final int BHADRA = 5; // 0x5 - field public static final int CHAITRA = 0; // 0x0 - field public static final int IE = 0; // 0x0 - field public static final int JYAISTHA = 2; // 0x2 - field public static final int KARTIKA = 7; // 0x7 - field public static final int MAGHA = 10; // 0xa - field public static final int PAUSA = 9; // 0x9 - field public static final int PHALGUNA = 11; // 0xb - field public static final int SRAVANA = 4; // 0x4 - field public static final int VAISAKHA = 1; // 0x1 - } - - public class IslamicCalendar extends android.icu.util.Calendar { - ctor public IslamicCalendar(); - ctor public IslamicCalendar(android.icu.util.TimeZone); - ctor public IslamicCalendar(java.util.Locale); - ctor public IslamicCalendar(android.icu.util.ULocale); - ctor public IslamicCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public IslamicCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public IslamicCalendar(java.util.Date); - ctor public IslamicCalendar(int, int, int); - ctor public IslamicCalendar(int, int, int, int, int, int); - method public android.icu.util.IslamicCalendar.CalculationType getCalculationType(); - method protected int handleComputeMonthStart(int, int, boolean); - method protected int handleGetExtendedYear(); - method protected int handleGetLimit(int, int); - method public void setCalculationType(android.icu.util.IslamicCalendar.CalculationType); - field public static final int DHU_AL_HIJJAH = 11; // 0xb - field public static final int DHU_AL_QIDAH = 10; // 0xa - field public static final int JUMADA_1 = 4; // 0x4 - field public static final int JUMADA_2 = 5; // 0x5 - field public static final int MUHARRAM = 0; // 0x0 - field public static final int RABI_1 = 2; // 0x2 - field public static final int RABI_2 = 3; // 0x3 - field public static final int RAJAB = 6; // 0x6 - field public static final int RAMADAN = 8; // 0x8 - field public static final int SAFAR = 1; // 0x1 - field public static final int SHABAN = 7; // 0x7 - field public static final int SHAWWAL = 9; // 0x9 - } - - public enum IslamicCalendar.CalculationType { - enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC; - enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_CIVIL; - enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_TBLA; - enum_constant public static final android.icu.util.IslamicCalendar.CalculationType ISLAMIC_UMALQURA; - } - - public class JapaneseCalendar extends android.icu.util.GregorianCalendar { - ctor public JapaneseCalendar(); - ctor public JapaneseCalendar(android.icu.util.TimeZone); - ctor public JapaneseCalendar(java.util.Locale); - ctor public JapaneseCalendar(android.icu.util.ULocale); - ctor public JapaneseCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public JapaneseCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public JapaneseCalendar(java.util.Date); - ctor public JapaneseCalendar(int, int, int, int); - ctor public JapaneseCalendar(int, int, int); - ctor public JapaneseCalendar(int, int, int, int, int, int); - field public static final int HEISEI; - field public static final int MEIJI; - field public static final int REIWA; - field public static final int SHOWA; - field public static final int TAISHO; - } - - public final class LocaleData { - method public static android.icu.util.VersionInfo getCLDRVersion(); - method public String getDelimiter(int); - method public static android.icu.util.LocaleData getInstance(android.icu.util.ULocale); - method public static android.icu.util.LocaleData getInstance(); - method public static android.icu.util.LocaleData.MeasurementSystem getMeasurementSystem(android.icu.util.ULocale); - method public boolean getNoSubstitute(); - method public static android.icu.util.LocaleData.PaperSize getPaperSize(android.icu.util.ULocale); - method public void setNoSubstitute(boolean); - field public static final int ALT_QUOTATION_END = 3; // 0x3 - field public static final int ALT_QUOTATION_START = 2; // 0x2 - field public static final int QUOTATION_END = 1; // 0x1 - field public static final int QUOTATION_START = 0; // 0x0 - } - - public static final class LocaleData.MeasurementSystem { - field public static final android.icu.util.LocaleData.MeasurementSystem SI; - field public static final android.icu.util.LocaleData.MeasurementSystem UK; - field public static final android.icu.util.LocaleData.MeasurementSystem US; - } - - public static final class LocaleData.PaperSize { - method public int getHeight(); - method public int getWidth(); - } - - public class Measure { - ctor public Measure(Number, android.icu.util.MeasureUnit); - method public Number getNumber(); - method public android.icu.util.MeasureUnit getUnit(); - } - - public class MeasureUnit implements java.io.Serializable { - method public static java.util.Set<android.icu.util.MeasureUnit> getAvailable(String); - method public static java.util.Set<android.icu.util.MeasureUnit> getAvailable(); - method public static java.util.Set<java.lang.String> getAvailableTypes(); - method public String getSubtype(); - method public String getType(); - field public static final android.icu.util.MeasureUnit ACRE; - field public static final android.icu.util.MeasureUnit ACRE_FOOT; - field public static final android.icu.util.MeasureUnit AMPERE; - field public static final android.icu.util.MeasureUnit ARC_MINUTE; - field public static final android.icu.util.MeasureUnit ARC_SECOND; - field public static final android.icu.util.MeasureUnit ASTRONOMICAL_UNIT; - field public static final android.icu.util.MeasureUnit ATMOSPHERE; - field public static final android.icu.util.MeasureUnit BIT; - field public static final android.icu.util.MeasureUnit BUSHEL; - field public static final android.icu.util.MeasureUnit BYTE; - field public static final android.icu.util.MeasureUnit CALORIE; - field public static final android.icu.util.MeasureUnit CARAT; - field public static final android.icu.util.MeasureUnit CELSIUS; - field public static final android.icu.util.MeasureUnit CENTILITER; - field public static final android.icu.util.MeasureUnit CENTIMETER; - field public static final android.icu.util.MeasureUnit CENTURY; - field public static final android.icu.util.MeasureUnit CUBIC_CENTIMETER; - field public static final android.icu.util.MeasureUnit CUBIC_FOOT; - field public static final android.icu.util.MeasureUnit CUBIC_INCH; - field public static final android.icu.util.MeasureUnit CUBIC_KILOMETER; - field public static final android.icu.util.MeasureUnit CUBIC_METER; - field public static final android.icu.util.MeasureUnit CUBIC_MILE; - field public static final android.icu.util.MeasureUnit CUBIC_YARD; - field public static final android.icu.util.MeasureUnit CUP; - field public static final android.icu.util.MeasureUnit CUP_METRIC; - field public static final android.icu.util.TimeUnit DAY; - field public static final android.icu.util.MeasureUnit DECILITER; - field public static final android.icu.util.MeasureUnit DECIMETER; - field public static final android.icu.util.MeasureUnit DEGREE; - field public static final android.icu.util.MeasureUnit FAHRENHEIT; - field public static final android.icu.util.MeasureUnit FATHOM; - field public static final android.icu.util.MeasureUnit FLUID_OUNCE; - field public static final android.icu.util.MeasureUnit FOODCALORIE; - field public static final android.icu.util.MeasureUnit FOOT; - field public static final android.icu.util.MeasureUnit FURLONG; - field public static final android.icu.util.MeasureUnit GALLON; - field public static final android.icu.util.MeasureUnit GALLON_IMPERIAL; - field public static final android.icu.util.MeasureUnit GENERIC_TEMPERATURE; - field public static final android.icu.util.MeasureUnit GIGABIT; - field public static final android.icu.util.MeasureUnit GIGABYTE; - field public static final android.icu.util.MeasureUnit GIGAHERTZ; - field public static final android.icu.util.MeasureUnit GIGAWATT; - field public static final android.icu.util.MeasureUnit GRAM; - field public static final android.icu.util.MeasureUnit G_FORCE; - field public static final android.icu.util.MeasureUnit HECTARE; - field public static final android.icu.util.MeasureUnit HECTOLITER; - field public static final android.icu.util.MeasureUnit HECTOPASCAL; - field public static final android.icu.util.MeasureUnit HERTZ; - field public static final android.icu.util.MeasureUnit HORSEPOWER; - field public static final android.icu.util.TimeUnit HOUR; - field public static final android.icu.util.MeasureUnit INCH; - field public static final android.icu.util.MeasureUnit INCH_HG; - field public static final android.icu.util.MeasureUnit JOULE; - field public static final android.icu.util.MeasureUnit KARAT; - field public static final android.icu.util.MeasureUnit KELVIN; - field public static final android.icu.util.MeasureUnit KILOBIT; - field public static final android.icu.util.MeasureUnit KILOBYTE; - field public static final android.icu.util.MeasureUnit KILOCALORIE; - field public static final android.icu.util.MeasureUnit KILOGRAM; - field public static final android.icu.util.MeasureUnit KILOHERTZ; - field public static final android.icu.util.MeasureUnit KILOJOULE; - field public static final android.icu.util.MeasureUnit KILOMETER; - field public static final android.icu.util.MeasureUnit KILOMETER_PER_HOUR; - field public static final android.icu.util.MeasureUnit KILOWATT; - field public static final android.icu.util.MeasureUnit KILOWATT_HOUR; - field public static final android.icu.util.MeasureUnit KNOT; - field public static final android.icu.util.MeasureUnit LIGHT_YEAR; - field public static final android.icu.util.MeasureUnit LITER; - field public static final android.icu.util.MeasureUnit LITER_PER_100KILOMETERS; - field public static final android.icu.util.MeasureUnit LITER_PER_KILOMETER; - field public static final android.icu.util.MeasureUnit LUX; - field public static final android.icu.util.MeasureUnit MEGABIT; - field public static final android.icu.util.MeasureUnit MEGABYTE; - field public static final android.icu.util.MeasureUnit MEGAHERTZ; - field public static final android.icu.util.MeasureUnit MEGALITER; - field public static final android.icu.util.MeasureUnit MEGAWATT; - field public static final android.icu.util.MeasureUnit METER; - field public static final android.icu.util.MeasureUnit METER_PER_SECOND; - field public static final android.icu.util.MeasureUnit METER_PER_SECOND_SQUARED; - field public static final android.icu.util.MeasureUnit METRIC_TON; - field public static final android.icu.util.MeasureUnit MICROGRAM; - field public static final android.icu.util.MeasureUnit MICROMETER; - field public static final android.icu.util.MeasureUnit MICROSECOND; - field public static final android.icu.util.MeasureUnit MILE; - field public static final android.icu.util.MeasureUnit MILE_PER_GALLON; - field public static final android.icu.util.MeasureUnit MILE_PER_GALLON_IMPERIAL; - field public static final android.icu.util.MeasureUnit MILE_PER_HOUR; - field public static final android.icu.util.MeasureUnit MILE_SCANDINAVIAN; - field public static final android.icu.util.MeasureUnit MILLIAMPERE; - field public static final android.icu.util.MeasureUnit MILLIBAR; - field public static final android.icu.util.MeasureUnit MILLIGRAM; - field public static final android.icu.util.MeasureUnit MILLIGRAM_PER_DECILITER; - field public static final android.icu.util.MeasureUnit MILLILITER; - field public static final android.icu.util.MeasureUnit MILLIMETER; - field public static final android.icu.util.MeasureUnit MILLIMETER_OF_MERCURY; - field public static final android.icu.util.MeasureUnit MILLIMOLE_PER_LITER; - field public static final android.icu.util.MeasureUnit MILLISECOND; - field public static final android.icu.util.MeasureUnit MILLIWATT; - field public static final android.icu.util.TimeUnit MINUTE; - field public static final android.icu.util.TimeUnit MONTH; - field public static final android.icu.util.MeasureUnit NANOMETER; - field public static final android.icu.util.MeasureUnit NANOSECOND; - field public static final android.icu.util.MeasureUnit NAUTICAL_MILE; - field public static final android.icu.util.MeasureUnit OHM; - field public static final android.icu.util.MeasureUnit OUNCE; - field public static final android.icu.util.MeasureUnit OUNCE_TROY; - field public static final android.icu.util.MeasureUnit PARSEC; - field public static final android.icu.util.MeasureUnit PART_PER_MILLION; - field public static final android.icu.util.MeasureUnit PERCENT; - field public static final android.icu.util.MeasureUnit PERMILLE; - field public static final android.icu.util.MeasureUnit PETABYTE; - field public static final android.icu.util.MeasureUnit PICOMETER; - field public static final android.icu.util.MeasureUnit PINT; - field public static final android.icu.util.MeasureUnit PINT_METRIC; - field public static final android.icu.util.MeasureUnit POINT; - field public static final android.icu.util.MeasureUnit POUND; - field public static final android.icu.util.MeasureUnit POUND_PER_SQUARE_INCH; - field public static final android.icu.util.MeasureUnit QUART; - field public static final android.icu.util.MeasureUnit RADIAN; - field public static final android.icu.util.MeasureUnit REVOLUTION_ANGLE; - field public static final android.icu.util.TimeUnit SECOND; - field public static final android.icu.util.MeasureUnit SQUARE_CENTIMETER; - field public static final android.icu.util.MeasureUnit SQUARE_FOOT; - field public static final android.icu.util.MeasureUnit SQUARE_INCH; - field public static final android.icu.util.MeasureUnit SQUARE_KILOMETER; - field public static final android.icu.util.MeasureUnit SQUARE_METER; - field public static final android.icu.util.MeasureUnit SQUARE_MILE; - field public static final android.icu.util.MeasureUnit SQUARE_YARD; - field public static final android.icu.util.MeasureUnit STONE; - field public static final android.icu.util.MeasureUnit TABLESPOON; - field public static final android.icu.util.MeasureUnit TEASPOON; - field public static final android.icu.util.MeasureUnit TERABIT; - field public static final android.icu.util.MeasureUnit TERABYTE; - field public static final android.icu.util.MeasureUnit TON; - field public static final android.icu.util.MeasureUnit VOLT; - field public static final android.icu.util.MeasureUnit WATT; - field public static final android.icu.util.TimeUnit WEEK; - field public static final android.icu.util.MeasureUnit YARD; - field public static final android.icu.util.TimeUnit YEAR; - } - - public class Output<T> { - ctor public Output(); - ctor public Output(T); - field public T value; - } - - public interface RangeValueIterator { - method public boolean next(android.icu.util.RangeValueIterator.Element); - method public void reset(); - } - - public static class RangeValueIterator.Element { - ctor public RangeValueIterator.Element(); - field public int limit; - field public int start; - field public int value; - } - - public class TaiwanCalendar extends android.icu.util.GregorianCalendar { - ctor public TaiwanCalendar(); - ctor public TaiwanCalendar(android.icu.util.TimeZone); - ctor public TaiwanCalendar(java.util.Locale); - ctor public TaiwanCalendar(android.icu.util.ULocale); - ctor public TaiwanCalendar(android.icu.util.TimeZone, java.util.Locale); - ctor public TaiwanCalendar(android.icu.util.TimeZone, android.icu.util.ULocale); - ctor public TaiwanCalendar(java.util.Date); - ctor public TaiwanCalendar(int, int, int); - ctor public TaiwanCalendar(int, int, int, int, int, int); - field public static final int BEFORE_MINGUO = 0; // 0x0 - field public static final int MINGUO = 1; // 0x1 - } - - public class TimeUnit extends android.icu.util.MeasureUnit { - method public static android.icu.util.TimeUnit[] values(); - } - - public abstract class TimeZone implements java.lang.Cloneable android.icu.util.Freezable<android.icu.util.TimeZone> java.io.Serializable { - ctor public TimeZone(); - method public Object clone(); - method public android.icu.util.TimeZone cloneAsThawed(); - method public static int countEquivalentIDs(String); - method public android.icu.util.TimeZone freeze(); - method public static java.util.Set<java.lang.String> getAvailableIDs(android.icu.util.TimeZone.SystemTimeZoneType, String, Integer); - method public static String[] getAvailableIDs(int); - method public static String[] getAvailableIDs(String); - method public static String[] getAvailableIDs(); - method public static String getCanonicalID(String); - method public static String getCanonicalID(String, boolean[]); - method public int getDSTSavings(); - method public static android.icu.util.TimeZone getDefault(); - method public final String getDisplayName(); - method public final String getDisplayName(java.util.Locale); - method public final String getDisplayName(android.icu.util.ULocale); - method public final String getDisplayName(boolean, int); - method public String getDisplayName(boolean, int, java.util.Locale); - method public String getDisplayName(boolean, int, android.icu.util.ULocale); - method public static String getEquivalentID(String, int); - method public static android.icu.util.TimeZone getFrozenTimeZone(String); - method public String getID(); - method public static String getIDForWindowsID(String, String); - method public abstract int getOffset(int, int, int, int, int, int); - method public int getOffset(long); - method public void getOffset(long, boolean, int[]); - method public abstract int getRawOffset(); - method public static String getRegion(String); - method public static String getTZDataVersion(); - method public static android.icu.util.TimeZone getTimeZone(String); - method public static android.icu.util.TimeZone getTimeZone(String, int); - method public static String getWindowsID(String); - method public boolean hasSameRules(android.icu.util.TimeZone); - method public abstract boolean inDaylightTime(java.util.Date); - method public boolean isFrozen(); - method public boolean observesDaylightTime(); - method public void setID(String); - method public abstract void setRawOffset(int); - method public abstract boolean useDaylightTime(); - field public static final int GENERIC_LOCATION = 7; // 0x7 - field public static final android.icu.util.TimeZone GMT_ZONE; - field public static final int LONG = 1; // 0x1 - field public static final int LONG_GENERIC = 3; // 0x3 - field public static final int LONG_GMT = 5; // 0x5 - field public static final int SHORT = 0; // 0x0 - field public static final int SHORT_COMMONLY_USED = 6; // 0x6 - field public static final int SHORT_GENERIC = 2; // 0x2 - field public static final int SHORT_GMT = 4; // 0x4 - field public static final int TIMEZONE_ICU = 0; // 0x0 - field public static final int TIMEZONE_JDK = 1; // 0x1 - field public static final android.icu.util.TimeZone UNKNOWN_ZONE; - field public static final String UNKNOWN_ZONE_ID = "Etc/Unknown"; - } - - public enum TimeZone.SystemTimeZoneType { - enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType ANY; - enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType CANONICAL; - enum_constant public static final android.icu.util.TimeZone.SystemTimeZoneType CANONICAL_LOCATION; - } - - public final class ULocale implements java.lang.Comparable<android.icu.util.ULocale> java.io.Serializable { - ctor public ULocale(String); - ctor public ULocale(String, String); - ctor public ULocale(String, String, String); - method public static android.icu.util.ULocale acceptLanguage(String, android.icu.util.ULocale[], boolean[]); - method public static android.icu.util.ULocale acceptLanguage(android.icu.util.ULocale[], android.icu.util.ULocale[], boolean[]); - method public static android.icu.util.ULocale acceptLanguage(String, boolean[]); - method public static android.icu.util.ULocale acceptLanguage(android.icu.util.ULocale[], boolean[]); - method public static android.icu.util.ULocale addLikelySubtags(android.icu.util.ULocale); - method public static String canonicalize(String); - method public Object clone(); - method public int compareTo(android.icu.util.ULocale); - method public static android.icu.util.ULocale createCanonical(String); - method public static android.icu.util.ULocale forLanguageTag(String); - method public static android.icu.util.ULocale forLocale(java.util.Locale); - method public static android.icu.util.ULocale[] getAvailableLocales(); - method public String getBaseName(); - method public static String getBaseName(String); - method public String getCharacterOrientation(); - method public String getCountry(); - method public static String getCountry(String); - method public static android.icu.util.ULocale getDefault(); - method public static android.icu.util.ULocale getDefault(android.icu.util.ULocale.Category); - method public String getDisplayCountry(); - method public String getDisplayCountry(android.icu.util.ULocale); - method public static String getDisplayCountry(String, String); - method public static String getDisplayCountry(String, android.icu.util.ULocale); - method public static String getDisplayKeyword(String); - method public static String getDisplayKeyword(String, String); - method public static String getDisplayKeyword(String, android.icu.util.ULocale); - method public String getDisplayKeywordValue(String); - method public String getDisplayKeywordValue(String, android.icu.util.ULocale); - method public static String getDisplayKeywordValue(String, String, String); - method public static String getDisplayKeywordValue(String, String, android.icu.util.ULocale); - method public String getDisplayLanguage(); - method public String getDisplayLanguage(android.icu.util.ULocale); - method public static String getDisplayLanguage(String, String); - method public static String getDisplayLanguage(String, android.icu.util.ULocale); - method public String getDisplayLanguageWithDialect(); - method public String getDisplayLanguageWithDialect(android.icu.util.ULocale); - method public static String getDisplayLanguageWithDialect(String, String); - method public static String getDisplayLanguageWithDialect(String, android.icu.util.ULocale); - method public String getDisplayName(); - method public String getDisplayName(android.icu.util.ULocale); - method public static String getDisplayName(String, String); - method public static String getDisplayName(String, android.icu.util.ULocale); - method public String getDisplayNameWithDialect(); - method public String getDisplayNameWithDialect(android.icu.util.ULocale); - method public static String getDisplayNameWithDialect(String, String); - method public static String getDisplayNameWithDialect(String, android.icu.util.ULocale); - method public String getDisplayScript(); - method public String getDisplayScript(android.icu.util.ULocale); - method public static String getDisplayScript(String, String); - method public static String getDisplayScript(String, android.icu.util.ULocale); - method public String getDisplayVariant(); - method public String getDisplayVariant(android.icu.util.ULocale); - method public static String getDisplayVariant(String, String); - method public static String getDisplayVariant(String, android.icu.util.ULocale); - method public String getExtension(char); - method public java.util.Set<java.lang.Character> getExtensionKeys(); - method public static String getFallback(String); - method public android.icu.util.ULocale getFallback(); - method public String getISO3Country(); - method public static String getISO3Country(String); - method public String getISO3Language(); - method public static String getISO3Language(String); - method public static String[] getISOCountries(); - method public static String[] getISOLanguages(); - method public String getKeywordValue(String); - method public static String getKeywordValue(String, String); - method public java.util.Iterator<java.lang.String> getKeywords(); - method public static java.util.Iterator<java.lang.String> getKeywords(String); - method public String getLanguage(); - method public static String getLanguage(String); - method public String getLineOrientation(); - method public String getName(); - method public static String getName(String); - method public String getScript(); - method public static String getScript(String); - method public java.util.Set<java.lang.String> getUnicodeLocaleAttributes(); - method public java.util.Set<java.lang.String> getUnicodeLocaleKeys(); - method public String getUnicodeLocaleType(String); - method public String getVariant(); - method public static String getVariant(String); - method public boolean isRightToLeft(); - method public static android.icu.util.ULocale minimizeSubtags(android.icu.util.ULocale); - method public android.icu.util.ULocale setKeywordValue(String, String); - method public static String setKeywordValue(String, String, String); - method public String toLanguageTag(); - method public static String toLegacyKey(String); - method public static String toLegacyType(String, String); - method public java.util.Locale toLocale(); - method public static String toUnicodeLocaleKey(String); - method public static String toUnicodeLocaleType(String, String); - field public static final android.icu.util.ULocale CANADA; - field public static final android.icu.util.ULocale CANADA_FRENCH; - field public static final android.icu.util.ULocale CHINA; - field public static final android.icu.util.ULocale CHINESE; - field public static final android.icu.util.ULocale ENGLISH; - field public static final android.icu.util.ULocale FRANCE; - field public static final android.icu.util.ULocale FRENCH; - field public static final android.icu.util.ULocale GERMAN; - field public static final android.icu.util.ULocale GERMANY; - field public static final android.icu.util.ULocale ITALIAN; - field public static final android.icu.util.ULocale ITALY; - field public static final android.icu.util.ULocale JAPAN; - field public static final android.icu.util.ULocale JAPANESE; - field public static final android.icu.util.ULocale KOREA; - field public static final android.icu.util.ULocale KOREAN; - field public static final android.icu.util.ULocale PRC; - field public static final char PRIVATE_USE_EXTENSION = 120; // 0x0078 'x' - field public static final android.icu.util.ULocale ROOT; - field public static final android.icu.util.ULocale SIMPLIFIED_CHINESE; - field public static final android.icu.util.ULocale TAIWAN; - field public static final android.icu.util.ULocale TRADITIONAL_CHINESE; - field public static final android.icu.util.ULocale UK; - field public static final char UNICODE_LOCALE_EXTENSION = 117; // 0x0075 'u' - field public static final android.icu.util.ULocale US; - } - - public static final class ULocale.Builder { - ctor public ULocale.Builder(); - method public android.icu.util.ULocale.Builder addUnicodeLocaleAttribute(String); - method public android.icu.util.ULocale build(); - method public android.icu.util.ULocale.Builder clear(); - method public android.icu.util.ULocale.Builder clearExtensions(); - method public android.icu.util.ULocale.Builder removeUnicodeLocaleAttribute(String); - method public android.icu.util.ULocale.Builder setExtension(char, String); - method public android.icu.util.ULocale.Builder setLanguage(String); - method public android.icu.util.ULocale.Builder setLanguageTag(String); - method public android.icu.util.ULocale.Builder setLocale(android.icu.util.ULocale); - method public android.icu.util.ULocale.Builder setRegion(String); - method public android.icu.util.ULocale.Builder setScript(String); - method public android.icu.util.ULocale.Builder setUnicodeLocaleKeyword(String, String); - method public android.icu.util.ULocale.Builder setVariant(String); - } - - public enum ULocale.Category { - enum_constant public static final android.icu.util.ULocale.Category DISPLAY; - enum_constant public static final android.icu.util.ULocale.Category FORMAT; - } - - public final class UniversalTimeScale { - method public static android.icu.math.BigDecimal bigDecimalFrom(double, int); - method public static android.icu.math.BigDecimal bigDecimalFrom(long, int); - method public static android.icu.math.BigDecimal bigDecimalFrom(android.icu.math.BigDecimal, int); - method public static long from(long, int); - method public static long getTimeScaleValue(int, int); - method public static android.icu.math.BigDecimal toBigDecimal(long, int); - method public static android.icu.math.BigDecimal toBigDecimal(android.icu.math.BigDecimal, int); - method public static long toLong(long, int); - field public static final int DB2_TIME = 8; // 0x8 - field public static final int DOTNET_DATE_TIME = 4; // 0x4 - field public static final int EPOCH_OFFSET_PLUS_1_VALUE = 6; // 0x6 - field public static final int EPOCH_OFFSET_VALUE = 1; // 0x1 - field public static final int EXCEL_TIME = 7; // 0x7 - field public static final int FROM_MAX_VALUE = 3; // 0x3 - field public static final int FROM_MIN_VALUE = 2; // 0x2 - field public static final int ICU4C_TIME = 2; // 0x2 - field public static final int JAVA_TIME = 0; // 0x0 - field public static final int MAC_OLD_TIME = 5; // 0x5 - field public static final int MAC_TIME = 6; // 0x6 - field @Deprecated public static final int MAX_SCALE = 10; // 0xa - field public static final int TO_MAX_VALUE = 5; // 0x5 - field public static final int TO_MIN_VALUE = 4; // 0x4 - field public static final int UNITS_VALUE = 0; // 0x0 - field public static final int UNIX_MICROSECONDS_TIME = 9; // 0x9 - field public static final int UNIX_TIME = 1; // 0x1 - field public static final int WINDOWS_FILE_TIME = 3; // 0x3 - } - - public interface ValueIterator { - method public boolean next(android.icu.util.ValueIterator.Element); - method public void reset(); - method public void setRange(int, int); - } - - public static final class ValueIterator.Element { - ctor public ValueIterator.Element(); - field public int integer; - field public Object value; - } - - public final class VersionInfo implements java.lang.Comparable<android.icu.util.VersionInfo> { - method public int compareTo(android.icu.util.VersionInfo); - method public static android.icu.util.VersionInfo getInstance(String); - method public static android.icu.util.VersionInfo getInstance(int, int, int, int); - method public static android.icu.util.VersionInfo getInstance(int, int, int); - method public static android.icu.util.VersionInfo getInstance(int, int); - method public static android.icu.util.VersionInfo getInstance(int); - method public int getMajor(); - method public int getMicro(); - method public int getMilli(); - method public int getMinor(); - field public static final android.icu.util.VersionInfo ICU_VERSION; - field public static final android.icu.util.VersionInfo UCOL_BUILDER_VERSION; - field public static final android.icu.util.VersionInfo UCOL_RUNTIME_VERSION; - field public static final android.icu.util.VersionInfo UNICODE_10_0; - field public static final android.icu.util.VersionInfo UNICODE_11_0; - field public static final android.icu.util.VersionInfo UNICODE_12_0; - field public static final android.icu.util.VersionInfo UNICODE_12_1; - field public static final android.icu.util.VersionInfo UNICODE_13_0; - field public static final android.icu.util.VersionInfo UNICODE_1_0; - field public static final android.icu.util.VersionInfo UNICODE_1_0_1; - field public static final android.icu.util.VersionInfo UNICODE_1_1_0; - field public static final android.icu.util.VersionInfo UNICODE_1_1_5; - field public static final android.icu.util.VersionInfo UNICODE_2_0; - field public static final android.icu.util.VersionInfo UNICODE_2_1_2; - field public static final android.icu.util.VersionInfo UNICODE_2_1_5; - field public static final android.icu.util.VersionInfo UNICODE_2_1_8; - field public static final android.icu.util.VersionInfo UNICODE_2_1_9; - field public static final android.icu.util.VersionInfo UNICODE_3_0; - field public static final android.icu.util.VersionInfo UNICODE_3_0_1; - field public static final android.icu.util.VersionInfo UNICODE_3_1_0; - field public static final android.icu.util.VersionInfo UNICODE_3_1_1; - field public static final android.icu.util.VersionInfo UNICODE_3_2; - field public static final android.icu.util.VersionInfo UNICODE_4_0; - field public static final android.icu.util.VersionInfo UNICODE_4_0_1; - field public static final android.icu.util.VersionInfo UNICODE_4_1; - field public static final android.icu.util.VersionInfo UNICODE_5_0; - field public static final android.icu.util.VersionInfo UNICODE_5_1; - field public static final android.icu.util.VersionInfo UNICODE_5_2; - field public static final android.icu.util.VersionInfo UNICODE_6_0; - field public static final android.icu.util.VersionInfo UNICODE_6_1; - field public static final android.icu.util.VersionInfo UNICODE_6_2; - field public static final android.icu.util.VersionInfo UNICODE_6_3; - field public static final android.icu.util.VersionInfo UNICODE_7_0; - field public static final android.icu.util.VersionInfo UNICODE_8_0; - field public static final android.icu.util.VersionInfo UNICODE_9_0; - } - -} - package android.inputmethodservice { public abstract class AbstractInputMethodService extends android.app.Service implements android.view.KeyEvent.Callback { @@ -24002,7 +19203,7 @@ package android.location { method public float getBearingAccuracyDegrees(); method public long getElapsedRealtimeNanos(); method public double getElapsedRealtimeUncertaintyNanos(); - method @Deprecated public android.os.Bundle getExtras(); + method public android.os.Bundle getExtras(); method public double getLatitude(); method public double getLongitude(); method public String getProvider(); @@ -24031,7 +19232,7 @@ package android.location { method public void setBearingAccuracyDegrees(float); method public void setElapsedRealtimeNanos(long); method public void setElapsedRealtimeUncertaintyNanos(double); - method @Deprecated public void setExtras(@Nullable android.os.Bundle); + method public void setExtras(@Nullable android.os.Bundle); method public void setLatitude(double); method public void setLongitude(double); method public void setProvider(String); @@ -24102,10 +19303,10 @@ package android.location { method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull android.location.LocationListener); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull android.location.LocationListener, @Nullable android.os.Looper); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.location.LocationListener, @Nullable android.os.Looper); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.location.LocationListener, @Nullable android.os.Looper); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, long, float, @NonNull android.app.PendingIntent); - method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.app.PendingIntent); + method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long, float, @NonNull android.location.Criteria, @NonNull android.app.PendingIntent); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, @NonNull android.location.LocationRequest, @NonNull java.util.concurrent.Executor, @NonNull android.location.LocationListener); method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestLocationUpdates(@NonNull String, @NonNull android.location.LocationRequest, @NonNull android.app.PendingIntent); method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void requestSingleUpdate(@NonNull String, @NonNull android.location.LocationListener, @Nullable android.os.Looper); @@ -24123,6 +19324,7 @@ package android.location { field public static final String EXTRA_LOCATION_ENABLED = "android.location.extra.LOCATION_ENABLED"; field public static final String EXTRA_PROVIDER_ENABLED = "android.location.extra.PROVIDER_ENABLED"; field public static final String EXTRA_PROVIDER_NAME = "android.location.extra.PROVIDER_NAME"; + field public static final String FUSED_PROVIDER = "fused"; field public static final String GPS_PROVIDER = "gps"; field public static final String KEY_FLUSH_COMPLETE = "flushComplete"; field public static final String KEY_LOCATION_CHANGED = "location"; @@ -45880,6 +41082,28 @@ package android.telephony { field public static final int IP_VERSION_MISMATCH = 2055; // 0x807 field public static final int IRAT_HANDOVER_FAILED = 2194; // 0x892 field public static final int IS707B_MAX_ACCESS_PROBES = 2089; // 0x829 + field public static final int IWLAN_AUTHORIZATION_REJECTED = 9003; // 0x232b + field public static final int IWLAN_DNS_RESOLUTION_NAME_FAILURE = 16388; // 0x4004 + field public static final int IWLAN_DNS_RESOLUTION_TIMEOUT = 16389; // 0x4005 + field public static final int IWLAN_IKEV2_AUTH_FAILURE = 16385; // 0x4001 + field public static final int IWLAN_IKEV2_CERT_INVALID = 16387; // 0x4003 + field public static final int IWLAN_IKEV2_CONFIG_FAILURE = 16384; // 0x4000 + field public static final int IWLAN_IKEV2_MSG_TIMEOUT = 16386; // 0x4002 + field public static final int IWLAN_ILLEGAL_ME = 9006; // 0x232e + field public static final int IWLAN_IMEI_NOT_ACCEPTED = 11005; // 0x2afd + field public static final int IWLAN_MAX_CONNECTION_REACHED = 8193; // 0x2001 + field public static final int IWLAN_NETWORK_FAILURE = 10500; // 0x2904 + field public static final int IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED = 9000; // 0x2328 + field public static final int IWLAN_NO_APN_SUBSCRIPTION = 9002; // 0x232a + field public static final int IWLAN_PDN_CONNECTION_REJECTION = 8192; // 0x2000 + field public static final int IWLAN_PLMN_NOT_ALLOWED = 11011; // 0x2b03 + field public static final int IWLAN_RAT_TYPE_NOT_ALLOWED = 11001; // 0x2af9 + field public static final int IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS = 8244; // 0x2034 + field public static final int IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION = 8241; // 0x2031 + field public static final int IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS = 8245; // 0x2035 + field public static final int IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION = 8242; // 0x2032 + field public static final int IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED = 11055; // 0x2b2f + field public static final int IWLAN_USER_UNKNOWN = 9001; // 0x2329 field public static final int LIMITED_TO_IPV4 = 2234; // 0x8ba field public static final int LIMITED_TO_IPV6 = 2235; // 0x8bb field public static final int LLC_SNDCP = 25; // 0x19 @@ -54230,6 +49454,7 @@ package android.view { method public void setFlags(int, int); method public void setFormat(int); method public void setGravity(int); + method @RequiresPermission(android.Manifest.permission.HIDE_OVERLAY_WINDOWS) public final void setHideOverlayWindows(boolean); method public void setIcon(@DrawableRes int); method public void setLayout(int, int); method public void setLocalFocus(boolean, boolean); diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index d83c0adb3ae1..cbb3bea6327e 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -122,6 +122,20 @@ package android.media.session { } +package android.net { + + public final class TcpRepairWindow { + ctor public TcpRepairWindow(int, int, int, int, int, int); + field public final int maxWindow; + field public final int rcvWnd; + field public final int rcvWndScale; + field public final int rcvWup; + field public final int sndWl1; + field public final int sndWnd; + } + +} + package android.os { public class Binder implements android.os.IBinder { diff --git a/core/api/removed.txt b/core/api/removed.txt index f2dfb84eb8fe..990388a54c85 100644 --- a/core/api/removed.txt +++ b/core/api/removed.txt @@ -213,14 +213,6 @@ package android.hardware { } -package android.icu.util { - - public class JapaneseCalendar extends android.icu.util.GregorianCalendar { - field @Deprecated public static final int CURRENT_ERA; - } - -} - package android.location { public class Location implements android.os.Parcelable { diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 54fe377bc75e..821d3f147282 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -94,7 +94,7 @@ package android { field public static final String HANDLE_CAR_MODE_CHANGES = "android.permission.HANDLE_CAR_MODE_CHANGES"; field public static final String HARDWARE_TEST = "android.permission.HARDWARE_TEST"; field public static final String HDMI_CEC = "android.permission.HDMI_CEC"; - field public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"; + field @Deprecated public static final String HIDE_NON_SYSTEM_OVERLAY_WINDOWS = "android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS"; field public static final String INJECT_EVENTS = "android.permission.INJECT_EVENTS"; field public static final String INSTALL_DYNAMIC_SYSTEM = "android.permission.INSTALL_DYNAMIC_SYSTEM"; field public static final String INSTALL_GRANT_RUNTIME_PERMISSIONS = "android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS"; @@ -4173,7 +4173,6 @@ package android.location { method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public void setLocationEnabledForUser(boolean, @NonNull android.os.UserHandle); method @Deprecated @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public boolean setProviderEnabledForUser(@NonNull String, boolean, @NonNull android.os.UserHandle); method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean unregisterGnssBatchedLocationCallback(@NonNull android.location.BatchedLocationCallback); - field public static final String FUSED_PROVIDER = "fused"; } public final class LocationRequest implements android.os.Parcelable { @@ -11294,7 +11293,6 @@ package android.telephony.data { method @NonNull public android.telephony.data.ApnThrottleStatus.Builder setSlotIndex(int); method @NonNull public android.telephony.data.ApnThrottleStatus.Builder setThrottleExpiryTimeMillis(long); method @NonNull public android.telephony.data.ApnThrottleStatus.Builder setTransportType(int); - field public static final long NO_THROTTLE_EXPIRY_TIME = -1L; // 0xffffffffffffffffL } public final class DataCallResponse implements android.os.Parcelable { @@ -12330,6 +12328,7 @@ package android.telephony.ims { } public interface SipDelegateConnection { + method public void closeDialog(@NonNull String); method public void notifyMessageReceiveError(@NonNull String, int); method public void notifyMessageReceived(@NonNull String); method public void sendMessage(@NonNull android.telephony.ims.SipMessage, long); diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 5a292952bd65..ffe2736fe8c5 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -94,6 +94,8 @@ package android.app { method public static void resumeAppSwitches() throws android.os.RemoteException; method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public void scheduleApplicationInfoChanged(java.util.List<java.lang.String>, int); method @RequiresPermission(android.Manifest.permission.CHANGE_CONFIGURATION) public boolean updateMccMncConfiguration(@NonNull String, @NonNull String); + field public static final long DROP_CLOSE_SYSTEM_DIALOGS = 174664120L; // 0xa6929b8L + field public static final long LOCK_DOWN_CLOSE_SYSTEM_DIALOGS = 174664365L; // 0xa692aadL field public static final int PROCESS_CAPABILITY_ALL = 7; // 0x7 field public static final int PROCESS_CAPABILITY_ALL_EXPLICIT = 1; // 0x1 field public static final int PROCESS_CAPABILITY_ALL_IMPLICIT = 6; // 0x6 @@ -961,7 +963,6 @@ package android.location { method @NonNull public String[] getBackgroundThrottlingWhitelist(); method @NonNull public String[] getIgnoreSettingsWhitelist(); method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public java.util.List<java.lang.String> getProviderPackages(@NonNull String); - field public static final String FUSED_PROVIDER = "fused"; } } diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java index 7af96d660f54..a5d88ef4c8af 100644 --- a/core/java/android/app/ActivityManager.java +++ b/core/java/android/app/ActivityManager.java @@ -31,6 +31,8 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.annotation.TestApi; +import android.compat.annotation.ChangeId; +import android.compat.annotation.Disabled; import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Context; @@ -91,9 +93,6 @@ import com.android.internal.util.MemInfoReader; import com.android.internal.util.Preconditions; import com.android.server.LocalServices; -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlSerializer; - import java.io.FileDescriptor; import java.io.FileOutputStream; import java.io.IOException; @@ -870,6 +869,39 @@ public class ActivityManager { private static final boolean DEVELOPMENT_FORCE_LOW_RAM = SystemProperties.getBoolean("debug.force_low_ram", false); + /** + * Intent {@link Intent#ACTION_CLOSE_SYSTEM_DIALOGS} is too powerful to be unrestricted. We + * restrict its usage for a few legitimate use-cases only, regardless of targetSdk. For the + * other use-cases we drop the intent with a log message. + * + * Note that this is the lighter version of {@link ActivityManager + * #LOCK_DOWN_CLOSE_SYSTEM_DIALOGS} which is not gated on targetSdk in order to eliminate the + * abuse vector. + * + * @hide + */ + @TestApi + @ChangeId + @Disabled + public static final long DROP_CLOSE_SYSTEM_DIALOGS = 174664120L; + + /** + * Intent {@link Intent#ACTION_CLOSE_SYSTEM_DIALOGS} is too powerful to be unrestricted. So, + * apps targeting {@link Build.VERSION_CODES#S} or higher will crash if they try to send such + * intent and don't have permission {@code android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS}. + * + * Note that this is the more restrict version of {@link ActivityManager + * #DROP_CLOSE_SYSTEM_DIALOGS} that expects the app to stop sending aforementioned intent once + * it bumps its targetSdk to {@link Build.VERSION_CODES#S} or higher. + * + * @hide + */ + @TestApi + @ChangeId + @Disabled + // @EnabledSince(targetSdkVersion = VERSION_CODES.S) + public static final long LOCK_DOWN_CLOSE_SYSTEM_DIALOGS = 174664365L; + /** @hide */ public int getFrontActivityScreenCompatMode() { try { diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index ed6dea815e4c..6d564a3ce61c 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -6681,8 +6681,7 @@ public final class ActivityThread extends ClientTransactionHandler { private InstrumentationInfo prepareInstrumentation(AppBindData data) { final InstrumentationInfo ii; try { - ii = new ApplicationPackageManager( - null, getPackageManager(), getPermissionManager()) + ii = new ApplicationPackageManager(null, getPackageManager()) .getInstrumentationInfo(data.instrumentationName, 0); } catch (PackageManager.NameNotFoundException e) { throw new RuntimeException( diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index f60f569be892..1009f6625bcc 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -6511,9 +6511,10 @@ public class AppOpsManager { * @param code The op code. * @param uid The UID performing the operation. * @param packageName The package performing the operation. + * @param flags The flags of this op * @param result The result of the note. */ - void onOpNoted(int code, int uid, String packageName, int result); + void onOpNoted(int code, int uid, String packageName, @OpFlags int flags, @Mode int result); } /** @@ -6550,9 +6551,10 @@ public class AppOpsManager { * @param op The op code. * @param uid The UID performing the operation. * @param packageName The package performing the operation. + * @param flags The flags of this op * @param result The result of the start. */ - void onOpStarted(int op, int uid, String packageName, int result); + void onOpStarted(int op, int uid, String packageName, @OpFlags int flags, @Mode int result); } AppOpsManager(Context context, IAppOpsService service) { @@ -7135,8 +7137,8 @@ public class AppOpsManager { } cb = new IAppOpsStartedCallback.Stub() { @Override - public void opStarted(int op, int uid, String packageName, int mode) { - callback.onOpStarted(op, uid, packageName, mode); + public void opStarted(int op, int uid, String packageName, int flags, int mode) { + callback.onOpStarted(op, uid, packageName, flags, mode); } }; mStartedWatchers.put(callback, cb); @@ -7202,8 +7204,8 @@ public class AppOpsManager { } cb = new IAppOpsNotedCallback.Stub() { @Override - public void opNoted(int op, int uid, String packageName, int mode) { - callback.onOpNoted(op, uid, packageName, mode); + public void opNoted(int op, int uid, String packageName, int flags, int mode) { + callback.onOpNoted(op, uid, packageName, flags, mode); } }; mNotedWatchers.put(callback, cb); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 3642d318e820..186d1fede5e0 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -59,8 +59,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageItemInfo; import android.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.content.pm.PackageManager.Property; import android.content.pm.ParceledListSlice; import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; @@ -95,8 +93,6 @@ import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; -import android.permission.IOnPermissionsChangeListener; -import android.permission.IPermissionManager; import android.permission.PermissionManager; import android.provider.Settings; import android.system.ErrnoException; @@ -106,7 +102,6 @@ import android.system.StructStat; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; -import android.util.DebugUtils; import android.util.LauncherIcons; import android.util.Log; @@ -129,7 +124,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Set; @@ -137,14 +131,6 @@ import java.util.Set; public class ApplicationPackageManager extends PackageManager { private static final String TAG = "ApplicationPackageManager"; private static final boolean DEBUG_ICONS = false; - /** - * Note: Changing this won't do anything on it's own - you should also change the filtering in - * {@link #shouldTraceGrant} - * - * @hide - */ - public static final boolean DEBUG_TRACE_GRANTS = false; - public static final boolean DEBUG_TRACE_PERMISSION_UPDATES = false; private static final int DEFAULT_EPHEMERAL_COOKIE_MAX_SIZE_BYTES = 16384; // 16KB @@ -171,6 +157,8 @@ public class ApplicationPackageManager extends PackageManager { @GuardedBy("mLock") private UserManager mUserManager; @GuardedBy("mLock") + private PermissionManager mPermissionManager; + @GuardedBy("mLock") private PackageInstaller mInstaller; @GuardedBy("mLock") private ArtManager mArtManager; @@ -190,6 +178,15 @@ public class ApplicationPackageManager extends PackageManager { } } + private PermissionManager getPermissionManager() { + synchronized (mLock) { + if (mPermissionManager == null) { + mPermissionManager = mContext.getSystemService(PermissionManager.class); + } + return mPermissionManager; + } + } + @Override public int getUserId() { return mContext.getUserId(); @@ -355,66 +352,41 @@ public class ApplicationPackageManager extends PackageManager { @Override @SuppressWarnings("unchecked") public List<PermissionGroupInfo> getAllPermissionGroups(int flags) { - try { - final ParceledListSlice<PermissionGroupInfo> parceledList = - mPermissionManager.getAllPermissionGroups(flags); - if (parceledList == null) { - return Collections.emptyList(); - } - return parceledList.getList(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().getAllPermissionGroups(flags); } @Override public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) throws NameNotFoundException { - try { - final PermissionGroupInfo pgi = - mPermissionManager.getPermissionGroupInfo(groupName, flags); - if (pgi != null) { - return pgi; - } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + final PermissionGroupInfo permissionGroupInfo = getPermissionManager() + .getPermissionGroupInfo(groupName, flags); + if (permissionGroupInfo == null) { + throw new NameNotFoundException(groupName); } - throw new NameNotFoundException(groupName); + return permissionGroupInfo; } @Override public PermissionInfo getPermissionInfo(String permName, int flags) throws NameNotFoundException { - try { - final String packageName = mContext.getOpPackageName(); - final PermissionInfo pi = - mPermissionManager.getPermissionInfo(permName, packageName, flags); - if (pi != null) { - return pi; - } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + final PermissionInfo permissionInfo = getPermissionManager().getPermissionInfo(permName, + flags); + if (permissionInfo == null) { + throw new NameNotFoundException(permName); } - throw new NameNotFoundException(permName); + return permissionInfo; } @Override @SuppressWarnings("unchecked") public List<PermissionInfo> queryPermissionsByGroup(String groupName, int flags) throws NameNotFoundException { - try { - final ParceledListSlice<PermissionInfo> parceledList = - mPermissionManager.queryPermissionsByGroup(groupName, flags); - if (parceledList != null) { - final List<PermissionInfo> pi = parceledList.getList(); - if (pi != null) { - return pi; - } - } - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); + final List<PermissionInfo> permissionInfos = getPermissionManager().queryPermissionsByGroup( + groupName, flags); + if (permissionInfos == null) { + throw new NameNotFoundException(groupName); } - throw new NameNotFoundException(groupName); + return permissionInfos; } @Override @@ -724,11 +696,7 @@ public class ApplicationPackageManager extends PackageManager { @Override public boolean isPermissionRevokedByPolicy(String permName, String pkgName) { - try { - return mPermissionManager.isPermissionRevokedByPolicy(permName, pkgName, getUserId()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().isPermissionRevokedByPolicy(pkgName, permName); } /** @@ -750,50 +718,23 @@ public class ApplicationPackageManager extends PackageManager { @Override public boolean addPermission(PermissionInfo info) { - try { - return mPermissionManager.addPermission(info, false); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().addPermission(info, false); } @Override public boolean addPermissionAsync(PermissionInfo info) { - try { - return mPermissionManager.addPermission(info, true); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().addPermission(info, true); } @Override public void removePermission(String name) { - try { - mPermissionManager.removePermission(name); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + getPermissionManager().removePermission(name); } @Override public void grantRuntimePermission(String packageName, String permissionName, UserHandle user) { - if (DEBUG_TRACE_GRANTS - && shouldTraceGrant(packageName, permissionName, user.getIdentifier())) { - Log.i(TAG, "App " + mContext.getPackageName() + " is granting " + packageName + " " - + permissionName + " for user " + user.getIdentifier(), new RuntimeException()); - } - try { - mPM.grantRuntimePermission(packageName, permissionName, user.getIdentifier()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - - /** @hide */ - public static boolean shouldTraceGrant(String packageName, String permissionName, int userId) { - // To be modified when debugging - return false; + getPermissionManager().grantRuntimePermission(packageName, permissionName, user); } @Override @@ -804,124 +745,55 @@ public class ApplicationPackageManager extends PackageManager { @Override public void revokeRuntimePermission(String packageName, String permName, UserHandle user, String reason) { - if (DEBUG_TRACE_PERMISSION_UPDATES - && shouldTraceGrant(packageName, permName, user.getIdentifier())) { - Log.i(TAG, "App " + mContext.getPackageName() + " is revoking " + packageName + " " - + permName + " for user " + user.getIdentifier() + " with reason " + reason, - new RuntimeException()); - } - try { - mPermissionManager - .revokeRuntimePermission(packageName, permName, user.getIdentifier(), reason); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + getPermissionManager().revokeRuntimePermission(packageName, permName, user, reason); } @Override public int getPermissionFlags(String permName, String packageName, UserHandle user) { - try { - return mPermissionManager - .getPermissionFlags(permName, packageName, user.getIdentifier()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().getPermissionFlags(packageName, permName, user); } @Override public void updatePermissionFlags(String permName, String packageName, int flagMask, int flagValues, UserHandle user) { - if (DEBUG_TRACE_PERMISSION_UPDATES - && shouldTraceGrant(packageName, permName, user.getIdentifier())) { - Log.i(TAG, "App " + mContext.getPackageName() + " is updating flags for " - + packageName + " " - + permName + " for user " + user.getIdentifier() + ": " - + DebugUtils.flagsToString(PackageManager.class, "FLAG_PERMISSION_", flagMask) - + " := " + DebugUtils.flagsToString( - PackageManager.class, "FLAG_PERMISSION_", flagValues), - new RuntimeException()); - } - try { - final boolean checkAdjustPolicyFlagPermission = - mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q; - mPermissionManager.updatePermissionFlags(permName, packageName, flagMask, - flagValues, checkAdjustPolicyFlagPermission, user.getIdentifier()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + getPermissionManager().updatePermissionFlags(packageName, permName, flagMask, flagValues, + user); } @Override public @NonNull Set<String> getWhitelistedRestrictedPermissions( @NonNull String packageName, @PermissionWhitelistFlags int flags) { - try { - final int userId = getUserId(); - final List<String> whitelist = mPermissionManager - .getWhitelistedRestrictedPermissions(packageName, flags, userId); - if (whitelist != null) { - return new ArraySet<>(whitelist); - } - return Collections.emptySet(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().getAllowlistedRestrictedPermissions(packageName, flags); } @Override public boolean addWhitelistedRestrictedPermission(@NonNull String packageName, @NonNull String permName, @PermissionWhitelistFlags int flags) { - try { - final int userId = getUserId(); - return mPermissionManager - .addWhitelistedRestrictedPermission(packageName, permName, flags, userId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().addAllowlistedRestrictedPermission(packageName, permName, + flags); } @Override - public boolean setAutoRevokeWhitelisted( - @NonNull String packageName, boolean whitelisted) { - try { - final int userId = getUserId(); - return mPermissionManager.setAutoRevokeWhitelisted(packageName, whitelisted, userId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + public boolean setAutoRevokeWhitelisted(@NonNull String packageName, boolean whitelisted) { + return getPermissionManager().setAutoRevokeExempted(packageName, whitelisted); } @Override public boolean isAutoRevokeWhitelisted(@NonNull String packageName) { - try { - final int userId = getUserId(); - return mPermissionManager.isAutoRevokeWhitelisted(packageName, userId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().isAutoRevokeExempted(packageName); } @Override public boolean removeWhitelistedRestrictedPermission(@NonNull String packageName, @NonNull String permName, @PermissionWhitelistFlags int flags) { - try { - final int userId = getUserId(); - return mPermissionManager - .removeWhitelistedRestrictedPermission(packageName, permName, flags, userId); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().removeAllowlistedRestrictedPermission(packageName, permName, + flags); } @Override @UnsupportedAppUsage public boolean shouldShowRequestPermissionRationale(String permName) { - try { - final String packageName = mContext.getPackageName(); - return mPermissionManager - .shouldShowRequestPermissionRationale(permName, packageName, getUserId()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return getPermissionManager().shouldShowRequestPermissionRationale(permName); } @Override @@ -1880,34 +1752,12 @@ public class ApplicationPackageManager extends PackageManager { @Override public void addOnPermissionsChangeListener(OnPermissionsChangedListener listener) { - synchronized (mPermissionListeners) { - if (mPermissionListeners.get(listener) != null) { - return; - } - OnPermissionsChangeListenerDelegate delegate = - new OnPermissionsChangeListenerDelegate(listener, Looper.getMainLooper()); - try { - mPermissionManager.addOnPermissionsChangeListener(delegate); - mPermissionListeners.put(listener, delegate); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } + getPermissionManager().addOnPermissionsChangeListener(listener); } @Override public void removeOnPermissionsChangeListener(OnPermissionsChangedListener listener) { - synchronized (mPermissionListeners) { - IOnPermissionsChangeListener delegate = mPermissionListeners.get(listener); - if (delegate != null) { - try { - mPermissionManager.removeOnPermissionsChangeListener(delegate); - mPermissionListeners.remove(listener); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - } + getPermissionManager().removeOnPermissionsChangeListener(listener); } @UnsupportedAppUsage @@ -1918,11 +1768,9 @@ public class ApplicationPackageManager extends PackageManager { } } - protected ApplicationPackageManager(ContextImpl context, IPackageManager pm, - IPermissionManager permissionManager) { + protected ApplicationPackageManager(ContextImpl context, IPackageManager pm) { mContext = context; mPM = pm; - mPermissionManager = permissionManager; } /** @@ -3234,7 +3082,6 @@ public class ApplicationPackageManager extends PackageManager { private final ContextImpl mContext; @UnsupportedAppUsage private final IPackageManager mPM; - private final IPermissionManager mPermissionManager; /** Assume locked until we hear otherwise */ private volatile boolean mUserUnlocked = false; @@ -3245,41 +3092,6 @@ public class ApplicationPackageManager extends PackageManager { private static ArrayMap<ResourceName, WeakReference<CharSequence>> sStringCache = new ArrayMap<ResourceName, WeakReference<CharSequence>>(); - private final Map<OnPermissionsChangedListener, IOnPermissionsChangeListener> - mPermissionListeners = new ArrayMap<>(); - - public class OnPermissionsChangeListenerDelegate extends IOnPermissionsChangeListener.Stub - implements Handler.Callback{ - private static final int MSG_PERMISSIONS_CHANGED = 1; - - private final OnPermissionsChangedListener mListener; - private final Handler mHandler; - - - public OnPermissionsChangeListenerDelegate(OnPermissionsChangedListener listener, - Looper looper) { - mListener = listener; - mHandler = new Handler(looper, this); - } - - @Override - public void onPermissionsChanged(int uid) { - mHandler.obtainMessage(MSG_PERMISSIONS_CHANGED, uid, 0).sendToTarget(); - } - - @Override - public boolean handleMessage(Message msg) { - switch (msg.what) { - case MSG_PERMISSIONS_CHANGED: { - final int uid = msg.arg1; - mListener.onPermissionsChanged(uid); - return true; - } - } - return false; - } - } - @Override public boolean canRequestPackageInstalls() { try { diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 2fec9f79717a..124cf71edc9c 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -72,7 +72,6 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.storage.StorageManager; -import android.permission.IPermissionManager; import android.permission.PermissionManager; import android.system.ErrnoException; import android.system.Os; @@ -370,10 +369,9 @@ class ContextImpl extends Context { } final IPackageManager pm = ActivityThread.getPackageManager(); - final IPermissionManager permissionManager = ActivityThread.getPermissionManager(); - if (pm != null && permissionManager != null) { + if (pm != null) { // Doesn't matter if we make more than one instance. - return (mPackageManager = new ApplicationPackageManager(this, pm, permissionManager)); + return (mPackageManager = new ApplicationPackageManager(this, pm)); } return null; diff --git a/core/java/android/app/OWNERS b/core/java/android/app/OWNERS index 633d093435ee..abdd537a9a26 100644 --- a/core/java/android/app/OWNERS +++ b/core/java/android/app/OWNERS @@ -1 +1,38 @@ + +# Remain no owner because multiple modules may touch this file. +per-file ContextImpl.java = * + +# ActivityThread +per-file ActivityThread.java = file:/services/core/java/com/android/server/am/OWNERS +per-file ActivityThread.java = file:/services/core/java/com/android/server/wm/OWNERS + +# Alarm +per-file *Alarm* = file:/apex/jobscheduler/OWNERS + +# AppOps +per-file *AppOp* = file:/core/java/android/permission/OWNERS + +# Notification +per-file *Notification* = file:/packages/SystemUI/OWNERS + +#Wallpaper +per-file Wallpaper*.java = file:/core/java/android/service/wallpaper/OWNERS +per-file IWallpaper*.aidl = file:/core/java/android/service/wallpaper/OWNERS + +# WindowManager +per-file Activity*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file Activity*.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file ClientTransactionHandler.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file Fragment.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file IActivity*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file IAppTask.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file ITaskStackListener.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file LocalActivityManager.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file Task*.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file Window*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file Window*.java = file:/services/core/java/com/android/server/wm/OWNERS + +# TODO(b/174932174): determine the ownership of KeyguardManager.java + +# Zygote per-file *Zygote* = file:/ZYGOTE_OWNERS diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index 392d6fbe53d6..a6bf4dddf855 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -63,7 +63,6 @@ import android.content.pm.CrossProfileApps; import android.content.pm.DataLoaderManager; import android.content.pm.ICrossProfileApps; import android.content.pm.IDataLoaderManager; -import android.content.pm.IPackageManager; import android.content.pm.IShortcutService; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; @@ -176,6 +175,7 @@ import android.os.image.IDynamicSystemService; import android.os.incremental.IIncrementalService; import android.os.incremental.IncrementalManager; import android.os.storage.StorageManager; +import android.permission.LegacyPermissionManager; import android.permission.PermissionControllerManager; import android.permission.PermissionManager; import android.print.IPrintManager; @@ -1264,8 +1264,15 @@ public final class SystemServiceRegistry { @Override public PermissionManager createService(ContextImpl ctx) throws ServiceNotFoundException { - IPackageManager packageManager = AppGlobals.getPackageManager(); - return new PermissionManager(ctx.getOuterContext(), packageManager); + return new PermissionManager(ctx.getOuterContext()); + }}); + + registerService(Context.LEGACY_PERMISSION_SERVICE, LegacyPermissionManager.class, + new CachedServiceFetcher<LegacyPermissionManager>() { + @Override + public LegacyPermissionManager createService(ContextImpl ctx) + throws ServiceNotFoundException { + return new LegacyPermissionManager(); }}); registerService(Context.PERMISSION_CONTROLLER_SERVICE, PermissionControllerManager.class, diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index ab94fd5922bc..94084b851ae0 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2919,22 +2919,36 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent - * profile. + * profile. Apps targeting {@link android.os.Build.VERSION_CODES#S} and above will get a + * {@code IllegalArgumentException} when calling this method on the parent + * {@link DevicePolicyManager} instance. * * <p><strong>Note:</strong> Specifying password requirements using this method clears the * password complexity requirements set using {@link #setRequiredPasswordComplexity(int)}. * + * @deprecated Prefer using {@link #setRequiredPasswordComplexity(int)}, to require a password + * that satisfies a complexity level defined by the platform, rather than specifying custom + * password requirement. + * Setting custom, overly-complicated password requirements leads to passwords that are hard + * for users to remember and may not provide any security benefits given as Android uses + * hardware-backed throttling to thwart online and offline brute-forcing of the device's + * screen lock. * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param quality The new desired quality. One of {@link #PASSWORD_QUALITY_UNSPECIFIED}, * {@link #PASSWORD_QUALITY_BIOMETRIC_WEAK}, * {@link #PASSWORD_QUALITY_SOMETHING}, {@link #PASSWORD_QUALITY_NUMERIC}, * {@link #PASSWORD_QUALITY_NUMERIC_COMPLEX}, {@link #PASSWORD_QUALITY_ALPHABETIC}, * {@link #PASSWORD_QUALITY_ALPHANUMERIC} or {@link #PASSWORD_QUALITY_COMPLEX}. - * @throws SecurityException if {@code admin} is not an active administrator or if {@code admin} - * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} + * @throws SecurityException if {@code admin} is not an active administrator, if {@code admin} + * does not use {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} or if the + * calling app is targeting {@link android.os.Build.VERSION_CODES#S} and above, + * and is calling the method the {@link DevicePolicyManager} instance returned by + * {@link #getParentProfileInstance(ComponentName)}. */ + @Deprecated public void setPasswordQuality(@NonNull ComponentName admin, int quality) { if (mService != null) { try { @@ -2957,9 +2971,12 @@ public class DevicePolicyManager { * <p>Note: on devices not supporting {@link PackageManager#FEATURE_SECURE_LOCK_SCREEN} feature, * the password is always treated as empty. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to aggregate * all admins. */ + @Deprecated public int getPasswordQuality(@Nullable ComponentName admin) { return getPasswordQuality(admin, myUserId()); } @@ -2999,10 +3016,14 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param length The new desired minimum password length. A value of 0 means there is no * restriction. @@ -3012,6 +3033,7 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password * quality requirement prior to calling this method. */ + @Deprecated public void setPasswordMinimumLength(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -3034,9 +3056,12 @@ public class DevicePolicyManager { * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve * restrictions on the parent profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to aggregate * all admins. */ + @Deprecated public int getPasswordMinimumLength(@Nullable ComponentName admin) { return getPasswordMinimumLength(admin, myUserId()); } @@ -3074,10 +3099,14 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param length The new desired minimum number of upper case letters required in the password. * A value of 0 means there is no restriction. @@ -3087,6 +3116,7 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password * quality requirement prior to calling this method. */ + @Deprecated public void setPasswordMinimumUpperCase(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -3114,11 +3144,14 @@ public class DevicePolicyManager { * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve * restrictions on the parent profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to * aggregate all admins. * @return The minimum number of upper case letters required in the * password. */ + @Deprecated public int getPasswordMinimumUpperCase(@Nullable ComponentName admin) { return getPasswordMinimumUpperCase(admin, myUserId()); } @@ -3156,10 +3189,14 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param length The new desired minimum number of lower case letters required in the password. * A value of 0 means there is no restriction. @@ -3169,6 +3206,7 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password * quality requirement prior to calling this method. */ + @Deprecated public void setPasswordMinimumLowerCase(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -3196,11 +3234,14 @@ public class DevicePolicyManager { * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve * restrictions on the parent profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to * aggregate all admins. * @return The minimum number of lower case letters required in the * password. */ + @Deprecated public int getPasswordMinimumLowerCase(@Nullable ComponentName admin) { return getPasswordMinimumLowerCase(admin, myUserId()); } @@ -3238,10 +3279,14 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param length The new desired minimum number of letters required in the password. A value of * 0 means there is no restriction. @@ -3251,6 +3296,7 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password * quality requirement prior to calling this method. */ + @Deprecated public void setPasswordMinimumLetters(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -3278,10 +3324,13 @@ public class DevicePolicyManager { * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve * restrictions on the parent profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to * aggregate all admins. * @return The minimum number of letters required in the password. */ + @Deprecated public int getPasswordMinimumLetters(@Nullable ComponentName admin) { return getPasswordMinimumLetters(admin, myUserId()); } @@ -3319,10 +3368,14 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param length The new desired minimum number of numerical digits required in the password. A * value of 0 means there is no restriction. @@ -3332,6 +3385,7 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password * quality requirement prior to calling this method. */ + @Deprecated public void setPasswordMinimumNumeric(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -3359,10 +3413,13 @@ public class DevicePolicyManager { * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve * restrictions on the parent profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to * aggregate all admins. * @return The minimum number of numerical digits required in the password. */ + @Deprecated public int getPasswordMinimumNumeric(@Nullable ComponentName admin) { return getPasswordMinimumNumeric(admin, myUserId()); } @@ -3400,10 +3457,14 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param length The new desired minimum number of symbols required in the password. A value of * 0 means there is no restriction. @@ -3413,6 +3474,7 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password * quality requirement prior to calling this method. */ + @Deprecated public void setPasswordMinimumSymbols(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -3439,10 +3501,13 @@ public class DevicePolicyManager { * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve * restrictions on the parent profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to * aggregate all admins. * @return The minimum number of symbols required in the password. */ + @Deprecated public int getPasswordMinimumSymbols(@Nullable ComponentName admin) { return getPasswordMinimumSymbols(admin, myUserId()); } @@ -3480,10 +3545,14 @@ public class DevicePolicyManager { * {@link DeviceAdminInfo#USES_POLICY_LIMIT_PASSWORD} to be able to call this method; if it has * not, a security exception will be thrown. * <p> - * This method can be called on the {@link DevicePolicyManager} instance returned by + * + * Apps targeting {@link android.os.Build.VERSION_CODES#R} and below can call this method on the + * {@link DevicePolicyManager} instance returned by * {@link #getParentProfileInstance(ComponentName)} in order to set restrictions on the parent * profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin Which {@link DeviceAdminReceiver} this request is associated with. * @param length The new desired minimum number of letters required in the password. A value of * 0 means there is no restriction. @@ -3493,6 +3562,7 @@ public class DevicePolicyManager { * {@link android.os.Build.VERSION_CODES#R} and above and didn't set a sufficient password * quality requirement prior to calling this method. */ + @Deprecated public void setPasswordMinimumNonLetter(@NonNull ComponentName admin, int length) { if (mService != null) { try { @@ -3520,10 +3590,13 @@ public class DevicePolicyManager { * returned by {@link #getParentProfileInstance(ComponentName)} in order to retrieve * restrictions on the parent profile. * + * @deprecated see {@link #setPasswordQuality(ComponentName, int)} for details. + * * @param admin The name of the admin component to check, or {@code null} to * aggregate all admins. * @return The minimum number of letters required in the password. */ + @Deprecated public int getPasswordMinimumNonLetter(@Nullable ComponentName admin) { return getPasswordMinimumNonLetter(admin, myUserId()); } diff --git a/core/java/android/companion/CompanionDeviceManager.java b/core/java/android/companion/CompanionDeviceManager.java index c3c270e52eb6..59646f106db5 100644 --- a/core/java/android/companion/CompanionDeviceManager.java +++ b/core/java/android/companion/CompanionDeviceManager.java @@ -34,6 +34,7 @@ import android.os.Handler; import android.os.RemoteException; import android.os.UserHandle; import android.service.notification.NotificationListenerService; +import android.util.ExceptionUtils; import android.util.Log; import java.util.Collections; @@ -321,6 +322,77 @@ public final class CompanionDeviceManager { } } + /** + * Register to receive callbacks whenever the associated device comes in and out of range. + * + * The provided device must be {@link #associate associated} with the calling app before + * calling this method. + * + * Caller must implement a single {@link CompanionDeviceService} which will be bound to and + * receive callbacks to {@link CompanionDeviceService#onDeviceAppeared} and + * {@link CompanionDeviceService#onDeviceDisappeared}. + * The app doesn't need to remain running in order to receive its callbacks. + * + * Calling app must declare uses-permission + * {@link android.Manifest.permission#REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE}. + * + * Calling app must check for feature presence of + * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} before calling this API. + * + * @param deviceAddress a previously-associated companion device's address + * + * @throws DeviceNotAssociatedException if the given device was not previously associated + * with this app. + */ + @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) + public void startObservingDevicePresence(@NonNull String deviceAddress) + throws DeviceNotAssociatedException { + if (!checkFeaturePresent()) { + return; + } + Objects.requireNonNull(deviceAddress, "address cannot be null"); + try { + mService.registerDevicePresenceListenerService( + mContext.getPackageName(), deviceAddress); + } catch (RemoteException e) { + ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class); + throw e.rethrowFromSystemServer(); + } + } + + /** + * Unregister for receiving callbacks whenever the associated device comes in and out of range. + * + * The provided device must be {@link #associate associated} with the calling app before + * calling this method. + * + * Calling app must declare uses-permission + * {@link android.Manifest.permission#REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE}. + * + * Calling app must check for feature presence of + * {@link PackageManager#FEATURE_COMPANION_DEVICE_SETUP} before calling this API. + * + * @param deviceAddress a previously-associated companion device's address + * + * @throws DeviceNotAssociatedException if the given device was not previously associated + * with this app. + */ + @RequiresPermission(android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE) + public void stopObservingDevicePresence(@NonNull String deviceAddress) + throws DeviceNotAssociatedException { + if (!checkFeaturePresent()) { + return; + } + Objects.requireNonNull(deviceAddress, "address cannot be null"); + try { + mService.unregisterDevicePresenceListenerService( + mContext.getPackageName(), deviceAddress); + } catch (RemoteException e) { + ExceptionUtils.propagateIfInstanceOf(e.getCause(), DeviceNotAssociatedException.class); + throw e.rethrowFromSystemServer(); + } + } + private boolean checkFeaturePresent() { boolean featurePresent = mService != null; if (!featurePresent && DEBUG) { diff --git a/core/java/android/companion/DeviceNotAssociatedException.java b/core/java/android/companion/DeviceNotAssociatedException.java new file mode 100644 index 000000000000..bebb6c9ff7eb --- /dev/null +++ b/core/java/android/companion/DeviceNotAssociatedException.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +package android.companion; + +import android.annotation.Nullable; + +/** + * An exception for a case when a given device was not + * {@link CompanionDeviceManager#associate associated} to the calling app. + */ +public class DeviceNotAssociatedException extends Exception { + /** @hide */ + public DeviceNotAssociatedException(@Nullable String deviceName) { + super("Device not associated with the current app: " + deviceName); + } +} diff --git a/core/java/android/companion/ICompanionDeviceManager.aidl b/core/java/android/companion/ICompanionDeviceManager.aidl index bcb9be80e6a4..527d8df94ea0 100644 --- a/core/java/android/companion/ICompanionDeviceManager.aidl +++ b/core/java/android/companion/ICompanionDeviceManager.aidl @@ -45,4 +45,8 @@ interface ICompanionDeviceManager { boolean isDeviceAssociatedForWifiConnection(in String packageName, in String macAddress, int userId); + + void registerDevicePresenceListenerService(in String packageName, in String deviceAddress); + + void unregisterDevicePresenceListenerService(in String packageName, in String deviceAddress); } diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index d920fb3e97e6..f3e1a87ea271 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -4564,6 +4564,15 @@ public abstract class Context { public static final String PERMISSION_SERVICE = "permission"; /** + * Official published name of the legacy (internal) permission service. + * + * @see #getSystemService(String) + * @hide + */ + //@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + public static final String LEGACY_PERMISSION_SERVICE = "legacy_permission"; + + /** * Official published name of the (internal) permission controller service. * * @see #getSystemService(String) diff --git a/core/java/android/content/OWNERS b/core/java/android/content/OWNERS new file mode 100644 index 000000000000..c1e7e41972ba --- /dev/null +++ b/core/java/android/content/OWNERS @@ -0,0 +1,3 @@ +# Remain no owner because multiple modules may touch this file. +per-file Context.java = * +per-file ContextWrapper.java = * diff --git a/core/java/android/content/pm/OWNERS b/core/java/android/content/pm/OWNERS index 3a590dac7c0b..24872e8c3c1d 100644 --- a/core/java/android/content/pm/OWNERS +++ b/core/java/android/content/pm/OWNERS @@ -5,3 +5,4 @@ toddke@google.com patb@google.com per-file PackageParser.java = chiuwinson@google.com +per-file *Shortcut* = omakoto@google.com, yamasani@google.com, sunnygoyal@google.com, mett@google.com, pinyaoting@google.com diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index cf3f7069c63f..67a1ad676348 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4438,6 +4438,7 @@ public abstract class PackageManager { * @throws NameNotFoundException if a package with the given name cannot be * found on the system. */ + //@Deprecated public abstract PermissionInfo getPermissionInfo(@NonNull String permName, @PermissionInfoFlags int flags) throws NameNotFoundException; @@ -4450,9 +4451,10 @@ public abstract class PackageManager { * @param flags Additional option flags to modify the data returned. * @return Returns a list of {@link PermissionInfo} containing information * about all of the permissions in the given group. - * @throws NameNotFoundException if a package with the given name cannot be + * @throws NameNotFoundException if a group with the given name cannot be * found on the system. */ + //@Deprecated @NonNull public abstract List<PermissionInfo> queryPermissionsByGroup(@NonNull String permissionGroup, @PermissionInfoFlags int flags) throws NameNotFoundException; @@ -4481,7 +4483,7 @@ public abstract class PackageManager { * Retrieve all of the information we know about a particular group of * permissions. * - * @param permName The fully qualified name (i.e. + * @param groupName The fully qualified name (i.e. * com.google.permission_group.APPS) of the permission you are * interested in. * @param flags Additional option flags to modify the data returned. @@ -4490,8 +4492,9 @@ public abstract class PackageManager { * @throws NameNotFoundException if a package with the given name cannot be * found on the system. */ + //@Deprecated @NonNull - public abstract PermissionGroupInfo getPermissionGroupInfo(@NonNull String permName, + public abstract PermissionGroupInfo getPermissionGroupInfo(@NonNull String groupName, @PermissionGroupInfoFlags int flags) throws NameNotFoundException; /** @@ -4501,6 +4504,7 @@ public abstract class PackageManager { * @return Returns a list of {@link PermissionGroupInfo} containing * information about all of the known permission groups. */ + //@Deprecated @NonNull public abstract List<PermissionGroupInfo> getAllPermissionGroups( @PermissionGroupInfoFlags int flags); @@ -4757,6 +4761,7 @@ public abstract class PackageManager { * @return Whether the permission is restricted by policy. */ @CheckResult + //@Deprecated public abstract boolean isPermissionRevokedByPolicy(@NonNull String permName, @NonNull String packageName); @@ -4805,6 +4810,7 @@ public abstract class PackageManager { * * @see #removePermission(String) */ + //@Deprecated public abstract boolean addPermission(@NonNull PermissionInfo info); /** @@ -4814,6 +4820,7 @@ public abstract class PackageManager { * expense of no guarantee the added permission will be retained if * the device is rebooted before it is written. */ + //@Deprecated public abstract boolean addPermissionAsync(@NonNull PermissionInfo info); /** @@ -4829,6 +4836,7 @@ public abstract class PackageManager { * * @see #addPermission(PermissionInfo) */ + //@Deprecated public abstract void removePermission(@NonNull String permName); /** @@ -4881,6 +4889,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SuppressWarnings("HiddenAbstractMethod") @SystemApi @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) @@ -4908,6 +4917,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SuppressWarnings("HiddenAbstractMethod") @SystemApi @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) @@ -4936,6 +4946,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SystemApi @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermission(@NonNull String packageName, @@ -4953,6 +4964,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SuppressWarnings("HiddenAbstractMethod") @SystemApi @RequiresPermission(anyOf = { @@ -4976,6 +4988,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SuppressWarnings("HiddenAbstractMethod") @SystemApi @RequiresPermission(anyOf = { @@ -5040,6 +5053,7 @@ public abstract class PackageManager { * * @throws SecurityException if you try to access a whitelist that you have no access to. */ + //@Deprecated @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS, conditional = true) public @NonNull Set<String> getWhitelistedRestrictedPermissions( @@ -5106,6 +5120,7 @@ public abstract class PackageManager { * * @throws SecurityException if you try to modify a whitelist that you have no access to. */ + //@Deprecated @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS, conditional = true) public boolean addWhitelistedRestrictedPermission(@NonNull String packageName, @@ -5175,6 +5190,7 @@ public abstract class PackageManager { * * @throws SecurityException if you try to modify a whitelist that you have no access to. */ + //@Deprecated @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS, conditional = true) public boolean removeWhitelistedRestrictedPermission(@NonNull String packageName, @@ -5207,6 +5223,7 @@ public abstract class PackageManager { * * @throws SecurityException if you you have no access to modify this. */ + //@Deprecated @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS, conditional = true) public boolean setAutoRevokeWhitelisted(@NonNull String packageName, boolean whitelisted) { @@ -5234,6 +5251,7 @@ public abstract class PackageManager { * * @throws SecurityException if you you have no access to this. */ + //@Deprecated @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS, conditional = true) public boolean isAutoRevokeWhitelisted(@NonNull String packageName) { @@ -5252,6 +5270,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SuppressWarnings("HiddenAbstractMethod") @UnsupportedAppUsage public abstract boolean shouldShowRequestPermissionRationale(@NonNull String permName); @@ -7554,6 +7573,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SuppressWarnings("HiddenAbstractMethod") @SystemApi @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) @@ -7567,6 +7587,7 @@ public abstract class PackageManager { * * @hide */ + //@Deprecated @SuppressWarnings("HiddenAbstractMethod") @SystemApi @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 4dfbd75a9d67..45f072adf801 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -53,7 +53,6 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.ComponentName; import android.content.Intent; import android.content.IntentFilter; -import android.content.pm.permission.SplitPermissionInfoParcelable; import android.content.pm.split.DefaultSplitAssetLoader; import android.content.pm.split.SplitAssetDependencyLoader; import android.content.pm.split.SplitAssetLoader; @@ -74,6 +73,7 @@ import android.os.SystemProperties; import android.os.Trace; import android.os.UserHandle; import android.os.storage.StorageManager; +import android.permission.PermissionManager; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -2394,17 +2394,13 @@ public class PackageParser { Slog.i(TAG, newPermsMsg.toString()); } - List<SplitPermissionInfoParcelable> splitPermissions; - - try { - splitPermissions = ActivityThread.getPermissionManager().getSplitPermissions(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + final List<PermissionManager.SplitPermissionInfo> splitPermissions = + ActivityThread.currentApplication().getSystemService(PermissionManager.class) + .getSplitPermissions(); final int listSize = splitPermissions.size(); for (int is = 0; is < listSize; is++) { - final SplitPermissionInfoParcelable spi = splitPermissions.get(is); + final PermissionManager.SplitPermissionInfo spi = splitPermissions.get(is); if (pkg.applicationInfo.targetSdkVersion >= spi.getTargetSdk() || !pkg.requestedPermissions.contains(spi.getSplitPermission())) { continue; diff --git a/core/java/android/content/pm/parsing/ParsingPackageUtils.java b/core/java/android/content/pm/parsing/ParsingPackageUtils.java index eae7d452ff74..561a9e31b4b0 100644 --- a/core/java/android/content/pm/parsing/ParsingPackageUtils.java +++ b/core/java/android/content/pm/parsing/ParsingPackageUtils.java @@ -71,7 +71,6 @@ import android.content.pm.parsing.result.ParseInput; import android.content.pm.parsing.result.ParseInput.DeferredError; import android.content.pm.parsing.result.ParseResult; import android.content.pm.parsing.result.ParseTypeImpl; -import android.content.pm.permission.SplitPermissionInfoParcelable; import android.content.pm.split.DefaultSplitAssetLoader; import android.content.pm.split.SplitAssetDependencyLoader; import android.content.pm.split.SplitAssetLoader; @@ -85,9 +84,9 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.FileUtils; -import android.os.RemoteException; import android.os.Trace; import android.os.ext.SdkExtensions; +import android.permission.PermissionManager; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -2664,17 +2663,13 @@ public class ParsingPackageUtils { } private static void convertSplitPermissions(ParsingPackage pkg) { - List<SplitPermissionInfoParcelable> splitPermissions; - - try { - splitPermissions = ActivityThread.getPermissionManager().getSplitPermissions(); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + final List<PermissionManager.SplitPermissionInfo> splitPermissions = + ActivityThread.currentApplication().getSystemService(PermissionManager.class) + .getSplitPermissions(); final int listSize = splitPermissions.size(); for (int is = 0; is < listSize; is++) { - final SplitPermissionInfoParcelable spi = splitPermissions.get(is); + final PermissionManager.SplitPermissionInfo spi = splitPermissions.get(is); List<String> requestedPermissions = pkg.getRequestedPermissions(); if (pkg.getTargetSdkVersion() >= spi.getTargetSdk() || !requestedPermissions.contains(spi.getSplitPermission())) { diff --git a/core/java/android/hardware/OWNERS b/core/java/android/hardware/OWNERS index 47dbf2d960e3..3295042b0b35 100644 --- a/core/java/android/hardware/OWNERS +++ b/core/java/android/hardware/OWNERS @@ -1,2 +1,5 @@ # Camera per-file *Camera*=cychen@google.com,epeev@google.com,etalvala@google.com,shuzhenwang@google.com,yinchiayeh@google.com,zhijunhe@google.com,jchowdhary@google.com + +# Sensor Privacy +per-file *SensorPrivacy* = file:platform/frameworks/native:/libs/sensorprivacy/OWNERS diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 7afba1a214b8..41cc12f3b2e3 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -2856,10 +2856,10 @@ public abstract class CameraMetadata<TKey> { * respective color channel provided in * {@link CaptureRequest#SENSOR_TEST_PATTERN_DATA android.sensor.testPatternData}.</p> * <p>For example:</p> - * <pre><code>android.testPatternData = [0, 0xFFFFFFFF, 0xFFFFFFFF, 0] + * <pre><code>android.control.testPatternData = [0, 0xFFFFFFFF, 0xFFFFFFFF, 0] * </code></pre> * <p>All green pixels are 100% green. All red/blue pixels are black.</p> - * <pre><code>android.testPatternData = [0xFFFFFFFF, 0, 0xFFFFFFFF, 0] + * <pre><code>android.control.testPatternData = [0xFFFFFFFF, 0, 0xFFFFFFFF, 0] * </code></pre> * <p>All red pixels are 100% red. Only the odd green pixels * are 100% green. All blue pixels are 100% black.</p> diff --git a/core/java/android/hardware/hdmi/HdmiPortInfo.java b/core/java/android/hardware/hdmi/HdmiPortInfo.java index e4b311a64c31..625a6a53d9ce 100644 --- a/core/java/android/hardware/hdmi/HdmiPortInfo.java +++ b/core/java/android/hardware/hdmi/HdmiPortInfo.java @@ -192,6 +192,7 @@ public final class HdmiPortInfo implements Parcelable { @Override public int hashCode() { - return mId; + return java.util.Objects.hash( + mId, mType, mAddress, mCecSupported, mArcSupported, mMhlSupported); } } diff --git a/core/java/android/net/NetworkAgent.java b/core/java/android/net/NetworkAgent.java index 0676ad4e2322..6780167fa63e 100644 --- a/core/java/android/net/NetworkAgent.java +++ b/core/java/android/net/NetworkAgent.java @@ -51,7 +51,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * An agent manages the life cycle of a network. A network starts its * life cycle when {@link register} is called on NetworkAgent. The network * is then connecting. When full L3 connectivity has been established, - * the agent shoud call {@link markConnected} to inform the system that + * the agent should call {@link markConnected} to inform the system that * this network is ready to use. When the network disconnects its life * ends and the agent should call {@link unregister}, at which point the * system will clean up and free resources. @@ -94,12 +94,6 @@ public abstract class NetworkAgent { @Nullable private volatile Network mNetwork; - // Whether this NetworkAgent is using the legacy (never unhidden) API. The difference is - // that the legacy API uses NetworkInfo to convey the state, while the current API is - // exposing methods to manage it and generate it internally instead. - // TODO : remove this as soon as all agents have been converted. - private final boolean mIsLegacy; - private final Handler mHandler; private volatile AsyncChannel mAsyncChannel; private final String LOG_TAG; @@ -110,8 +104,6 @@ public abstract class NetworkAgent { private static final long BW_REFRESH_MIN_WIN_MS = 500; private boolean mBandwidthUpdateScheduled = false; private AtomicBoolean mBandwidthUpdatePending = new AtomicBoolean(false); - // Not used by legacy agents. Non-legacy agents use this to convert the NetworkAgent system API - // into the internal API of ConnectivityService. @NonNull private NetworkInfo mNetworkInfo; @NonNull @@ -337,35 +329,6 @@ public abstract class NetworkAgent { */ public static final int CMD_REMOVE_KEEPALIVE_PACKET_FILTER = BASE + 17; - /** @hide TODO: remove and replace usage with the public constructor. */ - public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, - NetworkCapabilities nc, LinkProperties lp, int score) { - this(looper, context, logTag, ni, nc, lp, score, null, NetworkProvider.ID_NONE); - // Register done by the constructor called in the previous line - } - - /** @hide TODO: remove and replace usage with the public constructor. */ - public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, - NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config) { - this(looper, context, logTag, ni, nc, lp, score, config, NetworkProvider.ID_NONE); - // Register done by the constructor called in the previous line - } - - /** @hide TODO: remove and replace usage with the public constructor. */ - public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, - NetworkCapabilities nc, LinkProperties lp, int score, int providerId) { - this(looper, context, logTag, ni, nc, lp, score, null, providerId); - // Register done by the constructor called in the previous line - } - - /** @hide TODO: remove and replace usage with the public constructor. */ - public NetworkAgent(Looper looper, Context context, String logTag, NetworkInfo ni, - NetworkCapabilities nc, LinkProperties lp, int score, NetworkAgentConfig config, - int providerId) { - this(looper, context, logTag, nc, lp, score, config, providerId, ni, true /* legacy */); - register(); - } - private static NetworkInfo getLegacyNetworkInfo(final NetworkAgentConfig config) { // The subtype can be changed with (TODO) setLegacySubtype, but it starts // with 0 (TelephonyManager.NETWORK_TYPE_UNKNOWN) and an empty description. @@ -393,7 +356,7 @@ public abstract class NetworkAgent { @NonNull NetworkAgentConfig config, @Nullable NetworkProvider provider) { this(looper, context, logTag, nc, lp, score, config, provider == null ? NetworkProvider.ID_NONE : provider.getProviderId(), - getLegacyNetworkInfo(config), false /* legacy */); + getLegacyNetworkInfo(config)); } private static class InitialConfiguration { @@ -418,11 +381,9 @@ public abstract class NetworkAgent { private NetworkAgent(@NonNull Looper looper, @NonNull Context context, @NonNull String logTag, @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, int score, - @NonNull NetworkAgentConfig config, int providerId, @NonNull NetworkInfo ni, - boolean legacy) { + @NonNull NetworkAgentConfig config, int providerId, @NonNull NetworkInfo ni) { mHandler = new NetworkAgentHandler(looper); LOG_TAG = logTag; - mIsLegacy = legacy; mNetworkInfo = new NetworkInfo(ni); this.providerId = providerId; if (ni == null || nc == null || lp == null) { @@ -696,11 +657,6 @@ public abstract class NetworkAgent { * Call {@link #unregister} to disconnect. */ public void markConnected() { - if (mIsLegacy) { - throw new UnsupportedOperationException( - "Legacy agents can't call markConnected."); - } - // |reason| cannot be used by the non-legacy agents mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null /* reason */, mNetworkInfo.getExtraInfo()); queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo); @@ -713,9 +669,6 @@ public abstract class NetworkAgent { * the network is torn down and this agent can no longer be used. */ public void unregister() { - if (mIsLegacy) { - throw new UnsupportedOperationException("Legacy agents can't call unregister."); - } // When unregistering an agent nobody should use the extrainfo (or reason) any more. mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null /* reason */, null /* extraInfo */); @@ -735,9 +688,6 @@ public abstract class NetworkAgent { */ @Deprecated public void setLegacySubtype(final int legacySubtype, @NonNull final String legacySubtypeName) { - if (mIsLegacy) { - throw new UnsupportedOperationException("Legacy agents can't call setLegacySubtype."); - } mNetworkInfo.setSubtype(legacySubtype, legacySubtypeName); queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo); } @@ -760,9 +710,6 @@ public abstract class NetworkAgent { */ @Deprecated public void setLegacyExtraInfo(@Nullable final String extraInfo) { - if (mIsLegacy) { - throw new UnsupportedOperationException("Legacy agents can't call setLegacyExtraInfo."); - } mNetworkInfo.setExtraInfo(extraInfo); queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, mNetworkInfo); } @@ -773,9 +720,6 @@ public abstract class NetworkAgent { */ @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) public final void sendNetworkInfo(NetworkInfo networkInfo) { - if (!mIsLegacy) { - throw new UnsupportedOperationException("Only legacy agents can call sendNetworkInfo."); - } queueOrSendMessage(EVENT_NETWORK_INFO_CHANGED, new NetworkInfo(networkInfo)); } diff --git a/core/java/android/net/OWNERS b/core/java/android/net/OWNERS index 5e2a71876103..4ea8a54828b3 100644 --- a/core/java/android/net/OWNERS +++ b/core/java/android/net/OWNERS @@ -1,11 +1,5 @@ set noparent -codewiz@google.com -jchalard@google.com -jsharkey@android.com -junyulai@google.com -lorenzo@google.com -reminv@google.com -satk@google.com +include platform/frameworks/base:/services/core/java/com/android/server/net/OWNERS per-file SSL*, Uri*, Url* = prb@google.com, dauletz@google.com, narayan@google.com, ngeoffray@google.com diff --git a/core/java/android/net/TcpRepairWindow.java b/core/java/android/net/TcpRepairWindow.java index 86034f0a76ed..f062fa9034ea 100644 --- a/core/java/android/net/TcpRepairWindow.java +++ b/core/java/android/net/TcpRepairWindow.java @@ -16,12 +16,15 @@ package android.net; +import android.annotation.SystemApi; + /** * Corresponds to C's {@code struct tcp_repair_window} from * include/uapi/linux/tcp.h * * @hide */ +@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) public final class TcpRepairWindow { public final int sndWl1; public final int sndWnd; diff --git a/core/java/android/os/OWNERS b/core/java/android/os/OWNERS index a0bcf990fba1..3b334a719011 100644 --- a/core/java/android/os/OWNERS +++ b/core/java/android/os/OWNERS @@ -25,4 +25,7 @@ per-file PowerComponents.java = file:/BATTERY_STATS_OWNERS per-file GraphicsEnvironment.java = chrisforbes@google.com, cnorthrop@google.com, lpy@google.com, timvp@google.com, zzyiwei@google.com +per-file *Network* = file:/services/core/java/com/android/server/net/OWNERS +per-file *Power* = file:/services/core/java/com/android/server/power/OWNERS +per-file *Telephony* = file:/telephony/OWNERS per-file *Zygote* = file:/ZYGOTE_OWNERS diff --git a/core/java/android/os/RemoteException.java b/core/java/android/os/RemoteException.java index 98c66d1beaf4..e9fc2f38072b 100644 --- a/core/java/android/os/RemoteException.java +++ b/core/java/android/os/RemoteException.java @@ -37,6 +37,11 @@ public class RemoteException extends AndroidException { super(message, cause, enableSuppression, writableStackTrace); } + /** @hide */ + public RemoteException(Throwable cause) { + this(cause.getMessage(), cause, true, false); + } + /** * Rethrow this as an unchecked runtime exception. * <p> diff --git a/core/java/android/permission/ILegacyPermissionManager.aidl b/core/java/android/permission/ILegacyPermissionManager.aidl new file mode 100644 index 000000000000..3bd4bf549df0 --- /dev/null +++ b/core/java/android/permission/ILegacyPermissionManager.aidl @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.permission; + +import android.content.pm.ParceledListSlice; +import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; +import android.content.pm.permission.SplitPermissionInfoParcelable; +import android.os.UserHandle; +import android.permission.IOnPermissionsChangeListener; + +/** + * Interface to communicate directly with the legacy permission manager service. + * + * @see PermissionManager + * @hide + */ +interface ILegacyPermissionManager { + int checkDeviceIdentifierAccess(String packageName, String callingFeatureId, String message, int pid, int uid); + + void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); + + void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId); + + void grantDefaultPermissionsToEnabledTelephonyDataServices( + in String[] packageNames, int userId); + + void revokeDefaultPermissionsFromDisabledTelephonyDataServices( + in String[] packageNames, int userId); + + void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId); + + void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId); +} diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl index a94077dd7ad6..4ad17ef58945 100644 --- a/core/java/android/permission/IPermissionManager.aidl +++ b/core/java/android/permission/IPermissionManager.aidl @@ -52,8 +52,6 @@ interface IPermissionManager { int checkUidPermission(String permName, int uid); - int checkDeviceIdentifierAccess(String packageName, String callingFeatureId, String message, int pid, int uid); - void addOnPermissionsChangeListener(in IOnPermissionsChangeListener listener); void removeOnPermissionsChangeListener(in IOnPermissionsChangeListener listener); @@ -73,20 +71,6 @@ interface IPermissionManager { void resetRuntimePermissions(); - void grantDefaultPermissionsToEnabledCarrierApps(in String[] packageNames, int userId); - - void grantDefaultPermissionsToEnabledImsServices(in String[] packageNames, int userId); - - void grantDefaultPermissionsToEnabledTelephonyDataServices( - in String[] packageNames, int userId); - - void revokeDefaultPermissionsFromDisabledTelephonyDataServices( - in String[] packageNames, int userId); - - void grantDefaultPermissionsToActiveLuiApp(in String packageName, int userId); - - void revokeDefaultPermissionsFromLuiApps(in String[] packageNames, int userId); - boolean shouldShowRequestPermissionRationale(String permName, String packageName, int userId); diff --git a/core/java/android/permission/LegacyPermissionManager.java b/core/java/android/permission/LegacyPermissionManager.java new file mode 100644 index 000000000000..b66dd82965d3 --- /dev/null +++ b/core/java/android/permission/LegacyPermissionManager.java @@ -0,0 +1,217 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.permission; + +import android.Manifest; +import android.annotation.CallbackExecutor; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.RequiresPermission; +import android.annotation.SystemService; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.UserHandle; + +import com.android.internal.annotations.VisibleForTesting; + +import java.util.concurrent.Executor; +import java.util.function.Consumer; + +/** + * System level service for accessing the permission capabilities of the platform, version 2. + * + * @hide + */ +//@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) +@SystemService(Context.LEGACY_PERMISSION_SERVICE) +public final class LegacyPermissionManager { + private final ILegacyPermissionManager mLegacyPermissionManager; + + /** + * Creates a new instance. + * + * @hide + */ + public LegacyPermissionManager() throws ServiceManager.ServiceNotFoundException { + this(ILegacyPermissionManager.Stub.asInterface(ServiceManager.getServiceOrThrow( + "legacy_permission"))); + } + + /** + * Creates a new instance with the provided instantiation of the ILegacyPermissionManager. + * + * @param legacyPermissionManager injectable legacy permission manager service + * + * @hide + */ + @VisibleForTesting + public LegacyPermissionManager(@NonNull ILegacyPermissionManager legacyPermissionManager) { + mLegacyPermissionManager = legacyPermissionManager; + } + + /** + * Checks whether the package with the given pid/uid can read device identifiers. + * + * @param packageName the name of the package to be checked for identifier access + * @param message the message to be used for logging during identifier access + * verification + * @param callingFeatureId the feature in the package + * @param pid the process id of the package to be checked + * @param uid the uid of the package to be checked + * @return {@link PackageManager#PERMISSION_GRANTED} if the package is allowed identifier + * access, {@link PackageManager#PERMISSION_DENIED} otherwise + * @hide + */ + //@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message, + @Nullable String callingFeatureId, int pid, int uid) { + try { + return mLegacyPermissionManager.checkDeviceIdentifierAccess(packageName, message, + callingFeatureId, pid, uid); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Grant default permissions to currently active LUI app + * @param packageName The package name for the LUI app + * @param user The user handle + * @param executor The executor for the callback + * @param callback The callback provided by caller to be notified when grant completes + * @hide + */ + @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) + public void grantDefaultPermissionsToLuiApp( + @NonNull String packageName, @NonNull UserHandle user, + @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + try { + mLegacyPermissionManager.grantDefaultPermissionsToActiveLuiApp( + packageName, user.getIdentifier()); + executor.execute(() -> callback.accept(true)); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Revoke default permissions to currently active LUI app + * @param packageNames The package names for the LUI apps + * @param user The user handle + * @param executor The executor for the callback + * @param callback The callback provided by caller to be notified when grant completes + * @hide + */ + @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) + public void revokeDefaultPermissionsFromLuiApps( + @NonNull String[] packageNames, @NonNull UserHandle user, + @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + try { + mLegacyPermissionManager.revokeDefaultPermissionsFromLuiApps( + packageNames, user.getIdentifier()); + executor.execute(() -> callback.accept(true)); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Grant default permissions to currently active Ims services + * @param packageNames The package names for the Ims services + * @param user The user handle + * @param executor The executor for the callback + * @param callback The callback provided by caller to be notified when grant completes + * @hide + */ + @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) + public void grantDefaultPermissionsToEnabledImsServices( + @NonNull String[] packageNames, @NonNull UserHandle user, + @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + try { + mLegacyPermissionManager.grantDefaultPermissionsToEnabledImsServices( + packageNames, user.getIdentifier()); + executor.execute(() -> callback.accept(true)); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Grant default permissions to currently enabled telephony data services + * @param packageNames The package name for the services + * @param user The user handle + * @param executor The executor for the callback + * @param callback The callback provided by caller to be notified when grant completes + * @hide + */ + @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) + public void grantDefaultPermissionsToEnabledTelephonyDataServices( + @NonNull String[] packageNames, @NonNull UserHandle user, + @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + try { + mLegacyPermissionManager.grantDefaultPermissionsToEnabledTelephonyDataServices( + packageNames, user.getIdentifier()); + executor.execute(() -> callback.accept(true)); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Revoke default permissions to currently active telephony data services + * @param packageNames The package name for the services + * @param user The user handle + * @param executor The executor for the callback + * @param callback The callback provided by caller to be notified when revoke completes + * @hide + */ + @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) + public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( + @NonNull String[] packageNames, @NonNull UserHandle user, + @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + try { + mLegacyPermissionManager.revokeDefaultPermissionsFromDisabledTelephonyDataServices( + packageNames, user.getIdentifier()); + executor.execute(() -> callback.accept(true)); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + + /** + * Grant default permissions to currently enabled carrier apps + * @param packageNames Package names of the apps to be granted permissions + * @param user The user handle + * @param executor The executor for the callback + * @param callback The callback provided by caller to be notified when grant completes + * @hide + */ + @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) + public void grantDefaultPermissionsToEnabledCarrierApps(@NonNull String[] packageNames, + @NonNull UserHandle user, @NonNull @CallbackExecutor Executor executor, + @NonNull Consumer<Boolean> callback) { + try { + mLegacyPermissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames, + user.getIdentifier()); + executor.execute(() -> callback.accept(true)); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } +} diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index e4220dd00a5b..d31e0129fb27 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -19,7 +19,7 @@ package android.permission; import static android.os.Build.VERSION_CODES.S; import android.Manifest; -import android.annotation.CallbackExecutor; +import android.annotation.CheckResult; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -29,6 +29,7 @@ import android.annotation.SystemService; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityThread; +import android.app.AppGlobals; import android.app.IActivityManager; import android.app.PropertyInvalidatedCache; import android.compat.annotation.ChangeId; @@ -36,15 +37,25 @@ import android.compat.annotation.EnabledAfter; import android.content.Context; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.ParceledListSlice; +import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; import android.content.pm.permission.SplitPermissionInfoParcelable; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.os.Message; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import android.util.ArrayMap; +import android.util.ArraySet; +import android.util.DebugUtils; +import android.util.Log; import android.util.Slog; import com.android.internal.annotations.Immutable; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.CollectionUtils; import java.util.ArrayList; @@ -52,8 +63,6 @@ import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Set; -import java.util.concurrent.Executor; -import java.util.function.Consumer; /** * System level service for accessing the permission capabilities of the platform. @@ -63,7 +72,7 @@ import java.util.function.Consumer; @SystemApi @SystemService(Context.PERMISSION_SERVICE) public final class PermissionManager { - private static final String TAG = PermissionManager.class.getName(); + private static final String LOG_TAG = PermissionManager.class.getName(); /** @hide */ public static final String KILL_APP_REASON_PERMISSIONS_REVOKED = @@ -83,244 +92,765 @@ public final class PermissionManager { @EnabledAfter(targetSdkVersion = S) public static final long CANNOT_INSTALL_WITH_BAD_PERMISSION_GROUPS = 146211400; + /** + * Note: Changing this won't do anything on its own - you should also change the filtering in + * {@link #shouldTraceGrant}. + * + * @hide + */ + public static final boolean DEBUG_TRACE_GRANTS = false; + /** + * @hide + */ + public static final boolean DEBUG_TRACE_PERMISSION_UPDATES = false; + private final @NonNull Context mContext; private final IPackageManager mPackageManager; private final IPermissionManager mPermissionManager; + private final LegacyPermissionManager mLegacyPermissionManager; + + private final ArrayMap<PackageManager.OnPermissionsChangedListener, + IOnPermissionsChangeListener> mPermissionListeners = new ArrayMap<>(); + private List<SplitPermissionInfo> mSplitPermissionInfos; /** * Creates a new instance. * - * @param context The current context in which to operate. + * @param context The current context in which to operate + * * @hide */ - public PermissionManager(@NonNull Context context, IPackageManager packageManager) + public PermissionManager(@NonNull Context context) throws ServiceManager.ServiceNotFoundException { - this(context, packageManager, IPermissionManager.Stub.asInterface( - ServiceManager.getServiceOrThrow("permissionmgr"))); + mContext = context; + mPackageManager = AppGlobals.getPackageManager(); + mPermissionManager = IPermissionManager.Stub.asInterface(ServiceManager.getServiceOrThrow( + "permissionmgr")); + mLegacyPermissionManager = context.getSystemService(LegacyPermissionManager.class); + } + + /** + * Retrieve all of the information we know about a particular permission. + * + * @param permissionName the fully qualified name (e.g. com.android.permission.LOGIN) of the + * permission you are interested in + * @param flags additional option flags to modify the data returned + * @return a {@link PermissionInfo} containing information about the permission, or {@code null} + * if not found + * + * @hide Pending API + */ + @Nullable + public PermissionInfo getPermissionInfo(@NonNull String permissionName, + @PackageManager.PermissionInfoFlags int flags) { + try { + final String packageName = mContext.getOpPackageName(); + return mPermissionManager.getPermissionInfo(permissionName, packageName, flags); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Query for all of the permissions associated with a particular group. + * + * @param groupName the fully qualified name (e.g. com.android.permission.LOGIN) of the + * permission group you are interested in. Use {@code null} to find all of the + * permissions not associated with a group + * @param flags additional option flags to modify the data returned + * @return a list of {@link PermissionInfo} containing information about all of the permissions + * in the given group, or {@code null} if the group is not found + * + * @hide Pending API + */ + @Nullable + public List<PermissionInfo> queryPermissionsByGroup(@NonNull String groupName, + @PackageManager.PermissionInfoFlags int flags) { + try { + final ParceledListSlice<PermissionInfo> parceledList = + mPermissionManager.queryPermissionsByGroup(groupName, flags); + if (parceledList == null) { + return null; + } + return parceledList.getList(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Add a new dynamic permission to the system. For this to work, your package must have defined + * a permission tree through the + * {@link android.R.styleable#AndroidManifestPermissionTree <permission-tree>} tag in its + * manifest. A package can only add permissions to trees that were defined by either its own + * package or another with the same user id; a permission is in a tree if it matches the name of + * the permission tree + ".": for example, "com.foo.bar" is a member of the permission tree + * "com.foo". + * <p> + * It is good to make your permission tree name descriptive, because you are taking possession + * of that entire set of permission names. Thus, it must be under a domain you control, with a + * suffix that will not match any normal permissions that may be declared in any applications + * that are part of that domain. + * <p> + * New permissions must be added before any .apks are installed that use those permissions. + * Permissions you add through this method are remembered across reboots of the device. If the + * given permission already exists, the info you supply here will be used to update it. + * + * @param permissionInfo description of the permission to be added + * @param async whether the persistence of the permission should be asynchronous, allowing it to + * return quicker and batch a series of adds, at the expense of no guarantee the + * added permission will be retained if the device is rebooted before it is + * written. + * @return {@code true} if a new permission was created, {@code false} if an existing one was + * updated + * @throws SecurityException if you are not allowed to add the given permission name + * + * @see #removePermission(String) + * + * @hide Pending API + */ + public boolean addPermission(@NonNull PermissionInfo permissionInfo, boolean async) { + try { + return mPermissionManager.addPermission(permissionInfo, async); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Removes a permission that was previously added with + * {@link #addPermission(PermissionInfo, boolean)}. The same ownership rules apply -- you are + * only allowed to remove permissions that you are allowed to add. + * + * @param permissionName the name of the permission to remove + * @throws SecurityException if you are not allowed to remove the given permission name + * + * @see #addPermission(PermissionInfo, boolean) + * + * @hide Pending API + */ + public void removePermission(@NonNull String permissionName) { + try { + mPermissionManager.removePermission(permissionName); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Retrieve all of the information we know about a particular group of permissions. + * + * @param groupName the fully qualified name (e.g. com.android.permission_group.APPS) of the + * permission you are interested in + * @param flags additional option flags to modify the data returned + * @return a {@link PermissionGroupInfo} containing information about the permission, or + * {@code null} if not found + * + * @hide Pending API + */ + @Nullable + public PermissionGroupInfo getPermissionGroupInfo(@NonNull String groupName, + @PackageManager.PermissionGroupInfoFlags int flags) { + try { + return mPermissionManager.getPermissionGroupInfo(groupName, flags); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Retrieve all of the known permission groups in the system. + * + * @param flags additional option flags to modify the data returned + * @return a list of {@link PermissionGroupInfo} containing information about all of the known + * permission groups + * + * @hide Pending API + */ + @NonNull + public List<PermissionGroupInfo> getAllPermissionGroups( + @PackageManager.PermissionGroupInfoFlags int flags) { + try { + final ParceledListSlice<PermissionGroupInfo> parceledList = + mPermissionManager.getAllPermissionGroups(flags); + if (parceledList == null) { + return Collections.emptyList(); + } + return parceledList.getList(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Checks whether a particular permissions has been revoked for a package by policy. Typically + * the device owner or the profile owner may apply such a policy. The user cannot grant policy + * revoked permissions, hence the only way for an app to get such a permission is by a policy + * change. + * + * @param packageName the name of the package you are checking against + * @param permissionName the name of the permission you are checking for + * + * @return whether the permission is restricted by policy + * + * @hide Pending API + */ + @CheckResult + public boolean isPermissionRevokedByPolicy(@NonNull String packageName, + @NonNull String permissionName) { + try { + return mPermissionManager.isPermissionRevokedByPolicy(permissionName, packageName, + mContext.getUserId()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** @hide */ + public static boolean shouldTraceGrant(String packageName, String permissionName, int userId) { + // To be modified when debugging + return false; } /** - * Creates a new instance with the provided instantiation of the IPermissionManager. + * Grant a runtime permission to an application which the application does not already have. The + * permission must have been requested by the application. If the application is not allowed to + * hold the permission, a {@link java.lang.SecurityException} is thrown. If the package or + * permission is invalid, a {@link java.lang.IllegalArgumentException} is thrown. + * <p> + * <strong>Note: </strong>Using this API requires holding + * {@code android.permission.GRANT_RUNTIME_PERMISSIONS} and if the user ID is not the current + * user {@code android.permission.INTERACT_ACROSS_USERS_FULL}. + * + * @param packageName the package to which to grant the permission + * @param permissionName the permission name to grant + * @param user the user for which to grant the permission + * + * @see #revokeRuntimePermission(String, String, android.os.UserHandle) * - * @param context the current context in which to operate - * @param packageManager package manager service to be used for package related permission - * requests - * @param permissionManager injectable permission manager service * @hide */ - @VisibleForTesting - public PermissionManager(@NonNull Context context, IPackageManager packageManager, - IPermissionManager permissionManager) { - mContext = context; - mPackageManager = packageManager; - mPermissionManager = permissionManager; + @RequiresPermission(android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS) + //@SystemApi + public void grantRuntimePermission(@NonNull String packageName, + @NonNull String permissionName, @NonNull UserHandle user) { + if (DEBUG_TRACE_GRANTS + && shouldTraceGrant(packageName, permissionName, user.getIdentifier())) { + Log.i(LOG_TAG, "App " + mContext.getPackageName() + " is granting " + packageName + " " + + permissionName + " for user " + user.getIdentifier(), new RuntimeException()); + } + try { + mPermissionManager.grantRuntimePermission(packageName, permissionName, + user.getIdentifier()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** - * Gets the version of the runtime permission database. + * Revoke a runtime permission that was previously granted by + * {@link #grantRuntimePermission(String, String, android.os.UserHandle)}. The permission must + * have been requested by and granted to the application. If the application is not allowed to + * hold the permission, a {@link java.lang.SecurityException} is thrown. If the package or + * permission is invalid, a {@link java.lang.IllegalArgumentException} is thrown. + * <p> + * <strong>Note: </strong>Using this API requires holding + * {@code android.permission.REVOKE_RUNTIME_PERMISSIONS} and if the user ID is not the current + * user {@code android.permission.INTERACT_ACROSS_USERS_FULL}. * - * @return The database version, -1 when this is an upgrade from pre-Q, 0 when this is a fresh - * install. + * @param packageName the package from which to revoke the permission + * @param permName the permission name to revoke + * @param user the user for which to revoke the permission + * @param reason the reason for the revoke, or {@code null} for unspecified + * + * @see #grantRuntimePermission(String, String, android.os.UserHandle) * * @hide */ - @SystemApi + @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) + //@SystemApi + public void revokeRuntimePermission(@NonNull String packageName, + @NonNull String permName, @NonNull UserHandle user, @Nullable String reason) { + if (DEBUG_TRACE_PERMISSION_UPDATES + && shouldTraceGrant(packageName, permName, user.getIdentifier())) { + Log.i(LOG_TAG, "App " + mContext.getPackageName() + " is revoking " + packageName + " " + + permName + " for user " + user.getIdentifier() + " with reason " + + reason, new RuntimeException()); + } + try { + mPermissionManager + .revokeRuntimePermission(packageName, permName, user.getIdentifier(), reason); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Gets the state flags associated with a permission. + * + * @param packageName the package name for which to get the flags + * @param permissionName the permission for which to get the flags + * @param user the user for which to get permission flags + * @return the permission flags + * + * @hide + */ + @PackageManager.PermissionFlags @RequiresPermission(anyOf = { - Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, - Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS + android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, + android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, + android.Manifest.permission.GET_RUNTIME_PERMISSIONS }) - public @IntRange(from = 0) int getRuntimePermissionsVersion() { + //@SystemApi + public int getPermissionFlags(@NonNull String packageName, @NonNull String permissionName, + @NonNull UserHandle user) { try { - return mPackageManager.getRuntimePermissionsVersion(mContext.getUserId()); + return mPermissionManager.getPermissionFlags(permissionName, packageName, + user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** - * Sets the version of the runtime permission database. + * Updates the flags associated with a permission by replacing the flags in the specified mask + * with the provided flag values. * - * @param version The new version. + * @param packageName The package name for which to update the flags + * @param permissionName The permission for which to update the flags + * @param flagMask The flags which to replace + * @param flagValues The flags with which to replace + * @param user The user for which to update the permission flags * * @hide */ - @SystemApi @RequiresPermission(anyOf = { - Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, - Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS + android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, + android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS }) - public void setRuntimePermissionsVersion(@IntRange(from = 0) int version) { + //@SystemApi + public void updatePermissionFlags(@NonNull String packageName, @NonNull String permissionName, + @PackageManager.PermissionFlags int flagMask, + @PackageManager.PermissionFlags int flagValues, @NonNull UserHandle user) { + if (DEBUG_TRACE_PERMISSION_UPDATES && shouldTraceGrant(packageName, permissionName, + user.getIdentifier())) { + Log.i(LOG_TAG, "App " + mContext.getPackageName() + " is updating flags for " + + packageName + " " + permissionName + " for user " + + user.getIdentifier() + ": " + DebugUtils.flagsToString( + PackageManager.class, "FLAG_PERMISSION_", flagMask) + " := " + + DebugUtils.flagsToString(PackageManager.class, "FLAG_PERMISSION_", + flagValues), new RuntimeException()); + } try { - mPackageManager.setRuntimePermissionsVersion(version, mContext.getUserId()); + final boolean checkAdjustPolicyFlagPermission = + mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.Q; + mPermissionManager.updatePermissionFlags(permissionName, packageName, flagMask, + flagValues, checkAdjustPolicyFlagPermission, user.getIdentifier()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } /** - * Get set of permissions that have been split into more granular or dependent permissions. + * Gets the restricted permissions that have been allowlisted and the app is allowed to have + * them granted in their full form. + * <p> + * Permissions can be hard restricted which means that the app cannot hold them or soft + * restricted where the app can hold the permission but in a weaker form. Whether a permission + * is {@link PermissionInfo#FLAG_HARD_RESTRICTED hard restricted} or + * {@link PermissionInfo#FLAG_SOFT_RESTRICTED soft restricted} depends on the permission + * declaration. Allowlisting a hard restricted permission allows for the to hold that permission + * and allowlisting a soft restricted permission allows the app to hold the permission in its + * full, unrestricted form. + * <p> + * There are four allowlists: + * <ol> + * <li> + * One for cases where the system permission policy allowlists a permission. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM} flag. Can only be + * accessed by pre-installed holders of a dedicated permission. + * <li> + * One for cases where the system allowlists the permission when upgrading from an OS version in + * which the permission was not restricted to an OS version in which the permission is + * restricted. This list corresponds to the + * {@link PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE} flag. Can be accessed by + * pre-installed holders of a dedicated permission or the installer on record. + * <li> + * One for cases where the installer of the package allowlists a permission. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER} flag. Can be + * accessed by pre-installed holders of a dedicated permission or the installer on record. + * <li> + * One for cases where the system exempts the permission when granting a role. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE} flag. Can be + * accessed by pre-installed holders of a dedicated permission. + * </ol> * - * <p>E.g. before {@link android.os.Build.VERSION_CODES#Q} an app that was granted - * {@link Manifest.permission#ACCESS_COARSE_LOCATION} could access the location while it was in - * foreground and background. On platforms after {@link android.os.Build.VERSION_CODES#Q} - * the location permission only grants location access while the app is in foreground. This - * would break apps that target before {@link android.os.Build.VERSION_CODES#Q}. Hence whenever - * such an old app asks for a location permission (i.e. the - * {@link SplitPermissionInfo#getSplitPermission()}), then the - * {@link Manifest.permission#ACCESS_BACKGROUND_LOCATION} permission (inside - * {@link SplitPermissionInfo#getNewPermissions}) is added. + * @param packageName the app for which to get allowlisted permissions + * @param allowlistFlag the flag to determine which allowlist to query. Only one flag can be + * passed. + * @return the allowlisted permissions that are on any of the allowlists you query for + * @throws SecurityException if you try to access a allowlist that you have no access to * - * <p>Note: Regular apps do not have to worry about this. The platform and permission controller - * automatically add the new permissions where needed. + * @see #addAllowlistedRestrictedPermission(String, String, int) + * @see #removeAllowlistedRestrictedPermission(String, String, int) + * @see PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM + * @see PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE + * @see PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER + * @see PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE * - * @return All permissions that are split. + * @hide Pending API */ - public @NonNull List<SplitPermissionInfo> getSplitPermissions() { - if (mSplitPermissionInfos != null) { - return mSplitPermissionInfos; + @NonNull + @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS, + conditional = true) + public Set<String> getAllowlistedRestrictedPermissions(@NonNull String packageName, + @PackageManager.PermissionWhitelistFlags int allowlistFlag) { + try { + final List<String> allowlist = mPermissionManager.getWhitelistedRestrictedPermissions( + packageName, allowlistFlag, mContext.getUserId()); + if (allowlist == null) { + return Collections.emptySet(); + } + return new ArraySet<>(allowlist); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); } + } - List<SplitPermissionInfoParcelable> parcelableList; + /** + * Adds a allowlisted restricted permission for an app. + * <p> + * Permissions can be hard restricted which means that the app cannot hold them or soft + * restricted where the app can hold the permission but in a weaker form. Whether a permission + * is {@link PermissionInfo#FLAG_HARD_RESTRICTED hard restricted} or + * {@link PermissionInfo#FLAG_SOFT_RESTRICTED soft restricted} depends on the permission + * declaration. Allowlisting a hard restricted permission allows for the to hold that permission + * and allowlisting a soft restricted permission allows the app to hold the permission in its + * full, unrestricted form. + * <p>There are four allowlists: + * <ol> + * <li> + * One for cases where the system permission policy allowlists a permission. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM} flag. Can only be + * accessed by pre-installed holders of a dedicated permission. + * <li> + * One for cases where the system allowlists the permission when upgrading from an OS version in + * which the permission was not restricted to an OS version in which the permission is + * restricted. This list corresponds to the + * {@link PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE} flag. Can be accessed by + * pre-installed holders of a dedicated permission or the installer on record. + * <li> + * One for cases where the installer of the package allowlists a permission. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER} flag. Can be + * accessed by pre-installed holders of a dedicated permission or the installer on record. + * <li> + * One for cases where the system exempts the permission when granting a role. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE} flag. Can be + * accessed by pre-installed holders of a dedicated permission. + * </ol> + * <p> + * You need to specify the allowlists for which to set the allowlisted permissions which will + * clear the previous allowlisted permissions and replace them with the provided ones. + * + * @param packageName the app for which to get allowlisted permissions + * @param permissionName the allowlisted permission to add + * @param allowlistFlags the allowlists to which to add. Passing multiple flags updates all + * specified allowlists. + * @return whether the permission was added to the allowlist + * @throws SecurityException if you try to modify a allowlist that you have no access to. + * + * @see #getAllowlistedRestrictedPermissions(String, int) + * @see #removeAllowlistedRestrictedPermission(String, String, int) + * @see PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM + * @see PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE + * @see PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER + * @see PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE + * + * @hide Pending API + */ + @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS, + conditional = true) + public boolean addAllowlistedRestrictedPermission(@NonNull String packageName, + @NonNull String permissionName, + @PackageManager.PermissionWhitelistFlags int allowlistFlags) { try { - parcelableList = ActivityThread.getPermissionManager().getSplitPermissions(); + return mPermissionManager.addWhitelistedRestrictedPermission(packageName, + permissionName, allowlistFlags, mContext.getUserId()); } catch (RemoteException e) { - Slog.e(TAG, "Error getting split permissions", e); - return Collections.emptyList(); + throw e.rethrowFromSystemServer(); } + } - mSplitPermissionInfos = splitPermissionInfoListToNonParcelableList(parcelableList); - - return mSplitPermissionInfos; + /** + * Removes a allowlisted restricted permission for an app. + * <p> + * Permissions can be hard restricted which means that the app cannot hold them or soft + * restricted where the app can hold the permission but in a weaker form. Whether a permission + * is {@link PermissionInfo#FLAG_HARD_RESTRICTED hard restricted} or + * {@link PermissionInfo#FLAG_SOFT_RESTRICTED soft restricted} depends on the permission + * declaration. Allowlisting a hard restricted permission allows for the to hold that permission + * and allowlisting a soft restricted permission allows the app to hold the permission in its + * full, unrestricted form. + * <p>There are four allowlists: + * <ol> + * <li> + * One for cases where the system permission policy allowlists a permission. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM} flag. Can only be + * accessed by pre-installed holders of a dedicated permission. + * <li> + * One for cases where the system allowlists the permission when upgrading from an OS version in + * which the permission was not restricted to an OS version in which the permission is + * restricted. This list corresponds to the + * {@link PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE} flag. Can be accessed by + * pre-installed holders of a dedicated permission or the installer on record. + * <li> + * One for cases where the installer of the package allowlists a permission. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER} flag. Can be + * accessed by pre-installed holders of a dedicated permission or the installer on record. + * <li> + * One for cases where the system exempts the permission when granting a role. This list + * corresponds to the {@link PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE} flag. Can be + * accessed by pre-installed holders of a dedicated permission. + * </ol> + * <p> + * You need to specify the allowlists for which to set the allowlisted permissions which will + * clear the previous allowlisted permissions and replace them with the provided ones. + * + * @param packageName the app for which to get allowlisted permissions + * @param permissionName the allowlisted permission to remove + * @param allowlistFlags the allowlists from which to remove. Passing multiple flags updates all + * specified allowlists. + * @return whether the permission was removed from the allowlist + * @throws SecurityException if you try to modify a allowlist that you have no access to. + * + * @see #getAllowlistedRestrictedPermissions(String, int) + * @see #addAllowlistedRestrictedPermission(String, String, int) + * @see PackageManager#FLAG_PERMISSION_WHITELIST_SYSTEM + * @see PackageManager#FLAG_PERMISSION_WHITELIST_UPGRADE + * @see PackageManager#FLAG_PERMISSION_WHITELIST_INSTALLER + * @see PackageManager#FLAG_PERMISSION_ALLOWLIST_ROLE + * + * @hide Pending API + */ + @RequiresPermission(value = Manifest.permission.WHITELIST_RESTRICTED_PERMISSIONS, + conditional = true) + public boolean removeAllowlistedRestrictedPermission(@NonNull String packageName, + @NonNull String permissionName, + @PackageManager.PermissionWhitelistFlags int allowlistFlags) { + try { + return mPermissionManager.removeWhitelistedRestrictedPermission(packageName, + permissionName, allowlistFlags, mContext.getUserId()); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } } /** - * Grant default permissions to currently active LUI app - * @param packageName The package name for the LUI app - * @param user The user handle - * @param executor The executor for the callback - * @param callback The callback provided by caller to be notified when grant completes - * @hide + * Checks whether an application is exempted from having its permissions be automatically + * revoked when the app is unused for an extended period of time. + * <p> + * Only the installer on record that installed the given package, or a holder of + * {@code WHITELIST_AUTO_REVOKE_PERMISSIONS} is allowed to call this. + * + * @param packageName the app for which to set exemption + * @return whether the app is exempted + * @throws SecurityException if you you have no access to this + * + * @see #setAutoRevokeExempted + * + * @hide Pending API */ - @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) - public void grantDefaultPermissionsToLuiApp( - @NonNull String packageName, @NonNull UserHandle user, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS, + conditional = true) + public boolean isAutoRevokeExempted(@NonNull String packageName) { try { - mPermissionManager.grantDefaultPermissionsToActiveLuiApp( - packageName, user.getIdentifier()); - executor.execute(() -> callback.accept(true)); + return mPermissionManager.isAutoRevokeWhitelisted(packageName, mContext.getUserId()); } catch (RemoteException e) { - e.rethrowFromSystemServer(); + throw e.rethrowFromSystemServer(); } } /** - * Revoke default permissions to currently active LUI app - * @param packageNames The package names for the LUI apps - * @param user The user handle - * @param executor The executor for the callback - * @param callback The callback provided by caller to be notified when grant completes - * @hide + * Marks an application exempted from having its permissions be automatically revoked when the + * app is unused for an extended period of time. + * <p> + * Only the installer on record that installed the given package is allowed to call this. + * <p> + * Packages start in exempted state, and it is the installer's responsibility to un-exempt the + * packages it installs, unless auto-revoking permissions from that package would cause + * breakages beyond having to re-request the permission(s). + * + * @param packageName the app for which to set exemption + * @param exempted whether the app should be exempted + * @return whether any change took effect + * @throws SecurityException if you you have no access to modify this + * + * @see #isAutoRevokeExempted + * + * @hide Pending API */ - @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) - public void revokeDefaultPermissionsFromLuiApps( - @NonNull String[] packageNames, @NonNull UserHandle user, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + @RequiresPermission(value = Manifest.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS, + conditional = true) + public boolean setAutoRevokeExempted(@NonNull String packageName, boolean exempted) { try { - mPermissionManager.revokeDefaultPermissionsFromLuiApps( - packageNames, user.getIdentifier()); - executor.execute(() -> callback.accept(true)); + return mPermissionManager.setAutoRevokeWhitelisted(packageName, exempted, + mContext.getUserId()); } catch (RemoteException e) { - e.rethrowFromSystemServer(); + throw e.rethrowFromSystemServer(); } } /** - * Grant default permissions to currently active Ims services - * @param packageNames The package names for the Ims services - * @param user The user handle - * @param executor The executor for the callback - * @param callback The callback provided by caller to be notified when grant completes + * Get whether you should show UI with rationale for requesting a permission. You should do this + * only if you do not have the permission and the context in which the permission is requested + * does not clearly communicate to the user what would be the benefit from grating this + * permission. + * + * @param permissionName a permission your app wants to request + * @return whether you can show permission rationale UI + * * @hide */ - @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) - public void grantDefaultPermissionsToEnabledImsServices( - @NonNull String[] packageNames, @NonNull UserHandle user, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + //@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + public boolean shouldShowRequestPermissionRationale(@NonNull String permissionName) { try { - mPermissionManager.grantDefaultPermissionsToEnabledImsServices( - packageNames, user.getIdentifier()); - executor.execute(() -> callback.accept(true)); + final String packageName = mContext.getPackageName(); + return mPermissionManager.shouldShowRequestPermissionRationale(permissionName, + packageName, mContext.getUserId()); } catch (RemoteException e) { - e.rethrowFromSystemServer(); + throw e.rethrowFromSystemServer(); + } + } + + /** + * Add a listener for permission changes for installed packages. + * + * @param listener the listener to add + * + * @hide + */ + //@SystemApi + @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) + public void addOnPermissionsChangeListener( + @NonNull PackageManager.OnPermissionsChangedListener listener) { + synchronized (mPermissionListeners) { + if (mPermissionListeners.get(listener) != null) { + return; + } + final OnPermissionsChangeListenerDelegate delegate = + new OnPermissionsChangeListenerDelegate(listener, Looper.getMainLooper()); + try { + mPermissionManager.addOnPermissionsChangeListener(delegate); + mPermissionListeners.put(listener, delegate); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + } + + /** + * Remove a listener for permission changes for installed packages. + * + * @param listener the listener to remove + * + * @hide + */ + //@SystemApi + @RequiresPermission(Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS) + public void removeOnPermissionsChangeListener( + @NonNull PackageManager.OnPermissionsChangedListener listener) { + synchronized (mPermissionListeners) { + final IOnPermissionsChangeListener delegate = mPermissionListeners.get(listener); + if (delegate != null) { + try { + mPermissionManager.removeOnPermissionsChangeListener(delegate); + mPermissionListeners.remove(listener); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } } } /** - * Grant default permissions to currently enabled telephony data services - * @param packageNames The package name for the services - * @param user The user handle - * @param executor The executor for the callback - * @param callback The callback provided by caller to be notified when grant completes + * Gets the version of the runtime permission database. + * + * @return The database version, -1 when this is an upgrade from pre-Q, 0 when this is a fresh + * install. + * * @hide */ - @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) - public void grantDefaultPermissionsToEnabledTelephonyDataServices( - @NonNull String[] packageNames, @NonNull UserHandle user, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + @SystemApi + @RequiresPermission(anyOf = { + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, + Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS + }) + public @IntRange(from = 0) int getRuntimePermissionsVersion() { try { - mPermissionManager.grantDefaultPermissionsToEnabledTelephonyDataServices( - packageNames, user.getIdentifier()); - executor.execute(() -> callback.accept(true)); + return mPackageManager.getRuntimePermissionsVersion(mContext.getUserId()); } catch (RemoteException e) { - e.rethrowFromSystemServer(); + throw e.rethrowFromSystemServer(); } } /** - * Revoke default permissions to currently active telephony data services - * @param packageNames The package name for the services - * @param user The user handle - * @param executor The executor for the callback - * @param callback The callback provided by caller to be notified when revoke completes + * Sets the version of the runtime permission database. + * + * @param version The new version. + * * @hide */ - @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) - public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( - @NonNull String[] packageNames, @NonNull UserHandle user, - @NonNull @CallbackExecutor Executor executor, @NonNull Consumer<Boolean> callback) { + @SystemApi + @RequiresPermission(anyOf = { + Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, + Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS + }) + public void setRuntimePermissionsVersion(@IntRange(from = 0) int version) { try { - mPermissionManager.revokeDefaultPermissionsFromDisabledTelephonyDataServices( - packageNames, user.getIdentifier()); - executor.execute(() -> callback.accept(true)); + mPackageManager.setRuntimePermissionsVersion(version, mContext.getUserId()); } catch (RemoteException e) { - e.rethrowFromSystemServer(); + throw e.rethrowFromSystemServer(); } } /** - * Grant default permissions to currently enabled carrier apps - * @param packageNames Package names of the apps to be granted permissions - * @param user The user handle - * @param executor The executor for the callback - * @param callback The callback provided by caller to be notified when grant completes - * @hide + * Get set of permissions that have been split into more granular or dependent permissions. + * + * <p>E.g. before {@link android.os.Build.VERSION_CODES#Q} an app that was granted + * {@link Manifest.permission#ACCESS_COARSE_LOCATION} could access the location while it was in + * foreground and background. On platforms after {@link android.os.Build.VERSION_CODES#Q} + * the location permission only grants location access while the app is in foreground. This + * would break apps that target before {@link android.os.Build.VERSION_CODES#Q}. Hence whenever + * such an old app asks for a location permission (i.e. the + * {@link SplitPermissionInfo#getSplitPermission()}), then the + * {@link Manifest.permission#ACCESS_BACKGROUND_LOCATION} permission (inside + * {@link SplitPermissionInfo#getNewPermissions}) is added. + * + * <p>Note: Regular apps do not have to worry about this. The platform and permission controller + * automatically add the new permissions where needed. + * + * @return All permissions that are split. */ - @RequiresPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS) - public void grantDefaultPermissionsToEnabledCarrierApps(@NonNull String[] packageNames, - @NonNull UserHandle user, @NonNull @CallbackExecutor Executor executor, - @NonNull Consumer<Boolean> callback) { + public @NonNull List<SplitPermissionInfo> getSplitPermissions() { + if (mSplitPermissionInfos != null) { + return mSplitPermissionInfos; + } + + List<SplitPermissionInfoParcelable> parcelableList; try { - mPermissionManager.grantDefaultPermissionsToEnabledCarrierApps(packageNames, - user.getIdentifier()); - executor.execute(() -> callback.accept(true)); + parcelableList = ActivityThread.getPermissionManager().getSplitPermissions(); } catch (RemoteException e) { - e.rethrowFromSystemServer(); + Slog.e(LOG_TAG, "Error getting split permissions", e); + return Collections.emptyList(); } + + mSplitPermissionInfos = splitPermissionInfoListToNonParcelableList(parcelableList); + + return mSplitPermissionInfos; } /** @@ -530,12 +1060,8 @@ public final class PermissionManager { @SystemApi public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message, @Nullable String callingFeatureId, int pid, int uid) { - try { - return mPermissionManager.checkDeviceIdentifierAccess(packageName, message, - callingFeatureId, pid, uid); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + return mLegacyPermissionManager.checkDeviceIdentifierAccess(packageName, message, + callingFeatureId, pid, uid); } /* @hide */ @@ -547,10 +1073,11 @@ public final class PermissionManager { // permission this is. final int appId = UserHandle.getAppId(uid); if (appId == Process.ROOT_UID || appId == Process.SYSTEM_UID) { - Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " holds " + permission); + Slog.w(LOG_TAG, "Missing ActivityManager; assuming " + uid + " holds " + + permission); return PackageManager.PERMISSION_GRANTED; } - Slog.w(TAG, "Missing ActivityManager; assuming " + uid + " does not hold " + Slog.w(LOG_TAG, "Missing ActivityManager; assuming " + uid + " does not hold " + permission); return PackageManager.PERMISSION_DENIED; } @@ -730,4 +1257,35 @@ public final class PermissionManager { sPackageNamePermissionCache.disableLocal(); } + private final class OnPermissionsChangeListenerDelegate + extends IOnPermissionsChangeListener.Stub implements Handler.Callback{ + private static final int MSG_PERMISSIONS_CHANGED = 1; + + private final PackageManager.OnPermissionsChangedListener mListener; + private final Handler mHandler; + + public OnPermissionsChangeListenerDelegate( + PackageManager.OnPermissionsChangedListener listener, Looper looper) { + mListener = listener; + mHandler = new Handler(looper, this); + } + + @Override + public void onPermissionsChanged(int uid) { + mHandler.obtainMessage(MSG_PERMISSIONS_CHANGED, uid, 0).sendToTarget(); + } + + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MSG_PERMISSIONS_CHANGED: { + final int uid = msg.arg1; + mListener.onPermissionsChanged(uid); + return true; + } + default: + return false; + } + } + } } diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 27f753007201..daa17aaefa7f 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -7760,6 +7760,32 @@ public final class Settings { "minimal_post_processing_allowed"; /** + * No mode switching will happen. + * + * @see #MATCH_CONTENT_FRAME_RATE + * @hide + */ + public static final int MATCH_CONTENT_FRAMERATE_NEVER = 0; + + /** + * Allow only refresh rate switching between modes in the same configuration group. + * This way only switches without visual interruptions for the user will be allowed. + * + * @see #MATCH_CONTENT_FRAME_RATE + * @hide + */ + public static final int MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY = 1; + + /** + * Allow refresh rate switching between all refresh rates even if the switch will have + * visual interruptions for the user. + * + * @see #MATCH_CONTENT_FRAME_RATE + * @hide + */ + public static final int MATCH_CONTENT_FRAMERATE_ALWAYS = 2; + + /** * User's preference for refresh rate switching. * * <p>Values: @@ -7769,6 +7795,9 @@ public final class Settings { * for the user. * * @see android.view.Surface#setFrameRate + * @see #MATCH_CONTENT_FRAMERATE_NEVER + * @see #MATCH_CONTENT_FRAMERATE_SEAMLESSS_ONLY + * @see #MATCH_CONTENT_FRAMERATE_ALWAYS * @hide */ public static final String MATCH_CONTENT_FRAME_RATE = diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java index 6ef9e7e3d9b8..017f40521a81 100644 --- a/core/java/android/security/keymaster/KeymasterDefs.java +++ b/core/java/android/security/keymaster/KeymasterDefs.java @@ -16,18 +16,18 @@ package android.security.keymaster; -import android.hardware.keymint.Algorithm; -import android.hardware.keymint.BlockMode; -import android.hardware.keymint.Digest; -import android.hardware.keymint.ErrorCode; -import android.hardware.keymint.HardwareAuthenticatorType; -import android.hardware.keymint.KeyFormat; -import android.hardware.keymint.KeyOrigin; -import android.hardware.keymint.KeyPurpose; -import android.hardware.keymint.PaddingMode; -import android.hardware.keymint.SecurityLevel; -import android.hardware.keymint.Tag; -import android.hardware.keymint.TagType; +import android.hardware.security.keymint.Algorithm; +import android.hardware.security.keymint.BlockMode; +import android.hardware.security.keymint.Digest; +import android.hardware.security.keymint.ErrorCode; +import android.hardware.security.keymint.HardwareAuthenticatorType; +import android.hardware.security.keymint.KeyFormat; +import android.hardware.security.keymint.KeyOrigin; +import android.hardware.security.keymint.KeyPurpose; +import android.hardware.security.keymint.PaddingMode; +import android.hardware.security.keymint.SecurityLevel; +import android.hardware.security.keymint.Tag; +import android.hardware.security.keymint.TagType; import java.util.HashMap; import java.util.Map; diff --git a/core/java/android/service/textservice/OWNERS b/core/java/android/service/textservice/OWNERS index a637754ba17a..10b8b7637431 100644 --- a/core/java/android/service/textservice/OWNERS +++ b/core/java/android/service/textservice/OWNERS @@ -1,5 +1,3 @@ # Bug component: 34867 -ogunwale@google.com -roosa@google.com -yukawa@google.com +include ../../inputmethodservice/OWNERS
\ No newline at end of file diff --git a/core/java/android/telephony/OWNERS b/core/java/android/telephony/OWNERS new file mode 100644 index 000000000000..640baf2297b4 --- /dev/null +++ b/core/java/android/telephony/OWNERS @@ -0,0 +1 @@ +include /telephony/OWNERS diff --git a/core/java/android/util/ExceptionUtils.java b/core/java/android/util/ExceptionUtils.java index 1a397b39ef3c..4b511acc280f 100644 --- a/core/java/android/util/ExceptionUtils.java +++ b/core/java/android/util/ExceptionUtils.java @@ -98,4 +98,6 @@ public class ExceptionUtils { } return t; } + + }
\ No newline at end of file diff --git a/core/java/android/view/InsetsAnimationThreadControlRunner.java b/core/java/android/view/InsetsAnimationThreadControlRunner.java index 4a5fa0f971ae..0939336132a8 100644 --- a/core/java/android/view/InsetsAnimationThreadControlRunner.java +++ b/core/java/android/view/InsetsAnimationThreadControlRunner.java @@ -81,6 +81,7 @@ public class InsetsAnimationThreadControlRunner implements InsetsAnimationContro SyncRtSurfaceTransactionApplier.SurfaceParams surfaceParams = params[i]; applyParams(t, surfaceParams, mTmpFloat9); } + t.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId()); t.apply(); t.close(); } diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS index 4f82b86f260c..72fa4c39f1bc 100644 --- a/core/java/android/view/OWNERS +++ b/core/java/android/view/OWNERS @@ -8,19 +8,67 @@ nduca@google.com sumir@google.com ogunwale@google.com jjaggi@google.com +roosa@google.com # Display -per-file Display.java = michaelwr@google.com, santoscordon@google.com -per-file DisplayInfo.java = michaelwr@google.com, santoscordon@google.com +per-file Display*.java = file:/services/core/java/com/android/server/display/OWNERS +per-file Display*.aidl = file:/services/core/java/com/android/server/display/OWNERS # Haptics -per-file HapticFeedbackConstants.java = michaelwr@google.com, santoscordon@google.com +per-file HapticFeedbackConstants.java = file:/services/core/java/com/android/server/input/OWNERS + +# Ime +per-file Ime*.java = file:/core/java/android/view/inputmethod/OWNERS # Input -per-file IInputMonitorHost.aidl = michaelwr@google.com, svv@google.com -per-file Input*.java = michaelwr@google.com, svv@google.com -per-file Input*.aidl = michaelwr@google.com, svv@google.com -per-file KeyEvent.java = michaelwr@google.com, svv@google.com -per-file MotionEvent.java = michaelwr@google.com, svv@google.com -per-file PointerIcon.java = michaelwr@google.com, svv@google.com -per-file SimulatedDpad.java = michaelwr@google.com, svv@google.com +per-file IInput*.aidl = file:/services/core/java/com/android/server/input/OWNERS +per-file Input*.java = file:/services/core/java/com/android/server/input/OWNERS +per-file Input*.aidl = file:/services/core/java/com/android/server/input/OWNERS +per-file KeyEvent.java = file:/services/core/java/com/android/server/input/OWNERS +per-file MotionEvent.java = file:/services/core/java/com/android/server/input/OWNERS +per-file PointerIcon.java = file:/services/core/java/com/android/server/input/OWNERS +per-file SimulatedDpad.java = file:/services/core/java/com/android/server/input/OWNERS + +# InputWindowHandle +per-file InputWindowHandle.java = file:/services/core/java/com/android/server/input/OWNERS +per-file InputWindowHandle.java = file:/services/core/java/com/android/server/wm/OWNERS + +# Surface +per-file Surface.java = file:/graphics/java/android/graphics/OWNERS +per-file Surface.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file SurfaceView.java = file:/graphics/java/android/graphics/OWNERS +per-file SurfaceView.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file SurfaceHolder.java = file:/graphics/java/android/graphics/OWNERS +per-file SurfaceHolder.java = file:/services/core/java/com/android/server/wm/OWNERS + +# View +per-file View.java = file:/services/accessibility/OWNERS +per-file View.java = file:/core/java/android/service/autofill/OWNERS +per-file View.java = file:/graphics/java/android/graphics/OWNERS +per-file View.java = file:/services/core/java/com/android/server/input/OWNERS +per-file View.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file ViewRootImpl.java = file:/services/accessibility/OWNERS +per-file ViewRootImpl.java = file:/core/java/android/service/autofill/OWNERS +per-file ViewRootImpl.java = file:/graphics/java/android/graphics/OWNERS +per-file ViewRootImpl.java = file:/services/core/java/com/android/server/input/OWNERS +per-file ViewRootImpl.java = file:/services/core/java/com/android/server/wm/OWNERS + +# WindowManager +per-file DisplayCutout.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file DisplayCutout.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file IDisplay*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file Inset*.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file Inset*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file IPinnedStackListener.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file IRecents*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file IRemote*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file IWindow*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file RemoteAnimation*.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file RemoteAnimation*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file SurfaceControl*.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file SurfaceControl*.aidl = file:/services/core/java/com/android/server/wm/OWNERS +per-file SurfaceSession.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file SyncRtSurfaceTransactionApplier.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file ViewRootInsetsControllerHost.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file Window*.java = file:/services/core/java/com/android/server/wm/OWNERS +per-file Window*.aidl = file:/services/core/java/com/android/server/wm/OWNERS diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 607888c81357..15adc5a0ec2f 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -239,7 +239,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall private static boolean useBlastAdapter(Context context) { ContentResolver contentResolver = context.getContentResolver(); return Settings.Global.getInt(contentResolver, - Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV, 1 /* default */) == 1; + Settings.Global.DEVELOPMENT_USE_BLAST_ADAPTER_SV, 0 /* default */) == 1; } private final boolean mUseBlastAdapter; diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 13d9eb9d3c7d..af18293398da 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -16,7 +16,11 @@ package android.view; +import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS; +import static android.Manifest.permission.HIDE_OVERLAY_WINDOWS; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED; +import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import android.annotation.ColorInt; import android.annotation.DrawableRes; @@ -24,6 +28,7 @@ import android.annotation.IdRes; import android.annotation.LayoutRes; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; import android.annotation.StyleRes; import android.annotation.SystemApi; import android.annotation.TestApi; @@ -991,6 +996,26 @@ public abstract class Window { } /** + * Prevent non-system overlay windows from being drawn on top of this window. + * + * @param hide whether non-system overlay windows should be hidden. + */ + @RequiresPermission(HIDE_OVERLAY_WINDOWS) + public final void setHideOverlayWindows(boolean hide) { + // This permission check is here to throw early and let the developer know that they need + // to hold HIDE_OVERLAY_WINDOWS for the flag to have any effect. The WM verifies that the + // owner of the window has the permission before applying the flag, but this is done + // asynchronously. + if (mContext.checkSelfPermission(HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != PERMISSION_GRANTED + && mContext.checkSelfPermission(HIDE_OVERLAY_WINDOWS) != PERMISSION_GRANTED) { + throw new SecurityException( + "Permission denial: setHideOverlayWindows: HIDE_OVERLAY_WINDOWS"); + } + setPrivateFlags(hide ? SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS : 0, + SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS); + } + + /** * Take ownership of this window's surface. The window's view hierarchy * will no longer draw into the surface, though it will otherwise continue * to operate (such as for receiving input events). The given SurfaceHolder diff --git a/core/java/android/view/contentcapture/MainContentCaptureSession.java b/core/java/android/view/contentcapture/MainContentCaptureSession.java index 16fd383fa7ff..3c18b6b89af8 100644 --- a/core/java/android/view/contentcapture/MainContentCaptureSession.java +++ b/core/java/android/view/contentcapture/MainContentCaptureSession.java @@ -43,6 +43,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.IBinder.DeathRecipient; import android.os.RemoteException; +import android.text.TextUtils; import android.util.LocalLog; import android.util.Log; import android.util.TimeUtils; @@ -334,15 +335,22 @@ public final class MainContentCaptureSession extends ContentCaptureSession { if (!mEvents.isEmpty() && eventType == TYPE_VIEW_TEXT_CHANGED) { final ContentCaptureEvent lastEvent = mEvents.get(mEvents.size() - 1); - // TODO(b/121045053): check if flags match + // We merge two consecutive text change event, unless one of them clears the text. if (lastEvent.getType() == TYPE_VIEW_TEXT_CHANGED && lastEvent.getId().equals(event.getId())) { - if (sVerbose) { + boolean bothNonEmpty = !TextUtils.isEmpty(lastEvent.getText()) + && !TextUtils.isEmpty(event.getText()); + boolean equalContent = TextUtils.equals(lastEvent.getText(), event.getText()); + if (equalContent) { + addEvent = false; + } else if (bothNonEmpty) { + lastEvent.mergeEvent(event); + addEvent = false; + } + if (!addEvent && sVerbose) { Log.v(TAG, "Buffering VIEW_TEXT_CHANGED event, updated text=" + getSanitizedString(event.getText())); } - lastEvent.mergeEvent(event); - addEvent = false; } } diff --git a/core/java/android/view/textservice/OWNERS b/core/java/android/view/textservice/OWNERS index a637754ba17a..582be8dc4594 100644 --- a/core/java/android/view/textservice/OWNERS +++ b/core/java/android/view/textservice/OWNERS @@ -1,5 +1,3 @@ # Bug component: 34867 -ogunwale@google.com -roosa@google.com -yukawa@google.com +include ../inputmethod/OWNERS diff --git a/core/java/android/widget/OWNERS b/core/java/android/widget/OWNERS index fbb975b806f1..718076b49f77 100644 --- a/core/java/android/widget/OWNERS +++ b/core/java/android/widget/OWNERS @@ -7,3 +7,5 @@ aurimas@google.com siyamed@google.com per-file TextView.java, EditText.java, Editor.java = siyamed@google.com, nona@google.com, clarabayarri@google.com + +per-file SpellChecker.java = file:../view/inputmethod/OWNERS diff --git a/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl b/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl index fa5c30a03e78..cb280cd14180 100644 --- a/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl +++ b/core/java/com/android/internal/app/IAppOpsNotedCallback.aidl @@ -18,5 +18,5 @@ package com.android.internal.app; // Iterface to observe op note/checks of ops oneway interface IAppOpsNotedCallback { - void opNoted(int op, int uid, String packageName, int mode); + void opNoted(int op, int uid, String packageName, int flags, int mode); } diff --git a/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl index ed521e656981..b0cb2a8ceb64 100644 --- a/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl +++ b/core/java/com/android/internal/app/IAppOpsStartedCallback.aidl @@ -18,5 +18,5 @@ package com.android.internal.app; // Iterface to observe op starts oneway interface IAppOpsStartedCallback { - void opStarted(int op, int uid, String packageName, int mode); + void opStarted(int op, int uid, String packageName, int flags, int mode); } diff --git a/core/java/com/android/internal/app/OWNERS b/core/java/com/android/internal/app/OWNERS new file mode 100644 index 000000000000..108ab92f0e9b --- /dev/null +++ b/core/java/com/android/internal/app/OWNERS @@ -0,0 +1 @@ +per-file *AppOp* = file:/core/java/android/permission/OWNERS diff --git a/core/java/com/android/internal/notification/OWNERS b/core/java/com/android/internal/notification/OWNERS new file mode 100644 index 000000000000..396fd1213aca --- /dev/null +++ b/core/java/com/android/internal/notification/OWNERS @@ -0,0 +1 @@ +include /services/core/java/com/android/server/notification/OWNERS diff --git a/core/java/com/android/internal/os/OWNERS b/core/java/com/android/internal/os/OWNERS index ae962f244a1a..8f78b2a3a5ea 100644 --- a/core/java/com/android/internal/os/OWNERS +++ b/core/java/com/android/internal/os/OWNERS @@ -1,3 +1,4 @@ +per-file *Power* = file:/services/core/java/com/android/server/power/OWNERS per-file *Zygote* = file:/ZYGOTE_OWNERS # BatteryStats diff --git a/core/java/com/android/internal/telephony/OWNERS b/core/java/com/android/internal/telephony/OWNERS new file mode 100644 index 000000000000..640baf2297b4 --- /dev/null +++ b/core/java/com/android/internal/telephony/OWNERS @@ -0,0 +1 @@ +include /telephony/OWNERS diff --git a/core/java/com/android/internal/view/OWNERS b/core/java/com/android/internal/view/OWNERS new file mode 100644 index 000000000000..99a76861c542 --- /dev/null +++ b/core/java/com/android/internal/view/OWNERS @@ -0,0 +1,5 @@ +# Bug component: 25700 + +file:/core/java/android/view/OWNERS + +per-file *Input* = file:/services/core/java/com/android/server/inputmethod/OWNERS
\ No newline at end of file diff --git a/core/jni/OWNERS b/core/jni/OWNERS index bcd1278d87e7..804829801b29 100644 --- a/core/jni/OWNERS +++ b/core/jni/OWNERS @@ -6,15 +6,19 @@ per-file *Camera*,*camera* = shuzhenwang@google.com, yinchiayeh@google.com, zhij per-file android_net_* = codewiz@google.com, jchalard@google.com, lorenzo@google.com, reminv@google.com, satk@google.com # Display -per-file android_hardware_display_* = michaelwr@google.com, santoscordon@google.com +per-file android_hardware_display_* = file:/services/core/java/com/android/server/display/OWNERS # Input -per-file android_hardware_input* = michaelwr@google.com, svv@google.com -per-file android_view_Input* = michaelwr@google.com, svv@google.com -per-file android_view_KeyCharacterMap.* = michaelwr@google.com, svv@google.com -per-file android_view_*KeyEvent.* = michaelwr@google.com, svv@google.com -per-file android_view_*MotionEvent.* = michaelwr@google.com, svv@google.com -per-file android_view_PointerIcon.* = michaelwr@google.com, svv@google.com +per-file android_hardware_input* = file:/services/core/java/com/android/server/input/OWNERS +per-file android_view_Input* = file:/services/core/java/com/android/server/input/OWNERS +per-file android_view_KeyCharacterMap.* = file:/services/core/java/com/android/server/input/OWNERS +per-file android_view_*KeyEvent.* = file:/services/core/java/com/android/server/input/OWNERS +per-file android_view_*MotionEvent.* = file:/services/core/java/com/android/server/input/OWNERS +per-file android_view_PointerIcon.* = file:/services/core/java/com/android/server/input/OWNERS + +# WindowManager +per-file android_graphics_BLASTBufferQueue.cpp = file:/services/core/java/com/android/server/wm/OWNERS +per-file android_view_Surface* = file:/services/core/java/com/android/server/wm/OWNERS per-file *Zygote* = file:/ZYGOTE_OWNERS per-file Android.bp = file:platform/build/soong:/OWNERS diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index c8aedfb8a835..ef7edc2f2dd2 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2732,6 +2732,10 @@ <permission android:name="android.permission.TOGGLE_AUTOMOTIVE_PROJECTION" android:protectionLevel="signature|privileged" /> + <!-- Allows an app to prevent non-system-overlay windows from being drawn on top of it --> + <permission android:name="android.permission.HIDE_OVERLAY_WINDOWS" + android:protectionLevel="normal" /> + <!-- ================================== --> <!-- Permissions affecting the system wallpaper --> <!-- ================================== --> @@ -3286,6 +3290,7 @@ {@link android.view.WindowManager.LayoutsParams#SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS} to hide non-system-overlay windows. <p>Not for use by third-party applications. + @deprecated Use {@link android.Manifest.permission#HIDE_OVERLAY_WINDOWS} instead @hide --> <permission android:name="android.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS" @@ -3964,6 +3969,12 @@ <permission android:name="android.permission.MANAGE_COMPANION_DEVICES" android:protectionLevel="signature" /> + <!-- Allows an application to subscribe to notifications about the presence status change + of their associated companion device + --> + <permission android:name="android.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE" + android:protectionLevel="normal" /> + <!-- @SystemApi Allows an application to use SurfaceFlinger's low level features. <p>Not for use by third-party applications. @hide diff --git a/core/res/res/drawable-car/car_button_background.xml b/core/res/res/drawable-car/car_button_background.xml index 3e2610c5047b..e568aebfe81d 100644 --- a/core/res/res/drawable-car/car_button_background.xml +++ b/core/res/res/drawable-car/car_button_background.xml @@ -13,24 +13,48 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> -<!-- Default background styles for car buttons when enabled/disabled. --> -<ripple - xmlns:android="http://schemas.android.com/apk/res/android" - android:color="?android:attr/colorControlHighlight"> +<!-- Default background styles for car buttons when enabled/disabled, + focused/unfocused, and pressed/unpressed --> +<!-- TODO(b/175161842) Add rotary fill color --> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_focused="true" android:state_enabled="false"> + <shape android:shape="rectangle"> + <corners android:radius="@*android:dimen/car_button_radius"/> + <solid android:color="@*android:color/car_grey_300"/> + <stroke android:width="8dp" + android:color="#0059B3"/> + </shape> + </item> + <item android:state_focused="true" android:state_pressed="true"> + <shape android:shape="rectangle"> + <corners android:radius="@*android:dimen/car_button_radius"/> + <solid android:color="?android:attr/colorButtonNormal"/> + <stroke android:width="4dp" + android:color="#0059B3"/> + </shape> + </item> + <item android:state_focused="true"> + <shape android:shape="rectangle"> + <corners android:radius="@*android:dimen/car_button_radius"/> + <solid android:color="?android:attr/colorButtonNormal"/> + <stroke android:width="8dp" + android:color="#0059B3"/> + </shape> + </item> + <item android:state_enabled="false"> + <shape android:shape="rectangle"> + <corners android:radius="@*android:dimen/car_button_radius"/> + <solid android:color="@*android:color/car_grey_300"/> + </shape> + </item> <item> - <selector> - <item android:state_enabled="false"> - <shape android:shape="rectangle"> - <corners android:radius="@*android:dimen/car_button_radius"/> - <solid android:color="@*android:color/car_grey_300"/> - </shape> - </item> + <ripple android:color="?android:attr/colorControlHighlight"> <item> <shape android:shape="rectangle"> <corners android:radius="@*android:dimen/car_button_radius"/> <solid android:color="?android:attr/colorButtonNormal"/> </shape> </item> - </selector> + </ripple> </item> -</ripple> +</selector> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 03ba83c6bd2e..cddb8b5802d0 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -4574,6 +4574,6 @@ <!-- Indicates that default fitness tracker app needs to request sensor and location permissions. --> <bool name="config_trackerAppNeedsPermissions">false</bool> - <!-- Component with platform query permissions for AppSearch --> - <string name="config_defaultAppSearchPlatformQuerierComponent" translatable="false"></string> + <!-- Package with global data query permissions for AppSearch --> + <string name="config_globalAppSearchDataQuerierPackage" translatable="false"></string> </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index aff0695bb14e..a2556a112941 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -4116,8 +4116,8 @@ <java-symbol type="bool" name="config_trackerAppNeedsPermissions"/> - <!-- Component with platform query permissions for AppSearch --> - <java-symbol type="string" name="config_defaultAppSearchPlatformQuerierComponent" /> + <!-- Package with global data query permissions for AppSearch --> + <java-symbol type="string" name="config_globalAppSearchDataQuerierPackage" /> <!-- Color used by the accessibility focus rectangle --> <java-symbol type="color" name="accessibility_focus_highlight_color" /> diff --git a/core/tests/powertests/PowerStatsLoadTests/Android.bp b/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp index 66c91adc6540..ade97b81e775 100644 --- a/core/tests/powertests/PowerStatsLoadTests/Android.bp +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/Android.bp @@ -1,5 +1,5 @@ android_test { - name: "PowerStatsLoadTests", + name: "BatteryStatsLoadTests", srcs: ["src/**/*.java"], static_libs: [ "androidx.test.rules", diff --git a/core/tests/powertests/PowerStatsLoadTests/AndroidManifest.xml b/core/tests/batterystatstests/BatteryStatsLoadTests/AndroidManifest.xml index 9cecaedf1380..adc20c6ae496 100644 --- a/core/tests/powertests/PowerStatsLoadTests/AndroidManifest.xml +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/AndroidManifest.xml @@ -16,7 +16,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.frameworks.core.powerstatsloadtests"> + package="com.android.frameworks.core.batterystatsloadtests"> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> @@ -27,7 +27,7 @@ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner" - android:targetPackage="com.android.frameworks.core.powerstatsloadtests" + android:targetPackage="com.android.frameworks.core.batterystatsloadtests" android:label="Power Stats Load Tests" /> <queries> diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/ConnectivitySetupRule.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java index ca2942647f08..1afc22b7406d 100644 --- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/ConnectivitySetupRule.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/ConnectivitySetupRule.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsloadtests; +package com.android.frameworks.core.batterystatsloadtests; import static org.junit.Assert.assertEquals; diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetrics.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java index 88cb719add60..dbe5773a3107 100644 --- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetrics.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetrics.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsloadtests; +package com.android.frameworks.core.batterystatsloadtests; import android.os.Process; diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetricsCollector.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java index a71559b5ad6b..254458cc8935 100644 --- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/PowerMetricsCollector.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/PowerMetricsCollector.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsloadtests; +package com.android.frameworks.core.batterystatsloadtests; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -106,6 +106,7 @@ public class PowerMetricsCollector implements TestRule { mContext = instrumentation.getContext(); mUid = Process.myUid(); mUserManager = mContext.getSystemService(UserManager.class); + // TODO(b/175324611): Use BatteryUsageStats instead mStatsHelper = new BatteryStatsHelper(mContext, false /* collectBatteryBroadcast */); mStatsHelper.create((Bundle) null); } diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/SystemServiceCallLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java index 911ccba3ac78..488469d54f29 100644 --- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/SystemServiceCallLoadTest.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/SystemServiceCallLoadTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsloadtests; +package com.android.frameworks.core.batterystatsloadtests; import static org.junit.Assert.assertNotNull; diff --git a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/WiFiLoadTest.java b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java index 90627192946d..27495da8d839 100644 --- a/core/tests/powertests/PowerStatsLoadTests/src/com/android/frameworks/core/powerstatsloadtests/WiFiLoadTest.java +++ b/core/tests/batterystatstests/BatteryStatsLoadTests/src/com/android/frameworks/core/batterystatsloadtests/WiFiLoadTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsloadtests; +package com.android.frameworks.core.batterystatsloadtests; import android.util.Log; diff --git a/core/tests/powertests/PowerStatsViewer/Android.bp b/core/tests/batterystatstests/BatteryStatsViewer/Android.bp index a3dc4fb4ff74..1e0498be5800 100644 --- a/core/tests/powertests/PowerStatsViewer/Android.bp +++ b/core/tests/batterystatstests/BatteryStatsViewer/Android.bp @@ -1,5 +1,5 @@ android_test { - name: "PowerStatsViewer", + name: "BatteryStatsViewer", srcs: ["src/**/*.java"], defaults: ["SettingsLibDefaults"], static_libs: [ diff --git a/core/tests/powertests/PowerStatsViewer/AndroidManifest.xml b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml index 28ea05fca61e..edb1b108b7bc 100644 --- a/core/tests/powertests/PowerStatsViewer/AndroidManifest.xml +++ b/core/tests/batterystatstests/BatteryStatsViewer/AndroidManifest.xml @@ -16,7 +16,7 @@ --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" - package="com.android.frameworks.core.powerstatsviewer" + package="com.android.frameworks.core.batterystatsviewer" android:sharedUserId="android.uid.system"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> @@ -24,9 +24,9 @@ <application android:theme="@style/Theme" - android:label="Power Stats Viewer"> - <activity android:name=".PowerStatsViewerActivity" - android:label="Power Stats Viewer" + android:label="Battery Stats Viewer"> + <activity android:name=".BatteryStatsViewerActivity" + android:label="Battery Stats Viewer" android:launchMode="singleTop" android:exported="true"> <intent-filter> @@ -35,7 +35,7 @@ </intent-filter> </activity> - <activity android:name=".PowerConsumerPickerActivity" - android:label="Select a power consumer"/> + <activity android:name=".BatteryConsumerPickerActivity" + android:label="Select a battery consumer"/> </application> </manifest> diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_entry_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_entry_layout.xml index 1ced825adf31..1ced825adf31 100644 --- a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_entry_layout.xml +++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_entry_layout.xml diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_info_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_info_layout.xml index fbd0ebd61bc7..fbd0ebd61bc7 100644 --- a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_info_layout.xml +++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_info_layout.xml diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_activity_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_activity_layout.xml index ecc89f0cb33e..ecc89f0cb33e 100644 --- a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_activity_layout.xml +++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_activity_layout.xml diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml index bea38c18c20b..bea38c18c20b 100644 --- a/core/tests/powertests/PowerStatsViewer/res/layout/power_consumer_picker_layout.xml +++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_consumer_picker_layout.xml diff --git a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_viewer_layout.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml index 238e238deeaa..e58a08fd362c 100644 --- a/core/tests/powertests/PowerStatsViewer/res/layout/power_stats_viewer_layout.xml +++ b/core/tests/batterystatstests/BatteryStatsViewer/res/layout/battery_stats_viewer_layout.xml @@ -42,13 +42,13 @@ android:paddingStart="10dp" android:paddingEnd="10dp"> - <include layout="@layout/power_consumer_info_layout"/> + <include layout="@layout/battery_consumer_info_layout"/> </LinearLayout> </androidx.cardview.widget.CardView> <androidx.recyclerview.widget.RecyclerView - android:id="@+id/power_stats_data_view" + android:id="@+id/battery_consumer_data_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> @@ -59,7 +59,7 @@ android:layout_height="match_parent" android:gravity="center" android:visibility="gone" - android:text="No power stats available"/> + android:text="No battery stats available"/> </LinearLayout> <FrameLayout diff --git a/core/tests/powertests/PowerStatsViewer/res/values/styles.xml b/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml index 629d729e7b9a..629d729e7b9a 100644 --- a/core/tests/powertests/PowerStatsViewer/res/values/styles.xml +++ b/core/tests/batterystatstests/BatteryStatsViewer/res/values/styles.xml diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java index 6d8e2c59be97..b077ea313b9d 100644 --- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsData.java +++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerData.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsviewer; +package com.android.frameworks.core.batterystatsviewer; import android.content.Context; import android.os.BatteryConsumer; @@ -30,7 +30,7 @@ import com.android.internal.os.BatteryStatsHelper; import java.util.ArrayList; import java.util.List; -public class PowerStatsData { +public class BatteryConsumerData { private static final String PACKAGE_CALENDAR_PROVIDER = "com.android.providers.calendar"; private static final String PACKAGE_MEDIA_PROVIDER = "com.android.providers.media"; private static final String PACKAGE_SYSTEMUI = "com.android.systemui"; @@ -58,11 +58,11 @@ public class PowerStatsData { public double total; } - private final PowerConsumerInfoHelper.PowerConsumerInfo mPowerConsumerInfo; + private final BatteryConsumerInfoHelper.BatteryConsumerInfo mBatteryConsumerInfo; private final List<Entry> mEntries = new ArrayList<>(); - public PowerStatsData(Context context, BatteryStatsHelper batteryStatsHelper, - BatteryUsageStats batteryUsageStats, String powerConsumerId) { + public BatteryConsumerData(Context context, BatteryStatsHelper batteryStatsHelper, + BatteryUsageStats batteryUsageStats, String batteryConsumerId) { List<BatterySipper> usageList = batteryStatsHelper.getUsageList(); BatteryStats batteryStats = batteryStatsHelper.getStats(); @@ -102,7 +102,7 @@ public class PowerStatsData { totalScreenPower = sipper.sumPower(); } - if (powerConsumerId(sipper).equals(powerConsumerId)) { + if (batteryConsumerId(sipper).equals(batteryConsumerId)) { requestedBatterySipper = sipper; } @@ -143,21 +143,20 @@ public class PowerStatsData { BatteryConsumer requestedBatteryConsumer = null; for (BatteryConsumer consumer : batteryUsageStats.getUidBatteryConsumers()) { - if (powerConsumerId(consumer).equals(powerConsumerId)) { + if (batteryConsumerId(consumer).equals(batteryConsumerId)) { requestedBatteryConsumer = consumer; break; } } if (requestedBatterySipper == null) { - mPowerConsumerInfo = null; + mBatteryConsumerInfo = null; return; } - long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy(); - - mPowerConsumerInfo = PowerConsumerInfoHelper.makePowerConsumerInfo( + mBatteryConsumerInfo = BatteryConsumerInfoHelper.makeBatteryConsumerInfo( context.getPackageManager(), requestedBatterySipper); + long totalScreenMeasuredEnergyUJ = batteryStats.getScreenOnEnergy(); addEntry("Total power", EntryType.POWER, requestedBatterySipper.totalSmearedPowerMah, totalSmearedPowerMah); @@ -279,19 +278,19 @@ public class PowerStatsData { } } - public PowerConsumerInfoHelper.PowerConsumerInfo getPowerConsumerInfo() { - return mPowerConsumerInfo; + public BatteryConsumerInfoHelper.BatteryConsumerInfo getBatteryConsumerInfo() { + return mBatteryConsumerInfo; } public List<Entry> getEntries() { return mEntries; } - public static String powerConsumerId(BatterySipper sipper) { + public static String batteryConsumerId(BatterySipper sipper) { return sipper.drainType + "|" + sipper.userId + "|" + sipper.getUid(); } - public static String powerConsumerId(BatteryConsumer consumer) { + public static String batteryConsumerId(BatteryConsumer consumer) { if (consumer instanceof UidBatteryConsumer) { return BatterySipper.DrainType.APP + "|" + UserHandle.getUserId(((UidBatteryConsumer) consumer).getUid()) + "|" diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerInfoHelper.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerInfoHelper.java index 6fec2405b0c6..8ee6c604cb3e 100644 --- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerInfoHelper.java +++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerInfoHelper.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsviewer; +package com.android.frameworks.core.batterystatsviewer; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -26,11 +26,11 @@ import com.android.internal.os.BatterySipper; import java.util.Locale; -class PowerConsumerInfoHelper { +class BatteryConsumerInfoHelper { private static final String SYSTEM_SERVER_PACKAGE_NAME = "android"; - public static class PowerConsumerInfo { + public static class BatteryConsumerInfo { public String id; public CharSequence label; public double powerMah; @@ -40,10 +40,10 @@ class PowerConsumerInfoHelper { } @NonNull - public static PowerConsumerInfo makePowerConsumerInfo(PackageManager packageManager, + public static BatteryConsumerInfo makeBatteryConsumerInfo(PackageManager packageManager, @NonNull BatterySipper sipper) { - PowerConsumerInfo info = new PowerConsumerInfo(); - info.id = PowerStatsData.powerConsumerId(sipper); + BatteryConsumerInfo info = new BatteryConsumerInfo(); + info.id = BatteryConsumerData.batteryConsumerId(sipper); sipper.sumPower(); info.powerMah = sipper.totalSmearedPowerMah; switch (sipper.drainType) { diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerActivity.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java index f56d113980c8..2db848b084a6 100644 --- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerActivity.java +++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerActivity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsviewer; +package com.android.frameworks.core.batterystatsviewer; import android.content.Context; import android.content.Intent; @@ -34,14 +34,14 @@ import com.google.android.material.tabs.TabLayout; * Picker, showing a sorted lists of applications and other types of entities consuming power. * Returns the selected entity ID or null. */ -public class PowerConsumerPickerActivity extends FragmentActivity { +public class BatteryConsumerPickerActivity extends FragmentActivity { public static final ActivityResultContract<Void, String> CONTRACT = new ActivityResultContract<Void, String>() { @NonNull @Override public Intent createIntent(@NonNull Context context, Void aVoid) { - return new Intent(context, PowerConsumerPickerActivity.class); + return new Intent(context, BatteryConsumerPickerActivity.class); } @Override @@ -58,7 +58,7 @@ public class PowerConsumerPickerActivity extends FragmentActivity { super.onCreate(icicle); getActionBar().setDisplayHomeAsUpEnabled(true); - setContentView(R.layout.power_consumer_picker_activity_layout); + setContentView(R.layout.battery_consumer_picker_activity_layout); ViewPager viewPager = findViewById(R.id.pager); @@ -75,12 +75,12 @@ public class PowerConsumerPickerActivity extends FragmentActivity { public Fragment getItem(int position) { switch (position) { case 0: - return new PowerConsumerPickerFragment( - PowerConsumerPickerFragment.PICKER_TYPE_APP); + return new BatteryConsumerPickerFragment( + BatteryConsumerPickerFragment.PICKER_TYPE_APP); case 1: default: - return new PowerConsumerPickerFragment( - PowerConsumerPickerFragment.PICKER_TYPE_DRAIN); + return new BatteryConsumerPickerFragment( + BatteryConsumerPickerFragment.PICKER_TYPE_DRAIN); } } @@ -101,9 +101,9 @@ public class PowerConsumerPickerActivity extends FragmentActivity { tabLayout.setupWithViewPager(viewPager); } - public void setSelectedPowerConsumer(String id) { + public void setSelectedBatteryConsumer(String batteryConsumerId) { Intent intent = new Intent(); - intent.putExtra(Intent.EXTRA_RETURN_RESULT, id); + intent.putExtra(Intent.EXTRA_RETURN_RESULT, batteryConsumerId); setResult(RESULT_OK, intent); finish(); } diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerFragment.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerFragment.java index 25225b87f602..bb11fd598511 100644 --- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerConsumerPickerFragment.java +++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryConsumerPickerFragment.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsviewer; +package com.android.frameworks.core.batterystatsviewer; import android.content.Context; import android.content.pm.PackageManager; @@ -36,7 +36,7 @@ import androidx.loader.content.Loader; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import com.android.frameworks.core.powerstatsviewer.PowerConsumerInfoHelper.PowerConsumerInfo; +import com.android.frameworks.core.batterystatsviewer.BatteryConsumerInfoHelper.BatteryConsumerInfo; import com.android.internal.os.BatterySipper; import com.android.internal.os.BatteryStatsHelper; import com.android.settingslib.utils.AsyncLoaderCompat; @@ -50,7 +50,7 @@ import java.util.Locale; * Picker, showing a sorted lists of applications or other types of entities consuming power. * Returns the selected entity ID or null. */ -public class PowerConsumerPickerFragment extends Fragment { +public class BatteryConsumerPickerFragment extends Fragment { private static final String TAG = "AppPicker"; public static final String PICKER_TYPE = "pickertype"; @@ -58,53 +58,53 @@ public class PowerConsumerPickerFragment extends Fragment { public static final int PICKER_TYPE_APP = 0; public static final int PICKER_TYPE_DRAIN = 1; - private PowerConsumerListAdapter mPowerConsumerListAdapter; + private BatteryConsumerListAdapter mBatteryConsumerListAdapter; private RecyclerView mAppList; private View mLoadingView; - private interface OnPowerConsumerSelectedListener { - void onPowerConsumerSelected(String uid); + private interface OnBatteryConsumerSelectedListener { + void onBatteryConsumerSelected(String batteryConsumerId); } - public PowerConsumerPickerFragment(int pickerType) { + public BatteryConsumerPickerFragment(int pickerType) { Bundle args = new Bundle(); args.putInt(PICKER_TYPE, pickerType); setArguments(args); } - public PowerConsumerPickerFragment() { + public BatteryConsumerPickerFragment() { } @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.power_consumer_picker_layout, container, false); + View view = inflater.inflate(R.layout.battery_consumer_picker_layout, container, false); mLoadingView = view.findViewById(R.id.loading_view); mAppList = view.findViewById(R.id.list_view); mAppList.setLayoutManager(new LinearLayoutManager(getContext())); - mPowerConsumerListAdapter = new PowerConsumerListAdapter( - PowerConsumerPickerFragment.this::setSelectedPowerConsumer); - mAppList.setAdapter(mPowerConsumerListAdapter); + mBatteryConsumerListAdapter = new BatteryConsumerListAdapter( + BatteryConsumerPickerFragment.this::setSelectedBatteryConsumer); + mAppList.setAdapter(mBatteryConsumerListAdapter); LoaderManager.getInstance(this).initLoader(0, getArguments(), - new PowerConsumerListLoaderCallbacks()); + new BatteryConsumerListLoaderCallbacks()); return view; } - public void setSelectedPowerConsumer(String id) { - ((PowerConsumerPickerActivity) getActivity()).setSelectedPowerConsumer(id); + public void setSelectedBatteryConsumer(String id) { + ((BatteryConsumerPickerActivity) getActivity()).setSelectedBatteryConsumer(id); } - private static class PowerConsumerListLoader extends - AsyncLoaderCompat<List<PowerConsumerInfo>> { + private static class BatteryConsumerListLoader extends + AsyncLoaderCompat<List<BatteryConsumerInfo>> { private final BatteryStatsHelper mStatsHelper; private final int mPickerType; private final UserManager mUserManager; private final PackageManager mPackageManager; - PowerConsumerListLoader(Context context, int pickerType) { + BatteryConsumerListLoader(Context context, int pickerType) { super(context); mUserManager = context.getSystemService(UserManager.class); mStatsHelper = new BatteryStatsHelper(context, false /* collectBatteryBroadcast */); @@ -115,8 +115,8 @@ public class PowerConsumerPickerFragment extends Fragment { } @Override - public List<PowerConsumerInfo> loadInBackground() { - List<PowerConsumerInfoHelper.PowerConsumerInfo> powerConsumerList = new ArrayList<>(); + public List<BatteryConsumerInfo> loadInBackground() { + List<BatteryConsumerInfo> batteryConsumerList = new ArrayList<>(); mStatsHelper.refreshStats(BatteryStats.STATS_SINCE_CHARGED, UserHandle.myUserId()); @@ -135,74 +135,75 @@ public class PowerConsumerPickerFragment extends Fragment { } } - powerConsumerList.add( - PowerConsumerInfoHelper.makePowerConsumerInfo(mPackageManager, sipper)); + batteryConsumerList.add( + BatteryConsumerInfoHelper.makeBatteryConsumerInfo(mPackageManager, sipper)); } - powerConsumerList.sort( - Comparator.comparing((PowerConsumerInfo a) -> a.powerMah).reversed()); - return powerConsumerList; + batteryConsumerList.sort( + Comparator.comparing((BatteryConsumerInfo a) -> a.powerMah).reversed()); + return batteryConsumerList; } @Override - protected void onDiscardResult(List<PowerConsumerInfo> result) { + protected void onDiscardResult(List<BatteryConsumerInfo> result) { } } - private class PowerConsumerListLoaderCallbacks implements - LoaderManager.LoaderCallbacks<List<PowerConsumerInfo>> { + private class BatteryConsumerListLoaderCallbacks implements + LoaderManager.LoaderCallbacks<List<BatteryConsumerInfo>> { @NonNull @Override - public Loader<List<PowerConsumerInfo>> onCreateLoader(int id, Bundle args) { - return new PowerConsumerListLoader(getContext(), args.getInt(PICKER_TYPE)); + public Loader<List<BatteryConsumerInfo>> onCreateLoader(int id, Bundle args) { + return new BatteryConsumerListLoader(getContext(), args.getInt(PICKER_TYPE)); } @Override - public void onLoadFinished(@NonNull Loader<List<PowerConsumerInfo>> loader, - List<PowerConsumerInfoHelper.PowerConsumerInfo> powerConsumerList) { - mPowerConsumerListAdapter.setPowerConsumerList(powerConsumerList); + public void onLoadFinished(@NonNull Loader<List<BatteryConsumerInfo>> loader, + List<BatteryConsumerInfo> batteryConsumerList) { + mBatteryConsumerListAdapter.setBatteryConsumerList(batteryConsumerList); mAppList.setVisibility(View.VISIBLE); mLoadingView.setVisibility(View.GONE); } @Override public void onLoaderReset( - @NonNull Loader<List<PowerConsumerInfoHelper.PowerConsumerInfo>> loader) { + @NonNull Loader<List<BatteryConsumerInfo>> loader) { } } - public class PowerConsumerListAdapter extends RecyclerView.Adapter<PowerConsumerViewHolder> { - private final OnPowerConsumerSelectedListener mListener; - private List<PowerConsumerInfo> mPowerConsumerList; + public class BatteryConsumerListAdapter extends + RecyclerView.Adapter<BatteryConsumerViewHolder> { + private final OnBatteryConsumerSelectedListener mListener; + private List<BatteryConsumerInfo> mBatteryConsumerList; - public PowerConsumerListAdapter(OnPowerConsumerSelectedListener listener) { + public BatteryConsumerListAdapter(OnBatteryConsumerSelectedListener listener) { mListener = listener; } - void setPowerConsumerList(List<PowerConsumerInfo> powerConsumerList) { - mPowerConsumerList = powerConsumerList; + void setBatteryConsumerList(List<BatteryConsumerInfo> batteryConsumerList) { + mBatteryConsumerList = batteryConsumerList; notifyDataSetChanged(); } @Override public int getItemCount() { - return mPowerConsumerList.size(); + return mBatteryConsumerList.size(); } @NonNull @Override - public PowerConsumerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, + public BatteryConsumerViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) { LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext()); - View view = layoutInflater.inflate(R.layout.power_consumer_info_layout, viewGroup, + View view = layoutInflater.inflate(R.layout.battery_consumer_info_layout, viewGroup, false); - return new PowerConsumerViewHolder(view, mListener); + return new BatteryConsumerViewHolder(view, mListener); } @Override - public void onBindViewHolder(@NonNull PowerConsumerViewHolder viewHolder, int position) { - PowerConsumerInfoHelper.PowerConsumerInfo item = mPowerConsumerList.get(position); + public void onBindViewHolder(@NonNull BatteryConsumerViewHolder viewHolder, int position) { + BatteryConsumerInfo item = mBatteryConsumerList.get(position); viewHolder.id = item.id; viewHolder.titleView.setText(item.label); if (item.details != null) { @@ -225,9 +226,9 @@ public class PowerConsumerPickerFragment extends Fragment { } // View Holder used when displaying apps - public static class PowerConsumerViewHolder extends RecyclerView.ViewHolder + public static class BatteryConsumerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - private final OnPowerConsumerSelectedListener mListener; + private final OnBatteryConsumerSelectedListener mListener; public String id; public TextView titleView; @@ -236,7 +237,7 @@ public class PowerConsumerPickerFragment extends Fragment { public TextView packagesView; public TextView powerView; - PowerConsumerViewHolder(View view, OnPowerConsumerSelectedListener listener) { + BatteryConsumerViewHolder(View view, OnBatteryConsumerSelectedListener listener) { super(view); mListener = listener; view.setOnClickListener(this); @@ -250,7 +251,7 @@ public class PowerConsumerPickerFragment extends Fragment { @Override public void onClick(View v) { - mListener.onPowerConsumerSelected(id); + mListener.onBatteryConsumerSelected(id); } } } diff --git a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java index 91533913e35d..4978010f8591 100644 --- a/core/tests/powertests/PowerStatsViewer/src/com/android/frameworks/core/powerstatsviewer/PowerStatsViewerActivity.java +++ b/core/tests/batterystatstests/BatteryStatsViewer/src/com/android/frameworks/core/batterystatsviewer/BatteryStatsViewerActivity.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.frameworks.core.powerstatsviewer; +package com.android.frameworks.core.batterystatsviewer; import android.content.Context; import android.content.SharedPreferences; @@ -47,25 +47,25 @@ import java.util.Collections; import java.util.List; import java.util.Locale; -public class PowerStatsViewerActivity extends ComponentActivity { - private static final int POWER_STATS_REFRESH_RATE_MILLIS = 60 * 1000; - public static final String PREF_SELECTED_POWER_CONSUMER = "powerConsumerId"; +public class BatteryStatsViewerActivity extends ComponentActivity { + private static final int BATTERY_STATS_REFRESH_RATE_MILLIS = 60 * 1000; + public static final String PREF_SELECTED_BATTERY_CONSUMER = "batteryConsumerId"; public static final int LOADER_BATTERY_STATS_HELPER = 0; public static final int LOADER_BATTERY_USAGE_STATS = 1; - private PowerStatsDataAdapter mPowerStatsDataAdapter; - private Runnable mPowerStatsRefresh = this::periodicPowerStatsRefresh; + private BatteryStatsDataAdapter mBatteryStatsDataAdapter; + private Runnable mBatteryStatsRefresh = this::periodicBatteryStatsRefresh; private SharedPreferences mSharedPref; - private String mPowerConsumerId; + private String mBatteryConsumerId; private TextView mTitleView; private TextView mDetailsView; private ImageView mIconView; private TextView mPackagesView; - private RecyclerView mPowerStatsDataView; + private RecyclerView mBatteryConsumerDataView; private View mLoadingView; private View mEmptyView; private ActivityResultLauncher<Void> mStartAppPicker = registerForActivityResult( - PowerConsumerPickerActivity.CONTRACT, this::onApplicationSelected); + BatteryConsumerPickerActivity.CONTRACT, this::onApplicationSelected); private BatteryStatsHelper mBatteryStatsHelper; private BatteryUsageStats mBatteryUsageStats; @@ -75,7 +75,7 @@ public class PowerStatsViewerActivity extends ComponentActivity { mSharedPref = getPreferences(Context.MODE_PRIVATE); - setContentView(R.layout.power_stats_viewer_layout); + setContentView(R.layout.battery_stats_viewer_layout); View appCard = findViewById(R.id.app_card); appCard.setOnClickListener((e) -> startAppPicker()); @@ -85,17 +85,17 @@ public class PowerStatsViewerActivity extends ComponentActivity { mIconView = findViewById(android.R.id.icon); mPackagesView = findViewById(R.id.packages); - mPowerStatsDataView = findViewById(R.id.power_stats_data_view); - mPowerStatsDataView.setLayoutManager(new LinearLayoutManager(this)); - mPowerStatsDataAdapter = new PowerStatsDataAdapter(); - mPowerStatsDataView.setAdapter(mPowerStatsDataAdapter); + mBatteryConsumerDataView = findViewById(R.id.battery_consumer_data_view); + mBatteryConsumerDataView.setLayoutManager(new LinearLayoutManager(this)); + mBatteryStatsDataAdapter = new BatteryStatsDataAdapter(); + mBatteryConsumerDataView.setAdapter(mBatteryStatsDataAdapter); mLoadingView = findViewById(R.id.loading_view); mEmptyView = findViewById(R.id.empty_view); - mPowerConsumerId = mSharedPref.getString(PREF_SELECTED_POWER_CONSUMER, null); - loadPowerStats(); - if (mPowerConsumerId == null) { + mBatteryConsumerId = mSharedPref.getString(PREF_SELECTED_BATTERY_CONSUMER, null); + loadBatteryStats(); + if (mBatteryConsumerId == null) { startAppPicker(); } } @@ -103,38 +103,40 @@ public class PowerStatsViewerActivity extends ComponentActivity { @Override protected void onResume() { super.onResume(); - periodicPowerStatsRefresh(); + periodicBatteryStatsRefresh(); } @Override protected void onPause() { super.onPause(); - getMainThreadHandler().removeCallbacks(mPowerStatsRefresh); + getMainThreadHandler().removeCallbacks(mBatteryStatsRefresh); } private void startAppPicker() { mStartAppPicker.launch(null); } - private void onApplicationSelected(String powerConsumerId) { - if (powerConsumerId == null) { - if (mPowerConsumerId == null) { + private void onApplicationSelected(String batteryConsumerId) { + if (batteryConsumerId == null) { + if (mBatteryConsumerId == null) { finish(); } } else { - mPowerConsumerId = powerConsumerId; - mSharedPref.edit().putString(PREF_SELECTED_POWER_CONSUMER, mPowerConsumerId).apply(); + mBatteryConsumerId = batteryConsumerId; + mSharedPref.edit() + .putString(PREF_SELECTED_BATTERY_CONSUMER, mBatteryConsumerId) + .apply(); mLoadingView.setVisibility(View.VISIBLE); - loadPowerStats(); + loadBatteryStats(); } } - private void periodicPowerStatsRefresh() { - loadPowerStats(); - getMainThreadHandler().postDelayed(mPowerStatsRefresh, POWER_STATS_REFRESH_RATE_MILLIS); + private void periodicBatteryStatsRefresh() { + loadBatteryStats(); + getMainThreadHandler().postDelayed(mBatteryStatsRefresh, BATTERY_STATS_REFRESH_RATE_MILLIS); } - private void loadPowerStats() { + private void loadBatteryStats() { LoaderManager loaderManager = LoaderManager.getInstance(this); loaderManager.restartLoader(LOADER_BATTERY_STATS_HELPER, null, new BatteryStatsHelperLoaderCallbacks()); @@ -171,7 +173,7 @@ public class PowerStatsViewerActivity extends ComponentActivity { @NonNull @Override public Loader<BatteryStatsHelper> onCreateLoader(int id, Bundle args) { - return new BatteryStatsHelperLoader(PowerStatsViewerActivity.this); + return new BatteryStatsHelperLoader(BatteryStatsViewerActivity.this); } @Override @@ -207,7 +209,7 @@ public class PowerStatsViewerActivity extends ComponentActivity { @NonNull @Override public Loader<BatteryUsageStats> onCreateLoader(int id, Bundle args) { - return new BatteryUsageStatsLoader(PowerStatsViewerActivity.this); + return new BatteryUsageStatsLoader(BatteryStatsViewerActivity.this); } @Override @@ -223,60 +225,60 @@ public class PowerStatsViewerActivity extends ComponentActivity { public void onBatteryStatsHelperLoaded(BatteryStatsHelper batteryStatsHelper) { mBatteryStatsHelper = batteryStatsHelper; - onPowerStatsDataLoaded(); + onBatteryStatsDataLoaded(); } private void onBatteryUsageStatsLoaded(BatteryUsageStats batteryUsageStats) { mBatteryUsageStats = batteryUsageStats; - onPowerStatsDataLoaded(); + onBatteryStatsDataLoaded(); } - public void onPowerStatsDataLoaded() { + public void onBatteryStatsDataLoaded() { if (mBatteryStatsHelper == null || mBatteryUsageStats == null) { return; } - PowerStatsData powerStatsData = new PowerStatsData(this, mBatteryStatsHelper, - mBatteryUsageStats, mPowerConsumerId); + BatteryConsumerData batteryConsumerData = new BatteryConsumerData(this, mBatteryStatsHelper, + mBatteryUsageStats, mBatteryConsumerId); - PowerConsumerInfoHelper.PowerConsumerInfo - powerConsumerInfo = powerStatsData.getPowerConsumerInfo(); - if (powerConsumerInfo == null) { - mTitleView.setText("Power consumer not found"); + BatteryConsumerInfoHelper.BatteryConsumerInfo + batteryConsumerInfo = batteryConsumerData.getBatteryConsumerInfo(); + if (batteryConsumerInfo == null) { + mTitleView.setText("Battery consumer not found"); mPackagesView.setVisibility(View.GONE); } else { - mTitleView.setText(powerConsumerInfo.label); - if (powerConsumerInfo.details != null) { - mDetailsView.setText(powerConsumerInfo.details); + mTitleView.setText(batteryConsumerInfo.label); + if (batteryConsumerInfo.details != null) { + mDetailsView.setText(batteryConsumerInfo.details); mDetailsView.setVisibility(View.VISIBLE); } else { mDetailsView.setVisibility(View.GONE); } mIconView.setImageDrawable( - powerConsumerInfo.iconInfo.loadIcon(getPackageManager())); + batteryConsumerInfo.iconInfo.loadIcon(getPackageManager())); - if (powerConsumerInfo.packages != null) { - mPackagesView.setText(powerConsumerInfo.packages); + if (batteryConsumerInfo.packages != null) { + mPackagesView.setText(batteryConsumerInfo.packages); mPackagesView.setVisibility(View.VISIBLE); } else { mPackagesView.setVisibility(View.GONE); } } - mPowerStatsDataAdapter.setEntries(powerStatsData.getEntries()); - if (powerStatsData.getEntries().isEmpty()) { + mBatteryStatsDataAdapter.setEntries(batteryConsumerData.getEntries()); + if (batteryConsumerData.getEntries().isEmpty()) { mEmptyView.setVisibility(View.VISIBLE); - mPowerStatsDataView.setVisibility(View.GONE); + mBatteryConsumerDataView.setVisibility(View.GONE); } else { mEmptyView.setVisibility(View.GONE); - mPowerStatsDataView.setVisibility(View.VISIBLE); + mBatteryConsumerDataView.setVisibility(View.VISIBLE); } mLoadingView.setVisibility(View.GONE); } - private static class PowerStatsDataAdapter extends - RecyclerView.Adapter<PowerStatsDataAdapter.ViewHolder> { + private static class BatteryStatsDataAdapter extends + RecyclerView.Adapter<BatteryStatsDataAdapter.ViewHolder> { public static class ViewHolder extends RecyclerView.ViewHolder { public TextView titleTextView; public TextView amountTextView; @@ -291,9 +293,9 @@ public class PowerStatsViewerActivity extends ComponentActivity { } } - private List<PowerStatsData.Entry> mEntries = Collections.emptyList(); + private List<BatteryConsumerData.Entry> mEntries = Collections.emptyList(); - public void setEntries(List<PowerStatsData.Entry> entries) { + public void setEntries(List<BatteryConsumerData.Entry> entries) { mEntries = entries; notifyDataSetChanged(); } @@ -307,14 +309,14 @@ public class PowerStatsViewerActivity extends ComponentActivity { @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) { LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext()); - View itemView = layoutInflater.inflate(R.layout.power_stats_entry_layout, parent, + View itemView = layoutInflater.inflate(R.layout.battery_consumer_entry_layout, parent, false); return new ViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) { - PowerStatsData.Entry entry = mEntries.get(position); + BatteryConsumerData.Entry entry = mEntries.get(position); switch (entry.entryType) { case POWER: viewHolder.titleTextView.setText(entry.title); diff --git a/core/tests/powertests/OWNERS b/core/tests/batterystatstests/OWNERS index c22f6a4bbbf6..c22f6a4bbbf6 100644 --- a/core/tests/powertests/OWNERS +++ b/core/tests/batterystatstests/OWNERS diff --git a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java index 95da532045ac..4b0ed65e5fde 100644 --- a/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java +++ b/core/tests/coretests/src/android/app/ApplicationPackageManagerTest.java @@ -90,7 +90,7 @@ public class ApplicationPackageManagerTest extends TestCase { private boolean mAllow3rdPartyOnInternal = true; public MockedApplicationPackageManager() { - super(null, null, null); + super(null, null); } public void setForceAllowOnExternal(boolean forceAllowOnExternal) { diff --git a/core/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java new file mode 100755 index 000000000000..d8dc1eabe045 --- /dev/null +++ b/core/tests/hdmitests/src/android/hardware/hdmi/HdmiPortInfoTest.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.hardware.hdmi; + +import androidx.test.filters.SmallTest; + +import com.google.common.testing.EqualsTester; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Tests for {@link HdmiPortInfo} */ +@RunWith(JUnit4.class) +@SmallTest +public class HdmiPortInfoTest { + + @Test + public void testEquals() { + int portId = 1; + int portType = 0; + int address = 0x123456; + boolean isCec = true; + boolean isMhl = false; + boolean isArcSupported = false; + + new EqualsTester() + .addEqualityGroup( + new HdmiPortInfo(portId, portType, address, isCec, isMhl, isArcSupported), + new HdmiPortInfo(portId, portType, address, isCec, isMhl, isArcSupported)) + .addEqualityGroup( + new HdmiPortInfo( + portId + 1, portType, address, isCec, isMhl, isArcSupported)) + .addEqualityGroup( + new HdmiPortInfo( + portId, portType + 1, address, isCec, isMhl, isArcSupported)) + .addEqualityGroup( + new HdmiPortInfo( + portId, portType, address + 1, isCec, isMhl, isArcSupported)) + .addEqualityGroup( + new HdmiPortInfo(portId, portType, address, !isCec, isMhl, isArcSupported)) + .addEqualityGroup( + new HdmiPortInfo(portId, portType, address, isCec, !isMhl, isArcSupported)) + .addEqualityGroup( + new HdmiPortInfo(portId, portType, address, isCec, isMhl, !isArcSupported)) + .testEquals(); + } +} diff --git a/data/etc/car/com.android.car.provision.xml b/data/etc/car/com.android.car.provision.xml index 7e77848ec337..4fd9cae53bd7 100644 --- a/data/etc/car/com.android.car.provision.xml +++ b/data/etc/car/com.android.car.provision.xml @@ -19,6 +19,7 @@ <permission name="android.car.permission.CAR_POWERTRAIN"/> <permission name="android.permission.INTERACT_ACROSS_USERS"/> <permission name="android.permission.INTERACT_ACROSS_USERS_FULL"/> + <permission name="android.permission.MANAGE_USERS"/> <permission name="android.permission.MASTER_CLEAR"/> <permission name="android.permission.QUERY_ALL_PACKAGES"/> <permission name="android.permission.SEND_CATEGORY_CAR_NOTIFICATIONS"/> diff --git a/data/etc/com.android.documentsui.xml b/data/etc/com.android.documentsui.xml index 1e570ba9ac1c..d32cbecb16ec 100644 --- a/data/etc/com.android.documentsui.xml +++ b/data/etc/com.android.documentsui.xml @@ -22,5 +22,6 @@ <permission name="android.permission.LOG_COMPAT_CHANGE"/> <permission name="android.permission.MODIFY_QUIET_MODE"/> <permission name="android.permission.READ_COMPAT_CHANGE_CONFIG"/> + <permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"/> </privapp-permissions> </permissions> diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml index c4300784f9b6..0a77be967ace 100644 --- a/data/etc/privapp-permissions-platform.xml +++ b/data/etc/privapp-permissions-platform.xml @@ -246,6 +246,7 @@ applications that come with the platform <permission name="android.permission.REGISTER_STATS_PULL_ATOM" /> <!-- Permissions required for reading DeviceConfig --> <permission name="android.permission.READ_DEVICE_CONFIG" /> + <permission name="android.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND"/> </privapp-permissions> <privapp-permissions package="com.android.providers.telephony"> diff --git a/data/etc/services.core.protolog.json b/data/etc/services.core.protolog.json index 75b3babbc3a2..d8a735c78ca3 100644 --- a/data/etc/services.core.protolog.json +++ b/data/etc/services.core.protolog.json @@ -1063,6 +1063,12 @@ "group": "WM_DEBUG_TASKS", "at": "com\/android\/server\/wm\/ActivityTaskSupervisor.java" }, + "-856590985": { + "message": "dcTarget: %s mImeRequester: %s", + "level": "DEBUG", + "group": "WM_DEBUG_IME", + "at": "com\/android\/server\/wm\/ImeInsetsSourceProvider.java" + }, "-856025122": { "message": "SURFACE transparentRegionHint=%s: %s", "level": "INFO", @@ -1711,12 +1717,6 @@ "group": "WM_SHOW_TRANSACTIONS", "at": "com\/android\/server\/wm\/Session.java" }, - "-49129622": { - "message": "performLayout: Activity exiting now removed %s", - "level": "VERBOSE", - "group": "WM_DEBUG_ADD_REMOVE", - "at": "com\/android\/server\/wm\/TaskDisplayArea.java" - }, "-33096143": { "message": "applyAnimation: transition animation is disabled or skipped. container=%s", "level": "VERBOSE", @@ -1771,6 +1771,12 @@ "group": "WM_ERROR", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, + "44438983": { + "message": "performLayout: Activity exiting now removed %s", + "level": "VERBOSE", + "group": "WM_DEBUG_ADD_REMOVE", + "at": "com\/android\/server\/wm\/DisplayContent.java" + }, "45285419": { "message": "startingWindow was set but startingSurface==null, couldn't remove", "level": "VERBOSE", @@ -1831,12 +1837,6 @@ "group": "WM_ERROR", "at": "com\/android\/server\/wm\/WindowContextListenerController.java" }, - "91350919": { - "message": "Attempted to set IME flag to a display that does not exist: %d", - "level": "WARN", - "group": "WM_ERROR", - "at": "com\/android\/server\/wm\/WindowManagerService.java" - }, "94402792": { "message": "Moving to RESUMED: %s (in existing)", "level": "VERBOSE", @@ -2383,12 +2383,6 @@ "group": "WM_ERROR", "at": "com\/android\/server\/wm\/WindowManagerService.java" }, - "632168013": { - "message": "dcTarget: %s mImeTargetFromIme: %s", - "level": "DEBUG", - "group": "WM_DEBUG_IME", - "at": "com\/android\/server\/wm\/ImeInsetsSourceProvider.java" - }, "633654009": { "message": "SURFACE POS (setPositionInTransaction) @ (%f,%f): %s", "level": "INFO", diff --git a/graphics/java/android/graphics/OWNERS b/graphics/java/android/graphics/OWNERS index 61968890b837..c3fb6f8eba7c 100644 --- a/graphics/java/android/graphics/OWNERS +++ b/graphics/java/android/graphics/OWNERS @@ -4,3 +4,5 @@ romainguy@google.com jreck@google.com njawad@google.com sumir@google.com + +per-file BLASTBufferQueue.java = file:/services/core/java/com/android/server/wm/OWNERS diff --git a/keystore/java/android/security/KeyStoreOperation.java b/keystore/java/android/security/KeyStoreOperation.java index 49a48871fd30..7ea9e1438845 100644 --- a/keystore/java/android/security/KeyStoreOperation.java +++ b/keystore/java/android/security/KeyStoreOperation.java @@ -17,7 +17,7 @@ package android.security; import android.annotation.NonNull; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.security.keymaster.KeymasterDefs; diff --git a/keystore/java/android/security/KeyStoreSecurityLevel.java b/keystore/java/android/security/KeyStoreSecurityLevel.java index 7c3de8bee475..3ef4aa5b7ec3 100644 --- a/keystore/java/android/security/KeyStoreSecurityLevel.java +++ b/keystore/java/android/security/KeyStoreSecurityLevel.java @@ -18,7 +18,7 @@ package android.security; import android.annotation.NonNull; import android.app.compat.CompatChanges; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.security.keystore.BackendBusyException; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java index 69c7a2589d6f..0775a1a99886 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java @@ -17,7 +17,7 @@ package android.security.keystore2; import android.annotation.NonNull; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.keymaster.KeymasterDefs; import android.security.keystore.ArrayUtils; import android.security.keystore.KeyProperties; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java index 2b5f6c31607b..bc56f015f3bd 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java @@ -18,7 +18,7 @@ package android.security.keystore2; import android.annotation.NonNull; import android.annotation.Nullable; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.KeyStoreException; import android.security.KeyStoreOperation; import android.security.keymaster.KeymasterDefs; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java index 18d26922f1ae..a3b04abfba3f 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java @@ -19,7 +19,7 @@ package android.security.keystore2; import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.KeyStoreException; import android.security.KeyStoreOperation; import android.security.keymaster.KeymasterDefs; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java index 2250c89aac41..d1ef1df817e6 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java @@ -17,7 +17,7 @@ package android.security.keystore2; import android.annotation.NonNull; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.KeyStoreException; import android.security.KeyStoreOperation; import android.security.keymaster.KeymasterDefs; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java index eea45c287622..8475ad9fd57b 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreHmacSpi.java @@ -16,7 +16,7 @@ package android.security.keystore2; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.KeyStoreException; import android.security.KeyStoreOperation; import android.security.keymaster.KeymasterDefs; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java index 479fd8a6a73a..233f352989ab 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyGeneratorSpi.java @@ -16,8 +16,8 @@ package android.security.keystore2; -import android.hardware.keymint.KeyParameter; -import android.hardware.keymint.SecurityLevel; +import android.hardware.security.keymint.KeyParameter; +import android.hardware.security.keymint.SecurityLevel; import android.security.KeyStore2; import android.security.KeyStoreSecurityLevel; import android.security.keymaster.KeymasterArguments; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java index 61725e3e8c24..df0e1462a492 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyPairGeneratorSpi.java @@ -18,8 +18,8 @@ package android.security.keystore2; import android.annotation.NonNull; import android.annotation.Nullable; -import android.hardware.keymint.KeyParameter; -import android.hardware.keymint.SecurityLevel; +import android.hardware.security.keymint.KeyParameter; +import android.hardware.security.keymint.SecurityLevel; import android.os.Build; import android.security.KeyPairGeneratorSpec; import android.security.KeyStore2; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java index 2686ddc20c1d..951f91887894 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java @@ -18,7 +18,7 @@ package android.security.keystore2; import android.annotation.NonNull; import android.annotation.Nullable; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.keymaster.KeymasterDefs; import android.security.keystore.KeyProperties; import android.security.keystore.KeymasterUtils; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java index 444dad4cffbe..ab7559116a41 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java @@ -17,7 +17,7 @@ package android.security.keystore2; import android.annotation.NonNull; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.keymaster.KeymasterDefs; import android.security.keystore.KeyProperties; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java index a168f8feb3db..9b4f01e744f7 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java @@ -18,7 +18,7 @@ package android.security.keystore2; import android.annotation.CallSuper; import android.annotation.NonNull; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.KeyStoreException; import android.security.KeyStoreOperation; import android.security.keymaster.KeymasterDefs; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java index 9790a4ae5b65..aca531458382 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java @@ -18,9 +18,9 @@ package android.security.keystore2; import android.annotation.NonNull; import android.hardware.biometrics.BiometricManager; -import android.hardware.keymint.HardwareAuthenticatorType; -import android.hardware.keymint.KeyParameter; -import android.hardware.keymint.SecurityLevel; +import android.hardware.security.keymint.HardwareAuthenticatorType; +import android.hardware.security.keymint.KeyParameter; +import android.hardware.security.keymint.SecurityLevel; import android.security.GateKeeper; import android.security.KeyStore2; import android.security.KeyStoreParameter; diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java index a2d4528b99fd..4d4b0d8f183b 100644 --- a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java +++ b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java @@ -18,7 +18,7 @@ package android.security.keystore2; import android.annotation.NonNull; import android.annotation.Nullable; -import android.hardware.keymint.KeyParameter; +import android.hardware.security.keymint.KeyParameter; import android.security.keymaster.KeymasterDefs; import android.security.keystore.ArrayUtils; import android.security.keystore.KeyProperties; diff --git a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java index 8fa532b6e188..18c786aa3093 100644 --- a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java +++ b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java @@ -18,8 +18,8 @@ package android.security.keystore2; import android.annotation.NonNull; import android.hardware.biometrics.BiometricManager; -import android.hardware.keymint.KeyParameter; -import android.hardware.keymint.SecurityLevel; +import android.hardware.security.keymint.KeyParameter; +import android.hardware.security.keymint.SecurityLevel; import android.security.GateKeeper; import android.security.keymaster.KeymasterDefs; import android.security.keystore.KeyProperties; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java index d65ad62cdbbb..a944e3bc50cf 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedTutorialHandler.java @@ -63,6 +63,16 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { private String mStartOneHandedDescription; private String mStopOneHandedDescription; + private enum ONE_HANDED_TRIGGER_STATE { + UNSET, ENTERING, EXITING + } + /** + * Current One-Handed trigger state. + * Note: This is a dynamic state, whenever last state has been confirmed + * (i.e. onStartFinished() or onStopFinished()), the state should be set "UNSET" at final. + */ + private ONE_HANDED_TRIGGER_STATE mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET; + /** * Container of the tutorial panel showing at outside region when one handed starting */ @@ -74,6 +84,21 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { public void onTutorialAnimationUpdate(int offset) { mUpdateHandler.post(() -> onAnimationUpdate(offset)); } + + @Override + public void onOneHandedAnimationStart( + OneHandedAnimationController.OneHandedTransitionAnimator animator) { + mUpdateHandler.post(() -> { + final Rect startValue = (Rect) animator.getStartValue(); + if (mTriggerState == ONE_HANDED_TRIGGER_STATE.UNSET) { + mTriggerState = (startValue.top == 0) + ? ONE_HANDED_TRIGGER_STATE.ENTERING : ONE_HANDED_TRIGGER_STATE.EXITING; + if (mCanShowTutorial && mTriggerState == ONE_HANDED_TRIGGER_STATE.ENTERING) { + createTutorialTarget(); + } + } + }); + } }; public OneHandedTutorialHandler(Context context) { @@ -100,9 +125,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { R.string.accessibility_action_start_one_handed); mStopOneHandedDescription = context.getResources().getString( R.string.accessibility_action_stop_one_handed); - if (mCanShowTutorial) { - createOrUpdateTutorialTarget(); - } } @Override @@ -111,6 +133,7 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { updateFinished(View.VISIBLE, 0f); updateTutorialCount(); announcementForScreenReader(true); + mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET; }); } @@ -119,6 +142,8 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { mUpdateHandler.post(() -> { updateFinished(View.INVISIBLE, -mTargetViewContainer.getHeight()); announcementForScreenReader(false); + removeTutorialFromWindowManager(); + mTriggerState = ONE_HANDED_TRIGGER_STATE.UNSET; }); } @@ -126,7 +151,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { if (!canShowTutorial()) { return; } - mTargetViewContainer.setVisibility(visible); mTargetViewContainer.setTranslationY(finalPosition); } @@ -155,24 +179,23 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { * Adds the tutorial target view to the WindowManager and update its layout, so it's ready * to be animated in. */ - private void createOrUpdateTutorialTarget() { - mUpdateHandler.post(() -> { - if (!mTargetViewContainer.isAttachedToWindow()) { - mTargetViewContainer.setVisibility(View.INVISIBLE); - - try { - mWindowManager.addView(mTargetViewContainer, getTutorialTargetLayoutParams()); - } catch (IllegalStateException e) { - // This shouldn't happen, but if the target is already added, just update its - // layout params. - mWindowManager.updateViewLayout( - mTargetViewContainer, getTutorialTargetLayoutParams()); - } - } else { - mWindowManager.updateViewLayout(mTargetViewContainer, - getTutorialTargetLayoutParams()); + private void createTutorialTarget() { + if (!mTargetViewContainer.isAttachedToWindow()) { + try { + mWindowManager.addView(mTargetViewContainer, getTutorialTargetLayoutParams()); + } catch (IllegalStateException e) { + // This shouldn't happen, but if the target is already added, just update its + // layout params. + mWindowManager.updateViewLayout( + mTargetViewContainer, getTutorialTargetLayoutParams()); } - }); + } + } + + private void removeTutorialFromWindowManager() { + if (mTargetViewContainer.isAttachedToWindow()) { + mWindowManager.removeViewImmediate(mTargetViewContainer); + } } OneHandedAnimationCallback getAnimationCallback() { @@ -193,7 +216,6 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { lp.privateFlags |= WindowManager.LayoutParams.SYSTEM_FLAG_SHOW_FOR_ALL_USERS; lp.setFitInsetsTypes(0 /* types */); lp.setTitle("one-handed-tutorial-overlay"); - return lp; } @@ -206,10 +228,12 @@ public class OneHandedTutorialHandler implements OneHandedTransitionCallback { private boolean canShowTutorial() { if (!mCanShowTutorial) { + // Since canSHowTutorial() will be called in onAnimationUpdate() and we still need to + // hide Tutorial text in the period of continuously onAnimationUpdate() API call, + // so we have to hide mTargetViewContainer here. mTargetViewContainer.setVisibility(View.GONE); return false; } - return true; } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java index eb82357f2dea..71710af4ffb5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerImeController.java @@ -26,6 +26,7 @@ import android.annotation.Nullable; import android.graphics.Rect; import android.os.Handler; import android.util.Slog; +import android.view.Choreographer; import android.view.SurfaceControl; import android.window.TaskOrganizer; import android.window.WindowContainerToken; @@ -338,6 +339,7 @@ class DividerImeController implements DisplayImeController.ImePositionProcessor SurfaceControl.Transaction t = mTransactionPool.acquire(); float value = (float) animation.getAnimatedValue(); onProgress(value, t); + t.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId()); t.apply(); mTransactionPool.release(t); }); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java index c6496ad6246f..ba071666b5aa 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/DividerView.java @@ -37,6 +37,7 @@ import android.os.Handler; import android.os.RemoteException; import android.util.AttributeSet; import android.util.Slog; +import android.view.Choreographer; import android.view.Display; import android.view.MotionEvent; import android.view.PointerIcon; @@ -1108,6 +1109,7 @@ public class DividerView extends FrameLayout implements OnTouchListener, } resizeSplitSurfaces(t, mDockedRect, mDockedTaskRect, mOtherRect, mOtherTaskRect); if (ownTransaction) { + t.setFrameTimelineVsync(Choreographer.getSfInstance().getVsyncId()); t.apply(); mTiles.releaseTransaction(t); } diff --git a/libs/hwui/jni/Typeface.cpp b/libs/hwui/jni/Typeface.cpp index a2964d6627a1..10c80774fd16 100644 --- a/libs/hwui/jni/Typeface.cpp +++ b/libs/hwui/jni/Typeface.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#define ATRACE_TAG ATRACE_TAG_VIEW #include "FontUtils.h" #include "GraphicsJNI.h" #include "fonts/Font.h" @@ -25,8 +26,13 @@ #include <minikin/FontCollection.h> #include <minikin/FontFamily.h> #include <minikin/SystemFonts.h> +#include <utils/TraceUtils.h> + +#include <mutex> +#include <unordered_map> using namespace android; +using android::uirenderer::TraceUtils; static inline Typeface* toTypeface(jlong ptr) { return reinterpret_cast<Typeface*>(ptr); @@ -149,6 +155,20 @@ static void Typeface_registerGenericFamily(JNIEnv *env, jobject, jstring familyN toTypeface(ptr)->fFontCollection); } +static sk_sp<SkData> makeSkDataCached(const std::string& path) { + // We don't clear cache as Typeface objects created by Typeface_readTypefaces() will be stored + // in a static field and will not be garbage collected. + static std::unordered_map<std::string, sk_sp<SkData>> cache; + static std::mutex mutex; + ALOG_ASSERT(!path.empty()); + std::lock_guard lock{mutex}; + sk_sp<SkData>& entry = cache[path]; + if (entry.get() == nullptr) { + entry = SkData::MakeFromFileName(path.c_str()); + } + return entry; +} + static std::function<std::shared_ptr<minikin::MinikinFont>()> readMinikinFontSkia( minikin::BufferReader* reader) { std::string_view fontPath = reader->readString(); @@ -158,8 +178,9 @@ static std::function<std::shared_ptr<minikin::MinikinFont>()> readMinikinFontSki std::tie(axesPtr, axesCount) = reader->readArray<minikin::FontVariation>(); return [fontPath, fontIndex, axesPtr, axesCount]() -> std::shared_ptr<minikin::MinikinFont> { std::string path(fontPath.data(), fontPath.size()); - sk_sp<SkData> data = SkData::MakeFromFileName(path.c_str()); - if (data == nullptr) { + ATRACE_FORMAT("Loading font %s", path.c_str()); + sk_sp<SkData> data = makeSkDataCached(path); + if (data.get() == nullptr) { // This may happen if: // 1. When the process failed to open the file (e.g. invalid path or permission). // 2. When the process failed to map the file (e.g. hitting max_map_count limit). diff --git a/location/java/android/location/Location.java b/location/java/android/location/Location.java index 47ecbd80a07f..a7e9a0de538a 100644 --- a/location/java/android/location/Location.java +++ b/location/java/android/location/Location.java @@ -1049,11 +1049,7 @@ public class Location implements Parcelable { * <ul> * <li> satellites - the number of satellites used to derive the fix * </ul> - * - * @deprecated Do not use. For GNSS related information, prefer listening for GNSS status - * information via {@link LocationManager}. */ - @Deprecated public Bundle getExtras() { return mExtras; } @@ -1063,10 +1059,7 @@ public class Location implements Parcelable { * * <p>Note this stores a copy of the given extras, so any changes to extras after calling this * method won't be reflected in the location bundle. - * - * @deprecated Do not use. */ - @Deprecated public void setExtras(@Nullable Bundle extras) { mExtras = (extras == null) ? null : new Bundle(extras); } diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java index 7085a755990f..914beaff225e 100644 --- a/location/java/android/location/LocationManager.java +++ b/location/java/android/location/LocationManager.java @@ -159,21 +159,21 @@ public class LocationManager { public static final long BLOCK_GPS_STATUS_USAGE = 144027538L; /** - * Name of the network location provider. + * Standard name of the network location provider. * - * <p>This provider determines location based on nearby of cell tower and WiFi access points. - * Results are retrieved by means of a network lookup. + * <p>If present, this provider determines location based on nearby of cell tower and WiFi + * access points. Operation of this provider may require a data connection. */ public static final String NETWORK_PROVIDER = "network"; /** - * Name of the GNSS location provider. + * Standard name of the GNSS location provider. * - * <p>This provider determines location using GNSS satellites. Depending on conditions, this - * provider may take a while to return a location fix. Requires the - * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} permission. + * <p>If present, this provider determines location using GNSS satellites. The responsiveness + * and accuracy of location fixes may depend on GNSS signal conditions. * - * <p>The extras Bundle for the GPS location provider can contain the following key/value pairs: + * <p>The extras Bundle for locations derived by this location provider may contain the + * following key/value pairs: * <ul> * <li> satellites - the number of satellites used to derive the fix * </ul> @@ -181,29 +181,22 @@ public class LocationManager { public static final String GPS_PROVIDER = "gps"; /** - * A special location provider for receiving locations without actually initiating a location - * fix. + * A special location provider for receiving locations without actively initiating a location + * fix. This location provider is always present. * * <p>This provider can be used to passively receive location updates when other applications or * services request them without actually requesting the locations yourself. This provider will - * only return locations generated by other providers. You can query the - * {@link Location#getProvider()} method to determine the actual provider that supplied the - * location update. Requires the {@link android.Manifest.permission#ACCESS_FINE_LOCATION} - * permission, although there is no guarantee of fine locations. + * only return locations generated by other providers. */ public static final String PASSIVE_PROVIDER = "passive"; /** - * The fused location provider. - * - * <p>This provider may combine inputs from several location sources to provide the - * best possible location fix. It is implicitly used for all API's that involve the - * {@link LocationRequest} object. + * Standard name of the fused location provider. * - * @hide + * <p>If present, this provider may combine inputs from several other location providers to + * provide the best possible location fix. It is implicitly used for all requestLocationUpdates + * APIs that involve a {@link Criteria}. */ - @SystemApi - @TestApi public static final String FUSED_PROVIDER = "fused"; /** @@ -918,6 +911,9 @@ public class LocationManager { /** * Register for a single location update using a Criteria and a callback. * + * <p>Note: Since Android KitKat, Criteria requests will always result in using the + * {@link #FUSED_PROVIDER}. + * * <p>See {@link #requestLocationUpdates(long, float, Criteria, PendingIntent)} for more detail * on how to use this method. * @@ -985,6 +981,9 @@ public class LocationManager { /** * Register for a single location update using a Criteria and pending intent. * + * <p>Note: Since Android KitKat, Criteria requests will always result in using the + * {@link #FUSED_PROVIDER}. + * * <p>See {@link #requestLocationUpdates(long, float, Criteria, PendingIntent)} for more detail * on how to use this method. * @@ -1113,6 +1112,9 @@ public class LocationManager { * Register for location updates using a provider selected through the given Criteria, and a * callback on the specified {@link Looper}. * + * <p>Note: Since Android KitKat, Criteria requests will always result in using the + * {@link #FUSED_PROVIDER}. + * * <p>See {@link #requestLocationUpdates(String, LocationRequest, Executor, LocationListener)} * for more detail on how this method works. * @@ -1124,7 +1126,12 @@ public class LocationManager { * @throws IllegalArgumentException if criteria is null * @throws IllegalArgumentException if listener is null * @throws SecurityException if no suitable permission is present + * + * @deprecated Use + * {@link #requestLocationUpdates(String, long, float, LocationListener, Looper)} instead to + * explicitly select a provider. */ + @Deprecated @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long minTimeMs, float minDistanceM, @NonNull Criteria criteria, @NonNull LocationListener listener, @@ -1138,6 +1145,9 @@ public class LocationManager { * Register for location updates using a provider selected through the given Criteria, and a * callback on the specified {@link Executor}. * + * <p>Note: Since Android KitKat, Criteria requests will always result in using the + * {@link #FUSED_PROVIDER}. + * * <p>See {@link #requestLocationUpdates(String, LocationRequest, Executor, LocationListener)} * for more detail on how this method works. * @@ -1151,7 +1161,12 @@ public class LocationManager { * @throws IllegalArgumentException if executor is null * @throws IllegalArgumentException if listener is null * @throws SecurityException if no suitable permission is present + * + * @deprecated Use + * {@link #requestLocationUpdates(String, long, float, Executor, LocationListener)} instead to + * explicitly select a provider. */ + @Deprecated @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates( long minTimeMs, @@ -1199,6 +1214,9 @@ public class LocationManager { * Register for location updates using a provider selected through the given Criteria, and * callbacks delivered via the provided {@link PendingIntent}. * + * <p>Note: Since Android KitKat, Criteria requests will always result in using the + * {@link #FUSED_PROVIDER}. + * * <p>See {@link #requestLocationUpdates(String, long, float, PendingIntent)} for more detail on * how this method works. * @@ -1210,7 +1228,11 @@ public class LocationManager { * @throws IllegalArgumentException if provider is null or doesn't exist * @throws IllegalArgumentException if pendingIntent is null * @throws SecurityException if no suitable permission is present + * + * @deprecated Use {@link #requestLocationUpdates(String, long, float, PendingIntent)} instead + * to explicitly select a provider. */ + @Deprecated @RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) public void requestLocationUpdates(long minTimeMs, float minDistanceM, @NonNull Criteria criteria, @NonNull PendingIntent pendingIntent) { @@ -1594,9 +1616,8 @@ public class LocationManager { } /** - * Returns a list of the names of all known location providers. All providers are returned, - * including ones that are not permitted to be accessed by the calling activity or are currently - * disabled. + * Returns a list of the names of all available location providers. All providers are returned, + * including those that are currently disabled. * * @return list of provider names */ @@ -1609,8 +1630,8 @@ public class LocationManager { } /** - * Returns a list of the names of location providers. Only providers that the caller has - * permission to access will be returned. + * Returns a list of the names of available location providers. If {@code enabledOnly} is false, + * this is functionally the same as {@link #getAllProviders()}. * * @param enabledOnly if true then only enabled providers are included * @return list of provider names @@ -1624,8 +1645,7 @@ public class LocationManager { } /** - * Returns a list of the names of providers that satisfy the given criteria. Only providers that - * the caller has permission to access will be returned. + * Returns a list of the names of available location providers that satisfy the given criteria. * * @param criteria the criteria that providers must match * @param enabledOnly if true then only enabled providers are included diff --git a/location/java/android/location/OWNERS b/location/java/android/location/OWNERS index 383321bc3d69..60321448a58a 100644 --- a/location/java/android/location/OWNERS +++ b/location/java/android/location/OWNERS @@ -1,6 +1,6 @@ # Bug component: 880425 -mstogaitis@google.com +sooniln@google.com wyattriley@google.com -etn@google.com +yuhany@google.com weiwa@google.com diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index d094c2cd3c63..20f02a46ea63 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -279,6 +279,7 @@ public class Tuner implements AutoCloseable { @Nullable private FrontendInfo mFrontendInfo; private Integer mFrontendHandle; + private Boolean mIsSharedFrontend = false; private int mFrontendType = FrontendSettings.TYPE_UNDEFINED; private int mUserId; private Lnb mLnb; @@ -441,8 +442,11 @@ public class Tuner implements AutoCloseable { */ public void shareFrontendFromTuner(@NonNull Tuner tuner) { mTunerResourceManager.shareFrontend(mClientId, tuner.mClientId); - mFrontendHandle = tuner.mFrontendHandle; - mFrontend = nativeOpenFrontendByHandle(mFrontendHandle); + synchronized (mIsSharedFrontend) { + mFrontendHandle = tuner.mFrontendHandle; + mFrontend = tuner.mFrontend; + mIsSharedFrontend = true; + } } /** @@ -473,14 +477,19 @@ public class Tuner implements AutoCloseable { private void releaseAll() { if (mFrontendHandle != null) { - int res = nativeCloseFrontend(mFrontendHandle); - if (res != Tuner.RESULT_SUCCESS) { - TunerUtils.throwExceptionForResult(res, "failed to close frontend"); + synchronized (mIsSharedFrontend) { + if (!mIsSharedFrontend) { + int res = nativeCloseFrontend(mFrontendHandle); + if (res != Tuner.RESULT_SUCCESS) { + TunerUtils.throwExceptionForResult(res, "failed to close frontend"); + } + } + mIsSharedFrontend = false; } mTunerResourceManager.releaseFrontend(mFrontendHandle, mClientId); FrameworkStatsLog .write(FrameworkStatsLog.TV_TUNER_STATE_CHANGED, mUserId, - FrameworkStatsLog.TV_TUNER_STATE_CHANGED__STATE__UNKNOWN); + FrameworkStatsLog.TV_TUNER_STATE_CHANGED__STATE__UNKNOWN); mFrontendHandle = null; mFrontend = null; } diff --git a/media/jni/android_media_MediaMetadataRetriever.cpp b/media/jni/android_media_MediaMetadataRetriever.cpp index 126897a908f8..ddc51cdb861c 100644 --- a/media/jni/android_media_MediaMetadataRetriever.cpp +++ b/media/jni/android_media_MediaMetadataRetriever.cpp @@ -464,11 +464,13 @@ static jobject android_media_MediaMetadataRetriever_getThumbnailImageAtIndex( || thumbPixels * 6 >= maxPixels) { frameMemory = retriever->getImageAtIndex( index, colorFormat, false /*metaOnly*/, true /*thumbnail*/); - // TODO: Using unsecurePointer() has some associated security pitfalls - // (see declaration for details). - // Either document why it is safe in this case or address the - // issue (e.g. by copying). - videoFrame = static_cast<VideoFrame *>(frameMemory->unsecurePointer()); + if (frameMemory != 0) { + // TODO: Using unsecurePointer() has some associated security pitfalls + // (see declaration for details). + // Either document why it is safe in this case or address the + // issue (e.g. by copying). + videoFrame = static_cast<VideoFrame *>(frameMemory->unsecurePointer()); + } if (thumbPixels > maxPixels) { int downscale = ceil(sqrt(thumbPixels / (float)maxPixels)); diff --git a/media/native/midi/amidi.cpp b/media/native/midi/amidi.cpp index 35c4d42a0aa8..923377c8180e 100644 --- a/media/native/midi/amidi.cpp +++ b/media/native/midi/amidi.cpp @@ -131,7 +131,7 @@ static media_status_t AMIDI_getDeviceInfo(const AMidiDevice *device, MidiDeviceInfo deviceInfo; Status txResult = device->server->getDeviceInfo(&deviceInfo); if (!txResult.isOk()) { - ALOGE("AMIDI_getDeviceInfo transaction error: %d", txResult.transactionError()); + ALOGE("%s server exception code: %d", __func__, txResult.exceptionCode()); return AMEDIA_ERROR_UNKNOWN; } @@ -253,7 +253,7 @@ static media_status_t AMIDI_openPort(const AMidiDevice *device, int32_t portNumb ? device->server->openOutputPort(portToken, portNumber, &ufd) : device->server->openInputPort(portToken, portNumber, &ufd); if (!txResult.isOk()) { - ALOGE("AMIDI_openPort transaction error: %d", txResult.transactionError()); + ALOGE("%s server exception code: %d", __func__, txResult.exceptionCode()); return AMEDIA_ERROR_UNKNOWN; } @@ -282,7 +282,7 @@ static void AMIDI_closePort(AMIDI_Port *port) { Status txResult = port->device->server->closePort(port->binderToken); if (!txResult.isOk()) { - ALOGE("Transaction error closing MIDI port:%d", txResult.transactionError()); + ALOGE("%s server exception code: %d", __func__, txResult.exceptionCode()); } delete port; diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml index cb1faf5e5163..af775cc64ae1 100644 --- a/packages/Shell/AndroidManifest.xml +++ b/packages/Shell/AndroidManifest.xml @@ -364,6 +364,9 @@ <!-- Permissions required for CTS tests to close system dialogs --> <uses-permission android:name="android.permission.BROADCAST_CLOSE_SYSTEM_DIALOGS" /> + <!-- Permission required for CTS test - HideOverlayWindowsTest --> + <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> + <application android:label="@string/app_label" android:theme="@android:style/Theme.DeviceDefault.DayNight" android:defaultToDeviceProtectedStorage="true" diff --git a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java index 0fd47654ebb9..c289ca2173be 100644 --- a/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/appops/AppOpsControllerImpl.java @@ -438,7 +438,8 @@ public class AppOpsControllerImpl extends BroadcastReceiver implements AppOpsCon } @Override - public void onOpNoted(int code, int uid, String packageName, int result) { + public void onOpNoted(int code, int uid, String packageName, + @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result) { if (DEBUG) { Log.w(TAG, "Noted op: " + code + " with result " + AppOpsManager.MODE_NAMES[result] + " for package " + packageName); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java index c89f8e58f980..6074ef6156c3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java @@ -252,11 +252,9 @@ public class QuickQSPanel extends QSPanel { final int availableWidth = getMeasuredWidth() - getPaddingStart() - getPaddingEnd(); final int leftoverWhitespace = availableWidth - maxTiles * mCellWidth; - final int smallestHorizontalMarginNeeded; - smallestHorizontalMarginNeeded = leftoverWhitespace / Math.max(1, maxTiles - 1); - if (smallestHorizontalMarginNeeded > 0){ - mCellMarginHorizontal = smallestHorizontalMarginNeeded; + if (leftoverWhitespace > 0) { + mCellMarginHorizontal = leftoverWhitespace / Math.max(1, maxTiles); mColumns = maxTiles; } else{ mColumns = mCellWidth == 0 ? 1 : @@ -266,7 +264,7 @@ public class QuickQSPanel extends QSPanel { mCellMarginHorizontal = (availableWidth - mCellWidth) / 2; } else { mCellMarginHorizontal = - (availableWidth - mColumns * mCellWidth) / (mColumns - 1); + (availableWidth - mColumns * mCellWidth) / mColumns; } } @@ -310,7 +308,8 @@ public class QuickQSPanel extends QSPanel { // Only one column/tile. Use the margin to center the tile. return getPaddingStart() + mCellMarginHorizontal; } - return getPaddingStart() + column * (mCellWidth + mCellMarginHorizontal); + return getPaddingStart() + mCellMarginHorizontal / 2 + + column * (mCellWidth + mCellMarginHorizontal); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java index 547a3705266a..6bdc303b4786 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LockscreenLockIconController.java @@ -37,6 +37,7 @@ import androidx.annotation.Nullable; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardSecurityModel; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.settingslib.Utils; @@ -78,6 +79,7 @@ public class LockscreenLockIconController { private final KeyguardStateController mKeyguardStateController; private final Resources mResources; private final HeadsUpManagerPhone mHeadsUpManagerPhone; + private final KeyguardSecurityModel mKeyguardSecurityModel; private boolean mKeyguardShowing; private boolean mKeyguardJustShown; private boolean mBlockUpdates; @@ -326,7 +328,8 @@ public class LockscreenLockIconController { @Nullable DockManager dockManager, KeyguardStateController keyguardStateController, @Main Resources resources, - HeadsUpManagerPhone headsUpManagerPhone) { + HeadsUpManagerPhone headsUpManagerPhone, + KeyguardSecurityModel keyguardSecurityModel) { mLockscreenGestureLogger = lockscreenGestureLogger; mKeyguardUpdateMonitor = keyguardUpdateMonitor; mLockPatternUtils = lockPatternUtils; @@ -341,6 +344,7 @@ public class LockscreenLockIconController { mKeyguardStateController = keyguardStateController; mResources = resources; mHeadsUpManagerPhone = headsUpManagerPhone; + mKeyguardSecurityModel = keyguardSecurityModel; mKeyguardIndicationController.setLockIconController(this); } @@ -541,13 +545,20 @@ public class LockscreenLockIconController { * @return true if the visibility changed */ private boolean updateIconVisibility() { + if (mLockIcon == null) { + return false; + } + if (mKeyguardUpdateMonitor.isUdfpsEnrolled()) { boolean changed = mLockIcon.getVisibility() == GONE; mLockIcon.setVisibility(GONE); return changed; } + boolean onAodOrDocked = mStatusBarStateController.isDozing() || mDocked; - boolean invisible = onAodOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance; + boolean invisible = onAodOrDocked || mWakeAndUnlockRunning || mShowingLaunchAffordance + || (mKeyguardSecurityModel.getSecurityMode(KeyguardUpdateMonitor.getCurrentUser()) + == KeyguardSecurityModel.SecurityMode.None); boolean fingerprintOrBypass = mFingerprintUnlock || mKeyguardBypassController.getBypassEnabled(); if (fingerprintOrBypass && !mBouncerShowingScrimmed) { @@ -559,11 +570,6 @@ public class LockscreenLockIconController { invisible = true; } } - - if (mLockIcon == null) { - return false; - } - return mLockIcon.updateIconVisibility(!invisible); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java index ade329011b7d..02143a750cae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/appops/AppOpsControllerTest.java @@ -150,7 +150,7 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.onOpActiveChanged( AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); mTestableLooper.processAllMessages(); verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true); @@ -204,7 +204,8 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.onOpActiveChanged(AppOpsManager.OP_CAMERA, TEST_UID, TEST_PACKAGE_NAME, true); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, - TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); + TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.OP_FLAG_SELF, + AppOpsManager.MODE_ALLOWED); assertEquals(3, mController.getActiveAppOps().size()); } @@ -215,7 +216,8 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.onOpActiveChanged(AppOpsManager.OP_CAMERA, TEST_UID_OTHER, TEST_PACKAGE_NAME, true); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, - TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED); + TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.OP_FLAG_SELF, + AppOpsManager.MODE_ALLOWED); assertEquals(2, mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID)).size()); assertEquals(1, @@ -246,7 +248,7 @@ public class AppOpsControllerTest extends SysuiTestCase { public void opNotedScheduledForRemoval() { mController.setBGHandler(mMockHandler); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); verify(mMockHandler).scheduleRemoval(any(AppOpItem.class), anyLong()); } @@ -258,7 +260,7 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.onOpActiveChanged(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); assertFalse(mController.getActiveAppOps().isEmpty()); mController.setListening(false); @@ -272,9 +274,9 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.setBGHandler(mMockHandler); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); // Only one post to notify subscribers verify(mMockHandler, times(1)).post(any()); @@ -288,9 +290,9 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.setBGHandler(mMockHandler); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); // Only one post to notify subscribers verify(mMockHandler, times(2)).scheduleRemoval(any(), anyLong()); @@ -308,7 +310,7 @@ public class AppOpsControllerTest extends SysuiTestCase { AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); // Check that we "scheduled" the removal. Don't actually schedule until we are ready to // process messages at a later time. @@ -337,7 +339,7 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); mController.onOpActiveChanged( AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true); @@ -366,7 +368,7 @@ public class AppOpsControllerTest extends SysuiTestCase { mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); mController.onOpActiveChanged( AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true); @@ -384,7 +386,7 @@ public class AppOpsControllerTest extends SysuiTestCase { AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, true); mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME, - AppOpsManager.MODE_ALLOWED); + AppOpsManager.OP_FLAG_SELF, AppOpsManager.MODE_ALLOWED); mTestableLooper.processAllMessages(); verify(mCallback).onActiveStateChanged( diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java index aca34242e5fa..1ac793730f02 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LockscreenIconControllerTest.java @@ -30,6 +30,7 @@ import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.internal.widget.LockPatternUtils; +import com.android.keyguard.KeyguardSecurityModel; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; import com.android.systemui.dock.DockManager; @@ -80,6 +81,8 @@ public class LockscreenIconControllerTest extends SysuiTestCase { private Resources mResources; @Mock private HeadsUpManagerPhone mHeadsUpManagerPhone; + @Mock + private KeyguardSecurityModel mKeyguardSecurityModel; private LockscreenLockIconController mLockIconController; private OnAttachStateChangeListener mOnAttachStateChangeListener; @@ -94,7 +97,7 @@ public class LockscreenIconControllerTest extends SysuiTestCase { mShadeController, mAccessibilityController, mKeyguardIndicationController, mStatusBarStateController, mConfigurationController, mNotificationWakeUpCoordinator, mKeyguardBypassController, mDockManager, mKeyguardStateController, mResources, - mHeadsUpManagerPhone); + mHeadsUpManagerPhone, mKeyguardSecurityModel); ArgumentCaptor<OnAttachStateChangeListener> onAttachStateChangeListenerArgumentCaptor = ArgumentCaptor.forClass(OnAttachStateChangeListener.class); @@ -139,6 +142,15 @@ public class LockscreenIconControllerTest extends SysuiTestCase { sBStateListenerCaptor.getValue().onDozingChanged(true); verify(mLockIcon).updateIconVisibility(false); + } + + @Test + public void testVisibility_noBouncer() { + // no security (ie: no lock screen OR swipe to unlock) + when(mKeyguardSecurityModel.getSecurityMode(anyInt())).thenReturn( + KeyguardSecurityModel.SecurityMode.None); + mOnAttachStateChangeListener.onViewAttachedToWindow(mLockIcon); + verify(mLockIcon).updateIconVisibility(false); } } diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 0a80b02a964c..e6e52de0440f 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -40,6 +40,7 @@ import android.bluetooth.BluetoothDevice; import android.companion.Association; import android.companion.AssociationRequest; import android.companion.CompanionDeviceManager; +import android.companion.DeviceNotAssociatedException; import android.companion.ICompanionDeviceDiscoveryService; import android.companion.ICompanionDeviceManager; import android.companion.IFindDeviceCallback; @@ -486,6 +487,43 @@ public class CompanionDeviceManagerService extends SystemService implements Bind a -> Objects.equals(a.getDeviceMacAddress(), macAddress)); } + @Override + public void registerDevicePresenceListenerService( + String packageName, String deviceAddress) + throws RemoteException { + checkCanRegisterObserverService(packageName, deviceAddress); + + //TODO(eugenesusla) implement + } + + @Override + public void unregisterDevicePresenceListenerService( + String packageName, String deviceAddress) + throws RemoteException { + checkCanRegisterObserverService(packageName, deviceAddress); + + //TODO(eugenesusla) implement + } + + private void checkCanRegisterObserverService(String packageName, String deviceAddress) + throws RemoteException { + getContext().enforceCallingOrSelfPermission( + android.Manifest.permission.REQUEST_OBSERVE_COMPANION_DEVICE_PRESENCE, + "[un]registerDevicePresenceListenerService"); + checkCallerIsSystemOr(packageName); + + int userId = getCallingUserId(); + Set<Association> deviceAssociations = CollectionUtils.filter( + getAllAssociations(userId, packageName), + association -> deviceAddress.equals(association.getDeviceMacAddress())); + + if (deviceAssociations.isEmpty()) { + throw new RemoteException(new DeviceNotAssociatedException("App " + packageName + + " is not associated with device " + deviceAddress + + " for user " + userId)); + } + } + private void checkCanCallNotificationApi(String callingPackage) throws RemoteException { checkCallerIsSystemOr(callingPackage); int userId = getCallingUserId(); diff --git a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java index 4d9680c785bc..aa56da5773e9 100644 --- a/services/core/java/com/android/server/BluetoothAirplaneModeListener.java +++ b/services/core/java/com/android/server/BluetoothAirplaneModeListener.java @@ -119,7 +119,9 @@ class BluetoothAirplaneModeListener { } return; } - mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager); + if (mAirplaneHelper != null) { + mAirplaneHelper.onAirplaneModeChanged(mBluetoothManager); + } } @VisibleForTesting diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index 0a684287849a..dc24ffdb936d 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -1275,7 +1275,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { @Override public boolean bindBluetoothProfileService(int bluetoothProfile, IBluetoothProfileServiceConnection proxy) { - if (!mEnable) { + if (mState != BluetoothAdapter.STATE_ON) { if (DBG) { Slog.d(TAG, "Trying to bind to profile: " + bluetoothProfile + ", while Bluetooth was disabled"); @@ -1441,7 +1441,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mBluetoothLock.readLock().unlock(); } - if (!mEnable || state != BluetoothAdapter.STATE_ON) { + if (state != BluetoothAdapter.STATE_ON) { if (DBG) { Slog.d(TAG, "Unable to bindService while Bluetooth is disabled"); } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 7ebe05695d5d..f87892950a00 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -5579,11 +5579,12 @@ public class ConnectivityService extends IConnectivityManager.Stub } private boolean checkUnsupportedStartingFrom(int version, String callingPackageName) { - final PackageManager pm = mContext.getPackageManager(); - final int userId = UserHandle.getCallingUserId(); + final UserHandle user = UserHandle.getUserHandleForUid(Binder.getCallingUid()); + final PackageManager pm = + mContext.createContextAsUser(user, 0 /* flags */).getPackageManager(); try { - final int callingVersion = pm.getApplicationInfoAsUser( - callingPackageName, 0 /* flags */, userId).targetSdkVersion; + final int callingVersion = pm.getApplicationInfo( + callingPackageName, 0 /* flags */).targetSdkVersion; if (callingVersion < version) return false; } catch (PackageManager.NameNotFoundException e) { } return true; diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index 733590c4f6c6..a10764b9956c 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -10,8 +10,11 @@ per-file ZramWriteback.java = minchan@google.com, rajekumar@google.com, srnvs@go # Userspace reboot per-file UserspaceRebootLogger.java = ioffe@google.com, tomcherry@google.com +# Sensor Privacy +per-file SensorPrivacyService.java = file:platform/frameworks/native:/libs/sensorprivacy/OWNERS + per-file *Alarm* = file:/apex/jobscheduler/OWNERS -per-file *AppOps* = file:/core/java/android/permission/OWNERS +per-file *AppOp* = file:/core/java/android/permission/OWNERS per-file *Bluetooth* = file:/core/java/android/bluetooth/OWNERS per-file *Gnss* = file:/services/core/java/com/android/server/location/OWNERS per-file *Location* = file:/services/core/java/com/android/server/location/OWNERS diff --git a/services/core/java/com/android/server/SensorPrivacyService.java b/services/core/java/com/android/server/SensorPrivacyService.java index 938a3d283ca4..010213453940 100644 --- a/services/core/java/com/android/server/SensorPrivacyService.java +++ b/services/core/java/com/android/server/SensorPrivacyService.java @@ -16,6 +16,9 @@ package com.android.server; +import static android.app.AppOpsManager.MODE_ALLOWED; +import static android.app.AppOpsManager.OP_CAMERA; +import static android.app.AppOpsManager.OP_RECORD_AUDIO; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.service.SensorPrivacyIndividualEnabledSensorProto.CAMERA; import static android.service.SensorPrivacyIndividualEnabledSensorProto.MICROPHONE; @@ -23,7 +26,16 @@ import static android.service.SensorPrivacyIndividualEnabledSensorProto.UNKNOWN; import android.annotation.NonNull; import android.annotation.Nullable; +import android.app.AppOpsManager; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.drawable.Icon; import android.hardware.ISensorPrivacyListener; import android.hardware.ISensorPrivacyManager; import android.hardware.SensorPrivacyManager; @@ -78,6 +90,12 @@ public final class SensorPrivacyService extends SystemService { private static final String XML_ATTRIBUTE_ENABLED = "enabled"; private static final String XML_ATTRIBUTE_SENSOR = "sensor"; + private static final String SENSOR_PRIVACY_CHANNEL_ID = Context.SENSOR_PRIVACY_SERVICE; + private static final String ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY = + SensorPrivacyService.class.getName() + ".action.disable_sensor_privacy"; + private static final String EXTRA_SENSOR = SensorPrivacyService.class.getName() + + ".extra.sensor"; + private final SensorPrivacyServiceImpl mSensorPrivacyServiceImpl; public SensorPrivacyService(Context context) { @@ -90,7 +108,8 @@ public final class SensorPrivacyService extends SystemService { publishBinderService(Context.SENSOR_PRIVACY_SERVICE, mSensorPrivacyServiceImpl); } - class SensorPrivacyServiceImpl extends ISensorPrivacyManager.Stub { + class SensorPrivacyServiceImpl extends ISensorPrivacyManager.Stub implements + AppOpsManager.OnOpNotedListener, AppOpsManager.OnOpStartedListener { private final SensorPrivacyHandler mHandler; private final Context mContext; @@ -110,6 +129,98 @@ public final class SensorPrivacyService extends SystemService { synchronized (mLock) { readPersistedSensorPrivacyStateLocked(); } + + int[] micAndCameraOps = new int[]{OP_RECORD_AUDIO, OP_CAMERA}; + AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class); + appOpsManager.startWatchingNoted(micAndCameraOps, this); + appOpsManager.startWatchingStarted(micAndCameraOps, this); + + mContext.registerReceiver(new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + setIndividualSensorPrivacy(intent.getIntExtra(EXTRA_SENSOR, UNKNOWN), false); + } + }, new IntentFilter(ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY)); + } + + @Override + public void onOpStarted(int code, int uid, String packageName, + @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result) { + onOpNoted(code, uid, packageName, flags, result); + } + + @Override + public void onOpNoted(int code, int uid, String packageName, + @AppOpsManager.OpFlags int flags, @AppOpsManager.Mode int result) { + if (result != MODE_ALLOWED || (flags & AppOpsManager.OP_FLAGS_ALL_TRUSTED) == 0) { + return; + } + + int sensor; + if (code == OP_RECORD_AUDIO) { + sensor = MICROPHONE; + } else { + sensor = CAMERA; + } + + onSensorUseStarted(uid, packageName, sensor); + } + + /** + * Called when a sensor protected by individual sensor privacy is attempting to get used. + * + * @param uid The uid of the app using the sensor + * @param packageName The package name of the app using the sensor + * @param sensor The sensor that is attempting to be used + */ + private void onSensorUseStarted(int uid, String packageName, int sensor) { + if (!isIndividualSensorPrivacyEnabled(sensor)) { + return; + } + + // TODO moltmann: Use dialog instead of notification if we can determine the activity + // which triggered this usage + + // TODO evanseverson: - Implement final UX for notification + // - Finalize strings and icons and add as resources + + int icon; + CharSequence notificationMessage; + if (sensor == MICROPHONE) { + icon = com.android.internal.R.drawable.ic_mic; + notificationMessage = "Microphone is muted because of sensor privacy"; + } else { + icon = com.android.internal.R.drawable.ic_camera; + notificationMessage = "Camera is blocked because of sensor privacy"; + } + + NotificationManager notificationManager = + mContext.getSystemService(NotificationManager.class); + NotificationChannel channel = new NotificationChannel( + SENSOR_PRIVACY_CHANNEL_ID, "Sensor privacy", + NotificationManager.IMPORTANCE_HIGH); + channel.setSound(null, null); + channel.setBypassDnd(true); + channel.enableVibration(false); + channel.setBlockable(false); + + notificationManager.createNotificationChannel(channel); + + notificationManager.notify(sensor, + new Notification.Builder(mContext, SENSOR_PRIVACY_CHANNEL_ID) + .setContentTitle(notificationMessage) + .setSmallIcon(icon) + .addAction(new Notification.Action.Builder( + Icon.createWithResource(mContext, icon), + "Disable sensor privacy", + PendingIntent.getBroadcast(mContext, sensor, + new Intent(ACTION_DISABLE_INDIVIDUAL_SENSOR_PRIVACY) + .setPackage(mContext.getPackageName()) + .putExtra(EXTRA_SENSOR, sensor), + PendingIntent.FLAG_IMMUTABLE + | PendingIntent.FLAG_UPDATE_CURRENT)) + .build()) + .build()); } /** @@ -130,6 +241,15 @@ public final class SensorPrivacyService extends SystemService { enforceSensorPrivacyPermission(); synchronized (mLock) { mIndividualEnabled.put(sensor, enable); + + if (!enable) { + // Remove any notifications prompting the user to disable sensory privacy + NotificationManager notificationManager = + mContext.getSystemService(NotificationManager.class); + + notificationManager.cancel(sensor); + } + persistSensorPrivacyState(); } } diff --git a/services/core/java/com/android/server/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java index 75ebe70591df..655d8abf3e84 100644 --- a/services/core/java/com/android/server/TestNetworkService.java +++ b/services/core/java/com/android/server/TestNetworkService.java @@ -61,9 +61,8 @@ import java.util.concurrent.atomic.AtomicInteger; /** @hide */ class TestNetworkService extends ITestNetworkManager.Stub { - @NonNull private static final String TAG = TestNetworkService.class.getSimpleName(); @NonNull private static final String TEST_NETWORK_LOGTAG = "TestNetworkAgent"; - @NonNull private static final String TEST_NETWORK_PROVIDER_NAME = TAG; + @NonNull private static final String TEST_NETWORK_PROVIDER_NAME = "TestNetworkProvider"; @NonNull private static final AtomicInteger sTestTunIndex = new AtomicInteger(); @NonNull private final Context mContext; @@ -168,17 +167,15 @@ class TestNetworkService extends ITestNetworkManager.Stub { private TestNetworkAgent( @NonNull Context context, @NonNull Looper looper, - @NonNull NetworkAgentConfig config, @NonNull NetworkCapabilities nc, @NonNull LinkProperties lp, + @NonNull NetworkAgentConfig config, int uid, @NonNull IBinder binder, @NonNull NetworkProvider np) throws RemoteException { super(context, looper, TEST_NETWORK_LOGTAG, nc, lp, NETWORK_SCORE, config, np); - mUid = uid; - synchronized (mBinderLock) { mBinder = binder; // Binder null-checks in create() @@ -286,8 +283,8 @@ class TestNetworkService extends ITestNetworkManager.Stub { lp.addRoute(new RouteInfo(new IpPrefix(Inet6Address.ANY, 0), null, iface)); } - final TestNetworkAgent agent = new TestNetworkAgent(context, looper, - new NetworkAgentConfig.Builder().build(), nc, lp, callingUid, binder, + final TestNetworkAgent agent = new TestNetworkAgent(context, looper, nc, lp, + new NetworkAgentConfig.Builder().build(), callingUid, binder, mNetworkProvider); agent.register(); agent.markConnected(); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index c364c8463f1b..4872efdce88b 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1859,7 +1859,7 @@ public final class ActiveServices { private final AppOpsManager.OnOpNotedListener mOpNotedCallback = new AppOpsManager.OnOpNotedListener() { @Override - public void onOpNoted(int op, int uid, String pkgName, int result) { + public void onOpNoted(int op, int uid, String pkgName, int flags, int result) { incrementOpCountIfNeeded(op, uid, result); } }; @@ -1867,7 +1867,8 @@ public final class ActiveServices { private final AppOpsManager.OnOpStartedListener mOpStartedCallback = new AppOpsManager.OnOpStartedListener() { @Override - public void onOpStarted(int op, int uid, String pkgName, int result) { + public void onOpStarted(int op, int uid, String pkgName, int flags, + int result) { incrementOpCountIfNeeded(op, uid, result); } }; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 2f4373cf473a..10102cd12346 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -174,6 +174,7 @@ import android.app.ProfilerInfo; import android.app.WaitResult; import android.app.backup.BackupManager.OperationType; import android.app.backup.IBackupManager; +import android.app.compat.CompatChanges; import android.app.usage.UsageEvents; import android.app.usage.UsageEvents.Event; import android.app.usage.UsageStatsManager; @@ -13713,6 +13714,37 @@ public class ActivityManagerService extends IActivityManager.Stub forceStopPackageLocked(packageName, -1, false, true, true, false, false, userId, "package unstartable"); break; + case Intent.ACTION_CLOSE_SYSTEM_DIALOGS: + if (!canCloseSystemDialogs(callingPid, callingUid, callerApp)) { + // The app can't close system dialogs, throw only if it targets S+ + if (CompatChanges.isChangeEnabled( + ActivityManager.LOCK_DOWN_CLOSE_SYSTEM_DIALOGS, callingUid)) { + throw new SecurityException( + "Permission Denial: " + Intent.ACTION_CLOSE_SYSTEM_DIALOGS + + " broadcast from " + callerPackage + " (pid=" + + callingPid + ", uid=" + callingUid + ")" + + " requires " + + permission.BROADCAST_CLOSE_SYSTEM_DIALOGS + "."); + } else if (CompatChanges.isChangeEnabled( + ActivityManager.DROP_CLOSE_SYSTEM_DIALOGS, callingUid)) { + Slog.w(TAG, "Permission Denial: " + intent.getAction() + + " broadcast from " + callerPackage + " (pid=" + callingPid + + ", uid=" + callingUid + ")" + + " requires " + + permission.BROADCAST_CLOSE_SYSTEM_DIALOGS + + ", dropping broadcast."); + // Returning success seems to be the pattern here + return ActivityManager.BROADCAST_SUCCESS; + } else { + Slog.w(TAG, intent.getAction() + + " broadcast from " + callerPackage + " (pid=" + callingPid + + ", uid=" + callingUid + ")" + + " will require " + + permission.BROADCAST_CLOSE_SYSTEM_DIALOGS + + " in future builds."); + } + } + break; } if (Intent.ACTION_PACKAGE_ADDED.equals(action) || @@ -14005,6 +14037,32 @@ public class ActivityManagerService extends IActivityManager.Stub return ActivityManager.BROADCAST_SUCCESS; } + private boolean canCloseSystemDialogs(int pid, int uid, @Nullable ProcessRecord callerApp) { + if (checkPermission(permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, pid, uid) + == PERMISSION_GRANTED) { + return true; + } + if (callerApp == null) { + synchronized (mPidsSelfLocked) { + callerApp = mPidsSelfLocked.get(pid); + } + } + // Check if the instrumentation of the process has the permission. This covers the usual + // test started from the shell (which has the permission) case. This is needed for apps + // targeting SDK level < S but we are also allowing for targetSdk S+ as a convenience to + // avoid breaking a bunch of existing tests and asking them to adopt shell permissions to do + // this. + if (callerApp != null) { + ActiveInstrumentation instrumentation = callerApp.getActiveInstrumentation(); + if (instrumentation != null && checkPermission( + permission.BROADCAST_CLOSE_SYSTEM_DIALOGS, -1, instrumentation.mSourceUid) + == PERMISSION_GRANTED) { + return true; + } + } + return false; + } + /** * @return uid from the extra field {@link Intent#EXTRA_UID} if present, Otherwise -1 */ diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 0b4d27f4990b..f2c1e90e2476 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -756,8 +756,9 @@ class AppErrors { boolean handleAppCrashLocked(ProcessRecord app, String reason, String shortMsg, String longMsg, String stackTrace, AppErrorDialog.Data data) { final long now = SystemClock.uptimeMillis(); - final boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0; + final boolean showBackground = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.ANR_SHOW_BACKGROUND, 0, + mService.mUserController.getCurrentUserId()) != 0; final boolean procIsBoundForeground = (app.getCurProcState() == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); @@ -889,8 +890,9 @@ class AppErrors { void handleShowAppErrorUi(Message msg) { AppErrorDialog.Data data = (AppErrorDialog.Data) msg.obj; - boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0; + boolean showBackground = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.ANR_SHOW_BACKGROUND, 0, + mService.mUserController.getCurrentUserId()) != 0; final int userId; synchronized (mService) { @@ -982,8 +984,9 @@ class AppErrors { return; } - boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0; + boolean showBackground = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.ANR_SHOW_BACKGROUND, 0, + mService.mUserController.getCurrentUserId()) != 0; if (mService.mAtmInternal.canShowErrorDialogs() || showBackground) { proc.getDialogController().showAnrDialogs(data); } else { diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index d4e2d27ca7a1..4da78252bccb 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -3090,7 +3090,7 @@ public class AppOpsService extends IAppOpsService.Stub { final Ops ops = getOpsLocked(uid, packageName, attributionTag, bypass, true /* edit */); if (ops == null) { - scheduleOpNotedIfNeededLocked(code, uid, packageName, + scheduleOpNotedIfNeededLocked(code, uid, packageName, flags, AppOpsManager.MODE_IGNORED); if (DEBUG) Slog.d(TAG, "noteOperation: no op for code " + code + " uid " + uid + " package " + packageName); @@ -3098,7 +3098,7 @@ public class AppOpsService extends IAppOpsService.Stub { } final Op op = getOpLocked(ops, code, uid, true); if (isOpRestrictedLocked(uid, code, packageName, bypass)) { - scheduleOpNotedIfNeededLocked(code, uid, packageName, + scheduleOpNotedIfNeededLocked(code, uid, packageName, flags, AppOpsManager.MODE_IGNORED); return AppOpsManager.MODE_IGNORED; } @@ -3120,7 +3120,7 @@ public class AppOpsService extends IAppOpsService.Stub { + switchCode + " (" + code + ") uid " + uid + " package " + packageName); attributedOp.rejected(uidState.state, flags); - scheduleOpNotedIfNeededLocked(code, uid, packageName, uidMode); + scheduleOpNotedIfNeededLocked(code, uid, packageName, flags, uidMode); return uidMode; } } else { @@ -3132,7 +3132,7 @@ public class AppOpsService extends IAppOpsService.Stub { + switchCode + " (" + code + ") uid " + uid + " package " + packageName); attributedOp.rejected(uidState.state, flags); - scheduleOpNotedIfNeededLocked(code, uid, packageName, mode); + scheduleOpNotedIfNeededLocked(code, uid, packageName, flags, mode); return mode; } } @@ -3142,7 +3142,8 @@ public class AppOpsService extends IAppOpsService.Stub { + packageName + (attributionTag == null ? "" : "." + attributionTag)); } - scheduleOpNotedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_ALLOWED); + scheduleOpNotedIfNeededLocked(code, uid, packageName, flags, + AppOpsManager.MODE_ALLOWED); attributedOp.accessed(proxyUid, proxyPackageName, proxyAttributionTag, uidState.state, flags); @@ -3545,7 +3546,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (ops == null) { if (!dryRun) { scheduleOpStartedIfNeededLocked(code, uid, packageName, - AppOpsManager.MODE_IGNORED); + flags, AppOpsManager.MODE_IGNORED); } if (DEBUG) Slog.d(TAG, "startOperation: no op for code " + code + " uid " + uid + " package " + packageName); @@ -3555,7 +3556,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (isOpRestrictedLocked(uid, code, packageName, bypass)) { if (!dryRun) { scheduleOpStartedIfNeededLocked(code, uid, packageName, - AppOpsManager.MODE_IGNORED); + flags, AppOpsManager.MODE_IGNORED); } return AppOpsManager.MODE_IGNORED; } @@ -3575,7 +3576,7 @@ public class AppOpsService extends IAppOpsService.Stub { } if (!dryRun) { attributedOp.rejected(uidState.state, flags); - scheduleOpStartedIfNeededLocked(code, uid, packageName, uidMode); + scheduleOpStartedIfNeededLocked(code, uid, packageName, flags, uidMode); } return uidMode; } @@ -3590,7 +3591,7 @@ public class AppOpsService extends IAppOpsService.Stub { + packageName); if (!dryRun) { attributedOp.rejected(uidState.state, flags); - scheduleOpStartedIfNeededLocked(code, uid, packageName, mode); + scheduleOpStartedIfNeededLocked(code, uid, packageName, flags, mode); } return mode; } @@ -3598,7 +3599,8 @@ public class AppOpsService extends IAppOpsService.Stub { if (DEBUG) Slog.d(TAG, "startOperation: allowing code " + code + " uid " + uid + " package " + packageName); if (!dryRun) { - scheduleOpStartedIfNeededLocked(code, uid, packageName, AppOpsManager.MODE_ALLOWED); + scheduleOpStartedIfNeededLocked(code, uid, packageName, flags, + AppOpsManager.MODE_ALLOWED); try { attributedOp.started(clientId, proxyUid, proxyPackageName, proxyAttributionTag, uidState.state, flags); @@ -3736,7 +3738,8 @@ public class AppOpsService extends IAppOpsService.Stub { } } - private void scheduleOpStartedIfNeededLocked(int code, int uid, String pkgName, int result) { + private void scheduleOpStartedIfNeededLocked(int code, int uid, String pkgName, + @OpFlags int flags, @Mode int result) { ArraySet<StartedCallback> dispatchedCallbacks = null; final int callbackListCount = mStartedWatchers.size(); for (int i = 0; i < callbackListCount; i++) { @@ -3761,18 +3764,18 @@ public class AppOpsService extends IAppOpsService.Stub { mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpStarted, - this, dispatchedCallbacks, code, uid, pkgName, result)); + this, dispatchedCallbacks, code, uid, pkgName, flags, result)); } private void notifyOpStarted(ArraySet<StartedCallback> callbacks, - int code, int uid, String packageName, int result) { + int code, int uid, String packageName, @OpFlags int flags, @Mode int result) { final long identity = Binder.clearCallingIdentity(); try { final int callbackCount = callbacks.size(); for (int i = 0; i < callbackCount; i++) { final StartedCallback callback = callbacks.valueAt(i); try { - callback.mCallback.opStarted(code, uid, packageName, result); + callback.mCallback.opStarted(code, uid, packageName, flags, result); } catch (RemoteException e) { /* do nothing */ } @@ -3783,7 +3786,7 @@ public class AppOpsService extends IAppOpsService.Stub { } private void scheduleOpNotedIfNeededLocked(int code, int uid, String packageName, - int result) { + @OpFlags int flags, @Mode int result) { ArraySet<NotedCallback> dispatchedCallbacks = null; final int callbackListCount = mNotedWatchers.size(); for (int i = 0; i < callbackListCount; i++) { @@ -3804,11 +3807,11 @@ public class AppOpsService extends IAppOpsService.Stub { } mHandler.sendMessage(PooledLambda.obtainMessage( AppOpsService::notifyOpChecked, - this, dispatchedCallbacks, code, uid, packageName, result)); + this, dispatchedCallbacks, code, uid, packageName, flags, result)); } private void notifyOpChecked(ArraySet<NotedCallback> callbacks, - int code, int uid, String packageName, int result) { + int code, int uid, String packageName, @OpFlags int flags, @Mode int result) { // There are features watching for checks in our process. The callbacks in // these features may require permissions our remote caller does not have. final long identity = Binder.clearCallingIdentity(); @@ -3817,7 +3820,7 @@ public class AppOpsService extends IAppOpsService.Stub { for (int i = 0; i < callbackCount; i++) { final NotedCallback callback = callbacks.valueAt(i); try { - callback.mCallback.opNoted(code, uid, packageName, result); + callback.mCallback.opNoted(code, uid, packageName, flags, result); } catch (RemoteException e) { /* do nothing */ } diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java index 4c63eb488118..d507b5f82bd0 100644 --- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java +++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java @@ -35,7 +35,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageManagerInternal; -import android.content.pm.UserInfo; import android.net.INetd; import android.net.UidRange; import android.os.Build; @@ -174,11 +173,9 @@ public class PermissionMonitor implements PackageManagerInternal.PackageListObse netdPermsUids.put(uid, netdPermsUids.get(uid) | otherNetdPerms); } - List<UserInfo> users = mUserManager.getAliveUsers(); - if (users != null) { - for (UserInfo user : users) { - mUsers.add(user.id); - } + final List<UserHandle> users = mUserManager.getUserHandles(true /* excludeDying */); + for (UserHandle user : users) { + mUsers.add(user.getIdentifier()); } final SparseArray<ArraySet<String>> systemPermission = diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 5cb0994c5cb2..66bb4d704e80 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1253,7 +1253,7 @@ public class Vpn { final PackageManager packageManager = mUserIdContext.getPackageManager(); if (packageManager == null) { - throw new UnsupportedOperationException("Cannot get PackageManager."); + throw new IllegalStateException("Cannot get PackageManager."); } final ResolveInfo info = packageManager.resolveService(intent, 0 /* flags */); if (info == null) { diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java index d4a19d6bc366..2c7cd5bce514 100644 --- a/services/core/java/com/android/server/display/DisplayManagerService.java +++ b/services/core/java/com/android/server/display/DisplayManagerService.java @@ -403,7 +403,7 @@ public final class DisplayManagerService extends SystemService { mUiHandler = UiThread.getHandler(); mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore); mLogicalDisplayMapper = new LogicalDisplayMapper(context, mDisplayDeviceRepo, - new LogicalDisplayListener(), mPersistentDataStore); + new LogicalDisplayListener()); mDisplayModeDirector = new DisplayModeDirector(context, mHandler); Resources resources = mContext.getResources(); mDefaultDisplayDefaultColorMode = mContext.getResources().getInteger( diff --git a/services/core/java/com/android/server/display/LogicalDisplayMapper.java b/services/core/java/com/android/server/display/LogicalDisplayMapper.java index cdcbb4f123a1..a12785889bd3 100644 --- a/services/core/java/com/android/server/display/LogicalDisplayMapper.java +++ b/services/core/java/com/android/server/display/LogicalDisplayMapper.java @@ -20,13 +20,13 @@ import android.content.Context; import android.os.Process; import android.os.SystemProperties; import android.text.TextUtils; +import android.util.IndentingPrintWriter; import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DisplayEventReceiver; import android.view.DisplayInfo; -import com.android.internal.util.IndentingPrintWriter; import java.io.PrintWriter; import java.util.Arrays; @@ -102,13 +102,10 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { private final SparseArray<DisplayGroup> mDisplayGroups = new SparseArray<>(); private final DisplayDeviceRepository mDisplayDeviceRepo; - private final PersistentDataStore mPersistentDataStore; private final Listener mListener; - LogicalDisplayMapper(Context context, DisplayDeviceRepository repo, Listener listener, - PersistentDataStore persistentDataStore) { + LogicalDisplayMapper(Context context, DisplayDeviceRepository repo, Listener listener) { mDisplayDeviceRepo = repo; - mPersistentDataStore = persistentDataStore; mListener = listener; mSingleDisplayDemoMode = SystemProperties.getBoolean("persist.demo.singledisplay", false); mDisplayDeviceRepo.addListener(this); @@ -238,7 +235,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { // Find the associated LogicalDisplays for the configured "folding" DeviceDisplays. final LogicalDisplay displayFolded = getLocked(deviceFolded); final LogicalDisplay displayUnfolded = getLocked(deviceUnfolded); - if (displayFolded == null || displayFolded == null) { + if (displayFolded == null || displayUnfolded == null) { // If the expected displays are not present, return early. return; } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index 0e196f278ddf..52121f352783 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -623,6 +623,14 @@ abstract class HdmiCecLocalDevice { return false; } + if (isPowerOffOrToggleCommand(message) || isPowerOnOrToggleCommand(message)) { + // Power commands should already be handled above. Don't continue and convert the CEC + // keycode to Android keycode. + // Do not <Feature Abort> as the local device should already be in the correct power + // state. + return true; + } + final long downTime = SystemClock.uptimeMillis(); final byte[] params = message.getParams(); final int keycode = HdmiCecKeycode.cecKeycodeAndParamsToAndroidKey(params); diff --git a/services/core/java/com/android/server/location/LocationManagerService.java b/services/core/java/com/android/server/location/LocationManagerService.java index 3854f8c8ff76..324332f1e134 100644 --- a/services/core/java/com/android/server/location/LocationManagerService.java +++ b/services/core/java/com/android/server/location/LocationManagerService.java @@ -519,9 +519,6 @@ public class LocationManagerService extends ILocationManager.Stub { public List<String> getAllProviders() { ArrayList<String> providers = new ArrayList<>(mProviderManagers.size()); for (LocationProviderManager manager : mProviderManagers) { - if (FUSED_PROVIDER.equals(manager.getName())) { - continue; - } providers.add(manager.getName()); } return providers; @@ -538,9 +535,6 @@ public class LocationManagerService extends ILocationManager.Stub { ArrayList<String> providers = new ArrayList<>(mProviderManagers.size()); for (LocationProviderManager manager : mProviderManagers) { String name = manager.getName(); - if (FUSED_PROVIDER.equals(name)) { - continue; - } if (enabledOnly && !manager.isEnabled(UserHandle.getCallingUserId())) { continue; } @@ -565,7 +559,9 @@ public class LocationManagerService extends ILocationManager.Stub { } if (!providers.isEmpty()) { - if (providers.contains(GPS_PROVIDER)) { + if (providers.contains(FUSED_PROVIDER)) { + return FUSED_PROVIDER; + } else if (providers.contains(GPS_PROVIDER)) { return GPS_PROVIDER; } else if (providers.contains(NETWORK_PROVIDER)) { return NETWORK_PROVIDER; @@ -1046,10 +1042,6 @@ public class LocationManagerService extends ILocationManager.Stub { @Override public boolean isProviderEnabledForUser(String provider, int userId) { - // fused provider is accessed indirectly via criteria rather than the provider-based APIs, - // so we discourage its use - if (FUSED_PROVIDER.equals(provider)) return false; - return mLocalService.isProviderEnabledForUser(provider, userId); } diff --git a/services/core/java/com/android/server/location/OWNERS b/services/core/java/com/android/server/location/OWNERS index c2c95e6042de..696a0c22c605 100644 --- a/services/core/java/com/android/server/location/OWNERS +++ b/services/core/java/com/android/server/location/OWNERS @@ -1,8 +1 @@ -aadmal@google.com -arthuri@google.com -bduddie@google.com -gomo@google.com -sooniln@google.com -weiwa@google.com -wyattriley@google.com -yuhany@google.com +file:/location/java/android/location/OWNERS diff --git a/services/core/java/com/android/server/location/contexthub/OWNERS b/services/core/java/com/android/server/location/contexthub/OWNERS new file mode 100644 index 000000000000..d4393d6a83d2 --- /dev/null +++ b/services/core/java/com/android/server/location/contexthub/OWNERS @@ -0,0 +1,2 @@ +arthuri@google.com +bduddie@google.com diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java index 0ac0c8d95423..9f07695fcecf 100644 --- a/services/core/java/com/android/server/pm/ShortcutPackage.java +++ b/services/core/java/com/android/server/pm/ShortcutPackage.java @@ -737,7 +737,7 @@ class ShortcutPackage extends ShortcutPackageItem { || ((pinnedByCallerSet != null) && pinnedByCallerSet.contains(si.getId())); if (!getPinnedByAnyLauncher) { - if (si.isFloating()) { + if (si.isFloating() && !si.isCached()) { if (!isPinnedByCaller) { continue; } diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java index a098484b803b..7ca9f0536de1 100644 --- a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java +++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerInternal.java @@ -99,52 +99,6 @@ public interface LegacyPermissionManagerInternal { */ void scheduleReadDefaultPermissionExceptions(); - // TODO(zhanghai): The following methods should be moved to a new AIDL to support - // the legacy PermissionManager directly in a later CL. - - /** - * Grant default permissions to currently active LUI app - * @param packageName The package name for the LUI app - * @param userId The user ID - */ - void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId); - - /** - * Revoke default permissions to currently active LUI app - * @param packageNames The package names for the LUI apps - * @param userId The user ID - */ - void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId); - - /** - * Grant default permissions to currently active Ims services - * @param packageNames The package names for the Ims services - * @param userId The user ID - */ - void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId); - - /** - * Grant default permissions to currently enabled telephony data services - * @param packageNames The package name for the services - * @param userId The user ID - */ - void grantDefaultPermissionsToEnabledTelephonyDataServices(String[] packageNames, int userId); - - /** - * Revoke default permissions to currently active telephony data services - * @param packageNames The package name for the services - * @param userId The IDhandle - */ - void revokeDefaultPermissionsFromDisabledTelephonyDataServices(String[] packageNames, - int userId); - - /** - * Grant default permissions to currently enabled carrier apps - * @param packageNames Package names of the apps to be granted permissions - * @param userId The user ID - */ - void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId); - /** * Provider for package names. */ diff --git a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java index 0c0a8dfeaaec..f453d7460d9d 100644 --- a/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/LegacyPermissionManagerService.java @@ -17,16 +17,31 @@ package com.android.server.pm.permission; import android.annotation.NonNull; +import android.annotation.Nullable; +import android.app.AppOpsManager; +import android.app.admin.DevicePolicyManager; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Binder; +import android.os.Process; +import android.os.ServiceManager; +import android.os.UserHandle; +import android.permission.ILegacyPermissionManager; +import android.util.Log; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.pm.PackageManagerServiceUtils; /** * Legacy permission manager service. */ -public class LegacyPermissionManagerService { +public class LegacyPermissionManagerService extends ILegacyPermissionManager.Stub { + private static final String TAG = "PackageManager"; + + /** Injector that can be used to facilitate testing. */ + private final Injector mInjector; + @NonNull private final DefaultPermissionGrantPolicy mDefaultPermissionGrantPolicy; @@ -51,8 +66,126 @@ public class LegacyPermissionManagerService { } private LegacyPermissionManagerService(@NonNull Context context) { - mDefaultPermissionGrantPolicy = new DefaultPermissionGrantPolicy(context); + this(context, new Injector(context)); + LocalServices.addService(LegacyPermissionManagerInternal.class, new Internal()); + ServiceManager.addService("legacy_permission", this); + } + + @VisibleForTesting + LegacyPermissionManagerService(@NonNull Context context, @NonNull Injector injector) { + mInjector = injector; + mDefaultPermissionGrantPolicy = new DefaultPermissionGrantPolicy(context); + } + + @Override + public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message, + @Nullable String callingFeatureId, int pid, int uid) { + // If the check is being requested by an app then only allow the app to query its own + // access status. + int callingUid = mInjector.getCallingUid(); + int callingPid = mInjector.getCallingPid(); + if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID && (callingUid != uid + || callingPid != pid)) { + String response = String.format( + "Calling uid %d, pid %d cannot check device identifier access for package %s " + + "(uid=%d, pid=%d)", + callingUid, callingPid, packageName, uid, pid); + Log.w(TAG, response); + throw new SecurityException(response); + } + // Allow system and root access to the device identifiers. + final int appId = UserHandle.getAppId(uid); + if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) { + return PackageManager.PERMISSION_GRANTED; + } + // Allow access to packages that have the READ_PRIVILEGED_PHONE_STATE permission. + if (mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid, + uid) == PackageManager.PERMISSION_GRANTED) { + return PackageManager.PERMISSION_GRANTED; + } + // If the calling package is not null then perform the appop and device / profile owner + // check. + if (packageName != null) { + // Allow access to a package that has been granted the READ_DEVICE_IDENTIFIERS appop. + final long token = mInjector.clearCallingIdentity(); + AppOpsManager appOpsManager = (AppOpsManager) mInjector.getSystemService( + Context.APP_OPS_SERVICE); + try { + if (appOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS, uid, + packageName, callingFeatureId, message) == AppOpsManager.MODE_ALLOWED) { + return PackageManager.PERMISSION_GRANTED; + } + } finally { + mInjector.restoreCallingIdentity(token); + } + // Check if the calling packages meets the device / profile owner requirements for + // identifier access. + DevicePolicyManager devicePolicyManager = + (DevicePolicyManager) mInjector.getSystemService(Context.DEVICE_POLICY_SERVICE); + if (devicePolicyManager != null && devicePolicyManager.hasDeviceIdentifierAccess( + packageName, pid, uid)) { + return PackageManager.PERMISSION_GRANTED; + } + } + return PackageManager.PERMISSION_DENIED; + } + + @Override + public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "grantDefaultPermissionsToActiveLuiApp", callingUid); + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToActiveLuiApp(packageName, userId)); + } + + @Override + public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "revokeDefaultPermissionsFromLuiApps", callingUid); + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .revokeDefaultPermissionsFromLuiApps(packageNames, userId)); + } + + @Override + public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "grantDefaultPermissionsToEnabledImsServices", callingUid); + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToEnabledImsServices(packageNames, userId)); + } + + @Override + public void grantDefaultPermissionsToEnabledTelephonyDataServices( + String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "grantDefaultPermissionsToEnabledTelephonyDataServices", callingUid); + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToEnabledTelephonyDataServices(packageNames, userId)); + } + + @Override + public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( + String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "revokeDefaultPermissionsFromDisabledTelephonyDataServices", callingUid); + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .revokeDefaultPermissionsFromDisabledTelephonyDataServices(packageNames, + userId)); + } + + @Override + public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) { + final int callingUid = Binder.getCallingUid(); + PackageManagerServiceUtils.enforceSystemOrPhoneCaller( + "grantPermissionsToEnabledCarrierApps", callingUid); + Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy + .grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId)); } private class Internal implements LegacyPermissionManagerInternal { @@ -117,65 +250,74 @@ public class LegacyPermissionManagerService { public void scheduleReadDefaultPermissionExceptions() { mDefaultPermissionGrantPolicy.scheduleReadDefaultPermissionExceptions(); } + } + + /** + * Allows injection of services and method responses to facilitate testing. + * + * <p>Test classes can create a mock of this class and pass it to the PermissionManagerService + * constructor to control behavior of services and external methods during execution. + * @hide + */ + @VisibleForTesting + public static class Injector { + private final Context mContext; - // TODO(zhanghai): The following methods should be moved to a new AIDL to support - // the legacy PermissionManager directly in a later CL. + /** + * Public constructor that accepts a {@code context} within which to operate. + */ + public Injector(@NonNull Context context) { + mContext = context; + } - @Override - public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) { - final int callingUid = Binder.getCallingUid(); - PackageManagerServiceUtils.enforceSystemOrPhoneCaller( - "grantDefaultPermissionsToActiveLuiApp", callingUid); - Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy - .grantDefaultPermissionsToActiveLuiApp(packageName, userId)); + /** + * Returns the UID of the calling package. + */ + public int getCallingUid() { + return Binder.getCallingUid(); } - @Override - public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) { - final int callingUid = Binder.getCallingUid(); - PackageManagerServiceUtils.enforceSystemOrPhoneCaller( - "revokeDefaultPermissionsFromLuiApps", callingUid); - Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy - .revokeDefaultPermissionsFromLuiApps(packageNames, userId)); + /** + * Returns the process ID of the calling package. + */ + public int getCallingPid() { + return Binder.getCallingPid(); } - @Override - public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) { - final int callingUid = Binder.getCallingUid(); - PackageManagerServiceUtils.enforceSystemOrPhoneCaller( - "grantDefaultPermissionsToEnabledImsServices", callingUid); - Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy - .grantDefaultPermissionsToEnabledImsServices(packageNames, userId)); + /** + * Checks if the package running under the specified {@code pid} and {@code uid} has been + * granted the provided {@code permission}. + * + * @return {@link PackageManager#PERMISSION_GRANTED} if the package has been granted the + * permission, {@link PackageManager#PERMISSION_DENIED} otherwise + */ + public int checkPermission(@NonNull String permission, int pid, int uid) { + return mContext.checkPermission(permission, pid, uid); } - @Override - public void grantDefaultPermissionsToEnabledTelephonyDataServices( - String[] packageNames, int userId) { - final int callingUid = Binder.getCallingUid(); - PackageManagerServiceUtils.enforceSystemOrPhoneCaller( - "grantDefaultPermissionsToEnabledTelephonyDataServices", callingUid); - Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy - .grantDefaultPermissionsToEnabledTelephonyDataServices(packageNames, userId)); + /** + * Clears the calling identity to allow subsequent calls to be treated as coming from this + * package. + * + * @return a token that can be used to restore the calling identity + */ + public long clearCallingIdentity() { + return Binder.clearCallingIdentity(); } - @Override - public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( - String[] packageNames, int userId) { - final int callingUid = Binder.getCallingUid(); - PackageManagerServiceUtils.enforceSystemOrPhoneCaller( - "revokeDefaultPermissionsFromDisabledTelephonyDataServices", callingUid); - Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy - .revokeDefaultPermissionsFromDisabledTelephonyDataServices(packageNames, - userId)); + /** + * Restores the calling identity to that of the calling package based on the provided + * {@code token}. + */ + public void restoreCallingIdentity(long token) { + Binder.restoreCallingIdentity(token); } - @Override - public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) { - final int callingUid = Binder.getCallingUid(); - PackageManagerServiceUtils.enforceSystemOrPhoneCaller( - "grantPermissionsToEnabledCarrierApps", callingUid); - Binder.withCleanCallingIdentity(() -> mDefaultPermissionGrantPolicy - .grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId)); + /** + * Returns the system service with the provided {@code name}. + */ + public Object getSystemService(@NonNull String name) { + return mContext.getSystemService(name); } } } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index 1df51772f823..1dbf8396bcfb 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -66,9 +66,7 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.AppOpsManager; -import android.app.ApplicationPackageManager; import android.app.IActivityManager; -import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManagerInternal; import android.app.role.RoleManager; import android.compat.annotation.ChangeId; @@ -126,7 +124,6 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.compat.IPlatformCompat; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -264,9 +261,6 @@ public class PermissionManagerService extends IPermissionManager.Stub { @NonNull private final PermissionRegistry mRegistry = new PermissionRegistry(); - /** Injector that can be used to facilitate testing. */ - private final Injector mInjector; - @GuardedBy("mLock") @Nullable private ArraySet<String> mPrivappPermissionsViolations; @@ -364,17 +358,11 @@ public class PermissionManagerService extends IPermissionManager.Stub { }; PermissionManagerService(@NonNull Context context) { - this(context, new Injector(context)); - } - - @VisibleForTesting - PermissionManagerService(@NonNull Context context, @NonNull Injector injector) { - mInjector = injector; // The package info cache is the cache for package and permission information. // Disable the package info and package permission caches locally but leave the // checkPermission cache active. - mInjector.invalidatePackageInfoCache(); - mInjector.disablePackageNamePermissionCache(); + PackageManager.invalidatePackageInfoCache(); + PermissionManager.disablePackageNamePermissionCache(); mContext = context; mPackageManagerInt = LocalServices.getService(PackageManagerInternal.class); @@ -806,8 +794,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { private void updatePermissionFlagsInternal(String permName, String packageName, int flagMask, int flagValues, int callingUid, int userId, boolean overridePolicy, PermissionCallback callback) { - if (ApplicationPackageManager.DEBUG_TRACE_PERMISSION_UPDATES - && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) { + if (PermissionManager.DEBUG_TRACE_PERMISSION_UPDATES + && PermissionManager.shouldTraceGrant(packageName, permName, userId)) { Log.i(TAG, "System is updating flags for " + packageName + " " + permName + " for user " + userId + " " + DebugUtils.flagsToString( @@ -1113,59 +1101,6 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @Override - public int checkDeviceIdentifierAccess(@Nullable String packageName, @Nullable String message, - @Nullable String callingFeatureId, int pid, int uid) { - // If the check is being requested by an app then only allow the app to query its own - // access status. - int callingUid = mInjector.getCallingUid(); - int callingPid = mInjector.getCallingPid(); - if (UserHandle.getAppId(callingUid) >= Process.FIRST_APPLICATION_UID && (callingUid != uid - || callingPid != pid)) { - String response = String.format( - "Calling uid %d, pid %d cannot check device identifier access for package %s " - + "(uid=%d, pid=%d)", - callingUid, callingPid, packageName, uid, pid); - Log.w(TAG, response); - throw new SecurityException(response); - } - // Allow system and root access to the device identifiers. - final int appId = UserHandle.getAppId(uid); - if (appId == Process.SYSTEM_UID || appId == Process.ROOT_UID) { - return PackageManager.PERMISSION_GRANTED; - } - // Allow access to packages that have the READ_PRIVILEGED_PHONE_STATE permission. - if (mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid, - uid) == PackageManager.PERMISSION_GRANTED) { - return PackageManager.PERMISSION_GRANTED; - } - // If the calling package is not null then perform the appop and device / profile owner - // check. - if (packageName != null) { - // Allow access to a package that has been granted the READ_DEVICE_IDENTIFIERS appop. - final long token = mInjector.clearCallingIdentity(); - AppOpsManager appOpsManager = (AppOpsManager) mInjector.getSystemService( - Context.APP_OPS_SERVICE); - try { - if (appOpsManager.noteOpNoThrow(AppOpsManager.OPSTR_READ_DEVICE_IDENTIFIERS, uid, - packageName, callingFeatureId, message) == AppOpsManager.MODE_ALLOWED) { - return PackageManager.PERMISSION_GRANTED; - } - } finally { - mInjector.restoreCallingIdentity(token); - } - // Check if the calling packages meets the device / profile owner requirements for - // identifier access. - DevicePolicyManager devicePolicyManager = - (DevicePolicyManager) mInjector.getSystemService(Context.DEVICE_POLICY_SERVICE); - if (devicePolicyManager != null && devicePolicyManager.hasDeviceIdentifierAccess( - packageName, pid, uid)) { - return PackageManager.PERMISSION_GRANTED; - } - } - return PackageManager.PERMISSION_DENIED; - } - - @Override public void addOnPermissionsChangeListener(IOnPermissionsChangeListener listener) { mContext.enforceCallingOrSelfPermission( Manifest.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS, @@ -1520,8 +1455,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { // TODO swap permission name and package name private void grantRuntimePermissionInternal(String permName, String packageName, boolean overridePolicy, int callingUid, final int userId, PermissionCallback callback) { - if (ApplicationPackageManager.DEBUG_TRACE_GRANTS - && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) { + if (PermissionManager.DEBUG_TRACE_GRANTS + && PermissionManager.shouldTraceGrant(packageName, permName, userId)) { Log.i(TAG, "System is granting " + packageName + " " + permName + " for user " + userId + " on behalf of uid " + callingUid + " " + mPackageManagerInt.getNameForUid(callingUid), @@ -1697,8 +1632,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { private void revokeRuntimePermissionInternal(String permName, String packageName, boolean overridePolicy, int callingUid, final int userId, String reason, PermissionCallback callback) { - if (ApplicationPackageManager.DEBUG_TRACE_PERMISSION_UPDATES - && ApplicationPackageManager.shouldTraceGrant(packageName, permName, userId)) { + if (PermissionManager.DEBUG_TRACE_PERMISSION_UPDATES + && PermissionManager.shouldTraceGrant(packageName, permName, userId)) { Log.i(TAG, "System is revoking " + packageName + " " + permName + " for user " + userId + " on behalf of uid " + callingUid + " " + mPackageManagerInt.getNameForUid(callingUid), @@ -2037,44 +1972,6 @@ public class PermissionManagerService extends IPermissionManager.Stub { mPackageManagerInt.writePermissionSettings(asyncUpdatedUsers.toArray(), true); } - @Override - public void grantDefaultPermissionsToEnabledCarrierApps(String[] packageNames, int userId) { - LocalServices.getService(LegacyPermissionManagerInternal.class) - .grantDefaultPermissionsToEnabledCarrierApps(packageNames, userId); - } - - @Override - public void grantDefaultPermissionsToEnabledImsServices(String[] packageNames, int userId) { - LocalServices.getService(LegacyPermissionManagerInternal.class) - .grantDefaultPermissionsToEnabledImsServices(packageNames, userId); - } - - @Override - public void grantDefaultPermissionsToEnabledTelephonyDataServices( - String[] packageNames, int userId) { - LocalServices.getService(LegacyPermissionManagerInternal.class) - .grantDefaultPermissionsToEnabledTelephonyDataServices(packageNames, userId); - } - - @Override - public void revokeDefaultPermissionsFromDisabledTelephonyDataServices( - String[] packageNames, int userId) { - LocalServices.getService(LegacyPermissionManagerInternal.class) - .revokeDefaultPermissionsFromDisabledTelephonyDataServices(packageNames, userId); - } - - @Override - public void grantDefaultPermissionsToActiveLuiApp(String packageName, int userId) { - LocalServices.getService(LegacyPermissionManagerInternal.class) - .grantDefaultPermissionsToActiveLuiApp(packageName, userId); - } - - @Override - public void revokeDefaultPermissionsFromLuiApps(String[] packageNames, int userId) { - LocalServices.getService(LegacyPermissionManagerInternal.class) - .revokeDefaultPermissionsFromLuiApps(packageNames, userId); - } - /** * This change makes it so that apps are told to show rationale for asking for background * location access every time they request. @@ -2885,12 +2782,13 @@ public class PermissionManagerService extends IPermissionManager.Stub { // TODO(zhanghai): This calls into SystemConfig, which generally // shouldn't cause deadlock, but maybe we should keep a cache of the // split permission list and just eliminate the possibility. - final List<SplitPermissionInfoParcelable> permissionList = - getSplitPermissions(); + final List<PermissionManager.SplitPermissionInfo> permissionList = + getSplitPermissionInfos(); int numSplitPerms = permissionList.size(); for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) { - SplitPermissionInfoParcelable sp = permissionList.get(splitPermNum); + PermissionManager.SplitPermissionInfo sp = permissionList.get( + splitPermNum); String splitPermName = sp.getSplitPermission(); if (sp.getNewPermissions().contains(permName) && origState.isPermissionGranted(splitPermName)) { @@ -3287,10 +3185,11 @@ public class PermissionManagerService extends IPermissionManager.Stub { String pkgName = pkg.getPackageName(); ArrayMap<String, ArraySet<String>> newToSplitPerms = new ArrayMap<>(); - final List<SplitPermissionInfoParcelable> permissionList = getSplitPermissions(); + final List<PermissionManager.SplitPermissionInfo> permissionList = + getSplitPermissionInfos(); int numSplitPerms = permissionList.size(); for (int splitPermNum = 0; splitPermNum < numSplitPerms; splitPermNum++) { - SplitPermissionInfoParcelable spi = permissionList.get(splitPermNum); + PermissionManager.SplitPermissionInfo spi = permissionList.get(splitPermNum); List<String> newPerms = spi.getNewPermissions(); int numNewPerms = newPerms.size(); @@ -3356,10 +3255,15 @@ public class PermissionManagerService extends IPermissionManager.Stub { return updatedUserIds; } + @NonNull @Override public List<SplitPermissionInfoParcelable> getSplitPermissions() { - return PermissionManager.splitPermissionInfoListToParcelableList( - SystemConfig.getInstance().getSplitPermissions()); + return PermissionManager.splitPermissionInfoListToParcelableList(getSplitPermissionInfos()); + } + + @NonNull + private List<PermissionManager.SplitPermissionInfo> getSplitPermissionInfos() { + return SystemConfig.getInstance().getSplitPermissions(); } @NonNull @@ -5456,94 +5360,4 @@ public class PermissionManagerService extends IPermissionManager.Stub { || mDelegatedPermissionNames.contains(permissionName); } } - - /** - * Allows injection of services and method responses to facilitate testing. - * - * <p>Test classes can create a mock of this class and pass it to the PermissionManagerService - * constructor to control behavior of services and external methods during execution. - * @hide - */ - @VisibleForTesting - public static class Injector { - private final Context mContext; - - /** - * Public constructor that accepts a {@code context} within which to operate. - */ - public Injector(@NonNull Context context) { - mContext = context; - } - - /** - * Returns the UID of the calling package. - */ - public int getCallingUid() { - return Binder.getCallingUid(); - } - - /** - * Returns the process ID of the calling package. - */ - public int getCallingPid() { - return Binder.getCallingPid(); - } - - /** - * Invalidates the package info cache. - */ - public void invalidatePackageInfoCache() { - PackageManager.invalidatePackageInfoCache(); - } - - /** - * Disables the permission cache. - */ - public void disablePermissionCache() { - PermissionManager.disablePermissionCache(); - } - - /** - * Disables the package name permission cache. - */ - public void disablePackageNamePermissionCache() { - PermissionManager.disablePackageNamePermissionCache(); - } - - /** - * Checks if the package running under the specified {@code pid} and {@code uid} has been - * granted the provided {@code permission}. - * - * @return {@link PackageManager#PERMISSION_GRANTED} if the package has been granted the - * permission, {@link PackageManager#PERMISSION_DENIED} otherwise - */ - public int checkPermission(@NonNull String permission, int pid, int uid) { - return mContext.checkPermission(permission, pid, uid); - } - - /** - * Clears the calling identity to allow subsequent calls to be treated as coming from this - * package. - * - * @return a token that can be used to restore the calling identity - */ - public long clearCallingIdentity() { - return Binder.clearCallingIdentity(); - } - - /** - * Restores the calling identity to that of the calling package based on the provided - * {@code token}. - */ - public void restoreCallingIdentity(long token) { - Binder.restoreCallingIdentity(token); - } - - /** - * Returns the system service with the provided {@code name}. - */ - public Object getSystemService(@NonNull String name) { - return mContext.getSystemService(name); - } - } } diff --git a/services/core/java/com/android/server/policy/OWNERS b/services/core/java/com/android/server/policy/OWNERS index 0862c05e0ee4..d25ec4a560a3 100644 --- a/services/core/java/com/android/server/policy/OWNERS +++ b/services/core/java/com/android/server/policy/OWNERS @@ -1 +1,2 @@ include /services/core/java/com/android/server/wm/OWNERS +include /services/core/java/com/android/server/input/OWNERS diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 1ff3a3fb1d35..ecbf266c89cb 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2647,7 +2647,11 @@ class ActivityStarter { if (next != null) { next.setCurrentLaunchCanTurnScreenOn(true); } - mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetStack, null, mOptions); + if (mTargetStack.isFocusable()) { + mRootWindowContainer.resumeFocusedTasksTopActivities(mTargetStack, null, mOptions); + } else { + mRootWindowContainer.ensureActivitiesVisible(null, 0, !PRESERVE_WINDOWS); + } } else { ActivityOptions.abort(mOptions); } diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index e60f2e70f25c..8d6d981be2b8 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -80,6 +80,7 @@ import static android.view.WindowManager.TRANSIT_TO_FRONT; import static android.window.DisplayAreaOrganizer.FEATURE_ROOT; import static android.window.DisplayAreaOrganizer.FEATURE_WINDOWED_MAGNIFICATION; +import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_APP_TRANSITIONS; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_BOOT; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_FOCUS; @@ -552,24 +553,56 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * This just indicates the window the input method is on top of, not * necessarily the window its input is going to. */ - WindowState mInputMethodTarget; + private WindowState mImeLayeringTarget; /** * The window which receives input from the input method. This is also a candidate of the * input method control target. */ - WindowState mInputMethodInputTarget; + private WindowState mImeInputTarget; /** * This controls the visibility and animation of the input method window. */ - InsetsControlTarget mInputMethodControlTarget; + private InsetsControlTarget mImeControlTarget; + + /** + * Used by {@link #getImeTarget} to return the IME target which the input method window on + * top of for adjusting input method window surface layer Z-Ordering. + * + * @see #mImeLayeringTarget + */ + static final int IME_TARGET_LAYERING = 0; + + /** + * Used by {@link #getImeTarget} to return the IME target which received the input connection + * from IME. + * + * @see #mImeInputTarget + */ + static final int IME_TARGET_INPUT = 1; + + /** + * Used by {@link #getImeTarget} to return the IME target which controls the IME insets + * visibility and animation. + * + * @see #mImeControlTarget + */ + static final int IME_TARGET_CONTROL = 2; + + @IntDef(flag = false, prefix = { "IME_TARGET_" }, value = { + IME_TARGET_LAYERING, + IME_TARGET_INPUT, + IME_TARGET_CONTROL, + }) + @Retention(RetentionPolicy.SOURCE) + @interface InputMethodTarget {} /** The surface parent of the IME container. */ private SurfaceControl mInputMethodSurfaceParent; - /** If true hold off on modifying the animation layer of mInputMethodTarget */ - boolean mInputMethodTargetWaitingAnim; + /** If {@code true} hold off on modifying the animation layer of {@link #mImeLayeringTarget} */ + boolean mImeLayeringTargetWaitingAnim; private final PointerEventDispatcher mPointerEventDispatcher; @@ -814,7 +847,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp private final Consumer<WindowState> mApplyPostLayoutPolicy = w -> getDisplayPolicy().applyPostLayoutPolicyLw(w, w.mAttrs, w.getParentWindow(), - mInputMethodTarget); + mImeLayeringTarget); private final Consumer<WindowState> mApplySurfaceChangesTransaction = w -> { final WindowSurfacePlacer surfacePlacer = mWmService.mWindowPlacerLocked; @@ -2256,8 +2289,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @Nullable Task getRootTask(int rootTaskId) { - return getItemFromTaskDisplayAreas(taskDisplayArea -> - taskDisplayArea.getRootTask(rootTaskId)); + return getRootTask(rootTask -> rootTask.getRootTaskId() == rootTaskId); } int getRootTaskCount() { @@ -2834,7 +2866,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } void prepareFreezingTaskBounds() { - forAllTaskDisplayAreas(TaskDisplayArea::prepareFreezingTaskBounds); + forAllRootTasks(Task::prepareFreezingTaskBounds); } void rotateBounds(int oldRotation, int newRotation, Rect bounds) { @@ -2943,15 +2975,15 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp proto.write(FOCUSED_ROOT_TASK_ID, INVALID_TASK_ID); } proto.write(DISPLAY_READY, isReady()); - if (mInputMethodTarget != null) { - mInputMethodTarget.dumpDebug(proto, INPUT_METHOD_TARGET, logLevel); + if (mImeLayeringTarget != null) { + mImeLayeringTarget.dumpDebug(proto, INPUT_METHOD_TARGET, logLevel); } - if (mInputMethodInputTarget != null) { - mInputMethodInputTarget.dumpDebug(proto, INPUT_METHOD_INPUT_TARGET, logLevel); + if (mImeInputTarget != null) { + mImeInputTarget.dumpDebug(proto, INPUT_METHOD_INPUT_TARGET, logLevel); } - if (mInputMethodControlTarget != null - && mInputMethodControlTarget.getWindow() != null) { - mInputMethodControlTarget.getWindow().dumpDebug(proto, INPUT_METHOD_CONTROL_TARGET, + if (mImeControlTarget != null + && mImeControlTarget.getWindow() != null) { + mImeControlTarget.getWindow().dumpDebug(proto, INPUT_METHOD_CONTROL_TARGET, logLevel); } if (mCurrentFocus != null) { @@ -3207,7 +3239,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp boolean imWindowChanged = false; final WindowState imWindow = mInputMethodWindow; if (imWindow != null) { - final WindowState prevTarget = mInputMethodTarget; + final WindowState prevTarget = mImeLayeringTarget; final WindowState newTarget = computeImeTarget(true /* updateImeTarget*/); imWindowChanged = prevTarget != newTarget; @@ -3461,7 +3493,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } /** - * Determine and return the window that should be the IME target. + * Determine and return the window that should be the IME target for layering the IME window. * @param updateImeTarget If true the system IME target will be updated to match what we found. * @return The window that should be used as the IME target or null if there isn't any. */ @@ -3470,13 +3502,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // There isn't an IME so there shouldn't be a target...That was easy! if (updateImeTarget) { if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " - + mInputMethodTarget + " to null since mInputMethodWindow is null"); - setInputMethodTarget(null, mInputMethodTargetWaitingAnim); + + mImeLayeringTarget + " to null since mInputMethodWindow is null"); + setImeLayeringTarget(null, mImeLayeringTargetWaitingAnim); } return null; } - final WindowState curTarget = mInputMethodTarget; + final WindowState curTarget = mImeLayeringTarget; if (!canUpdateImeTarget()) { if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Defer updating IME target"); return curTarget; @@ -3531,7 +3563,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " + curTarget + " to null." + (SHOW_STACK_CRAWLS ? " Callers=" + Debug.getCallers(4) : "")); - setInputMethodTarget(null, mInputMethodTargetWaitingAnim); + setImeLayeringTarget(null, mImeLayeringTargetWaitingAnim); } return null; @@ -3558,7 +3590,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (mAppTransition.isTransitionSet()) { // If we are currently setting up for an animation, hold everything until we // can find out what will happen. - setInputMethodTarget(highestTarget, true); + setImeLayeringTarget(highestTarget, true); return highestTarget; } } @@ -3566,7 +3598,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (DEBUG_INPUT_METHOD) Slog.w(TAG_WM, "Moving IM target from " + curTarget + " to " + target + (SHOW_STACK_CRAWLS ? " Callers=" + Debug.getCallers(4) : "")); - setInputMethodTarget(target, false); + setImeLayeringTarget(target, false); } return target; @@ -3577,24 +3609,24 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * the candidate app window token if needed. */ void computeImeTargetIfNeeded(ActivityRecord candidate) { - if (mInputMethodTarget != null && mInputMethodTarget.mActivityRecord == candidate) { + if (mImeLayeringTarget != null && mImeLayeringTarget.mActivityRecord == candidate) { computeImeTarget(true /* updateImeTarget */); } } private boolean isImeControlledByApp() { - return mInputMethodInputTarget != null && !WindowConfiguration.isSplitScreenWindowingMode( - mInputMethodInputTarget.getWindowingMode()); + return mImeInputTarget != null && !WindowConfiguration.isSplitScreenWindowingMode( + mImeInputTarget.getWindowingMode()); } boolean isImeAttachedToApp() { return isImeControlledByApp() - && mInputMethodTarget != null - && mInputMethodTarget.mActivityRecord != null - && mInputMethodTarget.getWindowingMode() == WINDOWING_MODE_FULLSCREEN + && mImeLayeringTarget != null + && mImeLayeringTarget.mActivityRecord != null + && mImeLayeringTarget.getWindowingMode() == WINDOWING_MODE_FULLSCREEN // An activity with override bounds should be letterboxed inside its parent bounds, // so it doesn't fill the screen. - && mInputMethodTarget.mActivityRecord.matchParentBounds(); + && mImeLayeringTarget.mActivityRecord.matchParentBounds(); } /** @@ -3621,6 +3653,24 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return statusBar != null ? statusBar : defaultDc.mRemoteInsetsControlTarget; } + /** + * Returns the corresponding IME insets control target according the IME target type. + * + * @param type The type of the IME target. + * @see #IME_TARGET_LAYERING + * @see #IME_TARGET_INPUT + * @see #IME_TARGET_CONTROL + */ + InsetsControlTarget getImeTarget(@InputMethodTarget int type) { + switch (type) { + case IME_TARGET_LAYERING: return mImeLayeringTarget; + case IME_TARGET_INPUT: return mImeInputTarget; + case IME_TARGET_CONTROL: return mImeControlTarget; + default: + return null; + } + } + @DisplayImePolicy int getImePolicy() { if (!isTrusted()) { return DISPLAY_IME_POLICY_FALLBACK_DISPLAY; @@ -3638,6 +3688,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp return mWmService.mForceDesktopModeOnExternalDisplays && !isDefaultDisplay && !isPrivate(); } + @VisibleForTesting + void setImeLayeringTarget(WindowState target) { + mImeLayeringTarget = target; + } + /** * Sets the window the IME is on top of. * @param target window to place the IME surface on top of. If {@code null}, the IME will be @@ -3645,13 +3700,13 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * @param targetWaitingAnim if {@code true}, hold off on modifying the animation layer of * the target. */ - private void setInputMethodTarget(@Nullable WindowState target, boolean targetWaitingAnim) { - if (target == mInputMethodTarget && mInputMethodTargetWaitingAnim == targetWaitingAnim) { + private void setImeLayeringTarget(@Nullable WindowState target, boolean targetWaitingAnim) { + if (target == mImeLayeringTarget && mImeLayeringTargetWaitingAnim == targetWaitingAnim) { return; } ProtoLog.i(WM_DEBUG_IME, "setInputMethodTarget %s", target); - mInputMethodTarget = target; - mInputMethodTargetWaitingAnim = targetWaitingAnim; + mImeLayeringTarget = target; + mImeLayeringTargetWaitingAnim = targetWaitingAnim; // 1. Reparent the IME container window to the target root DA to get the correct bounds and // config. (Only happens when the target window is in a different root DA) @@ -3673,23 +3728,33 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp updateImeControlTarget(); } + @VisibleForTesting + void setImeInputTarget(WindowState target) { + mImeInputTarget = target; + } + + @VisibleForTesting + void setImeControlTarget(InsetsControlTarget target) { + mImeControlTarget = target; + } + /** * The IME input target is the window which receives input from IME. It is also a candidate * which controls the visibility and animation of the input method window. */ - void setInputMethodInputTarget(WindowState target) { - if (mInputMethodInputTarget != target) { + void updateImeInputAndControlTarget(WindowState target) { + if (mImeInputTarget != target) { ProtoLog.i(WM_DEBUG_IME, "setInputMethodInputTarget %s", target); - mInputMethodInputTarget = target; + mImeInputTarget = target; updateImeControlTarget(); } } void updateImeControlTarget() { - mInputMethodControlTarget = computeImeControlTarget(); - mInsetsStateController.onImeControlTargetChanged(mInputMethodControlTarget); + mImeControlTarget = computeImeControlTarget(); + mInsetsStateController.onImeControlTargetChanged(mImeControlTarget); - final WindowState win = InsetsControlTarget.asWindowOrNull(mInputMethodControlTarget); + final WindowState win = InsetsControlTarget.asWindowOrNull(mImeControlTarget); final IBinder token = win != null ? win.mClient.asBinder() : null; // Note: not allowed to call into IMMS with the WM lock held, hence the post. mWmService.mH.post(() -> @@ -3712,12 +3777,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @VisibleForTesting InsetsControlTarget computeImeControlTarget() { if (!isImeControlledByApp() && mRemoteInsetsControlTarget != null - || (mInputMethodInputTarget != null - && getImeHostOrFallback(mInputMethodInputTarget.getWindow()) + || (mImeInputTarget != null + && getImeHostOrFallback(mImeInputTarget.getWindow()) == mRemoteInsetsControlTarget)) { return mRemoteInsetsControlTarget; } else { - return mInputMethodInputTarget; + return mImeInputTarget; } } @@ -3734,7 +3799,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp // screen. If it's not covering the entire screen the IME might extend beyond the apps // bounds. if (allowAttachToApp && isImeAttachedToApp()) { - return mInputMethodTarget.mActivityRecord.getSurfaceControl(); + return mImeLayeringTarget.mActivityRecord.getSurfaceControl(); } // Otherwise, we just attach it to where the display area policy put it. @@ -4191,8 +4256,11 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } // Initialize state of exiting applications. - forAllTaskDisplayAreas(taskDisplayArea -> { - taskDisplayArea.setExitingTokensHasVisible(hasVisible); + forAllRootTasks(task -> { + final ArrayList<ActivityRecord> activities = task.mExitingActivities; + for (int j = activities.size() - 1; j >= 0; --j) { + activities.get(j).hasVisible = hasVisible; + } }); } @@ -4205,7 +4273,22 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp } // Time to remove any exiting applications? - forAllTaskDisplayAreas(TaskDisplayArea::removeExistingAppTokensIfPossible); + forAllRootTasks(task -> { + final ArrayList<ActivityRecord> activities = task.mExitingActivities; + for (int j = activities.size() - 1; j >= 0; --j) { + final ActivityRecord activity = activities.get(j); + if (!activity.hasVisible && !mDisplayContent.mClosingApps.contains(activity) + && (!activity.mIsExiting || activity.isEmpty())) { + // Make sure there is no animation running on this activity, so any windows + // associated with it will be removed as soon as their animations are + // complete. + cancelAnimation(); + ProtoLog.v(WM_DEBUG_ADD_REMOVE, + "performLayout: Activity exiting now removed %s", activity); + activity.removeIfPossible(); + } + } + }); } @Override @@ -4355,7 +4438,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp private boolean skipImeWindowsDuringTraversal(DisplayContent dc) { // We skip IME windows so they're processed just above their target, except // in split-screen mode where we process the IME containers above the docked divider. - return dc.mInputMethodTarget != null + return dc.getImeTarget(IME_TARGET_LAYERING) != null && !dc.getDefaultTaskDisplayArea().isSplitScreenModeActivated(); } @@ -4470,7 +4553,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp @Override void assignChildLayers(SurfaceControl.Transaction t) { mImeWindowsContainers.setNeedsLayer(); - final WindowState imeTarget = mInputMethodTarget; + final WindowState imeTarget = mImeLayeringTarget; // In the case where we have an IME target that is not in split-screen mode IME // assignment is easy. We just need the IME to go directly above the target. This way // children of the target will naturally go above the IME and everyone is happy. @@ -5128,15 +5211,56 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED */ void removeRootTasksInWindowingModes(int... windowingModes) { - forAllTaskDisplayAreas(taskDisplayArea -> { - taskDisplayArea.removeRootTasksInWindowingModes(windowingModes); + if (windowingModes == null || windowingModes.length == 0) { + return; + } + + // Collect the root tasks that are necessary to be removed instead of performing the removal + // by looping the children, so that we don't miss any root tasks after the children size + // changed or reordered. + final ArrayList<Task> rootTasks = new ArrayList<>(); + forAllRootTasks(rootTask -> { + for (int windowingMode : windowingModes) { + if (rootTask.mCreatedByOrganizer + || rootTask.getWindowingMode() != windowingMode + || !rootTask.isActivityTypeStandardOrUndefined()) { + continue; + } + rootTasks.add(rootTask); + } }); + for (int i = rootTasks.size() - 1; i >= 0; --i) { + mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i)); + } } void removeRootTasksWithActivityTypes(int... activityTypes) { - forAllTaskDisplayAreas(taskDisplayArea -> { - taskDisplayArea.removeRootTasksWithActivityTypes(activityTypes); + if (activityTypes == null || activityTypes.length == 0) { + return; + } + + // Collect the root tasks that are necessary to be removed instead of performing the removal + // by looping the children, so that we don't miss any root tasks after the children size + // changed or reordered. + final ArrayList<Task> rootTasks = new ArrayList<>(); + forAllRootTasks(rootTask -> { + for (int activityType : activityTypes) { + // Collect the root tasks that are currently being organized. + if (rootTask.mCreatedByOrganizer) { + for (int k = rootTask.getChildCount() - 1; k >= 0; --k) { + final Task task = (Task) rootTask.getChildAt(k); + if (task.getActivityType() == activityType) { + rootTasks.add(task); + } + } + } else if (rootTask.getActivityType() == activityType) { + rootTasks.add(rootTask); + } + } }); + for (int i = rootTasks.size() - 1; i >= 0; --i) { + mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i)); + } } ActivityRecord topRunningActivity() { diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index 91106eff9805..17c3b20c9e40 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -19,10 +19,14 @@ package com.android.server.wm; import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_IME; +import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL; +import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; +import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.ImeInsetsSourceProviderProto.IME_TARGET_FROM_IME; import static com.android.server.wm.ImeInsetsSourceProviderProto.INSETS_SOURCE_PROVIDER; import static com.android.server.wm.ImeInsetsSourceProviderProto.IS_IME_LAYOUT_DRAWN; +import android.annotation.NonNull; import android.os.Trace; import android.util.proto.ProtoOutputStream; import android.view.InsetsSource; @@ -37,9 +41,9 @@ import java.io.PrintWriter; * Controller for IME inset source on the server. It's called provider as it provides the * {@link InsetsSource} to the client that uses it in {@link InsetsSourceConsumer}. */ -class ImeInsetsSourceProvider extends InsetsSourceProvider { +final class ImeInsetsSourceProvider extends InsetsSourceProvider { - private InsetsControlTarget mImeTargetFromIme; + private InsetsControlTarget mImeRequester; private Runnable mShowImeRunner; private boolean mIsImeLayoutDrawn; private boolean mImeShowing; @@ -56,12 +60,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { * @param imeTarget imeTarget on which IME request is coming from. */ void scheduleShowImePostLayout(InsetsControlTarget imeTarget) { - boolean targetChanged = mImeTargetFromIme != imeTarget - && mImeTargetFromIme != null && imeTarget != null && mShowImeRunner != null - && imeTarget.getWindow() != null && mImeTargetFromIme.getWindow() != null - && mImeTargetFromIme.getWindow().mActivityRecord - == imeTarget.getWindow().mActivityRecord; - mImeTargetFromIme = imeTarget; + boolean targetChanged = isTargetChangedWithinActivity(imeTarget); + mImeRequester = imeTarget; if (targetChanged) { // target changed, check if new target can show IME. ProtoLog.d(WM_DEBUG_IME, "IME target changed within ActivityRecord"); @@ -72,24 +72,24 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { return; } - ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeTargetFromIme.getWindow() == null - ? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName()); + ProtoLog.d(WM_DEBUG_IME, "Schedule IME show for %s", mImeRequester.getWindow() == null + ? mImeRequester : mImeRequester.getWindow().getName()); mShowImeRunner = () -> { ProtoLog.d(WM_DEBUG_IME, "Run showImeRunner"); // Target should still be the same. - if (isImeTargetFromDisplayContentAndImeSame()) { - final InsetsControlTarget target = mDisplayContent.mInputMethodControlTarget; + if (isReadyToShowIme()) { + final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_CONTROL); ProtoLog.i(WM_DEBUG_IME, "call showInsets(ime) on %s", target.getWindow() != null ? target.getWindow().getName() : ""); setImeShowing(true); target.showInsets(WindowInsets.Type.ime(), true /* fromIme */); Trace.asyncTraceEnd(TRACE_TAG_WINDOW_MANAGER, "WMS.showImePostLayout", 0); - if (target != mImeTargetFromIme && mImeTargetFromIme != null) { + if (target != mImeRequester && mImeRequester != null) { ProtoLog.w(WM_DEBUG_IME, "showInsets(ime) was requested by different window: %s ", - (mImeTargetFromIme.getWindow() != null - ? mImeTargetFromIme.getWindow().getName() : "")); + (mImeRequester.getWindow() != null + ? mImeRequester.getWindow().getName() : "")); } } abortShowImePostLayout(); @@ -100,8 +100,7 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { void checkShowImePostLayout() { // check if IME is drawn if (mIsImeLayoutDrawn - || (mImeTargetFromIme != null - && isImeTargetFromDisplayContentAndImeSame() + || (isReadyToShowIme() && mWin != null && mWin.isDrawn() && !mWin.mGivenInsetsPending)) { @@ -118,13 +117,13 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { */ void abortShowImePostLayout() { ProtoLog.d(WM_DEBUG_IME, "abortShowImePostLayout"); - mImeTargetFromIme = null; + mImeRequester = null; mIsImeLayoutDrawn = false; mShowImeRunner = null; } @VisibleForTesting - boolean isImeTargetFromDisplayContentAndImeSame() { + boolean isReadyToShowIme() { // IMMS#mLastImeTargetWindow always considers focused window as // IME target, however DisplayContent#computeImeTarget() can compute // a different IME target. @@ -134,35 +133,75 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { // Also, if imeTarget is closing, it would be considered as outdated target. // TODO(b/139861270): Remove the child & sublayer check once IMMS is aware of // actual IME target. - final WindowState dcTarget = mDisplayContent.mInputMethodTarget; - final InsetsControlTarget controlTarget = mDisplayContent.mInputMethodControlTarget; - if (dcTarget == null || mImeTargetFromIme == null) { + final InsetsControlTarget dcTarget = mDisplayContent.getImeTarget(IME_TARGET_LAYERING); + if (dcTarget == null || mImeRequester == null) { return false; } - ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeTargetFromIme: %s", - dcTarget.getName(), mImeTargetFromIme.getWindow() == null - ? mImeTargetFromIme : mImeTargetFromIme.getWindow().getName()); - - return (!dcTarget.isClosing() && mImeTargetFromIme == dcTarget) - || (mImeTargetFromIme != null && mImeTargetFromIme.getWindow() != null - && dcTarget.getParentWindow() == mImeTargetFromIme - && dcTarget.mSubLayer > mImeTargetFromIme.getWindow().mSubLayer) - || mImeTargetFromIme == mDisplayContent.getImeFallback() - || mImeTargetFromIme == mDisplayContent.mInputMethodInputTarget - || controlTarget == mImeTargetFromIme - && (mImeTargetFromIme.getWindow() == null - || !mImeTargetFromIme.getWindow().isClosing()); + ProtoLog.d(WM_DEBUG_IME, "dcTarget: %s mImeRequester: %s", + dcTarget.getWindow().getName(), mImeRequester.getWindow() == null + ? mImeRequester : mImeRequester.getWindow().getName()); + + return isImeLayeringTarget(mImeRequester, dcTarget) + || isAboveImeLayeringTarget(mImeRequester, dcTarget) + || isImeFallbackTarget(mImeRequester) + || isImeInputTarget(mImeRequester) + || sameAsImeControlTarget(); } + // --------------------------------------------------------------------------------------- + // Methods for checking IME insets target changing state. + // + private static boolean isImeLayeringTarget(@NonNull InsetsControlTarget target, + @NonNull InsetsControlTarget dcTarget) { + return !dcTarget.getWindow().isClosing() && target == dcTarget; + } + + private static boolean isAboveImeLayeringTarget(@NonNull InsetsControlTarget target, + @NonNull InsetsControlTarget dcTarget) { + return target.getWindow() != null + && dcTarget.getWindow().getParentWindow() == target + && dcTarget.getWindow().mSubLayer > target.getWindow().mSubLayer; + } + + private boolean isImeFallbackTarget(InsetsControlTarget target) { + return target == mDisplayContent.getImeFallback(); + } + + private boolean isImeInputTarget(InsetsControlTarget target) { + return target == mDisplayContent.getImeTarget(IME_TARGET_INPUT); + } + + private boolean sameAsImeControlTarget() { + final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_CONTROL); + return target == mImeRequester + && (mImeRequester.getWindow() == null + || !mImeRequester.getWindow().isClosing()); + } + + private boolean isTargetChangedWithinActivity(InsetsControlTarget target) { + // We don't consider the target out of the activity. + if (target == null || target.getWindow() == null) { + return false; + } + return mImeRequester != target + && mImeRequester != null && mShowImeRunner != null + && mImeRequester.getWindow() != null + && mImeRequester.getWindow().mActivityRecord + == target.getWindow().mActivityRecord; + } + // --------------------------------------------------------------------------------------- + @Override public void dump(PrintWriter pw, String prefix) { super.dump(pw, prefix); pw.print(prefix); pw.print("mImeShowing="); pw.print(mImeShowing); - if (mImeTargetFromIme != null) { - pw.print(" showImePostLayout pending for mImeTargetFromIme="); - pw.print(mImeTargetFromIme); + if (mImeRequester != null) { + pw.print(prefix); + pw.print("showImePostLayout pending for mImeRequester="); + pw.print(mImeRequester); + pw.println(); } pw.println(); } @@ -171,8 +210,8 @@ class ImeInsetsSourceProvider extends InsetsSourceProvider { void dumpDebug(ProtoOutputStream proto, long fieldId, @WindowTraceLogLevel int logLevel) { final long token = proto.start(fieldId); super.dumpDebug(proto, INSETS_SOURCE_PROVIDER, logLevel); - if (mImeTargetFromIme != null) { - mImeTargetFromIme.getWindow().dumpDebug(proto, IME_TARGET_FROM_IME, logLevel); + if (mImeRequester != null) { + mImeRequester.getWindow().dumpDebug(proto, IME_TARGET_FROM_IME, logLevel); } proto.write(IS_IME_LAYOUT_DRAWN, mIsImeLayoutDrawn); proto.end(token); diff --git a/services/core/java/com/android/server/wm/Session.java b/services/core/java/com/android/server/wm/Session.java index c414c6421dc8..57d48c6bb9f4 100644 --- a/services/core/java/com/android/server/wm/Session.java +++ b/services/core/java/com/android/server/wm/Session.java @@ -18,6 +18,7 @@ package com.android.server.wm; import static android.Manifest.permission.DEVICE_POWER; import static android.Manifest.permission.HIDE_NON_SYSTEM_OVERLAY_WINDOWS; +import static android.Manifest.permission.HIDE_OVERLAY_WINDOWS; import static android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; import static android.Manifest.permission.START_TASKS_FROM_RECENTS; import static android.app.ActivityTaskManager.INVALID_TASK_ID; @@ -124,7 +125,9 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient { mCanAddInternalSystemWindow = service.mContext.checkCallingOrSelfPermission( INTERNAL_SYSTEM_WINDOW) == PERMISSION_GRANTED; mCanHideNonSystemOverlayWindows = service.mContext.checkCallingOrSelfPermission( - HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED; + HIDE_NON_SYSTEM_OVERLAY_WINDOWS) == PERMISSION_GRANTED + || service.mContext.checkCallingOrSelfPermission(HIDE_OVERLAY_WINDOWS) + == PERMISSION_GRANTED; mOverlaysCanBeHidden = !mCanAddInternalSystemWindow && !mService.mAtmInternal.isCallerRecents(mUid); mCanAcquireSleepToken = service.mContext.checkCallingOrSelfPermission(DEVICE_POWER) diff --git a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java index 34d084a3f9f8..92e2ee6f8af9 100644 --- a/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java +++ b/services/core/java/com/android/server/wm/SurfaceAnimationRunner.java @@ -259,6 +259,7 @@ class SurfaceAnimationRunner { private void applyTransaction() { mFrameTransaction.setAnimationTransaction(); + mFrameTransaction.setFrameTimelineVsync(mChoreographer.getVsyncId()); mFrameTransaction.apply(); mApplyScheduled = false; } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 378638f82c37..c4be680a1716 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -4125,7 +4125,7 @@ class Task extends WindowContainer<WindowContainer> { info.positionInParent = getRelativePosition(); info.parentBounds = getParentBounds(); - info.pictureInPictureParams = getPictureInPictureParams(); + info.pictureInPictureParams = getPictureInPictureParams(top); info.topActivityInfo = mReuseActivitiesReport.top != null ? mReuseActivitiesReport.top.info : null; @@ -4142,7 +4142,10 @@ class Task extends WindowContainer<WindowContainer> { } @Nullable PictureInPictureParams getPictureInPictureParams() { - final Task top = getTopMostTask(); + return getPictureInPictureParams(getTopMostTask()); + } + + private @Nullable PictureInPictureParams getPictureInPictureParams(Task top) { if (top == null) return null; final ActivityRecord rootActivity = top.getRootActivity(); return (rootActivity == null || rootActivity.pictureInPictureArgs.empty()) diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index 5522eeb6d900..7fed84015e8b 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -33,7 +33,6 @@ import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; -import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ADD_REMOVE; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_ORIENTATION; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_STATES; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_TASKS; @@ -610,34 +609,6 @@ final class TaskDisplayArea extends DisplayArea<Task> { return false; } - void setExitingTokensHasVisible(boolean hasVisible) { - for (int i = mChildren.size() - 1; i >= 0; --i) { - final ArrayList<ActivityRecord> activities = mChildren.get(i).mExitingActivities; - for (int j = activities.size() - 1; j >= 0; --j) { - activities.get(j).hasVisible = hasVisible; - } - } - } - - void removeExistingAppTokensIfPossible() { - for (int i = mChildren.size() - 1; i >= 0; --i) { - final ArrayList<ActivityRecord> activities = mChildren.get(i).mExitingActivities; - for (int j = activities.size() - 1; j >= 0; --j) { - final ActivityRecord activity = activities.get(j); - if (!activity.hasVisible && !mDisplayContent.mClosingApps.contains(activity) - && (!activity.mIsExiting || activity.isEmpty())) { - // Make sure there is no animation running on this activity, so any windows - // associated with it will be removed as soon as their animations are - // complete. - cancelAnimation(); - ProtoLog.v(WM_DEBUG_ADD_REMOVE, - "performLayout: Activity exiting now removed %s", activity); - activity.removeIfPossible(); - } - } - } - } - @Override int getOrientation(int candidate) { mLastOrientationSource = null; @@ -894,11 +865,6 @@ final class TaskDisplayArea extends DisplayArea<Task> { } } - @Nullable - Task getRootTask(int rootTaskId) { - return getRootTask(stack -> stack.getRootTaskId() == rootTaskId); - } - /** * Returns an existing stack compatible with the windowing mode and activity type or creates one * if a compatible stack doesn't exist. @@ -1296,69 +1262,6 @@ final class TaskDisplayArea extends DisplayArea<Task> { } } - /** - * Removes root tasks in the input windowing modes from the system if they are of activity type - * ACTIVITY_TYPE_STANDARD or ACTIVITY_TYPE_UNDEFINED - */ - void removeRootTasksInWindowingModes(int... windowingModes) { - if (windowingModes == null || windowingModes.length == 0) { - return; - } - - // Collect the root tasks that are necessary to be removed instead of performing the removal - // by looping the children, so that we don't miss any root tasks after the children size - // changed or reordered. - final ArrayList<Task> rootTasks = new ArrayList<>(); - for (int j = windowingModes.length - 1; j >= 0; --j) { - final int windowingMode = windowingModes[j]; - for (int i = mChildren.size() - 1; i >= 0; --i) { - final Task rootTask = mChildren.get(i); - if (rootTask.mCreatedByOrganizer - || !rootTask.isActivityTypeStandardOrUndefined() - || rootTask.getWindowingMode() != windowingMode) { - continue; - } - rootTasks.add(rootTask); - } - } - - for (int i = rootTasks.size() - 1; i >= 0; --i) { - mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i)); - } - } - - void removeRootTasksWithActivityTypes(int... activityTypes) { - if (activityTypes == null || activityTypes.length == 0) { - return; - } - - // Collect the root tasks that are necessary to be removed instead of performing the removal - // by looping the children, so that we don't miss any root tasks after the children size - // changed or reordered. - final ArrayList<Task> rootTasks = new ArrayList<>(); - for (int j = activityTypes.length - 1; j >= 0; --j) { - final int activityType = activityTypes[j]; - for (int i = mChildren.size() - 1; i >= 0; --i) { - final Task rootTask = mChildren.get(i); - // Collect the root tasks that are currently being organized. - if (rootTask.mCreatedByOrganizer) { - for (int k = rootTask.getChildCount() - 1; k >= 0; --k) { - final Task task = (Task) rootTask.getChildAt(k); - if (task.getActivityType() == activityType) { - rootTasks.add(task); - } - } - } else if (rootTask.getActivityType() == activityType) { - rootTasks.add(rootTask); - } - } - } - - for (int i = rootTasks.size() - 1; i >= 0; --i) { - mRootWindowContainer.mTaskSupervisor.removeRootTask(rootTasks.get(i)); - } - } - void onSplitScreenModeDismissed() { // The focused task could be a non-resizeable fullscreen root task that is on top of the // other split-screen tasks, therefore had to dismiss split-screen, make sure the current @@ -1842,13 +1745,6 @@ final class TaskDisplayArea extends DisplayArea<Task> { } } - void prepareFreezingTaskBounds() { - for (int stackNdx = getChildCount() - 1; stackNdx >= 0; --stackNdx) { - final Task stack = getChildAt(stackNdx); - stack.prepareFreezingTaskBounds(); - } - } - /** * Removes the stacks in the node applying the content removal node from the display. * diff --git a/services/core/java/com/android/server/wm/TaskOrganizerController.java b/services/core/java/com/android/server/wm/TaskOrganizerController.java index ca44f0d60226..58aca20af926 100644 --- a/services/core/java/com/android/server/wm/TaskOrganizerController.java +++ b/services/core/java/com/android/server/wm/TaskOrganizerController.java @@ -21,6 +21,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_WINDOW_ORGANIZER; +import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.WindowOrganizerController.CONTROLLABLE_CONFIGS; import static com.android.server.wm.WindowOrganizerController.CONTROLLABLE_WINDOW_CONFIGS; @@ -580,11 +581,11 @@ class TaskOrganizerController extends ITaskOrganizerController.Stub { synchronized (mGlobalLock) { DisplayContent dc = mService.mWindowManager.mRoot .getDisplayContent(displayId); - if (dc == null || dc.mInputMethodTarget == null) { + if (dc == null || dc.getImeTarget(IME_TARGET_LAYERING) == null) { return null; } // Avoid WindowState#getRootTask() so we don't attribute system windows to a task. - final Task task = dc.mInputMethodTarget.getTask(); + final Task task = dc.getImeTarget(IME_TARGET_LAYERING).getWindow().getTask(); if (task == null) { return null; } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index f23319936536..617b21c838e1 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -105,6 +105,9 @@ import static com.android.internal.util.LatencyTracker.ACTION_ROTATE_SCREEN; import static com.android.server.LockGuard.INDEX_WINDOW; import static com.android.server.LockGuard.installLock; import static com.android.server.policy.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; +import static com.android.server.wm.DisplayContent.IME_TARGET_CONTROL; +import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; +import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.WindowContainer.AnimationFlags.CHILDREN; import static com.android.server.wm.WindowContainer.AnimationFlags.PARENTS; import static com.android.server.wm.WindowContainer.AnimationFlags.TRANSITION; @@ -6322,20 +6325,20 @@ public class WindowManagerService extends IWindowManager.Stub mRoot.dumpTopFocusedDisplayId(pw); mRoot.forAllDisplays(dc -> { final int displayId = dc.getDisplayId(); - final WindowState inputMethodTarget = dc.mInputMethodTarget; - final WindowState inputMethodInputTarget = dc.mInputMethodInputTarget; - final InsetsControlTarget inputMethodControlTarget = dc.mInputMethodControlTarget; - if (inputMethodTarget != null) { - pw.print(" mInputMethodTarget in display# "); pw.print(displayId); - pw.print(' '); pw.println(inputMethodTarget); + final InsetsControlTarget imeLayeringTarget = dc.getImeTarget(IME_TARGET_LAYERING); + final InsetsControlTarget imeInputTarget = dc.getImeTarget(IME_TARGET_INPUT); + final InsetsControlTarget imeControlTarget = dc.getImeTarget(IME_TARGET_CONTROL); + if (imeLayeringTarget != null) { + pw.print(" imeLayeringTarget in display# "); pw.print(displayId); + pw.print(' '); pw.println(imeLayeringTarget); } - if (inputMethodInputTarget != null) { - pw.print(" mInputMethodInputTarget in display# "); pw.print(displayId); - pw.print(' '); pw.println(inputMethodInputTarget); + if (imeInputTarget != null) { + pw.print(" imeInputTarget in display# "); pw.print(displayId); + pw.print(' '); pw.println(imeInputTarget); } - if (inputMethodControlTarget != null) { - pw.print(" inputMethodControlTarget in display# "); pw.print(displayId); - pw.print(' '); pw.println(inputMethodControlTarget); + if (imeControlTarget != null) { + pw.print(" imeControlTarget in display# "); pw.print(displayId); + pw.print(' '); pw.println(imeControlTarget); } }); pw.print(" mInTouchMode="); pw.println(mInTouchMode); @@ -7630,7 +7633,7 @@ public class WindowManagerService extends IWindowManager.Stub synchronized (mGlobalLock) { final WindowState imeTarget = mWindowMap.get(imeTargetWindowToken); if (imeTarget != null) { - imeTarget.getDisplayContent().setInputMethodInputTarget(imeTarget); + imeTarget.getDisplayContent().updateImeInputAndControlTarget(imeTarget); } } } @@ -7773,10 +7776,10 @@ public class WindowManagerService extends IWindowManager.Stub // requested to be hidden. dc.getInsetsStateController().getImeSourceProvider().abortShowImePostLayout(); } - if (dc != null && dc.mInputMethodControlTarget != null) { + if (dc != null && dc.getImeTarget(IME_TARGET_CONTROL) != null) { ProtoLog.d(WM_DEBUG_IME, "hideIme Control target: %s ", - dc.mInputMethodControlTarget); - dc.mInputMethodControlTarget.hideInsets( + dc.getImeTarget(IME_TARGET_CONTROL)); + dc.getImeTarget(IME_TARGET_CONTROL).hideInsets( WindowInsets.Type.ime(), true /* fromIme */); } if (dc != null) { @@ -7900,7 +7903,7 @@ public class WindowManagerService extends IWindowManager.Stub if (dc == null) { return null; } - final InsetsControlTarget target = dc.mInputMethodControlTarget; + final InsetsControlTarget target = dc.getImeTarget(IME_TARGET_CONTROL); if (target == null) { return null; } @@ -7913,10 +7916,10 @@ public class WindowManagerService extends IWindowManager.Stub public String getImeTargetNameForLogging(int displayId) { synchronized (mGlobalLock) { final DisplayContent dc = mRoot.getDisplayContent(displayId); - if (dc == null) { + if (dc == null || dc.getImeTarget(IME_TARGET_LAYERING) == null) { return null; } - return dc.mInputMethodTarget != null ? dc.mInputMethodTarget.getName() : null; + return dc.getImeTarget(IME_TARGET_LAYERING).getWindow().getName(); } } } diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 3bbdcb8dfedd..32b84a8d0a2c 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -119,6 +119,8 @@ import static com.android.server.policy.WindowManagerPolicy.TRANSIT_ENTER; import static com.android.server.policy.WindowManagerPolicy.TRANSIT_EXIT; import static com.android.server.policy.WindowManagerPolicy.TRANSIT_PREVIEW_DONE; import static com.android.server.wm.AnimationSpecProto.MOVE; +import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; +import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.DisplayContent.logsGestureExclusionRestrictions; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_DOCKED_DIVIDER; import static com.android.server.wm.DragResizeMode.DRAG_RESIZE_MODE_FREEFORM; @@ -1112,9 +1114,10 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final int layoutXDiff; final int layoutYDiff; final WindowState imeWin = mWmService.mRoot.getCurrentInputMethodWindow(); + final InsetsControlTarget imeTarget = dc.getImeTarget(IME_TARGET_LAYERING); final boolean isInputMethodAdjustTarget = windowsAreFloating - ? dc.mInputMethodTarget != null && task == dc.mInputMethodTarget.getTask() - : isInputMethodTarget(); + ? imeTarget != null && task == imeTarget.getWindow().getTask() + : isImeLayeringTarget(); final boolean isImeTarget = imeWin != null && imeWin.isVisibleNow() && isInputMethodAdjustTarget; if (isFullscreenAndFillsDisplay || layoutInParentFrame()) { @@ -1451,9 +1454,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override void onDisplayChanged(DisplayContent dc) { if (dc != null && mDisplayContent != null && dc != mDisplayContent - && mDisplayContent.mInputMethodInputTarget == this) { - dc.setInputMethodInputTarget(mDisplayContent.mInputMethodInputTarget); - mDisplayContent.mInputMethodInputTarget = null; + && getImeInputTarget() == this) { + dc.updateImeInputAndControlTarget(getImeInputTarget()); + mDisplayContent.setImeInputTarget(null); } super.onDisplayChanged(dc); // Window was not laid out for this display yet, so make sure mLayoutSeq does not match. @@ -2158,14 +2161,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } final DisplayContent dc = getDisplayContent(); - if (isInputMethodTarget()) { - // Make sure to set mInputMethodTarget as null when the removed window is the IME - // target, in case computeImeTarget may use the outdated target. - dc.mInputMethodTarget = null; + if (isImeLayeringTarget()) { + // Make sure to set mImeLayeringTarget as null when the removed window is the + // IME target, in case computeImeTarget may use the outdated target. + dc.setImeLayeringTarget(null); dc.computeImeTarget(true /* updateImeTarget */); } - if (dc.mInputMethodInputTarget == this) { - dc.setInputMethodInputTarget(null); + if (dc.getImeTarget(IME_TARGET_INPUT) == this) { + dc.updateImeInputAndControlTarget(null); } final int type = mAttrs.type; @@ -4615,7 +4618,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // directly above it. The exception is if we are in split screen // in which case we process the IME at the DisplayContent level to // ensure it is above the docked divider. - if (isInputMethodTarget() && !inSplitScreenWindowingMode()) { + if (isImeLayeringTarget() && !inSplitScreenWindowingMode()) { if (getDisplayContent().forAllImeWindows(callback, traverseTopToBottom)) { return true; } @@ -5211,9 +5214,9 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP @Override boolean needsZBoost() { - final WindowState inputMethodTarget = getDisplayContent().mInputMethodTarget; - if (mIsImWindow && inputMethodTarget != null) { - final ActivityRecord activity = inputMethodTarget.mActivityRecord; + final InsetsControlTarget target = getDisplayContent().getImeTarget(IME_TARGET_LAYERING); + if (mIsImWindow && target != null) { + final ActivityRecord activity = target.getWindow().mActivityRecord; if (activity != null) { return activity.needsZBoost(); } @@ -5365,14 +5368,14 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP if (isChildWindow()) { // If we are a child of the input method target we need this promotion. - if (getParentWindow().isInputMethodTarget()) { + if (getParentWindow().isImeLayeringTarget()) { return true; } } else if (mActivityRecord != null) { // Likewise if we share a token with the Input method target and are ordered // above it but not necessarily a child (e.g. a Dialog) then we also need // this promotion. - final WindowState imeTarget = getDisplayContent().mInputMethodTarget; + final WindowState imeTarget = getImeLayeringTarget(); boolean inTokenWithAndAboveImeTarget = imeTarget != null && imeTarget != this && imeTarget.mToken == mToken && mAttrs.type != TYPE_APPLICATION_STARTING @@ -5499,8 +5502,18 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP return !mTapExcludeRegion.isEmpty(); } - boolean isInputMethodTarget() { - return getDisplayContent().mInputMethodTarget == this; + boolean isImeLayeringTarget() { + return getDisplayContent().getImeTarget(IME_TARGET_LAYERING) == this; + } + + WindowState getImeLayeringTarget() { + final InsetsControlTarget target = getDisplayContent().getImeTarget(IME_TARGET_LAYERING); + return target != null ? target.getWindow() : null; + } + + WindowState getImeInputTarget() { + final InsetsControlTarget target = mDisplayContent.getImeTarget(IME_TARGET_INPUT); + return target != null ? target.getWindow() : null; } long getFrameNumber() { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 62cf3aa53e7c..d35d806741e6 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -3368,7 +3368,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final boolean qualityMayApplyToParent = canSetPasswordQualityOnParent(who.getPackageName(), caller.getUserId()); if (!qualityMayApplyToParent) { - Preconditions.checkArgument(!parent, + Preconditions.checkCallAuthorization(!parent, "Profile Owner may not apply password quality requirements device-wide"); } diff --git a/services/robotests/src/com/android/server/location/OWNERS b/services/robotests/src/com/android/server/location/OWNERS new file mode 100644 index 000000000000..696a0c22c605 --- /dev/null +++ b/services/robotests/src/com/android/server/location/OWNERS @@ -0,0 +1 @@ +file:/location/java/android/location/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/OWNERS b/services/tests/servicestests/src/com/android/server/OWNERS index 2463fc617f0b..6561778cb47d 100644 --- a/services/tests/servicestests/src/com/android/server/OWNERS +++ b/services/tests/servicestests/src/com/android/server/OWNERS @@ -1,5 +1,5 @@ per-file *Alarm* = file:/apex/jobscheduler/OWNERS -per-file *AppOps* = file:/core/java/android/permission/OWNERS +per-file *AppOp* = file:/core/java/android/permission/OWNERS per-file *Bluetooth* = file:/core/java/android/bluetooth/OWNERS per-file *Gnss* = file:/services/core/java/com/android/server/location/OWNERS per-file *Network* = file:/services/core/java/com/android/server/net/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java index 1e602f84071d..41e15631d258 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsNotedWatcherTest.java @@ -66,11 +66,11 @@ public class AppOpsNotedWatcherTest { inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(1)).onOpNoted(eq(AppOpsManager.OP_FINE_LOCATION), eq(Process.myUid()), eq(getContext().getPackageName()), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED)); inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(1)).onOpNoted(eq(AppOpsManager.OP_CAMERA), eq(Process.myUid()), eq(getContext().getPackageName()), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED)); // Stop watching appOpsManager.stopWatchingNoted(listener); @@ -94,7 +94,7 @@ public class AppOpsNotedWatcherTest { verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(2)).onOpNoted(eq(AppOpsManager.OP_FINE_LOCATION), eq(Process.myUid()), eq(getContext().getPackageName()), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED)); // Finish up appOpsManager.stopWatchingNoted(listener); diff --git a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java index 1aa697b04f1d..fec8aa9ceaff 100644 --- a/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java +++ b/services/tests/servicestests/src/com/android/server/appop/AppOpsStartedWatcherTest.java @@ -63,11 +63,11 @@ public class AppOpsStartedWatcherTest { inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(1)).onOpStarted(eq(AppOpsManager.OP_FINE_LOCATION), eq(Process.myUid()), eq(getContext().getPackageName()), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED)); inOrder.verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(1)).onOpStarted(eq(AppOpsManager.OP_CAMERA), eq(Process.myUid()), eq(getContext().getPackageName()), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED)); // Stop watching appOpsManager.stopWatchingStarted(listener); @@ -91,7 +91,7 @@ public class AppOpsStartedWatcherTest { verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS) .times(2)).onOpStarted(eq(AppOpsManager.OP_CAMERA), eq(Process.myUid()), eq(getContext().getPackageName()), - eq(AppOpsManager.MODE_ALLOWED)); + eq(AppOpsManager.OP_FLAG_SELF), eq(AppOpsManager.MODE_ALLOWED)); verifyNoMoreInteractions(listener); // Finish up diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index e2c5e97b8896..d9daf17058c9 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -5127,7 +5127,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { admin1.getPackageName(), managedProfileUserId); try { - assertExpectException(IllegalArgumentException.class, null, () -> + assertExpectException(SecurityException.class, null, () -> parentDpm.setPasswordQuality( admin1, DevicePolicyManager.PASSWORD_QUALITY_COMPLEX)); } finally { diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java index 2cb1113e7325..ef77f32bb211 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTest.java @@ -112,6 +112,7 @@ public class HdmiCecLocalDeviceTest { private HdmiCecMessageValidator mMessageValidator; private static byte[] param; private boolean mStandbyMessageReceived; + private boolean mWakeupMessageReceived; private boolean isControlEnabled; private int mPowerStatus; @@ -131,9 +132,21 @@ public class HdmiCecLocalDeviceTest { } @Override + boolean isPowerStandbyOrTransient() { + return mPowerStatus == HdmiControlManager.POWER_STATUS_STANDBY + || mPowerStatus + == HdmiControlManager.POWER_STATUS_TRANSIENT_TO_STANDBY; + } + + @Override void standby() { mStandbyMessageReceived = true; } + + @Override + void wakeUp() { + mWakeupMessageReceived = true; + } }; mHdmiControlService.setIoLooper(mTestLooper.getLooper()); mHdmiCecController = HdmiCecController.createWithNativeWrapper( @@ -276,4 +289,99 @@ public class HdmiCecLocalDeviceTest { assertThat(result).isTrue(); } + @Test + public void handleUserControlPressed_power_localDeviceInStandby_shouldTurnOn() { + mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isTrue(); + assertThat(mStandbyMessageReceived).isFalse(); + } + + @Test + public void handleUserControlPressed_power_localDeviceOn_shouldNotChangePowerStatus() { + mPowerStatus = HdmiControlManager.POWER_STATUS_ON; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isFalse(); + assertThat(mStandbyMessageReceived).isFalse(); + } + + @Test + public void handleUserControlPressed_powerToggleFunction_localDeviceInStandby_shouldTurnOn() { + mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isTrue(); + assertThat(mStandbyMessageReceived).isFalse(); + } + + @Test + public void handleUserControlPressed_powerToggleFunction_localDeviceOn_shouldTurnOff() { + mPowerStatus = HdmiControlManager.POWER_STATUS_ON; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isFalse(); + assertThat(mStandbyMessageReceived).isTrue(); + } + + @Test + public void handleUserControlPressed_powerOnFunction_localDeviceInStandby_shouldTurnOn() { + mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isTrue(); + assertThat(mStandbyMessageReceived).isFalse(); + } + + @Test + public void handleUserControlPressed_powerOnFunction_localDeviceOn_noPowerStatusChange() { + mPowerStatus = HdmiControlManager.POWER_STATUS_ON; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER_ON_FUNCTION)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isFalse(); + assertThat(mStandbyMessageReceived).isFalse(); + } + + @Test + public void handleUserControlPressed_powerOffFunction_localDeviceStandby_noPowerStatusChange() { + mPowerStatus = HdmiControlManager.POWER_STATUS_STANDBY; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isFalse(); + assertThat(mStandbyMessageReceived).isFalse(); + } + + @Test + public void handleUserControlPressed_powerOffFunction_localDeviceOn_shouldTurnOff() { + mPowerStatus = HdmiControlManager.POWER_STATUS_ON; + boolean result = mHdmiLocalDevice.handleUserControlPressed( + HdmiCecMessageBuilder.buildUserControlPressed(ADDR_TV, ADDR_PLAYBACK_1, + HdmiCecKeycode.CEC_KEYCODE_POWER_OFF_FUNCTION)); + + assertThat(result).isTrue(); + assertThat(mWakeupMessageReceived).isFalse(); + assertThat(mStandbyMessageReceived).isTrue(); + } } diff --git a/services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java index 6cea9280f080..4f6441ff4e62 100644 --- a/services/tests/servicestests/src/com/android/server/pm/permission/PermissionManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/permission/LegacyPermissionManagerServiceTest.java @@ -29,14 +29,10 @@ import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Process; -import android.permission.PermissionManagerInternal; import androidx.test.InstrumentationRegistry; import androidx.test.runner.AndroidJUnit4; -import com.android.server.LocalServices; - -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -44,19 +40,17 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) -public class PermissionManagerServiceTest { - private static final String TAG = "PermissionManagerServiceTag"; - +public class LegacyPermissionManagerServiceTest { private static final int SYSTEM_UID = 1000; private static final int SYSTEM_PID = 1234; private static final int APP_UID = Process.FIRST_APPLICATION_UID; private static final int APP_PID = 5678; - private PermissionManagerService mPermissionManagerService; + private LegacyPermissionManagerService mLegacyPermissionManagerService; private Context mContext; @Mock - private PermissionManagerService.Injector mInjector; + private LegacyPermissionManagerService.Injector mInjector; @Mock private AppOpsManager mAppOpsManager; @@ -69,16 +63,7 @@ public class PermissionManagerServiceTest { MockitoAnnotations.initMocks(this); mContext = InstrumentationRegistry.getContext(); - mPermissionManagerService = new PermissionManagerService(mContext, mInjector); - } - - @After - public void tearDown() { - // The LocalServices added by the constructor of the PermissionManagerService can either be - // removed here after each test when tests are run serially, or to run them in parallel - // the Injector can provide methods to add these that can be ignored by the mock. - LocalServices.removeServiceForTest(PermissionManagerServiceInternal.class); - LocalServices.removeServiceForTest(PermissionManagerInternal.class); + mLegacyPermissionManagerService = new LegacyPermissionManagerService(mContext, mInjector); } @Test @@ -88,7 +73,7 @@ public class PermissionManagerServiceTest { setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID); assertThrows(SecurityException.class, - () -> mPermissionManagerService.checkDeviceIdentifierAccess( + () -> mLegacyPermissionManagerService.checkDeviceIdentifierAccess( mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID, SYSTEM_UID)); } @@ -100,7 +85,7 @@ public class PermissionManagerServiceTest { setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID); assertThrows(SecurityException.class, - () -> mPermissionManagerService.checkDeviceIdentifierAccess( + () -> mLegacyPermissionManagerService.checkDeviceIdentifierAccess( mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, SYSTEM_PID, APP_UID)); } @@ -111,7 +96,7 @@ public class PermissionManagerServiceTest { // checks can run through completion and return denied. setupCheckDeviceIdentifierAccessTest(APP_PID, APP_UID); - int result = mPermissionManagerService.checkDeviceIdentifierAccess( + int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess( mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID, APP_UID); @@ -122,7 +107,7 @@ public class PermissionManagerServiceTest { public void checkDeviceIdentifierAccess_systemUid_returnsGranted() { // The system UID should always have access to device identifiers. setupCheckDeviceIdentifierAccessTest(SYSTEM_PID, SYSTEM_UID); - int result = mPermissionManagerService.checkDeviceIdentifierAccess( + int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess( mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, SYSTEM_PID, SYSTEM_UID); @@ -137,7 +122,7 @@ public class PermissionManagerServiceTest { when(mInjector.checkPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, APP_PID, APP_UID)).thenReturn(PackageManager.PERMISSION_GRANTED); - int result = mPermissionManagerService.checkDeviceIdentifierAccess( + int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess( mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID, APP_UID); @@ -153,7 +138,7 @@ public class PermissionManagerServiceTest { eq(APP_UID), eq(mContext.getPackageName()), any(), any())).thenReturn( AppOpsManager.MODE_ALLOWED); - int result = mPermissionManagerService.checkDeviceIdentifierAccess( + int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess( mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID, APP_UID); @@ -168,7 +153,7 @@ public class PermissionManagerServiceTest { when(mDevicePolicyManager.hasDeviceIdentifierAccess(mContext.getPackageName(), APP_PID, APP_UID)).thenReturn(true); - int result = mPermissionManagerService.checkDeviceIdentifierAccess( + int result = mLegacyPermissionManagerService.checkDeviceIdentifierAccess( mContext.getPackageName(), "testCheckDeviceIdentifierAccess", null, APP_PID, APP_UID); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java index b354a890a721..45b6bce1f811 100755 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java @@ -305,6 +305,8 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { @Mock StatusBarManagerInternal mStatusBar; + private NotificationManagerService.WorkerHandler mWorkerHandler; + // Use a Testable subclass so we can simulate calls from the system without failing. private static class TestableNotificationManagerService extends NotificationManagerService { int countSystemChecks = 0; @@ -482,14 +484,13 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { when(mAssistants.isAdjustmentAllowed(anyString())).thenReturn(true); - mService.init(mService.new WorkerHandler(mTestableLooper.getLooper()), - mRankingHandler, mPackageManager, mPackageManagerClient, mockLightsManager, - mListeners, mAssistants, mConditionProviders, - mCompanionMgr, mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, - mGroupHelper, mAm, mAtm, mAppUsageStats, - mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal, - mAppOpsManager, mUm, mHistoryManager, mStatsManager, - mock(TelephonyManager.class), mAmi, mToastRateLimiter); + mWorkerHandler = mService.new WorkerHandler(mTestableLooper.getLooper()); + mService.init(mWorkerHandler, mRankingHandler, mPackageManager, mPackageManagerClient, + mockLightsManager, mListeners, mAssistants, mConditionProviders, mCompanionMgr, + mSnoozeHelper, mUsageStats, mPolicyFile, mActivityManager, mGroupHelper, mAm, mAtm, + mAppUsageStats, mock(DevicePolicyManagerInternal.class), mUgm, mUgmInternal, + mAppOpsManager, mUm, mHistoryManager, mStatsManager, mock(TelephonyManager.class), + mAmi, mToastRateLimiter); mService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY); mService.setAudioManager(mAudioManager); @@ -575,6 +576,10 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { InstrumentationRegistry.getInstrumentation() .getUiAutomation().dropShellPermissionIdentity(); + // Remove scheduled messages that would be processed when the test is already done, and + // could cause issues, for example, messages that remove/cancel shown toasts (this causes + // problematic interactions with mocks when they're no longer working as expected). + mWorkerHandler.removeCallbacksAndMessages(null); } private void simulatePackageSuspendBroadcast(boolean suspend, String pkg, diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 2053bfb45884..b451d9f4aaf0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -62,6 +62,8 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.same; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.times; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; +import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.SurfaceAnimator.ANIMATION_TYPE_FIXED_TRANSFORM; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_NORMAL; @@ -168,7 +170,7 @@ public class DisplayContentTests extends WindowTestsBase { final WindowState imeAppTarget = createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "imeAppTarget"); - mDisplayContent.mInputMethodTarget = imeAppTarget; + mDisplayContent.setImeLayeringTarget(imeAppTarget); assertForAllWindowsOrder(Arrays.asList( mWallpaperWindow, @@ -187,7 +189,7 @@ public class DisplayContentTests extends WindowTestsBase { @UseTestDisplay(addAllCommonWindows = true) @Test public void testForAllWindows_WithChildWindowImeTarget() throws Exception { - mDisplayContent.mInputMethodTarget = mChildAppWindowAbove; + mDisplayContent.setImeLayeringTarget(mChildAppWindowAbove); assertForAllWindowsOrder(Arrays.asList( mWallpaperWindow, @@ -205,7 +207,7 @@ public class DisplayContentTests extends WindowTestsBase { @UseTestDisplay(addAllCommonWindows = true) @Test public void testForAllWindows_WithStatusBarImeTarget() throws Exception { - mDisplayContent.mInputMethodTarget = mStatusBarWindow; + mDisplayContent.setImeLayeringTarget(mStatusBarWindow); assertForAllWindowsOrder(Arrays.asList( mWallpaperWindow, @@ -223,7 +225,7 @@ public class DisplayContentTests extends WindowTestsBase { @UseTestDisplay(addAllCommonWindows = true) @Test public void testForAllWindows_WithNotificationShadeImeTarget() throws Exception { - mDisplayContent.mInputMethodTarget = mNotificationShadeWindow; + mDisplayContent.setImeLayeringTarget(mNotificationShadeWindow); assertForAllWindowsOrder(Arrays.asList( mWallpaperWindow, @@ -855,15 +857,17 @@ public class DisplayContentTests extends WindowTestsBase { mDisplayContent.setInputMethodWindowLocked(mImeWindow); newDisplay.setInputMethodWindowLocked(null); assertEquals("appWin should be IME target window", - appWin, mDisplayContent.mInputMethodTarget); - assertNull("newDisplay Ime target: ", newDisplay.mInputMethodTarget); + appWin, mDisplayContent.getImeTarget(IME_TARGET_LAYERING)); + assertNull("newDisplay Ime target: ", newDisplay.getImeTarget(IME_TARGET_LAYERING)); // Switch input method window on new display & make sure the input method target also // switched as expected. newDisplay.setInputMethodWindowLocked(mImeWindow); mDisplayContent.setInputMethodWindowLocked(null); - assertEquals("appWin1 should be IME target window", appWin1, newDisplay.mInputMethodTarget); - assertNull("default display Ime target: ", mDisplayContent.mInputMethodTarget); + assertEquals("appWin1 should be IME target window", appWin1, + newDisplay.getImeTarget(IME_TARGET_LAYERING)); + assertNull("default display Ime target: ", + mDisplayContent.getImeTarget(IME_TARGET_LAYERING)); } @Test @@ -937,17 +941,17 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testComputeImeParent_app() throws Exception { final DisplayContent dc = createNewDisplay(); - dc.mInputMethodTarget = createWindow(null, TYPE_BASE_APPLICATION, "app"); - dc.mInputMethodInputTarget = dc.mInputMethodTarget; - assertEquals(dc.mInputMethodTarget.mActivityRecord.getSurfaceControl(), - dc.computeImeParent()); + dc.setImeLayeringTarget(createWindow(null, TYPE_BASE_APPLICATION, "app")); + dc.setImeInputTarget(dc.getImeTarget(IME_TARGET_LAYERING).getWindow()); + assertEquals(dc.getImeTarget(IME_TARGET_LAYERING).getWindow() + .mActivityRecord.getSurfaceControl(), dc.computeImeParent()); } @Test public void testComputeImeParent_app_notFullscreen() throws Exception { final DisplayContent dc = createNewDisplay(); - dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "app"); - dc.mInputMethodTarget.setWindowingMode( + dc.setImeLayeringTarget(createWindow(null, TYPE_STATUS_BAR, "app")); + dc.getImeTarget(IME_TARGET_LAYERING).getWindow().setWindowingMode( WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); assertEquals(dc.getImeContainer().getParentSurfaceControl(), dc.computeImeParent()); } @@ -957,7 +961,7 @@ public class DisplayContentTests extends WindowTestsBase { public void testComputeImeParent_app_notMatchParentBounds() { spyOn(mAppWindow.mActivityRecord); doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds(); - mDisplayContent.mInputMethodTarget = mAppWindow; + mDisplayContent.setImeLayeringTarget(mAppWindow); // The surface parent of IME should be the display instead of app window. assertEquals(mDisplayContent.getImeContainer().getParentSurfaceControl(), mDisplayContent.computeImeParent()); @@ -966,7 +970,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test public void testComputeImeParent_noApp() throws Exception { final DisplayContent dc = createNewDisplay(); - dc.mInputMethodTarget = createWindow(null, TYPE_STATUS_BAR, "statusBar"); + dc.setImeLayeringTarget(createWindow(null, TYPE_STATUS_BAR, "statusBar")); assertEquals(dc.getImeContainer().getParentSurfaceControl(), dc.computeImeParent()); } @@ -976,12 +980,12 @@ public class DisplayContentTests extends WindowTestsBase { WindowState app = createWindow(null, TYPE_BASE_APPLICATION, dc, "app"); - dc.mInputMethodInputTarget = app; + dc.setImeInputTarget(app); assertEquals(app, dc.computeImeControlTarget()); app.removeImmediately(); - assertNull(dc.mInputMethodInputTarget); + assertNull(dc.getImeTarget(IME_TARGET_INPUT)); assertNull(dc.computeImeControlTarget()); } @@ -989,20 +993,21 @@ public class DisplayContentTests extends WindowTestsBase { public void testComputeImeControlTarget() throws Exception { final DisplayContent dc = createNewDisplay(); dc.setRemoteInsetsController(createDisplayWindowInsetsController()); - dc.mInputMethodInputTarget = createWindow(null, TYPE_BASE_APPLICATION, "app"); - dc.mInputMethodTarget = dc.mInputMethodInputTarget; - assertEquals(dc.mInputMethodInputTarget, dc.computeImeControlTarget()); + dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app")); + dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow()); + assertEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(), dc.computeImeControlTarget()); } @Test public void testComputeImeControlTarget_splitscreen() throws Exception { final DisplayContent dc = createNewDisplay(); - dc.mInputMethodInputTarget = createWindow(null, TYPE_BASE_APPLICATION, "app"); - dc.mInputMethodInputTarget.setWindowingMode( + dc.setImeInputTarget(createWindow(null, TYPE_BASE_APPLICATION, "app")); + dc.getImeTarget(IME_TARGET_INPUT).getWindow().setWindowingMode( WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); - dc.mInputMethodTarget = dc.mInputMethodInputTarget; + dc.setImeLayeringTarget(dc.getImeTarget(IME_TARGET_INPUT).getWindow()); dc.setRemoteInsetsController(createDisplayWindowInsetsController()); - assertNotEquals(dc.mInputMethodInputTarget, dc.computeImeControlTarget()); + assertNotEquals(dc.getImeTarget(IME_TARGET_INPUT).getWindow(), + dc.computeImeControlTarget()); } @UseTestDisplay(addWindows = W_ACTIVITY) @@ -1010,8 +1015,9 @@ public class DisplayContentTests extends WindowTestsBase { public void testComputeImeControlTarget_notMatchParentBounds() throws Exception { spyOn(mAppWindow.mActivityRecord); doReturn(false).when(mAppWindow.mActivityRecord).matchParentBounds(); - mDisplayContent.mInputMethodInputTarget = mAppWindow; - mDisplayContent.mInputMethodTarget = mDisplayContent.mInputMethodInputTarget; + mDisplayContent.setImeInputTarget(mAppWindow); + mDisplayContent.setImeLayeringTarget( + mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow()); mDisplayContent.setRemoteInsetsController(createDisplayWindowInsetsController()); assertEquals(mAppWindow, mDisplayContent.computeImeControlTarget()); } @@ -1637,7 +1643,7 @@ public class DisplayContentTests extends WindowTestsBase { TYPE_BASE_APPLICATION, "nextImeTargetApp"); spyOn(child1); doReturn(true).when(child1).inSplitScreenWindowingMode(); - mDisplayContent.mInputMethodTarget = child1; + mDisplayContent.setImeLayeringTarget(child1); spyOn(nextImeTargetApp); spyOn(mAppWindow); @@ -1648,7 +1654,7 @@ public class DisplayContentTests extends WindowTestsBase { child1.removeImmediately(); verify(mDisplayContent).computeImeTarget(true); - assertNull(mDisplayContent.mInputMethodInputTarget); + assertNull(mDisplayContent.getImeTarget(IME_TARGET_INPUT)); verify(child1, never()).needsRelativeLayeringToIme(); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java index 59d195b670a8..5f9626711896 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/ImeInsetsSourceProviderTest.java @@ -52,19 +52,19 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { public void testTransparentControlTargetWindowCanShowIme() { final WindowState appWin = createWindow(null, TYPE_APPLICATION, "app"); final WindowState popup = createWindow(appWin, TYPE_APPLICATION, "popup"); - mDisplayContent.mInputMethodControlTarget = popup; - mDisplayContent.mInputMethodTarget = appWin; + mDisplayContent.setImeControlTarget(popup); + mDisplayContent.setImeLayeringTarget(appWin); popup.mAttrs.format = PixelFormat.TRANSPARENT; mImeProvider.scheduleShowImePostLayout(appWin); - assertTrue(mImeProvider.isImeTargetFromDisplayContentAndImeSame()); + assertTrue(mImeProvider.isReadyToShowIme()); } @Test public void testInputMethodInputTargetCanShowIme() { WindowState target = createWindow(null, TYPE_APPLICATION, "app"); - mDisplayContent.mInputMethodTarget = target; + mDisplayContent.setImeLayeringTarget(target); mImeProvider.scheduleShowImePostLayout(target); - assertTrue(mImeProvider.isImeTargetFromDisplayContentAndImeSame()); + assertTrue(mImeProvider.isReadyToShowIme()); } @Test @@ -74,8 +74,8 @@ public class ImeInsetsSourceProviderTest extends WindowTestsBase { mImeProvider.setWindow(ime, null, null); WindowState target = createWindow(null, TYPE_APPLICATION, "app"); - mDisplayContent.mInputMethodTarget = target; - mDisplayContent.mInputMethodControlTarget = target; + mDisplayContent.setImeLayeringTarget(target); + mDisplayContent.setImeControlTarget(target); mImeProvider.scheduleShowImePostLayout(target); assertFalse(mImeProvider.isImeShowing()); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java index 90caf35e2936..276643847712 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsStateControllerTest.java @@ -31,6 +31,7 @@ import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; +import static com.android.server.wm.DisplayContent.IME_TARGET_INPUT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -181,16 +182,18 @@ public class InsetsStateControllerTest extends WindowTestsBase { // This can be the IME z-order target while app cannot be the IME z-order target. // This is also the only IME control target in this test, so IME won't be invisible caused // by the control-target change. - mDisplayContent.mInputMethodInputTarget = createWindow(null, TYPE_APPLICATION, "base"); + mDisplayContent.updateImeInputAndControlTarget( + createWindow(null, TYPE_APPLICATION, "base")); // Make IME and stay visible during the test. mImeWindow.setHasSurface(true); getController().getSourceProvider(ITYPE_IME).setWindow(mImeWindow, null, null); - getController().onImeControlTargetChanged(mDisplayContent.mInputMethodInputTarget); + getController().onImeControlTargetChanged(mDisplayContent.getImeTarget(IME_TARGET_INPUT)); final InsetsState requestedState = new InsetsState(); requestedState.getSource(ITYPE_IME).setVisible(true); - mDisplayContent.mInputMethodInputTarget.updateRequestedVisibility(requestedState); - getController().onInsetsModified(mDisplayContent.mInputMethodInputTarget); + mDisplayContent.getImeTarget(IME_TARGET_INPUT).getWindow() + .updateRequestedVisibility(requestedState); + getController().onInsetsModified(mDisplayContent.getImeTarget(IME_TARGET_INPUT)); // Send our spy window (app) into the system so that we can detect the invocation. final WindowState win = createWindow(null, TYPE_APPLICATION, "app"); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index dd6e490b8282..c7175a0c424d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -30,6 +30,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.mock; import static com.android.dx.mockito.inline.extended.ExtendedMockito.never; import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; import static com.android.server.wm.Task.ActivityState.STOPPED; import static org.junit.Assert.assertEquals; @@ -270,7 +271,7 @@ public class SizeCompatTests extends WindowTestsBase { // The position should be horizontal centered. assertEquals((displayWidth - bounds.width()) / 2, bounds.left); - mActivity.mDisplayContent.mInputMethodTarget = addWindowToActivity(mActivity); + mActivity.mDisplayContent.setImeLayeringTarget(addWindowToActivity(mActivity)); // Make sure IME cannot attach to the app, otherwise IME window will also be shifted. assertFalse(mActivity.mDisplayContent.isImeAttachedToApp()); @@ -290,9 +291,9 @@ public class SizeCompatTests extends WindowTestsBase { assertFitted(); rotateDisplay(mActivity.mDisplayContent, ROTATION_90); - mActivity.mDisplayContent.mInputMethodTarget = addWindowToActivity(mActivity); - mActivity.mDisplayContent.mInputMethodInputTarget = - mActivity.mDisplayContent.mInputMethodTarget; + mActivity.mDisplayContent.setImeLayeringTarget(addWindowToActivity(mActivity)); + mActivity.mDisplayContent.setImeInputTarget( + mActivity.mDisplayContent.getImeTarget(IME_TARGET_LAYERING).getWindow()); // Because the aspect ratio of display doesn't exceed the max aspect ratio of activity. // The activity should still fill its parent container and IME can attach to the activity. assertTrue(mActivity.matchParentBounds()); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java index 78e873e2b0a3..f13847559aa0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowContainerTraversalTests.java @@ -56,7 +56,7 @@ public class WindowContainerTraversalTests extends WindowTestsBase { WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, ACTIVITY_TYPE_STANDARD, TYPE_BASE_APPLICATION, mDisplayContent, "splitScreenSecondaryWindow"); - mDisplayContent.mInputMethodTarget = splitScreenWindow; + mDisplayContent.setImeLayeringTarget(splitScreenWindow); Consumer<WindowState> c = mock(Consumer.class); mDisplayContent.forAllWindows(c, false); diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java index d2be50d02ef3..4a6906b88710 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowFrameTests.java @@ -292,7 +292,7 @@ public class WindowFrameTests extends WindowTestsBase { // Make IME attach to the window and can produce insets. final DisplayContent dc = mTestDisplayContent; - dc.mInputMethodTarget = w; + dc.setImeLayeringTarget(w); WindowState mockIme = mock(WindowState.class); Mockito.doReturn(true).when(mockIme).isVisibleNow(); dc.mInputMethodWindow = mockIme; diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java index a57de094a210..76f8207b4ad8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowStateTests.java @@ -789,7 +789,7 @@ public class WindowStateTests extends WindowTestsBase { public void testNeedsRelativeLayeringToIme_notAttached() { WindowState sameTokenWindow = createWindow(null, TYPE_BASE_APPLICATION, mAppWindow.mToken, "SameTokenWindow"); - mDisplayContent.mInputMethodTarget = mAppWindow; + mDisplayContent.setImeLayeringTarget(mAppWindow); sameTokenWindow.mActivityRecord.getStack().setWindowingMode( WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); assertTrue(sameTokenWindow.needsRelativeLayeringToIme()); @@ -802,7 +802,7 @@ public class WindowStateTests extends WindowTestsBase { public void testNeedsRelativeLayeringToIme_startingWindow() { WindowState sameTokenWindow = createWindow(null, TYPE_APPLICATION_STARTING, mAppWindow.mToken, "SameTokenWindow"); - mDisplayContent.mInputMethodTarget = mAppWindow; + mDisplayContent.setImeLayeringTarget(mAppWindow); sameTokenWindow.mActivityRecord.getStack().setWindowingMode( WINDOWING_MODE_SPLIT_SCREEN_PRIMARY); assertFalse(sameTokenWindow.needsRelativeLayeringToIme()); diff --git a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java index e44d47a59fe5..811a14666db9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ZOrderingTests.java @@ -218,7 +218,7 @@ public class ZOrderingTests extends WindowTestsBase { @Test public void testAssignWindowLayers_ForImeWithNoTarget() { - mDisplayContent.mInputMethodTarget = null; + mDisplayContent.setImeLayeringTarget(null); mDisplayContent.assignChildLayers(mTransaction); // The Ime has an higher base layer than app windows and lower base layer than system @@ -236,7 +236,7 @@ public class ZOrderingTests extends WindowTestsBase { @Test public void testAssignWindowLayers_ForImeWithAppTarget() { final WindowState imeAppTarget = createWindow("imeAppTarget"); - mDisplayContent.mInputMethodTarget = imeAppTarget; + mDisplayContent.setImeLayeringTarget(imeAppTarget); mDisplayContent.assignChildLayers(mTransaction); @@ -262,7 +262,7 @@ public class ZOrderingTests extends WindowTestsBase { TYPE_APPLICATION_MEDIA_OVERLAY, imeAppTarget.mToken, "imeAppTargetChildBelowWindow"); - mDisplayContent.mInputMethodTarget = imeAppTarget; + mDisplayContent.setImeLayeringTarget(imeAppTarget); mDisplayContent.assignChildLayers(mTransaction); // Ime should be above all app windows except for child windows that are z-ordered above it @@ -284,7 +284,7 @@ public class ZOrderingTests extends WindowTestsBase { final WindowState imeAppTarget = createWindow("imeAppTarget"); final WindowState appAboveImeTarget = createWindow("appAboveImeTarget"); - mDisplayContent.mInputMethodTarget = imeAppTarget; + mDisplayContent.setImeLayeringTarget(imeAppTarget); mDisplayContent.assignChildLayers(mTransaction); // Ime should be above all app windows except for non-fullscreen app window above it and @@ -307,7 +307,7 @@ public class ZOrderingTests extends WindowTestsBase { mDisplayContent, "imeSystemOverlayTarget", true /* ownerCanAddInternalSystemWindow */); - mDisplayContent.mInputMethodTarget = imeSystemOverlayTarget; + mDisplayContent.setImeLayeringTarget(imeSystemOverlayTarget); mDisplayContent.assignChildLayers(mTransaction); // The IME target base layer is higher than all window except for the nav bar window, so the @@ -330,7 +330,7 @@ public class ZOrderingTests extends WindowTestsBase { @Test public void testAssignWindowLayers_ForStatusBarImeTarget() { - mDisplayContent.mInputMethodTarget = mStatusBarWindow; + mDisplayContent.setImeLayeringTarget(mStatusBarWindow); mDisplayContent.assignChildLayers(mTransaction); assertWindowHigher(mImeWindow, mChildAppWindowAbove); diff --git a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java index 76291631b37d..8531b507a92f 100644 --- a/telephony/common/com/android/internal/telephony/CarrierAppUtils.java +++ b/telephony/common/com/android/internal/telephony/CarrierAppUtils.java @@ -26,7 +26,7 @@ import android.os.Build; import android.os.CarrierAssociatedAppEntry; import android.os.SystemConfigManager; import android.os.UserHandle; -import android.permission.PermissionManager; +import android.permission.LegacyPermissionManager; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.ArrayMap; @@ -141,8 +141,8 @@ public final class CarrierAppUtils { Map<String, List<CarrierAssociatedAppEntry>> systemCarrierAssociatedAppsDisabledUntilUsed, Context context) { PackageManager packageManager = context.getPackageManager(); - PermissionManager permissionManager = - (PermissionManager) context.getSystemService(Context.PERMISSION_SERVICE); + LegacyPermissionManager permissionManager = (LegacyPermissionManager) + context.getSystemService(Context.LEGACY_PERMISSION_SERVICE); List<ApplicationInfo> candidates = getDefaultCarrierAppCandidatesHelper( userId, systemCarrierAppsDisabledUntilUsed, context); if (candidates == null || candidates.isEmpty()) { diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java index 4bb7cc47d702..556df885dec3 100644 --- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java +++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java @@ -27,7 +27,7 @@ import android.os.Binder; import android.os.Build; import android.os.Process; import android.os.UserHandle; -import android.permission.PermissionManager; +import android.permission.LegacyPermissionManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; @@ -327,8 +327,8 @@ public final class TelephonyPermissions { return true; } - PermissionManager permissionManager = (PermissionManager) context.getSystemService( - Context.PERMISSION_SERVICE); + LegacyPermissionManager permissionManager = (LegacyPermissionManager) + context.getSystemService(Context.LEGACY_PERMISSION_SERVICE); if (permissionManager.checkDeviceIdentifierAccess(callingPackage, message, callingFeatureId, pid, uid) == PackageManager.PERMISSION_GRANTED) { return true; diff --git a/telephony/java/android/telephony/DataFailCause.java b/telephony/java/android/telephony/DataFailCause.java index 8b7a243c30e6..d502da9fb9ec 100644 --- a/telephony/java/android/telephony/DataFailCause.java +++ b/telephony/java/android/telephony/DataFailCause.java @@ -916,6 +916,84 @@ public final class DataFailCause { /** System preference change back to SRAT during handoff */ public static final int HANDOFF_PREFERENCE_CHANGED = 0x8CB; + //IKE error notifications message as specified in 3GPP TS 24.302 (Section 8.1.2.2). + + /** The PDN connection corresponding to the requested APN has been rejected. */ + public static final int IWLAN_PDN_CONNECTION_REJECTION = 0x2000; + /** + * The PDN connection has been rejected. No additional PDN connections can be established + * for the UE due to the network policies or capabilities. + */ + public static final int IWLAN_MAX_CONNECTION_REACHED = 0x2001; + /** + * The PDN connection has been rejected due to a semantic error in TFT operation. + */ + public static final int IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION = 0x2031; + /** + * The PDN connection has been rejected due to a syntactic error in TFT operation. + */ + public static final int IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION = 0x2032; + /** + * The PDN connection has been rejected due to sematic errors in the packet filter. + */ + public static final int IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS = 0x2034; + /** + * The PDN connection has been rejected due to syntactic errors in the packet filter. + */ + public static final int IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS = 0x2035; + /** + * No non-3GPP subscription is associated with the IMSI. + * The UE is not allowed to use non-3GPP access to EPC. + */ + public static final int IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED = 0x2328; + /** The user identified by the IMSI is unknown. */ + public static final int IWLAN_USER_UNKNOWN = 0x2329; + /** + * The requested APN is not included in the user's profile, + * and therefore is not authorized for that user. + */ + public static final int IWLAN_NO_APN_SUBSCRIPTION = 0x232A; + /** The user is barred from using the non-3GPP access or the subscribed APN. */ + public static final int IWLAN_AUTHORIZATION_REJECTED = 0x232B; + /** The Mobile Equipment used is not acceptable to the network */ + public static final int IWLAN_ILLEGAL_ME = 0x232E; + /** + * The network has determined that the requested procedure cannot be completed successfully + * due to network failure. + */ + public static final int IWLAN_NETWORK_FAILURE = 0x2904; + /** The access type is restricted to the user. */ + public static final int IWLAN_RAT_TYPE_NOT_ALLOWED = 0x2AF9; + /** The network does not accept emergency PDN bringup request using an IMEI */ + public static final int IWLAN_IMEI_NOT_ACCEPTED = 0x2AFD; + /** + * The ePDG performs PLMN filtering (based on roaming agreements) and rejects + * the request from the UE. + * The UE requests service in a PLMN where the UE is not allowed to operate. + */ + public static final int IWLAN_PLMN_NOT_ALLOWED = 0x2B03; + /** The ePDG does not support un-authenticated IMSI based emergency PDN bringup **/ + public static final int IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED = 0x2B2F; + + // Device is unable to establish an IPSec tunnel with the ePDG for any reason + // e.g authentication fail or certificate validation or DNS Resolution and timeout failure. + + /** IKE configuration error resulting in failure */ + public static final int IWLAN_IKEV2_CONFIG_FAILURE = 0x4000; + /** + * Sent in the response to an IKE_AUTH message when, for some reason, + * the authentication failed. + */ + public static final int IWLAN_IKEV2_AUTH_FAILURE = 0x4001; + /** IKE message timeout, tunnel setup failed due to no response from EPDG */ + public static final int IWLAN_IKEV2_MSG_TIMEOUT = 0x4002; + /** IKE Certification validation failure */ + public static final int IWLAN_IKEV2_CERT_INVALID = 0x4003; + /** Unable to resolve FQDN for the ePDG to an IP address */ + public static final int IWLAN_DNS_RESOLUTION_NAME_FAILURE = 0x4004; + /** No response received from the DNS Server due to a timeout*/ + public static final int IWLAN_DNS_RESOLUTION_TIMEOUT = 0x4005; + // OEM sepecific error codes. To be used by OEMs when they don't // want to reveal error code which would be replaced by ERROR_UNSPECIFIED public static final int OEM_DCFAILCAUSE_1 = 0x1001; @@ -1341,6 +1419,34 @@ public final class DataFailCause { sFailCauseMap.put(VSNCP_RECONNECT_NOT_ALLOWED, "VSNCP_RECONNECT_NOT_ALLOWED"); sFailCauseMap.put(IPV6_PREFIX_UNAVAILABLE, "IPV6_PREFIX_UNAVAILABLE"); sFailCauseMap.put(HANDOFF_PREFERENCE_CHANGED, "HANDOFF_PREFERENCE_CHANGED"); + sFailCauseMap.put(IWLAN_PDN_CONNECTION_REJECTION, "IWLAN_PDN_CONNECTION_REJECTION"); + sFailCauseMap.put(IWLAN_MAX_CONNECTION_REACHED, "IWLAN_MAX_CONNECTION_REACHED"); + sFailCauseMap.put(IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION, + "IWLAN_SEMANTIC_ERROR_IN_THE_TFT_OPERATION"); + sFailCauseMap.put(IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION, + "IWLAN_SYNTACTICAL_ERROR_IN_THE_TFT_OPERATION"); + sFailCauseMap.put(IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS, + "IWLAN_SEMANTIC_ERRORS_IN_PACKET_FILTERS"); + sFailCauseMap.put(IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS, + "IWLAN_SYNTACTICAL_ERRORS_IN_PACKET_FILTERS"); + sFailCauseMap.put(IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED, + "IWLAN_NON_3GPP_ACCESS_TO_EPC_NOT_ALLOWED"); + sFailCauseMap.put(IWLAN_USER_UNKNOWN, "IWLAN_USER_UNKNOWN"); + sFailCauseMap.put(IWLAN_NO_APN_SUBSCRIPTION, "IWLAN_NO_APN_SUBSCRIPTION"); + sFailCauseMap.put(IWLAN_AUTHORIZATION_REJECTED, "IWLAN_AUTHORIZATION_REJECTED"); + sFailCauseMap.put(IWLAN_ILLEGAL_ME, "IWLAN_ILLEGAL_ME"); + sFailCauseMap.put(IWLAN_NETWORK_FAILURE, "IWLAN_NETWORK_FAILURE"); + sFailCauseMap.put(IWLAN_RAT_TYPE_NOT_ALLOWED, "IWLAN_RAT_TYPE_NOT_ALLOWED"); + sFailCauseMap.put(IWLAN_IMEI_NOT_ACCEPTED, "IWLAN_IMEI_NOT_ACCEPTED"); + sFailCauseMap.put(IWLAN_PLMN_NOT_ALLOWED, "IWLAN_PLMN_NOT_ALLOWED"); + sFailCauseMap.put(IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED, + "IWLAN_UNAUTHENTICATED_EMERGENCY_NOT_SUPPORTED"); + sFailCauseMap.put(IWLAN_IKEV2_CONFIG_FAILURE, "IWLAN_IKEV2_CONFIG_FAILURE"); + sFailCauseMap.put(IWLAN_IKEV2_AUTH_FAILURE, "IWLAN_IKEV2_AUTH_FAILURE"); + sFailCauseMap.put(IWLAN_IKEV2_MSG_TIMEOUT, "IWLAN_IKEV2_MSG_TIMEOUT"); + sFailCauseMap.put(IWLAN_IKEV2_CERT_INVALID, "IWLAN_IKEV2_CERT_INVALID"); + sFailCauseMap.put(IWLAN_DNS_RESOLUTION_NAME_FAILURE, "IWLAN_DNS_RESOLUTION_NAME_FAILURE"); + sFailCauseMap.put(IWLAN_DNS_RESOLUTION_TIMEOUT, "IWLAN_DNS_RESOLUTION_TIMEOUT"); sFailCauseMap.put(OEM_DCFAILCAUSE_1, "OEM_DCFAILCAUSE_1"); sFailCauseMap.put(OEM_DCFAILCAUSE_2, "OEM_DCFAILCAUSE_2"); sFailCauseMap.put(OEM_DCFAILCAUSE_3, "OEM_DCFAILCAUSE_3"); diff --git a/telephony/java/android/telephony/data/ApnThrottleStatus.java b/telephony/java/android/telephony/data/ApnThrottleStatus.java index 51461d17690a..eec140869466 100644 --- a/telephony/java/android/telephony/data/ApnThrottleStatus.java +++ b/telephony/java/android/telephony/data/ApnThrottleStatus.java @@ -261,6 +261,10 @@ public final class ApnThrottleStatus implements Parcelable { private long mThrottleExpiryTimeMillis; private @RetryType int mRetryType; private @ThrottleType int mThrottleType; + + /** + * @hide + */ public static final long NO_THROTTLE_EXPIRY_TIME = DataCallResponse.RETRY_DURATION_UNDEFINED; diff --git a/telephony/java/android/telephony/ims/DelegateRegistrationState.java b/telephony/java/android/telephony/ims/DelegateRegistrationState.java index 3558a9b79ce0..66281edc0de1 100644 --- a/telephony/java/android/telephony/ims/DelegateRegistrationState.java +++ b/telephony/java/android/telephony/ims/DelegateRegistrationState.java @@ -62,7 +62,8 @@ public final class DelegateRegistrationState implements Parcelable { /** * This feature tag is being deregistered because the PDN that the IMS registration is on is *changing. - * All open SIP dialogs need to be closed before the PDN change can proceed. + * All open SIP dialogs need to be closed before the PDN change can proceed using + * {@link SipDelegateConnection#closeDialog(String)}. */ public static final int DEREGISTERING_REASON_PDN_CHANGE = 3; @@ -73,7 +74,8 @@ public final class DelegateRegistrationState implements Parcelable { * a user triggered hange, such as data being enabled/disabled. * <p> * All open SIP dialogs associated with the new deprovisioned feature tag need to be closed - * before the IMS registration modification can proceed. + * using {@link SipDelegateConnection#closeDialog(String)} before the IMS registration + * modification can proceed. */ public static final int DEREGISTERING_REASON_PROVISIONING_CHANGE = 4; @@ -81,8 +83,8 @@ public final class DelegateRegistrationState implements Parcelable { * This feature tag is deregistering because the SipDelegate associated with this feature tag * needs to change its supported feature set. * <p> - * All open SIP Dialogs associated with this feature tag must be closed before this operation - * can proceed. + * All open SIP Dialogs associated with this feature tag must be closed + * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed. */ public static final int DEREGISTERING_REASON_FEATURE_TAGS_CHANGING = 5; @@ -90,8 +92,8 @@ public final class DelegateRegistrationState implements Parcelable { * This feature tag is deregistering because the SipDelegate is in the process of being * destroyed. * <p> - * All open SIP Dialogs associated with this feature tag must be closed before this operation - * can proceed. + * All open SIP Dialogs associated with this feature tag must be closed + * using {@link SipDelegateConnection#closeDialog(String)} before this operation can proceed. */ public static final int DEREGISTERING_REASON_DESTROY_PENDING = 6; diff --git a/telephony/java/android/telephony/ims/SipDelegateConnection.java b/telephony/java/android/telephony/ims/SipDelegateConnection.java index c3cc1edf590b..04a772cd873d 100644 --- a/telephony/java/android/telephony/ims/SipDelegateConnection.java +++ b/telephony/java/android/telephony/ims/SipDelegateConnection.java @@ -62,6 +62,22 @@ public interface SipDelegateConnection { void notifyMessageReceived(@NonNull String viaTransactionId); /** + * The SIP Dialog associated with the provided Call-ID is being closed and routing resources + * associated with the SIP dialog are free to be released. + * <p> + * Calling this method is also mandatory for situations where the framework IMS stack is waiting + * for pending SIP dialogs to be closed before it can perform a handover or apply a provisioning + * change. See {@link DelegateRegistrationState} for more information about + * the scenarios where this can occur. + * <p> + * This method will need to be called for each SIP dialog managed by this application when it is + * closed. + * @param callId The call-ID header value associated with the ongoing SIP Dialog that is + * closing. + */ + void closeDialog(@NonNull String callId); + + /** * Notify the SIP delegate that the SIP message has been received from * {@link DelegateMessageCallback#onMessageReceived(SipMessage)}, however there was an error * processing it. diff --git a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl index 5d6766a65155..ad75be439da8 100644 --- a/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl +++ b/telephony/java/android/telephony/ims/aidl/ISipDelegate.aidl @@ -26,7 +26,5 @@ oneway interface ISipDelegate { void sendMessage(in SipMessage sipMessage, long configVersion); void notifyMessageReceived(in String viaTransactionId); void notifyMessageReceiveError(in String viaTransactionId, int reason); - - // only used by SipDelegate. void closeDialog(in String callId); } diff --git a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java index 29ba8e2d50c4..a35039bd7668 100644 --- a/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java +++ b/telephony/java/android/telephony/ims/aidl/SipDelegateConnectionAidlWrapper.java @@ -199,6 +199,19 @@ public class SipDelegateConnectionAidlWrapper implements SipDelegateConnection, } } + @Override + public void closeDialog(String callId) { + try { + ISipDelegate conn = getSipDelegateBinder(); + if (conn == null) { + return; + } + conn.closeDialog(callId); + } catch (RemoteException e) { + // Nothing to do here, app will eventually get remote death callback. + } + } + // Also called upon IImsRcsController death (telephony process dies). @Override public void binderDied() { diff --git a/telephony/java/android/telephony/ims/stub/SipDelegate.java b/telephony/java/android/telephony/ims/stub/SipDelegate.java index d7e7b62dd550..b036b5e71125 100644 --- a/telephony/java/android/telephony/ims/stub/SipDelegate.java +++ b/telephony/java/android/telephony/ims/stub/SipDelegate.java @@ -19,7 +19,9 @@ package android.telephony.ims.stub; import android.annotation.NonNull; import android.annotation.SystemApi; import android.telephony.ims.DelegateMessageCallback; +import android.telephony.ims.DelegateRegistrationState; import android.telephony.ims.ImsService; +import android.telephony.ims.SipDelegateConnection; import android.telephony.ims.SipDelegateImsConfiguration; import android.telephony.ims.SipDelegateManager; import android.telephony.ims.SipMessage; @@ -65,10 +67,13 @@ public interface SipDelegate { * The framework is requesting that routing resources associated with the SIP dialog using the * provided Call-ID to be cleaned up. * <p> - * Typically a SIP Dialog close event will be signalled by that dialog receiving a BYE or 200 OK - * message, however, in some cases, the framework will request that the ImsService close the + * Typically, a SIP Dialog close event will be signalled by that dialog receiving a BYE or + * 200 OK message, however, the IMS application will still call + * {@link SipDelegateConnection#closeDialog(String)} to signal to the framework that resources + * can be released. In some cases, the framework will request that the ImsService close the * dialog due to the open dialog holding up an event such as applying a provisioning change or - * handing over to another transport type. + * handing over to another transport type. See {@link DelegateRegistrationState}. + * * @param callId The call-ID header value associated with the ongoing SIP Dialog that the * framework is requesting be closed. */ diff --git a/tests/FlickerTests/OWNERS b/tests/FlickerTests/OWNERS index 0862c05e0ee4..f35a318acbf7 100644 --- a/tests/FlickerTests/OWNERS +++ b/tests/FlickerTests/OWNERS @@ -1 +1,2 @@ include /services/core/java/com/android/server/wm/OWNERS +natanieljr@google.com
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt index bb03237ca4c6..bd7e8d7683d1 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt @@ -48,11 +48,12 @@ fun WmAssertion.navBarWindowIsAlwaysVisible( } fun WmAssertion.visibleWindowsShownMoreThanOneConsecutiveEntry( + ignoreWindows: List<String> = emptyList(), bugId: Int = 0, enabled: Boolean = bugId == 0 ) { - all("visibleWindowShownMoreThanOneConsecutiveEntry", bugId, enabled) { - this.visibleWindowsShownMoreThanOneConsecutiveEntry() + all("visibleWindowsShownMoreThanOneConsecutiveEntry", bugId, enabled) { + this.visibleWindowsShownMoreThanOneConsecutiveEntry(ignoreWindows) } } @@ -204,11 +205,12 @@ fun LayersAssertion.statusBarLayerRotatesScales( } fun LayersAssertion.visibleLayersShownMoreThanOneConsecutiveEntry( + ignoreLayers: List<String> = emptyList(), bugId: Int = 0, enabled: Boolean = bugId == 0 ) { all("visibleLayersShownMoreThanOneConsecutiveEntry", bugId, enabled) { - this.visibleLayersShownMoreThanOneConsecutiveEntry() + this.visibleLayersShownMoreThanOneConsecutiveEntry(ignoreLayers) } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt index f4de36e99952..3565ca40474e 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt @@ -22,6 +22,7 @@ import android.support.test.launcherhelper.LauncherStrategyFactory import androidx.test.uiautomator.By import androidx.test.uiautomator.UiDevice import androidx.test.uiautomator.Until +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper import org.junit.Assert open class ImeAppHelper( @@ -38,7 +39,7 @@ open class ImeAppHelper( Assert.assertNotNull("Text field not found, this usually happens when the device " + "was left in an unknown state (e.g. in split screen)", editText) editText.click() - if (!device.waitForIME()) { + if (!WindowManagerStateHelper().waitImeWindowShown()) { Assert.fail("IME did not appear") } } @@ -46,6 +47,8 @@ open class ImeAppHelper( open fun closeIME(device: UiDevice) { device.pressBack() // Using only the AccessibilityInfo it is not possible to identify if the IME is active - device.waitForIdle(1000) + if (!WindowManagerStateHelper().waitImeWindowGone()) { + Assert.fail("IME did not close") + } } }
\ No newline at end of file diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt index a73264d304f8..b341e621d9ed 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt @@ -27,6 +27,8 @@ import com.android.server.wm.flicker.helpers.ImeAppAutoFocusHelper import com.android.server.wm.flicker.helpers.buildTestTag import com.android.server.wm.flicker.helpers.setRotation import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen +import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry +import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible import com.android.server.wm.flicker.navBarLayerRotatesAndScales import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible @@ -66,8 +68,10 @@ class CloseImeAutoOpenWindowToAppTest( withTag { buildTestTag("imeToAppAutoOpen", testApp, configuration) } repeat { configuration.repetitions } setup { - eachRun { + test { device.wakeUpAndGoToHomeScreen() + } + eachRun { this.setRotation(configuration.startRotation) testApp.open() testApp.openIME(device) @@ -80,14 +84,15 @@ class CloseImeAutoOpenWindowToAppTest( } } transitions { - device.pressBack() - device.waitForIdle() + testApp.closeIME(device) } assertions { windowManagerTrace { navBarWindowIsAlwaysVisible() statusBarWindowIsAlwaysVisible() - imeAppWindowIsAlwaysVisible(testApp, bugId = 141458352) + visibleWindowsShownMoreThanOneConsecutiveEntry(listOf("InputMethod")) + + imeAppWindowIsAlwaysVisible(testApp) } layersTrace { @@ -96,8 +101,10 @@ class CloseImeAutoOpenWindowToAppTest( noUncoveredRegions(configuration.startRotation) navBarLayerRotatesAndScales(configuration.startRotation) statusBarLayerRotatesScales(configuration.startRotation) + visibleLayersShownMoreThanOneConsecutiveEntry() + imeLayerBecomesInvisible(bugId = 141458352) - imeAppLayerIsAlwaysVisible(testApp, bugId = 141458352) + imeAppLayerIsAlwaysVisible(testApp) } } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt index 6cc2e2236127..51a4ca86681b 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt @@ -27,6 +27,8 @@ import com.android.server.wm.flicker.helpers.ImeAppAutoFocusHelper import com.android.server.wm.flicker.helpers.buildTestTag import com.android.server.wm.flicker.helpers.setRotation import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen +import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry +import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible import com.android.server.wm.flicker.navBarLayerRotatesAndScales import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible @@ -68,8 +70,10 @@ class CloseImeAutoOpenWindowToHomeTest( } repeat { configuration.repetitions } setup { - eachRun { + test { device.wakeUpAndGoToHomeScreen() + } + eachRun { this.setRotation(configuration.startRotation) testApp.open() testApp.openIME(device) @@ -89,6 +93,8 @@ class CloseImeAutoOpenWindowToHomeTest( windowManagerTrace { navBarWindowIsAlwaysVisible() statusBarWindowIsAlwaysVisible() + visibleWindowsShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE)) + imeWindowBecomesInvisible(bugId = 141458352) imeAppWindowBecomesInvisible(testApp, bugId = 157449248) } @@ -100,10 +106,14 @@ class CloseImeAutoOpenWindowToHomeTest( Surface.ROTATION_0, bugId = 140855415) statusBarLayerRotatesScales(configuration.startRotation, Surface.ROTATION_0) - navBarLayerIsAlwaysVisible(enabled = false) - statusBarLayerIsAlwaysVisible(enabled = false) + navBarLayerIsAlwaysVisible( + enabled = Surface.ROTATION_0 == configuration.startRotation) + statusBarLayerIsAlwaysVisible( + enabled = Surface.ROTATION_0 == configuration.startRotation) + visibleLayersShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE)) + imeLayerBecomesInvisible(bugId = 141458352) - imeAppLayerBecomesInvisible(testApp, bugId = 153739621) + imeAppLayerBecomesInvisible(testApp) } } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt index 136cf86037a1..663d45607f93 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToAppTest.kt @@ -31,6 +31,8 @@ import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible import com.android.server.wm.flicker.navBarLayerRotatesAndScales import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible import com.android.server.wm.flicker.noUncoveredRegions +import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry +import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry import com.android.server.wm.flicker.repetitions import com.android.server.wm.flicker.startRotation import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible @@ -65,8 +67,10 @@ class CloseImeWindowToAppTest( withTestName { buildTestTag("imeToApp", testApp, configuration) } repeat { configuration.repetitions } setup { - eachRun { + test { device.wakeUpAndGoToHomeScreen() + } + eachRun { this.setRotation(configuration.startRotation) testApp.open() testApp.openIME(device) @@ -79,13 +83,14 @@ class CloseImeWindowToAppTest( } } transitions { - device.pressBack() - device.waitForIdle() + testApp.closeIME(device) } assertions { windowManagerTrace { navBarWindowIsAlwaysVisible() statusBarWindowIsAlwaysVisible() + visibleWindowsShownMoreThanOneConsecutiveEntry(listOf("InputMethod")) + imeAppWindowIsAlwaysVisible(testApp) } @@ -95,6 +100,8 @@ class CloseImeWindowToAppTest( noUncoveredRegions(configuration.startRotation) navBarLayerRotatesAndScales(configuration.startRotation) statusBarLayerRotatesScales(configuration.startRotation) + visibleLayersShownMoreThanOneConsecutiveEntry() + imeLayerBecomesInvisible(enabled = false) imeAppLayerIsAlwaysVisible(testApp) } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt index 8d9881ec2063..bfe5264ed358 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt @@ -33,6 +33,8 @@ import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible import com.android.server.wm.flicker.navBarLayerRotatesAndScales import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible import com.android.server.wm.flicker.noUncoveredRegions +import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry +import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry import com.android.server.wm.flicker.repetitions import com.android.server.wm.flicker.startRotation import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible @@ -95,6 +97,8 @@ class CloseImeWindowToHomeTest( windowManagerTrace { navBarWindowIsAlwaysVisible() statusBarWindowIsAlwaysVisible() + visibleWindowsShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE)) + imeWindowBecomesInvisible() imeAppWindowBecomesInvisible(testApp) } @@ -106,10 +110,14 @@ class CloseImeWindowToHomeTest( Surface.ROTATION_0, bugId = 140855415) statusBarLayerRotatesScales(configuration.startRotation, Surface.ROTATION_0) - navBarLayerIsAlwaysVisible(enabled = false) - statusBarLayerIsAlwaysVisible(enabled = false) + navBarLayerIsAlwaysVisible( + enabled = Surface.ROTATION_0 == configuration.startRotation) + statusBarLayerIsAlwaysVisible( + enabled = Surface.ROTATION_0 == configuration.startRotation) + visibleLayersShownMoreThanOneConsecutiveEntry(listOf(IME_WINDOW_TITLE)) + imeLayerBecomesInvisible(bugId = 153739621) - imeAppLayerBecomesInvisible(testApp, bugId = 153739621) + imeAppLayerBecomesInvisible(testApp) } } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt index 5767a94025e9..64a8f304298b 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt @@ -30,6 +30,8 @@ import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible import com.android.server.wm.flicker.navBarLayerRotatesAndScales import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible +import com.android.server.wm.flicker.visibleWindowsShownMoreThanOneConsecutiveEntry +import com.android.server.wm.flicker.visibleLayersShownMoreThanOneConsecutiveEntry import com.android.server.wm.flicker.noUncoveredRegions import com.android.server.wm.flicker.repetitions import com.android.server.wm.flicker.startRotation @@ -89,6 +91,7 @@ class OpenImeWindowTest( windowManagerTrace { navBarWindowIsAlwaysVisible() statusBarWindowIsAlwaysVisible() + visibleWindowsShownMoreThanOneConsecutiveEntry() all("imeWindowBecomesVisible") { this.skipUntilFirstAssertion() @@ -104,6 +107,7 @@ class OpenImeWindowTest( noUncoveredRegions(configuration.startRotation) navBarLayerRotatesAndScales(configuration.startRotation) statusBarLayerRotatesScales(configuration.startRotation) + visibleLayersShownMoreThanOneConsecutiveEntry() imeLayerBecomesVisible() } diff --git a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java index 2a24d1ac22d2..3d4dc4d67dcc 100644 --- a/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java +++ b/tests/net/integration/util/com/android/server/NetworkAgentWrapper.java @@ -29,7 +29,7 @@ import static com.android.server.ConnectivityServiceTestUtils.transportToLegacyT import static junit.framework.Assert.assertTrue; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.fail; import android.content.Context; import android.net.ConnectivityManager; @@ -38,7 +38,6 @@ import android.net.Network; import android.net.NetworkAgent; import android.net.NetworkAgentConfig; import android.net.NetworkCapabilities; -import android.net.NetworkInfo; import android.net.NetworkProvider; import android.net.NetworkSpecifier; import android.net.SocketKeepalive; @@ -53,9 +52,9 @@ import com.android.testutils.HandlerUtils; import com.android.testutils.TestableNetworkCallback; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { - private final NetworkInfo mNetworkInfo; private final NetworkCapabilities mNetworkCapabilities; private final HandlerThread mHandlerThread; private final Context mContext; @@ -63,6 +62,7 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { private final ConditionVariable mDisconnected = new ConditionVariable(); private final ConditionVariable mPreventReconnectReceived = new ConditionVariable(); + private final AtomicBoolean mConnected = new AtomicBoolean(false); private int mScore; private NetworkAgent mNetworkAgent; private int mStartKeepaliveError = SocketKeepalive.ERROR_UNSUPPORTED; @@ -76,7 +76,6 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { NetworkCapabilities ncTemplate, Context context) throws Exception { final int type = transportToLegacyType(transport); final String typeName = ConnectivityManager.getNetworkTypeName(type); - mNetworkInfo = new NetworkInfo(type, 0, typeName, "Mock"); mNetworkCapabilities = (ncTemplate != null) ? ncTemplate : new NetworkCapabilities(); mNetworkCapabilities.addCapability(NET_CAPABILITY_NOT_SUSPENDED); mNetworkCapabilities.addTransportType(transport); @@ -108,22 +107,29 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { mHandlerThread = new HandlerThread(mLogTag); mHandlerThread.start(); - mNetworkAgent = makeNetworkAgent(linkProperties); + mNetworkAgent = makeNetworkAgent(linkProperties, type, typeName); } - protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties) + protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties, + final int type, final String typeName) throws Exception { - return new InstrumentedNetworkAgent(this, linkProperties); + return new InstrumentedNetworkAgent(this, linkProperties, type, typeName); } public static class InstrumentedNetworkAgent extends NetworkAgent { private final NetworkAgentWrapper mWrapper; - - public InstrumentedNetworkAgent(NetworkAgentWrapper wrapper, LinkProperties lp) { - super(wrapper.mHandlerThread.getLooper(), wrapper.mContext, wrapper.mLogTag, - wrapper.mNetworkInfo, wrapper.mNetworkCapabilities, lp, wrapper.mScore, - new NetworkAgentConfig(), NetworkProvider.ID_NONE); + private static final String PROVIDER_NAME = "InstrumentedNetworkAgentProvider"; + + public InstrumentedNetworkAgent(NetworkAgentWrapper wrapper, LinkProperties lp, + final int type, final String typeName) { + super(wrapper.mContext, wrapper.mHandlerThread.getLooper(), wrapper.mLogTag, + wrapper.mNetworkCapabilities, lp, wrapper.mScore, + new NetworkAgentConfig.Builder() + .setLegacyType(type).setLegacyTypeName(typeName).build(), + new NetworkProvider(wrapper.mContext, wrapper.mHandlerThread.getLooper(), + PROVIDER_NAME)); mWrapper = wrapper; + register(); } @Override @@ -212,10 +218,12 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { } public void connect() { - assertNotEquals("MockNetworkAgents can only be connected once", - mNetworkInfo.getDetailedState(), NetworkInfo.DetailedState.CONNECTED); - mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null); - mNetworkAgent.sendNetworkInfo(mNetworkInfo); + if (!mConnected.compareAndSet(false /* expect */, true /* update */)) { + // compareAndSet returns false when the value couldn't be updated because it did not + // match the expected value. + fail("Test NetworkAgents can only be connected once"); + } + mNetworkAgent.markConnected(); } public void suspend() { @@ -227,8 +235,7 @@ public class NetworkAgentWrapper implements TestableNetworkCallback.HasNetwork { } public void disconnect() { - mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null); - mNetworkAgent.sendNetworkInfo(mNetworkInfo); + mNetworkAgent.unregister(); } @Override diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 5bfcd5202cbf..3aed6019beb5 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -18,6 +18,7 @@ package com.android.server; import static android.Manifest.permission.CHANGE_NETWORK_STATE; import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS; +import static android.app.PendingIntent.FLAG_IMMUTABLE; import static android.content.Intent.ACTION_USER_ADDED; import static android.content.Intent.ACTION_USER_REMOVED; import static android.content.pm.PackageInfo.REQUESTED_PERMISSION_GRANTED; @@ -645,8 +646,8 @@ public class ConnectivityServiceTest { } @Override - protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties) - throws Exception { + protected InstrumentedNetworkAgent makeNetworkAgent(LinkProperties linkProperties, + final int type, final String typeName) throws Exception { mNetworkMonitor = mock(INetworkMonitor.class); final Answer validateAnswer = inv -> { @@ -665,7 +666,8 @@ public class ConnectivityServiceTest { any() /* name */, nmCbCaptor.capture()); - final InstrumentedNetworkAgent na = new InstrumentedNetworkAgent(this, linkProperties) { + final InstrumentedNetworkAgent na = new InstrumentedNetworkAgent(this, linkProperties, + type, typeName) { @Override public void networkStatus(int status, String redirectUrl) { mRedirectUrl = redirectUrl; @@ -2547,7 +2549,8 @@ public class ConnectivityServiceTest { @Test public void testNoMutableNetworkRequests() throws Exception { - PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0, new Intent("a"), 0); + final PendingIntent pendingIntent = PendingIntent.getBroadcast( + mContext, 0 /* requestCode */, new Intent("a"), FLAG_IMMUTABLE); NetworkRequest request1 = new NetworkRequest.Builder() .addCapability(NET_CAPABILITY_VALIDATED) .build(); @@ -3209,7 +3212,7 @@ public class ConnectivityServiceTest { assertThrows(SecurityException.class, () -> mCm.registerNetworkCallback(r, PendingIntent.getService( - mServiceContext, 0, new Intent(), 0))); + mServiceContext, 0 /* requestCode */, new Intent(), FLAG_IMMUTABLE))); // Requesting a Network with signal strength should get IllegalArgumentException. assertThrows(IllegalArgumentException.class, () -> @@ -3217,7 +3220,7 @@ public class ConnectivityServiceTest { assertThrows(IllegalArgumentException.class, () -> mCm.requestNetwork(r, PendingIntent.getService( - mServiceContext, 0, new Intent(), 0))); + mServiceContext, 0 /* requestCode */, new Intent(), FLAG_IMMUTABLE))); } @Test @@ -4681,12 +4684,14 @@ public class ConnectivityServiceTest { } j = 0; while (j++ < INTENTS / 2) { - PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, new Intent("a" + j), 0); + final PendingIntent pi = PendingIntent.getBroadcast(mContext, 0 /* requestCode */, + new Intent("a" + j), FLAG_IMMUTABLE); mCm.requestNetwork(networkRequest, pi); registered.add(pi); } while (j++ < INTENTS) { - PendingIntent pi = PendingIntent.getBroadcast(mContext, 0, new Intent("b" + j), 0); + final PendingIntent pi = PendingIntent.getBroadcast(mContext, 0 /* requestCode */, + new Intent("b" + j), FLAG_IMMUTABLE); mCm.registerNetworkCallback(networkRequest, pi); registered.add(pi); } @@ -4700,11 +4705,13 @@ public class ConnectivityServiceTest { ); assertThrows(TooManyRequestsException.class, () -> mCm.requestNetwork(networkRequest, - PendingIntent.getBroadcast(mContext, 0, new Intent("c"), 0)) + PendingIntent.getBroadcast(mContext, 0 /* requestCode */, + new Intent("c"), FLAG_IMMUTABLE)) ); assertThrows(TooManyRequestsException.class, () -> mCm.registerNetworkCallback(networkRequest, - PendingIntent.getBroadcast(mContext, 0, new Intent("d"), 0)) + PendingIntent.getBroadcast(mContext, 0 /* requestCode */, + new Intent("d"), FLAG_IMMUTABLE)) ); for (Object o : registered) { @@ -4733,16 +4740,16 @@ public class ConnectivityServiceTest { waitForIdle(); for (int i = 0; i < MAX_REQUESTS; i++) { - PendingIntent pendingIntent = - PendingIntent.getBroadcast(mContext, 0, new Intent("e" + i), 0); + final PendingIntent pendingIntent = PendingIntent.getBroadcast( + mContext, 0 /* requestCode */, new Intent("e" + i), FLAG_IMMUTABLE); mCm.requestNetwork(networkRequest, pendingIntent); mCm.unregisterNetworkCallback(pendingIntent); } waitForIdle(); for (int i = 0; i < MAX_REQUESTS; i++) { - PendingIntent pendingIntent = - PendingIntent.getBroadcast(mContext, 0, new Intent("f" + i), 0); + final PendingIntent pendingIntent = PendingIntent.getBroadcast( + mContext, 0 /* requestCode */, new Intent("f" + i), FLAG_IMMUTABLE); mCm.registerNetworkCallback(networkRequest, pendingIntent); mCm.unregisterNetworkCallback(pendingIntent); } diff --git a/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java b/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java index c53462cfb0b2..950d7163c78a 100644 --- a/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java +++ b/tests/net/java/com/android/server/connectivity/MultipathPolicyTrackerTest.java @@ -130,6 +130,7 @@ public class MultipathPolicyTrackerTest { when(mContext.getResources()).thenReturn(mResources); when(mContext.getApplicationInfo()).thenReturn(new ApplicationInfo()); + // Mock user id to all users that Context#registerReceiver will register with all users too. doReturn(UserHandle.ALL.getIdentifier()).when(mUserAllContext).getUserId(); when(mContext.createContextAsUser(eq(UserHandle.ALL), anyInt())) .thenReturn(mUserAllContext); diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java index de35f910d53a..3556c72776dc 100644 --- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java +++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java @@ -58,7 +58,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; -import android.content.pm.UserInfo; import android.net.INetd; import android.net.UidRange; import android.os.Build; @@ -123,10 +122,10 @@ public class PermissionMonitorTest { MockitoAnnotations.initMocks(this); when(mContext.getPackageManager()).thenReturn(mPackageManager); when(mContext.getSystemService(eq(Context.USER_SERVICE))).thenReturn(mUserManager); - when(mUserManager.getAliveUsers()).thenReturn( - Arrays.asList(new UserInfo[] { - new UserInfo(MOCK_USER1, "", 0), - new UserInfo(MOCK_USER2, "", 0), + when(mUserManager.getUserHandles(eq(true))).thenReturn( + Arrays.asList(new UserHandle[] { + new UserHandle(MOCK_USER1), + new UserHandle(MOCK_USER2), })); mPermissionMonitor = spy(new PermissionMonitor(mContext, mNetdService, mDeps)); |