diff options
166 files changed, 1869 insertions, 3502 deletions
diff --git a/Android.bp b/Android.bp index 084c9f51d12e..c632ff608d13 100644 --- a/Android.bp +++ b/Android.bp @@ -67,6 +67,7 @@ filegroup { name: "framework-non-updatable-sources", srcs: [ // Java/AIDL sources under frameworks/base + ":framework-annotations", ":framework-blobstore-sources", ":framework-core-sources", ":framework-drm-sources", @@ -210,6 +211,7 @@ java_library { "apex_aidl_interface-java", "framework-protos", "updatable-driver-protos", + "ota_metadata_proto_java", "android.hidl.base-V1.0-java", "android.hardware.cas-V1.0-java", "android.hardware.cas-V1.1-java", @@ -341,46 +343,6 @@ platform_compat_config { } filegroup { - name: "framework-annotations", - srcs: [ - "core/java/android/annotation/AnyThread.java", - "core/java/android/annotation/AppIdInt.java", - "core/java/android/annotation/BytesLong.java", - "core/java/android/annotation/CallbackExecutor.java", - "core/java/android/annotation/CallSuper.java", - "core/java/android/annotation/CheckResult.java", - "core/java/android/annotation/CurrentTimeMillisLong.java", - "core/java/android/annotation/CurrentTimeSecondsLong.java", - "core/java/android/annotation/DrawableRes.java", - "core/java/android/annotation/DurationMillisLong.java", - "core/java/android/annotation/Hide.java", - "core/java/android/annotation/IntDef.java", - "core/java/android/annotation/IntRange.java", - "core/java/android/annotation/LongDef.java", - "core/java/android/annotation/MainThread.java", - "core/java/android/annotation/NonNull.java", - "core/java/android/annotation/Nullable.java", - "core/java/android/annotation/RequiresPermission.java", - "core/java/android/annotation/SdkConstant.java", - "core/java/android/annotation/StringDef.java", - "core/java/android/annotation/SystemApi.java", - "core/java/android/annotation/SystemService.java", - "core/java/android/annotation/TestApi.java", - "core/java/android/annotation/UserIdInt.java", - "core/java/android/annotation/WorkerThread.java", - "core/java/com/android/internal/annotations/GuardedBy.java", - "core/java/com/android/internal/annotations/Immutable.java", - "core/java/com/android/internal/annotations/VisibleForTesting.java", - ], -} - -java_library { - name: "framework-annotations-lib", - srcs: [":framework-annotations"], - sdk_version: "core_current", -} - -filegroup { name: "framework-ike-shared-srcs", visibility: ["//packages/modules/IPsec"], srcs: [ @@ -474,7 +436,7 @@ metalava_framework_docs_args = "--manifest $(location core/res/AndroidManifest.x "--api-lint-ignore-prefix org. " filegroup { - name: "framework-non-updatable-stub-sources", + name: "android-non-updatable-stub-sources", srcs: [ ":framework-mime-sources", // mimemap builds separately but has no separate droidstubs. ":framework-non-updatable-sources", @@ -486,6 +448,60 @@ filegroup { visibility: ["//visibility:private"], } +// These defaults are used for both the jar stubs and the doc stubs. +stubs_defaults { + name: "android-non-updatable-stubs-defaults", + srcs: [":android-non-updatable-stub-sources"], + sdk_version: "none", + system_modules: "none", + java_version: "1.8", + arg_files: ["core/res/AndroidManifest.xml"], + // TODO(b/147699819): remove below aidl includes. + aidl: { + local_include_dirs: [ + "apex/media/aidl/stable", + // TODO: move to include-dirs for packages/modules/Connectivity when this moves out of + // frameworks/base + "packages/Connectivity/framework/aidl-export", + "telephony/java", + ], + }, + // These are libs from framework-internal-utils that are required (i.e. being referenced) + // from framework-non-updatable-sources. Add more here when there's a need. + // DO NOT add the entire framework-internal-utils. It might cause unnecessary circular + // dependencies gets bigger. + libs: [ + "android.hardware.cas-V1.2-java", + "android.hardware.health-V1.0-java-constants", + "android.hardware.radio-V1.5-java", + "android.hardware.radio-V1.6-java", + "android.hardware.thermal-V1.0-java-constants", + "android.hardware.thermal-V2.0-java", + "android.hardware.tv.input-V1.0-java-constants", + "android.hardware.tv.tuner-V1.0-java-constants", + "android.hardware.usb-V1.0-java-constants", + "android.hardware.usb-V1.1-java-constants", + "android.hardware.usb.gadget-V1.0-java", + "android.hardware.vibrator-V1.3-java", + "framework-protos", + "art.module.public.api", + // There are a few classes from modules used by the core that + // need to be resolved by metalava. We use a prebuilt stub of the + // full sdk to ensure we can resolve them. If a new class gets added, + // the prebuilts/sdk/current needs to be updated. + "sdk_system_current_android", + // NOTE: The below can be removed once the prebuilt stub contains IKE. + "sdk_system_current_android.net.ipsec.ike", + ], + high_mem: true, // Lots of sources => high memory use, see b/170701554 + installable: false, + annotations_enabled: true, + previous_api: ":android.api.public.latest", + merge_annotations_dirs: ["metalava-manual"], + defaults_visibility: ["//visibility:private"], + visibility: ["//frameworks/base/api"], +} + build = [ "StubLibraries.bp", "ApiDocs.bp", diff --git a/ApiDocs.bp b/ApiDocs.bp index d3bef7f9046b..c6a70d998ec6 100644 --- a/ApiDocs.bp +++ b/ApiDocs.bp @@ -56,9 +56,23 @@ framework_docs_only_libs = [ ] stubs_defaults { + name: "android-non-updatable-doc-stubs-defaults", + defaults: ["android-non-updatable-stubs-defaults"], + srcs: [ + // No longer part of the stubs, but are included in the docs. + "test-base/src/**/*.java", + "test-mock/src/**/*.java", + "test-runner/src/**/*.java", + ], + libs: framework_docs_only_libs, + create_doc_stubs: true, + write_sdk_values: true, +} + +stubs_defaults { name: "framework-doc-stubs-default", srcs: [ - ":framework-non-updatable-stub-sources", + ":android-non-updatable-stub-sources", // Module sources ":art.module.public.api{.public.stubs.source}", @@ -94,14 +108,25 @@ stubs_defaults { } droidstubs { + name: "android-non-updatable-doc-stubs", + defaults: ["android-non-updatable-doc-stubs-defaults"], + args: metalava_framework_docs_args, +} + +droidstubs { + name: "android-non-updatable-doc-stubs-system", + defaults: ["android-non-updatable-doc-stubs-defaults"], + args: metalava_framework_docs_args + + " --show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS\\) ", +} + +droidstubs { name: "framework-doc-stubs", defaults: ["framework-doc-stubs-default"], arg_files: [ "core/res/AndroidManifest.xml", ], - args: metalava_framework_docs_args + - // Needed for hidden libcore annotations for now. - " --ignore-classes-on-classpath ", + args: metalava_framework_docs_args, write_sdk_values: true, } @@ -112,8 +137,6 @@ droidstubs { "core/res/AndroidManifest.xml", ], args: metalava_framework_docs_args + - // Needed for hidden libcore annotations for now. - " --ignore-classes-on-classpath " + " --show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS\\) ", write_sdk_values: true, } diff --git a/StubLibraries.bp b/StubLibraries.bp index 10d64fc0ec7a..96aac1ab9efa 100644 --- a/StubLibraries.bp +++ b/StubLibraries.bp @@ -42,59 +42,10 @@ packages_to_document = [ stubs_defaults { name: "metalava-non-updatable-api-stubs-default", - srcs: [":framework-non-updatable-stub-sources"], - sdk_version: "none", - system_modules: "none", - java_version: "1.8", - arg_files: ["core/res/AndroidManifest.xml"], - // TODO(b/147699819): remove below aidl includes. - aidl: { - local_include_dirs: [ - "apex/media/aidl/stable", - // TODO: move to include-dirs for packages/modules/Connectivity when this moves out of - // frameworks/base - "packages/Connectivity/framework/aidl-export", - "telephony/java", - ], - }, - // These are libs from framework-internal-utils that are required (i.e. being referenced) - // from framework-non-updatable-sources. Add more here when there's a need. - // DO NOT add the entire framework-internal-utils. It might cause unnecessary circular - // dependencies gets bigger. - libs: [ - "android.hardware.cas-V1.2-java", - "android.hardware.health-V1.0-java-constants", - "android.hardware.radio-V1.5-java", - "android.hardware.radio-V1.6-java", - "android.hardware.thermal-V1.0-java-constants", - "android.hardware.thermal-V2.0-java", - "android.hardware.tv.input-V1.0-java-constants", - "android.hardware.tv.tuner-V1.0-java-constants", - "android.hardware.usb-V1.0-java-constants", - "android.hardware.usb-V1.1-java-constants", - "android.hardware.usb.gadget-V1.0-java", - "android.hardware.vibrator-V1.3-java", - "framework-protos", - "stable.core.platform.api.stubs", - // There are a few classes from modules used by the core that - // need to be resolved by metalava. We use a prebuilt stub of the - // full sdk to ensure we can resolve them. If a new class gets added, - // the prebuilts/sdk/current needs to be updated. - "sdk_system_current_android", - // NOTE: The below can be removed once the prebuilt stub contains IKE. - "sdk_system_current_android.net.ipsec.ike", - ], - high_mem: true, // Lots of sources => high memory use, see b/170701554 - installable: false, - annotations_enabled: true, - previous_api: ":android.api.public.latest", - merge_annotations_dirs: [ - "metalava-manual", - ], + defaults: ["android-non-updatable-stubs-defaults"], api_levels_annotations_enabled: false, filter_packages: packages_to_document, defaults_visibility: ["//visibility:private"], - visibility: ["//frameworks/base/api"], } ///////////////////////////////////////////////////////////////////// diff --git a/boot/Android.bp b/boot/Android.bp index ef2abc885fcf..3caede47d859 100644 --- a/boot/Android.bp +++ b/boot/Android.bp @@ -98,4 +98,12 @@ platform_bootclasspath { dest: "hiddenapi-unsupported.csv", }, ], + + required: [ + "platform-systemserverclasspath", + ], +} + +platform_systemserverclasspath { + name: "platform-systemserverclasspath", } diff --git a/boot/OWNERS b/boot/OWNERS index 0648888a9a1a..0e258d042c08 100644 --- a/boot/OWNERS +++ b/boot/OWNERS @@ -1,2 +1,6 @@ # soong-team@ as the platform_bootclasspath module is tightly coupled with Soong file:platform/build/soong:/OWNERS + +# art-team@ manages the boot image profiles for frameworks +per-file boot-* = calin@google.com, yawanng@google.com, ngeoffray@google.com +per-file preloaded-classes* = calin@google.com, yawanng@google.com, ngeoffray@google.com diff --git a/build/boot/boot-image-profile.txt b/build/boot/boot-image-profile.txt new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/build/boot/boot-image-profile.txt diff --git a/build/boot/preloaded-classes b/build/boot/preloaded-classes new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/build/boot/preloaded-classes diff --git a/core/api/current.txt b/core/api/current.txt index 7fd3bca595ff..cd4e6f9a826c 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -31480,6 +31480,7 @@ package android.print { field public static final android.print.PrintAttributes.MediaSize JPN_HAGAKI; field public static final android.print.PrintAttributes.MediaSize JPN_KAHU; field public static final android.print.PrintAttributes.MediaSize JPN_KAKU2; + field @NonNull public static final android.print.PrintAttributes.MediaSize JPN_OE_PHOTO_L; field public static final android.print.PrintAttributes.MediaSize JPN_OUFUKU; field public static final android.print.PrintAttributes.MediaSize JPN_YOU4; field @NonNull public static final android.print.PrintAttributes.MediaSize NA_ARCH_A; @@ -31501,7 +31502,6 @@ package android.print { field public static final android.print.PrintAttributes.MediaSize NA_QUARTO; field @NonNull public static final android.print.PrintAttributes.MediaSize NA_SUPER_B; field public static final android.print.PrintAttributes.MediaSize NA_TABLOID; - field @NonNull public static final android.print.PrintAttributes.MediaSize OE_PHOTO_L; field public static final android.print.PrintAttributes.MediaSize OM_DAI_PA_KAI; field public static final android.print.PrintAttributes.MediaSize OM_JUURO_KU_KAI; field public static final android.print.PrintAttributes.MediaSize OM_PA_KAI; diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 039c6b154c15..bb42ddcda37f 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -1124,10 +1124,11 @@ package android.app.backup { package android.app.compat { public final class CompatChanges { + method @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD) public static void addPackageOverrides(@NonNull String, @NonNull java.util.Map<java.lang.Long,android.app.compat.PackageOverride>); method public static boolean isChangeEnabled(long); method @RequiresPermission(allOf={"android.permission.READ_COMPAT_CHANGE_CONFIG", "android.permission.LOG_COMPAT_CHANGE"}) public static boolean isChangeEnabled(long, @NonNull String, @NonNull android.os.UserHandle); method @RequiresPermission(allOf={"android.permission.READ_COMPAT_CHANGE_CONFIG", "android.permission.LOG_COMPAT_CHANGE"}) public static boolean isChangeEnabled(long, int); - method @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD) public static void setPackageOverride(@NonNull String, @NonNull java.util.Map<java.lang.Long,android.app.compat.PackageOverride>); + method @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD) public static void removePackageOverrides(@NonNull String, @NonNull java.util.Set<java.lang.Long>); } public final class PackageOverride { @@ -12330,6 +12331,7 @@ package android.telephony.ims.stub { field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1 field public static final int REGISTRATION_TECH_LTE = 0; // 0x0 field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff + field public static final int REGISTRATION_TECH_NR = 3; // 0x3 } public class ImsSmsImplBase { diff --git a/core/api/test-current.txt b/core/api/test-current.txt index e2975ad85ff8..81b9428d162a 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1191,6 +1191,7 @@ package android.os { public class VintfObject { method public static String[] getHalNamesAndVersions(); + method @NonNull public static String getPlatformSepolicyVersion(); method public static String getSepolicyVersion(); method public static Long getTargetFrameworkCompatibilityMatrixVersion(); method public static java.util.Map<java.lang.String,java.lang.String[]> getVndkSnapshots(); diff --git a/core/java/Android.bp b/core/java/Android.bp index 965665d3184a..874704e6350e 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -46,43 +46,6 @@ filegroup { "android/accounts/AccountsException.java", "android/accounts/AuthenticatorException.java", "android/accounts/OperationCanceledException.java", - "android/annotation/AnimatorRes.java", - "android/annotation/AnimRes.java", - "android/annotation/AnyRes.java", - "android/annotation/ArrayRes.java", - "android/annotation/AttrRes.java", - "android/annotation/BoolRes.java", - "android/annotation/BroadcastBehavior.java", - "android/annotation/CallbackExecutor.java", - "android/annotation/CallSuper.java", - "android/annotation/CheckResult.java", - "android/annotation/ColorInt.java", - "android/annotation/ColorRes.java", - "android/annotation/DimenRes.java", - "android/annotation/DrawableRes.java", - "android/annotation/FontRes.java", - "android/annotation/FractionRes.java", - "android/annotation/IntDef.java", - "android/annotation/IntegerRes.java", - "android/annotation/IntRange.java", - "android/annotation/LayoutRes.java", - "android/annotation/NonNull.java", - "android/annotation/Nullable.java", - "android/annotation/PluralsRes.java", - "android/annotation/RawRes.java", - "android/annotation/RequiresPermission.java", - "android/annotation/SdkConstant.java", - "android/annotation/Size.java", - "android/annotation/StringDef.java", - "android/annotation/StringRes.java", - "android/annotation/StyleableRes.java", - "android/annotation/StyleRes.java", - "android/annotation/SuppressLint.java", - "android/annotation/SystemApi.java", - "android/annotation/SystemService.java", - "android/annotation/TestApi.java", - "android/annotation/UserIdInt.java", - "android/annotation/XmlRes.java", "android/app/Application.java", "android/app/IApplicationThread.aidl", "android/app/IServiceConnection.aidl", @@ -123,7 +86,6 @@ filegroup { "android/util/AndroidException.java", "android/view/DisplayAdjustments.java", "android/view/ViewDebug.java", - "com/android/internal/annotations/VisibleForTesting.java", ], visibility: ["//frameworks/base/test-mock"], } diff --git a/core/java/android/annotation/AnimRes.java b/core/java/android/annotation/AnimRes.java deleted file mode 100644 index 56f8acf82313..000000000000 --- a/core/java/android/annotation/AnimRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an anim resource reference (e.g. {@link android.R.anim#fade_in}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AnimRes { -} diff --git a/core/java/android/annotation/AnimatorRes.java b/core/java/android/annotation/AnimatorRes.java deleted file mode 100644 index cd4c189b7531..000000000000 --- a/core/java/android/annotation/AnimatorRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an animator resource reference (e.g. {@link android.R.animator#fade_in}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AnimatorRes { -} diff --git a/core/java/android/annotation/AnyRes.java b/core/java/android/annotation/AnyRes.java deleted file mode 100644 index 44411a04a8e7..000000000000 --- a/core/java/android/annotation/AnyRes.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a resource reference of any type. If the specific type is known, use - * one of the more specific annotations instead, such as {@link StringRes} or - * {@link DrawableRes}. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AnyRes { -} diff --git a/core/java/android/annotation/AnyThread.java b/core/java/android/annotation/AnyThread.java deleted file mode 100644 index ee36a42b3fc6..000000000000 --- a/core/java/android/annotation/AnyThread.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated method can be called from any thread (e.g. it is - * "thread safe".) If the annotated element is a class, then all methods in the - * class can be called from any thread. - * <p> - * The main purpose of this method is to indicate that you believe a method can - * be called from any thread; static tools can then check that nothing you call - * from within this method or class have more strict threading requirements. - * <p> - * Example: - * - * <pre> - * <code> - * @AnyThread - * public void deliverResult(D data) { ... } - * </code> - * </pre> - * - * @memberDoc This method is safe to call from any thread. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface AnyThread { -} diff --git a/core/java/android/annotation/AppIdInt.java b/core/java/android/annotation/AppIdInt.java deleted file mode 100644 index 29838dd5bd7c..000000000000 --- a/core/java/android/annotation/AppIdInt.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element is a multi-user application ID. This is - * <em>not</em> the same as a UID. - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AppIdInt { -} diff --git a/core/java/android/annotation/ArrayRes.java b/core/java/android/annotation/ArrayRes.java deleted file mode 100644 index 1407af1d1422..000000000000 --- a/core/java/android/annotation/ArrayRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an array resource reference (e.g. {@link android.R.array#phoneTypes}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface ArrayRes { -} diff --git a/core/java/android/annotation/AttrRes.java b/core/java/android/annotation/AttrRes.java deleted file mode 100644 index 285b80ce45ca..000000000000 --- a/core/java/android/annotation/AttrRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an attribute reference (e.g. {@link android.R.attr#action}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface AttrRes { -} diff --git a/core/java/android/annotation/BinderThread.java b/core/java/android/annotation/BinderThread.java deleted file mode 100644 index ca5e14c2adb9..000000000000 --- a/core/java/android/annotation/BinderThread.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated method should only be called on the binder thread. - * If the annotated element is a class, then all methods in the class should be called - * on the binder thread. - * <p> - * Example: - * <pre><code> - * @BinderThread - * public BeamShareData createBeamShareData() { ... } - * </code></pre> - * - * {@hide} - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface BinderThread { -}
\ No newline at end of file diff --git a/core/java/android/annotation/BoolRes.java b/core/java/android/annotation/BoolRes.java deleted file mode 100644 index f50785b1e1cf..000000000000 --- a/core/java/android/annotation/BoolRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a boolean resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface BoolRes { -} diff --git a/core/java/android/annotation/BroadcastBehavior.java b/core/java/android/annotation/BroadcastBehavior.java deleted file mode 100644 index 70d82cb5151b..000000000000 --- a/core/java/android/annotation/BroadcastBehavior.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import android.content.Intent; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Description of how the annotated broadcast action behaves. - * - * @hide - */ -@Target({ ElementType.FIELD }) -@Retention(RetentionPolicy.SOURCE) -public @interface BroadcastBehavior { - /** - * This broadcast will only be delivered to an explicit target. - * - * @see Intent#setPackage(String) - * @see Intent#setComponent(android.content.ComponentName) - */ - boolean explicitOnly() default false; - - /** - * This broadcast will only be delivered to registered receivers. - * - * @see Intent#FLAG_RECEIVER_REGISTERED_ONLY - */ - boolean registeredOnly() default false; - - /** - * This broadcast will include all {@code AndroidManifest.xml} receivers - * regardless of process state. - * - * @see Intent#FLAG_RECEIVER_INCLUDE_BACKGROUND - */ - boolean includeBackground() default false; - - /** - * This broadcast is protected and can only be sent by the OS. - */ - boolean protectedBroadcast() default false; -} diff --git a/core/java/android/annotation/BytesLong.java b/core/java/android/annotation/BytesLong.java deleted file mode 100644 index f5e1a9c5f7fd..000000000000 --- a/core/java/android/annotation/BytesLong.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative number of bytes. - * @paramDoc Value is a non-negative number of bytes. - * @returnDoc Value is a non-negative number of bytes. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface BytesLong { -} diff --git a/core/java/android/annotation/CallSuper.java b/core/java/android/annotation/CallSuper.java deleted file mode 100644 index c16b51161cac..000000000000 --- a/core/java/android/annotation/CallSuper.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that any overriding methods should invoke this method as well. - * <p> - * Example: - * - * <pre> - * <code> - * @CallSuper - * public abstract void onFocusLost(); - * </code> - * </pre> - * - * @memberDoc If you override this method you <em>must</em> call through to the - * superclass implementation. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD}) -public @interface CallSuper { -} diff --git a/core/java/android/annotation/CallbackExecutor.java b/core/java/android/annotation/CallbackExecutor.java deleted file mode 100644 index 4258f730eb16..000000000000 --- a/core/java/android/annotation/CallbackExecutor.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; -import java.util.concurrent.Executor; - -/** - * @paramDoc Callback and listener events are dispatched through this - * {@link Executor}, providing an easy way to control which thread is - * used. To dispatch events through the main thread of your - * application, you can use - * {@link android.content.Context#getMainExecutor() Context.getMainExecutor()}. - * To dispatch events through a shared thread pool, you can use - * {@link android.os.AsyncTask#THREAD_POOL_EXECUTOR AsyncTask#THREAD_POOL_EXECUTOR}. - * @hide - */ -@Retention(SOURCE) -@Target(PARAMETER) -public @interface CallbackExecutor { -} diff --git a/core/java/android/annotation/CheckResult.java b/core/java/android/annotation/CheckResult.java deleted file mode 100644 index 97d031a760a6..000000000000 --- a/core/java/android/annotation/CheckResult.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated method returns a result that it typically is - * an error to ignore. This is usually used for methods that have no side effect, - * so calling it without actually looking at the result usually means the developer - * has misunderstood what the method does. - * <p> - * Example: - * <pre>{@code - * public @CheckResult String trim(String s) { return s.trim(); } - * ... - * s.trim(); // this is probably an error - * s = s.trim(); // ok - * }</pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD}) -public @interface CheckResult { - /** Defines the name of the suggested method to use instead, if applicable (using - * the same signature format as javadoc.) If there is more than one possibility, - * list them all separated by commas. - * <p> - * For example, ProcessBuilder has a method named {@code redirectErrorStream()} - * which sounds like it might redirect the error stream. It does not. It's just - * a getter which returns whether the process builder will redirect the error stream, - * and to actually set it, you must call {@code redirectErrorStream(boolean)}. - * In that case, the method should be defined like this: - * <pre> - * @CheckResult(suggest="#redirectErrorStream(boolean)") - * public boolean redirectErrorStream() { ... } - * </pre> - */ - String suggest() default ""; -}
\ No newline at end of file diff --git a/core/java/android/annotation/ColorInt.java b/core/java/android/annotation/ColorInt.java deleted file mode 100644 index 4671b1b9f887..000000000000 --- a/core/java/android/annotation/ColorInt.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element represents a packed color - * int, {@code AARRGGBB}. If applied to an int array, every element - * in the array represents a color integer. - * <p> - * Example: - * <pre>{@code - * public abstract void setTextColor(@ColorInt int color); - * }</pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD}) -public @interface ColorInt { -}
\ No newline at end of file diff --git a/core/java/android/annotation/ColorLong.java b/core/java/android/annotation/ColorLong.java deleted file mode 100644 index 9b19c76802c9..000000000000 --- a/core/java/android/annotation/ColorLong.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * <p>Denotes that the annotated element represents a packed color - * long. If applied to a long array, every element in the array - * represents a color long. For more information on how colors - * are packed in a long, please refer to the documentation of - * the {@link android.graphics.Color} class.</p> - * - * <p>Example:</p> - * - * <pre>{@code - * public void setFillColor(@ColorLong long color); - * }</pre> - * - * @see android.graphics.Color - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER,METHOD,LOCAL_VARIABLE,FIELD}) -public @interface ColorLong { -} diff --git a/core/java/android/annotation/ColorRes.java b/core/java/android/annotation/ColorRes.java deleted file mode 100644 index 061faa05c738..000000000000 --- a/core/java/android/annotation/ColorRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a color resource reference (e.g. {@link android.R.color#black}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface ColorRes { -} diff --git a/core/java/android/annotation/Condemned.java b/core/java/android/annotation/Condemned.java deleted file mode 100644 index 186409b3e204..000000000000 --- a/core/java/android/annotation/Condemned.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * A program element annotated @Condemned is one that programmers are - * blocked from using, typically because it's about to be completely destroyed. - * <p> - * This is a stronger version of @Deprecated, and it's typically used to - * mark APIs that only existed temporarily in a preview SDK, and which only - * continue to exist temporarily to support binary compatibility. - * - * @hide - */ -@Retention(SOURCE) -@Target(value={CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE}) -public @interface Condemned { -} diff --git a/core/java/android/annotation/CurrentTimeMillisLong.java b/core/java/android/annotation/CurrentTimeMillisLong.java deleted file mode 100644 index 355bb5a2f960..000000000000 --- a/core/java/android/annotation/CurrentTimeMillisLong.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative timestamp measured as the number of - * milliseconds since 1970-01-01T00:00:00Z. - * @paramDoc Value is a non-negative timestamp measured as the number of - * milliseconds since 1970-01-01T00:00:00Z. - * @returnDoc Value is a non-negative timestamp measured as the number of - * milliseconds since 1970-01-01T00:00:00Z. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface CurrentTimeMillisLong { -} diff --git a/core/java/android/annotation/CurrentTimeSecondsLong.java b/core/java/android/annotation/CurrentTimeSecondsLong.java deleted file mode 100644 index 2b4ffd77ad34..000000000000 --- a/core/java/android/annotation/CurrentTimeSecondsLong.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative timestamp measured as the number of - * seconds since 1970-01-01T00:00:00Z. - * @paramDoc Value is a non-negative timestamp measured as the number of - * seconds since 1970-01-01T00:00:00Z. - * @returnDoc Value is a non-negative timestamp measured as the number of - * seconds since 1970-01-01T00:00:00Z. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface CurrentTimeSecondsLong { -} diff --git a/core/java/android/annotation/DimenRes.java b/core/java/android/annotation/DimenRes.java deleted file mode 100644 index 02ae00c6868c..000000000000 --- a/core/java/android/annotation/DimenRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a dimension resource reference (e.g. {@link android.R.dimen#app_icon_size}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface DimenRes { -} diff --git a/core/java/android/annotation/Dimension.java b/core/java/android/annotation/Dimension.java deleted file mode 100644 index 5f705ad52d9b..000000000000 --- a/core/java/android/annotation/Dimension.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a numeric parameter, field or method return value is expected - * to represent a dimension. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE}) -public @interface Dimension { - @Unit - int unit() default PX; - - int DP = 0; - int PX = 1; - int SP = 2; - - @IntDef({PX, DP, SP}) - @Retention(SOURCE) - @interface Unit {} -} diff --git a/core/java/android/annotation/DrawableRes.java b/core/java/android/annotation/DrawableRes.java deleted file mode 100644 index ebefa1d78ab1..000000000000 --- a/core/java/android/annotation/DrawableRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a drawable resource reference (e.g. {@link android.R.attr#alertDialogIcon}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface DrawableRes { -} diff --git a/core/java/android/annotation/DurationMillisLong.java b/core/java/android/annotation/DurationMillisLong.java deleted file mode 100644 index ce77532a6c6e..000000000000 --- a/core/java/android/annotation/DurationMillisLong.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative duration in milliseconds. - * @paramDoc Value is a non-negative duration in milliseconds. - * @returnDoc Value is a non-negative duration in milliseconds. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface DurationMillisLong { -} diff --git a/core/java/android/annotation/ElapsedRealtimeLong.java b/core/java/android/annotation/ElapsedRealtimeLong.java deleted file mode 100644 index f77ff72062a6..000000000000 --- a/core/java/android/annotation/ElapsedRealtimeLong.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.os.SystemClock; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * @memberDoc Value is a non-negative timestamp in the - * {@link SystemClock#elapsedRealtime()} time base. - * @paramDoc Value is a non-negative timestamp in the - * {@link SystemClock#elapsedRealtime()} time base. - * @returnDoc Value is a non-negative timestamp in the - * {@link SystemClock#elapsedRealtime()} time base. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface ElapsedRealtimeLong { -} diff --git a/core/java/android/annotation/FloatRange.java b/core/java/android/annotation/FloatRange.java deleted file mode 100644 index 05b51680b1b0..000000000000 --- a/core/java/android/annotation/FloatRange.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element should be a float or double in the given range - * <p> - * Example: - * <pre><code> - * @FloatRange(from=0.0,to=1.0) - * public float getAlpha() { - * ... - * } - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE}) -public @interface FloatRange { - /** Smallest value. Whether it is inclusive or not is determined - * by {@link #fromInclusive} */ - double from() default Double.NEGATIVE_INFINITY; - /** Largest value. Whether it is inclusive or not is determined - * by {@link #toInclusive} */ - double to() default Double.POSITIVE_INFINITY; - - /** Whether the from value is included in the range */ - boolean fromInclusive() default true; - - /** Whether the to value is included in the range */ - boolean toInclusive() default true; -}
\ No newline at end of file diff --git a/core/java/android/annotation/FontRes.java b/core/java/android/annotation/FontRes.java deleted file mode 100644 index dbacb5876dce..000000000000 --- a/core/java/android/annotation/FontRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a Font resource reference (e.g. R.font.myfont). - * - * @hide - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface FontRes { -} diff --git a/core/java/android/annotation/FractionRes.java b/core/java/android/annotation/FractionRes.java deleted file mode 100644 index fd84d3e85fdf..000000000000 --- a/core/java/android/annotation/FractionRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a fraction resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface FractionRes { -} diff --git a/core/java/android/annotation/HalfFloat.java b/core/java/android/annotation/HalfFloat.java deleted file mode 100644 index 256008c5e31f..000000000000 --- a/core/java/android/annotation/HalfFloat.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * <p>Denotes that the annotated element represents a half-precision floating point - * value. Such values are stored in short data types and can be manipulated with - * the {@link android.util.Half} class. If applied to an array of short, every - * element in the array represents a half-precision float.</p> - * - * <p>Example:</p> - * - * <pre>{@code - * public abstract void setPosition(@HalfFloat short x, @HalfFloat short y, @HalfFloat short z); - * }</pre> - * - * @see android.util.Half - * @see android.util.Half#toHalf(float) - * @see android.util.Half#toFloat(short) - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER, METHOD, LOCAL_VARIABLE, FIELD}) -public @interface HalfFloat { -} diff --git a/core/java/android/annotation/Hide.java b/core/java/android/annotation/Hide.java deleted file mode 100644 index c8e5a4a97ae7..000000000000 --- a/core/java/android/annotation/Hide.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates that an API is hidden by default, in a similar fashion to the - * <pre>@hide</pre> javadoc tag. - * - * <p>Note that, in order for this to work, metalava has to be invoked with - * the flag {@code --hide-annotation android.annotation.Hide}. - * @hide - */ -@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE}) -@Retention(RetentionPolicy.CLASS) -public @interface Hide { -} diff --git a/core/java/android/annotation/IdRes.java b/core/java/android/annotation/IdRes.java deleted file mode 100644 index b286965c99d9..000000000000 --- a/core/java/android/annotation/IdRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an id resource reference (e.g. {@link android.R.id#copy}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface IdRes { -} diff --git a/core/java/android/annotation/IntDef.java b/core/java/android/annotation/IntDef.java deleted file mode 100644 index f84a67655dc3..000000000000 --- a/core/java/android/annotation/IntDef.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element of integer type, represents - * a logical type and that its value should be one of the explicitly - * named constants. If the {@link #flag()} attribute is set to true, - * multiple constants can be combined. - * <p> - * <pre><code> - * @Retention(SOURCE) - * @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * public @interface NavigationMode {} - * public static final int NAVIGATION_MODE_STANDARD = 0; - * public static final int NAVIGATION_MODE_LIST = 1; - * public static final int NAVIGATION_MODE_TABS = 2; - * ... - * public abstract void setNavigationMode(@NavigationMode int mode); - * @NavigationMode - * public abstract int getNavigationMode(); - * </code></pre> - * For a flag, set the flag attribute: - * <pre><code> - * @IntDef( - * flag = true, - * value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({ANNOTATION_TYPE}) -public @interface IntDef { - /** Defines the constant prefix for this element */ - String[] prefix() default {}; - /** Defines the constant suffix for this element */ - String[] suffix() default {}; - - /** Defines the allowed constants for this element */ - int[] value() default {}; - - /** Defines whether the constants can be used as a flag, or just as an enum (the default) */ - boolean flag() default false; -} diff --git a/core/java/android/annotation/IntRange.java b/core/java/android/annotation/IntRange.java deleted file mode 100644 index c043e2db6a98..000000000000 --- a/core/java/android/annotation/IntRange.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element should be an int or long in the given range - * <p> - * Example: - * <pre><code> - * @IntRange(from=0,to=255) - * public int getAlpha() { - * ... - * } - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,PARAMETER,FIELD,LOCAL_VARIABLE,ANNOTATION_TYPE}) -public @interface IntRange { - /** Smallest value, inclusive */ - long from() default Long.MIN_VALUE; - /** Largest value, inclusive */ - long to() default Long.MAX_VALUE; -}
\ No newline at end of file diff --git a/core/java/android/annotation/IntegerRes.java b/core/java/android/annotation/IntegerRes.java deleted file mode 100644 index 5313f4adf46e..000000000000 --- a/core/java/android/annotation/IntegerRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an integer resource reference (e.g. {@link android.R.integer#config_shortAnimTime}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface IntegerRes { -} diff --git a/core/java/android/annotation/InterpolatorRes.java b/core/java/android/annotation/InterpolatorRes.java deleted file mode 100644 index 8877a5f9a4f1..000000000000 --- a/core/java/android/annotation/InterpolatorRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an interpolator resource reference (e.g. {@link android.R.interpolator#cycle}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface InterpolatorRes { -} diff --git a/core/java/android/annotation/LayoutRes.java b/core/java/android/annotation/LayoutRes.java deleted file mode 100644 index 15ba86f98159..000000000000 --- a/core/java/android/annotation/LayoutRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a layout resource reference (e.g. {@link android.R.layout#list_content}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface LayoutRes { -} diff --git a/core/java/android/annotation/LongDef.java b/core/java/android/annotation/LongDef.java deleted file mode 100644 index 8723eef86328..000000000000 --- a/core/java/android/annotation/LongDef.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated long element represents - * a logical type and that its value should be one of the explicitly - * named constants. If the {@link #flag()} attribute is set to true, - * multiple constants can be combined. - * <p> - * <pre><code> - * @Retention(SOURCE) - * @LongDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * public @interface NavigationMode {} - * public static final long NAVIGATION_MODE_STANDARD = 0; - * public static final long NAVIGATION_MODE_LIST = 1; - * public static final long NAVIGATION_MODE_TABS = 2; - * ... - * public abstract void setNavigationMode(@NavigationMode long mode); - * @NavigationMode - * public abstract long getNavigationMode(); - * </code></pre> - * For a flag, set the flag attribute: - * <pre><code> - * @LongDef( - * flag = true, - * value = {NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS}) - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({ANNOTATION_TYPE}) -public @interface LongDef { - /** Defines the constant prefix for this element */ - String[] prefix() default ""; - - /** Defines the allowed constants for this element */ - long[] value() default {}; - - /** Defines whether the constants can be used as a flag, or just as an enum (the default) */ - boolean flag() default false; -} diff --git a/core/java/android/annotation/MainThread.java b/core/java/android/annotation/MainThread.java deleted file mode 100644 index a070246e5ef3..000000000000 --- a/core/java/android/annotation/MainThread.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated method should only be called on the main thread. - * If the annotated element is a class, then all methods in the class should be - * called on the main thread. - * <p> - * Example: - * - * <pre> - * <code> - * @MainThread - * public void deliverResult(D data) { ... } - * </code> - * </pre> - * - * @memberDoc This method must be called from the main thread of your app. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface MainThread { -} diff --git a/core/java/android/annotation/MenuRes.java b/core/java/android/annotation/MenuRes.java deleted file mode 100644 index b6dcc4604cfb..000000000000 --- a/core/java/android/annotation/MenuRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a menu resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface MenuRes { -} diff --git a/core/java/android/annotation/NavigationRes.java b/core/java/android/annotation/NavigationRes.java deleted file mode 100644 index 3af5ecff84a6..000000000000 --- a/core/java/android/annotation/NavigationRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a navigation resource reference (e.g. {@code R.navigation.flow}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface NavigationRes { -} diff --git a/core/java/android/annotation/NonNull.java b/core/java/android/annotation/NonNull.java deleted file mode 100644 index 20472bacf6ad..000000000000 --- a/core/java/android/annotation/NonNull.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that a parameter, field or method return value can never be null. - * <p> - * This is a marker annotation and it has no specific attributes. - * - * @paramDoc This value cannot be {@code null}. - * @returnDoc This value cannot be {@code null}. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface NonNull { -} diff --git a/core/java/android/annotation/Nullable.java b/core/java/android/annotation/Nullable.java deleted file mode 100644 index b8473e750c95..000000000000 --- a/core/java/android/annotation/Nullable.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that a parameter, field or method return value can be null. - * <p> - * When decorating a method call parameter, this denotes that the parameter can - * legitimately be null and the method will gracefully deal with it. Typically - * used on optional parameters. - * <p> - * When decorating a method, this denotes the method might legitimately return - * null. - * <p> - * This is a marker annotation and it has no specific attributes. - * - * @paramDoc This value may be {@code null}. - * @returnDoc This value may be {@code null}. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface Nullable { -} diff --git a/core/java/android/annotation/OWNERS b/core/java/android/annotation/OWNERS deleted file mode 100644 index e1ef54460b56..000000000000 --- a/core/java/android/annotation/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -tnorbye@google.com -aurimas@google.com -per-file UnsupportedAppUsage.java = mathewi@google.com, satayev@google.com, andreionea@google.com diff --git a/core/java/android/annotation/PluralsRes.java b/core/java/android/annotation/PluralsRes.java deleted file mode 100644 index 31ac729aaa47..000000000000 --- a/core/java/android/annotation/PluralsRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a plurals resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface PluralsRes { -} diff --git a/core/java/android/annotation/Px.java b/core/java/android/annotation/Px.java deleted file mode 100644 index cec7f80405d3..000000000000 --- a/core/java/android/annotation/Px.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a numeric parameter, field or method return value is expected - * to represent a pixel dimension. - * - * @memberDoc This units of this value are pixels. - * @paramDoc This units of this value are pixels. - * @returnDoc This units of this value are pixels. - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD, LOCAL_VARIABLE}) -@Dimension(unit = Dimension.PX) -public @interface Px { -} diff --git a/core/java/android/annotation/RawRes.java b/core/java/android/annotation/RawRes.java deleted file mode 100644 index 39970b36fd95..000000000000 --- a/core/java/android/annotation/RawRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a raw resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface RawRes { -} diff --git a/core/java/android/annotation/RequiresFeature.java b/core/java/android/annotation/RequiresFeature.java deleted file mode 100644 index 08861d42be39..000000000000 --- a/core/java/android/annotation/RequiresFeature.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package android.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.content.pm.PackageManager; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element requires one or more device features. This - * is used to auto-generate documentation. - * - * @hide - */ -@Retention(SOURCE) -@Target({TYPE,FIELD,METHOD,CONSTRUCTOR}) -public @interface RequiresFeature { - /** - * The name of the device feature that is required. - */ - String value(); - - /** - * Defines the name of the method that should be called to check whether the feature is - * available, using the same signature format as javadoc. The feature checking method can have - * multiple parameters, but the feature name parameter must be of type String and must also be - * the first String-type parameter. - * <p> - * By default, the enforcement is {@link PackageManager#hasSystemFeature(String)}. - */ - String enforcement() default("android.content.pm.PackageManager#hasSystemFeature"); -} diff --git a/core/java/android/annotation/RequiresPermission.java b/core/java/android/annotation/RequiresPermission.java deleted file mode 100644 index 1d89e31b2b99..000000000000 --- a/core/java/android/annotation/RequiresPermission.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element requires (or may require) one or more permissions. - * <p/> - * Example of requiring a single permission: - * <pre>{@code - * {@literal @}RequiresPermission(Manifest.permission.SET_WALLPAPER) - * public abstract void setWallpaper(Bitmap bitmap) throws IOException; - * - * {@literal @}RequiresPermission(ACCESS_COARSE_LOCATION) - * public abstract Location getLastKnownLocation(String provider); - * }</pre> - * Example of requiring at least one permission from a set: - * <pre>{@code - * {@literal @}RequiresPermission(anyOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - * public abstract Location getLastKnownLocation(String provider); - * }</pre> - * Example of requiring multiple permissions: - * <pre>{@code - * {@literal @}RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION}) - * public abstract Location getLastKnownLocation(String provider); - * }</pre> - * Example of requiring separate read and write permissions for a content provider: - * <pre>{@code - * {@literal @}RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS)) - * {@literal @}RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS)) - * public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks"); - * }</pre> - * <p> - * When specified on a parameter, the annotation indicates that the method requires - * a permission which depends on the value of the parameter. For example, consider - * {@link android.app.Activity#startActivity(android.content.Intent) - * Activity#startActivity(Intent)}: - * <pre>{@code - * public void startActivity(@RequiresPermission Intent intent) { ... } - * }</pre> - * Notice how there are no actual permission names listed in the annotation. The actual - * permissions required will depend on the particular intent passed in. For example, - * the code may look like this: - * <pre>{@code - * Intent intent = new Intent(Intent.ACTION_CALL); - * startActivity(intent); - * }</pre> - * and the actual permission requirement for this particular intent is described on - * the Intent name itself: - * <pre>{@code - * {@literal @}RequiresPermission(Manifest.permission.CALL_PHONE) - * public static final String ACTION_CALL = "android.intent.action.CALL"; - * }</pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({ANNOTATION_TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER}) -public @interface RequiresPermission { - /** - * The name of the permission that is required, if precisely one permission - * is required. If more than one permission is required, specify either - * {@link #allOf()} or {@link #anyOf()} instead. - * <p> - * If specified, {@link #anyOf()} and {@link #allOf()} must both be null. - */ - String value() default ""; - - /** - * Specifies a list of permission names that are all required. - * <p> - * If specified, {@link #anyOf()} and {@link #value()} must both be null. - */ - String[] allOf() default {}; - - /** - * Specifies a list of permission names where at least one is required - * <p> - * If specified, {@link #allOf()} and {@link #value()} must both be null. - */ - String[] anyOf() default {}; - - /** - * If true, the permission may not be required in all cases (e.g. it may only be - * enforced on certain platforms, or for certain call parameters, etc. - */ - boolean conditional() default false; - - /** - * Specifies that the given permission is required for read operations. - * <p> - * When specified on a parameter, the annotation indicates that the method requires - * a permission which depends on the value of the parameter (and typically - * the corresponding field passed in will be one of a set of constants which have - * been annotated with a <code>@RequiresPermission</code> annotation.) - */ - @Target({FIELD, METHOD, PARAMETER}) - @interface Read { - RequiresPermission value() default @RequiresPermission; - } - - /** - * Specifies that the given permission is required for write operations. - * <p> - * When specified on a parameter, the annotation indicates that the method requires - * a permission which depends on the value of the parameter (and typically - * the corresponding field passed in will be one of a set of constants which have - * been annotated with a <code>@RequiresPermission</code> annotation.) - */ - @Target({FIELD, METHOD, PARAMETER}) - @interface Write { - RequiresPermission value() default @RequiresPermission; - } -} diff --git a/core/java/android/annotation/SdkConstant.java b/core/java/android/annotation/SdkConstant.java deleted file mode 100644 index 0a5318609847..000000000000 --- a/core/java/android/annotation/SdkConstant.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.annotation; - -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Indicates a constant field value should be exported to be used in the SDK tools. - * @hide - */ -@Target({ ElementType.FIELD }) -@Retention(RetentionPolicy.SOURCE) -public @interface SdkConstant { - public static enum SdkConstantType { - ACTIVITY_INTENT_ACTION, BROADCAST_INTENT_ACTION, SERVICE_ACTION, INTENT_CATEGORY, FEATURE; - } - - SdkConstantType value(); -} diff --git a/core/java/android/annotation/Size.java b/core/java/android/annotation/Size.java deleted file mode 100644 index 7c3e70f658e9..000000000000 --- a/core/java/android/annotation/Size.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated element should have a given size or length. - * Note that "-1" means "unset". Typically used with a parameter or - * return value of type array or collection. - * <p> - * Example: - * <pre>{@code - * public void getLocationInWindow(@Size(2) int[] location) { - * ... - * } - * }</pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({PARAMETER,LOCAL_VARIABLE,METHOD,FIELD}) -public @interface Size { - /** An exact size (or -1 if not specified) */ - long value() default -1; - /** A minimum size, inclusive */ - long min() default Long.MIN_VALUE; - /** A maximum size, inclusive */ - long max() default Long.MAX_VALUE; - /** The size must be a multiple of this factor */ - long multiple() default 1; -}
\ No newline at end of file diff --git a/core/java/android/annotation/StringDef.java b/core/java/android/annotation/StringDef.java deleted file mode 100644 index a37535b9c98e..000000000000 --- a/core/java/android/annotation/StringDef.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated String element, represents a logical - * type and that its value should be one of the explicitly named constants. - * <p> - * Example: - * <pre><code> - * @Retention(SOURCE) - * @StringDef({ - * POWER_SERVICE, - * WINDOW_SERVICE, - * LAYOUT_INFLATER_SERVICE - * }) - * public @interface ServiceName {} - * public static final String POWER_SERVICE = "power"; - * public static final String WINDOW_SERVICE = "window"; - * public static final String LAYOUT_INFLATER_SERVICE = "layout_inflater"; - * ... - * public abstract Object getSystemService(@ServiceName String name); - * </code></pre> - * - * @hide - */ -@Retention(SOURCE) -@Target({ANNOTATION_TYPE}) -public @interface StringDef { - /** Defines the constant prefix for this element */ - String[] prefix() default {}; - /** Defines the constant suffix for this element */ - String[] suffix() default {}; - - /** Defines the allowed constants for this element */ - String[] value() default {}; -} diff --git a/core/java/android/annotation/StringRes.java b/core/java/android/annotation/StringRes.java deleted file mode 100644 index 190b68a9960b..000000000000 --- a/core/java/android/annotation/StringRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a String resource reference (e.g. {@link android.R.string#ok}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface StringRes { -} diff --git a/core/java/android/annotation/StyleRes.java b/core/java/android/annotation/StyleRes.java deleted file mode 100644 index 4453b8d89153..000000000000 --- a/core/java/android/annotation/StyleRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a integer parameter, field or method return value is expected - * to be a style resource reference (e.g. {@link android.R.style#TextAppearance}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface StyleRes { -} diff --git a/core/java/android/annotation/StyleableRes.java b/core/java/android/annotation/StyleableRes.java deleted file mode 100644 index 3c1895e6dce9..000000000000 --- a/core/java/android/annotation/StyleableRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that a integer parameter, field or method return value is expected - * to be a styleable resource reference (e.g. {@link android.R.styleable#TextView_text}). - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface StyleableRes { -} diff --git a/core/java/android/annotation/SuppressAutoDoc.java b/core/java/android/annotation/SuppressAutoDoc.java deleted file mode 100644 index e34e03bcee29..000000000000 --- a/core/java/android/annotation/SuppressAutoDoc.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that any automatically generated documentation should be suppressed - * for the annotated method, parameter, or field. - * - * @hide - */ -@Retention(SOURCE) -@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -public @interface SuppressAutoDoc { -} diff --git a/core/java/android/annotation/SuppressLint.java b/core/java/android/annotation/SuppressLint.java deleted file mode 100644 index 2d3456b0ea46..000000000000 --- a/core/java/android/annotation/SuppressLint.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2012 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.LOCAL_VARIABLE; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** Indicates that Lint should ignore the specified warnings for the annotated element. */ -@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE}) -@Retention(RetentionPolicy.CLASS) -public @interface SuppressLint { - /** - * The set of warnings (identified by the lint issue id) that should be - * ignored by lint. It is not an error to specify an unrecognized name. - */ - String[] value(); -} diff --git a/core/java/android/annotation/SystemApi.java b/core/java/android/annotation/SystemApi.java deleted file mode 100644 index a468439c8e74..000000000000 --- a/core/java/android/annotation/SystemApi.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2014 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.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates an API is exposed for use by bundled system applications. - * <p> - * These APIs are not guaranteed to remain consistent release-to-release, - * and are not for use by apps linking against the Android SDK. - * </p><p> - * This annotation should only appear on API that is already marked <pre>@hide</pre>. - * </p> - * - * @hide - */ -@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE}) -@Retention(RetentionPolicy.RUNTIME) -public @interface SystemApi { - enum Client { - /** - * Specifies that the intended clients of a SystemApi are privileged apps. - * This is the default value for {@link #client}. - */ - PRIVILEGED_APPS, - - /** - * Specifies that the intended clients of a SystemApi are used by classes in - * <pre>BOOTCLASSPATH</pre> in mainline modules. Mainline modules can also expose - * this type of system APIs too when they're used only by the non-updatable - * platform code. - */ - MODULE_LIBRARIES, - - /** - * Specifies that the system API is available only in the system server process. - * Use this to expose APIs from code loaded by the system server process <em>but</em> - * not in <pre>BOOTCLASSPATH</pre>. - */ - SYSTEM_SERVER - } - - /** - * The intended client of this SystemAPI. - */ - Client client() default android.annotation.SystemApi.Client.PRIVILEGED_APPS; - - /** - * Container for {@link SystemApi} that allows it to be applied repeatedly to types. - */ - @Retention(RetentionPolicy.RUNTIME) - @Target(TYPE) - @interface Container { - SystemApi[] value(); - } -} diff --git a/core/java/android/annotation/SystemService.java b/core/java/android/annotation/SystemService.java deleted file mode 100644 index c05c1bab06d2..000000000000 --- a/core/java/android/annotation/SystemService.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2017 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.annotation; - -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Description of a system service available through - * {@link android.content.Context#getSystemService(Class)}. This is used to auto-generate - * documentation explaining how to obtain a reference to the service. - * - * @hide - */ -@Retention(SOURCE) -@Target(TYPE) -public @interface SystemService { - /** - * The string name of the system service that can be passed to - * {@link android.content.Context#getSystemService(String)}. - * - * @see android.content.Context#getSystemServiceName(Class) - */ - String value(); -} diff --git a/core/java/android/annotation/TargetApi.java b/core/java/android/annotation/TargetApi.java deleted file mode 100644 index 975318e4de67..000000000000 --- a/core/java/android/annotation/TargetApi.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2012 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** Indicates that Lint should treat this type as targeting a given API level, no matter what the - project target is. */ -@Target({TYPE, METHOD, CONSTRUCTOR, FIELD}) -@Retention(RetentionPolicy.CLASS) -public @interface TargetApi { - /** - * This sets the target api level for the type.. - */ - int value(); -} diff --git a/core/java/android/annotation/TestApi.java b/core/java/android/annotation/TestApi.java deleted file mode 100644 index 0e9ed3751246..000000000000 --- a/core/java/android/annotation/TestApi.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import static java.lang.annotation.ElementType.ANNOTATION_TYPE; -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Indicates an API is exposed for use by CTS. - * <p> - * These APIs are not guaranteed to remain consistent release-to-release, - * and are not for use by apps linking against the Android SDK. - * </p> - * - * @hide - */ -@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE, PACKAGE}) -@Retention(RetentionPolicy.SOURCE) -public @interface TestApi { -} diff --git a/core/java/android/annotation/TransitionRes.java b/core/java/android/annotation/TransitionRes.java deleted file mode 100644 index 06bac74984a5..000000000000 --- a/core/java/android/annotation/TransitionRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be a transition resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface TransitionRes { -} diff --git a/core/java/android/annotation/UiThread.java b/core/java/android/annotation/UiThread.java deleted file mode 100644 index 6d7eedc7d2e2..000000000000 --- a/core/java/android/annotation/UiThread.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import android.os.Looper; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated method or constructor should only be called on the - * UI thread. If the annotated element is a class, then all methods in the class - * should be called on the UI thread. - * <p> - * Example: - * - * <pre> - * <code> - * @UiThread - * public abstract void setText(@NonNull String text) { ... } - * </code> - * </pre> - * - * @memberDoc This method must be called on the thread that originally created - * this UI element. This is typically the - * {@linkplain Looper#getMainLooper() main thread} of your app. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface UiThread { -} diff --git a/core/java/android/annotation/UserHandleAware.java b/core/java/android/annotation/UserHandleAware.java deleted file mode 100644 index 7d3d20b31b2a..000000000000 --- a/core/java/android/annotation/UserHandleAware.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.annotation; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PACKAGE; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Indicates an API that uses {@code context.getUser} or {@code context.getUserId} - * to operate across users (as the user associated with the context) - * <p> - * To create a {@link android.content.Context} associated with a different user, - * use {@link android.content.Context#createContextAsUser} or - * {@link android.content.Context#createPackageContextAsUser} - * <p> - * Example: - * <pre>{@code - * {@literal @}UserHandleAware - * public abstract PackageInfo getPackageInfo({@literal @}NonNull String packageName, - * {@literal @}PackageInfoFlags int flags) throws NameNotFoundException; - * }</pre> - * - * @memberDoc This method uses {@linkplain android.content.Context#getUser} - * or {@linkplain android.content.Context#getUserId} to execute across users. - * @hide - */ -@Retention(SOURCE) -@Target({TYPE, METHOD, CONSTRUCTOR, PACKAGE}) -public @interface UserHandleAware { -} diff --git a/core/java/android/annotation/UserIdInt.java b/core/java/android/annotation/UserIdInt.java deleted file mode 100644 index 7b9ce25e3f1a..000000000000 --- a/core/java/android/annotation/UserIdInt.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2016 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.annotation; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -/** - * Denotes that the annotated element is a multi-user user ID. This is - * <em>not</em> the same as a UID. - * - * @hide - */ -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface UserIdInt { -} diff --git a/core/java/android/annotation/Widget.java b/core/java/android/annotation/Widget.java deleted file mode 100644 index 6756cd73c5fe..000000000000 --- a/core/java/android/annotation/Widget.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.annotation; - -import java.lang.annotation.Target; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Indicates a class is a widget usable by application developers to create UI. - * <p> - * This must be used in cases where: - * <ul> - * <li>The widget is not in the package <code>android.widget</code></li> - * <li>The widget extends <code>android.view.ViewGroup</code></li> - * </ul> - * @hide - */ -@Target({ ElementType.TYPE }) -@Retention(RetentionPolicy.SOURCE) -public @interface Widget { -} diff --git a/core/java/android/annotation/WorkerThread.java b/core/java/android/annotation/WorkerThread.java deleted file mode 100644 index 8c2a4d381ab1..000000000000 --- a/core/java/android/annotation/WorkerThread.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2015 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.annotation; - -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.CONSTRUCTOR; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.ElementType.TYPE; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that the annotated method should only be called on a worker thread. - * If the annotated element is a class, then all methods in the class should be - * called on a worker thread. - * <p> - * Example: - * - * <pre> - * <code> - * @WorkerThread - * protected abstract FilterResults performFiltering(CharSequence constraint); - * </code> - * </pre> - * - * @memberDoc This method may take several seconds to complete, so it should - * only be called from a worker thread. - * @hide - */ -@Retention(SOURCE) -@Target({METHOD,CONSTRUCTOR,TYPE,PARAMETER}) -public @interface WorkerThread { -} diff --git a/core/java/android/annotation/XmlRes.java b/core/java/android/annotation/XmlRes.java deleted file mode 100644 index 5fb8a4a47127..000000000000 --- a/core/java/android/annotation/XmlRes.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2013 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.annotation; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.ElementType.PARAMETER; -import static java.lang.annotation.RetentionPolicy.SOURCE; - -/** - * Denotes that an integer parameter, field or method return value is expected - * to be an XML resource reference. - * - * {@hide} - */ -@Documented -@Retention(SOURCE) -@Target({METHOD, PARAMETER, FIELD}) -public @interface XmlRes { -} diff --git a/core/java/android/app/admin/OWNERS b/core/java/android/app/admin/OWNERS index 8462cbe7497b..6acbef29bec3 100644 --- a/core/java/android/app/admin/OWNERS +++ b/core/java/android/app/admin/OWNERS @@ -3,9 +3,9 @@ # Android Enterprise team rubinxu@google.com sandness@google.com -eranm@google.com alexkershaw@google.com pgrafov@google.com # Emeritus yamasani@google.com +eranm@google.com diff --git a/core/java/android/app/compat/CompatChanges.java b/core/java/android/app/compat/CompatChanges.java index 74e1ece3fa89..8ca43c4a8e70 100644 --- a/core/java/android/app/compat/CompatChanges.java +++ b/core/java/android/app/compat/CompatChanges.java @@ -26,9 +26,11 @@ import android.os.ServiceManager; import android.os.UserHandle; import com.android.internal.compat.CompatibilityOverrideConfig; +import com.android.internal.compat.CompatibilityOverridesToRemoveConfig; import com.android.internal.compat.IPlatformCompat; import java.util.Map; +import java.util.Set; /** * CompatChanges APIs - to be used by platform code only (including mainline @@ -98,15 +100,19 @@ public final class CompatChanges { } /** - * Set an app compat override for a given package. This will check whether the caller is allowed + * Adds app compat overrides for a given package. This will check whether the caller is allowed * to perform this operation on the given apk and build. Only the installer package is allowed * to set overrides on a non-debuggable final build and a non-test apk. * + * <p>Note that calling this method doesn't remove previously added overrides for the given + * package if their change ID isn't in the given map, only replaces those that have the same + * change ID. + * * @param packageName The package name of the app in question. - * @param overrides A map from changeId to the override applied for this change id. + * @param overrides A map from change ID to the override applied for this change ID. */ @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD) - public static void setPackageOverride(@NonNull String packageName, + public static void addPackageOverrides(@NonNull String packageName, @NonNull Map<Long, PackageOverride> overrides) { IPlatformCompat platformCompat = IPlatformCompat.Stub.asInterface( ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE)); @@ -117,4 +123,29 @@ public final class CompatChanges { e.rethrowFromSystemServer(); } } + + /** + * Removes app compat overrides for a given package. This will check whether the caller is + * allowed to perform this operation on the given apk and build. Only the installer package is + * allowed to clear overrides on a non-debuggable final build and a non-test apk. + * + * <p>Note that calling this method with an empty set is a no-op and no overrides will be + * removed for the given package. + * + * @param packageName The package name of the app in question. + * @param overridesToRemove A set of change IDs for which to remove overrides. + */ + @RequiresPermission(android.Manifest.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD) + public static void removePackageOverrides(@NonNull String packageName, + @NonNull Set<Long> overridesToRemove) { + IPlatformCompat platformCompat = IPlatformCompat.Stub.asInterface( + ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE)); + CompatibilityOverridesToRemoveConfig config = new CompatibilityOverridesToRemoveConfig( + overridesToRemove); + try { + platformCompat.removeOverridesOnReleaseBuilds(config, packageName); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } } diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java index a40bf343239e..11b45e32c425 100644 --- a/core/java/android/bluetooth/BluetoothDevice.java +++ b/core/java/android/bluetooth/BluetoothDevice.java @@ -1605,13 +1605,13 @@ public final class BluetoothDevice implements Parcelable { * * <p>This API is asynchronous and {@link #ACTION_UUID} intent is sent, * with the UUIDs supported by the remote end. If there is an error - * in getting the SDP records or if the process takes a long time, - * {@link #ACTION_UUID} intent is sent with the UUIDs that is currently - * present in the cache. Clients should use the {@link #getUuids} to get UUIDs + * in getting the SDP records or if the process takes a long time, or the device is bonding and + * we have its UUIDs cached, {@link #ACTION_UUID} intent is sent with the UUIDs that is + * currently present in the cache. Clients should use the {@link #getUuids} to get UUIDs * if service discovery is not to be performed. * * @return False if the check fails, True if the process of initiating an ACL connection - * to the remote device was started. + * to the remote device was started or cached UUIDs will be broadcast. */ @RequiresPermission(Manifest.permission.BLUETOOTH) public boolean fetchUuidsWithSdp() { diff --git a/core/java/android/net/IpSecManager.java b/core/java/android/net/IpSecManager.java index 98acd98cc465..01d1aa533a8f 100644 --- a/core/java/android/net/IpSecManager.java +++ b/core/java/android/net/IpSecManager.java @@ -79,6 +79,16 @@ public final class IpSecManager { public static final int DIRECTION_OUT = 1; /** + * Used when applying a transform to direct traffic through an {@link IpSecTransform} for + * forwarding between interfaces. + * + * <p>See {@link #applyTransportModeTransform(Socket, int, IpSecTransform)}. + * + * @hide + */ + public static final int DIRECTION_FWD = 2; + + /** * The Security Parameter Index (SPI) 0 indicates an unknown or invalid index. * * <p>No IPsec packet may contain an SPI of 0. diff --git a/core/java/android/net/vcn/VcnNetworkPolicyResult.java b/core/java/android/net/vcn/VcnNetworkPolicyResult.java index 5e938200639c..14e70cfeb18a 100644 --- a/core/java/android/net/vcn/VcnNetworkPolicyResult.java +++ b/core/java/android/net/vcn/VcnNetworkPolicyResult.java @@ -87,6 +87,16 @@ public final class VcnNetworkPolicyResult implements Parcelable { && mNetworkCapabilities.equals(that.mNetworkCapabilities); } + @Override + public String toString() { + return "VcnNetworkPolicyResult { " + + "mIsTeardownRequested = " + + mIsTearDownRequested + + ", mNetworkCapabilities" + + mNetworkCapabilities + + " }"; + } + /** {@inheritDoc} */ @Override public int describeContents() { diff --git a/core/java/android/net/vcn/VcnUnderlyingNetworkPolicy.java b/core/java/android/net/vcn/VcnUnderlyingNetworkPolicy.java index b47d5642419e..b0d4f3be248f 100644 --- a/core/java/android/net/vcn/VcnUnderlyingNetworkPolicy.java +++ b/core/java/android/net/vcn/VcnUnderlyingNetworkPolicy.java @@ -85,6 +85,11 @@ public final class VcnUnderlyingNetworkPolicy implements Parcelable { return mVcnNetworkPolicyResult.equals(that.mVcnNetworkPolicyResult); } + @Override + public String toString() { + return mVcnNetworkPolicyResult.toString(); + } + /** {@inheritDoc} */ @Override public int describeContents() { diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index e47ffcc4ff4c..5017d9e8d905 100755 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -424,7 +424,8 @@ public class Build { * Magic version number for a current development build, which has * not yet turned into an official release. */ - public static final int CUR_DEVELOPMENT = VMRuntime.SDK_VERSION_CUR_DEVELOPMENT; + // This must match VMRuntime.SDK_VERSION_CUR_DEVELOPMENT. + public static final int CUR_DEVELOPMENT = 10000; /** * October 2008: The original, first, version of Android. Yay! @@ -1311,6 +1312,7 @@ public class Build { * selinux into "permissive" mode in particular. * @hide */ + @UnsupportedAppUsage public static final boolean IS_DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0) == 1; diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index 1e60f74dd3d3..a7516a428ff0 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -74,8 +74,9 @@ public final class Debug * * @deprecated Accurate counting is a burden on the runtime and may be removed. */ + // This must match VMDebug.TRACE_COUNT_ALLOCS. @Deprecated - public static final int TRACE_COUNT_ALLOCS = VMDebug.TRACE_COUNT_ALLOCS; + public static final int TRACE_COUNT_ALLOCS = 1; /** * Flags for printLoadedClasses(). Default behavior is to only show diff --git a/core/java/android/os/IRecoverySystem.aidl b/core/java/android/os/IRecoverySystem.aidl index 9368b68a91c6..88bdb7f6f00b 100644 --- a/core/java/android/os/IRecoverySystem.aidl +++ b/core/java/android/os/IRecoverySystem.aidl @@ -23,6 +23,7 @@ import android.os.IRecoverySystemProgressListener; /** @hide */ interface IRecoverySystem { + boolean allocateSpaceForUpdate(in String packageFilePath); boolean uncrypt(in String packageFile, IRecoverySystemProgressListener listener); boolean setupBcb(in String command); boolean clearBcb(); diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java index 051447f9219b..944b71700450 100644 --- a/core/java/android/os/RecoverySystem.java +++ b/core/java/android/os/RecoverySystem.java @@ -672,6 +672,14 @@ public class RecoverySystem { if (!rs.setupBcb(command)) { throw new IOException("Setup BCB failed"); } + try { + if (!rs.allocateSpaceForUpdate(packageFile)) { + throw new IOException("Failed to allocate space for update " + + packageFile.getAbsolutePath()); + } + } catch (RemoteException e) { + e.rethrowAsRuntimeException(); + } // Having set up the BCB (bootloader control block), go ahead and reboot PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); @@ -1392,6 +1400,13 @@ public class RecoverySystem { } /** + * Talks to RecoverySystemService via Binder to allocate space + */ + private boolean allocateSpaceForUpdate(File packageFile) throws RemoteException { + return mService.allocateSpaceForUpdate(packageFile.getAbsolutePath()); + } + + /** * Talks to RecoverySystemService via Binder to clear up the BCB. */ private boolean clearBcb() { diff --git a/core/java/android/os/VintfObject.java b/core/java/android/os/VintfObject.java index 7af8f71aa4aa..bf0b655fe574 100644 --- a/core/java/android/os/VintfObject.java +++ b/core/java/android/os/VintfObject.java @@ -16,6 +16,7 @@ package android.os; +import android.annotation.NonNull; import android.annotation.TestApi; import android.util.Slog; @@ -112,6 +113,15 @@ public class VintfObject { public static native String getSepolicyVersion(); /** + * @return the PLATFORM_SEPOLICY_VERSION build flag available in framework + * compatibility matrix. + * + * @hide + */ + @TestApi + public static native @NonNull String getPlatformSepolicyVersion(); + + /** * @return a list of VNDK snapshots supported by the framework, as * specified in framework manifest. For example, * [("27", ["libjpeg.so", "libbase.so"]), diff --git a/core/java/android/print/PrintAttributes.java b/core/java/android/print/PrintAttributes.java index c19884805507..f5081012fe4c 100644 --- a/core/java/android/print/PrintAttributes.java +++ b/core/java/android/print/PrintAttributes.java @@ -837,8 +837,8 @@ public final class PrintAttributes implements Parcelable { new MediaSize("JPN_YOU4", "android", R.string.mediasize_japanese_you4, 4134, 9252); /** Japanese Photo L media size: 89mm x 127mm (3.5 x 5") */ - public static final @NonNull MediaSize OE_PHOTO_L = - new MediaSize("OE_PHOTO_L", "android", + public static final @NonNull MediaSize JPN_OE_PHOTO_L = + new MediaSize("JPN_OE_PHOTO_L", "android", R.string.mediasize_japanese_l, 3500, 5000); private final @NonNull String mId; diff --git a/core/java/android/util/JsonReader.java b/core/java/android/util/JsonReader.java index 50f63f8db304..c75e23807432 100644 --- a/core/java/android/util/JsonReader.java +++ b/core/java/android/util/JsonReader.java @@ -16,7 +16,7 @@ package android.util; -import libcore.internal.StringPool; +import com.android.internal.util.StringPool; import java.io.Closeable; import java.io.EOFException; diff --git a/core/java/com/android/internal/annotations/GuardedBy.java b/core/java/com/android/internal/annotations/GuardedBy.java deleted file mode 100644 index 0e63214b4f1a..000000000000 --- a/core/java/com/android/internal/annotations/GuardedBy.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotation type used to mark a method or field that can only be accessed when - * holding the referenced locks. - */ -@Target({ ElementType.FIELD, ElementType.METHOD }) -@Retention(RetentionPolicy.CLASS) -public @interface GuardedBy { - String[] value(); -} diff --git a/core/java/com/android/internal/annotations/Immutable.java b/core/java/com/android/internal/annotations/Immutable.java deleted file mode 100644 index b424275f7a86..000000000000 --- a/core/java/com/android/internal/annotations/Immutable.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.annotations; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Annotation type used to mark a class which is immutable. - */ -@Target(ElementType.TYPE) -@Retention(RetentionPolicy.CLASS) -public @interface Immutable { -} diff --git a/core/java/com/android/internal/annotations/VisibleForTesting.java b/core/java/com/android/internal/annotations/VisibleForTesting.java deleted file mode 100644 index 99512ac68d5d..000000000000 --- a/core/java/com/android/internal/annotations/VisibleForTesting.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2012 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.internal.annotations; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Denotes that the class, method or field has its visibility relaxed so - * that unit tests can access it. - * <p/> - * The <code>visibility</code> argument can be used to specific what the original - * visibility should have been if it had not been made public or package-private for testing. - * The default is to consider the element private. - */ -@Retention(RetentionPolicy.CLASS) -public @interface VisibleForTesting { - /** - * Intended visibility if the element had not been made public or package-private for - * testing. - */ - enum Visibility { - /** The element should be considered protected. */ - PROTECTED, - /** The element should be considered package-private. */ - PACKAGE, - /** The element should be considered private. */ - PRIVATE - } - - /** - * Intended visibility if the element had not been made public or package-private for testing. - * If not specified, one should assume the element originally intended to be private. - */ - Visibility visibility() default Visibility.PRIVATE; -} diff --git a/core/java/com/android/internal/compat/CompatibilityChangeConfig.java b/core/java/com/android/internal/compat/CompatibilityChangeConfig.java index 36bc22906695..182dba71d0d7 100644 --- a/core/java/com/android/internal/compat/CompatibilityChangeConfig.java +++ b/core/java/com/android/internal/compat/CompatibilityChangeConfig.java @@ -39,14 +39,14 @@ public final class CompatibilityChangeConfig implements Parcelable { * Changes forced to be enabled. */ public Set<Long> enabledChanges() { - return mChangeConfig.forceEnabledSet(); + return mChangeConfig.getEnabledSet(); } /** * Changes forced to be disabled. */ public Set<Long> disabledChanges() { - return mChangeConfig.forceDisabledSet(); + return mChangeConfig.getDisabledSet(); } /** @@ -84,8 +84,8 @@ public final class CompatibilityChangeConfig implements Parcelable { @Override public void writeToParcel(Parcel dest, int flags) { - long[] enabled = mChangeConfig.forceEnabledChangesArray(); - long[] disabled = mChangeConfig.forceDisabledChangesArray(); + long[] enabled = mChangeConfig.getEnabledChangesArray(); + long[] disabled = mChangeConfig.getDisabledChangesArray(); dest.writeLongArray(enabled); dest.writeLongArray(disabled); diff --git a/core/java/com/android/internal/annotations/VisibleForNative.java b/core/java/com/android/internal/compat/CompatibilityOverridesToRemoveConfig.aidl index e6a3fc67b7d3..441e553e4d88 100644 --- a/core/java/com/android/internal/annotations/VisibleForNative.java +++ b/core/java/com/android/internal/compat/CompatibilityOverridesToRemoveConfig.aidl @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018 The Android Open Source Project + * Copyright (C) 2021 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. @@ -14,15 +14,6 @@ * limitations under the License. */ -package com.android.internal.annotations; +package com.android.internal.compat; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * Denotes that the class, method or field has its visibility relaxed so - * that native code can access it. - */ -@Retention(RetentionPolicy.CLASS) -public @interface VisibleForNative { -} +parcelable CompatibilityOverridesToRemoveConfig; diff --git a/core/java/com/android/internal/compat/CompatibilityOverridesToRemoveConfig.java b/core/java/com/android/internal/compat/CompatibilityOverridesToRemoveConfig.java new file mode 100644 index 000000000000..642f79ca7afa --- /dev/null +++ b/core/java/com/android/internal/compat/CompatibilityOverridesToRemoveConfig.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.compat; + + +import android.os.Parcel; +import android.os.Parcelable; + +import java.util.HashSet; +import java.util.Set; + +/** + * Parcelable containing compat config change IDs for which to remove overrides for a given + * application. + * @hide + */ +public final class CompatibilityOverridesToRemoveConfig implements Parcelable { + public final Set<Long> changeIds; + + public CompatibilityOverridesToRemoveConfig(Set<Long> changeIds) { + this.changeIds = changeIds; + } + + private CompatibilityOverridesToRemoveConfig(Parcel in) { + int keyCount = in.readInt(); + changeIds = new HashSet<>(); + for (int i = 0; i < keyCount; i++) { + changeIds.add(in.readLong()); + } + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(changeIds.size()); + for (Long changeId : changeIds) { + dest.writeLong(changeId); + } + } + + public static final Creator<CompatibilityOverridesToRemoveConfig> CREATOR = + new Creator<CompatibilityOverridesToRemoveConfig>() { + + @Override + public CompatibilityOverridesToRemoveConfig createFromParcel(Parcel in) { + return new CompatibilityOverridesToRemoveConfig(in); + } + + @Override + public CompatibilityOverridesToRemoveConfig[] newArray(int size) { + return new CompatibilityOverridesToRemoveConfig[size]; + } + }; +} diff --git a/core/java/com/android/internal/compat/IPlatformCompat.aidl b/core/java/com/android/internal/compat/IPlatformCompat.aidl index 78d1d22c401e..c9f170421e7b 100644 --- a/core/java/com/android/internal/compat/IPlatformCompat.aidl +++ b/core/java/com/android/internal/compat/IPlatformCompat.aidl @@ -22,6 +22,7 @@ import java.util.Map; parcelable CompatibilityChangeConfig; parcelable CompatibilityOverrideConfig; +parcelable CompatibilityOverridesToRemoveConfig; parcelable CompatibilityChangeInfo; /** * Platform private API for talking with the PlatformCompat service. @@ -204,6 +205,27 @@ interface IPlatformCompat { void clearOverrideForTest(long changeId, String packageName); /** + * Restores the default behaviour for compatibility changes on release builds. + * + * <p>The caller to this API needs to hold + * {@code android.permission.OVERRIDE_COMPAT_CHANGE_CONFIG_ON_RELEASE_BUILD} and all change ids + * in {@code overridesToRemove} need to annotated with + * {@link android.compat.annotation.Overridable}. + * + * A release build in this definition means that {@link android.os.Build#IS_DEBUGGABLE} needs to + * be {@code false}. + * + * <p>Note that this does not kill the app, and therefore overrides read from the app process + * will not be updated. Overrides read from the system process do take effect. + * + * @param overridesToRemove parcelable containing the compat change overrides to be removed + * @param packageName the package name of the app whose changes will be restored to the + * default behaviour + * @throws SecurityException if overriding changes is not permitted + */ + void removeOverridesOnReleaseBuilds(in CompatibilityOverridesToRemoveConfig overridesToRemove, in String packageName); + + /** * Enables all compatibility changes that have enabledSinceTargetSdk == * {@param targetSdkVersion} for an app, subject to the policy. * diff --git a/core/java/com/android/internal/os/BinderCallsStats.java b/core/java/com/android/internal/os/BinderCallsStats.java index 0fb2728aed73..dbba469dda1a 100644 --- a/core/java/com/android/internal/os/BinderCallsStats.java +++ b/core/java/com/android/internal/os/BinderCallsStats.java @@ -54,6 +54,7 @@ public class BinderCallsStats implements BinderInternal.Observer { public static final int PERIODIC_SAMPLING_INTERVAL_DEFAULT = 1000; public static final boolean DEFAULT_TRACK_SCREEN_INTERACTIVE = false; public static final boolean DEFAULT_TRACK_DIRECT_CALLING_UID = true; + public static final boolean DEFAULT_COLLECT_LATENCY_DATA = false; public static final int MAX_BINDER_CALL_STATS_COUNT_DEFAULT = 1500; private static final String DEBUG_ENTRY_PREFIX = "__DEBUG_"; @@ -89,19 +90,27 @@ public class BinderCallsStats implements BinderInternal.Observer { private boolean mAddDebugEntries = false; private boolean mTrackDirectCallingUid = DEFAULT_TRACK_DIRECT_CALLING_UID; private boolean mTrackScreenInteractive = DEFAULT_TRACK_SCREEN_INTERACTIVE; + private boolean mCollectLatencyData = DEFAULT_COLLECT_LATENCY_DATA; private CachedDeviceState.Readonly mDeviceState; private CachedDeviceState.TimeInStateStopwatch mBatteryStopwatch; + private BinderLatencyObserver mLatencyObserver; + /** Injector for {@link BinderCallsStats}. */ public static class Injector { public Random getRandomGenerator() { return new Random(); } + + public BinderLatencyObserver getLatencyObserver() { + return new BinderLatencyObserver(new BinderLatencyObserver.Injector()); + } } public BinderCallsStats(Injector injector) { this.mRandom = injector.getRandomGenerator(); + this.mLatencyObserver = injector.getLatencyObserver(); } public void setDeviceState(@NonNull CachedDeviceState.Readonly deviceState) { @@ -128,7 +137,10 @@ public class BinderCallsStats implements BinderInternal.Observer { if (shouldRecordDetailedData()) { s.cpuTimeStarted = getThreadTimeMicro(); s.timeStarted = getElapsedRealtimeMicro(); + } else if (mCollectLatencyData) { + s.timeStarted = getElapsedRealtimeMicro(); } + return s; } @@ -153,6 +165,10 @@ public class BinderCallsStats implements BinderInternal.Observer { private void processCallEnded(CallSession s, int parcelRequestSize, int parcelReplySize, int workSourceUid) { + if (mCollectLatencyData) { + mLatencyObserver.callEnded(s); + } + // Non-negative time signals we need to record data for this call. final boolean recordCall = s.cpuTimeStarted >= 0; final long duration; @@ -555,6 +571,17 @@ public class BinderCallsStats implements BinderInternal.Observer { } } + /** Whether to collect latency histograms. */ + public void setCollectLatencyData(boolean collectLatencyData) { + mCollectLatencyData = collectLatencyData; + } + + /** Whether to collect latency histograms. */ + @VisibleForTesting + public boolean getCollectLatencyData() { + return mCollectLatencyData; + } + public void reset() { synchronized (mLock) { mCallStatsCount = 0; @@ -565,6 +592,8 @@ public class BinderCallsStats implements BinderInternal.Observer { if (mBatteryStopwatch != null) { mBatteryStopwatch.reset(); } + // Do not reset the latency observer as binder stats and latency will be pushed to + // statsd at different intervals so the resets should not be coupled. } } @@ -767,6 +796,10 @@ public class BinderCallsStats implements BinderInternal.Observer { return mExceptionCounts; } + public BinderLatencyObserver getLatencyObserver() { + return mLatencyObserver; + } + @VisibleForTesting public static <T> List<T> getHighestValues(List<T> list, ToDoubleFunction<T> toDouble, double percentile) { diff --git a/core/java/com/android/internal/os/BinderLatencyObserver.java b/core/java/com/android/internal/os/BinderLatencyObserver.java new file mode 100644 index 000000000000..92b495284de2 --- /dev/null +++ b/core/java/com/android/internal/os/BinderLatencyObserver.java @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + +import android.annotation.Nullable; +import android.os.Binder; +import android.os.SystemClock; +import android.util.ArrayMap; +import android.util.Slog; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.BinderInternal.CallSession; + +import java.util.ArrayList; +import java.util.Random; + +/** Collects statistics about Binder call latency per calling API and method. */ +public class BinderLatencyObserver { + private static final String TAG = "BinderLatencyObserver"; + public static final int PERIODIC_SAMPLING_INTERVAL_DEFAULT = 10; + + // This is not the final data structure - we will eventually store latency histograms instead of + // raw samples as it is much more memory / disk space efficient. + // TODO(b/179999191): change this to store the histogram. + // TODO(b/179999191): pre allocate the array size so we would not have to resize this. + @GuardedBy("mLock") + private final ArrayMap<LatencyDims, ArrayList<Long>> mLatencySamples = new ArrayMap<>(); + private final Object mLock = new Object(); + + // Sampling period to control how often to track CPU usage. 1 means all calls, 100 means ~1 out + // of 100 requests. + private int mPeriodicSamplingInterval = PERIODIC_SAMPLING_INTERVAL_DEFAULT; + private final Random mRandom; + + /** Injector for {@link BinderLatencyObserver}. */ + public static class Injector { + public Random getRandomGenerator() { + return new Random(); + } + } + + public BinderLatencyObserver(Injector injector) { + mRandom = injector.getRandomGenerator(); + } + + /** Should be called when a Binder call completes, will store latency data. */ + public void callEnded(@Nullable CallSession s) { + if (s == null || s.exceptionThrown || !shouldKeepSample()) { + return; + } + + LatencyDims dims = new LatencyDims(s.binderClass, s.transactionCode); + long callDuration = getElapsedRealtimeMicro() - s.timeStarted; + + synchronized (mLock) { + if (!mLatencySamples.containsKey(dims)) { + mLatencySamples.put(dims, new ArrayList<Long>()); + } + + mLatencySamples.get(dims).add(callDuration); + } + } + + protected long getElapsedRealtimeMicro() { + return SystemClock.elapsedRealtimeNanos() / 1000; + } + + protected boolean shouldKeepSample() { + return mRandom.nextInt() % mPeriodicSamplingInterval == 0; + } + + /** Updates the sampling interval. */ + public void setSamplingInterval(int samplingInterval) { + if (samplingInterval <= 0) { + Slog.w(TAG, "Ignored invalid sampling interval (value must be positive): " + + samplingInterval); + return; + } + + synchronized (mLock) { + if (samplingInterval != mPeriodicSamplingInterval) { + mPeriodicSamplingInterval = samplingInterval; + reset(); + } + } + } + + /** Resets the sample collection. */ + public void reset() { + synchronized (mLock) { + mLatencySamples.clear(); + } + } + + /** Container for binder latency information. */ + public static class LatencyDims { + // Binder interface descriptor. + private Class<? extends Binder> mBinderClass; + // Binder transaction code. + private int mTransactionCode; + // Cached hash code, 0 if not set yet. + private int mHashCode = 0; + + public LatencyDims(Class<? extends Binder> binderClass, int transactionCode) { + this.mBinderClass = binderClass; + this.mTransactionCode = transactionCode; + } + + public Class<? extends Binder> getBinderClass() { + return mBinderClass; + } + + public int getTransactionCode() { + return mTransactionCode; + } + + @Override + public boolean equals(final Object other) { + if (other == null || !(other instanceof LatencyDims)) { + return false; + } + LatencyDims o = (LatencyDims) other; + return mTransactionCode == o.getTransactionCode() && mBinderClass == o.getBinderClass(); + } + + @Override + public int hashCode() { + if (mHashCode != 0) { + return mHashCode; + } + int hash = mTransactionCode; + hash = 31 * hash + mBinderClass.hashCode(); + mHashCode = hash; + return hash; + } + } + + @VisibleForTesting + public ArrayMap<LatencyDims, ArrayList<Long>> getLatencySamples() { + return mLatencySamples; + } +} diff --git a/core/java/com/android/internal/util/StringPool.java b/core/java/com/android/internal/util/StringPool.java new file mode 100644 index 000000000000..c5180a3fe8cf --- /dev/null +++ b/core/java/com/android/internal/util/StringPool.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.util; + +/** + * A pool of string instances. Unlike the {@link String#intern() VM's + * interned strings}, this pool provides no guarantee of reference equality. + * It is intended only to save allocations. This class is not thread safe. + * + * @hide + */ +public final class StringPool { + + private final String[] mPool = new String[512]; + + /** + * Constructs string pool. + */ + public StringPool() { + } + + private static boolean contentEquals(String s, char[] chars, int start, int length) { + if (s.length() != length) { + return false; + } + for (int i = 0; i < length; i++) { + if (chars[start + i] != s.charAt(i)) { + return false; + } + } + return true; + } + + /** + * Returns a string equal to {@code new String(array, start, length)}. + * + * @param array buffer containing string chars + * @param start offset in {@code array} where string starts + * @param length length of string + * @return string equal to {@code new String(array, start, length)} + */ + public String get(char[] array, int start, int length) { + // Compute an arbitrary hash of the content + int hashCode = 0; + for (int i = start; i < start + length; i++) { + hashCode = (hashCode * 31) + array[i]; + } + + // Pick a bucket using Doug Lea's supplemental secondaryHash function (from HashMap) + hashCode ^= (hashCode >>> 20) ^ (hashCode >>> 12); + hashCode ^= (hashCode >>> 7) ^ (hashCode >>> 4); + int index = hashCode & (mPool.length - 1); + + String pooled = mPool[index]; + if (pooled != null && contentEquals(pooled, array, start, length)) { + return pooled; + } + + String result = new String(array, start, length); + mPool[index] = result; + return result; + } +} diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 855448b21069..114f3955fc86 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -630,6 +630,7 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p char hotstartupsamplesOptsBuf[sizeof("-Xps-hot-startup-method-samples:")-1 + PROPERTY_VALUE_MAX]; char saveResolvedClassesDelayMsOptsBuf[ sizeof("-Xps-save-resolved-classes-delay-ms:")-1 + PROPERTY_VALUE_MAX]; + char profileMinSavePeriodOptsBuf[sizeof("-Xps-min-save-period-ms:")-1 + PROPERTY_VALUE_MAX]; char madviseRandomOptsBuf[sizeof("-XX:MadviseRandomAccess:")-1 + PROPERTY_VALUE_MAX]; char madviseWillNeedFileSizeVdex[ sizeof("-XMadviseWillNeedVdexFileSize:")-1 + PROPERTY_VALUE_MAX]; @@ -662,6 +663,8 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p char extraOptsBuf[PROPERTY_VALUE_MAX]; char voldDecryptBuf[PROPERTY_VALUE_MAX]; char perfettoHprofOptBuf[sizeof("-XX:PerfettoHprof=") + PROPERTY_VALUE_MAX]; + char perfettoJavaHeapStackOptBuf[ + sizeof("-XX:PerfettoJavaHeapStackProf=") + PROPERTY_VALUE_MAX]; enum { kEMDefault, kEMIntPortable, @@ -776,6 +779,10 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p parseRuntimeOption("dalvik.vm.perfetto_hprof", perfettoHprofOptBuf, "-XX:PerfettoHprof=", "true"); + // Enable PerfettoJavaHeapStackProf in the zygote + parseRuntimeOption("dalvik.vm.perfetto_javaheap", perfettoJavaHeapStackOptBuf, + "-XX:PerfettoJavaHeapStackProf=", "true"); + if (primary_zygote) { addOption("-Xprimaryzygote"); } @@ -859,6 +866,9 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p parseRuntimeOption("dalvik.vm.ps-resolved-classes-delay-ms", saveResolvedClassesDelayMsOptsBuf, "-Xps-save-resolved-classes-delay-ms:"); + parseRuntimeOption("dalvik.vm.ps-min-save-period-ms", profileMinSavePeriodOptsBuf, + "-Xps-min-save-period-ms:"); + property_get("ro.config.low_ram", propBuf, ""); if (strcmp(propBuf, "true") == 0) { addOption("-XX:LowMemoryMode"); diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp index feb8930a0dbf..1a7f6e8863ff 100644 --- a/core/jni/android_media_AudioSystem.cpp +++ b/core/jni/android_media_AudioSystem.cpp @@ -2273,10 +2273,19 @@ android_media_AudioSystem_setSurroundFormatEnabled(JNIEnv *env, jobject thiz, return (jint)nativeToJavaStatus(status); } -static jint android_media_AudioSystem_get_FCC_8(JNIEnv *env, jobject thiz) { +static jint android_media_AudioSystem_getMaxChannelCount(JNIEnv *env, jobject thiz) { return FCC_8; } +static jint android_media_AudioSystem_getMaxSampleRate(JNIEnv *env, jobject thiz) { + // see frameworks/av/services/audiopolicy/common/include/policy.h + return 192000; // SAMPLE_RATE_HZ_MAX (for API) +} + +static jint android_media_AudioSystem_getMinSampleRate(JNIEnv *env, jobject thiz) { + return 4000; // SAMPLE_RATE_HZ_MIN (for API) +} + static jint android_media_AudioSystem_setAssistantUid(JNIEnv *env, jobject thiz, jint uid) { @@ -2672,14 +2681,18 @@ static const JNINativeMethod gEventHandlerMethods[] = { (void *)android_media_AudioSystem_eventHandlerFinalize}, }; -static const JNINativeMethod gGetFCC8Methods[] = { - {"native_get_FCC_8", "()I", (void *)android_media_AudioSystem_get_FCC_8}, +static const JNINativeMethod gFrameworkCapabilities[] = { + {"native_getMaxChannelCount", "()I", (void *)android_media_AudioSystem_getMaxChannelCount}, + {"native_getMaxSampleRate", "()I", (void *)android_media_AudioSystem_getMaxSampleRate}, + {"native_getMinSampleRate", "()I", (void *)android_media_AudioSystem_getMinSampleRate}, }; int register_android_media_AudioSystem(JNIEnv *env) { // This needs to be done before hooking up methods AudioTrackRoutingProxy (below) - RegisterMethodsOrDie(env, kClassPathName, gGetFCC8Methods, NELEM(gGetFCC8Methods)); + // as the calls are performed in the static initializer of AudioSystem. + RegisterMethodsOrDie(env, kClassPathName, gFrameworkCapabilities, + NELEM(gFrameworkCapabilities)); jclass arrayListClass = FindClassOrDie(env, "java/util/ArrayList"); gArrayListClass = MakeGlobalRefOrDie(env, arrayListClass); diff --git a/core/jni/android_os_VintfObject.cpp b/core/jni/android_os_VintfObject.cpp index 4bd33a9cbd3b..1baea2aecc3c 100644 --- a/core/jni/android_os_VintfObject.cpp +++ b/core/jni/android_os_VintfObject.cpp @@ -37,11 +37,13 @@ static jmethodID gLongValueOf; namespace android { +using vintf::CompatibilityMatrix; using vintf::HalManifest; using vintf::Level; using vintf::SchemaType; using vintf::to_string; using vintf::toXml; +using vintf::Version; using vintf::VintfObject; using vintf::Vndk; @@ -119,6 +121,28 @@ static jstring android_os_VintfObject_getSepolicyVersion(JNIEnv* env, jclass) { return env->NewStringUTF(cString.c_str()); } +static jstring android_os_VintfObject_getPlatformSepolicyVersion(JNIEnv* env, jclass) { + std::shared_ptr<const CompatibilityMatrix> matrix = + VintfObject::GetFrameworkCompatibilityMatrix(); + if (matrix == nullptr || matrix->type() != SchemaType::FRAMEWORK) { + jniThrowRuntimeException(env, "Cannot get framework compatibility matrix"); + return nullptr; + } + + auto versions = matrix->getSepolicyVersions(); + if (versions.empty()) { + jniThrowRuntimeException(env, + "sepolicy_version in framework compatibility matrix is empty"); + return nullptr; + } + + Version latest; + for (const auto& range : versions) { + latest = std::max(latest, range.maxVer()); + } + return env->NewStringUTF(to_string(latest).c_str()); +} + static jobject android_os_VintfObject_getVndkSnapshots(JNIEnv* env, jclass) { std::shared_ptr<const HalManifest> manifest = VintfObject::GetFrameworkHalManifest(); if (manifest == nullptr || manifest->type() != SchemaType::FRAMEWORK) { @@ -145,12 +169,17 @@ static jobject android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersi // ---------------------------------------------------------------------------- static const JNINativeMethod gVintfObjectMethods[] = { - {"report", "()[Ljava/lang/String;", (void*)android_os_VintfObject_report}, - {"verifyWithoutAvb", "()I", (void*)android_os_VintfObject_verifyWithoutAvb}, - {"getHalNamesAndVersions", "()[Ljava/lang/String;", (void*)android_os_VintfObject_getHalNamesAndVersions}, - {"getSepolicyVersion", "()Ljava/lang/String;", (void*)android_os_VintfObject_getSepolicyVersion}, - {"getVndkSnapshots", "()Ljava/util/Map;", (void*)android_os_VintfObject_getVndkSnapshots}, - {"getTargetFrameworkCompatibilityMatrixVersion", "()Ljava/lang/Long;", (void*)android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersion}, + {"report", "()[Ljava/lang/String;", (void*)android_os_VintfObject_report}, + {"verifyWithoutAvb", "()I", (void*)android_os_VintfObject_verifyWithoutAvb}, + {"getHalNamesAndVersions", "()[Ljava/lang/String;", + (void*)android_os_VintfObject_getHalNamesAndVersions}, + {"getSepolicyVersion", "()Ljava/lang/String;", + (void*)android_os_VintfObject_getSepolicyVersion}, + {"getPlatformSepolicyVersion", "()Ljava/lang/String;", + (void*)android_os_VintfObject_getPlatformSepolicyVersion}, + {"getVndkSnapshots", "()Ljava/util/Map;", (void*)android_os_VintfObject_getVndkSnapshots}, + {"getTargetFrameworkCompatibilityMatrixVersion", "()Ljava/lang/Long;", + (void*)android_os_VintfObject_getTargetFrameworkCompatibilityMatrixVersion}, }; const char* const kVintfObjectPathName = "android/os/VintfObject"; diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index cbc08ba621a9..6bdfe289112c 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -632,6 +632,13 @@ <!-- The default minimal size of a PiP task, in both dimensions. --> <dimen name="default_minimal_size_pip_resizable_task">108dp</dimen> + <!-- + The overridable minimal size of a PiP task, in both dimensions. + Different from default_minimal_size_pip_resizable_task, this is to limit the dimension + when the pinned stack size is overridden by app via minWidth/minHeight. + --> + <dimen name="overridable_minimal_size_pip_resizable_task">48dp</dimen> + <!-- Height of a task when in minimized mode from the top when launcher is resizable. --> <dimen name="task_height_of_minimized_mode">80dp</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index c06e7ded81f8..43f4300e04eb 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1941,6 +1941,7 @@ <java-symbol type="fraction" name="config_dimBehindFadeDuration" /> <java-symbol type="dimen" name="default_minimal_size_resizable_task" /> <java-symbol type="dimen" name="default_minimal_size_pip_resizable_task" /> + <java-symbol type="dimen" name="overridable_minimal_size_pip_resizable_task" /> <java-symbol type="dimen" name="task_height_of_minimized_mode" /> <java-symbol type="fraction" name="config_screenAutoBrightnessDozeScaleFactor" /> <java-symbol type="bool" name="config_allowPriorityVibrationsInLowPowerMode" /> diff --git a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java index dd60dd4c40f9..1a636604ed57 100644 --- a/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java +++ b/core/tests/bandwidthtests/src/com/android/bandwidthtest/util/ConnectionUtil.java @@ -44,8 +44,6 @@ import com.android.bandwidthtest.NetworkState; import com.android.bandwidthtest.NetworkState.StateTransitionDirection; import com.android.internal.util.AsyncChannel; -import junit.framework.Assert; - import java.io.IOException; import java.net.UnknownHostException; import java.util.List; @@ -76,7 +74,11 @@ public class ConnectionUtil { private WifiManager mWifiManager; private Context mContext; // Verify connectivity state - private static final int NUM_NETWORK_TYPES = ConnectivityManager.MAX_NETWORK_TYPE + 1; + // ConnectivityManager.TYPE_* is deprecated and no longer extended, so use the max public + // network type - TYPE_VPN should be enough. + // TODO: Replace registering CONNECTIVITY_ACTION with registering NetworkCallback and check + // network by NetworkCapabilities.TRANSPORT_* and NetworkCapabilities.hasTransport() instead. + private static final int NUM_NETWORK_TYPES = ConnectivityManager.TYPE_VPN + 1; private NetworkState[] mConnectivityState = new NetworkState[NUM_NETWORK_TYPES]; public ConnectionUtil(Context context) { diff --git a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java index eb9c7b66d642..1156120217aa 100644 --- a/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BinderCallsStatsTest.java @@ -753,6 +753,34 @@ public class BinderCallsStatsTest { assertEquals(1, callStats.recordedCallCount); } + @Test + public void testLatencyCollectionEnabled() { + TestBinderCallsStats bcs = new TestBinderCallsStats(); + bcs.setCollectLatencyData(true); + + Binder binder = new Binder(); + CallSession callSession = bcs.callStarted(binder, 1, WORKSOURCE_UID); + bcs.time += 10; + bcs.elapsedTime += 20; + bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID); + + assertEquals(1, bcs.getLatencyObserver().getLatencySamples().size()); + } + + @Test + public void testLatencyCollectionDisabledByDefault() { + TestBinderCallsStats bcs = new TestBinderCallsStats(); + assertEquals(false, bcs.getCollectLatencyData()); + + Binder binder = new Binder(); + CallSession callSession = bcs.callStarted(binder, 1, WORKSOURCE_UID); + bcs.time += 10; + bcs.elapsedTime += 20; + bcs.callEnded(callSession, REQUEST_SIZE, REPLY_SIZE, WORKSOURCE_UID); + + assertEquals(0, bcs.getLatencyObserver().getLatencySamples().size()); + } + class TestBinderCallsStats extends BinderCallsStats { public int callingUid = CALLING_UID; public long time = 1234; @@ -774,6 +802,10 @@ public class BinderCallsStatsTest { } }; } + + public BinderLatencyObserver getLatencyObserver() { + return new BinderLatencyObserverTest.TestBinderLatencyObserver(); + } }); setSamplingInterval(1); setAddDebugEntries(false); diff --git a/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java b/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java new file mode 100644 index 000000000000..36915a205ee0 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/os/BinderLatencyObserverTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.os; + +import static com.google.common.truth.Truth.assertThat; + +import static org.junit.Assert.assertEquals; + +import android.os.Binder; +import android.platform.test.annotations.Presubmit; +import android.util.ArrayMap; + +import androidx.test.filters.SmallTest; +import androidx.test.runner.AndroidJUnit4; + +import com.android.internal.os.BinderInternal.CallSession; +import com.android.internal.os.BinderLatencyObserver.LatencyDims; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Random; + +@SmallTest +@RunWith(AndroidJUnit4.class) +@Presubmit +public class BinderLatencyObserverTest { + @Test + public void testLatencyCollectionWithMultipleClasses() { + TestBinderLatencyObserver blo = new TestBinderLatencyObserver(); + + Binder binder = new Binder(); + CallSession callSession = new CallSession(); + callSession.binderClass = binder.getClass(); + callSession.transactionCode = 1; + blo.callEnded(callSession); + blo.callEnded(callSession); + callSession.transactionCode = 2; + blo.callEnded(callSession); + + ArrayMap<LatencyDims, ArrayList<Long>> latencySamples = blo.getLatencySamples(); + assertEquals(2, latencySamples.keySet().size()); + assertThat(latencySamples.get(new LatencyDims(binder.getClass(), 1))) + .containsExactlyElementsIn(Arrays.asList(1L, 2L)); + assertThat(latencySamples.get(new LatencyDims(binder.getClass(), 2))).containsExactly(3L); + } + + @Test + public void testSampling() { + TestBinderLatencyObserver blo = new TestBinderLatencyObserver(); + blo.setSamplingInterval(2); + + Binder binder = new Binder(); + CallSession callSession = new CallSession(); + callSession.binderClass = binder.getClass(); + callSession.transactionCode = 1; + blo.callEnded(callSession); + callSession.transactionCode = 2; + blo.callEnded(callSession); + + ArrayMap<LatencyDims, ArrayList<Long>> latencySamples = blo.getLatencySamples(); + assertEquals(1, latencySamples.size()); + LatencyDims dims = latencySamples.keySet().iterator().next(); + assertEquals(binder.getClass(), dims.getBinderClass()); + assertEquals(1, dims.getTransactionCode()); + ArrayList<Long> values = latencySamples.get(dims); + assertThat(values).containsExactly(1L); + } + + public static class TestBinderLatencyObserver extends BinderLatencyObserver { + private long mElapsedTimeCallCount = 0; + + TestBinderLatencyObserver() { + // Make random generator not random. + super(new Injector() { + public Random getRandomGenerator() { + return new Random() { + int mCallCount = 0; + + public int nextInt() { + return mCallCount++; + } + }; + } + }); + setSamplingInterval(1); + } + + @Override + protected long getElapsedRealtimeMicro() { + return ++mElapsedTimeCallCount; + } + } +} diff --git a/core/tests/utiltests/src/com/android/internal/util/StringPoolTest.java b/core/tests/utiltests/src/com/android/internal/util/StringPoolTest.java new file mode 100644 index 000000000000..f67fd516fcf6 --- /dev/null +++ b/core/tests/utiltests/src/com/android/internal/util/StringPoolTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.internal.util; + +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.SmallTest; + +@SmallTest +public final class StringPoolTest extends AndroidTestCase { + + public void testStringPool() { + StringPool stringPool = new StringPool(); + String bcd = stringPool.get(new char[] { 'a', 'b', 'c', 'd', 'e' }, 1, 3); + assertEquals("bcd", bcd); + assertSame(bcd, stringPool.get(new char[] { 'a', 'b', 'c', 'd', 'e' }, 1, 3)); + } + + public void testHashCollision() { + StringPool stringPool = new StringPool(); + char[] a = { (char) 1, (char) 0 }; + char[] b = { (char) 0, (char) 31 }; + assertEquals(new String(a).hashCode(), new String(b).hashCode()); + + String aString = stringPool.get(a, 0, 2); + assertEquals(new String(a), aString); + String bString = stringPool.get(b, 0, 2); + assertEquals(new String(b), bString); + assertSame(bString, stringPool.get(b, 0, 2)); + assertNotSame(aString, stringPool.get(a, 0, 2)); + } +} diff --git a/keystore/java/android/security/keystore/AttestationUtils.java b/keystore/java/android/security/keystore/AttestationUtils.java index be865a02a945..3980d3a0203b 100644 --- a/keystore/java/android/security/keystore/AttestationUtils.java +++ b/keystore/java/android/security/keystore/AttestationUtils.java @@ -293,6 +293,11 @@ public abstract class AttestationUtils { } catch (SecurityException e) { throw e; } catch (Exception e) { + // If a DeviceIdAttestationException was previously wrapped with some other type, + // let's throw the original exception instead of wrapping it yet again. + if (e.getCause() instanceof DeviceIdAttestationException) { + throw (DeviceIdAttestationException) e.getCause(); + } throw new DeviceIdAttestationException("Unable to perform attestation", e); } } diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index bd2524f4b4b1..5885c7dd8b50 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -518,13 +518,13 @@ public final class AudioFormat implements Parcelable { * @hide */ // never unhide - public static final int SAMPLE_RATE_HZ_MIN = 4000; + public static final int SAMPLE_RATE_HZ_MIN = AudioSystem.SAMPLE_RATE_HZ_MIN; /** Maximum value for sample rate, * assuming AudioTrack and AudioRecord share the same limitations. * @hide */ // never unhide - public static final int SAMPLE_RATE_HZ_MAX = 192000; + public static final int SAMPLE_RATE_HZ_MAX = AudioSystem.SAMPLE_RATE_HZ_MAX; /** Sample rate will be a route-dependent value. * For AudioTrack, it is usually the sink sample rate, * and for AudioRecord it is usually the source sample rate. diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java index 8425185b90d0..2d9bdafa1f45 100644 --- a/media/java/android/media/AudioSystem.java +++ b/media/java/android/media/AudioSystem.java @@ -101,11 +101,31 @@ public class AudioSystem */ public static final int NUM_STREAMS = 5; + /* + * Framework static final constants that are primitives or Strings + * accessed by CTS tests or internal applications must be set from methods + * (or in a static block) to prevent Java compile-time replacement. + * We set them from methods so they are read from the device framework. + * Do not un-hide or change to a numeric literal. + */ + /** Maximum value for AudioTrack channel count - * @hide public for MediaCode only, do not un-hide or change to a numeric literal + * @hide + */ + public static final int OUT_CHANNEL_COUNT_MAX = native_getMaxChannelCount(); + private static native int native_getMaxChannelCount(); + + /** Maximum value for sample rate, used by AudioFormat. + * @hide + */ + public static final int SAMPLE_RATE_HZ_MAX = native_getMaxSampleRate(); + private static native int native_getMaxSampleRate(); + + /** Minimum value for sample rate, used by AudioFormat. + * @hide */ - public static final int OUT_CHANNEL_COUNT_MAX = native_get_FCC_8(); - private static native int native_get_FCC_8(); + public static final int SAMPLE_RATE_HZ_MIN = native_getMinSampleRate(); + private static native int native_getMinSampleRate(); // Expose only the getter method publicly so we can change it in the future private static final int NUM_STREAM_TYPES = 12; diff --git a/mime/java/android/content/type/DefaultMimeMapFactory.java b/mime/java/android/content/type/DefaultMimeMapFactory.java index 11d20d4d6c80..bcd0eb0a9e39 100644 --- a/mime/java/android/content/type/DefaultMimeMapFactory.java +++ b/mime/java/android/content/type/DefaultMimeMapFactory.java @@ -96,7 +96,7 @@ public class DefaultMimeMapFactory { specs.add(spec); startIdx = endIdx + 1; // skip over the space } while (startIdx < line.length()); - builder.put(specs.get(0), specs.subList(1, specs.size())); + builder.addMimeMapping(specs.get(0), specs.subList(1, specs.size())); } } catch (IOException | RuntimeException e) { throw new RuntimeException("Failed to parse " + resourceName, e); diff --git a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java index 60bcf37304a5..18c38c5a6494 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/DataUsageController.java @@ -113,7 +113,8 @@ public class DataUsageController { } public DataUsageInfo getWifiDataUsageInfo() { - NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard(); + NetworkTemplate template = NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null); return getDataUsageInfo(template); } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java index f7bee30a087f..27d877db4952 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/DataUsageControllerTest.java @@ -89,7 +89,8 @@ public class DataUsageControllerTest { mNetworkTemplate = NetworkTemplate.buildTemplateMobileAll(SUB_ID); mNetworkTemplate2 = NetworkTemplate.buildTemplateMobileAll(SUB_ID_2); - mWifiNetworkTemplate = NetworkTemplate.buildTemplateWifiWildcard(); + mWifiNetworkTemplate = NetworkTemplate.buildTemplateWifi( + NetworkTemplate.WIFI_NETWORKID_ALL, null); } @Test diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java index 54df53dbe6d7..29d77a72c73a 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipTaskOrganizer.java @@ -45,6 +45,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; +import android.util.EventLog; import android.util.Log; import android.util.Size; import android.view.SurfaceControl; @@ -223,6 +224,7 @@ public class PipTaskOrganizer extends TaskOrganizer implements private PipSurfaceTransactionHelper.SurfaceControlTransactionFactory mSurfaceControlTransactionFactory; private PictureInPictureParams mPictureInPictureParams; + private int mOverridableMinSize; /** * If set to {@code true}, the entering animation will be skipped and we will wait for @@ -244,6 +246,8 @@ public class PipTaskOrganizer extends TaskOrganizer implements mPipBoundsHandler = boundsHandler; mEnterExitAnimationDuration = context.getResources() .getInteger(R.integer.config_pipResizeAnimationDuration); + mOverridableMinSize = context.getResources().getDimensionPixelSize( + com.android.internal.R.dimen.overridable_minimal_size_pip_resizable_task); mSurfaceTransactionHelper = surfaceTransactionHelper; mPipAnimationController = pipAnimationController; mPipUiEventLoggerLogger = pipUiEventLogger; @@ -949,7 +953,14 @@ public class PipTaskOrganizer extends TaskOrganizer implements // -1 will be populated if an activity specifies defaultWidth/defaultHeight in <layout> // without minWidth/minHeight if (windowLayout.minWidth > 0 && windowLayout.minHeight > 0) { - return new Size(windowLayout.minWidth, windowLayout.minHeight); + // If either dimension is smaller than the allowed minimum, adjust them + // according to mOverridableMinSize and log to SafeNet + if (windowLayout.minWidth < mOverridableMinSize + || windowLayout.minHeight < mOverridableMinSize) { + EventLog.writeEvent(0x534e4554, "174302616", -1, ""); + } + return new Size(Math.max(windowLayout.minWidth, mOverridableMinSize), + Math.max(windowLayout.minHeight, mOverridableMinSize)); } return null; } diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java index 42dde4064a97..b8a468e0ce45 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotNotificationsController.java @@ -252,7 +252,7 @@ public class ScreenshotNotificationsController { dpm.createAdminSupportIntent(DevicePolicyManager.POLICY_DISABLE_SCREEN_CAPTURE); if (intent != null) { final PendingIntent pendingIntent = PendingIntent.getActivityAsUser( - mContext, 0, intent, 0, null, UserHandle.CURRENT); + mContext, 0, intent, PendingIntent.FLAG_IMMUTABLE, null, UserHandle.CURRENT); b.setContentIntent(pendingIntent); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java index 60ee75b534d8..f6f8d6c7f4a9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java @@ -193,7 +193,8 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof if (enabled) { mWaitingForTerminalState = true; if (DEBUG) Log.d(TAG, "Starting tethering"); - mTetheringManager.startTethering(new TetheringRequest.Builder(TETHERING_WIFI).build(), + mTetheringManager.startTethering(new TetheringRequest.Builder( + TETHERING_WIFI).setShouldShowEntitlementUi(false).build(), ConcurrentUtils.DIRECT_EXECUTOR, new TetheringManager.StartTetheringCallback() { @Override diff --git a/services/Android.bp b/services/Android.bp index 57a7bc52c057..1f4258dce312 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -156,13 +156,13 @@ droidstubs { defaults: ["services-stubs-default"], check_api: { current: { - api_file: "api/non-updatable-current.txt", - removed_api_file: "api/non-updatable-removed.txt", + api_file: "api/current.txt", + removed_api_file: "api/removed.txt", }, api_lint: { enabled: true, new_since: ":android-non-updatable.api.system-server.latest", - baseline_file: "api/non-updatable-lint-baseline.txt", + baseline_file: "api/lint-baseline.txt", }, }, dists: [ diff --git a/services/api/Android.bp b/services/api/Android.bp index bbc8c72b2eef..ee7d49fc99c8 100644 --- a/services/api/Android.bp +++ b/services/api/Android.bp @@ -24,12 +24,12 @@ package { filegroup { name: "non-updatable-system-server-current.txt", - srcs: ["non-updatable-current.txt"], + srcs: ["current.txt"], visibility: ["//frameworks/base/api"], } filegroup { name: "non-updatable-system-server-removed.txt", - srcs: ["non-updatable-removed.txt"], + srcs: ["removed.txt"], visibility: ["//frameworks/base/api"], } diff --git a/services/api/current.txt b/services/api/current.txt index 7c5c01ef6868..6419b7088fdb 100644 --- a/services/api/current.txt +++ b/services/api/current.txt @@ -1,49 +1,4 @@ // Signature format: 2.0 -package com.android.permission.persistence { - - public interface RuntimePermissionsPersistence { - method @NonNull public static com.android.permission.persistence.RuntimePermissionsPersistence createInstance(); - method public void deleteForUser(@NonNull android.os.UserHandle); - method @Nullable public com.android.permission.persistence.RuntimePermissionsState readForUser(@NonNull android.os.UserHandle); - method public void writeForUser(@NonNull com.android.permission.persistence.RuntimePermissionsState, @NonNull android.os.UserHandle); - } - - public final class RuntimePermissionsState { - ctor public RuntimePermissionsState(int, @Nullable String, @NonNull java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>>, @NonNull java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>>); - method @Nullable public String getFingerprint(); - method @NonNull public java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>> getPackagePermissions(); - method @NonNull public java.util.Map<java.lang.String,java.util.List<com.android.permission.persistence.RuntimePermissionsState.PermissionState>> getSharedUserPermissions(); - method public int getVersion(); - field public static final int NO_VERSION = -1; // 0xffffffff - } - - public static final class RuntimePermissionsState.PermissionState { - ctor public RuntimePermissionsState.PermissionState(@NonNull String, boolean, int); - method public int getFlags(); - method @NonNull public String getName(); - method public boolean isGranted(); - } - -} - -package com.android.role.persistence { - - public interface RolesPersistence { - method @NonNull public static com.android.role.persistence.RolesPersistence createInstance(); - method public void deleteForUser(@NonNull android.os.UserHandle); - method @Nullable public com.android.role.persistence.RolesState readForUser(@NonNull android.os.UserHandle); - method public void writeForUser(@NonNull com.android.role.persistence.RolesState, @NonNull android.os.UserHandle); - } - - public final class RolesState { - ctor public RolesState(int, @Nullable String, @NonNull java.util.Map<java.lang.String,java.util.Set<java.lang.String>>); - method @Nullable public String getPackagesHash(); - method @NonNull public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> getRoles(); - method public int getVersion(); - } - -} - package com.android.server { public final class LocalManagerRegistry { diff --git a/services/api/lint-baseline.txt b/services/api/lint-baseline.txt index e985ddb5352b..b46d21edd44c 100644 --- a/services/api/lint-baseline.txt +++ b/services/api/lint-baseline.txt @@ -1,4 +1,8 @@ // Baseline format: 1.0 +NotCloseable: com.android.server.wifi.SupplicantManager: + Classes that release resources (stop()) should implement AutoClosable and CloseGuard: class com.android.server.wifi.SupplicantManager + + ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder): Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder)} ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder, boolean): diff --git a/services/api/non-updatable-current.txt b/services/api/non-updatable-current.txt deleted file mode 100644 index 6419b7088fdb..000000000000 --- a/services/api/non-updatable-current.txt +++ /dev/null @@ -1,54 +0,0 @@ -// Signature format: 2.0 -package com.android.server { - - public final class LocalManagerRegistry { - method public static <T> void addManager(@NonNull Class<T>, @NonNull T); - method @Nullable public static <T> T getManager(@NonNull Class<T>); - } - - public abstract class SystemService { - ctor public SystemService(@NonNull android.content.Context); - method @NonNull public final android.content.Context getContext(); - method public boolean isUserSupported(@NonNull com.android.server.SystemService.TargetUser); - method public void onBootPhase(int); - method public abstract void onStart(); - method public void onUserStarting(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserStopped(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserStopping(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserSwitching(@Nullable com.android.server.SystemService.TargetUser, @NonNull com.android.server.SystemService.TargetUser); - method public void onUserUnlocked(@NonNull com.android.server.SystemService.TargetUser); - method public void onUserUnlocking(@NonNull com.android.server.SystemService.TargetUser); - method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder); - method protected final void publishBinderService(@NonNull String, @NonNull android.os.IBinder, boolean); - field public static final int PHASE_ACTIVITY_MANAGER_READY = 550; // 0x226 - field public static final int PHASE_BOOT_COMPLETED = 1000; // 0x3e8 - field public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520; // 0x208 - field public static final int PHASE_LOCK_SETTINGS_READY = 480; // 0x1e0 - field public static final int PHASE_SYSTEM_SERVICES_READY = 500; // 0x1f4 - field public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600; // 0x258 - field public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; // 0x64 - } - - public static final class SystemService.TargetUser { - method @NonNull public android.os.UserHandle getUserHandle(); - } - -} - -package com.android.server.stats { - - public final class StatsHelper { - method public static void sendStatsdReadyBroadcast(@NonNull android.content.Context); - } - -} - -package com.android.server.wifi { - - public class SupplicantManager { - method public static void start(); - method public static void stop(); - } - -} - diff --git a/services/api/non-updatable-lint-baseline.txt b/services/api/non-updatable-lint-baseline.txt deleted file mode 100644 index b46d21edd44c..000000000000 --- a/services/api/non-updatable-lint-baseline.txt +++ /dev/null @@ -1,9 +0,0 @@ -// Baseline format: 1.0 -NotCloseable: com.android.server.wifi.SupplicantManager: - Classes that release resources (stop()) should implement AutoClosable and CloseGuard: class com.android.server.wifi.SupplicantManager - - -ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder): - Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder)} -ProtectedMember: com.android.server.SystemService#publishBinderService(String, android.os.IBinder, boolean): - Protected methods not allowed; must be public: method com.android.server.SystemService.publishBinderService(String,android.os.IBinder,boolean)} diff --git a/services/api/non-updatable-removed.txt b/services/api/non-updatable-removed.txt deleted file mode 100644 index d802177e249b..000000000000 --- a/services/api/non-updatable-removed.txt +++ /dev/null @@ -1 +0,0 @@ -// Signature format: 2.0 diff --git a/services/core/java/com/android/server/BinderCallsStatsService.java b/services/core/java/com/android/server/BinderCallsStatsService.java index c771eb701b1d..9c8582f78134 100644 --- a/services/core/java/com/android/server/BinderCallsStatsService.java +++ b/services/core/java/com/android/server/BinderCallsStatsService.java @@ -40,6 +40,7 @@ import com.android.internal.os.AppIdToPackageMap; import com.android.internal.os.BackgroundThread; import com.android.internal.os.BinderCallsStats; import com.android.internal.os.BinderInternal; +import com.android.internal.os.BinderLatencyObserver; import com.android.internal.os.CachedDeviceState; import com.android.internal.util.DumpUtils; @@ -120,6 +121,7 @@ public class BinderCallsStatsService extends Binder { /** Listens for flag changes. */ private static class SettingsObserver extends ContentObserver { + // Settings for BinderCallsStats. private static final String SETTINGS_ENABLED_KEY = "enabled"; private static final String SETTINGS_DETAILED_TRACKING_KEY = "detailed_tracking"; private static final String SETTINGS_UPLOAD_DATA_KEY = "upload_data"; @@ -127,6 +129,10 @@ public class BinderCallsStatsService extends Binder { private static final String SETTINGS_TRACK_SCREEN_INTERACTIVE_KEY = "track_screen_state"; private static final String SETTINGS_TRACK_DIRECT_CALLING_UID_KEY = "track_calling_uid"; private static final String SETTINGS_MAX_CALL_STATS_KEY = "max_call_stats_count"; + // Settings for BinderLatencyObserver. + private static final String SETTINGS_COLLECT_LATENCY_DATA_KEY = "collect_Latency_data"; + private static final String SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY = + "latency_observer_sampling_interval"; private boolean mEnabled; private final Uri mUri = Settings.Global.getUriFor(Settings.Global.BINDER_CALLS_STATS); @@ -180,6 +186,13 @@ public class BinderCallsStatsService extends Binder { mBinderCallsStats.setTrackDirectCallerUid( mParser.getBoolean(SETTINGS_TRACK_DIRECT_CALLING_UID_KEY, BinderCallsStats.DEFAULT_TRACK_DIRECT_CALLING_UID)); + mBinderCallsStats.setCollectLatencyData( + mParser.getBoolean(SETTINGS_COLLECT_LATENCY_DATA_KEY, + BinderCallsStats.DEFAULT_COLLECT_LATENCY_DATA)); + // Binder latency observer settings. + mBinderCallsStats.getLatencyObserver().setSamplingInterval(mParser.getInt( + SETTINGS_LATENCY_OBSERVER_SAMPLING_INTERVAL_KEY, + BinderLatencyObserver.PERIODIC_SAMPLING_INTERVAL_DEFAULT)); final boolean enabled = @@ -198,6 +211,7 @@ public class BinderCallsStatsService extends Binder { mEnabled = enabled; mBinderCallsStats.reset(); mBinderCallsStats.setAddDebugEntries(enabled); + mBinderCallsStats.getLatencyObserver().reset(); } } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index a81860d43cc9..b31adac222df 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4769,6 +4769,7 @@ public class ConnectivityService extends IConnectivityManager.Stub (Pair<ProfileNetworkPreferences.Preference, IOnCompleteListener>) msg.obj; handleSetProfileNetworkPreference(arg.first, arg.second); + break; } case EVENT_REPORT_NETWORK_ACTIVITY: mNetworkActivityTracker.handleReportNetworkActivity(); diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java index 794cb9301d69..d574e74d398f 100644 --- a/services/core/java/com/android/server/IpSecService.java +++ b/services/core/java/com/android/server/IpSecService.java @@ -49,6 +49,7 @@ import android.net.util.NetdService; import android.os.Binder; import android.os.IBinder; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.RemoteException; import android.os.ServiceSpecificException; import android.system.ErrnoException; @@ -65,6 +66,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.net.module.util.NetdUtils; +import com.android.net.module.util.PermissionUtils; import libcore.io.IoUtils; @@ -466,8 +468,7 @@ public class IpSecService extends IIpSecService.Stub { /** Safety method; guards against access of other user's UserRecords */ private void checkCallerUid(int uid) { - if (uid != Binder.getCallingUid() - && android.os.Process.SYSTEM_UID != Binder.getCallingUid()) { + if (uid != Binder.getCallingUid() && Process.SYSTEM_UID != Binder.getCallingUid()) { throw new SecurityException("Attempted access of unowned resources"); } } @@ -1105,11 +1106,15 @@ public class IpSecService extends IIpSecService.Stub { * Checks the user-provided direction field and throws an IllegalArgumentException if it is not * DIRECTION_IN or DIRECTION_OUT */ - private static void checkDirection(int direction) { + private void checkDirection(int direction) { switch (direction) { case IpSecManager.DIRECTION_OUT: case IpSecManager.DIRECTION_IN: return; + case IpSecManager.DIRECTION_FWD: + // Only NETWORK_STACK or PERMISSION_NETWORK_STACK allowed to use forward policies + PermissionUtils.enforceNetworkStackPermission(mContext); + return; } throw new IllegalArgumentException("Invalid Direction: " + direction); } @@ -1353,6 +1358,16 @@ public class IpSecService extends IIpSecService.Stub { ikey, 0xffffffff, resourceId); + netd.ipSecAddSecurityPolicy( + callerUid, + selAddrFamily, + IpSecManager.DIRECTION_FWD, + remoteAddr, + localAddr, + 0, + ikey, + 0xffffffff, + resourceId); } userRecord.mTunnelInterfaceRecords.put( @@ -1820,7 +1835,7 @@ public class IpSecService extends IIpSecService.Stub { int mark = (direction == IpSecManager.DIRECTION_OUT) ? tunnelInterfaceInfo.getOkey() - : tunnelInterfaceInfo.getIkey(); + : tunnelInterfaceInfo.getIkey(); // Ikey also used for FWD policies try { // Default to using the invalid SPI of 0 for inbound SAs. This allows policies to skip diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index 55e1b46a51a9..4ab947d93f70 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -32,8 +32,9 @@ per-file GestureLauncherService.java = file:platform/packages/apps/EmergencyInfo per-file IpSecService.java = file:/services/core/java/com/android/server/net/OWNERS per-file MmsServiceBroker.java = file:/telephony/OWNERS per-file NetIdManager.java = file:/services/core/java/com/android/server/net/OWNERS -per-file PackageWatchdog.java = file:/services/core/java/com/android/server/rollback/OWNERS +per-file PackageWatchdog.java, RescueParty.java = file:/services/core/java/com/android/server/rollback/OWNERS per-file PinnerService.java = file:/apct-tests/perftests/OWNERS +per-file RescueParty.java = fdunlap@google.com, shuc@google.com per-file TelephonyRegistry.java = file:/telephony/OWNERS per-file UiModeManagerService.java = file:/packages/SystemUI/OWNERS per-file VcnManagementService.java = file:/services/core/java/com/android/server/vcn/OWNERS diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index d9ecddae558a..8084de856031 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -2873,6 +2873,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { // If we're enforcing fine starting in Q, we also want to enforce coarse even for // older SDK versions. locationQueryBuilder.setMinSdkVersionForCoarse(0); + locationQueryBuilder.setMinSdkVersionForCoarse(0); + locationQueryBuilder.setMinSdkVersionForEnforcement(0); shouldCheckLocationPermissions = true; } @@ -3001,6 +3003,14 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + private boolean checkFineLocationAccess(Record r) { + return checkFineLocationAccess(r, Build.VERSION_CODES.BASE); + } + + private boolean checkCoarseLocationAccess(Record r) { + return checkCoarseLocationAccess(r, Build.VERSION_CODES.BASE); + } + /** * Note -- this method should only be used at the site of a permission check if you need to * explicitly allow apps below a certain SDK level access regardless of location permissions. @@ -3016,6 +3026,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { .setMethod("TelephonyRegistry push") .setLogAsInfo(true) // we don't need to log an error every time we push .setMinSdkVersionForFine(minSdk) + .setMinSdkVersionForCoarse(minSdk) + .setMinSdkVersionForEnforcement(minSdk) .build(); return Binder.withCleanCallingIdentity(() -> { @@ -3040,6 +3052,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { .setMethod("TelephonyRegistry push") .setLogAsInfo(true) // we don't need to log an error every time we push .setMinSdkVersionForCoarse(minSdk) + .setMinSdkVersionForFine(Integer.MAX_VALUE) + .setMinSdkVersionForEnforcement(minSdk) .build(); return Binder.withCleanCallingIdentity(() -> { diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index 45eb77453dbd..1fd637ad20c4 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -87,6 +87,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -431,7 +432,9 @@ public class VcnManagementService extends IVcnManagementService.Stub { public void onNewSnapshot(@NonNull TelephonySubscriptionSnapshot snapshot) { // Startup VCN instances synchronized (mLock) { + final TelephonySubscriptionSnapshot oldSnapshot = mLastSnapshot; mLastSnapshot = snapshot; + Slog.d(TAG, "new snapshot: " + mLastSnapshot); // Start any VCN instances as necessary for (Entry<ParcelUuid, VcnConfig> entry : mConfigs.entrySet()) { @@ -478,11 +481,29 @@ public class VcnManagementService extends IVcnManagementService.Stub { entry.getValue().updateSubscriptionSnapshot(mLastSnapshot); } } + + final Map<ParcelUuid, Set<Integer>> oldSubGrpMappings = + getSubGroupToSubIdMappings(oldSnapshot); + final Map<ParcelUuid, Set<Integer>> currSubGrpMappings = + getSubGroupToSubIdMappings(mLastSnapshot); + if (!currSubGrpMappings.equals(oldSubGrpMappings)) { + notifyAllPolicyListenersLocked(); + } } } } @GuardedBy("mLock") + private Map<ParcelUuid, Set<Integer>> getSubGroupToSubIdMappings( + @NonNull TelephonySubscriptionSnapshot snapshot) { + final Map<ParcelUuid, Set<Integer>> subGrpMappings = new ArrayMap<>(); + for (ParcelUuid subGrp : mVcns.keySet()) { + subGrpMappings.put(subGrp, snapshot.getAllSubIdsInGroup(subGrp)); + } + return subGrpMappings; + } + + @GuardedBy("mLock") private void stopVcnLocked(@NonNull ParcelUuid uuidToTeardown) { final Vcn vcnToTeardown = mVcns.remove(uuidToTeardown); if (vcnToTeardown == null) { @@ -516,7 +537,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @GuardedBy("mLock") private void startVcnLocked(@NonNull ParcelUuid subscriptionGroup, @NonNull VcnConfig config) { - Slog.v(TAG, "Starting VCN config for subGrp: " + subscriptionGroup); + Slog.d(TAG, "Starting VCN config for subGrp: " + subscriptionGroup); // TODO(b/176939047): Support multiple VCNs active at the same time, or limit to one active // VCN. @@ -538,7 +559,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @GuardedBy("mLock") private void startOrUpdateVcnLocked( @NonNull ParcelUuid subscriptionGroup, @NonNull VcnConfig config) { - Slog.v(TAG, "Starting or updating VCN config for subGrp: " + subscriptionGroup); + Slog.d(TAG, "Starting or updating VCN config for subGrp: " + subscriptionGroup); if (mVcns.containsKey(subscriptionGroup)) { final Vcn vcn = mVcns.get(subscriptionGroup); @@ -564,7 +585,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { if (!config.getProvisioningPackageName().equals(opPkgName)) { throw new IllegalArgumentException("Mismatched caller and VcnConfig creator"); } - Slog.v(TAG, "VCN config updated for subGrp: " + subscriptionGroup); + Slog.d(TAG, "VCN config updated for subGrp: " + subscriptionGroup); mContext.getSystemService(AppOpsManager.class) .checkPackage(mDeps.getBinderCallingUid(), config.getProvisioningPackageName()); @@ -589,7 +610,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { public void clearVcnConfig(@NonNull ParcelUuid subscriptionGroup, @NonNull String opPkgName) { requireNonNull(subscriptionGroup, "subscriptionGroup was null"); requireNonNull(opPkgName, "opPkgName was null"); - Slog.v(TAG, "VCN config cleared for subGrp: " + subscriptionGroup); + Slog.d(TAG, "VCN config cleared for subGrp: " + subscriptionGroup); mContext.getSystemService(AppOpsManager.class) .checkPackage(mDeps.getBinderCallingUid(), opPkgName); @@ -815,6 +836,8 @@ public class VcnManagementService extends IVcnManagementService.Stub { if (isVcnManagedNetwork) { ncBuilder.removeCapability( NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); + } else { + ncBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED); } if (isRestrictedCarrierWifi) { @@ -823,8 +846,14 @@ public class VcnManagementService extends IVcnManagementService.Stub { } final NetworkCapabilities result = ncBuilder.build(); - return new VcnUnderlyingNetworkPolicy( + final VcnUnderlyingNetworkPolicy policy = new VcnUnderlyingNetworkPolicy( mTrackingNetworkCallback.requiresRestartForCarrierWifi(result), result); + + if (VDBG) { + Slog.d(TAG, "getUnderlyingNetworkPolicy() called for caps: " + networkCapabilities + + "; and lp: " + linkProperties + "; result = " + policy); + } + return policy; }); } diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index 55e269630093..924756889408 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -33,6 +33,7 @@ import com.android.internal.compat.AndroidBuildClassifier; import com.android.internal.compat.CompatibilityChangeConfig; import com.android.internal.compat.CompatibilityChangeInfo; import com.android.internal.compat.CompatibilityOverrideConfig; +import com.android.internal.compat.CompatibilityOverridesToRemoveConfig; import com.android.internal.compat.IOverrideValidator; import com.android.internal.compat.OverrideAllowedState; import com.android.server.compat.config.Change; @@ -370,6 +371,27 @@ final class CompatConfig { } } + /** + * Removes overrides whose change ID is specified in {@code overridesToRemove} that were + * previously added via {@link #addOverride(long, String, boolean)} or + * {@link #addOverrides(CompatibilityOverrideConfig, String)} for a certain package. + * + * <p>This restores the default behaviour for the given change IDs and app. + * + * @param overridesToRemove list of change IDs for which to restore the default behaviour. + * @param packageName the package for which the overrides should be purged + */ + void removePackageOverrides(CompatibilityOverridesToRemoveConfig overridesToRemove, + String packageName) { + synchronized (mChanges) { + for (Long changeId : overridesToRemove.changeIds) { + removeOverrideUnsafe(changeId, packageName); + } + saveOverrides(); + invalidateCache(); + } + } + private long[] getAllowedChangesSinceTargetSdkForPackage(String packageName, int targetSdkVersion) { LongArray allowed = new LongArray(); diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java index 20469a21db0c..2591f38b2bb3 100644 --- a/services/core/java/com/android/server/compat/PlatformCompat.java +++ b/services/core/java/com/android/server/compat/PlatformCompat.java @@ -46,6 +46,7 @@ import com.android.internal.compat.ChangeReporter; import com.android.internal.compat.CompatibilityChangeConfig; import com.android.internal.compat.CompatibilityChangeInfo; import com.android.internal.compat.CompatibilityOverrideConfig; +import com.android.internal.compat.CompatibilityOverridesToRemoveConfig; import com.android.internal.compat.IOverrideValidator; import com.android.internal.compat.IPlatformCompat; import com.android.internal.util.DumpUtils; @@ -54,6 +55,7 @@ import com.android.server.LocalServices; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.Arrays; +import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -187,7 +189,7 @@ public class PlatformCompat extends IPlatformCompat.Stub { String packageName) { // TODO(b/183630314): Unify the permission enforcement with the other setOverrides* methods. checkCompatChangeOverrideOverridablePermission(); - checkAllCompatOverridesAreOverridable(overrides); + checkAllCompatOverridesAreOverridable(overrides.overrides.keySet()); mCompatConfig.addOverrides(overrides, packageName); } @@ -251,6 +253,16 @@ public class PlatformCompat extends IPlatformCompat.Stub { } @Override + public void removeOverridesOnReleaseBuilds( + CompatibilityOverridesToRemoveConfig overridesToRemove, + String packageName) { + // TODO(b/183630314): Unify the permission enforcement with the other setOverrides* methods. + checkCompatChangeOverrideOverridablePermission(); + checkAllCompatOverridesAreOverridable(overridesToRemove.changeIds); + mCompatConfig.removePackageOverrides(overridesToRemove, packageName); + } + + @Override public CompatibilityChangeConfig getAppConfig(ApplicationInfo appInfo) { checkCompatChangeReadAndLogPermission(); return mCompatConfig.getAppConfig(appInfo); @@ -396,8 +408,8 @@ public class PlatformCompat extends IPlatformCompat.Stub { } } - private void checkAllCompatOverridesAreOverridable(CompatibilityOverrideConfig overrides) { - for (Long changeId : overrides.overrides.keySet()) { + private void checkAllCompatOverridesAreOverridable(Collection<Long> changeIds) { + for (Long changeId : changeIds) { if (!mCompatConfig.isOverridable(changeId)) { throw new SecurityException("Only change ids marked as Overridable can be " + "overridden."); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index afaae8a5b776..0677bd554341 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -806,7 +806,6 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { Arrays.stream(device.getEncodings()).mapToObj( AudioFormat::toLogFriendlyEncoding ).collect(Collectors.joining(", "))); - // TODO(b/80297701) use the actual device type that system audio mode is connected to. if (device.getType() == AudioDeviceInfo.TYPE_HDMI_ARC) { return device; } @@ -1225,7 +1224,6 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { if (isSystemAudioActivated() && port < 0) { // If system audio mode is on and the new active source is not under the current device, // Will switch to ARC input. - // TODO(b/115637145): handle system aduio without ARC routeToInputFromPortId(Constants.CEC_SWITCH_ARC); } else if (mIsSwitchDevice && port >= 0) { // If current device is a switch and the new active source is under it, @@ -1326,7 +1324,6 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { // Handle the system audio(ARC) part of the logic on receiving routing change or information. private void handleRoutingChangeAndInformationForSystemAudio() { - // TODO(b/115637145): handle system aduio without ARC routeToInputFromPortId(Constants.CEC_SWITCH_ARC); } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java index 3f949bab8a2e..ec41a2fde1ad 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageBuilder.java @@ -475,7 +475,6 @@ public class HdmiCecMessageBuilder { * @return newly created {@link HdmiCecMessage} */ static HdmiCecMessage buildReportShortAudioDescriptor(int src, int des, byte[] sadBytes) { - // TODO(b/80297701) validate. return buildCommand(src, des, Constants.MESSAGE_REPORT_SHORT_AUDIO_DESCRIPTOR, sadBytes); } diff --git a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java index 0907e5d03c78..0864a44cf5ee 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java @@ -142,8 +142,4 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction { } }); } - - private void switchToRelevantInputForDeviceAt(int physicalAddress) { - // TODO(shubang): implement this method - } } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index c01a1151ee67..29c3dd91c6a3 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -6850,7 +6850,7 @@ public class NotificationManagerService extends SystemService { .appendPath(record.getKey()).build()) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) .putExtra(EXTRA_KEY, record.getKey()), - PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); mAlarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, mSystemClock.elapsedRealtime() + record.getNotification().getTimeoutAfter(), pi); @@ -7713,6 +7713,21 @@ public class NotificationManagerService extends SystemService { int rank, int count, boolean wasPosted, String listenerName) { final String canceledKey = r.getKey(); + // Get pending intent used to create alarm, use FLAG_NO_CREATE if PendingIntent + // does not already exist, then null will be returned. + final PendingIntent pi = PendingIntent.getBroadcast(getContext(), + REQUEST_CODE_TIMEOUT, + new Intent(ACTION_NOTIFICATION_TIMEOUT) + .setData(new Uri.Builder().scheme(SCHEME_TIMEOUT) + .appendPath(r.getKey()).build()) + .addFlags(Intent.FLAG_RECEIVER_FOREGROUND), + PendingIntent.FLAG_NO_CREATE | PendingIntent.FLAG_IMMUTABLE); + + // Cancel alarm corresponding to pi. + if (pi != null) { + mAlarmManager.cancel(pi); + } + // Record caller. recordCallerLocked(r); diff --git a/services/core/java/com/android/server/notification/SnoozeHelper.java b/services/core/java/com/android/server/notification/SnoozeHelper.java index 9a9e733cb390..da472be81156 100644 --- a/services/core/java/com/android/server/notification/SnoozeHelper.java +++ b/services/core/java/com/android/server/notification/SnoozeHelper.java @@ -37,6 +37,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto; import com.android.internal.util.XmlUtils; +import com.android.server.pm.PackageManagerService; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -463,6 +464,7 @@ public class SnoozeHelper { return PendingIntent.getBroadcast(mContext, REQUEST_CODE_REPOST, new Intent(REPOST_ACTION) + .setPackage(PackageManagerService.PLATFORM_PACKAGE_NAME) .setData(new Uri.Builder().scheme(REPOST_SCHEME).appendPath(key).build()) .addFlags(Intent.FLAG_RECEIVER_FOREGROUND) .putExtra(EXTRA_KEY, key) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 48fee0b392a0..0d06426a7ab5 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -9962,6 +9962,8 @@ public class PackageManagerService extends IPackageManager.Stub public boolean performDexOptMode(String packageName, boolean checkProfiles, String targetCompilerFilter, boolean force, boolean bootComplete, String splitName) { + enforceSystemOrRootOrShell("performDexOptMode"); + int flags = (checkProfiles ? DexoptOptions.DEXOPT_CHECK_FOR_PROFILES_UPDATES : 0) | (force ? DexoptOptions.DEXOPT_FORCE : 0) | (bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0); @@ -12528,6 +12530,7 @@ public class PackageManagerService extends IPackageManager.Stub if (hasOldPkg) { mPermissionManager.revokeRuntimePermissionsIfGroupChanged(pkg, oldPkg, allPackageNames); + mPermissionManager.revokeStoragePermissionsIfScopeExpanded(pkg, oldPkg); } if (hasPermissionDefinitionChanges) { mPermissionManager.revokeRuntimePermissionsIfPermissionDefinitionChanged( 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 3ffca028b1c0..b500e1631fb5 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -206,6 +206,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { private static final int USER_PERMISSION_FLAGS = FLAG_PERMISSION_USER_SET | FLAG_PERMISSION_USER_FIXED; + /** All storage permissions */ + private static final List<String> STORAGE_PERMISSIONS = new ArrayList<>(); + /** If the permission of the value is granted, so is the key */ private static final Map<String, String> FULLER_PERMISSION_MAP = new HashMap<>(); @@ -214,6 +217,9 @@ public class PermissionManagerService extends IPermissionManager.Stub { Manifest.permission.ACCESS_FINE_LOCATION); FULLER_PERMISSION_MAP.put(Manifest.permission.INTERACT_ACROSS_USERS, Manifest.permission.INTERACT_ACROSS_USERS_FULL); + STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE); + STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION); } /** Lock to protect internal data access */ @@ -2266,6 +2272,49 @@ public class PermissionManagerService extends IPermissionManager.Stub { } /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + private void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage, + @NonNull PermissionCallback permissionCallback) { + boolean downgradedSdk = oldPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q + && newPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q; + boolean upgradedSdk = oldPackage.getTargetSdkVersion() < Build.VERSION_CODES.Q + && newPackage.getTargetSdkVersion() >= Build.VERSION_CODES.Q; + boolean newlyRequestsLegacy = !upgradedSdk && !oldPackage.isRequestLegacyExternalStorage() + && newPackage.isRequestLegacyExternalStorage(); + + if (!newlyRequestsLegacy && !downgradedSdk) { + return; + } + + final int callingUid = Binder.getCallingUid(); + final int userId = UserHandle.getUserId(newPackage.getUid()); + int numRequestedPermissions = newPackage.getRequestedPermissions().size(); + for (int i = 0; i < numRequestedPermissions; i++) { + PermissionInfo permInfo = getPermissionInfo(newPackage.getRequestedPermissions().get(i), + newPackage.getPackageName(), 0); + if (permInfo == null || !STORAGE_PERMISSIONS.contains(permInfo.name)) { + continue; + } + + EventLog.writeEvent(0x534e4554, "171430330", newPackage.getUid(), + "Revoking permission " + permInfo.name + " from package " + + newPackage.getPackageName() + " as either the sdk downgraded " + + downgradedSdk + " or newly requested legacy full storage " + + newlyRequestsLegacy); + + revokeRuntimePermissionInternal(permInfo.name, newPackage.getPackageName(), + false, callingUid, userId, null, permissionCallback); + } + + } + + /** * We might auto-grant permissions if any permission of the group is already granted. Hence if * the group of a granted permission changes we need to revoke it to avoid having permissions of * the new group auto-granted. @@ -4734,6 +4783,19 @@ public class PermissionManagerService extends IPermissionManager.Stub { @UserIdInt int userId) { return PermissionManagerService.this.isPermissionsReviewRequired(pkg, userId); } + /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + public void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage + ) { + PermissionManagerService.this.revokeStoragePermissionsIfScopeExpanded(newPackage, + oldPackage, mDefaultPermissionCallback); + } @Override public void revokeRuntimePermissionsIfGroupChanged( diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index 393e8527a991..a8e842f7ae92 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -266,6 +266,17 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager @NonNull ArrayList<String> allPackageNames); /** + * If the app is updated, and has scoped storage permissions, then it is possible that the + * app updated in an attempt to get unscoped storage. If so, revoke all storage permissions. + * @param newPackage The new package that was installed + * @param oldPackage The old package that was updated + */ + public abstract void revokeStoragePermissionsIfScopeExpanded( + @NonNull AndroidPackage newPackage, + @NonNull AndroidPackage oldPackage + ); + + /** * Add all permissions in the given package. * <p> * NOTE: argument {@code groupTEMP} is temporary until mPermissionGroups is moved to diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java index 24337f3ad346..ed4a7bf107d1 100644 --- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java +++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java @@ -24,10 +24,14 @@ import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_SLOT_MISMA import static android.os.RecoverySystem.RESUME_ON_REBOOT_REBOOT_ERROR_UNSPECIFIED; import static android.os.RecoverySystem.ResumeOnRebootRebootErrorCode; import static android.os.UserHandle.USER_SYSTEM; +import static android.ota.nano.OtaPackageMetadata.ApexMetadata; import static com.android.internal.widget.LockSettingsInternal.ARM_REBOOT_ERROR_NONE; +import static com.android.internal.widget.LockSettingsInternal.ARM_REBOOT_ERROR_NO_PROVIDER; import android.annotation.IntDef; +import android.apex.CompressedApexInfo; +import android.apex.CompressedApexInfoList; import android.content.Context; import android.content.IntentSender; import android.content.SharedPreferences; @@ -47,9 +51,11 @@ import android.os.ResultReceiver; import android.os.ShellCallback; import android.os.SystemProperties; import android.provider.DeviceConfig; +import android.sysprop.ApexProperties; import android.util.ArrayMap; import android.util.ArraySet; import android.util.FastImmutableArraySet; +import android.util.Log; import android.util.Slog; import com.android.internal.annotations.GuardedBy; @@ -59,6 +65,7 @@ import com.android.internal.widget.LockSettingsInternal; import com.android.internal.widget.RebootEscrowListener; import com.android.server.LocalServices; import com.android.server.SystemService; +import com.android.server.pm.ApexManager; import libcore.io.IoUtils; @@ -68,9 +75,13 @@ import java.io.File; import java.io.FileDescriptor; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; /** * The recovery system service is responsible for coordinating recovery related @@ -388,7 +399,13 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo @VisibleForTesting void onSystemServicesReady() { - mInjector.getLockSettingsService().setRebootEscrowListener(this); + LockSettingsInternal lockSettings = mInjector.getLockSettingsService(); + if (lockSettings == null) { + Slog.e(TAG, "Failed to get lock settings service, skipping set" + + " RebootEscrowListener"); + return; + } + lockSettings.setRebootEscrowListener(this); } @Override // Binder call @@ -554,12 +571,18 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo case ROR_NEED_PREPARATION: final long origId = Binder.clearCallingIdentity(); try { - boolean result = mInjector.getLockSettingsService().prepareRebootEscrow(); + LockSettingsInternal lockSettings = mInjector.getLockSettingsService(); + if (lockSettings == null) { + Slog.e(TAG, "Failed to get lock settings service, skipping" + + " prepareRebootEscrow"); + return false; + } // Clear the RoR preparation state if lock settings reports an failure. - if (!result) { + if (!lockSettings.prepareRebootEscrow()) { clearRoRPreparationState(); + return false; } - return result; + return true; } finally { Binder.restoreCallingIdentity(origId); } @@ -674,7 +697,14 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo case ROR_REQUESTED_NEED_CLEAR: final long origId = Binder.clearCallingIdentity(); try { - return mInjector.getLockSettingsService().clearRebootEscrow(); + LockSettingsInternal lockSettings = mInjector.getLockSettingsService(); + if (lockSettings == null) { + Slog.e(TAG, "Failed to get lock settings service, skipping" + + " clearRebootEscrow"); + return false; + } + + return lockSettings.clearRebootEscrow(); } finally { Binder.restoreCallingIdentity(origId); } @@ -768,7 +798,15 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo final long origId = Binder.clearCallingIdentity(); int providerErrorCode; try { - providerErrorCode = mInjector.getLockSettingsService().armRebootEscrow(); + LockSettingsInternal lockSettings = mInjector.getLockSettingsService(); + if (lockSettings == null) { + Slog.e(TAG, "Failed to get lock settings service, skipping" + + " armRebootEscrow"); + return new RebootPreparationError( + RESUME_ON_REBOOT_REBOOT_ERROR_PROVIDER_PREPARATION_FAILURE, + ARM_REBOOT_ERROR_NO_PROVIDER); + } + providerErrorCode = lockSettings.armRebootEscrow(); } finally { Binder.restoreCallingIdentity(origId); } @@ -871,6 +909,76 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo return rebootWithLskfImpl(packageName, reason, slotSwitch); } + public static boolean isUpdatableApexSupported() { + return ApexProperties.updatable().orElse(false); + } + + // Metadata should be no more than few MB, if it's larger than 100MB something is wrong. + private static final long APEX_INFO_SIZE_LIMIT = 24 * 1024 * 100; + + private static CompressedApexInfoList getCompressedApexInfoList(String packageFile) + throws IOException { + try (ZipFile zipFile = new ZipFile(packageFile)) { + final ZipEntry entry = zipFile.getEntry("apex_info.pb"); + if (entry == null) { + return null; + } + if (entry.getSize() >= APEX_INFO_SIZE_LIMIT) { + throw new IllegalArgumentException("apex_info.pb has size " + + entry.getSize() + + " which is larger than the permitted limit" + APEX_INFO_SIZE_LIMIT); + } + if (entry.getSize() == 0) { + CompressedApexInfoList infoList = new CompressedApexInfoList(); + infoList.apexInfos = new CompressedApexInfo[0]; + return infoList; + } + Log.i(TAG, "Allocating " + entry.getSize() + + " bytes of memory to store OTA Metadata"); + byte[] data = new byte[(int) entry.getSize()]; + + try (InputStream is = zipFile.getInputStream(entry)) { + int bytesRead = is.read(data); + String msg = "Read " + bytesRead + " when expecting " + data.length; + Log.e(TAG, msg); + if (bytesRead != data.length) { + throw new IOException(msg); + } + } + ApexMetadata metadata = ApexMetadata.parseFrom(data); + CompressedApexInfoList apexInfoList = new CompressedApexInfoList(); + apexInfoList.apexInfos = + Arrays.stream(metadata.apexInfo).filter(apex -> apex.isCompressed).map(apex -> { + CompressedApexInfo info = new CompressedApexInfo(); + info.moduleName = apex.packageName; + info.decompressedSize = apex.decompressedSize; + info.versionCode = apex.version; + return info; + }).toArray(CompressedApexInfo[]::new); + return apexInfoList; + } + } + + @Override + public boolean allocateSpaceForUpdate(String packageFile) { + if (!isUpdatableApexSupported()) { + Log.i(TAG, "Updatable Apex not supported, " + + "allocateSpaceForUpdate does nothing."); + return true; + } + try { + CompressedApexInfoList apexInfoList = getCompressedApexInfoList(packageFile); + ApexManager apexManager = ApexManager.getInstance(); + apexManager.reserveSpaceForCompressedApex(apexInfoList); + return true; + } catch (RemoteException e) { + e.rethrowAsRuntimeException(); + } catch (IOException | UnsupportedOperationException e) { + Slog.e(TAG, "Failed to reserve space for compressed apex: ", e); + } + return false; + } + @Override // Binder call public boolean isLskfCaptured(String packageName) { enforcePermissionForResumeOnReboot(); diff --git a/services/core/java/com/android/server/vcn/Vcn.java b/services/core/java/com/android/server/vcn/Vcn.java index e1747f71d5a9..f918827e9639 100644 --- a/services/core/java/com/android/server/vcn/Vcn.java +++ b/services/core/java/com/android/server/vcn/Vcn.java @@ -50,6 +50,7 @@ import com.android.internal.annotations.VisibleForTesting.Visibility; import com.android.internal.util.IndentingPrintWriter; import com.android.server.VcnManagementService.VcnCallback; import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot; +import com.android.server.vcn.util.LogUtils; import java.util.Arrays; import java.util.Collections; @@ -305,13 +306,13 @@ public class Vcn extends Handler { handleTeardown(); break; default: - Slog.wtf(getLogTag(), "Unknown msg.what: " + msg.what); + logWtf("Unknown msg.what: " + msg.what); } } private void handleConfigUpdated(@NonNull VcnConfig config) { // TODO: Add a dump function in VcnConfig that omits PII. Until then, use hashCode() - Slog.v(getLogTag(), "Config updated: config = " + config.hashCode()); + logDbg("Config updated: old = " + mConfig.hashCode() + "; new = " + config.hashCode()); mConfig = config; @@ -326,8 +327,7 @@ public class Vcn extends Handler { // connection details may have changed). if (!mConfig.getGatewayConnectionConfigs().contains(gatewayConnectionConfig)) { if (gatewayConnection == null) { - Slog.wtf( - getLogTag(), "Found gatewayConnectionConfig without GatewayConnection"); + logWtf("Found gatewayConnectionConfig without GatewayConnection"); } else { gatewayConnection.teardownAsynchronously(); } @@ -340,6 +340,7 @@ public class Vcn extends Handler { } private void handleTeardown() { + logDbg("Tearing down"); mVcnContext.getVcnNetworkProvider().unregisterListener(mRequestListener); for (VcnGatewayConnection gatewayConnection : mVcnGatewayConnections.values()) { @@ -350,6 +351,7 @@ public class Vcn extends Handler { } private void handleSafeModeStatusChanged() { + logDbg("VcnGatewayConnection safe mode status changed"); boolean hasSafeModeGatewayConnection = false; // If any VcnGatewayConnection is in safe mode, mark the entire VCN as being in safe mode @@ -365,21 +367,19 @@ public class Vcn extends Handler { hasSafeModeGatewayConnection ? VCN_STATUS_CODE_SAFE_MODE : VCN_STATUS_CODE_ACTIVE; if (oldStatus != mCurrentStatus) { mVcnCallback.onSafeModeStatusChanged(hasSafeModeGatewayConnection); + logDbg( + "Safe mode " + + (mCurrentStatus == VCN_STATUS_CODE_SAFE_MODE ? "entered" : "exited")); } } private void handleNetworkRequested(@NonNull NetworkRequest request) { - Slog.v(getLogTag(), "Received request " + request); + logVdbg("Received request " + request); // If preexisting VcnGatewayConnection(s) satisfy request, return for (VcnGatewayConnectionConfig gatewayConnectionConfig : mVcnGatewayConnections.keySet()) { if (isRequestSatisfiedByGatewayConnectionConfig(request, gatewayConnectionConfig)) { - if (VDBG) { - Slog.v( - getLogTag(), - "Request already satisfied by existing VcnGatewayConnection: " - + request); - } + logDbg("Request already satisfied by existing VcnGatewayConnection: " + request); return; } } @@ -389,7 +389,7 @@ public class Vcn extends Handler { for (VcnGatewayConnectionConfig gatewayConnectionConfig : mConfig.getGatewayConnectionConfigs()) { if (isRequestSatisfiedByGatewayConnectionConfig(request, gatewayConnectionConfig)) { - Slog.v(getLogTag(), "Bringing up new VcnGatewayConnection for request " + request); + logDbg("Bringing up new VcnGatewayConnection for request " + request); if (getExposedCapabilitiesForMobileDataState(gatewayConnectionConfig).isEmpty()) { // Skip; this network does not provide any services if mobile data is disabled. @@ -400,8 +400,9 @@ public class Vcn extends Handler { // pre-existing VcnGatewayConnections that satisfy a given request, but if state // that affects the satsifying of requests changes, this is theoretically possible. if (mVcnGatewayConnections.containsKey(gatewayConnectionConfig)) { - Slog.wtf(getLogTag(), "Attempted to bring up VcnGatewayConnection for config " - + "with existing VcnGatewayConnection"); + logWtf( + "Attempted to bring up VcnGatewayConnection for config " + + "with existing VcnGatewayConnection"); return; } @@ -414,8 +415,12 @@ public class Vcn extends Handler { new VcnGatewayStatusCallbackImpl(gatewayConnectionConfig), mIsMobileDataEnabled); mVcnGatewayConnections.put(gatewayConnectionConfig, vcnGatewayConnection); + + return; } } + + logVdbg("Request could not be fulfilled by VCN: " + request); } private Set<Integer> getExposedCapabilitiesForMobileDataState( @@ -432,7 +437,7 @@ public class Vcn extends Handler { } private void handleGatewayConnectionQuit(VcnGatewayConnectionConfig config) { - Slog.v(getLogTag(), "VcnGatewayConnection quit: " + config); + logDbg("VcnGatewayConnection quit: " + config); mVcnGatewayConnections.remove(config); // Trigger a re-evaluation of all NetworkRequests (to make sure any that can be satisfied @@ -467,9 +472,7 @@ public class Vcn extends Handler { if (exposedCaps.contains(NET_CAPABILITY_INTERNET) || exposedCaps.contains(NET_CAPABILITY_DUN)) { if (gatewayConnection == null) { - Slog.wtf( - getLogTag(), - "Found gatewayConnectionConfig without GatewayConnection"); + logWtf("Found gatewayConnectionConfig without" + " GatewayConnection"); } else { // TODO(b/184868850): Optimize by restarting NetworkAgents without teardown. gatewayConnection.teardownAsynchronously(); @@ -479,6 +482,8 @@ public class Vcn extends Handler { // Trigger re-evaluation of all requests; mobile data state impacts supported caps. mVcnContext.getVcnNetworkProvider().resendAllRequests(mRequestListener); + + logDbg("Mobile data " + (mIsMobileDataEnabled ? "enabled" : "disabled")); } } @@ -507,8 +512,38 @@ public class Vcn extends Handler { return request.canBeSatisfiedBy(builder.build()); } - private String getLogTag() { - return TAG + " [" + mSubscriptionGroup.hashCode() + "]"; + private String getLogPrefix() { + return "[" + LogUtils.getHashedSubscriptionGroup(mSubscriptionGroup) + "]: "; + } + + private void logVdbg(String msg) { + if (VDBG) { + Slog.v(TAG, getLogPrefix() + msg); + } + } + + private void logDbg(String msg) { + Slog.d(TAG, getLogPrefix() + msg); + } + + private void logDbg(String msg, Throwable tr) { + Slog.d(TAG, getLogPrefix() + msg, tr); + } + + private void logErr(String msg) { + Slog.e(TAG, getLogPrefix() + msg); + } + + private void logErr(String msg, Throwable tr) { + Slog.e(TAG, getLogPrefix() + msg, tr); + } + + private void logWtf(String msg) { + Slog.wtf(TAG, getLogPrefix() + msg); + } + + private void logWtf(String msg, Throwable tr) { + Slog.wtf(TAG, getLogPrefix() + msg, tr); } /** @@ -521,6 +556,7 @@ public class Vcn extends Handler { pw.increaseIndent(); pw.println("mCurrentStatus: " + mCurrentStatus); + pw.println("mIsMobileDataEnabled: " + mIsMobileDataEnabled); pw.println("mVcnGatewayConnections:"); for (VcnGatewayConnection gw : mVcnGatewayConnections.values()) { diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java index 65b947c1fcdd..5cecff6f93c1 100644 --- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java +++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java @@ -88,6 +88,7 @@ import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscription import com.android.server.vcn.UnderlyingNetworkTracker.UnderlyingNetworkRecord; import com.android.server.vcn.UnderlyingNetworkTracker.UnderlyingNetworkTrackerCallback; import com.android.server.vcn.Vcn.VcnGatewayStatusCallback; +import com.android.server.vcn.util.LogUtils; import com.android.server.vcn.util.MtuUtils; import java.io.IOException; @@ -701,6 +702,7 @@ public class VcnGatewayConnection extends StateMachine { * <p>Once torn down, this VcnTunnel CANNOT be started again. */ public void teardownAsynchronously() { + logDbg("Triggering async teardown"); sendDisconnectRequestedAndAcquireWakelock( DISCONNECT_REASON_TEARDOWN, true /* shouldQuit */); @@ -710,6 +712,8 @@ public class VcnGatewayConnection extends StateMachine { @Override protected void onQuitting() { + logDbg("Quitting VcnGatewayConnection"); + // No need to call setInterfaceDown(); the IpSecInterface is being fully torn down. if (mTunnelIface != null) { mTunnelIface.close(); @@ -750,6 +754,10 @@ public class VcnGatewayConnection extends StateMachine { // TODO(b/180132994): explore safely removing this Thread check mVcnContext.ensureRunningOnLooperThread(); + logDbg( + "Selected underlying network changed: " + + (underlying == null ? null : underlying.network)); + // TODO(b/179091925): Move the delayed-message handling to BaseState // If underlying is null, all underlying networks have been lost. Disconnect VCN after a @@ -774,6 +782,8 @@ public class VcnGatewayConnection extends StateMachine { if (!mIsQuitting) { mWakeLock.acquire(); + + logVdbg("Wakelock acquired: " + mWakeLock); } } @@ -781,6 +791,8 @@ public class VcnGatewayConnection extends StateMachine { mVcnContext.ensureRunningOnLooperThread(); mWakeLock.release(); + + logVdbg("Wakelock released: " + mWakeLock); } /** @@ -798,8 +810,7 @@ public class VcnGatewayConnection extends StateMachine { @Override public void sendMessage(int what) { - Slog.wtf( - TAG, + logWtf( "sendMessage should not be used in VcnGatewayConnection. See" + " sendMessageAndAcquireWakeLock()"); super.sendMessage(what); @@ -807,8 +818,7 @@ public class VcnGatewayConnection extends StateMachine { @Override public void sendMessage(int what, Object obj) { - Slog.wtf( - TAG, + logWtf( "sendMessage should not be used in VcnGatewayConnection. See" + " sendMessageAndAcquireWakeLock()"); super.sendMessage(what, obj); @@ -816,8 +826,7 @@ public class VcnGatewayConnection extends StateMachine { @Override public void sendMessage(int what, int arg1) { - Slog.wtf( - TAG, + logWtf( "sendMessage should not be used in VcnGatewayConnection. See" + " sendMessageAndAcquireWakeLock()"); super.sendMessage(what, arg1); @@ -825,8 +834,7 @@ public class VcnGatewayConnection extends StateMachine { @Override public void sendMessage(int what, int arg1, int arg2) { - Slog.wtf( - TAG, + logWtf( "sendMessage should not be used in VcnGatewayConnection. See" + " sendMessageAndAcquireWakeLock()"); super.sendMessage(what, arg1, arg2); @@ -834,8 +842,7 @@ public class VcnGatewayConnection extends StateMachine { @Override public void sendMessage(int what, int arg1, int arg2, Object obj) { - Slog.wtf( - TAG, + logWtf( "sendMessage should not be used in VcnGatewayConnection. See" + " sendMessageAndAcquireWakeLock()"); super.sendMessage(what, arg1, arg2, obj); @@ -843,8 +850,7 @@ public class VcnGatewayConnection extends StateMachine { @Override public void sendMessage(Message msg) { - Slog.wtf( - TAG, + logWtf( "sendMessage should not be used in VcnGatewayConnection. See" + " sendMessageAndAcquireWakeLock()"); super.sendMessage(msg); @@ -935,10 +941,14 @@ public class VcnGatewayConnection extends StateMachine { } private void setTeardownTimeoutAlarm() { + logVdbg("Setting teardown timeout alarm; mCurrentToken: " + mCurrentToken); + // Safe to assign this alarm because it is either 1) already null, or 2) already fired. In // either case, there is nothing to cancel. if (mTeardownTimeoutAlarm != null) { - Slog.wtf(TAG, "mTeardownTimeoutAlarm should be null before being set"); + logWtf( + "mTeardownTimeoutAlarm should be null before being set; mCurrentToken: " + + mCurrentToken); } final Message delayedMessage = obtainMessage(EVENT_TEARDOWN_TIMEOUT_EXPIRED, mCurrentToken); @@ -950,6 +960,8 @@ public class VcnGatewayConnection extends StateMachine { } private void cancelTeardownTimeoutAlarm() { + logVdbg("Cancelling teardown timeout alarm; mCurrentToken: " + mCurrentToken); + if (mTeardownTimeoutAlarm != null) { mTeardownTimeoutAlarm.cancel(); mTeardownTimeoutAlarm = null; @@ -960,6 +972,11 @@ public class VcnGatewayConnection extends StateMachine { } private void setDisconnectRequestAlarm() { + logVdbg( + "Setting alarm to disconnect due to underlying network loss;" + + " mCurrentToken: " + + mCurrentToken); + // Only schedule a NEW alarm if none is already set. if (mDisconnectRequestAlarm != null) { return; @@ -980,6 +997,11 @@ public class VcnGatewayConnection extends StateMachine { } private void cancelDisconnectRequestAlarm() { + logVdbg( + "Cancelling alarm to disconnect due to underlying network loss;" + + " mCurrentToken: " + + mCurrentToken); + if (mDisconnectRequestAlarm != null) { mDisconnectRequestAlarm.cancel(); mDisconnectRequestAlarm = null; @@ -993,10 +1015,14 @@ public class VcnGatewayConnection extends StateMachine { } private void setRetryTimeoutAlarm(long delay) { + logVdbg("Setting retry alarm; mCurrentToken: " + mCurrentToken); + // Safe to assign this alarm because it is either 1) already null, or 2) already fired. In // either case, there is nothing to cancel. if (mRetryTimeoutAlarm != null) { - Slog.wtf(TAG, "mRetryTimeoutAlarm should be null before being set"); + logWtf( + "mRetryTimeoutAlarm should be null before being set; mCurrentToken: " + + mCurrentToken); } final Message delayedMessage = obtainMessage(EVENT_RETRY_TIMEOUT_EXPIRED, mCurrentToken); @@ -1004,6 +1030,8 @@ public class VcnGatewayConnection extends StateMachine { } private void cancelRetryTimeoutAlarm() { + logVdbg("Cancel retry alarm; mCurrentToken: " + mCurrentToken); + if (mRetryTimeoutAlarm != null) { mRetryTimeoutAlarm.cancel(); mRetryTimeoutAlarm = null; @@ -1014,6 +1042,8 @@ public class VcnGatewayConnection extends StateMachine { @VisibleForTesting(visibility = Visibility.PRIVATE) void setSafeModeAlarm() { + logVdbg("Setting safe mode alarm; mCurrentToken: " + mCurrentToken); + // Only schedule a NEW alarm if none is already set. if (mSafeModeTimeoutAlarm != null) { return; @@ -1028,6 +1058,8 @@ public class VcnGatewayConnection extends StateMachine { } private void cancelSafeModeAlarm() { + logVdbg("Cancel safe mode alarm; mCurrentToken: " + mCurrentToken); + if (mSafeModeTimeoutAlarm != null) { mSafeModeTimeoutAlarm.cancel(); mSafeModeTimeoutAlarm = null; @@ -1092,6 +1124,14 @@ public class VcnGatewayConnection extends StateMachine { + exception.getMessage(); } + logDbg( + "Encountered error; code=" + + errorCode + + ", exceptionClass=" + + exceptionClass + + ", exceptionMessage=" + + exceptionMessage); + mGatewayStatusCallback.onGatewayConnectionError( mConnectionConfig.getGatewayConnectionName(), errorCode, @@ -1137,7 +1177,7 @@ public class VcnGatewayConnection extends StateMachine { try { enterState(); } catch (Exception e) { - Slog.wtf(TAG, "Uncaught exception", e); + logWtf("Uncaught exception", e); sendDisconnectRequestedAndAcquireWakelock( DISCONNECT_REASON_INTERNAL_ERROR + e.toString(), true /* shouldQuit */); } @@ -1169,14 +1209,14 @@ public class VcnGatewayConnection extends StateMachine { public final boolean processMessage(Message msg) { final int token = msg.arg1; if (!isValidToken(token)) { - Slog.v(TAG, "Message called with obsolete token: " + token + "; what: " + msg.what); + logDbg("Message called with obsolete token: " + token + "; what: " + msg.what); return HANDLED; } try { processStateMsg(msg); } catch (Exception e) { - Slog.wtf(TAG, "Uncaught exception", e); + logWtf("Uncaught exception", e); sendDisconnectRequestedAndAcquireWakelock( DISCONNECT_REASON_INTERNAL_ERROR + e.toString(), true /* shouldQuit */); } @@ -1194,7 +1234,7 @@ public class VcnGatewayConnection extends StateMachine { try { exitState(); } catch (Exception e) { - Slog.wtf(TAG, "Uncaught exception", e); + logWtf("Uncaught exception", e); sendDisconnectRequestedAndAcquireWakelock( DISCONNECT_REASON_INTERNAL_ERROR + e.toString(), true /* shouldQuit */); } @@ -1234,7 +1274,7 @@ public class VcnGatewayConnection extends StateMachine { protected void handleDisconnectRequested(EventDisconnectRequestedInfo info) { // TODO(b/180526152): notify VcnStatusCallback for Network loss - Slog.v(TAG, "Tearing down. Cause: " + info.reason); + logDbg("Tearing down. Cause: " + info.reason); mIsQuitting = info.shouldQuit; teardownNetwork(); @@ -1250,6 +1290,7 @@ public class VcnGatewayConnection extends StateMachine { protected void handleSafeModeTimeoutExceeded() { mSafeModeTimeoutAlarm = null; + logDbg("Entering safe mode after timeout exceeded"); // Connectivity for this GatewayConnection is broken; tear down the Network. teardownNetwork(); @@ -1258,13 +1299,15 @@ public class VcnGatewayConnection extends StateMachine { } protected void logUnexpectedEvent(int what) { - Slog.d(TAG, String.format( - "Unexpected event code %d in state %s", what, this.getClass().getSimpleName())); + logDbg( + "Unexpected event code " + + what + + " in state " + + this.getClass().getSimpleName()); } protected void logWtfUnknownEvent(int what) { - Slog.wtf(TAG, String.format( - "Unknown event code %d in state %s", what, this.getClass().getSimpleName())); + logWtf("Unknown event code " + what + " in state " + this.getClass().getSimpleName()); } } @@ -1281,7 +1324,7 @@ public class VcnGatewayConnection extends StateMachine { } if (mIkeSession != null || mNetworkAgent != null) { - Slog.wtf(TAG, "Active IKE Session or NetworkAgent in DisconnectedState"); + logWtf("Active IKE Session or NetworkAgent in DisconnectedState"); } cancelSafeModeAlarm(); @@ -1349,7 +1392,7 @@ public class VcnGatewayConnection extends StateMachine { @Override protected void enterState() throws Exception { if (mIkeSession == null) { - Slog.wtf(TAG, "IKE session was already closed when entering Disconnecting state."); + logWtf("IKE session was already closed when entering Disconnecting state."); sendMessageAndAcquireWakeLock(EVENT_SESSION_CLOSED, mCurrentToken); return; } @@ -1436,7 +1479,7 @@ public class VcnGatewayConnection extends StateMachine { @Override protected void enterState() { if (mIkeSession != null) { - Slog.wtf(TAG, "ConnectingState entered with active session"); + logWtf("ConnectingState entered with active session"); // Attempt to recover. mIkeSession.kill(); @@ -1455,7 +1498,7 @@ public class VcnGatewayConnection extends StateMachine { if (oldUnderlying == null) { // This should never happen, but if it does, there's likely a nasty bug. - Slog.wtf(TAG, "Old underlying network was null in connected state. Bug?"); + logWtf("Old underlying network was null in connected state. Bug?"); } // If new underlying is null, all underlying networks have been lost; disconnect @@ -1550,11 +1593,11 @@ public class VcnGatewayConnection extends StateMachine { // new NetworkAgent replaces an old one before the unwanted() call // is processed. if (mNetworkAgent != agentRef) { - Slog.d(TAG, "unwanted() called on stale NetworkAgent"); + logDbg("unwanted() called on stale NetworkAgent"); return; } - Slog.d(TAG, "NetworkAgent was unwanted"); + logDbg("NetworkAgent was unwanted"); teardownAsynchronously(); } /* networkUnwantedCallback */, (status) -> { @@ -1568,8 +1611,7 @@ public class VcnGatewayConnection extends StateMachine { setSafeModeAlarm(); break; default: - Slog.wtf( - TAG, + logWtf( "Unknown validation status " + status + "; ignoring"); @@ -1602,13 +1644,26 @@ public class VcnGatewayConnection extends StateMachine { @NonNull Network underlyingNetwork, @NonNull IpSecTransform transform, int direction) { + if (direction != IpSecManager.DIRECTION_IN && direction != IpSecManager.DIRECTION_OUT) { + Slog.wtf(TAG, "Applying transform for unexpected direction: " + direction); + } + try { tunnelIface.setUnderlyingNetwork(underlyingNetwork); // Transforms do not need to be persisted; the IkeSession will keep them alive mIpSecManager.applyTunnelModeTransform(tunnelIface, direction, transform); + + // For inbound transforms, additionally allow forwarded traffic to bridge to DUN (as + // needed) + final Set<Integer> exposedCaps = mConnectionConfig.getAllExposedCapabilities(); + if (direction == IpSecManager.DIRECTION_IN + && exposedCaps.contains(NET_CAPABILITY_DUN)) { + mIpSecManager.applyTunnelModeTransform( + tunnelIface, IpSecManager.DIRECTION_FWD, transform); + } } catch (IOException e) { - Slog.d(TAG, "Transform application failed for network " + token, e); + logDbg("Transform application failed for network " + token, e); sessionLost(token, e); } } @@ -1642,7 +1697,7 @@ public class VcnGatewayConnection extends StateMachine { tunnelIface.removeAddress(address.getAddress(), address.getPrefixLength()); } } catch (IOException e) { - Slog.d(TAG, "Adding address to tunnel failed for token " + token, e); + logDbg("Adding address to tunnel failed for token " + token, e); sessionLost(token, e); } } @@ -1722,6 +1777,8 @@ public class VcnGatewayConnection extends StateMachine { } private void handleMigrationCompleted(EventMigrationCompletedInfo migrationCompletedInfo) { + logDbg("Migration completed: " + mUnderlying.network); + applyTransform( mCurrentToken, mTunnelIface, @@ -1744,6 +1801,8 @@ public class VcnGatewayConnection extends StateMachine { mUnderlying = ((EventUnderlyingNetworkChangedInfo) msg.obj).newUnderlying; if (mUnderlying == null) { + logDbg("Underlying network lost"); + // Ignored for now; a new network may be coming up. If none does, the delayed // NETWORK_LOST disconnect will be fired, and tear down the session + network. return; @@ -1752,7 +1811,7 @@ public class VcnGatewayConnection extends StateMachine { // mUnderlying assumed non-null, given check above. // If network changed, migrate. Otherwise, update any existing networkAgent. if (oldUnderlying == null || !oldUnderlying.network.equals(mUnderlying.network)) { - Slog.v(TAG, "Migrating to new network: " + mUnderlying.network); + logDbg("Migrating to new network: " + mUnderlying.network); mIkeSession.setNetwork(mUnderlying.network); } else { // oldUnderlying is non-null & underlying network itself has not changed @@ -1803,7 +1862,7 @@ public class VcnGatewayConnection extends StateMachine { mFailedAttempts++; if (mUnderlying == null) { - Slog.wtf(TAG, "Underlying network was null in retry state"); + logWtf("Underlying network was null in retry state"); transitionTo(mDisconnectedState); } else { // Safe to blindly set up, as it is cancelled and cleared on exiting this state @@ -1973,25 +2032,25 @@ public class VcnGatewayConnection extends StateMachine { @Override public void onOpened(@NonNull IkeSessionConfiguration ikeSessionConfig) { - Slog.v(TAG, "IkeOpened for token " + mToken); + logDbg("IkeOpened for token " + mToken); // Nothing to do here. } @Override public void onClosed() { - Slog.v(TAG, "IkeClosed for token " + mToken); + logDbg("IkeClosed for token " + mToken); sessionClosed(mToken, null); } @Override public void onClosedExceptionally(@NonNull IkeException exception) { - Slog.v(TAG, "IkeClosedExceptionally for token " + mToken, exception); + logDbg("IkeClosedExceptionally for token " + mToken, exception); sessionClosed(mToken, exception); } @Override public void onError(@NonNull IkeProtocolException exception) { - Slog.v(TAG, "IkeError for token " + mToken, exception); + logDbg("IkeError for token " + mToken, exception); // Non-fatal, log and continue. } } @@ -2008,7 +2067,7 @@ public class VcnGatewayConnection extends StateMachine { /** Internal proxy method for injecting of mocked ChildSessionConfiguration */ @VisibleForTesting(visibility = Visibility.PRIVATE) void onOpened(@NonNull VcnChildSessionConfiguration childConfig) { - Slog.v(TAG, "ChildOpened for token " + mToken); + logDbg("ChildOpened for token " + mToken); childOpened(mToken, childConfig); } @@ -2019,19 +2078,19 @@ public class VcnGatewayConnection extends StateMachine { @Override public void onClosed() { - Slog.v(TAG, "ChildClosed for token " + mToken); + logDbg("ChildClosed for token " + mToken); sessionLost(mToken, null); } @Override public void onClosedExceptionally(@NonNull IkeException exception) { - Slog.v(TAG, "ChildClosedExceptionally for token " + mToken, exception); + logDbg("ChildClosedExceptionally for token " + mToken, exception); sessionLost(mToken, exception); } @Override public void onIpSecTransformCreated(@NonNull IpSecTransform transform, int direction) { - Slog.v(TAG, "ChildTransformCreated; Direction: " + direction + "; token " + mToken); + logDbg("ChildTransformCreated; Direction: " + direction + "; token " + mToken); childTransformCreated(mToken, transform, direction); } @@ -2039,7 +2098,7 @@ public class VcnGatewayConnection extends StateMachine { public void onIpSecTransformsMigrated( @NonNull IpSecTransform inIpSecTransform, @NonNull IpSecTransform outIpSecTransform) { - Slog.v(TAG, "ChildTransformsMigrated; token " + mToken); + logDbg("ChildTransformsMigrated; token " + mToken); migrationCompleted(mToken, inIpSecTransform, outIpSecTransform); } @@ -2047,10 +2106,48 @@ public class VcnGatewayConnection extends StateMachine { public void onIpSecTransformDeleted(@NonNull IpSecTransform transform, int direction) { // Nothing to be done; no references to the IpSecTransform are held, and this transform // will be closed by the IKE library. - Slog.v(TAG, "ChildTransformDeleted; Direction: " + direction + "; for token " + mToken); + logDbg("ChildTransformDeleted; Direction: " + direction + "; for token " + mToken); } } + private String getLogPrefix() { + return "[" + + LogUtils.getHashedSubscriptionGroup(mSubscriptionGroup) + + "-" + + mConnectionConfig.getGatewayConnectionName() + + "]: "; + } + + private void logVdbg(String msg) { + if (VDBG) { + Slog.v(TAG, getLogPrefix() + msg); + } + } + + private void logDbg(String msg) { + Slog.d(TAG, getLogPrefix() + msg); + } + + private void logDbg(String msg, Throwable tr) { + Slog.d(TAG, getLogPrefix() + msg, tr); + } + + private void logErr(String msg) { + Slog.e(TAG, getLogPrefix() + msg); + } + + private void logErr(String msg, Throwable tr) { + Slog.e(TAG, getLogPrefix() + msg, tr); + } + + private void logWtf(String msg) { + Slog.wtf(TAG, getLogPrefix() + msg); + } + + private void logWtf(String msg, Throwable tr) { + Slog.wtf(TAG, getLogPrefix() + msg, tr); + } + /** * Dumps the state of this VcnGatewayConnection for logging and debugging purposes. * diff --git a/services/core/java/com/android/server/vcn/util/LogUtils.java b/services/core/java/com/android/server/vcn/util/LogUtils.java new file mode 100644 index 000000000000..93728ceb27c5 --- /dev/null +++ b/services/core/java/com/android/server/vcn/util/LogUtils.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.vcn.util; + +import android.annotation.Nullable; +import android.os.ParcelUuid; + +import com.android.internal.util.HexDump; + +/** @hide */ +public class LogUtils { + /** + * Returns the hash of the subscription group in hexadecimal format. + * + * @return the hexadecimal encoded string if uuid was non-null, else {@code null} + */ + @Nullable + public static String getHashedSubscriptionGroup(@Nullable ParcelUuid uuid) { + if (uuid == null) { + return null; + } + + return HexDump.toHexString(uuid.hashCode()); + } +} diff --git a/services/core/java/com/android/server/wm/LockTaskController.java b/services/core/java/com/android/server/wm/LockTaskController.java index c4a42ab7e7be..281d2c9ed992 100644 --- a/services/core/java/com/android/server/wm/LockTaskController.java +++ b/services/core/java/com/android/server/wm/LockTaskController.java @@ -512,7 +512,7 @@ public class LockTaskController { setStatusBarState(mLockTaskModeState, userId); setKeyguardState(mLockTaskModeState, userId); if (oldLockTaskModeState == LOCK_TASK_MODE_PINNED) { - lockKeyguardIfNeeded(); + lockKeyguardIfNeeded(userId); } if (getDevicePolicyManager() != null) { getDevicePolicyManager().notifyLockTaskModeChanged(false, null, userId); @@ -824,15 +824,15 @@ public class LockTaskController { * Helper method for locking the device immediately. This may be necessary when the device * leaves the pinned mode. */ - private void lockKeyguardIfNeeded() { - if (shouldLockKeyguard()) { + private void lockKeyguardIfNeeded(int userId) { + if (shouldLockKeyguard(userId)) { mWindowManager.lockNow(null); mWindowManager.dismissKeyguard(null /* callback */, null /* message */); getLockPatternUtils().requireCredentialEntry(USER_ALL); } } - private boolean shouldLockKeyguard() { + private boolean shouldLockKeyguard(int userId) { // This functionality should be kept consistent with // com.android.settings.security.ScreenPinningSettings (see b/127605586) try { @@ -842,7 +842,7 @@ public class LockTaskController { } catch (Settings.SettingNotFoundException e) { // Log to SafetyNet for b/127605586 android.util.EventLog.writeEvent(0x534e4554, "127605586", -1, ""); - return getLockPatternUtils().isSecure(USER_CURRENT); + return getLockPatternUtils().isSecure(userId); } } diff --git a/services/tests/servicestests/src/com/android/server/compat/CompatConfigBuilder.java b/services/tests/servicestests/src/com/android/server/compat/CompatConfigBuilder.java index 7bdc87ef6bd7..6b9aa18b9f8f 100644 --- a/services/tests/servicestests/src/com/android/server/compat/CompatConfigBuilder.java +++ b/services/tests/servicestests/src/com/android/server/compat/CompatConfigBuilder.java @@ -115,7 +115,12 @@ class CompatConfigBuilder { return this; } - CompatConfigBuilder addOverridableChangeWithId(long id) { + CompatConfigBuilder addEnabledOverridableChangeWithId(long id) { + mChanges.add(new CompatChange(id, "", -1, -1, false, false, "", true)); + return this; + } + + CompatConfigBuilder addDisabledOverridableChangeWithId(long id) { mChanges.add(new CompatChange(id, "", -1, -1, true, false, "", true)); return this; } diff --git a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java index a866363f46e6..0248b9b88788 100644 --- a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java +++ b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java @@ -36,6 +36,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.compat.AndroidBuildClassifier; import com.android.internal.compat.CompatibilityOverrideConfig; +import com.android.internal.compat.CompatibilityOverridesToRemoveConfig; import org.junit.Before; import org.junit.Test; @@ -50,6 +51,10 @@ import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; import java.util.UUID; @RunWith(AndroidJUnit4.class) @@ -249,7 +254,7 @@ public class CompatConfigTest { when(packageManager.getApplicationInfo(eq("com.some.package"), anyInt())) .thenReturn(applicationInfo); - // Force the validator to prevent overriding the change by using a user build. + // Force the validator to prevent overriding non-overridable changes by using a user build. when(mBuildClassifier.isDebuggableBuild()).thenReturn(false); when(mBuildClassifier.isFinalBuild()).thenReturn(true); @@ -261,10 +266,12 @@ public class CompatConfigTest { @Test public void testInstallerCanSetOverrides() throws Exception { - final long changeId = 1234L; - final int installerUid = 23; + final long disabledChangeId1 = 1234L; + final long disabledChangeId2 = 1235L; + // We make disabledChangeId2 non-overridable to make sure it is ignored. CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) - .addOverridableChangeWithId(1234L) + .addDisabledOverridableChangeWithId(disabledChangeId1) + .addDisabledChangeWithId(disabledChangeId2) .build(); ApplicationInfo applicationInfo = ApplicationInfoBuilder.create() .withPackageName("com.some.package") @@ -274,19 +281,56 @@ public class CompatConfigTest { when(packageManager.getApplicationInfo(eq("com.some.package"), anyInt())) .thenReturn(applicationInfo); - // Force the validator to prevent overriding the change by using a user build. + // Force the validator to prevent overriding non-overridable changes by using a user build. when(mBuildClassifier.isDebuggableBuild()).thenReturn(false); when(mBuildClassifier.isFinalBuild()).thenReturn(true); CompatibilityOverrideConfig config = new CompatibilityOverrideConfig( - Collections.singletonMap(1234L, + Collections.singletonMap(disabledChangeId1, new PackageOverride.Builder() .setMaxVersionCode(99L) .setEnabled(true) .build())); compatConfig.addOverrides(config, "com.some.package"); - assertThat(compatConfig.isChangeEnabled(1234L, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId1, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId2, applicationInfo)).isFalse(); + } + + @Test + public void testPreventInstallerSetNonOverridable() throws Exception { + final long disabledChangeId1 = 1234L; + final long disabledChangeId2 = 1235L; + final long disabledChangeId3 = 1236L; + CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) + .addDisabledOverridableChangeWithId(disabledChangeId1) + .addDisabledChangeWithId(disabledChangeId2) + .addDisabledOverridableChangeWithId(disabledChangeId3) + .build(); + ApplicationInfo applicationInfo = ApplicationInfoBuilder.create() + .withPackageName("com.some.package") + .build(); + PackageManager packageManager = mock(PackageManager.class); + when(mContext.getPackageManager()).thenReturn(packageManager); + when(packageManager.getApplicationInfo(eq("com.some.package"), anyInt())) + .thenReturn(applicationInfo); + + // Force the validator to prevent overriding non-overridable changes by using a user build. + when(mBuildClassifier.isDebuggableBuild()).thenReturn(false); + when(mBuildClassifier.isFinalBuild()).thenReturn(true); + + Map<Long, PackageOverride> overrides = new HashMap<>(); + overrides.put(disabledChangeId1, new PackageOverride.Builder().setEnabled(true).build()); + overrides.put(disabledChangeId2, new PackageOverride.Builder().setEnabled(true).build()); + overrides.put(disabledChangeId3, new PackageOverride.Builder().setEnabled(true).build()); + CompatibilityOverrideConfig config = new CompatibilityOverrideConfig(overrides); + + assertThrows(SecurityException.class, + () -> compatConfig.addOverrides(config, "com.some.package") + ); + assertThat(compatConfig.isChangeEnabled(disabledChangeId1, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId2, applicationInfo)).isFalse(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId3, applicationInfo)).isFalse(); } @Test @@ -459,7 +503,7 @@ public class CompatConfigTest { assertThat(compatConfig.isChangeEnabled(1234L, applicationInfo)).isTrue(); // Reject all override attempts. - // Force the validator to prevent overriding the change by using a user build. + // Force the validator to prevent overriding non-overridable changes by using a user build. when(mBuildClassifier.isDebuggableBuild()).thenReturn(false); when(mBuildClassifier.isFinalBuild()).thenReturn(false); // Try to turn off change, but validator prevents it. @@ -481,7 +525,7 @@ public class CompatConfigTest { .thenReturn(applicationInfo); // Reject all override attempts. - // Force the validator to prevent overriding the change by using a user build. + // Force the validator to prevent overriding non-overridable changes by using a user build. when(mBuildClassifier.isDebuggableBuild()).thenReturn(false); when(mBuildClassifier.isFinalBuild()).thenReturn(true); // Try to remove a non existing override, and it doesn't fail. @@ -509,6 +553,90 @@ public class CompatConfigTest { } @Test + public void testInstallerCanRemoveOverrides() throws Exception { + final long disabledChangeId1 = 1234L; + final long disabledChangeId2 = 1235L; + final long enabledChangeId = 1236L; + // We make disabledChangeId2 non-overridable to make sure it is ignored. + CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) + .addDisabledOverridableChangeWithId(disabledChangeId1) + .addDisabledChangeWithId(disabledChangeId2) + .addEnabledOverridableChangeWithId(enabledChangeId) + .build(); + ApplicationInfo applicationInfo = ApplicationInfoBuilder.create() + .withPackageName("com.some.package") + .build(); + when(mPackageManager.getApplicationInfo(eq("com.some.package"), anyInt())) + .thenReturn(applicationInfo); + + assertThat(compatConfig.addOverride(disabledChangeId1, "com.some.package", true)).isTrue(); + assertThat(compatConfig.addOverride(disabledChangeId2, "com.some.package", true)).isTrue(); + assertThat(compatConfig.addOverride(enabledChangeId, "com.some.package", false)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId1, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId2, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(enabledChangeId, applicationInfo)).isFalse(); + + // Force the validator to prevent overriding non-overridable changes by using a user build. + when(mBuildClassifier.isDebuggableBuild()).thenReturn(false); + when(mBuildClassifier.isFinalBuild()).thenReturn(true); + + Set<Long> overridesToRemove = new HashSet<>(); + overridesToRemove.add(disabledChangeId1); + overridesToRemove.add(enabledChangeId); + CompatibilityOverridesToRemoveConfig config = new CompatibilityOverridesToRemoveConfig( + overridesToRemove); + + compatConfig.removePackageOverrides(config, "com.some.package"); + assertThat(compatConfig.isChangeEnabled(disabledChangeId1, applicationInfo)).isFalse(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId2, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(enabledChangeId, applicationInfo)).isTrue(); + } + + @Test + public void testPreventInstallerRemoveNonOverridable() throws Exception { + final long disabledChangeId1 = 1234L; + final long disabledChangeId2 = 1235L; + final long disabledChangeId3 = 1236L; + CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) + .addDisabledOverridableChangeWithId(disabledChangeId1) + .addDisabledChangeWithId(disabledChangeId2) + .addDisabledOverridableChangeWithId(disabledChangeId3) + .build(); + ApplicationInfo applicationInfo = ApplicationInfoBuilder.create() + .withPackageName("com.some.package") + .build(); + PackageManager packageManager = mock(PackageManager.class); + when(mContext.getPackageManager()).thenReturn(packageManager); + when(packageManager.getApplicationInfo(eq("com.some.package"), anyInt())) + .thenReturn(applicationInfo); + + assertThat(compatConfig.addOverride(disabledChangeId1, "com.some.package", true)).isTrue(); + assertThat(compatConfig.addOverride(disabledChangeId2, "com.some.package", true)).isTrue(); + assertThat(compatConfig.addOverride(disabledChangeId3, "com.some.package", true)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId1, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId2, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId3, applicationInfo)).isTrue(); + + // Force the validator to prevent overriding non-overridable changes by using a user build. + when(mBuildClassifier.isDebuggableBuild()).thenReturn(false); + when(mBuildClassifier.isFinalBuild()).thenReturn(true); + + Set<Long> overridesToRemove = new HashSet<>(); + overridesToRemove.add(disabledChangeId1); + overridesToRemove.add(disabledChangeId2); + overridesToRemove.add(disabledChangeId3); + CompatibilityOverridesToRemoveConfig config = new CompatibilityOverridesToRemoveConfig( + overridesToRemove); + + assertThrows(SecurityException.class, + () -> compatConfig.removePackageOverrides(config, "com.some.package") + ); + assertThat(compatConfig.isChangeEnabled(disabledChangeId1, applicationInfo)).isFalse(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId2, applicationInfo)).isTrue(); + assertThat(compatConfig.isChangeEnabled(disabledChangeId3, applicationInfo)).isTrue(); + } + + @Test public void testEnableTargetSdkChangesForPackage() throws Exception { CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext) .addEnabledChangeWithId(1L) diff --git a/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java b/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java index a2664e5f3b0a..9accd49bc392 100644 --- a/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java +++ b/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java @@ -98,7 +98,7 @@ public class PlatformCompatTest { .addEnableAfterSdkChangeWithId(Build.VERSION_CODES.Q, 5L) .addEnableAfterSdkChangeWithId(Build.VERSION_CODES.R, 6L) .addLoggingOnlyChangeWithId(7L) - .addOverridableChangeWithId(8L) + .addDisabledOverridableChangeWithId(8L) .build(); mPlatformCompat = new PlatformCompat(mContext, mCompatConfig, mBuildClassifier); assertThat(mPlatformCompat.listAllChanges()).asList().containsExactly( diff --git a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java index 3deeea2d4577..c2ead5f15ceb 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/SnoozeHelperTest.java @@ -49,6 +49,7 @@ import androidx.test.runner.AndroidJUnit4; import com.android.internal.util.FastXmlSerializer; import com.android.server.UiServiceTestCase; +import com.android.server.pm.PackageManagerService; import org.junit.Before; import org.junit.Test; @@ -257,6 +258,17 @@ public class SnoozeHelperTest extends UiServiceTestCase { } @Test + public void testSnoozeSentToAndroid() throws Exception { + NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); + mSnoozeHelper.snooze(r, 1000); + ArgumentCaptor<PendingIntent> captor = ArgumentCaptor.forClass(PendingIntent.class); + verify(mAm, times(1)).setExactAndAllowWhileIdle( + anyInt(), anyLong(), captor.capture()); + assertEquals(PackageManagerService.PLATFORM_PACKAGE_NAME, + captor.getValue().getIntent().getPackage()); + } + + @Test public void testSnooze() throws Exception { NotificationRecord r = getNotificationRecord("pkg", 1, "one", UserHandle.SYSTEM); mSnoozeHelper.snooze(r, (String) null); diff --git a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java index e345becf0499..fdc01b48398f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/LockTaskControllerTest.java @@ -450,7 +450,7 @@ public class LockTaskControllerTest { Settings.Secure.clearProviderForTest(); // AND a password is set - when(mLockPatternUtils.isSecure(anyInt())) + when(mLockPatternUtils.isSecure(TEST_USER_ID)) .thenReturn(true); // AND there is a task record diff --git a/telephony/common/android/telephony/LocationAccessPolicy.java b/telephony/common/android/telephony/LocationAccessPolicy.java index 25b062f85d3e..502bfa3749eb 100644 --- a/telephony/common/android/telephony/LocationAccessPolicy.java +++ b/telephony/common/android/telephony/LocationAccessPolicy.java @@ -86,8 +86,9 @@ public final class LocationAccessPolicy { private String mCallingFeatureId; private int mCallingUid; private int mCallingPid; - private int mMinSdkVersionForCoarse = Integer.MAX_VALUE; - private int mMinSdkVersionForFine = Integer.MAX_VALUE; + private int mMinSdkVersionForCoarse = -1; + private int mMinSdkVersionForFine = -1; + private int mMinSdkVersionForEnforcement = -1; private boolean mLogAsInfo = false; private String mMethod; @@ -125,7 +126,14 @@ public final class LocationAccessPolicy { /** * Apps that target at least this sdk version will be checked for coarse location - * permission. Defaults to INT_MAX (which means don't check) + * permission. This method MUST be called before calling {@link #build()}. Otherwise, an + * {@link IllegalArgumentException} will be thrown. + * + * Additionally, if both the argument to this method and + * {@link #setMinSdkVersionForFine} are greater than {@link Build.VERSION_CODES#BASE}, + * you must call {@link #setMinSdkVersionForEnforcement} with the min of the two to + * affirm that you do not want any location checks below a certain SDK version. + * Otherwise, {@link #build} will throw an {@link IllegalArgumentException}. */ public Builder setMinSdkVersionForCoarse( int minSdkVersionForCoarse) { @@ -135,7 +143,14 @@ public final class LocationAccessPolicy { /** * Apps that target at least this sdk version will be checked for fine location - * permission. Defaults to INT_MAX (which means don't check) + * permission. This method MUST be called before calling {@link #build()}. + * Otherwise, an {@link IllegalArgumentException} will be thrown. + * + * Additionally, if both the argument to this method and + * {@link #setMinSdkVersionForCoarse} are greater than {@link Build.VERSION_CODES#BASE}, + * you must call {@link #setMinSdkVersionForEnforcement} with the min of the two to + * affirm that you do not want any location checks below a certain SDK version. + * Otherwise, {@link #build} will throw an {@link IllegalArgumentException}. */ public Builder setMinSdkVersionForFine( int minSdkVersionForFine) { @@ -144,6 +159,17 @@ public final class LocationAccessPolicy { } /** + * If both the argument to {@link #setMinSdkVersionForFine} and + * {@link #setMinSdkVersionForCoarse} are greater than {@link Build.VERSION_CODES#BASE}, + * this method must be called with the min of the two to + * affirm that you do not want any location checks below a certain SDK version. + */ + public Builder setMinSdkVersionForEnforcement(int minSdkVersionForEnforcement) { + mMinSdkVersionForEnforcement = minSdkVersionForEnforcement; + return this; + } + + /** * Optional, for logging purposes only. */ public Builder setMethod(String method) { @@ -161,6 +187,26 @@ public final class LocationAccessPolicy { /** build LocationPermissionQuery */ public LocationPermissionQuery build() { + if (mMinSdkVersionForCoarse < 0 || mMinSdkVersionForFine < 0) { + throw new IllegalArgumentException("Must specify min sdk versions for" + + " enforcement for both coarse and fine permissions"); + } + if (mMinSdkVersionForFine > Build.VERSION_CODES.BASE + && mMinSdkVersionForCoarse > Build.VERSION_CODES.BASE) { + if (mMinSdkVersionForEnforcement != Math.min( + mMinSdkVersionForCoarse, mMinSdkVersionForFine)) { + throw new IllegalArgumentException("setMinSdkVersionForEnforcement must be" + + " called."); + } + } + + if (mMinSdkVersionForFine < mMinSdkVersionForCoarse) { + throw new IllegalArgumentException("Since fine location permission includes" + + " access to coarse location, the min sdk level for enforcement of" + + " the fine location permission must not be less than the min sdk" + + " level for enforcement of the coarse location permission."); + } + return new LocationPermissionQuery(mCallingPackage, mCallingFeatureId, mCallingUid, mCallingPid, mMinSdkVersionForCoarse, mMinSdkVersionForFine, mLogAsInfo, mMethod); diff --git a/telephony/common/com/android/internal/telephony/PackageChangeReceiver.java b/telephony/common/com/android/internal/telephony/PackageChangeReceiver.java index 0b47547d3b0c..e9b7d95b170a 100644 --- a/telephony/common/com/android/internal/telephony/PackageChangeReceiver.java +++ b/telephony/common/com/android/internal/telephony/PackageChangeReceiver.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.telephony; +package com.android.internal.telephony; import android.annotation.NonNull; import android.annotation.Nullable; diff --git a/telephony/common/com/android/internal/telephony/SmsApplication.java b/telephony/common/com/android/internal/telephony/SmsApplication.java index b8b60da019af..16614c87e7c2 100644 --- a/telephony/common/com/android/internal/telephony/SmsApplication.java +++ b/telephony/common/com/android/internal/telephony/SmsApplication.java @@ -40,7 +40,6 @@ import android.os.Process; import android.os.UserHandle; import android.provider.Telephony; import android.provider.Telephony.Sms.Intents; -import android.telephony.PackageChangeReceiver; import android.telephony.TelephonyManager; import android.util.Log; diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index dd474f02a2ed..f6ba7becc922 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -4106,6 +4106,26 @@ public class CarrierConfigManager { public static final String KEY_RCS_FEATURE_TAG_ALLOWED_STRING_ARRAY = KEY_PREFIX + "rcs_feature_tag_allowed_string_array"; + /** + * Flag indicating whether or not carrier forbids device send the RCS request when the + * device receive the network response with the SIP code 489 BAD EVENT. + * <p> + * The default value for this key is {@code false}. + * @hide + */ + public static final String KEY_RCS_REQUEST_FORBIDDEN_BY_SIP_489_BOOL = + KEY_PREFIX + "rcs_request_forbidden_by_sip_489_bool"; + + /** + * Indicates the interval that SUBSCRIBE requests from applications will be retried at when + * the carrier network has responded to a previous request with a forbidden error. + * <p> + * The default value for this key is 20 minutes. + * @hide + */ + public static final String KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG = + KEY_PREFIX + "rcs_request_retry_interval_millis_long"; + private Ims() {} private static PersistableBundle getDefaults() { @@ -4119,6 +4139,8 @@ public class CarrierConfigManager { defaults.putBoolean(KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, false); defaults.putBoolean(KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL, true); defaults.putInt(KEY_NON_RCS_CAPABILITIES_CACHE_EXPIRATION_SEC_INT, 30 * 24 * 60 * 60); + defaults.putBoolean(KEY_RCS_REQUEST_FORBIDDEN_BY_SIP_489_BOOL, false); + defaults.putLong(KEY_RCS_REQUEST_RETRY_INTERVAL_MILLIS_LONG, 20 * 60 * 1000); defaults.putStringArray(KEY_RCS_FEATURE_TAG_ALLOWED_STRING_ARRAY, new String[]{ "+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.msg\"", "+g.3gpp.icsi-ref=\"urn%3Aurn-7%3A3gpp-service.ims.icsi.oma.cpm.largemsg\"", diff --git a/telephony/java/android/telephony/ims/ImsMmTelManager.java b/telephony/java/android/telephony/ims/ImsMmTelManager.java index d1a893f61e00..740332708dbc 100644 --- a/telephony/java/android/telephony/ims/ImsMmTelManager.java +++ b/telephony/java/android/telephony/ims/ImsMmTelManager.java @@ -713,15 +713,8 @@ public class ImsMmTelManager implements RegistrationManager { * @see android.telephony.CarrierConfigManager#KEY_CARRIER_VT_AVAILABLE_BOOL * @see android.telephony.CarrierConfigManager#KEY_CARRIER_IMS_GBA_REQUIRED_BOOL * @see #isAvailable(int, int) - * - * @param imsRegTech The IMS registration technology, can be one of the following: - * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE}, - * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN} - * @param capability The IMS MmTel capability to query, can be one of the following: - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE}, - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO}, - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT}, - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS} + * @param imsRegTech The IMS registration technology. + * @param capability The IMS MmTel capability to query. * @return {@code true} if the MmTel IMS capability is capable for this subscription, false * otherwise. * @hide @@ -748,14 +741,8 @@ public class ImsMmTelManager implements RegistrationManager { * * @see #isCapable(int, int) * - * @param imsRegTech The IMS registration technology, can be one of the following: - * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE}, - * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN} - * @param capability The IMS MmTel capability to query, can be one of the following: - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VOICE}, - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_VIDEO}, - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_UT}, - * {@link MmTelFeature.MmTelCapabilities#CAPABILITY_TYPE_SMS} + * @param imsRegTech The IMS registration technology. + * @param capability The IMS MmTel capability to query. * @return {@code true} if the MmTel IMS capability is available for this subscription, false * otherwise. * @hide diff --git a/telephony/java/android/telephony/ims/RegistrationManager.java b/telephony/java/android/telephony/ims/RegistrationManager.java index c49121f4dc5d..4713b7660e3a 100644 --- a/telephony/java/android/telephony/ims/RegistrationManager.java +++ b/telephony/java/android/telephony/ims/RegistrationManager.java @@ -82,6 +82,8 @@ public interface RegistrationManager { AccessNetworkConstants.TRANSPORT_TYPE_INVALID); put(ImsRegistrationImplBase.REGISTRATION_TECH_LTE, AccessNetworkConstants.TRANSPORT_TYPE_WWAN); + put(ImsRegistrationImplBase.REGISTRATION_TECH_NR, + AccessNetworkConstants.TRANSPORT_TYPE_WWAN); put(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN, AccessNetworkConstants.TRANSPORT_TYPE_WLAN); }}; diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java index ddd6fbe38cf4..18cc37d7fbda 100644 --- a/telephony/java/android/telephony/ims/feature/RcsFeature.java +++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java @@ -398,16 +398,6 @@ public class RcsFeature extends ImsFeature { /** * Remove the given CapabilityExchangeImplBase instance. - * @param capExchangeImpl The {@link RcsCapabilityExchangeImplBase} instance to be removed. - * @hide - */ - public void removeCapabilityExchangeImpl( - @NonNull RcsCapabilityExchangeImplBase capExchangeImpl) { - // Override to implement the process of removing RcsCapabilityExchangeImplBase instance. - } - - /** - * Remove the given CapabilityExchangeImplBase instance. * @param capExchangeImpl The {@link RcsCapabilityExchangeImplBase} instance to be destroyed. */ public void destroyCapabilityExchangeImpl( @@ -450,7 +440,7 @@ public class RcsFeature extends ImsFeature { // Remove the RcsCapabilityExchangeImplBase instance when the capability exchange // instance has been removed in the framework. if (mCapabilityExchangeImpl != null) { - removeCapabilityExchangeImpl(mCapabilityExchangeImpl); + destroyCapabilityExchangeImpl(mCapabilityExchangeImpl); } mCapabilityExchangeImpl = null; } @@ -468,7 +458,7 @@ public class RcsFeature extends ImsFeature { synchronized (mLock) { // Remove the original instance if (mCapabilityExchangeImpl != null) { - removeCapabilityExchangeImpl(mCapabilityExchangeImpl); + destroyCapabilityExchangeImpl(mCapabilityExchangeImpl); } mCapabilityExchangeImpl = createCapabilityExchangeImpl(listener); } diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java index 23032f0c4d38..35324a3c7975 100644 --- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java +++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java @@ -56,7 +56,8 @@ public class ImsRegistrationImplBase { @IntDef(value = { REGISTRATION_TECH_NONE, REGISTRATION_TECH_LTE, - REGISTRATION_TECH_IWLAN + REGISTRATION_TECH_IWLAN, + REGISTRATION_TECH_NR }) @Retention(RetentionPolicy.SOURCE) public @interface ImsRegistrationTech {} @@ -65,13 +66,18 @@ public class ImsRegistrationImplBase { */ public static final int REGISTRATION_TECH_NONE = -1; /** - * IMS is registered to IMS via LTE. + * This ImsService is registered to IMS via LTE. */ public static final int REGISTRATION_TECH_LTE = 0; /** - * IMS is registered to IMS via IWLAN. + * This ImsService is registered to IMS via IWLAN. */ public static final int REGISTRATION_TECH_IWLAN = 1; + // REGISTRATION_TECH = 2 omitted purposefully. + /** + * This ImsService is registered to IMS via NR. + */ + public static final int REGISTRATION_TECH_NR = 3; // Registration states, used to notify new ImsRegistrationImplBase#Callbacks of the current // state. diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 97078c3dd76e..3c55b7c8dbd6 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -2398,6 +2398,12 @@ interface ITelephony { String getLastUcePidfXmlShell(int subId); /** + * Remove UCE requests cannot be sent to the network status. + * Note: This is designed for a SHELL command only. + */ + boolean removeUceRequestDisallowedStatus(int subId); + + /** * Set a SignalStrengthUpdateRequest to receive notification when Signal Strength breach the * specified thresholds. */ diff --git a/test-mock/Android.bp b/test-mock/Android.bp index a2447d71c3bd..b83bce654a85 100644 --- a/test-mock/Android.bp +++ b/test-mock/Android.bp @@ -38,6 +38,7 @@ java_sdk_library { ], libs: [ "framework", + "framework-annotations-lib", "app-compat-annotations", "unsupportedappusage", ], diff --git a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java index 32c95f149979..cf2c9c783ac7 100644 --- a/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java +++ b/tests/net/java/com/android/server/IpSecServiceParameterizedTest.java @@ -16,9 +16,14 @@ package com.android.server; +import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.net.INetd.IF_STATE_DOWN; import static android.net.INetd.IF_STATE_UP; +import static android.net.IpSecManager.DIRECTION_FWD; +import static android.net.IpSecManager.DIRECTION_IN; +import static android.net.IpSecManager.DIRECTION_OUT; +import static android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK; import static android.system.OsConstants.AF_INET; import static android.system.OsConstants.AF_INET6; @@ -56,6 +61,7 @@ import android.os.Binder; import android.os.ParcelFileDescriptor; import android.system.Os; import android.test.mock.MockContext; +import android.util.ArraySet; import androidx.test.filters.SmallTest; @@ -71,6 +77,7 @@ import java.net.Inet4Address; import java.net.Socket; import java.util.Arrays; import java.util.Collection; +import java.util.Set; /** Unit tests for {@link IpSecService}. */ @SmallTest @@ -119,7 +126,18 @@ public class IpSecServiceParameterizedTest { AppOpsManager mMockAppOps = mock(AppOpsManager.class); ConnectivityManager mMockConnectivityMgr = mock(ConnectivityManager.class); - MockContext mMockContext = new MockContext() { + TestContext mTestContext = new TestContext(); + + private class TestContext extends MockContext { + private Set<String> mAllowedPermissions = new ArraySet<>(Arrays.asList( + android.Manifest.permission.MANAGE_IPSEC_TUNNELS, + android.Manifest.permission.NETWORK_STACK, + PERMISSION_MAINLINE_NETWORK_STACK)); + + private void setAllowedPermissions(String... permissions) { + mAllowedPermissions = new ArraySet<>(permissions); + } + @Override public Object getSystemService(String name) { switch(name) { @@ -147,20 +165,22 @@ public class IpSecServiceParameterizedTest { @Override public void enforceCallingOrSelfPermission(String permission, String message) { - if (permission == android.Manifest.permission.MANAGE_IPSEC_TUNNELS) { + if (mAllowedPermissions.contains(permission)) { return; + } else { + throw new SecurityException("Unavailable permission requested"); } - throw new SecurityException("Unavailable permission requested"); } @Override public int checkCallingOrSelfPermission(String permission) { - if (android.Manifest.permission.NETWORK_STACK.equals(permission)) { + if (mAllowedPermissions.contains(permission)) { return PERMISSION_GRANTED; + } else { + return PERMISSION_DENIED; } - throw new UnsupportedOperationException(); } - }; + } INetd mMockNetd; PackageManager mMockPkgMgr; @@ -194,7 +214,7 @@ public class IpSecServiceParameterizedTest { mMockNetd = mock(INetd.class); mMockPkgMgr = mock(PackageManager.class); mMockIpSecSrvConfig = mock(IpSecService.IpSecServiceConfiguration.class); - mIpSecService = new IpSecService(mMockContext, mMockIpSecSrvConfig); + mIpSecService = new IpSecService(mTestContext, mMockIpSecSrvConfig); // Injecting mock netd when(mMockIpSecSrvConfig.getNetdInstance()).thenReturn(mMockNetd); @@ -664,6 +684,21 @@ public class IpSecServiceParameterizedTest { assertNotNull(createTunnelResp); assertEquals(IpSecManager.Status.OK, createTunnelResp.status); + for (int direction : new int[] {DIRECTION_IN, DIRECTION_OUT, DIRECTION_FWD}) { + for (int selAddrFamily : ADDRESS_FAMILIES) { + verify(mMockNetd).ipSecAddSecurityPolicy( + eq(mUid), + eq(selAddrFamily), + eq(direction), + anyString(), + anyString(), + eq(0), + anyInt(), // iKey/oKey + anyInt(), // mask + eq(createTunnelResp.resourceId)); + } + } + return createTunnelResp; } @@ -798,16 +833,51 @@ public class IpSecServiceParameterizedTest { } @Test - public void testApplyTunnelModeTransform() throws Exception { - verifyApplyTunnelModeTransformCommon(false); + public void testApplyTunnelModeTransformOutbound() throws Exception { + verifyApplyTunnelModeTransformCommon(false /* closeSpiBeforeApply */, DIRECTION_OUT); } @Test - public void testApplyTunnelModeTransformReleasedSpi() throws Exception { - verifyApplyTunnelModeTransformCommon(true); + public void testApplyTunnelModeTransformOutboundNonNetworkStack() throws Exception { + mTestContext.setAllowedPermissions(android.Manifest.permission.MANAGE_IPSEC_TUNNELS); + verifyApplyTunnelModeTransformCommon(false /* closeSpiBeforeApply */, DIRECTION_OUT); } - public void verifyApplyTunnelModeTransformCommon(boolean closeSpiBeforeApply) throws Exception { + @Test + public void testApplyTunnelModeTransformOutboundReleasedSpi() throws Exception { + verifyApplyTunnelModeTransformCommon(true /* closeSpiBeforeApply */, DIRECTION_OUT); + } + + @Test + public void testApplyTunnelModeTransformInbound() throws Exception { + verifyApplyTunnelModeTransformCommon(true /* closeSpiBeforeApply */, DIRECTION_IN); + } + + @Test + public void testApplyTunnelModeTransformInboundNonNetworkStack() throws Exception { + mTestContext.setAllowedPermissions(android.Manifest.permission.MANAGE_IPSEC_TUNNELS); + verifyApplyTunnelModeTransformCommon(true /* closeSpiBeforeApply */, DIRECTION_IN); + } + + @Test + public void testApplyTunnelModeTransformForward() throws Exception { + verifyApplyTunnelModeTransformCommon(true /* closeSpiBeforeApply */, DIRECTION_FWD); + } + + @Test + public void testApplyTunnelModeTransformForwardNonNetworkStack() throws Exception { + mTestContext.setAllowedPermissions(android.Manifest.permission.MANAGE_IPSEC_TUNNELS); + + try { + verifyApplyTunnelModeTransformCommon(true /* closeSpiBeforeApply */, DIRECTION_FWD); + fail("Expected security exception due to use of forward policies without NETWORK_STACK" + + " or MAINLINE_NETWORK_STACK permission"); + } catch (SecurityException expected) { + } + } + + public void verifyApplyTunnelModeTransformCommon(boolean closeSpiBeforeApply, int direction) + throws Exception { IpSecConfig ipSecConfig = new IpSecConfig(); ipSecConfig.setMode(IpSecTransform.MODE_TUNNEL); addDefaultSpisAndRemoteAddrToIpSecConfig(ipSecConfig); @@ -825,17 +895,17 @@ public class IpSecServiceParameterizedTest { int transformResourceId = createTransformResp.resourceId; int tunnelResourceId = createTunnelResp.resourceId; mIpSecService.applyTunnelModeTransform( - tunnelResourceId, IpSecManager.DIRECTION_OUT, transformResourceId, BLESSED_PACKAGE); + tunnelResourceId, direction, transformResourceId, BLESSED_PACKAGE); for (int selAddrFamily : ADDRESS_FAMILIES) { verify(mMockNetd) .ipSecUpdateSecurityPolicy( eq(mUid), eq(selAddrFamily), - eq(IpSecManager.DIRECTION_OUT), + eq(direction), anyString(), anyString(), - eq(TEST_SPI), + eq(direction == DIRECTION_OUT ? TEST_SPI : 0), anyInt(), // iKey/oKey anyInt(), // mask eq(tunnelResourceId)); diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java index aa4b5f8e208f..9ecd82ff6bcb 100644 --- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java +++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java @@ -77,6 +77,7 @@ import android.os.test.TestLooper; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; +import android.util.ArraySet; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; @@ -98,6 +99,7 @@ import java.io.FileNotFoundException; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import java.util.UUID; @@ -326,6 +328,17 @@ public class VcnManagementServiceTest { return subIdToGroupMap.get(invocation.getArgument(0)); }).when(snapshot).getGroupForSubId(anyInt()); + doAnswer(invocation -> { + final ParcelUuid subGrp = invocation.getArgument(0); + final Set<Integer> subIds = new ArraySet<>(); + for (Entry<Integer, ParcelUuid> entry : subIdToGroupMap.entrySet()) { + if (entry.getValue().equals(subGrp)) { + subIds.add(entry.getKey()); + } + } + return subIds; + }).when(snapshot).getAllSubIdsInGroup(any()); + final TelephonySubscriptionTrackerCallback cb = getTelephonySubscriptionTrackerCallback(); cb.onNewSnapshot(snapshot); @@ -914,6 +927,18 @@ public class VcnManagementServiceTest { verify(mMockPolicyListener).onPolicyChanged(); } + @Test + public void testVcnSubIdChangeUpdatesPolicyListener() throws Exception { + startAndGetVcnInstance(TEST_UUID_2); + mVcnMgmtSvc.addVcnUnderlyingNetworkPolicyListener(mMockPolicyListener); + + triggerSubscriptionTrackerCbAndGetSnapshot( + Collections.singleton(TEST_UUID_2), + Collections.singletonMap(TEST_SUBSCRIPTION_ID, TEST_UUID_2)); + + verify(mMockPolicyListener).onPolicyChanged(); + } + private void triggerVcnSafeMode( @NonNull ParcelUuid subGroup, @NonNull TelephonySubscriptionSnapshot snapshot, diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java index eedaac48293c..39f7386cbb76 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionConnectedStateTest.java @@ -16,8 +16,11 @@ package com.android.server.vcn; +import static android.net.IpSecManager.DIRECTION_FWD; import static android.net.IpSecManager.DIRECTION_IN; import static android.net.IpSecManager.DIRECTION_OUT; +import static android.net.NetworkCapabilities.NET_CAPABILITY_DUN; +import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET; import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR; import static android.net.NetworkCapabilities.TRANSPORT_WIFI; import static android.net.ipsec.ike.exceptions.IkeProtocolException.ERROR_TYPE_AUTHENTICATION_FAILED; @@ -54,6 +57,8 @@ import android.net.ipsec.ike.ChildSaProposal; import android.net.ipsec.ike.exceptions.IkeException; import android.net.ipsec.ike.exceptions.IkeInternalException; import android.net.ipsec.ike.exceptions.IkeProtocolException; +import android.net.vcn.VcnGatewayConnectionConfig; +import android.net.vcn.VcnGatewayConnectionConfigTest; import android.net.vcn.VcnManager.VcnErrorCode; import androidx.test.filters.SmallTest; @@ -143,8 +148,9 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState()); } - @Test - public void testCreatedTransformsAreApplied() throws Exception { + private void verifyVcnTransformsApplied( + VcnGatewayConnection vcnGatewayConnection, boolean expectForwardTransform) + throws Exception { for (int direction : new int[] {DIRECTION_IN, DIRECTION_OUT}) { getChildSessionCallback().onIpSecTransformCreated(makeDummyIpSecTransform(), direction); mTestLooper.dispatchAll(); @@ -154,7 +160,40 @@ public class VcnGatewayConnectionConnectedStateTest extends VcnGatewayConnection eq(TEST_IPSEC_TUNNEL_RESOURCE_ID), eq(direction), anyInt(), any()); } - assertEquals(mGatewayConnection.mConnectedState, mGatewayConnection.getCurrentState()); + verify(mIpSecSvc, expectForwardTransform ? times(1) : never()) + .applyTunnelModeTransform( + eq(TEST_IPSEC_TUNNEL_RESOURCE_ID), eq(DIRECTION_FWD), anyInt(), any()); + + assertEquals(vcnGatewayConnection.mConnectedState, vcnGatewayConnection.getCurrentState()); + } + + @Test + public void testCreatedTransformsAreApplied() throws Exception { + verifyVcnTransformsApplied(mGatewayConnection, false /* expectForwardTransform */); + } + + @Test + public void testCreatedTransformsAreAppliedWithDun() throws Exception { + VcnGatewayConnectionConfig gatewayConfig = + VcnGatewayConnectionConfigTest.buildTestConfigWithExposedCaps( + NET_CAPABILITY_INTERNET, NET_CAPABILITY_DUN); + VcnGatewayConnection gatewayConnection = + new VcnGatewayConnection( + mVcnContext, + TEST_SUB_GRP, + TEST_SUBSCRIPTION_SNAPSHOT, + gatewayConfig, + mGatewayStatusCallback, + true /* isMobileDataEnabled */, + mDeps); + gatewayConnection.setUnderlyingNetwork(TEST_UNDERLYING_NETWORK_RECORD_1); + final VcnIkeSession session = + gatewayConnection.buildIkeSession(TEST_UNDERLYING_NETWORK_RECORD_1.network); + gatewayConnection.setIkeSession(session); + gatewayConnection.transitionTo(gatewayConnection.mConnectedState); + mTestLooper.dispatchAll(); + + verifyVcnTransformsApplied(gatewayConnection, true /* expectForwardTransform */); } @Test diff --git a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java index 284f1f88658e..1ecb4c9ee298 100644 --- a/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java +++ b/tests/vcn/java/com/android/server/vcn/VcnGatewayConnectionTestBase.java @@ -220,7 +220,7 @@ public class VcnGatewayConnectionTestBase { protected VcnChildSessionCallback getChildSessionCallback() { ArgumentCaptor<ChildSessionCallback> captor = ArgumentCaptor.forClass(ChildSessionCallback.class); - verify(mDeps).newIkeSession(any(), any(), any(), any(), captor.capture()); + verify(mDeps, atLeastOnce()).newIkeSession(any(), any(), any(), any(), captor.capture()); return (VcnChildSessionCallback) captor.getValue(); } |