Merge "Adding JNI for create random parcel"
diff --git a/Android.bp b/Android.bp
index 55d9c4b..b30851c 100644
--- a/Android.bp
+++ b/Android.bp
@@ -97,7 +97,7 @@
// AIDL sources from external directories
":android.hardware.gnss-V2-java-source",
":android.hardware.graphics.common-V3-java-source",
- ":android.hardware.security.keymint-V2-java-source",
+ ":android.hardware.security.keymint-V3-java-source",
":android.hardware.security.secureclock-V1-java-source",
":android.hardware.tv.tuner-V1-java-source",
":android.security.apc-java-source",
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index 9b556d8..ed2c8eb 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -383,7 +383,6 @@
method public static void traceBegin(long, @NonNull String);
method public static void traceCounter(long, @NonNull String, int);
method public static void traceEnd(long);
- field public static final long TRACE_TAG_AIDL = 16777216L; // 0x1000000L
field public static final long TRACE_TAG_NETWORK = 2097152L; // 0x200000L
}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index f789f86..9ff0afe 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -764,6 +764,9 @@
method public static android.app.BroadcastOptions makeBasic();
method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RESPONSE_STATS) public void recordResponseEventWhileInBackground(@IntRange(from=0) long);
method @RequiresPermission(android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND) public void setBackgroundActivityStartsAllowed(boolean);
+ method public void setDeliveryGroupMatchingFilter(@NonNull android.content.IntentFilter);
+ method public void setDeliveryGroupMatchingKey(@NonNull String, @NonNull String);
+ method public void setDeliveryGroupPolicy(int);
method public void setDontSendToRestrictedApps(boolean);
method public void setPendingIntentBackgroundActivityLaunchAllowed(boolean);
method public void setRequireAllOfPermissions(@Nullable String[]);
@@ -772,6 +775,8 @@
method @RequiresPermission(anyOf={android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST, android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND, android.Manifest.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND}) public void setTemporaryAppAllowlist(long, int, int, @Nullable String);
method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST, android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND, android.Manifest.permission.START_FOREGROUND_SERVICES_FROM_BACKGROUND}) public void setTemporaryAppWhitelistDuration(long);
method public android.os.Bundle toBundle();
+ field public static final int DELIVERY_GROUP_POLICY_ALL = 0; // 0x0
+ field public static final int DELIVERY_GROUP_POLICY_MOST_RECENT = 1; // 0x1
}
public class DownloadManager {
@@ -2977,6 +2982,7 @@
field public static final String TRANSLATION_MANAGER_SERVICE = "translation";
field public static final String UI_TRANSLATION_SERVICE = "ui_translation";
field public static final String UWB_SERVICE = "uwb";
+ field public static final String VIRTUALIZATION_SERVICE = "virtualization";
field public static final String VR_SERVICE = "vrmanager";
field public static final String WALLPAPER_EFFECTS_GENERATION_SERVICE = "wallpaper_effects_generation";
field public static final String WIFI_NL80211_SERVICE = "wifinl80211";
@@ -9715,6 +9721,10 @@
field public static final int STATUS_WAITING_REBOOT = 5; // 0x5
}
+ public final class Trace {
+ field public static final long TRACE_TAG_AIDL = 16777216L; // 0x1000000L
+ }
+
public class UpdateEngine {
ctor public UpdateEngine();
method @NonNull @WorkerThread public android.os.UpdateEngine.AllocateSpaceResult allocateSpace(@NonNull String, @NonNull String[]);
diff --git a/core/java/android/app/BroadcastOptions.java b/core/java/android/app/BroadcastOptions.java
index 56f8760..a504034 100644
--- a/core/java/android/app/BroadcastOptions.java
+++ b/core/java/android/app/BroadcastOptions.java
@@ -16,6 +16,7 @@
package android.app;
+import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -27,12 +28,19 @@
import android.compat.annotation.Disabled;
import android.compat.annotation.EnabledSince;
import android.content.Intent;
+import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerExemptionManager;
import android.os.PowerExemptionManager.ReasonCode;
import android.os.PowerExemptionManager.TempAllowListType;
+import com.android.internal.util.Preconditions;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.Objects;
+
/**
* Helper class for building an options Bundle that can be used with
* {@link android.content.Context#sendBroadcast(android.content.Intent)
@@ -54,6 +62,9 @@
private long mRequireCompatChangeId = CHANGE_INVALID;
private boolean mRequireCompatChangeEnabled = true;
private long mIdForResponseEvent;
+ private @DeliveryGroupPolicy int mDeliveryGroupPolicy;
+ private @Nullable String mDeliveryGroupMatchingKey;
+ private @Nullable IntentFilter mDeliveryGroupMatchingFilter;
/**
* Change ID which is invalid.
@@ -172,6 +183,36 @@
private static final String KEY_ID_FOR_RESPONSE_EVENT =
"android:broadcast.idForResponseEvent";
+ /**
+ * The list of delivery group policies which specify how multiple broadcasts belonging to
+ * the same delivery group has to be handled.
+ * @hide
+ */
+ @IntDef(flag = true, prefix = { "DELIVERY_GROUP_POLICY_" }, value = {
+ DELIVERY_GROUP_POLICY_ALL,
+ DELIVERY_GROUP_POLICY_MOST_RECENT,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface DeliveryGroupPolicy {}
+
+ /**
+ * Delivery group policy that indicates that all the broadcasts in the delivery group
+ * need to be delivered as is.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final int DELIVERY_GROUP_POLICY_ALL = 0;
+
+ /**
+ * Delivery group policy that indicates that only the most recent broadcast in the delivery
+ * group need to be delivered and the rest can be dropped.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final int DELIVERY_GROUP_POLICY_MOST_RECENT = 1;
+
public static BroadcastOptions makeBasic() {
BroadcastOptions opts = new BroadcastOptions();
return opts;
@@ -544,6 +585,57 @@
}
/**
+ * Set delivery group policy for this broadcast to specify how multiple broadcasts belonging to
+ * the same delivery group has to be handled.
+ *
+ * @hide
+ */
+ @SystemApi
+ public void setDeliveryGroupPolicy(@DeliveryGroupPolicy int policy) {
+ mDeliveryGroupPolicy = policy;
+ }
+
+ /**
+ * Set namespace and key to identify the delivery group that this broadcast belongs to.
+ *
+ * <p> If {@code namespace} and {@code key} are specified, then another broadcast will be
+ * considered to be in the same delivery group as this iff it has the same {@code namespace}
+ * and {@code key}.
+ *
+ * <p> If neither matching key using this API nor matching filter using
+ * {@link #setDeliveryGroupMatchingFilter(IntentFilter)} is specified, then by default
+ * {@link Intent#filterEquals(Intent)} will be used to identify the delivery group.
+ *
+ * @hide
+ */
+ @SystemApi
+ public void setDeliveryGroupMatchingKey(@NonNull String namespace, @NonNull String key) {
+ Preconditions.checkArgument(!namespace.contains("/"),
+ "namespace should not contain '/'");
+ Preconditions.checkArgument(!key.contains("/"),
+ "key should not contain '/'");
+ mDeliveryGroupMatchingKey = namespace + "/" + key;
+ }
+
+ /**
+ * Set the {@link IntentFilter} object to identify the delivery group that this broadcast
+ * belongs to.
+ *
+ * <p> If a {@code matchingFilter} is specified, then another broadcast will be considered
+ * to be in the same delivery group as this iff the {@code matchingFilter} matches it's intent.
+ *
+ * <p> If neither matching key using {@link #setDeliveryGroupMatchingKey(String, String)} nor
+ * matching filter using this API is specified, then by default
+ * {@link Intent#filterEquals(Intent)} will be used to identify the delivery group.
+ *
+ * @hide
+ */
+ @SystemApi
+ public void setDeliveryGroupMatchingFilter(@NonNull IntentFilter matchingFilter) {
+ mDeliveryGroupMatchingFilter = Objects.requireNonNull(matchingFilter);
+ }
+
+ /**
* Returns the created options as a Bundle, which can be passed to
* {@link android.content.Context#sendBroadcast(android.content.Intent)
* Context.sendBroadcast(Intent)} and related methods.
diff --git a/core/java/android/app/OWNERS b/core/java/android/app/OWNERS
index 8ec313ec..f2eced3 100644
--- a/core/java/android/app/OWNERS
+++ b/core/java/android/app/OWNERS
@@ -11,7 +11,7 @@
per-file ApplicationThreadConstants.java = file:/services/core/java/com/android/server/am/OWNERS
per-file BroadcastOptions.java = file:/services/core/java/com/android/server/am/OWNERS
per-file ContentProviderHolder* = file:/services/core/java/com/android/server/am/OWNERS
-per-file ForegroundService* = file:/services/core/java/com/android/server/am/OWNERS
+per-file *ForegroundService* = file:/services/core/java/com/android/server/am/OWNERS
per-file IActivityController.aidl = file:/services/core/java/com/android/server/am/OWNERS
per-file IActivityManager.aidl = file:/services/core/java/com/android/server/am/OWNERS
per-file IApplicationThread.aidl = file:/services/core/java/com/android/server/am/OWNERS
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 12f72c2..ea65727 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -207,6 +207,7 @@
import android.service.persistentdata.IPersistentDataBlockService;
import android.service.persistentdata.PersistentDataBlockManager;
import android.service.vr.IVrManager;
+import android.system.virtualmachine.VirtualizationFrameworkInitializer;
import android.telecom.TelecomManager;
import android.telephony.MmsManager;
import android.telephony.TelephonyFrameworkInitializer;
@@ -1541,6 +1542,7 @@
ConnectivityFrameworkInitializerTiramisu.registerServiceWrappers();
NearbyFrameworkInitializer.registerServiceWrappers();
OnDevicePersonalizationFrameworkInitializer.registerServiceWrappers();
+ VirtualizationFrameworkInitializer.registerServiceWrappers();
} finally {
// If any of the above code throws, we're in a pretty bad shape and the process
// will likely crash, but we'll reset it just in case there's an exception handler...
@@ -1585,6 +1587,7 @@
case Context.APP_PREDICTION_SERVICE:
case Context.INCREMENTAL_SERVICE:
case Context.ETHERNET_SERVICE:
+ case Context.VIRTUALIZATION_SERVICE:
return null;
}
Slog.wtf(TAG, "Manager wrapper not available: " + name);
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 3b45d62..cc42a4c 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3931,6 +3931,7 @@
//@hide: ATTESTATION_VERIFICATION_SERVICE,
//@hide: SAFETY_CENTER_SERVICE,
DISPLAY_HASH_SERVICE,
+ VIRTUALIZATION_SERVICE,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ServiceName {}
@@ -6047,6 +6048,20 @@
public static final String AMBIENT_CONTEXT_SERVICE = "ambient_context";
/**
+ * Use with {@link #getSystemService(String)} to retrieve a
+ * {@link android.system.virtualmachine.VirtualMachineManager}.
+ *
+ * <p>On devices without {@link PackageManager#FEATURE_VIRTUALIZATION_FRAMEWORK} system feature
+ * the {@link #getSystemService(String)} will return {@code null}.
+ *
+ * @see #getSystemService(String)
+ * @see android.system.virtualmachine.VirtualMachineManager
+ * @hide
+ */
+ @SystemApi
+ public static final String VIRTUALIZATION_SERVICE = "virtualization";
+
+ /**
* Determine whether the given permission is allowed for a particular
* process and user ID running in the system.
*
diff --git a/core/java/android/hardware/camera2/CameraManager.java b/core/java/android/hardware/camera2/CameraManager.java
index 5718532..2d0520b 100644
--- a/core/java/android/hardware/camera2/CameraManager.java
+++ b/core/java/android/hardware/camera2/CameraManager.java
@@ -245,11 +245,13 @@
* applications is not guaranteed to be supported, however.</p>
*
* <p>For concurrent operation, in chronological order :
- * - Applications must first close any open cameras that have sessions configured, using
- * {@link CameraDevice#close}.
- * - All camera devices intended to be operated concurrently, must be opened using
- * {@link #openCamera}, before configuring sessions on any of the camera devices.</p>
- *
+ * <ul>
+ * <li> Applications must first close any open cameras that have sessions configured, using
+ * {@link CameraDevice#close}. </li>
+ * <li> All camera devices intended to be operated concurrently, must be opened using
+ * {@link #openCamera}, before configuring sessions on any of the camera devices.</li>
+ *</ul>
+ *</p>
* <p>Each device in a combination, is guaranteed to support stream combinations which may be
* obtained by querying {@link #getCameraCharacteristics} for the key
* {@link android.hardware.camera2.CameraCharacteristics#SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS}.</p>
diff --git a/core/java/android/nfc/AvailableNfcAntenna.java b/core/java/android/nfc/AvailableNfcAntenna.java
index 946ba67..6e6512a 100644
--- a/core/java/android/nfc/AvailableNfcAntenna.java
+++ b/core/java/android/nfc/AvailableNfcAntenna.java
@@ -27,13 +27,15 @@
*/
public final class AvailableNfcAntenna implements Parcelable {
/**
- * Location on the antenna on the Y axis in millimeters.
- * 0 is the bottom-left when the user is facing the screen.
+ * Location of the antenna on the Y axis in millimeters.
+ * 0 is the bottom-left when the user is facing the screen
+ * and the device orientation is Portrait.
*/
private final int mLocationX;
/**
- * Location on the antenna on the Y axis in millimeters.
- * 0 is the bottom-left when the user is facing the screen.
+ * Location of the antenna on the Y axis in millimeters.
+ * 0 is the bottom-left when the user is facing the screen
+ * and the device orientation is Portrait.
*/
private final int mLocationY;
@@ -43,16 +45,18 @@
}
/**
- * Location on the antenna on the X axis in millimeters.
- * 0 is the bottom-left when the user is facing the screen.
+ * Location of the antenna on the X axis in millimeters.
+ * 0 is the bottom-left when the user is facing the screen
+ * and the device orientation is Portrait.
*/
public int getLocationX() {
return mLocationX;
}
/**
- * Location on the antenna on the Y axis in millimeters.
- * 0 is the bottom-left when the user is facing the screen.
+ * Location of the antenna on the Y axis in millimeters.
+ * 0 is the bottom-left when the user is facing the screen
+ * and the device orientation is Portrait.
*/
public int getLocationY() {
return mLocationY;
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
index 9ea4278..394927e 100644
--- a/core/java/android/os/ServiceManager.java
+++ b/core/java/android/os/ServiceManager.java
@@ -252,10 +252,12 @@
}
/**
- * Returns the list of declared instances for an interface.
+ * Returns an array of all declared instances for a particular interface.
*
- * @return true if the service is declared somewhere (eg. VINTF manifest) and
- * waitForService should always be able to return the service.
+ * For instance, if 'android.foo.IFoo/foo' is declared (e.g. in VINTF
+ * manifest), and 'android.foo.IFoo' is passed here, then ["foo"] would be
+ * returned.
+ *
* @hide
*/
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index 726ef4d..320b02c 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -100,7 +100,7 @@
/** @hide */
public static final long TRACE_TAG_VIBRATOR = 1L << 23;
/** @hide */
- @SystemApi(client = MODULE_LIBRARIES)
+ @SystemApi
public static final long TRACE_TAG_AIDL = 1L << 24;
/** @hide */
public static final long TRACE_TAG_NNAPI = 1L << 25;
diff --git a/core/java/com/android/internal/content/om/OverlayConfig.java b/core/java/com/android/internal/content/om/OverlayConfig.java
index b786526..fc0943b 100644
--- a/core/java/com/android/internal/content/om/OverlayConfig.java
+++ b/core/java/com/android/internal/content/om/OverlayConfig.java
@@ -140,7 +140,6 @@
ArrayMap<Integer, List<String>> activeApexesPerPartition = getActiveApexes(partitions);
- boolean foundConfigFile = false;
final Map<String, ParsedOverlayInfo> packageManagerOverlayInfos =
packageProvider == null ? null : getOverlayPackageInfos(packageProvider);
@@ -154,7 +153,6 @@
activeApexesPerPartition.getOrDefault(partition.type,
Collections.emptyList()));
if (partitionOverlays != null) {
- foundConfigFile = true;
overlays.addAll(partitionOverlays);
continue;
}
@@ -191,12 +189,6 @@
overlays.addAll(partitionConfigs);
}
- if (!foundConfigFile) {
- // If no overlay configuration files exist, disregard partition precedence and allow
- // android:priority to reorder overlays across partition boundaries.
- overlays.sort(sStaticOverlayComparator);
- }
-
for (int i = 0, n = overlays.size(); i < n; i++) {
// Add the configurations to a map so definitions of an overlay in an earlier
// partition can be replaced by an overlay with the same package name in a later
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 7cd7d29..681f194 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -40,6 +40,8 @@
cppflags: ["-Wno-conversion-null"],
+ cpp_std: "gnu++20",
+
srcs: [
"android_animation_PropertyValuesHolder.cpp",
"android_os_SystemClock.cpp",
diff --git a/core/res/OWNERS b/core/res/OWNERS
index 6d05e07..a2ef400 100644
--- a/core/res/OWNERS
+++ b/core/res/OWNERS
@@ -8,7 +8,6 @@
hackbod@google.com
ilyamaty@google.com
jaggies@google.com
-jdemeulenaere@google.com
jsharkey@android.com
jsharkey@google.com
juliacr@google.com
diff --git a/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java b/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java
index caec365..0f30cfe 100644
--- a/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java
+++ b/core/tests/coretests/src/com/android/internal/content/res/OverlayConfigTest.java
@@ -286,6 +286,39 @@
}
@Test
+ public void testPartialConfigPartitionPrecedence() throws IOException {
+ createFile("/odm/overlay/config/config.xml",
+ "<config>"
+ + " <overlay package=\"two\" enabled=\"true\" />"
+ + "</config>");
+
+ mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
+ 1);
+ mScannerRule.addOverlay(createFile("/odm/overlay/two.apk"), "two");
+ mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
+ true, 0);
+
+ final OverlayConfig overlayConfig = createConfigImpl();
+ assertConfig(overlayConfig, "one", false, true, 0);
+ assertConfig(overlayConfig, "two", true, true, 1);
+ assertConfig(overlayConfig, "three", false, true, 2);
+ }
+
+ @Test
+ public void testNoConfigPartitionPrecedence() throws IOException {
+ mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
+ 1);
+ mScannerRule.addOverlay(createFile("/odm/overlay/two.apk"), "two", "android", 0, true, 2);
+ mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
+ true, 0);
+
+ final OverlayConfig overlayConfig = createConfigImpl();
+ assertConfig(overlayConfig, "one", false, true, 0);
+ assertConfig(overlayConfig, "two", false, true, 1);
+ assertConfig(overlayConfig, "three", false, true, 2);
+ }
+
+ @Test
public void testImmutable() throws IOException {
createFile("/product/overlay/config/config.xml",
"<config>"
@@ -507,37 +540,6 @@
}
@Test
- public void testNoConfigsAllowPartitionReordering() throws IOException {
- mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
- 1);
- mScannerRule.addOverlay(createFile("/product/overlay/two.apk"), "two", "android", 0, true,
- 0);
-
- final OverlayConfig overlayConfig = createConfigImpl();
- assertConfig(overlayConfig, "one", false, true, 1);
- assertConfig(overlayConfig, "two", false, true, 0);
- }
-
- @Test
- public void testConfigDisablesPartitionReordering() throws IOException {
- createFile("/odm/overlay/config/config.xml",
- "<config>"
- + " <overlay package=\"two\" enabled=\"true\" />"
- + "</config>");
-
- mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
- 1);
- mScannerRule.addOverlay(createFile("/odm/overlay/two.apk"), "two");
- mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
- true, 0);
-
- final OverlayConfig overlayConfig = createConfigImpl();
- assertConfig(overlayConfig, "one", false, true, 0);
- assertConfig(overlayConfig, "two", true, true, 1);
- assertConfig(overlayConfig, "three", false, true, 2);
- }
-
- @Test
public void testStaticOverlayOutsideOverlayDir() throws IOException {
mScannerRule.addOverlay(createFile("/product/app/one.apk"), "one", "android", 0, true, 0);
@@ -550,7 +552,7 @@
@Test
public void testSortStaticOverlaysDifferentTargets() throws IOException {
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "other", 0, true, 0);
- mScannerRule.addOverlay(createFile("/product/overlay/two.apk"), "two", "android", 0, true,
+ mScannerRule.addOverlay(createFile("/vendor/overlay/two.apk"), "two", "android", 0, true,
0);
final OverlayConfig overlayConfig = createConfigImpl();
@@ -559,15 +561,33 @@
}
@Test
+ public void testSortStaticOverlaysDifferentPartitions() throws IOException {
+ mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
+ 2);
+ mScannerRule.addOverlay(createFile("/vendor/overlay/two.apk"), "two", "android", 0, true,
+ 3);
+ mScannerRule.addOverlay(createFile("/product/overlay/three.apk"), "three", "android", 0,
+ true, 0);
+ mScannerRule.addOverlay(createFile("/product/overlay/four.apk"), "four", "android", 0,
+ true, 1);
+
+ final OverlayConfig overlayConfig = createConfigImpl();
+ assertConfig(overlayConfig, "one", false, true, 0);
+ assertConfig(overlayConfig, "two", false, true, 1);
+ assertConfig(overlayConfig, "three", false, true, 2);
+ assertConfig(overlayConfig, "four", false, true, 3);
+ }
+
+ @Test
public void testSortStaticOverlaysSamePriority() throws IOException {
mScannerRule.addOverlay(createFile("/vendor/overlay/one.apk"), "one", "android", 0, true,
0);
- mScannerRule.addOverlay(createFile("/product/overlay/two.apk"), "two", "android", 0, true,
+ mScannerRule.addOverlay(createFile("/vendor/overlay/two.apk"), "two", "android", 0, true,
0);
final OverlayConfig overlayConfig = createConfigImpl();
- assertConfig(overlayConfig, "one", false, true, 1);
- assertConfig(overlayConfig, "two", false, true, 0);
+ assertConfig(overlayConfig, "one", false, true, 0);
+ assertConfig(overlayConfig, "two", false, true, 1);
}
@Test
diff --git a/data/keyboards/Generic.kl b/data/keyboards/Generic.kl
index 8e7c6a8..76b12677 100644
--- a/data/keyboards/Generic.kl
+++ b/data/keyboards/Generic.kl
@@ -363,6 +363,10 @@
# key 413 "KEY_DIGITS"
# key 414 "KEY_TEEN"
# key 415 "KEY_TWEN"
+# key 418 "KEY_ZOOM_IN"
+key 418 ZOOM_IN
+# key 419 "KEY_ZOOM_OUT"
+key 419 ZOOM_OUT
key 528 FOCUS
key 429 CONTACTS
diff --git a/keystore/java/android/security/keystore/KeyProperties.java b/keystore/java/android/security/keystore/KeyProperties.java
index 6245598..8c42547 100644
--- a/keystore/java/android/security/keystore/KeyProperties.java
+++ b/keystore/java/android/security/keystore/KeyProperties.java
@@ -196,6 +196,7 @@
@StringDef(prefix = { "KEY_" }, value = {
KEY_ALGORITHM_RSA,
KEY_ALGORITHM_EC,
+ KEY_ALGORITHM_XDH,
KEY_ALGORITHM_AES,
KEY_ALGORITHM_HMAC_SHA1,
KEY_ALGORITHM_HMAC_SHA224,
@@ -211,6 +212,11 @@
/** Elliptic Curve (EC) Cryptography key. */
public static final String KEY_ALGORITHM_EC = "EC";
+ /** Curve 25519 based Agreement key.
+ * @hide
+ */
+ public static final String KEY_ALGORITHM_XDH = "XDH";
+
/** Advanced Encryption Standard (AES) key. */
public static final String KEY_ALGORITHM_AES = "AES";
@@ -246,7 +252,8 @@
public static int toKeymasterAsymmetricKeyAlgorithm(
@NonNull @KeyAlgorithmEnum String algorithm) {
- if (KEY_ALGORITHM_EC.equalsIgnoreCase(algorithm)) {
+ if (KEY_ALGORITHM_EC.equalsIgnoreCase(algorithm)
+ || KEY_ALGORITHM_XDH.equalsIgnoreCase(algorithm)) {
return KeymasterDefs.KM_ALGORITHM_EC;
} else if (KEY_ALGORITHM_RSA.equalsIgnoreCase(algorithm)) {
return KeymasterDefs.KM_ALGORITHM_RSA;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreECPublicKey.java b/keystore/java/android/security/keystore2/AndroidKeyStoreECPublicKey.java
index 4e73bd9..4505eaf 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreECPublicKey.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreECPublicKey.java
@@ -24,13 +24,9 @@
import android.system.keystore2.KeyDescriptor;
import android.system.keystore2.KeyMetadata;
-import java.security.AlgorithmParameters;
-import java.security.NoSuchAlgorithmException;
import java.security.interfaces.ECPublicKey;
-import java.security.spec.ECGenParameterSpec;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
-import java.security.spec.InvalidParameterSpecException;
/**
* {@link ECPublicKey} backed by keystore.
@@ -62,34 +58,13 @@
}
}
- private static String getEcCurveFromKeymaster(int ecCurve) {
- switch (ecCurve) {
- case android.hardware.security.keymint.EcCurve.P_224:
- return "secp224r1";
- case android.hardware.security.keymint.EcCurve.P_256:
- return "secp256r1";
- case android.hardware.security.keymint.EcCurve.P_384:
- return "secp384r1";
- case android.hardware.security.keymint.EcCurve.P_521:
- return "secp521r1";
- }
- return "";
- }
-
- private ECParameterSpec getCurveSpec(String name)
- throws NoSuchAlgorithmException, InvalidParameterSpecException {
- AlgorithmParameters parameters = AlgorithmParameters.getInstance("EC");
- parameters.init(new ECGenParameterSpec(name));
- return parameters.getParameterSpec(ECParameterSpec.class);
- }
-
@Override
public AndroidKeyStorePrivateKey getPrivateKey() {
ECParameterSpec params = mParams;
for (Authorization a : getAuthorizations()) {
try {
if (a.keyParameter.tag == KeymasterDefs.KM_TAG_EC_CURVE) {
- params = getCurveSpec(getEcCurveFromKeymaster(
+ params = KeymasterUtils.getCurveSpec(KeymasterUtils.getEcCurveFromKeymaster(
a.keyParameter.value.getEcCurve()));
break;
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java
index 4caa47f..7292cd3 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKeyAgreementSpi.java
@@ -32,7 +32,6 @@
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.interfaces.ECKey;
-import java.security.interfaces.XECKey;
import java.security.spec.AlgorithmParameterSpec;
import java.util.ArrayList;
import java.util.List;
@@ -134,10 +133,15 @@
throw new InvalidKeyException("key == null");
} else if (!(key instanceof PublicKey)) {
throw new InvalidKeyException("Only public keys supported. Key: " + key);
- } else if (!(mKey instanceof ECKey && key instanceof ECKey)
- && !(mKey instanceof XECKey && key instanceof XECKey)) {
+ } else if (mKey instanceof ECKey && !(key instanceof ECKey)
+ /*&& !(mKey instanceof XECKey && key instanceof XECKey)*/) {
+ /** TODO This condition is temporary modified, because OpenSSL implementation does not
+ * implement OpenSSLX25519PublicKey from XECKey interface (b/214203951).
+ * This change has to revert once conscrypt implements OpenSSLX25519PublicKey from
+ * XECKey interface.
+ */
throw new InvalidKeyException(
- "Public and Private key should be of the same type:");
+ "Public and Private key should be of the same type.");
} else if (mKey instanceof ECKey
&& !((ECKey) key).getParams().getCurve()
.equals(((ECKey) mKey).getParams().getCurve())) {
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
index f05cdc5..91f216f 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
@@ -20,6 +20,7 @@
import android.annotation.NonNull;
import android.hardware.biometrics.BiometricManager;
+import android.hardware.security.keymint.EcCurve;
import android.hardware.security.keymint.HardwareAuthenticatorType;
import android.hardware.security.keymint.KeyParameter;
import android.hardware.security.keymint.SecurityLevel;
@@ -67,6 +68,14 @@
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.ECKey;
+import java.security.interfaces.ECPrivateKey;
+import java.security.interfaces.EdECKey;
+import java.security.interfaces.EdECPrivateKey;
+import java.security.interfaces.XECKey;
+import java.security.interfaces.XECPrivateKey;
+import java.security.spec.AlgorithmParameterSpec;
+import java.security.spec.ECParameterSpec;
+import java.security.spec.NamedParameterSpec;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -567,22 +576,14 @@
spec.getMaxUsageCount()
));
}
- if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(key.getAlgorithm())) {
- if (key instanceof ECKey) {
- ECKey ecKey = (ECKey) key;
- importArgs.add(KeyStore2ParameterUtils.makeEnum(
- KeymasterDefs.KM_TAG_EC_CURVE,
- KeyProperties.EcCurve.toKeymasterCurve(ecKey.getParams())
- ));
- }
+ if (KeymasterDefs.KM_ALGORITHM_EC
+ == KeyProperties.KeyAlgorithm.toKeymasterAsymmetricKeyAlgorithm(
+ key.getAlgorithm())) {
+ importArgs.add(KeyStore2ParameterUtils.makeEnum(
+ KeymasterDefs.KM_TAG_EC_CURVE,
+ getKeymasterEcCurve(key)
+ ));
}
- /* TODO: check for Ed25519(EdDSA) or X25519(XDH) key algorithm and
- * add import args for KM_TAG_EC_CURVE as EcCurve.CURVE_25519.
- * Currently conscrypt does not support EdDSA key import and XDH keys are not an
- * instance of XECKey, hence these conditions are not added, once it is fully
- * implemented by conscrypt, we can add CURVE_25519 argument for EdDSA and XDH
- * algorithms.
- */
} catch (IllegalArgumentException | IllegalStateException e) {
throw new KeyStoreException(e);
}
@@ -608,6 +609,31 @@
}
}
+ private int getKeymasterEcCurve(PrivateKey key) {
+ if (key instanceof ECKey) {
+ ECParameterSpec param = ((ECPrivateKey) key).getParams();
+ int kmECCurve = KeymasterUtils.getKeymasterEcCurve(KeymasterUtils.getCurveName(param));
+ if (kmECCurve >= 0) {
+ return kmECCurve;
+ }
+ } else if (key instanceof XECKey) {
+ AlgorithmParameterSpec param = ((XECPrivateKey) key).getParams();
+ if (param.equals(NamedParameterSpec.X25519)) {
+ return EcCurve.CURVE_25519;
+ }
+ } else if (key.getAlgorithm().equals("XDH")) {
+ // TODO com.android.org.conscrypt.OpenSSLX25519PrivateKey does not implement XECKey,
+ // this case is not required once it implements XECKey interface(b/214203951).
+ return EcCurve.CURVE_25519;
+ } else if (key instanceof EdECKey) {
+ AlgorithmParameterSpec param = ((EdECPrivateKey) key).getParams();
+ if (param.equals(NamedParameterSpec.ED25519)) {
+ return EcCurve.CURVE_25519;
+ }
+ }
+ throw new IllegalArgumentException("Unexpected Key " + key.getClass().getName());
+ }
+
private static void assertCanReplace(String alias, @Domain int targetDomain,
int targetNamespace, KeyDescriptor descriptor)
throws KeyStoreException {
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreXDHPublicKey.java b/keystore/java/android/security/keystore2/AndroidKeyStoreXDHPublicKey.java
index 9f3df3d..6913834 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreXDHPublicKey.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreXDHPublicKey.java
@@ -88,7 +88,7 @@
getUserKeyDescriptor(),
getKeyIdDescriptor().nspace,
getAuthorizations(),
- "x25519",
+ "XDH",
getSecurityLevel());
}
diff --git a/keystore/java/android/security/keystore2/KeymasterUtils.java b/keystore/java/android/security/keystore2/KeymasterUtils.java
index de4696c..614e368 100644
--- a/keystore/java/android/security/keystore2/KeymasterUtils.java
+++ b/keystore/java/android/security/keystore2/KeymasterUtils.java
@@ -20,7 +20,12 @@
import android.security.keymaster.KeymasterDefs;
import android.security.keystore.KeyProperties;
+import java.security.AlgorithmParameters;
+import java.security.NoSuchAlgorithmException;
import java.security.ProviderException;
+import java.security.spec.ECGenParameterSpec;
+import java.security.spec.ECParameterSpec;
+import java.security.spec.InvalidParameterSpecException;
/**
* @hide
@@ -121,4 +126,65 @@
break;
}
}
+
+ static String getEcCurveFromKeymaster(int ecCurve) {
+ switch (ecCurve) {
+ case android.hardware.security.keymint.EcCurve.P_224:
+ return "secp224r1";
+ case android.hardware.security.keymint.EcCurve.P_256:
+ return "secp256r1";
+ case android.hardware.security.keymint.EcCurve.P_384:
+ return "secp384r1";
+ case android.hardware.security.keymint.EcCurve.P_521:
+ return "secp521r1";
+ }
+ return "";
+ }
+
+ static int getKeymasterEcCurve(String ecCurveName) {
+ if (ecCurveName.equals("secp224r1")) {
+ return android.hardware.security.keymint.EcCurve.P_224;
+ } else if (ecCurveName.equals("secp256r1")) {
+ return android.hardware.security.keymint.EcCurve.P_256;
+ } else if (ecCurveName.equals("secp384r1")) {
+ return android.hardware.security.keymint.EcCurve.P_384;
+ } else if (ecCurveName.equals("secp521r1")) {
+ return android.hardware.security.keymint.EcCurve.P_521;
+ }
+ return -1;
+ }
+
+ static ECParameterSpec getCurveSpec(String name)
+ throws NoSuchAlgorithmException, InvalidParameterSpecException {
+ AlgorithmParameters parameters = AlgorithmParameters.getInstance("EC");
+ parameters.init(new ECGenParameterSpec(name));
+ return parameters.getParameterSpec(ECParameterSpec.class);
+ }
+
+ static String getCurveName(ECParameterSpec spec) {
+ if (KeymasterUtils.isECParameterSpecOfCurve(spec, "secp224r1")) {
+ return "secp224r1";
+ } else if (KeymasterUtils.isECParameterSpecOfCurve(spec, "secp256r1")) {
+ return "secp256r1";
+ } else if (KeymasterUtils.isECParameterSpecOfCurve(spec, "secp384r1")) {
+ return "secp384r1";
+ } else if (KeymasterUtils.isECParameterSpecOfCurve(spec, "secp521r1")) {
+ return "secp521r1";
+ }
+ return null;
+ }
+
+ private static boolean isECParameterSpecOfCurve(ECParameterSpec spec, String curveName) {
+ try {
+ ECParameterSpec curveSpec = KeymasterUtils.getCurveSpec(curveName);
+ if (curveSpec.getCurve().equals(spec.getCurve())
+ && curveSpec.getOrder().equals(spec.getOrder())
+ && curveSpec.getGenerator().equals(spec.getGenerator())) {
+ return true;
+ }
+ } catch (NoSuchAlgorithmException | InvalidParameterSpecException e) {
+ return false;
+ }
+ return false;
+ }
}
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index 136fc6c..400829e 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -580,7 +580,7 @@
// Retrieve the package group from the package id of the resource id.
if (UNLIKELY(!is_valid_resid(resid))) {
- LOG(ERROR) << base::StringPrintf("Invalid ID 0x%08x.", resid);
+ LOG(ERROR) << base::StringPrintf("Invalid resource ID 0x%08x.", resid);
return base::unexpected(std::nullopt);
}
@@ -589,7 +589,7 @@
const uint16_t entry_idx = get_entry_id(resid);
uint8_t package_idx = package_ids_[package_id];
if (UNLIKELY(package_idx == 0xff)) {
- ANDROID_LOG(ERROR) << base::StringPrintf("No package ID %02x found for ID 0x%08x.",
+ ANDROID_LOG(ERROR) << base::StringPrintf("No package ID %02x found for resource ID 0x%08x.",
package_id, resid);
return base::unexpected(std::nullopt);
}
diff --git a/native/android/Android.bp b/native/android/Android.bp
index 8594ba5..f1b1d79 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -34,6 +34,7 @@
cc_defaults {
name: "libandroid_defaults",
+ cpp_std: "gnu++20",
cflags: [
"-Wall",
"-Werror",
diff --git a/native/android/system_fonts.cpp b/native/android/system_fonts.cpp
index 9fe7929..8e90a65 100644
--- a/native/android/system_fonts.cpp
+++ b/native/android/system_fonts.cpp
@@ -66,9 +66,6 @@
return mFilePath == o.mFilePath && mLocale == o.mLocale && mWeight == o.mWeight &&
mItalic == o.mItalic && mCollectionIndex == o.mCollectionIndex && mAxes == o.mAxes;
}
-
- AFont() = default;
- AFont(const AFont&) = default;
};
struct FontHasher {
diff --git a/services/OWNERS b/services/OWNERS
index 495c0737..eace906 100644
--- a/services/OWNERS
+++ b/services/OWNERS
@@ -3,7 +3,7 @@
# art-team@ manages the system server profile
per-file art-profile* = calin@google.com, ngeoffray@google.com, vmarko@google.com
-per-file java/com/android/server/* = toddke@google.com,patb@google.com
+per-file java/com/android/server/* = patb@google.com #{LAST_RESORT_SUGGESTION}
per-file tests/servicestests/src/com/android/server/systemconfig/* = patb@google.com
per-file proguard.flags = jdduke@google.com
diff --git a/services/core/java/com/android/server/BootReceiver.java b/services/core/java/com/android/server/BootReceiver.java
index 85f1e0a..7e6350f 100644
--- a/services/core/java/com/android/server/BootReceiver.java
+++ b/services/core/java/com/android/server/BootReceiver.java
@@ -341,7 +341,8 @@
// non-proto tombstones, even though proto tombstones do not support including the counter
// of events dropped since rate limiting activated yet.
DropboxRateLimiter.RateLimitResult rateLimitResult =
- sDropboxRateLimiter.shouldRateLimit(TAG_TOMBSTONE, processName);
+ sDropboxRateLimiter.shouldRateLimit(
+ proto ? TAG_TOMBSTONE_PROTO : TAG_TOMBSTONE, processName);
if (rateLimitResult.shouldRateLimit()) return;
HashMap<String, Long> timestamps = readTimestamps();
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index 7da5f51..3816b07 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -3837,13 +3837,20 @@
&& !pkgSetting.getPathString().equals(parsedPackage.getPath());
final boolean newPkgVersionGreater = pkgAlreadyExists
&& parsedPackage.getLongVersionCode() > pkgSetting.getVersionCode();
+ final boolean newSharedUserSetting = pkgAlreadyExists
+ && (initialScanRequest.mOldSharedUserSetting
+ != initialScanRequest.mSharedUserSetting);
final boolean isSystemPkgBetter = scanSystemPartition && isSystemPkgUpdated
- && newPkgChangedPaths && newPkgVersionGreater;
+ && newPkgChangedPaths && (newPkgVersionGreater || newSharedUserSetting);
if (isSystemPkgBetter) {
// The version of the application on /system is greater than the version on
// /data. Switch back to the application on /system.
// It's safe to assume the application on /system will correctly scan. If not,
// there won't be a working copy of the application.
+ // Also, if the sharedUserSetting of the application on /system is different
+ // from the sharedUserSetting on /data, switch back to the application on /system.
+ // We should trust the sharedUserSetting on /system, even if the application
+ // version on /system is smaller than the version on /data.
synchronized (mPm.mLock) {
// just remove the loaded entries from package lists
mPm.mPackages.remove(pkgSetting.getPackageName());
diff --git a/services/tests/servicestests/src/com/android/server/companion/virtual/OWNERS b/services/tests/servicestests/src/com/android/server/companion/virtual/OWNERS
new file mode 100644
index 0000000..2968104
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/companion/virtual/OWNERS
@@ -0,0 +1 @@
+include /services/companion/java/com/android/server/companion/virtual/OWNERS
diff --git a/startop/view_compiler/TEST_MAPPING b/startop/view_compiler/TEST_MAPPING
deleted file mode 100644
index 791e471..0000000
--- a/startop/view_compiler/TEST_MAPPING
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "presubmit": [
- {
- "name": "dex-builder-test"
- },
- {
- "name": "CtsViewTestCases",
- "options": [
- {
- "include-filter": "android.view.cts.PrecompiledLayoutTest"
- }
- ]
- }
- ]
-}