Merge "NetworkStats: Avoid Division By 0"
diff --git a/OWNERS b/OWNERS
index 03cfac9..ab5bd18 100644
--- a/OWNERS
+++ b/OWNERS
@@ -23,6 +23,9 @@
# via https://android.git.corp.google.com/All-Projects/+/refs/meta/config/rules.pl.
per-file */api/*current.txt = *
+# Test mapping changes can be made by anyone
+per-file */TEST_MAPPING = *
+
# Support bulk translation updates
per-file */res*/values*/*.xml = byi@google.com, delphij@google.com
diff --git a/TestProtoLibraries.bp b/TestProtoLibraries.bp
index 513d45f..afc11bb 100644
--- a/TestProtoLibraries.bp
+++ b/TestProtoLibraries.bp
@@ -30,6 +30,6 @@
type: "full",
},
errorprone: {
- javacflags: ["-Xep:MissingOverride:OFF"], // b/72714520
+ enabled: false,
},
}
diff --git a/apex/media/OWNERS b/apex/media/OWNERS
index ced2fb5..73f02d3 100644
--- a/apex/media/OWNERS
+++ b/apex/media/OWNERS
@@ -1,10 +1,10 @@
-andrewlewis@google.com
-aquilescanta@google.com
-chz@google.com
+# Bug component: 1344
hdmoon@google.com
hkuang@google.com
jinpark@google.com
klhyun@google.com
lnilsson@google.com
-marcone@google.com
sungsoo@google.com
+
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
diff --git a/cmds/idmap2/tests/Idmap2BinaryTests.cpp b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
index e7e9e4c..a1206f9 100644
--- a/cmds/idmap2/tests/Idmap2BinaryTests.cpp
+++ b/cmds/idmap2/tests/Idmap2BinaryTests.cpp
@@ -93,7 +93,7 @@
"--idmap-path", GetIdmapPath()});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
struct stat st;
ASSERT_EQ(stat(GetIdmapPath().c_str(), &st), 0);
@@ -119,7 +119,7 @@
"--idmap-path", GetIdmapPath()});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
// clang-format off
result = ExecuteBinary({"idmap2",
@@ -127,14 +127,14 @@
"--idmap-path", GetIdmapPath()});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
- ASSERT_NE(result->stdout.find(R::target::integer::literal::int1 + " -> 0x7f010000"),
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+ ASSERT_NE(result->stdout_str.find(R::target::integer::literal::int1 + " -> 0x7f010000"),
std::string::npos);
- ASSERT_NE(result->stdout.find(R::target::string::literal::str1 + " -> 0x7f020000"),
+ ASSERT_NE(result->stdout_str.find(R::target::string::literal::str1 + " -> 0x7f020000"),
std::string::npos);
- ASSERT_NE(result->stdout.find(R::target::string::literal::str3 + " -> 0x7f020001"),
+ ASSERT_NE(result->stdout_str.find(R::target::string::literal::str3 + " -> 0x7f020001"),
std::string::npos);
- ASSERT_NE(result->stdout.find(R::target::string::literal::str4 + " -> 0x7f020002"),
+ ASSERT_NE(result->stdout_str.find(R::target::string::literal::str4 + " -> 0x7f020002"),
std::string::npos);
// clang-format off
@@ -144,8 +144,8 @@
"--idmap-path", GetIdmapPath()});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
- ASSERT_NE(result->stdout.find("00000000: 504d4449 magic"), std::string::npos);
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+ ASSERT_NE(result->stdout_str.find("00000000: 504d4449 magic"), std::string::npos);
// clang-format off
result = ExecuteBinary({"idmap2",
@@ -170,7 +170,7 @@
"--idmap-path", GetIdmapPath()});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
// clang-format off
result = ExecuteBinary({"idmap2",
@@ -180,9 +180,9 @@
"--resid", R::target::string::literal::str1});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
- ASSERT_NE(result->stdout.find("overlay-1"), std::string::npos);
- ASSERT_EQ(result->stdout.find("overlay-1-sv"), std::string::npos);
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+ ASSERT_NE(result->stdout_str.find("overlay-1"), std::string::npos);
+ ASSERT_EQ(result->stdout_str.find("overlay-1-sv"), std::string::npos);
// clang-format off
result = ExecuteBinary({"idmap2",
@@ -192,9 +192,9 @@
"--resid", "test.target:string/str1"});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
- ASSERT_NE(result->stdout.find("overlay-1"), std::string::npos);
- ASSERT_EQ(result->stdout.find("overlay-1-sv"), std::string::npos);
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+ ASSERT_NE(result->stdout_str.find("overlay-1"), std::string::npos);
+ ASSERT_EQ(result->stdout_str.find("overlay-1-sv"), std::string::npos);
// clang-format off
result = ExecuteBinary({"idmap2",
@@ -204,8 +204,8 @@
"--resid", "test.target:string/str1"});
// clang-format on
ASSERT_THAT(result, NotNull());
- ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr;
- ASSERT_NE(result->stdout.find("overlay-1-sv"), std::string::npos);
+ ASSERT_EQ(result->status, EXIT_SUCCESS) << result->stderr_str;
+ ASSERT_NE(result->stdout_str.find("overlay-1-sv"), std::string::npos);
unlink(GetIdmapPath().c_str());
}
diff --git a/core/api/current.txt b/core/api/current.txt
index 64976fa..bc61d15 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -8756,6 +8756,7 @@
field public static final int GATT_CONNECTION_CONGESTED = 143; // 0x8f
field public static final int GATT_FAILURE = 257; // 0x101
field public static final int GATT_INSUFFICIENT_AUTHENTICATION = 5; // 0x5
+ field public static final int GATT_INSUFFICIENT_AUTHORIZATION = 8; // 0x8
field public static final int GATT_INSUFFICIENT_ENCRYPTION = 15; // 0xf
field public static final int GATT_INVALID_ATTRIBUTE_LENGTH = 13; // 0xd
field public static final int GATT_INVALID_OFFSET = 7; // 0x7
@@ -9082,6 +9083,7 @@
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionState(android.bluetooth.BluetoothDevice);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public java.util.List<android.bluetooth.BluetoothDevice> getDevicesMatchingConnectionStates(int[]);
field public static final int A2DP = 2; // 0x2
+ field public static final int CSIP_SET_COORDINATOR = 25; // 0x19
field public static final String EXTRA_PREVIOUS_STATE = "android.bluetooth.profile.extra.PREVIOUS_STATE";
field public static final String EXTRA_STATE = "android.bluetooth.profile.extra.STATE";
field public static final int GATT = 7; // 0x7
@@ -30328,6 +30330,7 @@
method public void close();
method @NonNull public static android.os.SharedMemory create(@Nullable String, int) throws android.system.ErrnoException;
method public int describeContents();
+ method @NonNull public static android.os.SharedMemory fromFileDescriptor(@NonNull android.os.ParcelFileDescriptor);
method public int getSize();
method @NonNull public java.nio.ByteBuffer map(int, int, int) throws android.system.ErrnoException;
method @NonNull public java.nio.ByteBuffer mapReadOnly() throws android.system.ErrnoException;
@@ -38093,6 +38096,7 @@
method public final void cancelCall();
method @Nullable public final android.os.IBinder onBind(@NonNull android.content.Intent);
method public abstract void onPlaceCall(@NonNull android.net.Uri, @NonNull android.telecom.PhoneAccountHandle, boolean);
+ method public void onRedirectionTimeout();
method public final boolean onUnbind(@NonNull android.content.Intent);
method public final void placeCallUnmodified();
method public final void redirectCall(@NonNull android.net.Uri, @NonNull android.telecom.PhoneAccountHandle, boolean);
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index bfa5a7b..66d6124 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -132,6 +132,11 @@
field public static final int VPN_UID = 1016; // 0x3f8
}
+ public final class ServiceManager {
+ method public static boolean isDeclared(@NonNull String);
+ method @Nullable public static android.os.IBinder waitForDeclaredService(@NonNull String);
+ }
+
public class StatsServiceManager {
method @NonNull public android.os.StatsServiceManager.ServiceRegisterer getStatsCompanionServiceRegisterer();
method @NonNull public android.os.StatsServiceManager.ServiceRegisterer getStatsManagerServiceRegisterer();
@@ -155,6 +160,11 @@
method public static int getNumSignalStrengthLevels();
}
+ public class SubscriptionManager {
+ method public void addSubscriptionInfoRecord(@NonNull String, @Nullable String, int, int);
+ method public void removeSubscriptionInfoRecord(@NonNull String, int);
+ }
+
public class TelephonyManager {
method @NonNull public static int[] getAllNetworkTypes();
}
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index efde6f1..385c407 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -1510,6 +1510,7 @@
public final class BluetoothDevice implements android.os.Parcelable {
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean cancelBondProcess();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean createBondOutOfBand(int, @Nullable android.bluetooth.OobData, @Nullable android.bluetooth.OobData);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean fetchUuidsWithSdp(int);
method @Nullable @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public byte[] getMetadata(int);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getSimAccessPermission();
method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isConnected();
@@ -1643,7 +1644,9 @@
field @NonNull public static final android.os.ParcelUuid AVRCP_TARGET;
field @NonNull public static final android.os.ParcelUuid BASE_UUID;
field @NonNull public static final android.os.ParcelUuid BNEP;
+ field @NonNull public static final android.os.ParcelUuid COORDINATED_SET;
field @NonNull public static final android.os.ParcelUuid DIP;
+ field @NonNull public static final android.os.ParcelUuid GENERIC_MEDIA_CONTROL;
field @NonNull public static final android.os.ParcelUuid HEARING_AID;
field @NonNull public static final android.os.ParcelUuid HFP;
field @NonNull public static final android.os.ParcelUuid HFP_AG;
@@ -1654,6 +1657,7 @@
field @NonNull public static final android.os.ParcelUuid LE_AUDIO;
field @NonNull public static final android.os.ParcelUuid MAP;
field @NonNull public static final android.os.ParcelUuid MAS;
+ field @NonNull public static final android.os.ParcelUuid MEDIA_CONTROL;
field @NonNull public static final android.os.ParcelUuid MNS;
field @NonNull public static final android.os.ParcelUuid NAP;
field @NonNull public static final android.os.ParcelUuid OBEX_OBJECT_PUSH;
@@ -7766,6 +7770,7 @@
field public static final String NAMESPACE_GAME_DRIVER = "game_driver";
field public static final String NAMESPACE_INPUT_NATIVE_BOOT = "input_native_boot";
field public static final String NAMESPACE_INTELLIGENCE_ATTENTION = "intelligence_attention";
+ field public static final String NAMESPACE_LMKD_NATIVE = "lmkd_native";
field public static final String NAMESPACE_MEDIA_NATIVE = "media_native";
field public static final String NAMESPACE_NETD_NATIVE = "netd_native";
field public static final String NAMESPACE_OTA = "ota";
diff --git a/core/java/Android.bp b/core/java/Android.bp
index 7ad5e05..eee696b 100644
--- a/core/java/Android.bp
+++ b/core/java/Android.bp
@@ -285,6 +285,23 @@
},
}
+aidl_interface {
+ name: "android.debug_aidl",
+ unstable: true,
+ srcs: [
+ "android/debug/AdbTransportType.aidl",
+ "android/debug/FingerprintAndPairDevice.aidl",
+ "android/debug/IAdbCallback.aidl",
+ "android/debug/IAdbManager.aidl",
+ "android/debug/PairDevice.aidl",
+ ],
+ backend: {
+ cpp: {
+ enabled: true,
+ },
+ },
+}
+
// Avoid including Parcelable classes as we don't want to have two copies of
// Parcelable cross the libraries. This is used by telephony-common (frameworks/opt/telephony)
// and TeleService app (packages/services/Telephony).
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index ce68e08..fb9ef53 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -105,12 +105,15 @@
String statusToken);
/* Returns Map<String, Integer> from package name to visibility with all values stored for given account */
+ @SuppressWarnings(value = {"untyped-collection"})
Map getPackagesAndVisibilityForAccount(in Account account);
+ @SuppressWarnings(value = {"untyped-collection"})
boolean addAccountExplicitlyWithVisibility(in Account account, String password, in Bundle extras,
in Map visibility);
boolean setAccountVisibility(in Account a, in String packageName, int newVisibility);
int getAccountVisibility(in Account a, in String packageName);
/* Type may be null returns Map <Account, Integer>*/
+ @SuppressWarnings(value = {"untyped-collection"})
Map getAccountsAndVisibilityForPackage(in String packageName, in String accountType);
void registerAccountListener(in String[] accountTypes, String opPackageName);
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 3ad8b4b..d28e489 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -223,14 +223,14 @@
void addCrossProfileIntentFilter(in ComponentName admin, in IntentFilter filter, int flags);
void clearCrossProfileIntentFilters(in ComponentName admin);
- boolean setPermittedAccessibilityServices(in ComponentName admin,in List packageList);
- List getPermittedAccessibilityServices(in ComponentName admin);
- List getPermittedAccessibilityServicesForUser(int userId);
+ boolean setPermittedAccessibilityServices(in ComponentName admin,in List<String> packageList);
+ List<String> getPermittedAccessibilityServices(in ComponentName admin);
+ List<String> getPermittedAccessibilityServicesForUser(int userId);
boolean isAccessibilityServicePermittedByAdmin(in ComponentName admin, String packageName, int userId);
- boolean setPermittedInputMethods(in ComponentName admin,in List packageList);
- List getPermittedInputMethods(in ComponentName admin);
- List getPermittedInputMethodsForCurrentUser();
+ boolean setPermittedInputMethods(in ComponentName admin,in List<String> packageList);
+ List<String> getPermittedInputMethods(in ComponentName admin);
+ List<String> getPermittedInputMethodsForCurrentUser();
boolean isInputMethodPermittedByAdmin(in ComponentName admin, String packageName, int userId);
boolean setPermittedCrossProfileNotificationListeners(in ComponentName admin, in List<String> packageList);
diff --git a/core/java/android/app/usage/UsageStats.java b/core/java/android/app/usage/UsageStats.java
index 4d73a61..6d777cf 100644
--- a/core/java/android/app/usage/UsageStats.java
+++ b/core/java/android/app/usage/UsageStats.java
@@ -171,9 +171,9 @@
mLaunchCount = stats.mLaunchCount;
mAppLaunchCount = stats.mAppLaunchCount;
mLastEvent = stats.mLastEvent;
- mActivities = stats.mActivities;
- mForegroundServices = stats.mForegroundServices;
- mChooserCounts = stats.mChooserCounts;
+ mActivities = stats.mActivities.clone();
+ mForegroundServices = new ArrayMap<>(stats.mForegroundServices);
+ mChooserCounts = new ArrayMap<>(stats.mChooserCounts);
}
/**
diff --git a/core/java/android/bluetooth/BluetoothA2dp.java b/core/java/android/bluetooth/BluetoothA2dp.java
index 16413e1..4dcb3dc 100644
--- a/core/java/android/bluetooth/BluetoothA2dp.java
+++ b/core/java/android/bluetooth/BluetoothA2dp.java
@@ -946,6 +946,10 @@
public boolean setBufferLengthMillis(@BluetoothCodecConfig.SourceCodecType int codec,
int value) {
if (VDBG) log("setBufferLengthMillis(" + codec + ", " + value + ")");
+ if (value < 0) {
+ Log.e(TAG, "Trying to set audio buffer length to a negative value: " + value);
+ return false;
+ }
try {
final IBluetoothA2dp service = getService();
if (service != null && isEnabled()) {
diff --git a/core/java/android/bluetooth/BluetoothDevice.java b/core/java/android/bluetooth/BluetoothDevice.java
index 0969ec2..38fb90d 100644
--- a/core/java/android/bluetooth/BluetoothDevice.java
+++ b/core/java/android/bluetooth/BluetoothDevice.java
@@ -1622,13 +1622,38 @@
*/
@RequiresPermission(Manifest.permission.BLUETOOTH)
public boolean fetchUuidsWithSdp() {
+ return fetchUuidsWithSdp(TRANSPORT_AUTO);
+ }
+
+ /**
+ * Perform a service discovery on the remote device to get the UUIDs supported with the
+ * specific transport.
+ *
+ * <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 or GATT 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. If there is an ongoing bonding
+ * process, service discovery or device inquiry, the request will be queued.
+ *
+ * @param transport - provide type of transport (e.g. LE or Classic).
+ * @return False if the check fails, True if the process of initiating an ACL connection
+ * to the remote device was started or cached UUIDs will be broadcast with the specific
+ * transport.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.BLUETOOTH_PRIVILEGED)
+ public boolean fetchUuidsWithSdp(@Transport int transport) {
final IBluetooth service = sService;
if (service == null || !isBluetoothEnabled()) {
Log.e(TAG, "BT not enabled. Cannot fetchUuidsWithSdp");
return false;
}
try {
- return service.fetchRemoteUuids(this);
+ return service.fetchRemoteUuids(this, transport);
} catch (RemoteException e) {
Log.e(TAG, "", e);
}
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index b3a7c88..b3ccdd0 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -101,6 +101,9 @@
/** A read or write operation was requested with an invalid offset */
public static final int GATT_INVALID_OFFSET = 0x7;
+ /** Insufficient authorization for a given operation */
+ public static final int GATT_INSUFFICIENT_AUTHORIZATION = 0x8;
+
/** A write operation exceeds the maximum length of the attribute */
public static final int GATT_INVALID_ATTRIBUTE_LENGTH = 0xd;
diff --git a/core/java/android/bluetooth/BluetoothProfile.java b/core/java/android/bluetooth/BluetoothProfile.java
index b76d6b8..c4649b4 100644
--- a/core/java/android/bluetooth/BluetoothProfile.java
+++ b/core/java/android/bluetooth/BluetoothProfile.java
@@ -222,12 +222,25 @@
int VOLUME_CONTROL = 23;
/**
+ * @hide
+ * Media Control Profile server
+ *
+ */
+ int MCP_SERVER = 24;
+
+ /**
+ * Coordinated Set Identification Profile set coordinator
+ *
+ */
+ int CSIP_SET_COORDINATOR = 25;
+
+ /**
* Max profile ID. This value should be updated whenever a new profile is added to match
* the largest value assigned to a profile.
*
* @hide
*/
- int MAX_PROFILE_ID = 23;
+ int MAX_PROFILE_ID = 25;
/**
* Default priority for devices that we try to auto-connect to and
diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java
index d82cf19..7e4ee9e8 100644
--- a/core/java/android/bluetooth/BluetoothUuid.java
+++ b/core/java/android/bluetooth/BluetoothUuid.java
@@ -172,6 +172,21 @@
/** @hide */
@NonNull
@SystemApi
+ public static final ParcelUuid GENERIC_MEDIA_CONTROL =
+ ParcelUuid.fromString("00001849-0000-1000-8000-00805F9B34FB");
+ /** @hide */
+ @NonNull
+ @SystemApi
+ public static final ParcelUuid MEDIA_CONTROL =
+ ParcelUuid.fromString("00001848-0000-1000-8000-00805F9B34FB");
+ /** @hide */
+ @NonNull
+ @SystemApi
+ public static final ParcelUuid COORDINATED_SET =
+ ParcelUuid.fromString("00001846-0000-1000-8000-00805F9B34FB");
+ /** @hide */
+ @NonNull
+ @SystemApi
public static final ParcelUuid BASE_UUID =
ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB");
diff --git a/core/java/android/content/OWNERS b/core/java/android/content/OWNERS
index 8ad1349..c7f92c9 100644
--- a/core/java/android/content/OWNERS
+++ b/core/java/android/content/OWNERS
@@ -1,12 +1,14 @@
# Remain no owner because multiple modules may touch this file.
per-file Context.java = *
per-file ContextWrapper.java = *
-per-file Content* = varunshah@google.com, omakoto@google.com, jsharkey@google.com
+per-file Content* = file:/services/core/java/com/android/server/am/OWNERS
per-file IntentFilter.java = toddke@google.com
per-file IntentFilter.java = patb@google.com
+per-file IntentFilter.java = file:/services/core/java/com/android/server/am/OWNERS
per-file Intent.java = toddke@google.com
per-file Intent.java = patb@google.com
per-file Intent.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file Intent.java = file:/services/core/java/com/android/server/am/OWNERS
per-file AutofillOptions* = file:/core/java/android/service/autofill/OWNERS
per-file ContentCaptureOptions* = file:/core/java/android/service/contentcapture/OWNERS
per-file LocusId* = file:/core/java/android/service/contentcapture/OWNERS
diff --git a/core/java/android/content/om/IOverlayManager.aidl b/core/java/android/content/om/IOverlayManager.aidl
index 0b950b4..11ea16f 100644
--- a/core/java/android/content/om/IOverlayManager.aidl
+++ b/core/java/android/content/om/IOverlayManager.aidl
@@ -39,7 +39,7 @@
* requested user, an empty map is returned.
*/
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
- Map getAllOverlays(in int userId);
+ Map<String, List<OverlayInfo>> getAllOverlays(in int userId);
/**
* Returns information about all overlays for the given target package for
@@ -51,7 +51,7 @@
* @return A list of OverlayInfo objects; if no overlays exist for the
* requested package, an empty list is returned.
*/
- List getOverlayInfosForTarget(in String targetPackageName, in int userId);
+ List<OverlayInfo> getOverlayInfosForTarget(in String targetPackageName, in int userId);
/**
* Returns information about the overlay with the given package name for the
diff --git a/core/java/android/debug/FingerprintAndPairDevice.aidl b/core/java/android/debug/FingerprintAndPairDevice.aidl
new file mode 100644
index 0000000..b439e14
--- /dev/null
+++ b/core/java/android/debug/FingerprintAndPairDevice.aidl
@@ -0,0 +1,28 @@
+/*
+ * 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 android.debug;
+
+import android.debug.PairDevice;
+
+/**
+ * @see {@link android.debug.IAdbManager#getPairedDevices()}
+ * @hide
+ */
+parcelable FingerprintAndPairDevice {
+ String keyFingerprint;
+ PairDevice device;
+}
\ No newline at end of file
diff --git a/core/java/android/debug/IAdbCallback.aidl b/core/java/android/debug/IAdbCallback.aidl
new file mode 100644
index 0000000..9c8f1cf
--- /dev/null
+++ b/core/java/android/debug/IAdbCallback.aidl
@@ -0,0 +1,31 @@
+/*
+ * 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 android.debug;
+
+import android.debug.AdbTransportType;
+
+/**
+ * Callback interface of {@link android.debug.IAdbCallbackManager}.
+ *
+ * @hide
+ */
+oneway interface IAdbCallback {
+ /**
+ * On debugging enabled, service providing IAdbManager calls this function.
+ */
+ void onDebuggingChanged(boolean enabled, AdbTransportType type);
+}
diff --git a/core/java/android/debug/IAdbManager.aidl b/core/java/android/debug/IAdbManager.aidl
index aea7633..314c405 100644
--- a/core/java/android/debug/IAdbManager.aidl
+++ b/core/java/android/debug/IAdbManager.aidl
@@ -16,6 +16,9 @@
package android.debug;
+import android.debug.FingerprintAndPairDevice;
+import android.debug.IAdbCallback;
+
/**
* Interface to communicate remotely with the {@code AdbService} in the system server.
*
@@ -58,9 +61,10 @@
void denyWirelessDebugging();
/**
- * Returns a Map<String, PairDevice> with the key fingerprint mapped to the device information.
+ * Returns an array of NamedPairDevice with the key fingerprint mapped to the device
+ * information.
*/
- Map getPairedDevices();
+ FingerprintAndPairDevice[] getPairedDevices();
/**
* Unpair the device identified by the key fingerprint it uses.
@@ -108,4 +112,14 @@
* QR code.
*/
boolean isAdbWifiQrSupported();
+
+ /**
+ * Register callback for ADB debugging changed notification.
+ */
+ void registerCallback(IAdbCallback callback);
+
+ /**
+ * Unregister callback for ADB debugging changed notification.
+ */
+ void unregisterCallback(IAdbCallback callback);
}
diff --git a/core/java/android/hardware/biometrics/OWNERS b/core/java/android/hardware/biometrics/OWNERS
index 2065ffa..0b4d9d9 100644
--- a/core/java/android/hardware/biometrics/OWNERS
+++ b/core/java/android/hardware/biometrics/OWNERS
@@ -1,8 +1,3 @@
# Bug component: 879035
-curtislb@google.com
-ilyamaty@google.com
-jaggies@google.com
-joshmccloskey@google.com
-kchyn@google.com
-
+include /services/core/java/com/android/server/biometrics/OWNERS
diff --git a/core/java/android/hardware/radio/ITuner.aidl b/core/java/android/hardware/radio/ITuner.aidl
index 429f1f3..7bf234b 100644
--- a/core/java/android/hardware/radio/ITuner.aidl
+++ b/core/java/android/hardware/radio/ITuner.aidl
@@ -80,14 +80,14 @@
void setConfigFlag(int flag, boolean value);
/**
- * @param parameters Vendor-specific key-value pairs, must be Map<String, String>
- * @return Vendor-specific key-value pairs, must be Map<String, String>
+ * @param parameters Vendor-specific key-value pairs
+ * @return Vendor-specific key-value pairs
*/
- Map setParameters(in Map parameters);
+ Map<String, String> setParameters(in Map<String, String> parameters);
/**
* @param keys Parameter keys to fetch
- * @return Vendor-specific key-value pairs, must be Map<String, String>
+ * @return Vendor-specific key-value pairs
*/
- Map getParameters(in List<String> keys);
+ Map<String, String> getParameters(in List<String> keys);
}
diff --git a/core/java/android/hardware/radio/ITunerCallback.aidl b/core/java/android/hardware/radio/ITunerCallback.aidl
index b32daa5..f98947b 100644
--- a/core/java/android/hardware/radio/ITunerCallback.aidl
+++ b/core/java/android/hardware/radio/ITunerCallback.aidl
@@ -36,7 +36,7 @@
void onProgramListUpdated(in ProgramList.Chunk chunk);
/**
- * @param parameters Vendor-specific key-value pairs, must be Map<String, String>
+ * @param parameters Vendor-specific key-value pairs
*/
- void onParametersUpdated(in Map parameters);
+ void onParametersUpdated(in Map<String, String> parameters);
}
diff --git a/core/java/android/hardware/radio/TunerCallbackAdapter.java b/core/java/android/hardware/radio/TunerCallbackAdapter.java
index beff0f7..e3f7001 100644
--- a/core/java/android/hardware/radio/TunerCallbackAdapter.java
+++ b/core/java/android/hardware/radio/TunerCallbackAdapter.java
@@ -220,7 +220,7 @@
}
@Override
- public void onParametersUpdated(Map parameters) {
+ public void onParametersUpdated(Map<String, String> parameters) {
mHandler.post(() -> mCallback.onParametersUpdated(parameters));
}
}
diff --git a/core/java/android/net/PacProxyManager.java b/core/java/android/net/PacProxyManager.java
index 8f7ad8c..da79634 100644
--- a/core/java/android/net/PacProxyManager.java
+++ b/core/java/android/net/PacProxyManager.java
@@ -94,7 +94,7 @@
}
/**
- * Updates the PAC Proxy Installer with current Proxy information.
+ * Updates the PAC Proxy Service with current Proxy information.
*/
@RequiresPermission(anyOf = {
android.Manifest.permission.NETWORK_STACK,
diff --git a/core/java/android/os/BaseBundle.java b/core/java/android/os/BaseBundle.java
index 1692921f..6da02f5 100644
--- a/core/java/android/os/BaseBundle.java
+++ b/core/java/android/os/BaseBundle.java
@@ -31,6 +31,7 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Set;
+import java.util.function.Supplier;
/**
* A mapping from String keys to values of various types. In most cases, you
@@ -38,7 +39,8 @@
* {@link PersistableBundle} subclass.
*/
public class BaseBundle {
- private static final String TAG = "Bundle";
+ /** @hide */
+ protected static final String TAG = "Bundle";
static final boolean DEBUG = false;
// Keep them in sync with frameworks/native/libs/binder/PersistableBundle.cpp.
@@ -95,7 +97,7 @@
Parcel mParcelledData = null;
/**
- * Whether {@link #mParcelledData} was generated by native coed or not.
+ * Whether {@link #mParcelledData} was generated by native code or not.
*/
private boolean mParcelledByNative;
@@ -198,7 +200,7 @@
if (size == 0) {
return null;
}
- Object o = mMap.valueAt(0);
+ Object o = getValueAt(0);
try {
return (String) o;
} catch (ClassCastException e) {
@@ -229,7 +231,12 @@
* using the currently assigned class loader.
*/
@UnsupportedAppUsage
- /* package */ void unparcel() {
+ final void unparcel() {
+ unparcel(/* itemwise */ false);
+ }
+
+ /** Deserializes the underlying data and each item if {@code itemwise} is true. */
+ final void unparcel(boolean itemwise) {
synchronized (this) {
final Parcel source = mParcelledData;
if (source != null) {
@@ -241,9 +248,42 @@
+ ": no parcelled data");
}
}
+ if (itemwise) {
+ for (int i = 0, n = mMap.size(); i < n; i++) {
+ // Triggers deserialization of i-th item, if needed
+ getValueAt(i);
+ }
+ }
}
}
+ /**
+ * Returns the value for key {@code key}.
+ *
+ * @hide
+ */
+ final Object getValue(String key) {
+ int i = mMap.indexOfKey(key);
+ return (i >= 0) ? getValueAt(i) : null;
+ }
+
+ /**
+ * Returns the value for a certain position in the array map.
+ *
+ * @hide
+ */
+ final Object getValueAt(int i) {
+ Object object = mMap.valueAt(i);
+ if (object instanceof Supplier<?>) {
+ Supplier<?> supplier = (Supplier<?>) object;
+ synchronized (this) {
+ object = supplier.get();
+ }
+ mMap.setValueAt(i, object);
+ }
+ return object;
+ }
+
private void initializeFromParcelLocked(@NonNull Parcel parcelledData, boolean recycleParcel,
boolean parcelledByNative) {
if (LOG_DEFUSABLE && sShouldDefuse && (mFlags & FLAG_DEFUSABLE) == 0) {
@@ -282,15 +322,8 @@
map.ensureCapacity(count);
}
try {
- if (parcelledByNative) {
- // If it was parcelled by native code, then the array map keys aren't sorted
- // by their hash codes, so use the safe (slow) one.
- parcelledData.readArrayMapSafelyInternal(map, count, mClassLoader);
- } else {
- // If parcelled by Java, we know the contents are sorted properly,
- // so we can use ArrayMap.append().
- parcelledData.readArrayMapInternal(map, count, mClassLoader);
- }
+ recycleParcel &= parcelledData.readArrayMap(map, count, !parcelledByNative,
+ /* lazy */ true, mClassLoader);
} catch (BadParcelableException e) {
if (sShouldDefuse) {
Log.w(TAG, "Failed to parse Bundle, but defusing quietly", e);
@@ -342,7 +375,7 @@
/** @hide */
ArrayMap<String, Object> getMap() {
- unparcel();
+ unparcel(/* itemwise */ true);
return mMap;
}
@@ -400,7 +433,12 @@
}
/**
- * @hide This kind-of does an equality comparison. Kind-of.
+ * Performs a loose equality check, which means there can be false negatives but if the method
+ * returns true than both objects are guaranteed to be equal.
+ *
+ * The point is that this method is a light-weight check in performance terms.
+ *
+ * @hide
*/
public boolean kindofEquals(BaseBundle other) {
if (other == null) {
@@ -415,6 +453,12 @@
} else if (isParcelled()) {
return mParcelledData.compareData(other.mParcelledData) == 0;
} else {
+ // Following semantic above of failing in case we get a serialized value vs a
+ // deserialized one, we'll compare the map. If a certain element hasn't been
+ // deserialized yet, it's a Supplier (or more specifically a LazyValue, but let's
+ // pretend we don't know that here :P), we'll use that element's equality comparison as
+ // map naturally does. That will takes care of comparing the payload if needed (see
+ // Parcel.readLazyValue() for details).
return mMap.equals(other.mMap);
}
}
@@ -453,7 +497,7 @@
final int N = fromMap.size();
mMap = new ArrayMap<>(N);
for (int i = 0; i < N; i++) {
- mMap.append(fromMap.keyAt(i), deepCopyValue(fromMap.valueAt(i)));
+ mMap.append(fromMap.keyAt(i), deepCopyValue(from.getValueAt(i)));
}
}
} else {
@@ -526,7 +570,7 @@
@Nullable
public Object get(String key) {
unparcel();
- return mMap.get(key);
+ return getValue(key);
}
/**
@@ -1001,7 +1045,7 @@
*/
char getChar(String key, char defaultValue) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return defaultValue;
}
@@ -1266,7 +1310,7 @@
@Nullable
Serializable getSerializable(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1289,7 +1333,7 @@
@Nullable
ArrayList<Integer> getIntegerArrayList(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1312,7 +1356,7 @@
@Nullable
ArrayList<String> getStringArrayList(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1335,7 +1379,7 @@
@Nullable
ArrayList<CharSequence> getCharSequenceArrayList(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1404,7 +1448,7 @@
@Nullable
short[] getShortArray(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1427,7 +1471,7 @@
@Nullable
char[] getCharArray(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1496,7 +1540,7 @@
@Nullable
float[] getFloatArray(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1585,7 +1629,7 @@
void writeToParcelInner(Parcel parcel, int flags) {
// If the parcel has a read-write helper, we can't just copy the blob, so unparcel it first.
if (parcel.hasReadWriteHelper()) {
- unparcel();
+ unparcel(/* itemwise */ true);
}
// Keep implementation in sync with writeToParcel() in
// frameworks/native/libs/binder/PersistableBundle.cpp.
@@ -1660,10 +1704,13 @@
}
if (parcel.hasReadWriteHelper()) {
- // If the parcel has a read-write helper, then we can't lazily-unparcel it, so just
- // unparcel right away.
+ // If the parcel has a read-write helper, it's better to deserialize immediately
+ // otherwise the helper would have to either maintain valid state long after the bundle
+ // had been constructed with parcel or to make sure they trigger deserialization of the
+ // bundle immediately; neither of which is obvious.
synchronized (this) {
initializeFromParcelLocked(parcel, /*recycleParcel=*/ false, isNativeBundle);
+ unparcel(/* itemwise */ true);
}
return;
}
diff --git a/core/java/android/os/Bundle.java b/core/java/android/os/Bundle.java
index 1c1f5c0..5626bde 100644
--- a/core/java/android/os/Bundle.java
+++ b/core/java/android/os/Bundle.java
@@ -330,47 +330,9 @@
// It's been unparcelled, so we need to walk the map
for (int i=mMap.size()-1; i>=0; i--) {
Object obj = mMap.valueAt(i);
- if (obj instanceof Parcelable) {
- if ((((Parcelable)obj).describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
- fdFound = true;
- break;
- }
- } else if (obj instanceof Parcelable[]) {
- Parcelable[] array = (Parcelable[]) obj;
- for (int n = array.length - 1; n >= 0; n--) {
- Parcelable p = array[n];
- if (p != null && ((p.describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
- fdFound = true;
- break;
- }
- }
- } else if (obj instanceof SparseArray) {
- SparseArray<? extends Parcelable> array =
- (SparseArray<? extends Parcelable>) obj;
- for (int n = array.size() - 1; n >= 0; n--) {
- Parcelable p = array.valueAt(n);
- if (p != null && (p.describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
- fdFound = true;
- break;
- }
- }
- } else if (obj instanceof ArrayList) {
- ArrayList array = (ArrayList) obj;
- // an ArrayList here might contain either Strings or
- // Parcelables; only look inside for Parcelables
- if (!array.isEmpty() && (array.get(0) instanceof Parcelable)) {
- for (int n = array.size() - 1; n >= 0; n--) {
- Parcelable p = (Parcelable) array.get(n);
- if (p != null && ((p.describeContents()
- & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
- fdFound = true;
- break;
- }
- }
- }
+ if (Parcel.hasFileDescriptors(obj)) {
+ fdFound = true;
+ break;
}
}
}
@@ -391,7 +353,7 @@
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public Bundle filterValues() {
- unparcel();
+ unparcel(/* itemwise */ true);
Bundle bundle = this;
if (mMap != null) {
ArrayMap<String, Object> map = mMap;
@@ -972,7 +934,7 @@
@Nullable
public Bundle getBundle(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -999,7 +961,7 @@
@Nullable
public <T extends Parcelable> T getParcelable(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1026,7 +988,7 @@
@Nullable
public Parcelable[] getParcelableArray(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1053,7 +1015,7 @@
@Nullable
public <T extends Parcelable> ArrayList<T> getParcelableArrayList(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1077,7 +1039,7 @@
@Nullable
public <T extends Parcelable> SparseArray<T> getSparseParcelableArray(@Nullable String key) {
unparcel();
- Object o = mMap.get(key);
+ Object o = getValue(key);
if (o == null) {
return null;
}
@@ -1300,7 +1262,7 @@
public void writeToParcel(Parcel parcel, int flags) {
final boolean oldAllowFds = parcel.pushAllowFds((mFlags & FLAG_ALLOW_FDS) != 0);
try {
- super.writeToParcelInner(parcel, flags);
+ writeToParcelInner(parcel, flags);
} finally {
parcel.restoreAllowFds(oldAllowFds);
}
@@ -1312,7 +1274,7 @@
* @param parcel The parcel to overwrite this bundle from.
*/
public void readFromParcel(Parcel parcel) {
- super.readFromParcelInner(parcel);
+ readFromParcelInner(parcel);
mFlags = FLAG_ALLOW_FDS;
maybePrefillHasFds();
}
diff --git a/core/java/android/os/DropBoxManager.java b/core/java/android/os/DropBoxManager.java
index fd576c9..d701676 100644
--- a/core/java/android/os/DropBoxManager.java
+++ b/core/java/android/os/DropBoxManager.java
@@ -30,6 +30,7 @@
import com.android.internal.os.IDropBoxManagerService;
+import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.Closeable;
import java.io.File;
@@ -234,7 +235,8 @@
} else {
return null;
}
- return (mFlags & IS_GZIPPED) != 0 ? new GZIPInputStream(is) : is;
+ return (mFlags & IS_GZIPPED) != 0
+ ? new GZIPInputStream(new BufferedInputStream(is)) : is;
}
public static final @android.annotation.NonNull Parcelable.Creator<Entry> CREATOR = new Parcelable.Creator() {
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 6acdcc4..575eb37 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -26,6 +26,7 @@
import android.util.ArraySet;
import android.util.ExceptionUtils;
import android.util.Log;
+import android.util.MathUtils;
import android.util.Size;
import android.util.SizeF;
import android.util.Slog;
@@ -56,7 +57,9 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
+import java.util.function.Supplier;
/**
* Container for a message (data and object references) that can
@@ -649,6 +652,65 @@
}
/**
+ * Check if the object used in {@link #readValue(ClassLoader)} / {@link #writeValue(Object)}
+ * has file descriptors.
+ *
+ * <p>For most cases, it will use the self-reported {@link Parcelable#describeContents()} method
+ * for that.
+ *
+ * @throws IllegalArgumentException if you provide any object not supported by above methods.
+ * Most notably, if you pass {@link Parcel}, this method will throw, for that check
+ * {@link Parcel#hasFileDescriptors()}
+ *
+ * @hide
+ */
+ public static boolean hasFileDescriptors(Object value) {
+ getValueType(value); // Will throw if value is not supported
+ if (value instanceof LazyValue) {
+ return ((LazyValue) value).hasFileDescriptors();
+ } else if (value instanceof Parcelable) {
+ if ((((Parcelable) value).describeContents()
+ & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
+ return true;
+ }
+ } else if (value instanceof Parcelable[]) {
+ Parcelable[] array = (Parcelable[]) value;
+ for (int n = array.length - 1; n >= 0; n--) {
+ Parcelable p = array[n];
+ if (p != null && ((p.describeContents()
+ & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
+ return true;
+ }
+ }
+ } else if (value instanceof SparseArray<?>) {
+ SparseArray<?> array = (SparseArray<?>) value;
+ for (int n = array.size() - 1; n >= 0; n--) {
+ Object object = array.valueAt(n);
+ if (object instanceof Parcelable) {
+ Parcelable p = (Parcelable) object;
+ if (p != null && (p.describeContents()
+ & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0) {
+ return true;
+ }
+ }
+ }
+ } else if (value instanceof ArrayList<?>) {
+ ArrayList<?> array = (ArrayList<?>) value;
+ for (int n = array.size() - 1; n >= 0; n--) {
+ Object object = array.get(n);
+ if (object instanceof Parcelable) {
+ Parcelable p = (Parcelable) object;
+ if (p != null && ((p.describeContents()
+ & Parcelable.CONTENTS_FILE_DESCRIPTOR) != 0)) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
* Store or read an IBinder interface token in the parcel at the current
* {@link #dataPosition}. This is used to validate that the marshalled
* transaction is intended for the target interface.
@@ -1795,108 +1857,206 @@
* should be used).</p>
*/
public final void writeValue(@Nullable Object v) {
+ if (v instanceof LazyValue) {
+ LazyValue value = (LazyValue) v;
+ value.writeToParcel(this);
+ return;
+ }
+ int type = getValueType(v);
+ writeInt(type);
+ if (isLengthPrefixed(type)) {
+ // Length
+ int length = dataPosition();
+ writeInt(-1); // Placeholder
+ // Object
+ int start = dataPosition();
+ writeValue(type, v);
+ int end = dataPosition();
+ // Backpatch length
+ setDataPosition(length);
+ writeInt(end - start);
+ setDataPosition(end);
+ } else {
+ writeValue(type, v);
+ }
+ }
+
+ /** @hide */
+ public static int getValueType(@Nullable Object v) {
if (v == null) {
- writeInt(VAL_NULL);
+ return VAL_NULL;
} else if (v instanceof String) {
- writeInt(VAL_STRING);
- writeString((String) v);
+ return VAL_STRING;
} else if (v instanceof Integer) {
- writeInt(VAL_INTEGER);
- writeInt((Integer) v);
+ return VAL_INTEGER;
} else if (v instanceof Map) {
- writeInt(VAL_MAP);
- writeMap((Map) v);
+ return VAL_MAP;
} else if (v instanceof Bundle) {
// Must be before Parcelable
- writeInt(VAL_BUNDLE);
- writeBundle((Bundle) v);
+ return VAL_BUNDLE;
} else if (v instanceof PersistableBundle) {
- writeInt(VAL_PERSISTABLEBUNDLE);
- writePersistableBundle((PersistableBundle) v);
+ // Must be before Parcelable
+ return VAL_PERSISTABLEBUNDLE;
+ } else if (v instanceof SizeF) {
+ // Must be before Parcelable
+ return VAL_SIZEF;
} else if (v instanceof Parcelable) {
// IMPOTANT: cases for classes that implement Parcelable must
- // come before the Parcelable case, so that their specific VAL_*
+ // come before the Parcelable case, so that their speci fic VAL_*
// types will be written.
- writeInt(VAL_PARCELABLE);
- writeParcelable((Parcelable) v, 0);
+ return VAL_PARCELABLE;
} else if (v instanceof Short) {
- writeInt(VAL_SHORT);
- writeInt(((Short) v).intValue());
+ return VAL_SHORT;
} else if (v instanceof Long) {
- writeInt(VAL_LONG);
- writeLong((Long) v);
+ return VAL_LONG;
} else if (v instanceof Float) {
- writeInt(VAL_FLOAT);
- writeFloat((Float) v);
+ return VAL_FLOAT;
} else if (v instanceof Double) {
- writeInt(VAL_DOUBLE);
- writeDouble((Double) v);
+ return VAL_DOUBLE;
} else if (v instanceof Boolean) {
- writeInt(VAL_BOOLEAN);
- writeInt((Boolean) v ? 1 : 0);
+ return VAL_BOOLEAN;
} else if (v instanceof CharSequence) {
// Must be after String
- writeInt(VAL_CHARSEQUENCE);
- writeCharSequence((CharSequence) v);
+ return VAL_CHARSEQUENCE;
} else if (v instanceof List) {
- writeInt(VAL_LIST);
- writeList((List) v);
+ return VAL_LIST;
} else if (v instanceof SparseArray) {
- writeInt(VAL_SPARSEARRAY);
- writeSparseArray((SparseArray) v);
+ return VAL_SPARSEARRAY;
} else if (v instanceof boolean[]) {
- writeInt(VAL_BOOLEANARRAY);
- writeBooleanArray((boolean[]) v);
+ return VAL_BOOLEANARRAY;
} else if (v instanceof byte[]) {
- writeInt(VAL_BYTEARRAY);
- writeByteArray((byte[]) v);
+ return VAL_BYTEARRAY;
} else if (v instanceof String[]) {
- writeInt(VAL_STRINGARRAY);
- writeStringArray((String[]) v);
+ return VAL_STRINGARRAY;
} else if (v instanceof CharSequence[]) {
// Must be after String[] and before Object[]
- writeInt(VAL_CHARSEQUENCEARRAY);
- writeCharSequenceArray((CharSequence[]) v);
+ return VAL_CHARSEQUENCEARRAY;
} else if (v instanceof IBinder) {
- writeInt(VAL_IBINDER);
- writeStrongBinder((IBinder) v);
+ return VAL_IBINDER;
} else if (v instanceof Parcelable[]) {
- writeInt(VAL_PARCELABLEARRAY);
- writeParcelableArray((Parcelable[]) v, 0);
+ return VAL_PARCELABLEARRAY;
} else if (v instanceof int[]) {
- writeInt(VAL_INTARRAY);
- writeIntArray((int[]) v);
+ return VAL_INTARRAY;
} else if (v instanceof long[]) {
- writeInt(VAL_LONGARRAY);
- writeLongArray((long[]) v);
+ return VAL_LONGARRAY;
} else if (v instanceof Byte) {
- writeInt(VAL_BYTE);
- writeInt((Byte) v);
+ return VAL_BYTE;
} else if (v instanceof Size) {
- writeInt(VAL_SIZE);
- writeSize((Size) v);
- } else if (v instanceof SizeF) {
- writeInt(VAL_SIZEF);
- writeSizeF((SizeF) v);
+ return VAL_SIZE;
} else if (v instanceof double[]) {
- writeInt(VAL_DOUBLEARRAY);
- writeDoubleArray((double[]) v);
+ return VAL_DOUBLEARRAY;
} else {
Class<?> clazz = v.getClass();
if (clazz.isArray() && clazz.getComponentType() == Object.class) {
// Only pure Object[] are written here, Other arrays of non-primitive types are
// handled by serialization as this does not record the component type.
- writeInt(VAL_OBJECTARRAY);
- writeArray((Object[]) v);
+ return VAL_OBJECTARRAY;
} else if (v instanceof Serializable) {
// Must be last
- writeInt(VAL_SERIALIZABLE);
- writeSerializable((Serializable) v);
+ return VAL_SERIALIZABLE;
} else {
- throw new RuntimeException("Parcel: unable to marshal value " + v);
+ throw new IllegalArgumentException("Parcel: unknown type for value " + v);
}
}
}
+ /**
+ * Writes value {@code v} in the parcel. This does NOT write the int representing the type
+ * first.
+ *
+ * @hide
+ */
+ public void writeValue(int type, @Nullable Object v) {
+ switch (type) {
+ case VAL_NULL:
+ break;
+ case VAL_STRING:
+ writeString((String) v);
+ break;
+ case VAL_INTEGER:
+ writeInt((Integer) v);
+ break;
+ case VAL_MAP:
+ writeMap((Map) v);
+ break;
+ case VAL_BUNDLE:
+ writeBundle((Bundle) v);
+ break;
+ case VAL_PERSISTABLEBUNDLE:
+ writePersistableBundle((PersistableBundle) v);
+ break;
+ case VAL_PARCELABLE:
+ writeParcelable((Parcelable) v, 0);
+ break;
+ case VAL_SHORT:
+ writeInt(((Short) v).intValue());
+ break;
+ case VAL_LONG:
+ writeLong((Long) v);
+ break;
+ case VAL_FLOAT:
+ writeFloat((Float) v);
+ break;
+ case VAL_DOUBLE:
+ writeDouble((Double) v);
+ break;
+ case VAL_BOOLEAN:
+ writeInt((Boolean) v ? 1 : 0);
+ break;
+ case VAL_CHARSEQUENCE:
+ writeCharSequence((CharSequence) v);
+ break;
+ case VAL_LIST:
+ writeList((List) v);
+ break;
+ case VAL_SPARSEARRAY:
+ writeSparseArray((SparseArray) v);
+ break;
+ case VAL_BOOLEANARRAY:
+ writeBooleanArray((boolean[]) v);
+ break;
+ case VAL_BYTEARRAY:
+ writeByteArray((byte[]) v);
+ break;
+ case VAL_STRINGARRAY:
+ writeStringArray((String[]) v);
+ break;
+ case VAL_CHARSEQUENCEARRAY:
+ writeCharSequenceArray((CharSequence[]) v);
+ break;
+ case VAL_IBINDER:
+ writeStrongBinder((IBinder) v);
+ break;
+ case VAL_PARCELABLEARRAY:
+ writeParcelableArray((Parcelable[]) v, 0);
+ break;
+ case VAL_INTARRAY:
+ writeIntArray((int[]) v);
+ break;
+ case VAL_LONGARRAY:
+ writeLongArray((long[]) v);
+ break;
+ case VAL_BYTE:
+ writeInt((Byte) v);
+ break;
+ case VAL_SIZE:
+ writeSize((Size) v);
+ break;
+ case VAL_SIZEF:
+ writeSizeF((SizeF) v);
+ break;
+ case VAL_DOUBLEARRAY:
+ writeDoubleArray((double[]) v);
+ break;
+ case VAL_OBJECTARRAY:
+ writeArray((Object[]) v);
+ break;
+ case VAL_SERIALIZABLE:
+ writeSerializable((Serializable) v);
+ break;
+ default:
+ throw new RuntimeException("Parcel: unable to marshal value " + v);
+ }
+ }
/**
* Flatten the name of the class of the Parcelable and its contents
@@ -3167,7 +3327,180 @@
@Nullable
public final Object readValue(@Nullable ClassLoader loader) {
int type = readInt();
+ final Object object;
+ if (isLengthPrefixed(type)) {
+ int length = readInt();
+ int start = dataPosition();
+ object = readValue(type, loader);
+ int actual = dataPosition() - start;
+ if (actual != length) {
+ Log.w(TAG,
+ "Unparcelling of " + object + " of type " + Parcel.valueTypeToString(type)
+ + " consumed " + actual + " bytes, but " + length + " expected.");
+ }
+ } else {
+ object = readValue(type, loader);
+ }
+ return object;
+ }
+ /**
+ * This will return a {@link Supplier} for length-prefixed types that deserializes the object
+ * when {@link Supplier#get()} is called, for other types it will return the object itself.
+ *
+ * <p>After calling {@link Supplier#get()} the parcel cursor will not change. Note that you
+ * shouldn't recycle the parcel, not at least until all objects have been retrieved. No
+ * synchronization attempts are made.
+ *
+ * </p>The supplier returned implements {@link #equals(Object)} and {@link #hashCode()}. Two
+ * suppliers are equal if either of the following is true:
+ * <ul>
+ * <li>{@link Supplier#get()} has been called on both and both objects returned are equal.
+ * <li>{@link Supplier#get()} hasn't been called on either one and everything below is true:
+ * <ul>
+ * <li>The {@code loader} parameters used to retrieve each are equal.
+ * <li>They both have the same type.
+ * <li>They have the same payload length.
+ * <li>Their binary content is the same.
+ * </ul>
+ * </ul>
+ *
+ * @hide
+ */
+ @Nullable
+ public Object readLazyValue(@Nullable ClassLoader loader) {
+ int start = dataPosition();
+ int type = readInt();
+ if (isLengthPrefixed(type)) {
+ int length = readInt();
+ setDataPosition(MathUtils.addOrThrow(dataPosition(), length));
+ return new LazyValue(this, start, length, type, loader);
+ } else {
+ return readValue(type, loader);
+ }
+ }
+
+ private static final class LazyValue implements Supplier<Object> {
+ private final int mPosition;
+ private final int mLength;
+ private final int mType;
+ @Nullable private final ClassLoader mLoader;
+ @Nullable private Parcel mSource;
+ @Nullable private Object mObject;
+ @Nullable private Parcel mValueParcel;
+
+ LazyValue(Parcel source, int position, int length, int type, @Nullable ClassLoader loader) {
+ mSource = source;
+ mPosition = position;
+ mLength = length;
+ mType = type;
+ mLoader = loader;
+ }
+
+ @Override
+ public Object get() {
+ if (mObject == null) {
+ int restore = mSource.dataPosition();
+ try {
+ mSource.setDataPosition(mPosition);
+ mObject = mSource.readValue(mLoader);
+ } finally {
+ mSource.setDataPosition(restore);
+ }
+ mSource = null;
+ if (mValueParcel != null) {
+ mValueParcel.recycle();
+ mValueParcel = null;
+ }
+ }
+ return mObject;
+ }
+
+ public void writeToParcel(Parcel out) {
+ if (mObject == null) {
+ int restore = mSource.dataPosition();
+ try {
+ mSource.setDataPosition(mPosition);
+ out.writeInt(mSource.readInt()); // Type
+ out.writeInt(mSource.readInt()); // Length
+ out.appendFrom(mSource, mSource.dataPosition(), mLength);
+ } finally {
+ mSource.setDataPosition(restore);
+ }
+ } else {
+ out.writeValue(mObject);
+ }
+ }
+
+ public boolean hasFileDescriptors() {
+ return getValueParcel().hasFileDescriptors();
+ }
+
+ @Override
+ public String toString() {
+ return mObject == null
+ ? "Supplier{" + valueTypeToString(mType) + "@" + mPosition + "+" + mLength + '}'
+ : "Supplier{" + mObject + "}";
+ }
+
+ /**
+ * We're checking if the *lazy value* is equal to another one, not if the *object*
+ * represented by the lazy value is equal to the other one. So, if there are two lazy values
+ * and one of them has been deserialized but the other hasn't this will always return false.
+ */
+ @Override
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (!(other instanceof LazyValue)) {
+ return false;
+ }
+ LazyValue value = (LazyValue) other;
+ // Check if they are either both serialized or both deserialized
+ if ((mObject == null) != (value.mObject == null)) {
+ return false;
+ }
+ // If both are deserialized, compare the live objects
+ if (mObject != null) {
+ return mObject.equals(value.mObject);
+ }
+ // Better safely fail here since this could mean we get different objects
+ if (!Objects.equals(mLoader, value.mLoader)) {
+ return false;
+ }
+ // Otherwise compare metadata prior to comparing payload
+ if (mType != value.mType || mLength != value.mLength) {
+ return false;
+ }
+ // Finally we compare the payload
+ return getValueParcel().compareData(value.getValueParcel()) == 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mObject, mLoader, mType, mLength);
+ }
+
+ /** This extracts the parcel section responsible for the object and returns it. */
+ private Parcel getValueParcel() {
+ if (mValueParcel == null) {
+ mValueParcel = Parcel.obtain();
+ // mLength is the length of object representation, excluding the type and length.
+ // mPosition is the position of the entire value container, right before the type.
+ // So, we add 4 bytes for the type + 4 bytes for the length written.
+ mValueParcel.appendFrom(mSource, mPosition, mLength + 8);
+ }
+ return mValueParcel;
+ }
+ }
+
+ /**
+ * Reads a value from the parcel of type {@code type}. Does NOT read the int representing the
+ * type first.
+ */
+ @Nullable
+ private Object readValue(int type, @Nullable ClassLoader loader) {
switch (type) {
case VAL_NULL:
return null;
@@ -3266,6 +3599,20 @@
}
}
+ private boolean isLengthPrefixed(int type) {
+ switch (type) {
+ case VAL_PARCELABLE:
+ case VAL_PARCELABLEARRAY:
+ case VAL_LIST:
+ case VAL_SPARSEARRAY:
+ case VAL_BUNDLE:
+ case VAL_SERIALIZABLE:
+ return true;
+ default:
+ return false;
+ }
+ }
+
/**
* Read and return a new Parcelable from the parcel. The given class loader
* will be used to load any enclosed Parcelables. If it is null, the default
@@ -3564,49 +3911,49 @@
}
}
- /* package */ void readArrayMapInternal(@NonNull ArrayMap outVal, int N,
- @Nullable ClassLoader loader) {
- if (DEBUG_ARRAY_MAP) {
- RuntimeException here = new RuntimeException("here");
- here.fillInStackTrace();
- Log.d(TAG, "Reading " + N + " ArrayMap entries", here);
- }
- int startPos;
- while (N > 0) {
- if (DEBUG_ARRAY_MAP) startPos = dataPosition();
- String key = readString();
- Object value = readValue(loader);
- if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read #" + (N-1) + " "
- + (dataPosition()-startPos) + " bytes: key=0x"
- + Integer.toHexString((key != null ? key.hashCode() : 0)) + " " + key);
- outVal.append(key, value);
- N--;
- }
- outVal.validate();
+ /* package */ void readArrayMapInternal(@NonNull ArrayMap<? super String, Object> outVal,
+ int size, @Nullable ClassLoader loader) {
+ readArrayMap(outVal, size, /* sorted */ true, /* lazy */ false, loader);
}
- /* package */ void readArrayMapSafelyInternal(@NonNull ArrayMap outVal, int N,
- @Nullable ClassLoader loader) {
- if (DEBUG_ARRAY_MAP) {
- RuntimeException here = new RuntimeException("here");
- here.fillInStackTrace();
- Log.d(TAG, "Reading safely " + N + " ArrayMap entries", here);
- }
- while (N > 0) {
+ /**
+ * Reads a map into {@code map}.
+ *
+ * @param sorted Whether the keys are sorted by their hashes, if so we use an optimized path.
+ * @param lazy Whether to populate the map with lazy {@link Supplier} objects for
+ * length-prefixed values. See {@link Parcel#readLazyValue(ClassLoader)} for more
+ * details.
+ * @return whether the parcel can be recycled or not.
+ * @hide
+ */
+ boolean readArrayMap(ArrayMap<? super String, Object> map, int size, boolean sorted,
+ boolean lazy, @Nullable ClassLoader loader) {
+ boolean recycle = true;
+ while (size > 0) {
String key = readString();
- if (DEBUG_ARRAY_MAP) Log.d(TAG, " Read safe #" + (N-1) + ": key=0x"
- + (key != null ? key.hashCode() : 0) + " " + key);
- Object value = readValue(loader);
- outVal.put(key, value);
- N--;
+ Object value = (lazy) ? readLazyValue(loader) : readValue(loader);
+ if (value instanceof LazyValue) {
+ recycle = false;
+ }
+ if (sorted) {
+ map.append(key, value);
+ } else {
+ map.put(key, value);
+ }
+ size--;
}
+ if (sorted) {
+ map.validate();
+ }
+ return recycle;
}
/**
* @hide For testing only.
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
- public void readArrayMap(@NonNull ArrayMap outVal, @Nullable ClassLoader loader) {
+ public void readArrayMap(@NonNull ArrayMap<? super String, Object> outVal,
+ @Nullable ClassLoader loader) {
final int N = readInt();
if (N < 0) {
return;
@@ -3691,4 +4038,38 @@
public long getBlobAshmemSize() {
return nativeGetBlobAshmemSize(mNativePtr);
}
+
+ private static String valueTypeToString(int type) {
+ switch (type) {
+ case VAL_NULL: return "VAL_NULL";
+ case VAL_INTEGER: return "VAL_INTEGER";
+ case VAL_MAP: return "VAL_MAP";
+ case VAL_BUNDLE: return "VAL_BUNDLE";
+ case VAL_PERSISTABLEBUNDLE: return "VAL_PERSISTABLEBUNDLE";
+ case VAL_PARCELABLE: return "VAL_PARCELABLE";
+ case VAL_SHORT: return "VAL_SHORT";
+ case VAL_LONG: return "VAL_LONG";
+ case VAL_FLOAT: return "VAL_FLOAT";
+ case VAL_DOUBLE: return "VAL_DOUBLE";
+ case VAL_BOOLEAN: return "VAL_BOOLEAN";
+ case VAL_CHARSEQUENCE: return "VAL_CHARSEQUENCE";
+ case VAL_LIST: return "VAL_LIST";
+ case VAL_SPARSEARRAY: return "VAL_SPARSEARRAY";
+ case VAL_BOOLEANARRAY: return "VAL_BOOLEANARRAY";
+ case VAL_BYTEARRAY: return "VAL_BYTEARRAY";
+ case VAL_STRINGARRAY: return "VAL_STRINGARRAY";
+ case VAL_CHARSEQUENCEARRAY: return "VAL_CHARSEQUENCEARRAY";
+ case VAL_IBINDER: return "VAL_IBINDER";
+ case VAL_PARCELABLEARRAY: return "VAL_PARCELABLEARRAY";
+ case VAL_INTARRAY: return "VAL_INTARRAY";
+ case VAL_LONGARRAY: return "VAL_LONGARRAY";
+ case VAL_BYTE: return "VAL_BYTE";
+ case VAL_SIZE: return "VAL_SIZE";
+ case VAL_SIZEF: return "VAL_SIZEF";
+ case VAL_DOUBLEARRAY: return "VAL_DOUBLEARRAY";
+ case VAL_OBJECTARRAY: return "VAL_OBJECTARRAY";
+ case VAL_SERIALIZABLE: return "VAL_SERIALIZABLE";
+ default: return "UNKNOWN(" + type + ")";
+ }
+ }
}
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
index f853e67..06a2c87 100644
--- a/core/java/android/os/ServiceManager.java
+++ b/core/java/android/os/ServiceManager.java
@@ -17,6 +17,8 @@
package android.os;
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.util.ArrayMap;
import android.util.Log;
@@ -28,6 +30,7 @@
import java.util.Map;
/** @hide */
+@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
public final class ServiceManager {
private static final String TAG = "ServiceManager";
private static final Object sLock = new Object();
@@ -98,10 +101,12 @@
int COUNT = GET_SERVICE + 1;
}
+ /** @hide */
public static final StatLogger sStatLogger = new StatLogger(new String[] {
"getService()",
});
+ /** @hide */
@UnsupportedAppUsage
public ServiceManager() {
}
@@ -123,6 +128,7 @@
*
* @param name the name of the service to get
* @return a reference to the service, or <code>null</code> if the service doesn't exist
+ * @hide
*/
@UnsupportedAppUsage
public static IBinder getService(String name) {
@@ -160,6 +166,7 @@
*
* @param name the name of the new service
* @param service the service object
+ * @hide
*/
@UnsupportedAppUsage
public static void addService(String name, IBinder service) {
@@ -174,6 +181,7 @@
* @param service the service object
* @param allowIsolated set to true to allow isolated sandboxed processes
* to access this service
+ * @hide
*/
@UnsupportedAppUsage
public static void addService(String name, IBinder service, boolean allowIsolated) {
@@ -189,6 +197,7 @@
* @param allowIsolated set to true to allow isolated sandboxed processes
* @param dumpPriority supported dump priority levels as a bitmask
* to access this service
+ * @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public static void addService(String name, IBinder service, boolean allowIsolated,
@@ -203,6 +212,7 @@
/**
* Retrieve an existing service called @a name from the
* service manager. Non-blocking.
+ * @hide
*/
@UnsupportedAppUsage
public static IBinder checkService(String name) {
@@ -239,6 +249,7 @@
*
* @return true if the service is declared somewhere (eg. VINTF manifest) and
* waitForService should always be able to return the service.
+ * @hide
*/
public static String[] getDeclaredInstances(@NonNull String iface) {
try {
@@ -256,8 +267,13 @@
* will wait for it to be ready.
*
* @return {@code null} only if there are permission problems or fatal errors.
+ * @hide
*/
- public static native IBinder waitForService(@NonNull String name);
+ public static IBinder waitForService(@NonNull String name) {
+ return Binder.allowBlocking(waitForServiceNative(name));
+ }
+
+ private static native IBinder waitForServiceNative(@NonNull String name);
/**
* Returns the specified service from the service manager, if declared.
@@ -267,8 +283,10 @@
*
* @return {@code null} if the service is not declared in the manifest, or if there are
* permission problems, or if there are fatal errors.
+ * @hide
*/
- public static IBinder waitForDeclaredService(@NonNull String name) {
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ @Nullable public static IBinder waitForDeclaredService(@NonNull String name) {
return isDeclared(name) ? waitForService(name) : null;
}
@@ -276,6 +294,7 @@
* Return a list of all currently running services.
* @return an array of all currently running services, or <code>null</code> in
* case of an exception
+ * @hide
*/
@UnsupportedAppUsage
public static String[] listServices() {
diff --git a/core/java/android/os/SharedMemory.java b/core/java/android/os/SharedMemory.java
index 136e3de..46eb2ec 100644
--- a/core/java/android/os/SharedMemory.java
+++ b/core/java/android/os/SharedMemory.java
@@ -93,6 +93,26 @@
}
}
+ /**
+ * Creates an instance from existing shared memory passed as {@link ParcelFileDescriptor}.
+ *
+ * <p> The {@code fd} should be a shared memory created from
+ {@code SharedMemory or ASharedMemory}. This can be useful when shared memory is passed as
+ file descriptor through JNI or binder service implemented in cpp.
+ * <p> Note that newly created {@code SharedMemory} takes ownership of passed {@code fd} and
+ * the original {@code fd} becomes detached (Check {@link ParcelFileDescriptor#detachFd()}).
+ * If the caller wants to use the file descriptor after the call, the caller should duplicate
+ * the file descriptor (Check {@link ParcelFileDescriptor#dup()}) and pass the duped version
+ * instead.
+ *
+ * @param fd File descriptor of shared memory passed as {@link ParcelFileDescriptor}.
+ */
+ public static @NonNull SharedMemory fromFileDescriptor(@NonNull ParcelFileDescriptor fd) {
+ FileDescriptor f = new FileDescriptor();
+ f.setInt$(fd.detachFd());
+ return new SharedMemory(f);
+ }
+
private static final int PROT_MASK = OsConstants.PROT_READ | OsConstants.PROT_WRITE
| OsConstants.PROT_EXEC | OsConstants.PROT_NONE;
diff --git a/core/java/android/provider/DeviceConfig.java b/core/java/android/provider/DeviceConfig.java
index bd84c84..c89f4f5 100644
--- a/core/java/android/provider/DeviceConfig.java
+++ b/core/java/android/provider/DeviceConfig.java
@@ -201,6 +201,14 @@
"intelligence_content_suggestions";
/**
+ * Namespace for all lmkd related features.
+ *
+ * @hide
+ */
+ @SystemApi
+ public static final String NAMESPACE_LMKD_NATIVE = "lmkd_native";
+
+ /**
* Namespace for all media native related features.
*
* @hide
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 0e02af2..cd52db4 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -33,13 +33,11 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
-import android.os.ServiceSpecificException;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
import android.os.ZygoteProcess;
-import android.os.storage.StorageManager;
import android.provider.DeviceConfig;
import android.security.keystore2.AndroidKeyStoreProvider;
import android.system.ErrnoException;
@@ -58,7 +56,6 @@
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.Preconditions;
-import dalvik.system.DexFile;
import dalvik.system.VMRuntime;
import dalvik.system.ZygoteHooks;
@@ -517,7 +514,6 @@
final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
if (systemServerClasspath != null) {
- performSystemServerDexOpt(systemServerClasspath);
// Capturing profiles is only supported for debug or eng builds since selinux normally
// prevents it.
if (shouldProfileSystemServer() && (Build.IS_USERDEBUG || Build.IS_ENG)) {
@@ -659,95 +655,6 @@
}
/**
- * Performs dex-opt on the elements of {@code classPath}, if needed. We choose the instruction
- * set of the current runtime.
- */
- private static void performSystemServerDexOpt(String classPath) {
- final String[] classPathElements = classPath.split(":");
- final String instructionSet = VMRuntime.getRuntime().vmInstructionSet();
-
- String classPathForElement = "";
- for (String classPathElement : classPathElements) {
- // We default to the verify filter because the compilation will happen on /data and
- // system server cannot load executable code outside /system.
- String systemServerFilter = SystemProperties.get(
- "dalvik.vm.systemservercompilerfilter", "verify");
-
- String classLoaderContext =
- getSystemServerClassLoaderContext(classPathForElement);
- int dexoptNeeded;
- try {
- dexoptNeeded = DexFile.getDexOptNeeded(
- classPathElement, instructionSet, systemServerFilter,
- classLoaderContext, false /* newProfile */, false /* downgrade */);
- } catch (FileNotFoundException ignored) {
- // Do not add to the classpath.
- Log.w(TAG, "Missing classpath element for system server: " + classPathElement);
- continue;
- } catch (IOException e) {
- // Not fully clear what to do here as we don't know the cause of the
- // IO exception. Add to the classpath to be conservative, but don't
- // attempt to compile it.
- Log.w(TAG, "Error checking classpath element for system server: "
- + classPathElement, e);
- dexoptNeeded = DexFile.NO_DEXOPT_NEEDED;
- }
-
- if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {
- final String packageName = "*";
- final String outputPath = null;
- final int dexFlags = 0;
- final String uuid = StorageManager.UUID_PRIVATE_INTERNAL;
- final String seInfo = null;
- final int targetSdkVersion = 0; // SystemServer targets the system's SDK version
- // Wait for installd to be made available
- IInstalld installd = IInstalld.Stub.asInterface(
- ServiceManager.waitForService("installd"));
-
- try {
- installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName,
- instructionSet, dexoptNeeded, outputPath, dexFlags, systemServerFilter,
- uuid, classLoaderContext, seInfo, false /* downgrade */,
- targetSdkVersion, /*profileName*/ null, /*dexMetadataPath*/ null,
- "server-dexopt");
- } catch (RemoteException | ServiceSpecificException e) {
- // Ignore (but log), we need this on the classpath for fallback mode.
- Log.w(TAG, "Failed compiling classpath element for system server: "
- + classPathElement, e);
- }
- }
-
- classPathForElement = encodeSystemServerClassPath(
- classPathForElement, classPathElement);
- }
- }
-
- /**
- * Encodes the system server class loader context in a format that is accepted by dexopt. This
- * assumes the system server is always loaded with a {@link dalvik.system.PathClassLoader}.
- *
- * Note that ideally we would use the {@code DexoptUtils} to compute this. However we have no
- * dependency here on the server so we hard code the logic again.
- */
- private static String getSystemServerClassLoaderContext(String classPath) {
- return classPath == null ? "PCL[]" : "PCL[" + classPath + "]";
- }
-
- /**
- * Encodes the class path in a format accepted by dexopt.
- *
- * @param classPath The old class path (may be empty).
- * @param newElement The new class path elements
- * @return The class path encoding resulted from appending {@code newElement} to {@code
- * classPath}.
- */
- private static String encodeSystemServerClassPath(String classPath, String newElement) {
- return (classPath == null || classPath.isEmpty())
- ? newElement
- : classPath + ":" + newElement;
- }
-
- /**
* Prepare the arguments and forks for the system server process.
*
* @return A {@code Runnable} that provides an entrypoint into system_server code in the child
diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
index b90722c..09bb327 100644
--- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
+++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
@@ -62,6 +62,7 @@
void onActiveDataSubIdChanged(in int subId);
void onRadioPowerStateChanged(in int state);
void onCallAttributesChanged(in CallAttributes callAttributes);
+ @SuppressWarnings(value={"untyped-collection"})
void onEmergencyNumberListChanged(in Map emergencyNumberList);
void onOutgoingEmergencyCall(in EmergencyNumber placedEmergencyNumber, int subscriptionId);
void onOutgoingEmergencySms(in EmergencyNumber sentEmergencyNumber, int subscriptionId);
diff --git a/core/java/com/android/internal/util/OWNERS b/core/java/com/android/internal/util/OWNERS
index 5b68159..100a605d 100644
--- a/core/java/com/android/internal/util/OWNERS
+++ b/core/java/com/android/internal/util/OWNERS
@@ -1,6 +1,7 @@
per-file AsyncChannel* = lorenzo@google.com, satk@google.com, etancohen@google.com
per-file MessageUtils*, Protocol*, RingBuffer*, TokenBucket* = jchalard@google.com, lorenzo@google.com, satk@google.com
per-file *Notification* = file:/services/core/java/com/android/server/notification/OWNERS
+per-file *ContrastColor* = file:/services/core/java/com/android/server/notification/OWNERS
per-file Protocol* = etancohen@google.com, lorenzo@google.com
per-file State* = jchalard@google.com, lorenzo@google.com, satk@google.com
per-file DataClass* = eugenesusla@google.com
\ No newline at end of file
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index 59e95c9..1132422 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -546,13 +546,14 @@
if (!isSystemProcess()) {
return;
}
- // Read configuration of libs from apex module.
+ // Read configuration of features and libs from apex module.
+ int apexPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES;
// TODO: Use a solid way to filter apex module folders?
for (File f: FileUtils.listFilesOrEmpty(Environment.getApexDirectory())) {
if (f.isFile() || f.getPath().contains("@")) {
continue;
}
- readPermissions(Environment.buildPath(f, "etc", "permissions"), ALLOW_LIBS);
+ readPermissions(Environment.buildPath(f, "etc", "permissions"), apexPermissionFlag);
}
}
diff --git a/core/jni/android_os_ServiceManager.cpp b/core/jni/android_os_ServiceManager.cpp
index c747949..d642d0e 100644
--- a/core/jni/android_os_ServiceManager.cpp
+++ b/core/jni/android_os_ServiceManager.cpp
@@ -29,11 +29,8 @@
// Native because we have a client-side wait in waitForService() and we do not
// want an unnecessary second copy of it.
-static jobject android_os_ServiceManager_waitForService(
- JNIEnv *env,
- jclass /* clazzObj */,
- jstring serviceNameObj) {
-
+static jobject android_os_ServiceManager_waitForServiceNative(JNIEnv* env, jclass /* clazzObj */,
+ jstring serviceNameObj) {
const jchar* serviceName = env->GetStringCritical(serviceNameObj, nullptr);
if (!serviceName) {
jniThrowNullPointerException(env, nullptr);
@@ -55,12 +52,9 @@
// ----------------------------------------------------------------------------
static const JNINativeMethod method_table[] = {
- /* name, signature, funcPtr */
- {
- "waitForService",
- "(Ljava/lang/String;)Landroid/os/IBinder;",
- (void*)android_os_ServiceManager_waitForService
- },
+ /* name, signature, funcPtr */
+ {"waitForServiceNative", "(Ljava/lang/String;)Landroid/os/IBinder;",
+ (void*)android_os_ServiceManager_waitForServiceNative},
};
int register_android_os_ServiceManager(JNIEnv* env) {
diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp
index 6374305..ff9e27f 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -263,8 +263,12 @@
sprintf(proc_path, "/proc/%d/cmdline", pid);
fd = open(proc_path, O_RDONLY | O_CLOEXEC);
if (fd >= 0) {
- int rc = read(fd, cmdline, sizeof(cmdline)-1);
- cmdline[rc] = 0;
+ ssize_t rc = read(fd, cmdline, sizeof(cmdline) - 1);
+ if (rc < 0) {
+ ALOGE("read /proc/%d/cmdline (%s)", pid, strerror(errno));
+ } else {
+ cmdline[rc] = 0;
+ }
close(fd);
}
diff --git a/core/jni/com_android_internal_content_om_OverlayConfig.cpp b/core/jni/com_android_internal_content_om_OverlayConfig.cpp
index 6aa7c10..b37269c 100644
--- a/core/jni/com_android_internal_content_om_OverlayConfig.cpp
+++ b/core/jni/com_android_internal_content_om_OverlayConfig.cpp
@@ -73,13 +73,13 @@
}
if (result->status != 0) {
- LOG(ERROR) << "idmap2: " << result->stderr;
- return nullptr;
+ LOG(ERROR) << "idmap2: " << result->stderr_str;
+ return nullptr;
}
// Return the paths of the idmaps created or updated during the idmap invocation.
std::vector<std::string> idmap_paths;
- std::istringstream input(result->stdout);
+ std::istringstream input(result->stdout_str);
std::string path;
while (std::getline(input, path)) {
idmap_paths.push_back(path);
diff --git a/core/tests/coretests/src/com/android/internal/util/OWNERS b/core/tests/coretests/src/com/android/internal/util/OWNERS
new file mode 100644
index 0000000..d832745
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/util/OWNERS
@@ -0,0 +1,2 @@
+per-file *Notification* = file:/services/core/java/com/android/server/notification/OWNERS
+per-file *ContrastColor* = file:/services/core/java/com/android/server/notification/OWNERS
\ No newline at end of file
diff --git a/keystore/java/android/security/GenerateRkpKey.java b/keystore/java/android/security/GenerateRkpKey.java
index 053bec74..2e54e63 100644
--- a/keystore/java/android/security/GenerateRkpKey.java
+++ b/keystore/java/android/security/GenerateRkpKey.java
@@ -25,6 +25,8 @@
import android.util.Log;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
@@ -88,7 +90,8 @@
}
intent.setComponent(comp);
mCountDownLatch = new CountDownLatch(1);
- if (!mContext.bindService(intent, mConnection, Context.BIND_AUTO_CREATE)) {
+ Executor executor = Executors.newCachedThreadPool();
+ if (!mContext.bindService(intent, Context.BIND_AUTO_CREATE, executor, mConnection)) {
throw new RemoteException("Failed to bind to GenerateRkpKeyService");
}
try {
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java b/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java
index 5619585..b24a22d 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreKey.java
@@ -102,11 +102,9 @@
final int prime = 31;
int result = 1;
- result = prime * result + ((mDescriptor == null) ? 0 : mDescriptor.hashCode());
+ result = prime * result + getClass().hashCode();
result = prime * result + (int) (mKeyId >>> 32);
result = prime * result + (int) (mKeyId & 0xffffffff);
- result = prime * result + ((mAuthorizations == null) ? 0 : mAuthorizations.hashCode());
- result = prime * result + ((mAlgorithm == null) ? 0 : mAlgorithm.hashCode());
return result;
}
@@ -122,10 +120,6 @@
return false;
}
AndroidKeyStoreKey other = (AndroidKeyStoreKey) obj;
- if (mKeyId != other.mKeyId) {
- return false;
- }
-
- return true;
+ return mKeyId == other.mKeyId;
}
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java b/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java
index db3e567..4842984 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStorePublicKey.java
@@ -23,6 +23,7 @@
import android.system.keystore2.KeyMetadata;
import java.security.PublicKey;
+import java.util.Objects;
/**
* {@link PublicKey} backed by Android Keystore.
@@ -75,9 +76,14 @@
if (!super.equals(obj)) {
return false;
}
- if (getClass() != obj.getClass()) {
- return false;
- }
- return true;
+
+ /*
+ * getClass().equals(ojb.getClass()) is implied by the call to super.equals() above. This
+ * means we can cast obj to AndroidKeyStorePublicKey here.
+ */
+ final AndroidKeyStorePublicKey other = (AndroidKeyStorePublicKey) obj;
+
+ return Objects.equals(mCertificate, other.mCertificate) && Objects.equals(mCertificateChain,
+ other.mCertificateChain);
}
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
index f3cfcf1..67358c4 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
@@ -579,7 +579,7 @@
//
// Note: mNamespace == KeyProperties.NAMESPACE_APPLICATION implies that the target domain
// is Domain.APP and Domain.SELINUX is the target domain otherwise.
- if (alias != descriptor.alias
+ if (!alias.equals(descriptor.alias)
|| descriptor.domain != targetDomain
|| (descriptor.domain == Domain.SELINUX && descriptor.nspace != targetNamespace)) {
throw new KeyStoreException("Can only replace keys with same alias: " + alias
diff --git a/libs/androidfw/LocaleDataTables.cpp b/libs/androidfw/LocaleDataTables.cpp
index 8a10599..2c3567a 100644
--- a/libs/androidfw/LocaleDataTables.cpp
+++ b/libs/androidfw/LocaleDataTables.cpp
@@ -1,37 +1,37 @@
// Auto-generated by ./tools/localedata/extract_icu_data.py
const char SCRIPT_CODES[][4] = {
- /* 0 */ {'A', 'h', 'o', 'm'},
- /* 1 */ {'A', 'r', 'a', 'b'},
- /* 2 */ {'A', 'r', 'm', 'i'},
- /* 3 */ {'A', 'r', 'm', 'n'},
- /* 4 */ {'A', 'v', 's', 't'},
- /* 5 */ {'B', 'a', 'm', 'u'},
- /* 6 */ {'B', 'a', 's', 's'},
- /* 7 */ {'B', 'e', 'n', 'g'},
- /* 8 */ {'B', 'r', 'a', 'h'},
- /* 9 */ {'C', 'a', 'k', 'm'},
- /* 10 */ {'C', 'a', 'n', 's'},
- /* 11 */ {'C', 'a', 'r', 'i'},
- /* 12 */ {'C', 'h', 'a', 'm'},
- /* 13 */ {'C', 'h', 'e', 'r'},
- /* 14 */ {'C', 'h', 'r', 's'},
- /* 15 */ {'C', 'o', 'p', 't'},
- /* 16 */ {'C', 'p', 'r', 't'},
- /* 17 */ {'C', 'y', 'r', 'l'},
- /* 18 */ {'D', 'e', 'v', 'a'},
- /* 19 */ {'E', 'g', 'y', 'p'},
- /* 20 */ {'E', 't', 'h', 'i'},
- /* 21 */ {'G', 'e', 'o', 'r'},
- /* 22 */ {'G', 'o', 'n', 'g'},
- /* 23 */ {'G', 'o', 'n', 'm'},
- /* 24 */ {'G', 'o', 't', 'h'},
- /* 25 */ {'G', 'r', 'e', 'k'},
- /* 26 */ {'G', 'u', 'j', 'r'},
- /* 27 */ {'G', 'u', 'r', 'u'},
- /* 28 */ {'H', 'a', 'n', 's'},
- /* 29 */ {'H', 'a', 'n', 't'},
- /* 30 */ {'H', 'a', 't', 'r'},
+ /* 0 */ {'A', 'g', 'h', 'b'},
+ /* 1 */ {'A', 'h', 'o', 'm'},
+ /* 2 */ {'A', 'r', 'a', 'b'},
+ /* 3 */ {'A', 'r', 'm', 'i'},
+ /* 4 */ {'A', 'r', 'm', 'n'},
+ /* 5 */ {'A', 'v', 's', 't'},
+ /* 6 */ {'B', 'a', 'm', 'u'},
+ /* 7 */ {'B', 'a', 's', 's'},
+ /* 8 */ {'B', 'e', 'n', 'g'},
+ /* 9 */ {'B', 'r', 'a', 'h'},
+ /* 10 */ {'C', 'a', 'k', 'm'},
+ /* 11 */ {'C', 'a', 'n', 's'},
+ /* 12 */ {'C', 'a', 'r', 'i'},
+ /* 13 */ {'C', 'h', 'a', 'm'},
+ /* 14 */ {'C', 'h', 'e', 'r'},
+ /* 15 */ {'C', 'h', 'r', 's'},
+ /* 16 */ {'C', 'o', 'p', 't'},
+ /* 17 */ {'C', 'p', 'r', 't'},
+ /* 18 */ {'C', 'y', 'r', 'l'},
+ /* 19 */ {'D', 'e', 'v', 'a'},
+ /* 20 */ {'E', 'g', 'y', 'p'},
+ /* 21 */ {'E', 't', 'h', 'i'},
+ /* 22 */ {'G', 'e', 'o', 'r'},
+ /* 23 */ {'G', 'o', 'n', 'g'},
+ /* 24 */ {'G', 'o', 'n', 'm'},
+ /* 25 */ {'G', 'o', 't', 'h'},
+ /* 26 */ {'G', 'r', 'e', 'k'},
+ /* 27 */ {'G', 'u', 'j', 'r'},
+ /* 28 */ {'G', 'u', 'r', 'u'},
+ /* 29 */ {'H', 'a', 'n', 's'},
+ /* 30 */ {'H', 'a', 'n', 't'},
/* 31 */ {'H', 'e', 'b', 'r'},
/* 32 */ {'H', 'l', 'u', 'w'},
/* 33 */ {'H', 'm', 'n', 'g'},
@@ -55,52 +55,53 @@
/* 51 */ {'L', 'y', 'd', 'i'},
/* 52 */ {'M', 'a', 'n', 'd'},
/* 53 */ {'M', 'a', 'n', 'i'},
- /* 54 */ {'M', 'e', 'r', 'c'},
- /* 55 */ {'M', 'l', 'y', 'm'},
- /* 56 */ {'M', 'o', 'n', 'g'},
- /* 57 */ {'M', 'r', 'o', 'o'},
- /* 58 */ {'M', 'y', 'm', 'r'},
- /* 59 */ {'N', 'a', 'r', 'b'},
- /* 60 */ {'N', 'k', 'o', 'o'},
- /* 61 */ {'N', 's', 'h', 'u'},
- /* 62 */ {'O', 'g', 'a', 'm'},
- /* 63 */ {'O', 'l', 'c', 'k'},
- /* 64 */ {'O', 'r', 'k', 'h'},
- /* 65 */ {'O', 'r', 'y', 'a'},
- /* 66 */ {'O', 's', 'g', 'e'},
- /* 67 */ {'P', 'a', 'u', 'c'},
- /* 68 */ {'P', 'h', 'l', 'i'},
- /* 69 */ {'P', 'h', 'n', 'x'},
- /* 70 */ {'P', 'l', 'r', 'd'},
- /* 71 */ {'P', 'r', 't', 'i'},
- /* 72 */ {'R', 'u', 'n', 'r'},
- /* 73 */ {'S', 'a', 'm', 'r'},
- /* 74 */ {'S', 'a', 'r', 'b'},
- /* 75 */ {'S', 'a', 'u', 'r'},
- /* 76 */ {'S', 'g', 'n', 'w'},
- /* 77 */ {'S', 'i', 'n', 'h'},
- /* 78 */ {'S', 'o', 'g', 'd'},
- /* 79 */ {'S', 'o', 'r', 'a'},
- /* 80 */ {'S', 'o', 'y', 'o'},
- /* 81 */ {'S', 'y', 'r', 'c'},
- /* 82 */ {'T', 'a', 'l', 'e'},
- /* 83 */ {'T', 'a', 'l', 'u'},
- /* 84 */ {'T', 'a', 'm', 'l'},
- /* 85 */ {'T', 'a', 'n', 'g'},
- /* 86 */ {'T', 'a', 'v', 't'},
- /* 87 */ {'T', 'e', 'l', 'u'},
- /* 88 */ {'T', 'f', 'n', 'g'},
- /* 89 */ {'T', 'h', 'a', 'a'},
- /* 90 */ {'T', 'h', 'a', 'i'},
- /* 91 */ {'T', 'i', 'b', 't'},
- /* 92 */ {'U', 'g', 'a', 'r'},
- /* 93 */ {'V', 'a', 'i', 'i'},
- /* 94 */ {'W', 'c', 'h', 'o'},
- /* 95 */ {'X', 'p', 'e', 'o'},
- /* 96 */ {'X', 's', 'u', 'x'},
- /* 97 */ {'Y', 'i', 'i', 'i'},
- /* 98 */ {'~', '~', '~', 'A'},
- /* 99 */ {'~', '~', '~', 'B'},
+ /* 54 */ {'M', 'e', 'd', 'f'},
+ /* 55 */ {'M', 'e', 'r', 'c'},
+ /* 56 */ {'M', 'l', 'y', 'm'},
+ /* 57 */ {'M', 'o', 'n', 'g'},
+ /* 58 */ {'M', 'r', 'o', 'o'},
+ /* 59 */ {'M', 'y', 'm', 'r'},
+ /* 60 */ {'N', 'a', 'r', 'b'},
+ /* 61 */ {'N', 'k', 'o', 'o'},
+ /* 62 */ {'N', 's', 'h', 'u'},
+ /* 63 */ {'O', 'g', 'a', 'm'},
+ /* 64 */ {'O', 'l', 'c', 'k'},
+ /* 65 */ {'O', 'r', 'k', 'h'},
+ /* 66 */ {'O', 'r', 'y', 'a'},
+ /* 67 */ {'O', 's', 'g', 'e'},
+ /* 68 */ {'P', 'a', 'u', 'c'},
+ /* 69 */ {'P', 'h', 'l', 'i'},
+ /* 70 */ {'P', 'h', 'n', 'x'},
+ /* 71 */ {'P', 'l', 'r', 'd'},
+ /* 72 */ {'P', 'r', 't', 'i'},
+ /* 73 */ {'R', 'u', 'n', 'r'},
+ /* 74 */ {'S', 'a', 'm', 'r'},
+ /* 75 */ {'S', 'a', 'r', 'b'},
+ /* 76 */ {'S', 'a', 'u', 'r'},
+ /* 77 */ {'S', 'g', 'n', 'w'},
+ /* 78 */ {'S', 'i', 'n', 'h'},
+ /* 79 */ {'S', 'o', 'g', 'd'},
+ /* 80 */ {'S', 'o', 'r', 'a'},
+ /* 81 */ {'S', 'o', 'y', 'o'},
+ /* 82 */ {'S', 'y', 'r', 'c'},
+ /* 83 */ {'T', 'a', 'l', 'e'},
+ /* 84 */ {'T', 'a', 'l', 'u'},
+ /* 85 */ {'T', 'a', 'm', 'l'},
+ /* 86 */ {'T', 'a', 'n', 'g'},
+ /* 87 */ {'T', 'a', 'v', 't'},
+ /* 88 */ {'T', 'e', 'l', 'u'},
+ /* 89 */ {'T', 'f', 'n', 'g'},
+ /* 90 */ {'T', 'h', 'a', 'a'},
+ /* 91 */ {'T', 'h', 'a', 'i'},
+ /* 92 */ {'T', 'i', 'b', 't'},
+ /* 93 */ {'U', 'g', 'a', 'r'},
+ /* 94 */ {'V', 'a', 'i', 'i'},
+ /* 95 */ {'W', 'c', 'h', 'o'},
+ /* 96 */ {'X', 'p', 'e', 'o'},
+ /* 97 */ {'X', 's', 'u', 'x'},
+ /* 98 */ {'Y', 'i', 'i', 'i'},
+ /* 99 */ {'~', '~', '~', 'A'},
+ /* 100 */ {'~', '~', '~', 'B'},
};
@@ -109,9 +110,9 @@
{0xA0000000u, 46u}, // aai -> Latn
{0xA8000000u, 46u}, // aak -> Latn
{0xD0000000u, 46u}, // aau -> Latn
- {0x61620000u, 17u}, // ab -> Cyrl
+ {0x61620000u, 18u}, // ab -> Cyrl
{0xA0200000u, 46u}, // abi -> Latn
- {0xC0200000u, 17u}, // abq -> Cyrl
+ {0xC0200000u, 18u}, // abq -> Cyrl
{0xC4200000u, 46u}, // abr -> Latn
{0xCC200000u, 46u}, // abt -> Latn
{0xE0200000u, 46u}, // aby -> Latn
@@ -121,11 +122,11 @@
{0x80600000u, 46u}, // ada -> Latn
{0x90600000u, 46u}, // ade -> Latn
{0xA4600000u, 46u}, // adj -> Latn
- {0xBC600000u, 91u}, // adp -> Tibt
- {0xE0600000u, 17u}, // ady -> Cyrl
+ {0xBC600000u, 92u}, // adp -> Tibt
+ {0xE0600000u, 18u}, // ady -> Cyrl
{0xE4600000u, 46u}, // adz -> Latn
- {0x61650000u, 4u}, // ae -> Avst
- {0x84800000u, 1u}, // aeb -> Arab
+ {0x61650000u, 5u}, // ae -> Avst
+ {0x84800000u, 2u}, // aeb -> Arab
{0xE0800000u, 46u}, // aey -> Latn
{0x61660000u, 46u}, // af -> Latn
{0x88C00000u, 46u}, // agc -> Latn
@@ -136,15 +137,15 @@
{0xC0C00000u, 46u}, // agq -> Latn
{0x80E00000u, 46u}, // aha -> Latn
{0xACE00000u, 46u}, // ahl -> Latn
- {0xB8E00000u, 0u}, // aho -> Ahom
+ {0xB8E00000u, 1u}, // aho -> Ahom
{0x99200000u, 46u}, // ajg -> Latn
{0x616B0000u, 46u}, // ak -> Latn
- {0xA9400000u, 96u}, // akk -> Xsux
+ {0xA9400000u, 97u}, // akk -> Xsux
{0x81600000u, 46u}, // ala -> Latn
{0xA1600000u, 46u}, // ali -> Latn
{0xB5600000u, 46u}, // aln -> Latn
- {0xCD600000u, 17u}, // alt -> Cyrl
- {0x616D0000u, 20u}, // am -> Ethi
+ {0xCD600000u, 18u}, // alt -> Cyrl
+ {0x616D0000u, 21u}, // am -> Ethi
{0xB1800000u, 46u}, // amm -> Latn
{0xB5800000u, 46u}, // amn -> Latn
{0xB9800000u, 46u}, // amo -> Latn
@@ -157,25 +158,25 @@
{0xA5C00000u, 46u}, // aoj -> Latn
{0xB1C00000u, 46u}, // aom -> Latn
{0xE5C00000u, 46u}, // aoz -> Latn
- {0x89E00000u, 1u}, // apc -> Arab
- {0x8DE00000u, 1u}, // apd -> Arab
+ {0x89E00000u, 2u}, // apc -> Arab
+ {0x8DE00000u, 2u}, // apd -> Arab
{0x91E00000u, 46u}, // ape -> Latn
{0xC5E00000u, 46u}, // apr -> Latn
{0xC9E00000u, 46u}, // aps -> Latn
{0xE5E00000u, 46u}, // apz -> Latn
- {0x61720000u, 1u}, // ar -> Arab
- {0x61725842u, 99u}, // ar-XB -> ~~~B
- {0x8A200000u, 2u}, // arc -> Armi
+ {0x61720000u, 2u}, // ar -> Arab
+ {0x61725842u, 100u}, // ar-XB -> ~~~B
+ {0x8A200000u, 3u}, // arc -> Armi
{0x9E200000u, 46u}, // arh -> Latn
{0xB6200000u, 46u}, // arn -> Latn
{0xBA200000u, 46u}, // aro -> Latn
- {0xC2200000u, 1u}, // arq -> Arab
- {0xCA200000u, 1u}, // ars -> Arab
- {0xE2200000u, 1u}, // ary -> Arab
- {0xE6200000u, 1u}, // arz -> Arab
- {0x61730000u, 7u}, // as -> Beng
+ {0xC2200000u, 2u}, // arq -> Arab
+ {0xCA200000u, 2u}, // ars -> Arab
+ {0xE2200000u, 2u}, // ary -> Arab
+ {0xE6200000u, 2u}, // arz -> Arab
+ {0x61730000u, 8u}, // as -> Beng
{0x82400000u, 46u}, // asa -> Latn
- {0x92400000u, 76u}, // ase -> Sgnw
+ {0x92400000u, 77u}, // ase -> Sgnw
{0x9A400000u, 46u}, // asg -> Latn
{0xBA400000u, 46u}, // aso -> Latn
{0xCE400000u, 46u}, // ast -> Latn
@@ -183,29 +184,29 @@
{0x9A600000u, 46u}, // atg -> Latn
{0xA6600000u, 46u}, // atj -> Latn
{0xE2800000u, 46u}, // auy -> Latn
- {0x61760000u, 17u}, // av -> Cyrl
- {0xAEA00000u, 1u}, // avl -> Arab
+ {0x61760000u, 18u}, // av -> Cyrl
+ {0xAEA00000u, 2u}, // avl -> Arab
{0xB6A00000u, 46u}, // avn -> Latn
{0xCEA00000u, 46u}, // avt -> Latn
{0xD2A00000u, 46u}, // avu -> Latn
- {0x82C00000u, 18u}, // awa -> Deva
+ {0x82C00000u, 19u}, // awa -> Deva
{0x86C00000u, 46u}, // awb -> Latn
{0xBAC00000u, 46u}, // awo -> Latn
{0xDEC00000u, 46u}, // awx -> Latn
{0x61790000u, 46u}, // ay -> Latn
{0x87000000u, 46u}, // ayb -> Latn
{0x617A0000u, 46u}, // az -> Latn
- {0x617A4951u, 1u}, // az-IQ -> Arab
- {0x617A4952u, 1u}, // az-IR -> Arab
- {0x617A5255u, 17u}, // az-RU -> Cyrl
- {0x62610000u, 17u}, // ba -> Cyrl
- {0xAC010000u, 1u}, // bal -> Arab
+ {0x617A4951u, 2u}, // az-IQ -> Arab
+ {0x617A4952u, 2u}, // az-IR -> Arab
+ {0x617A5255u, 18u}, // az-RU -> Cyrl
+ {0x62610000u, 18u}, // ba -> Cyrl
+ {0xAC010000u, 2u}, // bal -> Arab
{0xB4010000u, 46u}, // ban -> Latn
- {0xBC010000u, 18u}, // bap -> Deva
+ {0xBC010000u, 19u}, // bap -> Deva
{0xC4010000u, 46u}, // bar -> Latn
{0xC8010000u, 46u}, // bas -> Latn
{0xD4010000u, 46u}, // bav -> Latn
- {0xDC010000u, 5u}, // bax -> Bamu
+ {0xDC010000u, 6u}, // bax -> Bamu
{0x80210000u, 46u}, // bba -> Latn
{0x84210000u, 46u}, // bbb -> Latn
{0x88210000u, 46u}, // bbc -> Latn
@@ -219,31 +220,31 @@
{0xB0410000u, 46u}, // bcm -> Latn
{0xB4410000u, 46u}, // bcn -> Latn
{0xB8410000u, 46u}, // bco -> Latn
- {0xC0410000u, 20u}, // bcq -> Ethi
+ {0xC0410000u, 21u}, // bcq -> Ethi
{0xD0410000u, 46u}, // bcu -> Latn
{0x8C610000u, 46u}, // bdd -> Latn
- {0x62650000u, 17u}, // be -> Cyrl
+ {0x62650000u, 18u}, // be -> Cyrl
{0x94810000u, 46u}, // bef -> Latn
{0x9C810000u, 46u}, // beh -> Latn
- {0xA4810000u, 1u}, // bej -> Arab
+ {0xA4810000u, 2u}, // bej -> Arab
{0xB0810000u, 46u}, // bem -> Latn
{0xCC810000u, 46u}, // bet -> Latn
{0xD8810000u, 46u}, // bew -> Latn
{0xDC810000u, 46u}, // bex -> Latn
{0xE4810000u, 46u}, // bez -> Latn
{0x8CA10000u, 46u}, // bfd -> Latn
- {0xC0A10000u, 84u}, // bfq -> Taml
- {0xCCA10000u, 1u}, // bft -> Arab
- {0xE0A10000u, 18u}, // bfy -> Deva
- {0x62670000u, 17u}, // bg -> Cyrl
- {0x88C10000u, 18u}, // bgc -> Deva
- {0xB4C10000u, 1u}, // bgn -> Arab
- {0xDCC10000u, 25u}, // bgx -> Grek
- {0x84E10000u, 18u}, // bhb -> Deva
+ {0xC0A10000u, 85u}, // bfq -> Taml
+ {0xCCA10000u, 2u}, // bft -> Arab
+ {0xE0A10000u, 19u}, // bfy -> Deva
+ {0x62670000u, 18u}, // bg -> Cyrl
+ {0x88C10000u, 19u}, // bgc -> Deva
+ {0xB4C10000u, 2u}, // bgn -> Arab
+ {0xDCC10000u, 26u}, // bgx -> Grek
+ {0x84E10000u, 19u}, // bhb -> Deva
{0x98E10000u, 46u}, // bhg -> Latn
- {0xA0E10000u, 18u}, // bhi -> Deva
+ {0xA0E10000u, 19u}, // bhi -> Deva
{0xACE10000u, 46u}, // bhl -> Latn
- {0xB8E10000u, 18u}, // bho -> Deva
+ {0xB8E10000u, 19u}, // bho -> Deva
{0xE0E10000u, 46u}, // bhy -> Latn
{0x62690000u, 46u}, // bi -> Latn
{0x85010000u, 46u}, // bib -> Latn
@@ -254,8 +255,8 @@
{0xB9010000u, 46u}, // bio -> Latn
{0xC1010000u, 46u}, // biq -> Latn
{0x9D210000u, 46u}, // bjh -> Latn
- {0xA1210000u, 20u}, // bji -> Ethi
- {0xA5210000u, 18u}, // bjj -> Deva
+ {0xA1210000u, 21u}, // bji -> Ethi
+ {0xA5210000u, 19u}, // bjj -> Deva
{0xB5210000u, 46u}, // bjn -> Latn
{0xB9210000u, 46u}, // bjo -> Latn
{0xC5210000u, 46u}, // bjr -> Latn
@@ -266,39 +267,39 @@
{0xC1410000u, 46u}, // bkq -> Latn
{0xD1410000u, 46u}, // bku -> Latn
{0xD5410000u, 46u}, // bkv -> Latn
- {0xCD610000u, 86u}, // blt -> Tavt
+ {0xCD610000u, 87u}, // blt -> Tavt
{0x626D0000u, 46u}, // bm -> Latn
{0x9D810000u, 46u}, // bmh -> Latn
{0xA9810000u, 46u}, // bmk -> Latn
{0xC1810000u, 46u}, // bmq -> Latn
{0xD1810000u, 46u}, // bmu -> Latn
- {0x626E0000u, 7u}, // bn -> Beng
+ {0x626E0000u, 8u}, // bn -> Beng
{0x99A10000u, 46u}, // bng -> Latn
{0xB1A10000u, 46u}, // bnm -> Latn
{0xBDA10000u, 46u}, // bnp -> Latn
- {0x626F0000u, 91u}, // bo -> Tibt
+ {0x626F0000u, 92u}, // bo -> Tibt
{0xA5C10000u, 46u}, // boj -> Latn
{0xB1C10000u, 46u}, // bom -> Latn
{0xB5C10000u, 46u}, // bon -> Latn
- {0xE1E10000u, 7u}, // bpy -> Beng
+ {0xE1E10000u, 8u}, // bpy -> Beng
{0x8A010000u, 46u}, // bqc -> Latn
- {0xA2010000u, 1u}, // bqi -> Arab
+ {0xA2010000u, 2u}, // bqi -> Arab
{0xBE010000u, 46u}, // bqp -> Latn
{0xD6010000u, 46u}, // bqv -> Latn
{0x62720000u, 46u}, // br -> Latn
- {0x82210000u, 18u}, // bra -> Deva
- {0x9E210000u, 1u}, // brh -> Arab
- {0xDE210000u, 18u}, // brx -> Deva
+ {0x82210000u, 19u}, // bra -> Deva
+ {0x9E210000u, 2u}, // brh -> Arab
+ {0xDE210000u, 19u}, // brx -> Deva
{0xE6210000u, 46u}, // brz -> Latn
{0x62730000u, 46u}, // bs -> Latn
{0xA6410000u, 46u}, // bsj -> Latn
- {0xC2410000u, 6u}, // bsq -> Bass
+ {0xC2410000u, 7u}, // bsq -> Bass
{0xCA410000u, 46u}, // bss -> Latn
- {0xCE410000u, 20u}, // bst -> Ethi
+ {0xCE410000u, 21u}, // bst -> Ethi
{0xBA610000u, 46u}, // bto -> Latn
{0xCE610000u, 46u}, // btt -> Latn
- {0xD6610000u, 18u}, // btv -> Deva
- {0x82810000u, 17u}, // bua -> Cyrl
+ {0xD6610000u, 19u}, // btv -> Deva
+ {0x82810000u, 18u}, // bua -> Cyrl
{0x8A810000u, 46u}, // buc -> Latn
{0x8E810000u, 46u}, // bud -> Latn
{0x9A810000u, 46u}, // bug -> Latn
@@ -312,7 +313,7 @@
{0xC6C10000u, 46u}, // bwr -> Latn
{0x9EE10000u, 46u}, // bxh -> Latn
{0x93010000u, 46u}, // bye -> Latn
- {0xB7010000u, 20u}, // byn -> Ethi
+ {0xB7010000u, 21u}, // byn -> Ethi
{0xC7010000u, 46u}, // byr -> Latn
{0xCB010000u, 46u}, // bys -> Latn
{0xD7010000u, 46u}, // byv -> Latn
@@ -327,44 +328,44 @@
{0xB4020000u, 46u}, // can -> Latn
{0xA4220000u, 46u}, // cbj -> Latn
{0x9C420000u, 46u}, // cch -> Latn
- {0xBC420000u, 9u}, // ccp -> Cakm
- {0x63650000u, 17u}, // ce -> Cyrl
+ {0xBC420000u, 10u}, // ccp -> Cakm
+ {0x63650000u, 18u}, // ce -> Cyrl
{0x84820000u, 46u}, // ceb -> Latn
{0x80A20000u, 46u}, // cfa -> Latn
{0x98C20000u, 46u}, // cgg -> Latn
{0x63680000u, 46u}, // ch -> Latn
{0xA8E20000u, 46u}, // chk -> Latn
- {0xB0E20000u, 17u}, // chm -> Cyrl
+ {0xB0E20000u, 18u}, // chm -> Cyrl
{0xB8E20000u, 46u}, // cho -> Latn
{0xBCE20000u, 46u}, // chp -> Latn
- {0xC4E20000u, 13u}, // chr -> Cher
+ {0xC4E20000u, 14u}, // chr -> Cher
{0x89020000u, 46u}, // cic -> Latn
- {0x81220000u, 1u}, // cja -> Arab
- {0xB1220000u, 12u}, // cjm -> Cham
+ {0x81220000u, 2u}, // cja -> Arab
+ {0xB1220000u, 13u}, // cjm -> Cham
{0xD5220000u, 46u}, // cjv -> Latn
- {0x85420000u, 1u}, // ckb -> Arab
+ {0x85420000u, 2u}, // ckb -> Arab
{0xAD420000u, 46u}, // ckl -> Latn
{0xB9420000u, 46u}, // cko -> Latn
{0xE1420000u, 46u}, // cky -> Latn
{0x81620000u, 46u}, // cla -> Latn
{0x91820000u, 46u}, // cme -> Latn
- {0x99820000u, 80u}, // cmg -> Soyo
+ {0x99820000u, 81u}, // cmg -> Soyo
{0x636F0000u, 46u}, // co -> Latn
- {0xBDC20000u, 15u}, // cop -> Copt
+ {0xBDC20000u, 16u}, // cop -> Copt
{0xC9E20000u, 46u}, // cps -> Latn
- {0x63720000u, 10u}, // cr -> Cans
- {0x9E220000u, 17u}, // crh -> Cyrl
- {0xA6220000u, 10u}, // crj -> Cans
- {0xAA220000u, 10u}, // crk -> Cans
- {0xAE220000u, 10u}, // crl -> Cans
- {0xB2220000u, 10u}, // crm -> Cans
+ {0x63720000u, 11u}, // cr -> Cans
+ {0x9E220000u, 18u}, // crh -> Cyrl
+ {0xA6220000u, 11u}, // crj -> Cans
+ {0xAA220000u, 11u}, // crk -> Cans
+ {0xAE220000u, 11u}, // crl -> Cans
+ {0xB2220000u, 11u}, // crm -> Cans
{0xCA220000u, 46u}, // crs -> Latn
{0x63730000u, 46u}, // cs -> Latn
{0x86420000u, 46u}, // csb -> Latn
- {0xDA420000u, 10u}, // csw -> Cans
- {0x8E620000u, 67u}, // ctd -> Pauc
- {0x63750000u, 17u}, // cu -> Cyrl
- {0x63760000u, 17u}, // cv -> Cyrl
+ {0xDA420000u, 11u}, // csw -> Cans
+ {0x8E620000u, 68u}, // ctd -> Pauc
+ {0x63750000u, 18u}, // cu -> Cyrl
+ {0x63760000u, 18u}, // cv -> Cyrl
{0x63790000u, 46u}, // cy -> Latn
{0x64610000u, 46u}, // da -> Latn
{0x8C030000u, 46u}, // dad -> Latn
@@ -372,11 +373,11 @@
{0x98030000u, 46u}, // dag -> Latn
{0x9C030000u, 46u}, // dah -> Latn
{0xA8030000u, 46u}, // dak -> Latn
- {0xC4030000u, 17u}, // dar -> Cyrl
+ {0xC4030000u, 18u}, // dar -> Cyrl
{0xD4030000u, 46u}, // dav -> Latn
{0x8C230000u, 46u}, // dbd -> Latn
{0xC0230000u, 46u}, // dbq -> Latn
- {0x88430000u, 1u}, // dcc -> Arab
+ {0x88430000u, 2u}, // dcc -> Arab
{0xB4630000u, 46u}, // ddn -> Latn
{0x64650000u, 46u}, // de -> Latn
{0x8C830000u, 46u}, // ded -> Latn
@@ -384,53 +385,54 @@
{0x80C30000u, 46u}, // dga -> Latn
{0x9CC30000u, 46u}, // dgh -> Latn
{0xA0C30000u, 46u}, // dgi -> Latn
- {0xACC30000u, 1u}, // dgl -> Arab
+ {0xACC30000u, 2u}, // dgl -> Arab
{0xC4C30000u, 46u}, // dgr -> Latn
{0xE4C30000u, 46u}, // dgz -> Latn
{0x81030000u, 46u}, // dia -> Latn
{0x91230000u, 46u}, // dje -> Latn
+ {0x95830000u, 54u}, // dmf -> Medf
{0xA5A30000u, 46u}, // dnj -> Latn
{0x85C30000u, 46u}, // dob -> Latn
- {0xA1C30000u, 18u}, // doi -> Deva
+ {0xA1C30000u, 19u}, // doi -> Deva
{0xBDC30000u, 46u}, // dop -> Latn
{0xD9C30000u, 46u}, // dow -> Latn
- {0x9E230000u, 56u}, // drh -> Mong
+ {0x9E230000u, 57u}, // drh -> Mong
{0xA2230000u, 46u}, // dri -> Latn
- {0xCA230000u, 20u}, // drs -> Ethi
+ {0xCA230000u, 21u}, // drs -> Ethi
{0x86430000u, 46u}, // dsb -> Latn
{0xB2630000u, 46u}, // dtm -> Latn
{0xBE630000u, 46u}, // dtp -> Latn
{0xCA630000u, 46u}, // dts -> Latn
- {0xE2630000u, 18u}, // dty -> Deva
+ {0xE2630000u, 19u}, // dty -> Deva
{0x82830000u, 46u}, // dua -> Latn
{0x8A830000u, 46u}, // duc -> Latn
{0x8E830000u, 46u}, // dud -> Latn
{0x9A830000u, 46u}, // dug -> Latn
- {0x64760000u, 89u}, // dv -> Thaa
+ {0x64760000u, 90u}, // dv -> Thaa
{0x82A30000u, 46u}, // dva -> Latn
{0xDAC30000u, 46u}, // dww -> Latn
{0xBB030000u, 46u}, // dyo -> Latn
{0xD3030000u, 46u}, // dyu -> Latn
- {0x647A0000u, 91u}, // dz -> Tibt
+ {0x647A0000u, 92u}, // dz -> Tibt
{0x9B230000u, 46u}, // dzg -> Latn
{0xD0240000u, 46u}, // ebu -> Latn
{0x65650000u, 46u}, // ee -> Latn
{0xA0A40000u, 46u}, // efi -> Latn
{0xACC40000u, 46u}, // egl -> Latn
- {0xE0C40000u, 19u}, // egy -> Egyp
+ {0xE0C40000u, 20u}, // egy -> Egyp
{0x81440000u, 46u}, // eka -> Latn
{0xE1440000u, 37u}, // eky -> Kali
- {0x656C0000u, 25u}, // el -> Grek
+ {0x656C0000u, 26u}, // el -> Grek
{0x81840000u, 46u}, // ema -> Latn
{0xA1840000u, 46u}, // emi -> Latn
{0x656E0000u, 46u}, // en -> Latn
- {0x656E5841u, 98u}, // en-XA -> ~~~A
+ {0x656E5841u, 99u}, // en-XA -> ~~~A
{0xB5A40000u, 46u}, // enn -> Latn
{0xC1A40000u, 46u}, // enq -> Latn
{0x656F0000u, 46u}, // eo -> Latn
{0xA2240000u, 46u}, // eri -> Latn
{0x65730000u, 46u}, // es -> Latn
- {0x9A440000u, 23u}, // esg -> Gonm
+ {0x9A440000u, 24u}, // esg -> Gonm
{0xD2440000u, 46u}, // esu -> Latn
{0x65740000u, 46u}, // et -> Latn
{0xC6640000u, 46u}, // etr -> Latn
@@ -441,7 +443,7 @@
{0xBAC40000u, 46u}, // ewo -> Latn
{0xCEE40000u, 46u}, // ext -> Latn
{0x83240000u, 46u}, // eza -> Latn
- {0x66610000u, 1u}, // fa -> Arab
+ {0x66610000u, 2u}, // fa -> Arab
{0x80050000u, 46u}, // faa -> Latn
{0x84050000u, 46u}, // fab -> Latn
{0x98050000u, 46u}, // fag -> Latn
@@ -451,7 +453,7 @@
{0xA0A50000u, 46u}, // ffi -> Latn
{0xB0A50000u, 46u}, // ffm -> Latn
{0x66690000u, 46u}, // fi -> Latn
- {0x81050000u, 1u}, // fia -> Arab
+ {0x81050000u, 2u}, // fia -> Arab
{0xAD050000u, 46u}, // fil -> Latn
{0xCD050000u, 46u}, // fit -> Latn
{0x666A0000u, 46u}, // fj -> Latn
@@ -468,7 +470,7 @@
{0xBE250000u, 46u}, // frp -> Latn
{0xC6250000u, 46u}, // frr -> Latn
{0xCA250000u, 46u}, // frs -> Latn
- {0x86850000u, 1u}, // fub -> Arab
+ {0x86850000u, 2u}, // fub -> Arab
{0x8E850000u, 46u}, // fud -> Latn
{0x92850000u, 46u}, // fue -> Latn
{0x96850000u, 46u}, // fuf -> Latn
@@ -486,14 +488,14 @@
{0x9C060000u, 46u}, // gah -> Latn
{0xA4060000u, 46u}, // gaj -> Latn
{0xB0060000u, 46u}, // gam -> Latn
- {0xB4060000u, 28u}, // gan -> Hans
+ {0xB4060000u, 29u}, // gan -> Hans
{0xD8060000u, 46u}, // gaw -> Latn
{0xE0060000u, 46u}, // gay -> Latn
{0x80260000u, 46u}, // gba -> Latn
{0x94260000u, 46u}, // gbf -> Latn
- {0xB0260000u, 18u}, // gbm -> Deva
+ {0xB0260000u, 19u}, // gbm -> Deva
{0xE0260000u, 46u}, // gby -> Latn
- {0xE4260000u, 1u}, // gbz -> Arab
+ {0xE4260000u, 2u}, // gbz -> Arab
{0xC4460000u, 46u}, // gcr -> Latn
{0x67640000u, 46u}, // gd -> Latn
{0x90660000u, 46u}, // gde -> Latn
@@ -502,38 +504,38 @@
{0x84860000u, 46u}, // geb -> Latn
{0xA4860000u, 46u}, // gej -> Latn
{0xAC860000u, 46u}, // gel -> Latn
- {0xE4860000u, 20u}, // gez -> Ethi
+ {0xE4860000u, 21u}, // gez -> Ethi
{0xA8A60000u, 46u}, // gfk -> Latn
- {0xB4C60000u, 18u}, // ggn -> Deva
+ {0xB4C60000u, 19u}, // ggn -> Deva
{0xC8E60000u, 46u}, // ghs -> Latn
{0xAD060000u, 46u}, // gil -> Latn
{0xB1060000u, 46u}, // gim -> Latn
- {0xA9260000u, 1u}, // gjk -> Arab
+ {0xA9260000u, 2u}, // gjk -> Arab
{0xB5260000u, 46u}, // gjn -> Latn
- {0xD1260000u, 1u}, // gju -> Arab
+ {0xD1260000u, 2u}, // gju -> Arab
{0xB5460000u, 46u}, // gkn -> Latn
{0xBD460000u, 46u}, // gkp -> Latn
{0x676C0000u, 46u}, // gl -> Latn
- {0xA9660000u, 1u}, // glk -> Arab
+ {0xA9660000u, 2u}, // glk -> Arab
{0xB1860000u, 46u}, // gmm -> Latn
- {0xD5860000u, 20u}, // gmv -> Ethi
+ {0xD5860000u, 21u}, // gmv -> Ethi
{0x676E0000u, 46u}, // gn -> Latn
{0x8DA60000u, 46u}, // gnd -> Latn
{0x99A60000u, 46u}, // gng -> Latn
{0x8DC60000u, 46u}, // god -> Latn
- {0x95C60000u, 20u}, // gof -> Ethi
+ {0x95C60000u, 21u}, // gof -> Ethi
{0xA1C60000u, 46u}, // goi -> Latn
- {0xB1C60000u, 18u}, // gom -> Deva
- {0xB5C60000u, 87u}, // gon -> Telu
+ {0xB1C60000u, 19u}, // gom -> Deva
+ {0xB5C60000u, 88u}, // gon -> Telu
{0xC5C60000u, 46u}, // gor -> Latn
{0xC9C60000u, 46u}, // gos -> Latn
- {0xCDC60000u, 24u}, // got -> Goth
+ {0xCDC60000u, 25u}, // got -> Goth
{0x86260000u, 46u}, // grb -> Latn
- {0x8A260000u, 16u}, // grc -> Cprt
- {0xCE260000u, 7u}, // grt -> Beng
+ {0x8A260000u, 17u}, // grc -> Cprt
+ {0xCE260000u, 8u}, // grt -> Beng
{0xDA260000u, 46u}, // grw -> Latn
{0xDA460000u, 46u}, // gsw -> Latn
- {0x67750000u, 26u}, // gu -> Gujr
+ {0x67750000u, 27u}, // gu -> Gujr
{0x86860000u, 46u}, // gub -> Latn
{0x8A860000u, 46u}, // guc -> Latn
{0x8E860000u, 46u}, // gud -> Latn
@@ -543,25 +545,25 @@
{0xE6860000u, 46u}, // guz -> Latn
{0x67760000u, 46u}, // gv -> Latn
{0x96A60000u, 46u}, // gvf -> Latn
- {0xC6A60000u, 18u}, // gvr -> Deva
+ {0xC6A60000u, 19u}, // gvr -> Deva
{0xCAA60000u, 46u}, // gvs -> Latn
- {0x8AC60000u, 1u}, // gwc -> Arab
+ {0x8AC60000u, 2u}, // gwc -> Arab
{0xA2C60000u, 46u}, // gwi -> Latn
- {0xCEC60000u, 1u}, // gwt -> Arab
+ {0xCEC60000u, 2u}, // gwt -> Arab
{0xA3060000u, 46u}, // gyi -> Latn
{0x68610000u, 46u}, // ha -> Latn
- {0x6861434Du, 1u}, // ha-CM -> Arab
- {0x68615344u, 1u}, // ha-SD -> Arab
+ {0x6861434Du, 2u}, // ha-CM -> Arab
+ {0x68615344u, 2u}, // ha-SD -> Arab
{0x98070000u, 46u}, // hag -> Latn
- {0xA8070000u, 28u}, // hak -> Hans
+ {0xA8070000u, 29u}, // hak -> Hans
{0xB0070000u, 46u}, // ham -> Latn
{0xD8070000u, 46u}, // haw -> Latn
- {0xE4070000u, 1u}, // haz -> Arab
+ {0xE4070000u, 2u}, // haz -> Arab
{0x84270000u, 46u}, // hbb -> Latn
- {0xE0670000u, 20u}, // hdy -> Ethi
+ {0xE0670000u, 21u}, // hdy -> Ethi
{0x68650000u, 31u}, // he -> Hebr
{0xE0E70000u, 46u}, // hhy -> Latn
- {0x68690000u, 18u}, // hi -> Deva
+ {0x68690000u, 19u}, // hi -> Deva
{0x81070000u, 46u}, // hia -> Latn
{0x95070000u, 46u}, // hif -> Latn
{0x99070000u, 46u}, // hig -> Latn
@@ -569,24 +571,24 @@
{0xAD070000u, 46u}, // hil -> Latn
{0x81670000u, 46u}, // hla -> Latn
{0xD1670000u, 32u}, // hlu -> Hluw
- {0x8D870000u, 70u}, // hmd -> Plrd
+ {0x8D870000u, 71u}, // hmd -> Plrd
{0xCD870000u, 46u}, // hmt -> Latn
- {0x8DA70000u, 1u}, // hnd -> Arab
- {0x91A70000u, 18u}, // hne -> Deva
+ {0x8DA70000u, 2u}, // hnd -> Arab
+ {0x91A70000u, 19u}, // hne -> Deva
{0xA5A70000u, 33u}, // hnj -> Hmng
{0xB5A70000u, 46u}, // hnn -> Latn
- {0xB9A70000u, 1u}, // hno -> Arab
+ {0xB9A70000u, 2u}, // hno -> Arab
{0x686F0000u, 46u}, // ho -> Latn
- {0x89C70000u, 18u}, // hoc -> Deva
- {0xA5C70000u, 18u}, // hoj -> Deva
+ {0x89C70000u, 19u}, // hoc -> Deva
+ {0xA5C70000u, 19u}, // hoj -> Deva
{0xCDC70000u, 46u}, // hot -> Latn
{0x68720000u, 46u}, // hr -> Latn
{0x86470000u, 46u}, // hsb -> Latn
- {0xB6470000u, 28u}, // hsn -> Hans
+ {0xB6470000u, 29u}, // hsn -> Hans
{0x68740000u, 46u}, // ht -> Latn
{0x68750000u, 46u}, // hu -> Latn
{0xA2870000u, 46u}, // hui -> Latn
- {0x68790000u, 3u}, // hy -> Armn
+ {0x68790000u, 4u}, // hy -> Armn
{0x687A0000u, 46u}, // hz -> Latn
{0x69610000u, 46u}, // ia -> Latn
{0xB4080000u, 46u}, // ian -> Latn
@@ -604,7 +606,7 @@
{0x69670000u, 46u}, // ig -> Latn
{0x84C80000u, 46u}, // igb -> Latn
{0x90C80000u, 46u}, // ige -> Latn
- {0x69690000u, 97u}, // ii -> Yiii
+ {0x69690000u, 98u}, // ii -> Yiii
{0xA5280000u, 46u}, // ijj -> Latn
{0x696B0000u, 46u}, // ik -> Latn
{0xA9480000u, 46u}, // ikk -> Latn
@@ -614,13 +616,13 @@
{0xB9680000u, 46u}, // ilo -> Latn
{0xB9880000u, 46u}, // imo -> Latn
{0x696E0000u, 46u}, // in -> Latn
- {0x9DA80000u, 17u}, // inh -> Cyrl
+ {0x9DA80000u, 18u}, // inh -> Cyrl
{0x696F0000u, 46u}, // io -> Latn
{0xD1C80000u, 46u}, // iou -> Latn
{0xA2280000u, 46u}, // iri -> Latn
{0x69730000u, 46u}, // is -> Latn
{0x69740000u, 46u}, // it -> Latn
- {0x69750000u, 10u}, // iu -> Cans
+ {0x69750000u, 11u}, // iu -> Cans
{0x69770000u, 31u}, // iw -> Hebr
{0xB2C80000u, 46u}, // iwm -> Latn
{0xCAC80000u, 46u}, // iws -> Latn
@@ -638,13 +640,13 @@
{0x6A690000u, 31u}, // ji -> Hebr
{0x85090000u, 46u}, // jib -> Latn
{0x89890000u, 46u}, // jmc -> Latn
- {0xAD890000u, 18u}, // jml -> Deva
+ {0xAD890000u, 19u}, // jml -> Deva
{0x82290000u, 46u}, // jra -> Latn
{0xCE890000u, 46u}, // jut -> Latn
{0x6A760000u, 46u}, // jv -> Latn
{0x6A770000u, 46u}, // jw -> Latn
- {0x6B610000u, 21u}, // ka -> Geor
- {0x800A0000u, 17u}, // kaa -> Cyrl
+ {0x6B610000u, 22u}, // ka -> Geor
+ {0x800A0000u, 18u}, // kaa -> Cyrl
{0x840A0000u, 46u}, // kab -> Latn
{0x880A0000u, 46u}, // kac -> Latn
{0x8C0A0000u, 46u}, // kad -> Latn
@@ -652,37 +654,37 @@
{0xA40A0000u, 46u}, // kaj -> Latn
{0xB00A0000u, 46u}, // kam -> Latn
{0xB80A0000u, 46u}, // kao -> Latn
- {0x8C2A0000u, 17u}, // kbd -> Cyrl
+ {0x8C2A0000u, 18u}, // kbd -> Cyrl
{0xB02A0000u, 46u}, // kbm -> Latn
{0xBC2A0000u, 46u}, // kbp -> Latn
{0xC02A0000u, 46u}, // kbq -> Latn
{0xDC2A0000u, 46u}, // kbx -> Latn
- {0xE02A0000u, 1u}, // kby -> Arab
+ {0xE02A0000u, 2u}, // kby -> Arab
{0x984A0000u, 46u}, // kcg -> Latn
{0xA84A0000u, 46u}, // kck -> Latn
{0xAC4A0000u, 46u}, // kcl -> Latn
{0xCC4A0000u, 46u}, // kct -> Latn
{0x906A0000u, 46u}, // kde -> Latn
- {0x9C6A0000u, 1u}, // kdh -> Arab
+ {0x9C6A0000u, 2u}, // kdh -> Arab
{0xAC6A0000u, 46u}, // kdl -> Latn
- {0xCC6A0000u, 90u}, // kdt -> Thai
+ {0xCC6A0000u, 91u}, // kdt -> Thai
{0x808A0000u, 46u}, // kea -> Latn
{0xB48A0000u, 46u}, // ken -> Latn
{0xE48A0000u, 46u}, // kez -> Latn
{0xB8AA0000u, 46u}, // kfo -> Latn
- {0xC4AA0000u, 18u}, // kfr -> Deva
- {0xE0AA0000u, 18u}, // kfy -> Deva
+ {0xC4AA0000u, 19u}, // kfr -> Deva
+ {0xE0AA0000u, 19u}, // kfy -> Deva
{0x6B670000u, 46u}, // kg -> Latn
{0x90CA0000u, 46u}, // kge -> Latn
{0x94CA0000u, 46u}, // kgf -> Latn
{0xBCCA0000u, 46u}, // kgp -> Latn
{0x80EA0000u, 46u}, // kha -> Latn
- {0x84EA0000u, 83u}, // khb -> Talu
- {0xB4EA0000u, 18u}, // khn -> Deva
+ {0x84EA0000u, 84u}, // khb -> Talu
+ {0xB4EA0000u, 19u}, // khn -> Deva
{0xC0EA0000u, 46u}, // khq -> Latn
{0xC8EA0000u, 46u}, // khs -> Latn
- {0xCCEA0000u, 58u}, // kht -> Mymr
- {0xD8EA0000u, 1u}, // khw -> Arab
+ {0xCCEA0000u, 59u}, // kht -> Mymr
+ {0xD8EA0000u, 2u}, // khw -> Arab
{0xE4EA0000u, 46u}, // khz -> Latn
{0x6B690000u, 46u}, // ki -> Latn
{0xA50A0000u, 46u}, // kij -> Latn
@@ -693,11 +695,11 @@
{0x992A0000u, 45u}, // kjg -> Laoo
{0xC92A0000u, 46u}, // kjs -> Latn
{0xE12A0000u, 46u}, // kjy -> Latn
- {0x6B6B0000u, 17u}, // kk -> Cyrl
- {0x6B6B4146u, 1u}, // kk-AF -> Arab
- {0x6B6B434Eu, 1u}, // kk-CN -> Arab
- {0x6B6B4952u, 1u}, // kk-IR -> Arab
- {0x6B6B4D4Eu, 1u}, // kk-MN -> Arab
+ {0x6B6B0000u, 18u}, // kk -> Cyrl
+ {0x6B6B4146u, 2u}, // kk-AF -> Arab
+ {0x6B6B434Eu, 2u}, // kk-CN -> Arab
+ {0x6B6B4952u, 2u}, // kk-IR -> Arab
+ {0x6B6B4D4Eu, 2u}, // kk-MN -> Arab
{0x894A0000u, 46u}, // kkc -> Latn
{0xA54A0000u, 46u}, // kkj -> Latn
{0x6B6C0000u, 46u}, // kl -> Latn
@@ -716,8 +718,8 @@
{0x95AA0000u, 46u}, // knf -> Latn
{0xBDAA0000u, 46u}, // knp -> Latn
{0x6B6F0000u, 43u}, // ko -> Kore
- {0xA1CA0000u, 17u}, // koi -> Cyrl
- {0xA9CA0000u, 18u}, // kok -> Deva
+ {0xA1CA0000u, 18u}, // koi -> Cyrl
+ {0xA9CA0000u, 19u}, // kok -> Deva
{0xADCA0000u, 46u}, // kol -> Latn
{0xC9CA0000u, 46u}, // kos -> Latn
{0xE5CA0000u, 46u}, // koz -> Latn
@@ -729,58 +731,58 @@
{0x860A0000u, 46u}, // kqb -> Latn
{0x960A0000u, 46u}, // kqf -> Latn
{0xCA0A0000u, 46u}, // kqs -> Latn
- {0xE20A0000u, 20u}, // kqy -> Ethi
+ {0xE20A0000u, 21u}, // kqy -> Ethi
{0x6B720000u, 46u}, // kr -> Latn
- {0x8A2A0000u, 17u}, // krc -> Cyrl
+ {0x8A2A0000u, 18u}, // krc -> Cyrl
{0xA22A0000u, 46u}, // kri -> Latn
{0xA62A0000u, 46u}, // krj -> Latn
{0xAE2A0000u, 46u}, // krl -> Latn
{0xCA2A0000u, 46u}, // krs -> Latn
- {0xD22A0000u, 18u}, // kru -> Deva
- {0x6B730000u, 1u}, // ks -> Arab
+ {0xD22A0000u, 19u}, // kru -> Deva
+ {0x6B730000u, 2u}, // ks -> Arab
{0x864A0000u, 46u}, // ksb -> Latn
{0x8E4A0000u, 46u}, // ksd -> Latn
{0x964A0000u, 46u}, // ksf -> Latn
{0x9E4A0000u, 46u}, // ksh -> Latn
{0xA64A0000u, 46u}, // ksj -> Latn
{0xC64A0000u, 46u}, // ksr -> Latn
- {0x866A0000u, 20u}, // ktb -> Ethi
+ {0x866A0000u, 21u}, // ktb -> Ethi
{0xB26A0000u, 46u}, // ktm -> Latn
{0xBA6A0000u, 46u}, // kto -> Latn
{0xC66A0000u, 46u}, // ktr -> Latn
{0x6B750000u, 46u}, // ku -> Latn
- {0x6B754952u, 1u}, // ku-IR -> Arab
- {0x6B754C42u, 1u}, // ku-LB -> Arab
+ {0x6B754952u, 2u}, // ku-IR -> Arab
+ {0x6B754C42u, 2u}, // ku-LB -> Arab
{0x868A0000u, 46u}, // kub -> Latn
{0x8E8A0000u, 46u}, // kud -> Latn
{0x928A0000u, 46u}, // kue -> Latn
{0xA68A0000u, 46u}, // kuj -> Latn
- {0xB28A0000u, 17u}, // kum -> Cyrl
+ {0xB28A0000u, 18u}, // kum -> Cyrl
{0xB68A0000u, 46u}, // kun -> Latn
{0xBE8A0000u, 46u}, // kup -> Latn
{0xCA8A0000u, 46u}, // kus -> Latn
- {0x6B760000u, 17u}, // kv -> Cyrl
+ {0x6B760000u, 18u}, // kv -> Cyrl
{0x9AAA0000u, 46u}, // kvg -> Latn
{0xC6AA0000u, 46u}, // kvr -> Latn
- {0xDEAA0000u, 1u}, // kvx -> Arab
+ {0xDEAA0000u, 2u}, // kvx -> Arab
{0x6B770000u, 46u}, // kw -> Latn
{0xA6CA0000u, 46u}, // kwj -> Latn
{0xBACA0000u, 46u}, // kwo -> Latn
{0xC2CA0000u, 46u}, // kwq -> Latn
{0x82EA0000u, 46u}, // kxa -> Latn
- {0x8AEA0000u, 20u}, // kxc -> Ethi
+ {0x8AEA0000u, 21u}, // kxc -> Ethi
{0x92EA0000u, 46u}, // kxe -> Latn
- {0xAEEA0000u, 18u}, // kxl -> Deva
- {0xB2EA0000u, 90u}, // kxm -> Thai
- {0xBEEA0000u, 1u}, // kxp -> Arab
+ {0xAEEA0000u, 19u}, // kxl -> Deva
+ {0xB2EA0000u, 91u}, // kxm -> Thai
+ {0xBEEA0000u, 2u}, // kxp -> Arab
{0xDAEA0000u, 46u}, // kxw -> Latn
{0xE6EA0000u, 46u}, // kxz -> Latn
- {0x6B790000u, 17u}, // ky -> Cyrl
- {0x6B79434Eu, 1u}, // ky-CN -> Arab
+ {0x6B790000u, 18u}, // ky -> Cyrl
+ {0x6B79434Eu, 2u}, // ky-CN -> Arab
{0x6B795452u, 46u}, // ky-TR -> Latn
{0x930A0000u, 46u}, // kye -> Latn
{0xDF0A0000u, 46u}, // kyx -> Latn
- {0x9F2A0000u, 1u}, // kzh -> Arab
+ {0x9F2A0000u, 2u}, // kzh -> Arab
{0xA72A0000u, 46u}, // kzj -> Latn
{0xC72A0000u, 46u}, // kzr -> Latn
{0xCF2A0000u, 46u}, // kzt -> Latn
@@ -788,15 +790,15 @@
{0x840B0000u, 48u}, // lab -> Lina
{0x8C0B0000u, 31u}, // lad -> Hebr
{0x980B0000u, 46u}, // lag -> Latn
- {0x9C0B0000u, 1u}, // lah -> Arab
+ {0x9C0B0000u, 2u}, // lah -> Arab
{0xA40B0000u, 46u}, // laj -> Latn
{0xC80B0000u, 46u}, // las -> Latn
{0x6C620000u, 46u}, // lb -> Latn
- {0x902B0000u, 17u}, // lbe -> Cyrl
+ {0x902B0000u, 18u}, // lbe -> Cyrl
{0xD02B0000u, 46u}, // lbu -> Latn
{0xD82B0000u, 46u}, // lbw -> Latn
{0xB04B0000u, 46u}, // lcm -> Latn
- {0xBC4B0000u, 90u}, // lcp -> Thai
+ {0xBC4B0000u, 91u}, // lcp -> Thai
{0x846B0000u, 46u}, // ldb -> Latn
{0x8C8B0000u, 46u}, // led -> Latn
{0x908B0000u, 46u}, // lee -> Latn
@@ -804,23 +806,23 @@
{0xBC8B0000u, 47u}, // lep -> Lepc
{0xC08B0000u, 46u}, // leq -> Latn
{0xD08B0000u, 46u}, // leu -> Latn
- {0xE48B0000u, 17u}, // lez -> Cyrl
+ {0xE48B0000u, 18u}, // lez -> Cyrl
{0x6C670000u, 46u}, // lg -> Latn
{0x98CB0000u, 46u}, // lgg -> Latn
{0x6C690000u, 46u}, // li -> Latn
{0x810B0000u, 46u}, // lia -> Latn
{0x8D0B0000u, 46u}, // lid -> Latn
- {0x950B0000u, 18u}, // lif -> Deva
+ {0x950B0000u, 19u}, // lif -> Deva
{0x990B0000u, 46u}, // lig -> Latn
{0x9D0B0000u, 46u}, // lih -> Latn
{0xA50B0000u, 46u}, // lij -> Latn
{0xC90B0000u, 49u}, // lis -> Lisu
{0xBD2B0000u, 46u}, // ljp -> Latn
- {0xA14B0000u, 1u}, // lki -> Arab
+ {0xA14B0000u, 2u}, // lki -> Arab
{0xCD4B0000u, 46u}, // lkt -> Latn
{0x916B0000u, 46u}, // lle -> Latn
{0xB56B0000u, 46u}, // lln -> Latn
- {0xB58B0000u, 87u}, // lmn -> Telu
+ {0xB58B0000u, 88u}, // lmn -> Telu
{0xB98B0000u, 46u}, // lmo -> Latn
{0xBD8B0000u, 46u}, // lmp -> Latn
{0x6C6E0000u, 46u}, // ln -> Latn
@@ -833,25 +835,25 @@
{0xC5CB0000u, 46u}, // lor -> Latn
{0xC9CB0000u, 46u}, // los -> Latn
{0xE5CB0000u, 46u}, // loz -> Latn
- {0x8A2B0000u, 1u}, // lrc -> Arab
+ {0x8A2B0000u, 2u}, // lrc -> Arab
{0x6C740000u, 46u}, // lt -> Latn
{0x9A6B0000u, 46u}, // ltg -> Latn
{0x6C750000u, 46u}, // lu -> Latn
{0x828B0000u, 46u}, // lua -> Latn
{0xBA8B0000u, 46u}, // luo -> Latn
{0xE28B0000u, 46u}, // luy -> Latn
- {0xE68B0000u, 1u}, // luz -> Arab
+ {0xE68B0000u, 2u}, // luz -> Arab
{0x6C760000u, 46u}, // lv -> Latn
- {0xAECB0000u, 90u}, // lwl -> Thai
- {0x9F2B0000u, 28u}, // lzh -> Hans
+ {0xAECB0000u, 91u}, // lwl -> Thai
+ {0x9F2B0000u, 29u}, // lzh -> Hans
{0xE72B0000u, 46u}, // lzz -> Latn
{0x8C0C0000u, 46u}, // mad -> Latn
{0x940C0000u, 46u}, // maf -> Latn
- {0x980C0000u, 18u}, // mag -> Deva
- {0xA00C0000u, 18u}, // mai -> Deva
+ {0x980C0000u, 19u}, // mag -> Deva
+ {0xA00C0000u, 19u}, // mai -> Deva
{0xA80C0000u, 46u}, // mak -> Latn
{0xB40C0000u, 46u}, // man -> Latn
- {0xB40C474Eu, 60u}, // man-GN -> Nkoo
+ {0xB40C474Eu, 61u}, // man-GN -> Nkoo
{0xC80C0000u, 46u}, // mas -> Latn
{0xD80C0000u, 46u}, // maw -> Latn
{0xE40C0000u, 46u}, // maz -> Latn
@@ -866,12 +868,12 @@
{0xC44C0000u, 46u}, // mcr -> Latn
{0xD04C0000u, 46u}, // mcu -> Latn
{0x806C0000u, 46u}, // mda -> Latn
- {0x906C0000u, 1u}, // mde -> Arab
- {0x946C0000u, 17u}, // mdf -> Cyrl
+ {0x906C0000u, 2u}, // mde -> Arab
+ {0x946C0000u, 18u}, // mdf -> Cyrl
{0x9C6C0000u, 46u}, // mdh -> Latn
{0xA46C0000u, 46u}, // mdj -> Latn
{0xC46C0000u, 46u}, // mdr -> Latn
- {0xDC6C0000u, 20u}, // mdx -> Ethi
+ {0xDC6C0000u, 21u}, // mdx -> Ethi
{0x8C8C0000u, 46u}, // med -> Latn
{0x908C0000u, 46u}, // mee -> Latn
{0xA88C0000u, 46u}, // mek -> Latn
@@ -879,7 +881,7 @@
{0xC48C0000u, 46u}, // mer -> Latn
{0xCC8C0000u, 46u}, // met -> Latn
{0xD08C0000u, 46u}, // meu -> Latn
- {0x80AC0000u, 1u}, // mfa -> Arab
+ {0x80AC0000u, 2u}, // mfa -> Arab
{0x90AC0000u, 46u}, // mfe -> Latn
{0xB4AC0000u, 46u}, // mfn -> Latn
{0xB8AC0000u, 46u}, // mfo -> Latn
@@ -888,7 +890,7 @@
{0x9CCC0000u, 46u}, // mgh -> Latn
{0xACCC0000u, 46u}, // mgl -> Latn
{0xB8CC0000u, 46u}, // mgo -> Latn
- {0xBCCC0000u, 18u}, // mgp -> Deva
+ {0xBCCC0000u, 19u}, // mgp -> Deva
{0xE0CC0000u, 46u}, // mgy -> Latn
{0x6D680000u, 46u}, // mh -> Latn
{0xA0EC0000u, 46u}, // mhi -> Latn
@@ -896,26 +898,25 @@
{0x6D690000u, 46u}, // mi -> Latn
{0x950C0000u, 46u}, // mif -> Latn
{0xB50C0000u, 46u}, // min -> Latn
- {0xC90C0000u, 30u}, // mis -> Hatr
{0xD90C0000u, 46u}, // miw -> Latn
- {0x6D6B0000u, 17u}, // mk -> Cyrl
- {0xA14C0000u, 1u}, // mki -> Arab
+ {0x6D6B0000u, 18u}, // mk -> Cyrl
+ {0xA14C0000u, 2u}, // mki -> Arab
{0xAD4C0000u, 46u}, // mkl -> Latn
{0xBD4C0000u, 46u}, // mkp -> Latn
{0xD94C0000u, 46u}, // mkw -> Latn
- {0x6D6C0000u, 55u}, // ml -> Mlym
+ {0x6D6C0000u, 56u}, // ml -> Mlym
{0x916C0000u, 46u}, // mle -> Latn
{0xBD6C0000u, 46u}, // mlp -> Latn
{0xC96C0000u, 46u}, // mls -> Latn
{0xB98C0000u, 46u}, // mmo -> Latn
{0xD18C0000u, 46u}, // mmu -> Latn
{0xDD8C0000u, 46u}, // mmx -> Latn
- {0x6D6E0000u, 17u}, // mn -> Cyrl
- {0x6D6E434Eu, 56u}, // mn-CN -> Mong
+ {0x6D6E0000u, 18u}, // mn -> Cyrl
+ {0x6D6E434Eu, 57u}, // mn-CN -> Mong
{0x81AC0000u, 46u}, // mna -> Latn
{0x95AC0000u, 46u}, // mnf -> Latn
- {0xA1AC0000u, 7u}, // mni -> Beng
- {0xD9AC0000u, 58u}, // mnw -> Mymr
+ {0xA1AC0000u, 8u}, // mni -> Beng
+ {0xD9AC0000u, 59u}, // mnw -> Mymr
{0x6D6F0000u, 46u}, // mo -> Latn
{0x81CC0000u, 46u}, // moa -> Latn
{0x91CC0000u, 46u}, // moe -> Latn
@@ -927,39 +928,39 @@
{0xCDEC0000u, 46u}, // mpt -> Latn
{0xDDEC0000u, 46u}, // mpx -> Latn
{0xAE0C0000u, 46u}, // mql -> Latn
- {0x6D720000u, 18u}, // mr -> Deva
- {0x8E2C0000u, 18u}, // mrd -> Deva
- {0xA62C0000u, 17u}, // mrj -> Cyrl
- {0xBA2C0000u, 57u}, // mro -> Mroo
+ {0x6D720000u, 19u}, // mr -> Deva
+ {0x8E2C0000u, 19u}, // mrd -> Deva
+ {0xA62C0000u, 18u}, // mrj -> Cyrl
+ {0xBA2C0000u, 58u}, // mro -> Mroo
{0x6D730000u, 46u}, // ms -> Latn
- {0x6D734343u, 1u}, // ms-CC -> Arab
+ {0x6D734343u, 2u}, // ms-CC -> Arab
{0x6D740000u, 46u}, // mt -> Latn
{0x8A6C0000u, 46u}, // mtc -> Latn
{0x966C0000u, 46u}, // mtf -> Latn
{0xA26C0000u, 46u}, // mti -> Latn
- {0xC66C0000u, 18u}, // mtr -> Deva
+ {0xC66C0000u, 19u}, // mtr -> Deva
{0x828C0000u, 46u}, // mua -> Latn
{0xC68C0000u, 46u}, // mur -> Latn
{0xCA8C0000u, 46u}, // mus -> Latn
{0x82AC0000u, 46u}, // mva -> Latn
{0xB6AC0000u, 46u}, // mvn -> Latn
- {0xE2AC0000u, 1u}, // mvy -> Arab
+ {0xE2AC0000u, 2u}, // mvy -> Arab
{0xAACC0000u, 46u}, // mwk -> Latn
- {0xC6CC0000u, 18u}, // mwr -> Deva
+ {0xC6CC0000u, 19u}, // mwr -> Deva
{0xD6CC0000u, 46u}, // mwv -> Latn
{0xDACC0000u, 34u}, // mww -> Hmnp
{0x8AEC0000u, 46u}, // mxc -> Latn
{0xB2EC0000u, 46u}, // mxm -> Latn
- {0x6D790000u, 58u}, // my -> Mymr
+ {0x6D790000u, 59u}, // my -> Mymr
{0xAB0C0000u, 46u}, // myk -> Latn
- {0xB30C0000u, 20u}, // mym -> Ethi
- {0xD70C0000u, 17u}, // myv -> Cyrl
+ {0xB30C0000u, 21u}, // mym -> Ethi
+ {0xD70C0000u, 18u}, // myv -> Cyrl
{0xDB0C0000u, 46u}, // myw -> Latn
{0xDF0C0000u, 46u}, // myx -> Latn
{0xE70C0000u, 52u}, // myz -> Mand
{0xAB2C0000u, 46u}, // mzk -> Latn
{0xB32C0000u, 46u}, // mzm -> Latn
- {0xB72C0000u, 1u}, // mzn -> Arab
+ {0xB72C0000u, 2u}, // mzn -> Arab
{0xBF2C0000u, 46u}, // mzp -> Latn
{0xDB2C0000u, 46u}, // mzw -> Latn
{0xE72C0000u, 46u}, // mzz -> Latn
@@ -967,7 +968,7 @@
{0x880D0000u, 46u}, // nac -> Latn
{0x940D0000u, 46u}, // naf -> Latn
{0xA80D0000u, 46u}, // nak -> Latn
- {0xB40D0000u, 28u}, // nan -> Hans
+ {0xB40D0000u, 29u}, // nan -> Hans
{0xBC0D0000u, 46u}, // nap -> Latn
{0xC00D0000u, 46u}, // naq -> Latn
{0xC80D0000u, 46u}, // nas -> Latn
@@ -981,9 +982,9 @@
{0x6E640000u, 46u}, // nd -> Latn
{0x886D0000u, 46u}, // ndc -> Latn
{0xC86D0000u, 46u}, // nds -> Latn
- {0x6E650000u, 18u}, // ne -> Deva
+ {0x6E650000u, 19u}, // ne -> Deva
{0x848D0000u, 46u}, // neb -> Latn
- {0xD88D0000u, 18u}, // new -> Deva
+ {0xD88D0000u, 19u}, // new -> Deva
{0xDC8D0000u, 46u}, // nex -> Latn
{0xC4AD0000u, 46u}, // nfr -> Latn
{0x6E670000u, 46u}, // ng -> Latn
@@ -1011,17 +1012,17 @@
{0x9DAD0000u, 46u}, // nnh -> Latn
{0xA9AD0000u, 46u}, // nnk -> Latn
{0xB1AD0000u, 46u}, // nnm -> Latn
- {0xBDAD0000u, 94u}, // nnp -> Wcho
+ {0xBDAD0000u, 95u}, // nnp -> Wcho
{0x6E6F0000u, 46u}, // no -> Latn
{0x8DCD0000u, 44u}, // nod -> Lana
- {0x91CD0000u, 18u}, // noe -> Deva
- {0xB5CD0000u, 72u}, // non -> Runr
+ {0x91CD0000u, 19u}, // noe -> Deva
+ {0xB5CD0000u, 73u}, // non -> Runr
{0xBDCD0000u, 46u}, // nop -> Latn
{0xD1CD0000u, 46u}, // nou -> Latn
- {0xBA0D0000u, 60u}, // nqo -> Nkoo
+ {0xBA0D0000u, 61u}, // nqo -> Nkoo
{0x6E720000u, 46u}, // nr -> Latn
{0x862D0000u, 46u}, // nrb -> Latn
- {0xAA4D0000u, 10u}, // nsk -> Cans
+ {0xAA4D0000u, 11u}, // nsk -> Cans
{0xB64D0000u, 46u}, // nsn -> Latn
{0xBA4D0000u, 46u}, // nso -> Latn
{0xCA4D0000u, 46u}, // nss -> Latn
@@ -1049,18 +1050,18 @@
{0xB5AE0000u, 46u}, // onn -> Latn
{0xC9AE0000u, 46u}, // ons -> Latn
{0xB1EE0000u, 46u}, // opm -> Latn
- {0x6F720000u, 65u}, // or -> Orya
+ {0x6F720000u, 66u}, // or -> Orya
{0xBA2E0000u, 46u}, // oro -> Latn
- {0xD22E0000u, 1u}, // oru -> Arab
- {0x6F730000u, 17u}, // os -> Cyrl
- {0x824E0000u, 66u}, // osa -> Osge
- {0x826E0000u, 1u}, // ota -> Arab
- {0xAA6E0000u, 64u}, // otk -> Orkh
+ {0xD22E0000u, 2u}, // oru -> Arab
+ {0x6F730000u, 18u}, // os -> Cyrl
+ {0x824E0000u, 67u}, // osa -> Osge
+ {0x826E0000u, 2u}, // ota -> Arab
+ {0xAA6E0000u, 65u}, // otk -> Orkh
{0xB32E0000u, 46u}, // ozm -> Latn
- {0x70610000u, 27u}, // pa -> Guru
- {0x7061504Bu, 1u}, // pa-PK -> Arab
+ {0x70610000u, 28u}, // pa -> Guru
+ {0x7061504Bu, 2u}, // pa-PK -> Arab
{0x980F0000u, 46u}, // pag -> Latn
- {0xAC0F0000u, 68u}, // pal -> Phli
+ {0xAC0F0000u, 69u}, // pal -> Phli
{0xB00F0000u, 46u}, // pam -> Latn
{0xBC0F0000u, 46u}, // pap -> Latn
{0xD00F0000u, 46u}, // pau -> Latn
@@ -1070,28 +1071,28 @@
{0x886F0000u, 46u}, // pdc -> Latn
{0xCC6F0000u, 46u}, // pdt -> Latn
{0x8C8F0000u, 46u}, // ped -> Latn
- {0xB88F0000u, 95u}, // peo -> Xpeo
+ {0xB88F0000u, 96u}, // peo -> Xpeo
{0xDC8F0000u, 46u}, // pex -> Latn
{0xACAF0000u, 46u}, // pfl -> Latn
- {0xACEF0000u, 1u}, // phl -> Arab
- {0xB4EF0000u, 69u}, // phn -> Phnx
+ {0xACEF0000u, 2u}, // phl -> Arab
+ {0xB4EF0000u, 70u}, // phn -> Phnx
{0xAD0F0000u, 46u}, // pil -> Latn
{0xBD0F0000u, 46u}, // pip -> Latn
- {0x814F0000u, 8u}, // pka -> Brah
+ {0x814F0000u, 9u}, // pka -> Brah
{0xB94F0000u, 46u}, // pko -> Latn
{0x706C0000u, 46u}, // pl -> Latn
{0x816F0000u, 46u}, // pla -> Latn
{0xC98F0000u, 46u}, // pms -> Latn
{0x99AF0000u, 46u}, // png -> Latn
{0xB5AF0000u, 46u}, // pnn -> Latn
- {0xCDAF0000u, 25u}, // pnt -> Grek
+ {0xCDAF0000u, 26u}, // pnt -> Grek
{0xB5CF0000u, 46u}, // pon -> Latn
- {0x81EF0000u, 18u}, // ppa -> Deva
+ {0x81EF0000u, 19u}, // ppa -> Deva
{0xB9EF0000u, 46u}, // ppo -> Latn
{0x822F0000u, 39u}, // pra -> Khar
- {0x8E2F0000u, 1u}, // prd -> Arab
+ {0x8E2F0000u, 2u}, // prd -> Arab
{0x9A2F0000u, 46u}, // prg -> Latn
- {0x70730000u, 1u}, // ps -> Arab
+ {0x70730000u, 2u}, // ps -> Arab
{0xCA4F0000u, 46u}, // pss -> Latn
{0x70740000u, 46u}, // pt -> Latn
{0xBE6F0000u, 46u}, // ptp -> Latn
@@ -1101,23 +1102,23 @@
{0x8A900000u, 46u}, // quc -> Latn
{0x9A900000u, 46u}, // qug -> Latn
{0xA0110000u, 46u}, // rai -> Latn
- {0xA4110000u, 18u}, // raj -> Deva
+ {0xA4110000u, 19u}, // raj -> Deva
{0xB8110000u, 46u}, // rao -> Latn
{0x94510000u, 46u}, // rcf -> Latn
{0xA4910000u, 46u}, // rej -> Latn
{0xAC910000u, 46u}, // rel -> Latn
{0xC8910000u, 46u}, // res -> Latn
{0xB4D10000u, 46u}, // rgn -> Latn
- {0x98F10000u, 1u}, // rhg -> Arab
+ {0x98F10000u, 2u}, // rhg -> Arab
{0x81110000u, 46u}, // ria -> Latn
- {0x95110000u, 88u}, // rif -> Tfng
+ {0x95110000u, 89u}, // rif -> Tfng
{0x95114E4Cu, 46u}, // rif-NL -> Latn
- {0xC9310000u, 18u}, // rjs -> Deva
- {0xCD510000u, 7u}, // rkt -> Beng
+ {0xC9310000u, 19u}, // rjs -> Deva
+ {0xCD510000u, 8u}, // rkt -> Beng
{0x726D0000u, 46u}, // rm -> Latn
{0x95910000u, 46u}, // rmf -> Latn
{0xB9910000u, 46u}, // rmo -> Latn
- {0xCD910000u, 1u}, // rmt -> Arab
+ {0xCD910000u, 2u}, // rmt -> Arab
{0xD1910000u, 46u}, // rmu -> Latn
{0x726E0000u, 46u}, // rn -> Latn
{0x81B10000u, 46u}, // rna -> Latn
@@ -1128,49 +1129,49 @@
{0xB9D10000u, 46u}, // roo -> Latn
{0xBA310000u, 46u}, // rro -> Latn
{0xB2710000u, 46u}, // rtm -> Latn
- {0x72750000u, 17u}, // ru -> Cyrl
- {0x92910000u, 17u}, // rue -> Cyrl
+ {0x72750000u, 18u}, // ru -> Cyrl
+ {0x92910000u, 18u}, // rue -> Cyrl
{0x9A910000u, 46u}, // rug -> Latn
{0x72770000u, 46u}, // rw -> Latn
{0xAAD10000u, 46u}, // rwk -> Latn
{0xBAD10000u, 46u}, // rwo -> Latn
{0xD3110000u, 38u}, // ryu -> Kana
- {0x73610000u, 18u}, // sa -> Deva
+ {0x73610000u, 19u}, // sa -> Deva
{0x94120000u, 46u}, // saf -> Latn
- {0x9C120000u, 17u}, // sah -> Cyrl
+ {0x9C120000u, 18u}, // sah -> Cyrl
{0xC0120000u, 46u}, // saq -> Latn
{0xC8120000u, 46u}, // sas -> Latn
- {0xCC120000u, 63u}, // sat -> Olck
+ {0xCC120000u, 64u}, // sat -> Olck
{0xD4120000u, 46u}, // sav -> Latn
- {0xE4120000u, 75u}, // saz -> Saur
+ {0xE4120000u, 76u}, // saz -> Saur
{0x80320000u, 46u}, // sba -> Latn
{0x90320000u, 46u}, // sbe -> Latn
{0xBC320000u, 46u}, // sbp -> Latn
{0x73630000u, 46u}, // sc -> Latn
- {0xA8520000u, 18u}, // sck -> Deva
- {0xAC520000u, 1u}, // scl -> Arab
+ {0xA8520000u, 19u}, // sck -> Deva
+ {0xAC520000u, 2u}, // scl -> Arab
{0xB4520000u, 46u}, // scn -> Latn
{0xB8520000u, 46u}, // sco -> Latn
{0xC8520000u, 46u}, // scs -> Latn
- {0x73640000u, 1u}, // sd -> Arab
+ {0x73640000u, 2u}, // sd -> Arab
{0x88720000u, 46u}, // sdc -> Latn
- {0x9C720000u, 1u}, // sdh -> Arab
+ {0x9C720000u, 2u}, // sdh -> Arab
{0x73650000u, 46u}, // se -> Latn
{0x94920000u, 46u}, // sef -> Latn
{0x9C920000u, 46u}, // seh -> Latn
{0xA0920000u, 46u}, // sei -> Latn
{0xC8920000u, 46u}, // ses -> Latn
{0x73670000u, 46u}, // sg -> Latn
- {0x80D20000u, 62u}, // sga -> Ogam
+ {0x80D20000u, 63u}, // sga -> Ogam
{0xC8D20000u, 46u}, // sgs -> Latn
- {0xD8D20000u, 20u}, // sgw -> Ethi
+ {0xD8D20000u, 21u}, // sgw -> Ethi
{0xE4D20000u, 46u}, // sgz -> Latn
{0x73680000u, 46u}, // sh -> Latn
- {0xA0F20000u, 88u}, // shi -> Tfng
+ {0xA0F20000u, 89u}, // shi -> Tfng
{0xA8F20000u, 46u}, // shk -> Latn
- {0xB4F20000u, 58u}, // shn -> Mymr
- {0xD0F20000u, 1u}, // shu -> Arab
- {0x73690000u, 77u}, // si -> Sinh
+ {0xB4F20000u, 59u}, // shn -> Mymr
+ {0xD0F20000u, 2u}, // shu -> Arab
+ {0x73690000u, 78u}, // si -> Sinh
{0x8D120000u, 46u}, // sid -> Latn
{0x99120000u, 46u}, // sig -> Latn
{0xAD120000u, 46u}, // sil -> Latn
@@ -1178,7 +1179,7 @@
{0xC5320000u, 46u}, // sjr -> Latn
{0x736B0000u, 46u}, // sk -> Latn
{0x89520000u, 46u}, // skc -> Latn
- {0xC5520000u, 1u}, // skr -> Arab
+ {0xC5520000u, 2u}, // skr -> Arab
{0xC9520000u, 46u}, // sks -> Latn
{0x736C0000u, 46u}, // sl -> Latn
{0x8D720000u, 46u}, // sld -> Latn
@@ -1189,7 +1190,7 @@
{0x81920000u, 46u}, // sma -> Latn
{0xA5920000u, 46u}, // smj -> Latn
{0xB5920000u, 46u}, // smn -> Latn
- {0xBD920000u, 73u}, // smp -> Samr
+ {0xBD920000u, 74u}, // smp -> Samr
{0xC1920000u, 46u}, // smq -> Latn
{0xC9920000u, 46u}, // sms -> Latn
{0x736E0000u, 46u}, // sn -> Latn
@@ -1199,24 +1200,24 @@
{0xDDB20000u, 46u}, // snx -> Latn
{0xE1B20000u, 46u}, // sny -> Latn
{0x736F0000u, 46u}, // so -> Latn
- {0x99D20000u, 78u}, // sog -> Sogd
+ {0x99D20000u, 79u}, // sog -> Sogd
{0xA9D20000u, 46u}, // sok -> Latn
{0xC1D20000u, 46u}, // soq -> Latn
- {0xD1D20000u, 90u}, // sou -> Thai
+ {0xD1D20000u, 91u}, // sou -> Thai
{0xE1D20000u, 46u}, // soy -> Latn
{0x8DF20000u, 46u}, // spd -> Latn
{0xADF20000u, 46u}, // spl -> Latn
{0xC9F20000u, 46u}, // sps -> Latn
{0x73710000u, 46u}, // sq -> Latn
- {0x73720000u, 17u}, // sr -> Cyrl
+ {0x73720000u, 18u}, // sr -> Cyrl
{0x73724D45u, 46u}, // sr-ME -> Latn
{0x7372524Fu, 46u}, // sr-RO -> Latn
{0x73725255u, 46u}, // sr-RU -> Latn
{0x73725452u, 46u}, // sr-TR -> Latn
- {0x86320000u, 79u}, // srb -> Sora
+ {0x86320000u, 80u}, // srb -> Sora
{0xB6320000u, 46u}, // srn -> Latn
{0xC6320000u, 46u}, // srr -> Latn
- {0xDE320000u, 18u}, // srx -> Deva
+ {0xDE320000u, 19u}, // srx -> Deva
{0x73730000u, 46u}, // ss -> Latn
{0x8E520000u, 46u}, // ssd -> Latn
{0x9A520000u, 46u}, // ssg -> Latn
@@ -1232,18 +1233,18 @@
{0xCA920000u, 46u}, // sus -> Latn
{0x73760000u, 46u}, // sv -> Latn
{0x73770000u, 46u}, // sw -> Latn
- {0x86D20000u, 1u}, // swb -> Arab
+ {0x86D20000u, 2u}, // swb -> Arab
{0x8AD20000u, 46u}, // swc -> Latn
{0x9AD20000u, 46u}, // swg -> Latn
{0xBED20000u, 46u}, // swp -> Latn
- {0xD6D20000u, 18u}, // swv -> Deva
+ {0xD6D20000u, 19u}, // swv -> Deva
{0xB6F20000u, 46u}, // sxn -> Latn
{0xDAF20000u, 46u}, // sxw -> Latn
- {0xAF120000u, 7u}, // syl -> Beng
- {0xC7120000u, 81u}, // syr -> Syrc
+ {0xAF120000u, 8u}, // syl -> Beng
+ {0xC7120000u, 82u}, // syr -> Syrc
{0xAF320000u, 46u}, // szl -> Latn
- {0x74610000u, 84u}, // ta -> Taml
- {0xA4130000u, 18u}, // taj -> Deva
+ {0x74610000u, 85u}, // ta -> Taml
+ {0xA4130000u, 19u}, // taj -> Deva
{0xAC130000u, 46u}, // tal -> Latn
{0xB4130000u, 46u}, // tan -> Latn
{0xC0130000u, 46u}, // taq -> Latn
@@ -1256,28 +1257,28 @@
{0xE4330000u, 46u}, // tbz -> Latn
{0xA0530000u, 46u}, // tci -> Latn
{0xE0530000u, 42u}, // tcy -> Knda
- {0x8C730000u, 82u}, // tdd -> Tale
- {0x98730000u, 18u}, // tdg -> Deva
- {0x9C730000u, 18u}, // tdh -> Deva
+ {0x8C730000u, 83u}, // tdd -> Tale
+ {0x98730000u, 19u}, // tdg -> Deva
+ {0x9C730000u, 19u}, // tdh -> Deva
{0xD0730000u, 46u}, // tdu -> Latn
- {0x74650000u, 87u}, // te -> Telu
+ {0x74650000u, 88u}, // te -> Telu
{0x8C930000u, 46u}, // ted -> Latn
{0xB0930000u, 46u}, // tem -> Latn
{0xB8930000u, 46u}, // teo -> Latn
{0xCC930000u, 46u}, // tet -> Latn
{0xA0B30000u, 46u}, // tfi -> Latn
- {0x74670000u, 17u}, // tg -> Cyrl
- {0x7467504Bu, 1u}, // tg-PK -> Arab
+ {0x74670000u, 18u}, // tg -> Cyrl
+ {0x7467504Bu, 2u}, // tg-PK -> Arab
{0x88D30000u, 46u}, // tgc -> Latn
{0xB8D30000u, 46u}, // tgo -> Latn
{0xD0D30000u, 46u}, // tgu -> Latn
- {0x74680000u, 90u}, // th -> Thai
- {0xACF30000u, 18u}, // thl -> Deva
- {0xC0F30000u, 18u}, // thq -> Deva
- {0xC4F30000u, 18u}, // thr -> Deva
- {0x74690000u, 20u}, // ti -> Ethi
+ {0x74680000u, 91u}, // th -> Thai
+ {0xACF30000u, 19u}, // thl -> Deva
+ {0xC0F30000u, 19u}, // thq -> Deva
+ {0xC4F30000u, 19u}, // thr -> Deva
+ {0x74690000u, 21u}, // ti -> Ethi
{0x95130000u, 46u}, // tif -> Latn
- {0x99130000u, 20u}, // tig -> Ethi
+ {0x99130000u, 21u}, // tig -> Ethi
{0xA9130000u, 46u}, // tik -> Latn
{0xB1130000u, 46u}, // tim -> Latn
{0xB9130000u, 46u}, // tio -> Latn
@@ -1285,7 +1286,7 @@
{0x746B0000u, 46u}, // tk -> Latn
{0xAD530000u, 46u}, // tkl -> Latn
{0xC5530000u, 46u}, // tkr -> Latn
- {0xCD530000u, 18u}, // tkt -> Deva
+ {0xCD530000u, 19u}, // tkt -> Deva
{0x746C0000u, 46u}, // tl -> Latn
{0x95730000u, 46u}, // tlf -> Latn
{0xDD730000u, 46u}, // tlx -> Latn
@@ -1305,19 +1306,19 @@
{0x74720000u, 46u}, // tr -> Latn
{0xD2330000u, 46u}, // tru -> Latn
{0xD6330000u, 46u}, // trv -> Latn
- {0xDA330000u, 1u}, // trw -> Arab
+ {0xDA330000u, 2u}, // trw -> Arab
{0x74730000u, 46u}, // ts -> Latn
- {0x8E530000u, 25u}, // tsd -> Grek
- {0x96530000u, 18u}, // tsf -> Deva
+ {0x8E530000u, 26u}, // tsd -> Grek
+ {0x96530000u, 19u}, // tsf -> Deva
{0x9A530000u, 46u}, // tsg -> Latn
- {0xA6530000u, 91u}, // tsj -> Tibt
+ {0xA6530000u, 92u}, // tsj -> Tibt
{0xDA530000u, 46u}, // tsw -> Latn
- {0x74740000u, 17u}, // tt -> Cyrl
+ {0x74740000u, 18u}, // tt -> Cyrl
{0x8E730000u, 46u}, // ttd -> Latn
{0x92730000u, 46u}, // tte -> Latn
{0xA6730000u, 46u}, // ttj -> Latn
{0xC6730000u, 46u}, // ttr -> Latn
- {0xCA730000u, 90u}, // tts -> Thai
+ {0xCA730000u, 91u}, // tts -> Thai
{0xCE730000u, 46u}, // ttt -> Latn
{0x9E930000u, 46u}, // tuh -> Latn
{0xAE930000u, 46u}, // tul -> Latn
@@ -1328,25 +1329,26 @@
{0xD2B30000u, 46u}, // tvu -> Latn
{0x9ED30000u, 46u}, // twh -> Latn
{0xC2D30000u, 46u}, // twq -> Latn
- {0x9AF30000u, 85u}, // txg -> Tang
+ {0x9AF30000u, 86u}, // txg -> Tang
{0x74790000u, 46u}, // ty -> Latn
{0x83130000u, 46u}, // tya -> Latn
- {0xD7130000u, 17u}, // tyv -> Cyrl
+ {0xD7130000u, 18u}, // tyv -> Cyrl
{0xB3330000u, 46u}, // tzm -> Latn
{0xD0340000u, 46u}, // ubu -> Latn
- {0xB0740000u, 17u}, // udm -> Cyrl
- {0x75670000u, 1u}, // ug -> Arab
- {0x75674B5Au, 17u}, // ug-KZ -> Cyrl
- {0x75674D4Eu, 17u}, // ug-MN -> Cyrl
- {0x80D40000u, 92u}, // uga -> Ugar
- {0x756B0000u, 17u}, // uk -> Cyrl
+ {0xA0740000u, 0u}, // udi -> Aghb
+ {0xB0740000u, 18u}, // udm -> Cyrl
+ {0x75670000u, 2u}, // ug -> Arab
+ {0x75674B5Au, 18u}, // ug-KZ -> Cyrl
+ {0x75674D4Eu, 18u}, // ug-MN -> Cyrl
+ {0x80D40000u, 93u}, // uga -> Ugar
+ {0x756B0000u, 18u}, // uk -> Cyrl
{0xA1740000u, 46u}, // uli -> Latn
{0x85940000u, 46u}, // umb -> Latn
- {0xC5B40000u, 7u}, // unr -> Beng
- {0xC5B44E50u, 18u}, // unr-NP -> Deva
- {0xDDB40000u, 7u}, // unx -> Beng
+ {0xC5B40000u, 8u}, // unr -> Beng
+ {0xC5B44E50u, 19u}, // unr-NP -> Deva
+ {0xDDB40000u, 8u}, // unx -> Beng
{0xA9D40000u, 46u}, // uok -> Latn
- {0x75720000u, 1u}, // ur -> Arab
+ {0x75720000u, 2u}, // ur -> Arab
{0xA2340000u, 46u}, // uri -> Latn
{0xCE340000u, 46u}, // urt -> Latn
{0xDA340000u, 46u}, // urw -> Latn
@@ -1356,10 +1358,10 @@
{0x9EB40000u, 46u}, // uvh -> Latn
{0xAEB40000u, 46u}, // uvl -> Latn
{0x757A0000u, 46u}, // uz -> Latn
- {0x757A4146u, 1u}, // uz-AF -> Arab
- {0x757A434Eu, 17u}, // uz-CN -> Cyrl
+ {0x757A4146u, 2u}, // uz-AF -> Arab
+ {0x757A434Eu, 18u}, // uz-CN -> Cyrl
{0x98150000u, 46u}, // vag -> Latn
- {0xA0150000u, 93u}, // vai -> Vaii
+ {0xA0150000u, 94u}, // vai -> Vaii
{0xB4150000u, 46u}, // van -> Latn
{0x76650000u, 46u}, // ve -> Latn
{0x88950000u, 46u}, // vec -> Latn
@@ -1378,12 +1380,12 @@
{0x77610000u, 46u}, // wa -> Latn
{0x90160000u, 46u}, // wae -> Latn
{0xA4160000u, 46u}, // waj -> Latn
- {0xAC160000u, 20u}, // wal -> Ethi
+ {0xAC160000u, 21u}, // wal -> Ethi
{0xB4160000u, 46u}, // wan -> Latn
{0xC4160000u, 46u}, // war -> Latn
{0xBC360000u, 46u}, // wbp -> Latn
- {0xC0360000u, 87u}, // wbq -> Telu
- {0xC4360000u, 18u}, // wbr -> Deva
+ {0xC0360000u, 88u}, // wbq -> Telu
+ {0xC4360000u, 19u}, // wbr -> Deva
{0xA0560000u, 46u}, // wci -> Latn
{0xC4960000u, 46u}, // wer -> Latn
{0xA0D60000u, 46u}, // wgi -> Latn
@@ -1396,40 +1398,40 @@
{0xC9760000u, 46u}, // wls -> Latn
{0xB9960000u, 46u}, // wmo -> Latn
{0x89B60000u, 46u}, // wnc -> Latn
- {0xA1B60000u, 1u}, // wni -> Arab
+ {0xA1B60000u, 2u}, // wni -> Arab
{0xD1B60000u, 46u}, // wnu -> Latn
{0x776F0000u, 46u}, // wo -> Latn
{0x85D60000u, 46u}, // wob -> Latn
{0xC9D60000u, 46u}, // wos -> Latn
{0xCA360000u, 46u}, // wrs -> Latn
- {0x9A560000u, 22u}, // wsg -> Gong
+ {0x9A560000u, 23u}, // wsg -> Gong
{0xAA560000u, 46u}, // wsk -> Latn
- {0xB2760000u, 18u}, // wtm -> Deva
- {0xD2960000u, 28u}, // wuu -> Hans
+ {0xB2760000u, 19u}, // wtm -> Deva
+ {0xD2960000u, 29u}, // wuu -> Hans
{0xD6960000u, 46u}, // wuv -> Latn
{0x82D60000u, 46u}, // wwa -> Latn
{0xD4170000u, 46u}, // xav -> Latn
{0xA0370000u, 46u}, // xbi -> Latn
- {0xB8570000u, 14u}, // xco -> Chrs
- {0xC4570000u, 11u}, // xcr -> Cari
+ {0xB8570000u, 15u}, // xco -> Chrs
+ {0xC4570000u, 12u}, // xcr -> Cari
{0xC8970000u, 46u}, // xes -> Latn
{0x78680000u, 46u}, // xh -> Latn
{0x81770000u, 46u}, // xla -> Latn
{0x89770000u, 50u}, // xlc -> Lyci
{0x8D770000u, 51u}, // xld -> Lydi
- {0x95970000u, 21u}, // xmf -> Geor
+ {0x95970000u, 22u}, // xmf -> Geor
{0xB5970000u, 53u}, // xmn -> Mani
- {0xC5970000u, 54u}, // xmr -> Merc
- {0x81B70000u, 59u}, // xna -> Narb
- {0xC5B70000u, 18u}, // xnr -> Deva
+ {0xC5970000u, 55u}, // xmr -> Merc
+ {0x81B70000u, 60u}, // xna -> Narb
+ {0xC5B70000u, 19u}, // xnr -> Deva
{0x99D70000u, 46u}, // xog -> Latn
{0xB5D70000u, 46u}, // xon -> Latn
- {0xC5F70000u, 71u}, // xpr -> Prti
+ {0xC5F70000u, 72u}, // xpr -> Prti
{0x86370000u, 46u}, // xrb -> Latn
- {0x82570000u, 74u}, // xsa -> Sarb
+ {0x82570000u, 75u}, // xsa -> Sarb
{0xA2570000u, 46u}, // xsi -> Latn
{0xB2570000u, 46u}, // xsm -> Latn
- {0xC6570000u, 18u}, // xsr -> Deva
+ {0xC6570000u, 19u}, // xsr -> Deva
{0x92D70000u, 46u}, // xwe -> Latn
{0xB0180000u, 46u}, // yam -> Latn
{0xB8180000u, 46u}, // yao -> Latn
@@ -1458,33 +1460,33 @@
{0xAE380000u, 46u}, // yrl -> Latn
{0xCA580000u, 46u}, // yss -> Latn
{0x82980000u, 46u}, // yua -> Latn
- {0x92980000u, 29u}, // yue -> Hant
- {0x9298434Eu, 28u}, // yue-CN -> Hans
+ {0x92980000u, 30u}, // yue -> Hant
+ {0x9298434Eu, 29u}, // yue-CN -> Hans
{0xA6980000u, 46u}, // yuj -> Latn
{0xCE980000u, 46u}, // yut -> Latn
{0xDA980000u, 46u}, // yuw -> Latn
{0x7A610000u, 46u}, // za -> Latn
{0x98190000u, 46u}, // zag -> Latn
- {0xA4790000u, 1u}, // zdj -> Arab
+ {0xA4790000u, 2u}, // zdj -> Arab
{0x80990000u, 46u}, // zea -> Latn
- {0x9CD90000u, 88u}, // zgh -> Tfng
- {0x7A680000u, 28u}, // zh -> Hans
- {0x7A684155u, 29u}, // zh-AU -> Hant
- {0x7A68424Eu, 29u}, // zh-BN -> Hant
- {0x7A684742u, 29u}, // zh-GB -> Hant
- {0x7A684746u, 29u}, // zh-GF -> Hant
- {0x7A68484Bu, 29u}, // zh-HK -> Hant
- {0x7A684944u, 29u}, // zh-ID -> Hant
- {0x7A684D4Fu, 29u}, // zh-MO -> Hant
- {0x7A685041u, 29u}, // zh-PA -> Hant
- {0x7A685046u, 29u}, // zh-PF -> Hant
- {0x7A685048u, 29u}, // zh-PH -> Hant
- {0x7A685352u, 29u}, // zh-SR -> Hant
- {0x7A685448u, 29u}, // zh-TH -> Hant
- {0x7A685457u, 29u}, // zh-TW -> Hant
- {0x7A685553u, 29u}, // zh-US -> Hant
- {0x7A68564Eu, 29u}, // zh-VN -> Hant
- {0xDCF90000u, 61u}, // zhx -> Nshu
+ {0x9CD90000u, 89u}, // zgh -> Tfng
+ {0x7A680000u, 29u}, // zh -> Hans
+ {0x7A684155u, 30u}, // zh-AU -> Hant
+ {0x7A68424Eu, 30u}, // zh-BN -> Hant
+ {0x7A684742u, 30u}, // zh-GB -> Hant
+ {0x7A684746u, 30u}, // zh-GF -> Hant
+ {0x7A68484Bu, 30u}, // zh-HK -> Hant
+ {0x7A684944u, 30u}, // zh-ID -> Hant
+ {0x7A684D4Fu, 30u}, // zh-MO -> Hant
+ {0x7A685041u, 30u}, // zh-PA -> Hant
+ {0x7A685046u, 30u}, // zh-PF -> Hant
+ {0x7A685048u, 30u}, // zh-PH -> Hant
+ {0x7A685352u, 30u}, // zh-SR -> Hant
+ {0x7A685448u, 30u}, // zh-TH -> Hant
+ {0x7A685457u, 30u}, // zh-TW -> Hant
+ {0x7A685553u, 30u}, // zh-US -> Hant
+ {0x7A68564Eu, 30u}, // zh-VN -> Hant
+ {0xDCF90000u, 62u}, // zhx -> Nshu
{0x81190000u, 46u}, // zia -> Latn
{0xCD590000u, 41u}, // zkt -> Kits
{0xB1790000u, 46u}, // zlm -> Latn
@@ -1642,6 +1644,7 @@
0xB48343414C61746ELLU, // den_Latn_CA
0xC4C343414C61746ELLU, // dgr_Latn_CA
0x91234E454C61746ELLU, // dje_Latn_NE
+ 0x95834E474D656466LLU, // dmf_Medf_NG
0xA5A343494C61746ELLU, // dnj_Latn_CI
0xA1C3494E44657661LLU, // doi_Deva_IN
0x9E23434E4D6F6E67LLU, // drh_Mong_CN
@@ -1917,8 +1920,6 @@
0x6D684D484C61746ELLU, // mh_Latn_MH
0x6D694E5A4C61746ELLU, // mi_Latn_NZ
0xB50C49444C61746ELLU, // min_Latn_ID
- 0xC90C495148617472LLU, // mis_Hatr_IQ
- 0xC90C4E474D656466LLU, // mis_Medf_NG
0x6D6B4D4B4379726CLLU, // mk_Cyrl_MK
0x6D6C494E4D6C796DLLU, // ml_Mlym_IN
0xC96C53444C61746ELLU, // mls_Latn_SD
@@ -2174,6 +2175,7 @@
0x747950464C61746ELLU, // ty_Latn_PF
0xD71352554379726CLLU, // tyv_Cyrl_RU
0xB3334D414C61746ELLU, // tzm_Latn_MA
+ 0xA074525541676862LLU, // udi_Aghb_RU
0xB07452554379726CLLU, // udm_Cyrl_RU
0x7567434E41726162LLU, // ug_Arab_CN
0x75674B5A4379726CLLU, // ug_Cyrl_KZ
@@ -2382,6 +2384,8 @@
{0x65735553u, 0x6573A424u}, // es-US -> es-419
{0x65735559u, 0x6573A424u}, // es-UY -> es-419
{0x65735645u, 0x6573A424u}, // es-VE -> es-419
+ {0x6E620000u, 0x6E6F0000u}, // nb -> no
+ {0x6E6E0000u, 0x6E6F0000u}, // nn -> no
{0x7074414Fu, 0x70745054u}, // pt-AO -> pt-PT
{0x70744348u, 0x70745054u}, // pt-CH -> pt-PT
{0x70744356u, 0x70745054u}, // pt-CV -> pt-PT
diff --git a/libs/androidfw/PosixUtils.cpp b/libs/androidfw/PosixUtils.cpp
index 4ec525a..0269128 100644
--- a/libs/androidfw/PosixUtils.cpp
+++ b/libs/androidfw/PosixUtils.cpp
@@ -114,10 +114,10 @@
std::unique_ptr<ProcResult> result(new ProcResult());
result->status = status;
const auto out = ReadFile(stdout[0]);
- result->stdout = out ? *out : "";
+ result->stdout_str = out ? *out : "";
close(stdout[0]);
const auto err = ReadFile(stderr[0]);
- result->stderr = err ? *err : "";
+ result->stderr_str = err ? *err : "";
close(stderr[0]);
return result;
}
diff --git a/libs/androidfw/include/androidfw/PosixUtils.h b/libs/androidfw/include/androidfw/PosixUtils.h
index 8fc3ee2..bb20847 100644
--- a/libs/androidfw/include/androidfw/PosixUtils.h
+++ b/libs/androidfw/include/androidfw/PosixUtils.h
@@ -23,8 +23,8 @@
struct ProcResult {
int status;
- std::string stdout;
- std::string stderr;
+ std::string stdout_str;
+ std::string stderr_str;
};
// Fork, exec and wait for an external process. Return nullptr if the process could not be launched,
diff --git a/libs/androidfw/tests/PosixUtils_test.cpp b/libs/androidfw/tests/PosixUtils_test.cpp
index cf97f87..c7b3eba 100644
--- a/libs/androidfw/tests/PosixUtils_test.cpp
+++ b/libs/androidfw/tests/PosixUtils_test.cpp
@@ -30,14 +30,14 @@
const auto result = ExecuteBinary({"/bin/date", "--help"});
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, 0);
- ASSERT_EQ(result->stdout.find("usage: date "), 0);
+ ASSERT_EQ(result->stdout_str.find("usage: date "), 0);
}
TEST(PosixUtilsTest, RelativePathToBinary) {
const auto result = ExecuteBinary({"date", "--help"});
ASSERT_THAT(result, NotNull());
ASSERT_EQ(result->status, 0);
- ASSERT_EQ(result->stdout.find("usage: date "), 0);
+ ASSERT_EQ(result->stdout_str.find("usage: date "), 0);
}
TEST(PosixUtilsTest, BadParameters) {
diff --git a/media/OWNERS b/media/OWNERS
index abfc8bf..0aff43e 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -1,8 +1,7 @@
-chz@google.com
+# Bug component: 1344
elaurent@google.com
essick@google.com
etalvala@google.com
-gkasten@google.com
hdmoon@google.com
hkuang@google.com
hunga@google.com
@@ -13,16 +12,13 @@
jsharkey@android.com
klhyun@google.com
lajos@google.com
-marcone@google.com
nchalko@google.com
philburk@google.com
quxiangfang@google.com
wonsik@google.com
-# LON
-andrewlewis@google.com
-aquilescanta@google.com
-olly@google.com
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
# SEO
sungsoo@google.com
diff --git a/media/java/android/media/OWNERS b/media/java/android/media/OWNERS
index cf06fad..813dee3 100644
--- a/media/java/android/media/OWNERS
+++ b/media/java/android/media/OWNERS
@@ -1,9 +1,9 @@
# Bug component: 1344
-
fgoldfain@google.com
elaurent@google.com
lajos@google.com
-olly@google.com
-andrewlewis@google.com
sungsoo@google.com
jmtrivi@google.com
+
+# go/android-fwk-media-solutions for info on areas of ownership.
+include platform/frameworks/av:/media/janitors/media_solutions_OWNERS
diff --git a/media/jni/OWNERS b/media/jni/OWNERS
index f1b0237..445672b 100644
--- a/media/jni/OWNERS
+++ b/media/jni/OWNERS
@@ -2,4 +2,4 @@
per-file android_mtp_*.cpp=marcone@google.com,jsharkey@android.com,jameswei@google.com,rmojumder@google.com
# extra for TV related files
-per-file android_media_tv_*=nchalko@google.com,quxiangfang@google.com
+per-file android_media_tv_*=hgchen@google.com,quxiangfang@google.com
diff --git a/mms/OWNERS b/mms/OWNERS
index befc320..7f05a2a 100644
--- a/mms/OWNERS
+++ b/mms/OWNERS
@@ -2,7 +2,6 @@
tgunn@google.com
breadley@google.com
-hallliu@google.com
rgreenwalt@google.com
amitmahajan@google.com
fionaxu@google.com
@@ -10,7 +9,10 @@
jminjie@google.com
satk@google.com
shuoq@google.com
-refuhoo@google.com
nazaninb@google.com
sarahchin@google.com
-dbright@google.com
\ No newline at end of file
+xiaotonj@google.com
+huiwang@google.com
+jayachandranc@google.com
+chinmayd@google.com
+amruthr@google.com
diff --git a/packages/CarrierDefaultApp/OWNERS b/packages/CarrierDefaultApp/OWNERS
index 5668840..0d23f05 100644
--- a/packages/CarrierDefaultApp/OWNERS
+++ b/packages/CarrierDefaultApp/OWNERS
@@ -1,7 +1,6 @@
set noparent
tgunn@google.com
breadley@google.com
-hallliu@google.com
rgreenwalt@google.com
amitmahajan@google.com
fionaxu@google.com
@@ -9,9 +8,11 @@
jminjie@google.com
satk@google.com
shuoq@google.com
-refuhoo@google.com
nazaninb@google.com
sarahchin@google.com
-dbright@google.com
xiaotonj@google.com
+huiwang@google.com
+jayachandranc@google.com
+chinmayd@google.com
+amruthr@google.com
diff --git a/packages/DynamicSystemInstallationService/AndroidManifest.xml b/packages/DynamicSystemInstallationService/AndroidManifest.xml
index b4d520d..1bc4983 100644
--- a/packages/DynamicSystemInstallationService/AndroidManifest.xml
+++ b/packages/DynamicSystemInstallationService/AndroidManifest.xml
@@ -33,6 +33,10 @@
<intent-filter>
<action android:name="android.os.image.action.START_INSTALL" />
<category android:name="android.intent.category.DEFAULT" />
+ <data android:scheme="content" />
+ <data android:scheme="file" />
+ <data android:scheme="http" />
+ <data android:scheme="https" />
</intent-filter>
</activity>
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index 12a94e1..00cc753 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -81,7 +81,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Locale;
@@ -786,35 +785,6 @@
return mIsHearingAidProfileSupported;
}
- @Override
- /** @hide */
- public java.util.List<String> getSystemConfigEnabledProfilesForPackage(String packageName) {
- if (Binder.getCallingUid() != Process.BLUETOOTH_UID) {
- Slog.w(TAG, "getSystemConfigEnabledProfilesForPackage(): not allowed for non-bluetooth");
- return null;
- }
-
- SystemConfig systemConfig = SystemConfig.getInstance();
- if (systemConfig == null) {
- return null;
- }
-
- android.util.ArrayMap<String, Boolean> componentEnabledStates =
- systemConfig.getComponentsEnabledStates(packageName);
- if (componentEnabledStates == null) {
- return null;
- }
-
- ArrayList enabledProfiles = new ArrayList<String>();
- for (Map.Entry<String, Boolean> entry : componentEnabledStates.entrySet()) {
- if (entry.getValue()) {
- enabledProfiles.add(entry.getKey());
- }
- }
-
- return enabledProfiles;
- }
-
private boolean isDeviceProvisioned() {
return Settings.Global.getInt(mContentResolver, Settings.Global.DEVICE_PROVISIONED,
0) != 0;
@@ -2430,7 +2400,8 @@
try {
foregroundUser = ActivityManager.getCurrentUser();
valid = (callingUser == foregroundUser) || parentUser == foregroundUser
- || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid;
+ || callingAppId == Process.NFC_UID || callingAppId == mSystemUiUid
+ || callingAppId == Process.SHELL_UID;
if (DBG && !valid) {
Slog.d(TAG, "checkIfCallerIsForegroundUser: valid=" + valid + " callingUser="
+ callingUser + " parentUser=" + parentUser + " foregroundUser="
@@ -2456,6 +2427,16 @@
mContext.sendBroadcastAsUser(intent, UserHandle.ALL, BLUETOOTH_PERM);
}
+ private boolean isBleState(int state) {
+ switch (state) {
+ case BluetoothAdapter.STATE_BLE_ON:
+ case BluetoothAdapter.STATE_BLE_TURNING_ON:
+ case BluetoothAdapter.STATE_BLE_TURNING_OFF:
+ return true;
+ }
+ return false;
+ }
+
private void bluetoothStateChangeHandler(int prevState, int newState) {
boolean isStandardBroadcast = true;
if (prevState == newState) { // No change. Nothing to do.
@@ -2474,8 +2455,15 @@
sendBluetoothServiceDownCallback();
unbindAndFinish();
sendBleStateChanged(prevState, newState);
- // Don't broadcast as it has already been broadcast before
- isStandardBroadcast = false;
+
+ /* Currently, the OFF intent is broadcasted externally only when we transition
+ * from TURNING_OFF to BLE_ON state. So if the previous state is a BLE state,
+ * we are guaranteed that the OFF intent has been broadcasted earlier and we
+ * can safely skip it.
+ * Conversely, if the previous state is not a BLE state, it indicates that some
+ * sort of crash has occurred, moving us directly to STATE_OFF without ever
+ * passing through BLE_ON. We should broadcast the OFF intent in this case. */
+ isStandardBroadcast = !isBleState(prevState);
} else if (!intermediate_off) {
// connect to GattService
@@ -2528,6 +2516,11 @@
// Show prevState of BLE_ON as OFF to standard users
prevState = BluetoothAdapter.STATE_OFF;
}
+ if (DBG) {
+ Slog.d(TAG,
+ "Sending State Change: " + BluetoothAdapter.nameForState(prevState) + " > "
+ + BluetoothAdapter.nameForState(newState));
+ }
Intent intent = new Intent(BluetoothAdapter.ACTION_STATE_CHANGED);
intent.putExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, prevState);
intent.putExtra(BluetoothAdapter.EXTRA_STATE, newState);
diff --git a/services/core/java/com/android/server/adb/AdbService.java b/services/core/java/com/android/server/adb/AdbService.java
index 29bb542..7a4d2ce 100644
--- a/services/core/java/com/android/server/adb/AdbService.java
+++ b/services/core/java/com/android/server/adb/AdbService.java
@@ -27,6 +27,8 @@
import android.debug.AdbManager;
import android.debug.AdbManagerInternal;
import android.debug.AdbTransportType;
+import android.debug.FingerprintAndPairDevice;
+import android.debug.IAdbCallback;
import android.debug.IAdbManager;
import android.debug.IAdbTransport;
import android.debug.PairDevice;
@@ -35,6 +37,7 @@
import android.os.Binder;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
+import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -87,6 +90,7 @@
private final AdbConnectionPortListener mPortListener = new AdbConnectionPortListener();
private AdbDebuggingManager.AdbConnectionPortPoller mConnectionPortPoller;
+ private final RemoteCallbackList<IAdbCallback> mCallbacks = new RemoteCallbackList<>();
/**
* Manages the service lifecycle for {@code AdbService} in {@code SystemServer}.
*/
@@ -348,12 +352,21 @@
}
@Override
- public Map<String, PairDevice> getPairedDevices() {
+ public FingerprintAndPairDevice[] getPairedDevices() {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_DEBUGGING, null);
- if (mDebuggingManager != null) {
- return mDebuggingManager.getPairedDevices();
+ if (mDebuggingManager == null) {
+ return null;
}
- return null;
+ Map<String, PairDevice> map = mDebuggingManager.getPairedDevices();
+ FingerprintAndPairDevice[] ret = new FingerprintAndPairDevice[map.size()];
+ int i = 0;
+ for (Map.Entry<String, PairDevice> entry : map.entrySet()) {
+ ret[i] = new FingerprintAndPairDevice();
+ ret[i].keyFingerprint = entry.getKey();
+ ret[i].device = entry.getValue();
+ i++;
+ }
+ return ret;
}
@Override
@@ -401,6 +414,21 @@
return mConnectionPort.get();
}
+ @Override
+ public void registerCallback(IAdbCallback callback) throws RemoteException {
+ if (DEBUG) {
+ Slog.d(TAG, "Registering callback " + callback);
+ }
+ mCallbacks.register(callback);
+ }
+
+ @Override
+ public void unregisterCallback(IAdbCallback callback) throws RemoteException {
+ if (DEBUG) {
+ Slog.d(TAG, "Unregistering callback " + callback);
+ }
+ mCallbacks.unregister(callback);
+ }
/**
* This listener is only used when ro.adb.secure=0. Otherwise, AdbDebuggingManager will
* do this.
@@ -507,6 +535,23 @@
if (mDebuggingManager != null) {
mDebuggingManager.setAdbEnabled(enable, transportType);
}
+
+ if (DEBUG) {
+ Slog.d(TAG, "Broadcasting enable = " + enable + ", type = " + transportType);
+ }
+ mCallbacks.broadcast((callback) -> {
+ if (DEBUG) {
+ Slog.d(TAG, "Sending enable = " + enable + ", type = " + transportType
+ + " to " + callback);
+ }
+ try {
+ callback.onDebuggingChanged(enable, transportType);
+ } catch (RemoteException ex) {
+ if (DEBUG) {
+ Slog.d(TAG, "Unable to send onDebuggingChanged:", ex);
+ }
+ }
+ });
}
@Override
diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
index c20a01d..00dfd38 100644
--- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java
@@ -84,6 +84,7 @@
DeviceConfig.NAMESPACE_CONNECTIVITY,
DeviceConfig.NAMESPACE_INPUT_NATIVE_BOOT,
DeviceConfig.NAMESPACE_INTELLIGENCE_CONTENT_SUGGESTIONS,
+ DeviceConfig.NAMESPACE_LMKD_NATIVE,
DeviceConfig.NAMESPACE_MEDIA_NATIVE,
DeviceConfig.NAMESPACE_NETD_NATIVE,
DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT,
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 26f5c4c..cd3d27d 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -1648,10 +1648,9 @@
return;
}
Log.w(TAG, "Speaker client died");
- if (removeCommunicationRouteClient(client.getBinder(), false)
- != null) {
- onUpdateCommunicationRoute("onCommunicationRouteClientDied");
- }
+ setCommunicationRouteForClient(
+ client.getBinder(), client.getPid(), null,
+ BtHelper.SCO_MODE_UNDEFINED, "onCommunicationRouteClientDied");
}
/**
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
index f2e44ee..e7118ad 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/Tuner.java
@@ -28,10 +28,8 @@
import android.os.RemoteException;
import android.util.Slog;
-import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
class Tuner extends ITuner.Stub {
private static final String TAG = "BroadcastRadioService.Tuner";
@@ -292,12 +290,12 @@
}
@Override
- public Map setParameters(Map parameters) {
+ public Map<String, String> setParameters(Map<String, String> parameters) {
throw new UnsupportedOperationException("Not supported by HAL 1.x");
}
@Override
- public Map getParameters(List<String> keys) {
+ public Map<String, String> getParameters(List<String> keys) {
throw new UnsupportedOperationException("Not supported by HAL 1.x");
}
}
diff --git a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
index 7a6d964..867d5b4 100644
--- a/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
+++ b/services/core/java/com/android/server/broadcastradio/hal1/TunerCallback.java
@@ -18,12 +18,10 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.hardware.radio.ITuner;
import android.hardware.radio.ITunerCallback;
import android.hardware.radio.ProgramList;
import android.hardware.radio.ProgramSelector;
import android.hardware.radio.RadioManager;
-import android.hardware.radio.RadioMetadata;
import android.hardware.radio.RadioTuner;
import android.os.IBinder;
import android.os.RemoteException;
@@ -31,7 +29,6 @@
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
@@ -176,7 +173,7 @@
}
@Override
- public void onParametersUpdated(Map parameters) {
+ public void onParametersUpdated(Map<String, String> parameters) {
Slog.e(TAG, "Not applicable for HAL 1.x");
}
diff --git a/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java b/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
index 7ab3bdd..7d8c6a4 100644
--- a/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
+++ b/services/core/java/com/android/server/broadcastradio/hal2/TunerSession.java
@@ -299,7 +299,7 @@
}
@Override
- public Map setParameters(Map parameters) {
+ public Map<String, String> setParameters(Map<String, String> parameters) {
synchronized (mLock) {
checkNotClosedLocked();
return Convert.vendorInfoFromHal(Utils.maybeRethrow(
@@ -308,7 +308,7 @@
}
@Override
- public Map getParameters(List<String> keys) {
+ public Map<String, String> getParameters(List<String> keys) {
synchronized (mLock) {
checkNotClosedLocked();
return Convert.vendorInfoFromHal(Utils.maybeRethrow(
diff --git a/services/core/java/com/android/server/connectivity/PacProxyService.java b/services/core/java/com/android/server/connectivity/PacProxyService.java
index 0070339..b2df535 100644
--- a/services/core/java/com/android/server/connectivity/PacProxyService.java
+++ b/services/core/java/com/android/server/connectivity/PacProxyService.java
@@ -192,7 +192,7 @@
}
/**
- * Updates the PAC Proxy Installer with current Proxy information. This is called by
+ * Updates the PAC Proxy Service with current Proxy information. This is called by
* the ProxyTracker through PacProxyManager before a broadcast takes place to allow
* the PacProxyService to indicate that the broadcast should not be sent and the
* PacProxyService will trigger a new broadcast when it is ready.
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 378405f..f6f3db3 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -238,6 +238,14 @@
throws PackageManagerException;
/**
+ * Returns {@code ApeInfo} about apex sessions that have been marked ready via
+ * {@link #markStagedSessionReady(int)}
+ *
+ * Returns empty array if there is no staged apex session or if there is any error.
+ */
+ abstract ApexInfo[] getStagedApexInfos(ApexSessionParams params);
+
+ /**
* Mark a staged session previously submitted using {@code submitStagedSession} as ready to be
* applied at next reboot.
*
@@ -707,6 +715,19 @@
}
@Override
+ ApexInfo[] getStagedApexInfos(ApexSessionParams params) {
+ try {
+ return waitForApexService().getStagedApexInfos(params);
+ } catch (RemoteException re) {
+ Slog.w(TAG, "Unable to contact apexservice" + re.getMessage());
+ throw new RuntimeException(re);
+ } catch (Exception e) {
+ Slog.w(TAG, "Failed to collect staged apex infos" + e.getMessage());
+ return new ApexInfo[0];
+ }
+ }
+
+ @Override
void markStagedSessionReady(int sessionId) throws PackageManagerException {
try {
waitForApexService().markStagedSessionReady(sessionId);
@@ -1100,6 +1121,11 @@
}
@Override
+ ApexInfo[] getStagedApexInfos(ApexSessionParams params) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
void markStagedSessionReady(int sessionId) {
throw new UnsupportedOperationException();
}
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index f8115d3..0b07bb6 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -224,6 +224,10 @@
mStagingManager = new StagingManager(this, context, apexParserSupplier);
}
+ StagingManager getStagingManager() {
+ return mStagingManager;
+ }
+
boolean okToSendBroadcasts() {
return mOkToSendBroadcasts;
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index e4723ad..1173df6 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -21,14 +21,12 @@
import static android.Manifest.permission.MANAGE_DEVICE_ADMINS;
import static android.Manifest.permission.MANAGE_PROFILE_AND_DEVICE_OWNERS;
import static android.Manifest.permission.QUERY_ALL_PACKAGES;
-import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
import static android.Manifest.permission.SET_HARMFUL_APP_WARNINGS;
import static android.app.AppOpsManager.MODE_ALLOWED;
import static android.app.AppOpsManager.MODE_DEFAULT;
import static android.app.AppOpsManager.MODE_IGNORED;
import static android.content.Intent.ACTION_MAIN;
-import static android.content.Intent.CATEGORY_BROWSABLE;
import static android.content.Intent.CATEGORY_DEFAULT;
import static android.content.Intent.CATEGORY_HOME;
import static android.content.Intent.EXTRA_LONG_VERSION_CODE;
@@ -36,8 +34,6 @@
import static android.content.Intent.EXTRA_VERSION_CODE;
import static android.content.pm.PackageManager.CERT_INPUT_RAW_X509;
import static android.content.pm.PackageManager.CERT_INPUT_SHA256;
-import static android.content.Intent.CATEGORY_BROWSABLE;
-import static android.content.Intent.CATEGORY_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED;
@@ -181,6 +177,7 @@
import android.content.pm.IPackageManagerNative;
import android.content.pm.IPackageMoveObserver;
import android.content.pm.IPackageStatsObserver;
+import android.content.pm.IStagedApexObserver;
import android.content.pm.InstallSourceInfo;
import android.content.pm.InstantAppInfo;
import android.content.pm.InstantAppRequest;
@@ -220,6 +217,7 @@
import android.content.pm.SharedLibraryInfo;
import android.content.pm.Signature;
import android.content.pm.SigningInfo;
+import android.content.pm.StagedApexInfo;
import android.content.pm.SuspendDialogInfo;
import android.content.pm.UserInfo;
import android.content.pm.VerifierDeviceIdentity;
@@ -24119,6 +24117,28 @@
public String getModuleMetadataPackageName() throws RemoteException {
return PackageManagerService.this.mModuleInfoProvider.getPackageName();
}
+
+ @Override
+ public void registerStagedApexObserver(IStagedApexObserver observer) {
+ mInstallerService.getStagingManager().registerStagedApexObserver(observer);
+ }
+
+ @Override
+ public void unregisterStagedApexObserver(IStagedApexObserver observer) {
+ mInstallerService.getStagingManager().unregisterStagedApexObserver(observer);
+ }
+
+ @Override
+ public String[] getStagedApexModuleNames() {
+ return mInstallerService.getStagingManager()
+ .getStagedApexModuleNames().toArray(new String[0]);
+ }
+
+ @Override
+ @Nullable
+ public StagedApexInfo getStagedApexInfo(String moduleName) {
+ return mInstallerService.getStagingManager().getStagedApexInfo(moduleName);
+ }
}
private class PackageManagerInternalImpl extends PackageManagerInternal {
diff --git a/services/core/java/com/android/server/pm/StagingManager.java b/services/core/java/com/android/server/pm/StagingManager.java
index 4038bf2..02397da 100644
--- a/services/core/java/com/android/server/pm/StagingManager.java
+++ b/services/core/java/com/android/server/pm/StagingManager.java
@@ -29,7 +29,9 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
+import android.content.pm.ApexStagedEvent;
import android.content.pm.ApplicationInfo;
+import android.content.pm.IStagedApexObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageInstaller;
import android.content.pm.PackageInstaller.SessionInfo;
@@ -38,6 +40,7 @@
import android.content.pm.PackageParser.PackageParserException;
import android.content.pm.PackageParser.SigningDetails;
import android.content.pm.PackageParser.SigningDetails.SignatureSchemeVersion;
+import android.content.pm.StagedApexInfo;
import android.content.pm.parsing.PackageInfoWithoutStateUtils;
import android.content.rollback.IRollbackManager;
import android.content.rollback.RollbackInfo;
@@ -58,6 +61,7 @@
import android.os.storage.IStorageManager;
import android.os.storage.StorageManager;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.IntArray;
import android.util.Slog;
import android.util.SparseArray;
@@ -66,8 +70,10 @@
import android.util.apk.ApkSignatureVerifier;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.PackageHelper;
import com.android.internal.os.BackgroundThread;
+import com.android.internal.util.Preconditions;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.SystemServiceManager;
@@ -84,7 +90,9 @@
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@@ -103,7 +111,8 @@
private final ApexManager mApexManager;
private final PowerManager mPowerManager;
private final Context mContext;
- private final PreRebootVerificationHandler mPreRebootVerificationHandler;
+ @VisibleForTesting
+ final PreRebootVerificationHandler mPreRebootVerificationHandler;
private final Supplier<PackageParser2> mPackageParserSupplier;
private final File mFailureReasonFile = new File("/metadata/staged-install/failure_reason.txt");
@@ -122,6 +131,9 @@
@GuardedBy("mSuccessfulStagedSessionIds")
private final List<Integer> mSuccessfulStagedSessionIds = new ArrayList<>();
+ @GuardedBy("mStagedApexObservers")
+ private final List<IStagedApexObserver> mStagedApexObservers = new ArrayList<>();
+
StagingManager(PackageInstallerService pi, Context context,
Supplier<PackageParser2> packageParserSupplier) {
mPi = pi;
@@ -184,6 +196,35 @@
mApexManager.markBootCompleted();
}
+ void registerStagedApexObserver(IStagedApexObserver observer) {
+ if (observer == null) {
+ return;
+ }
+ if (observer.asBinder() != null) {
+ try {
+ observer.asBinder().linkToDeath(new IBinder.DeathRecipient() {
+ @Override
+ public void binderDied() {
+ synchronized (mStagedApexObservers) {
+ mStagedApexObservers.remove(observer);
+ }
+ }
+ }, 0);
+ } catch (RemoteException re) {
+ Slog.w(TAG, re.getMessage());
+ }
+ }
+ synchronized (mStagedApexObservers) {
+ mStagedApexObservers.add(observer);
+ }
+ }
+
+ void unregisterStagedApexObserver(IStagedApexObserver observer) {
+ synchronized (mStagedApexObservers) {
+ mStagedApexObservers.remove(observer);
+ }
+ }
+
/**
* Validates the signature used to sign the container of the new apex package
*
@@ -1075,6 +1116,9 @@
Slog.w(TAG, "Could not contact apexd to abort staged session " + sessionId);
}
}
+ if (sessionContainsApex(session)) {
+ notifyStagedApexObservers();
+ }
}
// Session was successfully aborted from apexd (if required) and pre-reboot verification
@@ -1299,7 +1343,107 @@
return session;
}
- private final class PreRebootVerificationHandler extends Handler {
+ /**
+ * Returns ApexInfo about APEX contained inside the session as a {@code Map<String, ApexInfo>},
+ * where the key of the map is the module name of the ApexInfo.
+ *
+ * Returns an empty map if there is any error.
+ */
+ @VisibleForTesting
+ @NonNull
+ Map<String, ApexInfo> getStagedApexInfos(@NonNull PackageInstallerSession session) {
+ Preconditions.checkArgument(session != null, "Session is null");
+ Preconditions.checkArgument(!session.hasParentSessionId(),
+ session.sessionId + " session has parent session");
+ Preconditions.checkArgument(sessionContainsApex(session),
+ session.sessionId + " session does not contain apex");
+
+ // Even if caller calls this method on ready session, the session could be abandoned
+ // right after this method is called.
+ if (!session.isStagedSessionReady() || session.isDestroyed()) {
+ return Collections.emptyMap();
+ }
+
+ ApexSessionParams params = new ApexSessionParams();
+ params.sessionId = session.sessionId;
+ final IntArray childSessionIds = new IntArray();
+ if (session.isMultiPackage()) {
+ for (int id : session.getChildSessionIds()) {
+ if (isApexSession(getStagedSession(id))) {
+ childSessionIds.add(id);
+ }
+ }
+ }
+ params.childSessionIds = childSessionIds.toArray();
+
+ ApexInfo[] infos = mApexManager.getStagedApexInfos(params);
+ Map<String, ApexInfo> result = new ArrayMap<>();
+ for (ApexInfo info : infos) {
+ result.put(info.moduleName, info);
+ }
+ return result;
+ }
+
+ /**
+ * Returns apex module names of all packages that are staged ready
+ */
+ List<String> getStagedApexModuleNames() {
+ List<String> result = new ArrayList<>();
+ synchronized (mStagedSessions) {
+ for (int i = 0; i < mStagedSessions.size(); i++) {
+ final PackageInstallerSession session = mStagedSessions.valueAt(i);
+ if (!session.isStagedSessionReady() || session.isDestroyed()
+ || session.hasParentSessionId() || !sessionContainsApex(session)) {
+ continue;
+ }
+ result.addAll(getStagedApexInfos(session).keySet());
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Returns ApexInfo of the {@code moduleInfo} provided if it is staged, otherwise returns null.
+ */
+ @Nullable
+ StagedApexInfo getStagedApexInfo(String moduleName) {
+ synchronized (mStagedSessions) {
+ for (int i = 0; i < mStagedSessions.size(); i++) {
+ final PackageInstallerSession session = mStagedSessions.valueAt(i);
+ if (!session.isStagedSessionReady() || session.isDestroyed()
+ || session.hasParentSessionId() || !sessionContainsApex(session)) {
+ continue;
+ }
+ ApexInfo ai = getStagedApexInfos(session).get(moduleName);
+ if (ai != null) {
+ StagedApexInfo info = new StagedApexInfo();
+ info.moduleName = ai.moduleName;
+ info.diskImagePath = ai.modulePath;
+ info.versionCode = ai.versionCode;
+ info.versionName = ai.versionName;
+ return info;
+ }
+ }
+ }
+ return null;
+ }
+
+ private void notifyStagedApexObservers() {
+ synchronized (mStagedApexObservers) {
+ for (IStagedApexObserver observer : mStagedApexObservers) {
+ ApexStagedEvent event = new ApexStagedEvent();
+ event.stagedApexModuleNames = getStagedApexModuleNames().toArray(new String[0]);
+ try {
+ observer.onApexStaged(event);
+ } catch (RemoteException re) {
+ Slog.w(TAG, "Failed to contact the observer " + re.getMessage());
+ }
+ }
+ }
+ }
+
+ @VisibleForTesting
+ final class PreRebootVerificationHandler extends Handler {
// Hold session ids before handler gets ready to do the verification.
private IntArray mPendingSessionIds;
private boolean mIsReady;
@@ -1327,7 +1471,8 @@
private static final int MSG_PRE_REBOOT_VERIFICATION_START = 1;
private static final int MSG_PRE_REBOOT_VERIFICATION_APEX = 2;
private static final int MSG_PRE_REBOOT_VERIFICATION_APK = 3;
- private static final int MSG_PRE_REBOOT_VERIFICATION_END = 4;
+ @VisibleForTesting
+ static final int MSG_PRE_REBOOT_VERIFICATION_END = 4;
@Override
public void handleMessage(Message msg) {
@@ -1579,6 +1724,7 @@
if (hasApex) {
try {
mApexManager.markStagedSessionReady(session.sessionId);
+ notifyStagedApexObservers();
} catch (PackageManagerException e) {
session.setStagedSessionFailed(e.error, e.getMessage());
return;
diff --git a/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java b/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java
index bdcd2cd..3524d7f 100644
--- a/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java
+++ b/services/core/java/com/android/server/policy/DisplayFoldDurationLogger.java
@@ -44,8 +44,8 @@
@Retention(RetentionPolicy.SOURCE)
public @interface ScreenState {}
- private @ScreenState int mScreenState = SCREEN_STATE_UNKNOWN;
- private Long mLastChanged = null;
+ private volatile @ScreenState int mScreenState = SCREEN_STATE_UNKNOWN;
+ private volatile Long mLastChanged = null;
private static final int LOG_SUBTYPE_UNFOLDED = 0;
private static final int LOG_SUBTYPE_FOLDED = 1;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 061fabf..e927667 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -3756,7 +3756,10 @@
if (sQuiescent) {
// Pass the optional "quiescent" argument to the bootloader to let it know
// that it should not turn the screen/lights on.
- reason = reason + ",quiescent";
+ if (reason != ""){
+ reason += ",";
+ }
+ reason = reason + "quiescent";
}
SystemProperties.set("sys.powerctl", "reboot," + reason);
diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
index bba5dcb..277163a6 100755
--- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java
+++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
@@ -114,6 +114,8 @@
private final SparseBooleanArray mHdmiStateMap = new SparseBooleanArray();
private final List<Message> mPendingHdmiDeviceEvents = new LinkedList<>();
+ private final List<Message> mPendingTvinputInfoEvents = new LinkedList<>();
+
// Calls to mListener should happen here.
private final Handler mHandler = new ListenerHandler();
@@ -229,7 +231,16 @@
connection.getInputStateLocked(), 0, inputId).sendToTarget();
}
}
- }
+ } else {
+ Message msg = mHandler.obtainMessage(ListenerHandler.TVINPUT_INFO_ADDED,
+ deviceId, cableConnectionStatus, connection);
+ for (Iterator<Message> it = mPendingTvinputInfoEvents.iterator(); it.hasNext();) {
+ if (it.next().arg1 == deviceId) {
+ it.remove();
+ }
+ }
+ mPendingTvinputInfoEvents.add(msg);
+ }
ITvInputHardwareCallback callback = connection.getCallbackLocked();
if (callback != null) {
try {
@@ -288,6 +299,8 @@
}
mHardwareInputIdMap.put(deviceId, info.getId());
mInputMap.put(info.getId(), info);
+ processPendingTvInputInfoEventsLocked();
+ Slog.d(TAG,"deviceId ="+ deviceId+", tvinputinfo = "+info);
// Process pending state changes
@@ -529,6 +542,20 @@
}
}
+
+ private void processPendingTvInputInfoEventsLocked() {
+ for (Iterator<Message> it = mPendingTvinputInfoEvents.iterator(); it.hasNext(); ) {
+ Message msg = it.next();
+ int deviceId = msg.arg1;
+ String inputId = mHardwareInputIdMap.get(deviceId);
+ if (inputId != null) {
+ msg.sendToTarget();
+ it.remove();
+ }
+ }
+ }
+
+
private void updateVolume() {
mCurrentMaxIndex = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mCurrentIndex = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
@@ -1181,6 +1208,7 @@
private static final int HDMI_DEVICE_ADDED = 4;
private static final int HDMI_DEVICE_REMOVED = 5;
private static final int HDMI_DEVICE_UPDATED = 6;
+ private static final int TVINPUT_INFO_ADDED = 7;
@Override
public final void handleMessage(Message msg) {
@@ -1225,6 +1253,29 @@
}
break;
}
+ case TVINPUT_INFO_ADDED: {
+ int deviceId = msg.arg1;
+ int cableConnectionStatus = msg.arg2;
+ Connection connection =(Connection)msg.obj;
+
+ int previousConfigsLength = connection.getConfigsLengthLocked();
+ int previousCableConnectionStatus = connection.getInputStateLocked();
+ String inputId = mHardwareInputIdMap.get(deviceId);
+
+ if (inputId != null) {
+ if (connection.updateCableConnectionStatusLocked(cableConnectionStatus)) {
+ if (previousCableConnectionStatus != connection.getInputStateLocked()) {
+ mListener.onStateChanged(inputId, connection.getInputStateLocked());
+ }
+ } else {
+ if ((previousConfigsLength == 0)
+ != (connection.getConfigsLengthLocked() == 0)) {
+ mListener.onStateChanged(inputId, connection.getInputStateLocked());
+ }
+ }
+ }
+ break;
+ }
default: {
Slog.w(TAG, "Unhandled message: " + msg);
break;
diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java
index 113797c..419a7fa 100644
--- a/services/core/java/com/android/server/wm/ActivityStarter.java
+++ b/services/core/java/com/android/server/wm/ActivityStarter.java
@@ -1468,7 +1468,7 @@
final Task targetTask = r.getTask() != null
? r.getTask()
: mTargetTask;
- if (startedActivityStack == null || targetTask == null) {
+ if (startedActivityStack == null || targetTask == null || !targetTask.isAttached()) {
return;
}
diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java
index e6a35f1..1f8a437 100644
--- a/services/core/java/com/android/server/wm/WindowProcessController.java
+++ b/services/core/java/com/android/server/wm/WindowProcessController.java
@@ -908,7 +908,7 @@
final int displayId = r.getDisplayId();
final Context c = root.getDisplayUiContext(displayId);
- if (r.mVisibleRequested && !displayContexts.contains(c)) {
+ if (c != null && r.mVisibleRequested && !displayContexts.contains(c)) {
displayContexts.add(c);
}
}
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index a0c96f0..d78e02b 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -158,7 +158,7 @@
"android.hardware.input.classifier@1.0",
"android.hardware.ir@1.0",
"android.hardware.light@2.0",
- "android.hardware.memtrack-V1-ndk_platform",
+ "android.hardware.memtrack-V1-ndk",
"android.hardware.power@1.0",
"android.hardware.power@1.1",
"android.hardware.power-V1-cpp",
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index d908945..5dfa86e 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -10314,7 +10314,7 @@
}
@Override
- public boolean setPermittedAccessibilityServices(ComponentName who, List packageList) {
+ public boolean setPermittedAccessibilityServices(ComponentName who, List<String> packageList) {
if (!mHasFeature) {
return false;
}
@@ -10367,7 +10367,7 @@
}
@Override
- public List getPermittedAccessibilityServices(ComponentName who) {
+ public List<String> getPermittedAccessibilityServices(ComponentName who) {
if (!mHasFeature) {
return null;
}
@@ -10381,7 +10381,7 @@
}
@Override
- public List getPermittedAccessibilityServicesForUser(int userId) {
+ public List<String> getPermittedAccessibilityServicesForUser(int userId) {
if (!mHasFeature) {
return null;
}
@@ -10465,7 +10465,7 @@
}
@Override
- public boolean setPermittedInputMethods(ComponentName who, List packageList) {
+ public boolean setPermittedInputMethods(ComponentName who, List<String> packageList) {
if (!mHasFeature) {
return false;
}
@@ -10505,7 +10505,7 @@
}
@Override
- public List getPermittedInputMethods(ComponentName who) {
+ public List<String> getPermittedInputMethods(ComponentName who) {
if (!mHasFeature) {
return null;
}
@@ -10519,7 +10519,7 @@
}
@Override
- public List getPermittedInputMethodsForCurrentUser() {
+ public List<String> getPermittedInputMethodsForCurrentUser() {
enforceManageUsers();
final int callingUserId = mInjector.userHandleGetCallingUserId();
diff --git a/services/net/Android.bp b/services/net/Android.bp
index 5a5f504..ad445f1 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -52,7 +52,6 @@
// classes generated by netd_aidl_interfaces-platform-java above.
"netd_aidl_interface-V3-java",
"networkstack-client",
- "modules-utils-build_system",
],
apex_available: [
"com.android.wifi",
diff --git a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
index 72afca0..b6f7922 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -37,6 +37,7 @@
import android.content.Context;
import android.content.pm.PackageInfo;
import android.os.RemoteException;
+import android.os.ServiceSpecificException;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -228,6 +229,21 @@
}
@Test
+ public void testGetStagedApexInfos_throwRunTimeException() throws RemoteException {
+ doThrow(RemoteException.class).when(mApexService).getStagedApexInfos(any());
+
+ assertThrows(RuntimeException.class,
+ () -> mApexManager.getStagedApexInfos(testParamsWithChildren()));
+ }
+
+ @Test
+ public void testGetStagedApexInfos_returnsEmptyArrayOnError() throws RemoteException {
+ doThrow(ServiceSpecificException.class).when(mApexService).getStagedApexInfos(any());
+
+ assertThat(mApexManager.getStagedApexInfos(testParamsWithChildren())).hasLength(0);
+ }
+
+ @Test
public void testMarkStagedSessionReady_throwPackageManagerException() throws RemoteException {
doAnswer(invocation -> {
throw new Exception();
diff --git a/telecomm/java/android/telecom/CallRedirectionService.java b/telecomm/java/android/telecom/CallRedirectionService.java
index c832f53..8dcae39 100644
--- a/telecomm/java/android/telecom/CallRedirectionService.java
+++ b/telecomm/java/android/telecom/CallRedirectionService.java
@@ -89,6 +89,13 @@
boolean allowInteractiveResponse);
/**
+ * Telecom calls this method when times out waiting for the {@link CallRedirectionService} to
+ * call {@link #placeCallUnmodified()}, {@link #redirectCall(Uri, PhoneAccountHandle, boolean)},
+ * or {@link #cancelCall()}
+ */
+ public void onRedirectionTimeout() {}
+
+ /**
* The implemented {@link CallRedirectionService} calls this method to response a request
* received via {@link #onPlaceCall(Uri, PhoneAccountHandle, boolean)} to inform Telecom that
* no changes are required to the outgoing call, and that the call should be placed as-is.
@@ -158,6 +165,12 @@
private static final int MSG_PLACE_CALL = 1;
/**
+ * A handler message to process the attempt to notify the operation of redirection service timed
+ * out from Telecom
+ */
+ private static final int MSG_TIMEOUT = 2;
+
+ /**
* A handler to process the attempt to place call with redirection service from Telecom
*/
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@@ -174,6 +187,9 @@
args.recycle();
}
break;
+ case MSG_TIMEOUT:
+ onRedirectionTimeout();
+ break;
}
}
};
@@ -200,6 +216,15 @@
args.arg4 = allowInteractiveResponse;
mHandler.obtainMessage(MSG_PLACE_CALL, args).sendToTarget();
}
+
+ /**
+ * Telecom calls this method to inform the CallRedirectionService of the timeout waiting for
+ * it to complete its operation.
+ */
+ @Override
+ public void notifyTimeout() {
+ mHandler.obtainMessage(MSG_TIMEOUT).sendToTarget();
+ }
}
@Override
diff --git a/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl b/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
index c1bc440..ce1938b 100644
--- a/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/ICallRedirectionService.aidl
@@ -31,4 +31,6 @@
oneway interface ICallRedirectionService {
void placeCall(in ICallRedirectionAdapter adapter, in Uri handle,
in PhoneAccountHandle initialPhoneAccount, boolean allowInteractiveResponse);
+
+ void notifyTimeout();
}
diff --git a/telephony/OWNERS b/telephony/OWNERS
index 628c480..4df8a4b 100644
--- a/telephony/OWNERS
+++ b/telephony/OWNERS
@@ -4,13 +4,14 @@
breadley@google.com
fionaxu@google.com
jackyu@google.com
-hallliu@google.com
rgreenwalt@google.com
tgunn@google.com
jminjie@google.com
shuoq@google.com
-refuhoo@google.com
nazaninb@google.com
sarahchin@google.com
-dbright@google.com
xiaotonj@google.com
+huiwang@google.com
+jayachandranc@google.com
+chinmayd@google.com
+amruthr@google.com
diff --git a/telephony/java/android/telephony/AccessNetworkUtils.java b/telephony/java/android/telephony/AccessNetworkUtils.java
index 6b82045..b5d97ab 100644
--- a/telephony/java/android/telephony/AccessNetworkUtils.java
+++ b/telephony/java/android/telephony/AccessNetworkUtils.java
@@ -567,6 +567,10 @@
*/
public static int getFrequencyFromNrArfcn(int nrArfcn) {
+ if (nrArfcn == PhysicalChannelConfig.CHANNEL_NUMBER_UNKNOWN) {
+ return PhysicalChannelConfig.FREQUENCY_UNKNOWN;
+ }
+
int globalKhz = 0;
int rangeOffset = 0;
int arfcnOffset = 0;
@@ -632,6 +636,10 @@
*/
public static int getFrequencyFromUarfcn(int band, int uarfcn, boolean isUplink) {
+ if (uarfcn == PhysicalChannelConfig.CHANNEL_NUMBER_UNKNOWN) {
+ return PhysicalChannelConfig.FREQUENCY_UNKNOWN;
+ }
+
int offsetKhz = 0;
for (UtranBandArfcnFrequency uarfcnFrequency : AccessNetworkConstants.
UtranBandArfcnFrequency.values()) {
@@ -702,6 +710,10 @@
*/
public static int getFrequencyFromArfcn(int band, int arfcn, boolean isUplink) {
+ if (arfcn == PhysicalChannelConfig.CHANNEL_NUMBER_UNKNOWN) {
+ return PhysicalChannelConfig.FREQUENCY_UNKNOWN;
+ }
+
int uplinkFrequencyFirst = 0;
int arfcnOffset = 0;
int downlinkOffset = 0;
diff --git a/telephony/java/android/telephony/PhysicalChannelConfig.java b/telephony/java/android/telephony/PhysicalChannelConfig.java
index 8a4bb46..59eac6a 100644
--- a/telephony/java/android/telephony/PhysicalChannelConfig.java
+++ b/telephony/java/android/telephony/PhysicalChannelConfig.java
@@ -337,7 +337,8 @@
private void setUplinkFrequency() {
switch (mNetworkType){
case TelephonyManager.NETWORK_TYPE_NR:
- mUplinkFrequency = mDownlinkFrequency;
+ mUplinkFrequency = AccessNetworkUtils.getFrequencyFromNrArfcn(
+ mUplinkChannelNumber);
break;
case TelephonyManager.NETWORK_TYPE_LTE:
mUplinkFrequency = AccessNetworkUtils.getFrequencyFromEarfcn(
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 9d4db17..98f9dfd 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -1827,8 +1827,9 @@
* @param subscriptionType the {@link #SUBSCRIPTION_TYPE}
* @hide
*/
- public void addSubscriptionInfoRecord(String uniqueId, String displayName, int slotIndex,
- int subscriptionType) {
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public void addSubscriptionInfoRecord(@NonNull String uniqueId, @Nullable String displayName,
+ int slotIndex, int subscriptionType) {
if (VDBG) {
logd("[addSubscriptionInfoRecord]+ uniqueId:" + uniqueId
+ ", displayName:" + displayName + ", slotIndex:" + slotIndex
@@ -1863,7 +1864,8 @@
* @param subscriptionType the {@link #SUBSCRIPTION_TYPE}
* @hide
*/
- public void removeSubscriptionInfoRecord(String uniqueId, int subscriptionType) {
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public void removeSubscriptionInfoRecord(@NonNull String uniqueId, int subscriptionType) {
if (VDBG) {
logd("[removeSubscriptionInfoRecord]+ uniqueId:" + uniqueId
+ ", subscriptionType: " + subscriptionType);
diff --git a/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl b/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl
index 1a1c7f8..43273a4 100755
--- a/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl
+++ b/telephony/java/android/telephony/mbms/IMbmsGroupCallSessionCallback.aidl
@@ -25,6 +25,7 @@
{
void onError(int errorCode, String message);
+ @SuppressWarnings(value={"untyped-collection"})
void onAvailableSaisUpdated(in List currentSai, in List availableSais);
void onServiceInterfaceAvailable(String interfaceName, int index);
diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl
index 44cc24a..6e139ac 100755
--- a/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl
+++ b/telephony/java/android/telephony/mbms/vendor/IMbmsGroupCallService.aidl
@@ -29,9 +29,11 @@
void stopGroupCall(int subId, long tmgi);
+ @SuppressWarnings(value={"untyped-collection"})
void updateGroupCall(int subscriptionId, long tmgi, in List saiList,
in List frequencyList);
+ @SuppressWarnings(value={"untyped-collection"})
int startGroupCall(int subscriptionId, long tmgi, in List saiList,
in List frequencyList, IGroupCallCallback callback);
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 9b2f119..ae5f997 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -1961,6 +1961,7 @@
/**
* Return the emergency number list from all the active subscriptions.
*/
+ @SuppressWarnings(value={"untyped-collection"})
Map getEmergencyNumberList(String callingPackage, String callingFeatureId);
/**
diff --git a/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java b/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
index 4ecca2d..cf56586 100644
--- a/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
+++ b/tests/BootImageProfileTest/src/com/android/bootimageprofile/BootImageProfileTest.java
@@ -31,6 +31,8 @@
private static final String SYSTEM_SERVER_PROFILE =
"/data/misc/profiles/cur/0/android/primary.prof";
private static final boolean USE_PHENOTYPE = false;
+ private static final String DALVIK_VM_EXTRA_OPTS =
+ "-Xusejit:false -Xint -Xjitsaveprofilinginfo";
@Override
public void setDevice(ITestDevice testDevice) {
@@ -54,10 +56,10 @@
private String setProperty(String property, String value) throws Exception {
if (USE_PHENOTYPE) {
return mTestDevice.executeShellCommand(
- "device_config put runtime_native_boot " + property + " " + value);
+ String.format("device_config put runtime_native_boot %s '%s'", property, value));
} else {
return mTestDevice.executeShellCommand(
- "setprop dalvik.vm." + property + " " + value);
+ String.format("setprop dalvik.vm.%s '%s'", property, value));
}
}
@@ -69,6 +71,8 @@
assertTrue("profile boot class path not enabled: " + res, "true".equals(res));
res = getProperty("profilesystemserver");
assertTrue("profile system server not enabled: " + res, "true".equals(res));
+ res = getProperty("extra-opts");
+ assertTrue("extra options not set: " + res, DALVIK_VM_EXTRA_OPTS.equals(res));
}
private boolean forceSaveProfile(String pkg) throws Exception {
@@ -91,16 +95,20 @@
boolean profileBootClassPath = "true".equals(pbcp);
String pss = getProperty("profilesystemserver");
boolean profileSystemServer = "true".equals(pss);
- if (profileBootClassPath && profileSystemServer) {
+ String extraOpts = getProperty("extra-opts");
+ boolean extraOptsOk = DALVIK_VM_EXTRA_OPTS.equals(extraOpts);
+ if (profileBootClassPath && profileSystemServer && extraOptsOk) {
break;
}
if (i == numIterations) {
assertTrue("profile system server not enabled: " + pss, profileSystemServer);
assertTrue("profile boot class path not enabled: " + pbcp, profileBootClassPath);
+ assertTrue("extra options not set: " + extraOpts, extraOptsOk);
}
setProperty("profilebootclasspath", "true");
setProperty("profilesystemserver", "true");
+ setProperty("extra-opts", DALVIK_VM_EXTRA_OPTS);
Thread.sleep(1000);
}
@@ -114,12 +122,15 @@
boolean profileBootClassPath = "true".equals(pbcp);
String pss = getProperty("profilesystemserver");
boolean profileSystemServer = "true".equals(pss);
+ String extraOpts = getProperty("extra-opts");
+ boolean extraOptsOk = DALVIK_VM_EXTRA_OPTS.equals(extraOpts);
if (profileBootClassPath && profileSystemServer) {
break;
}
if (i == numIterations) {
assertTrue("profile system server not enabled: " + pss, profileSystemServer);
assertTrue("profile boot class path not enabled: " + pbcp, profileBootClassPath);
+ assertTrue("extra options not set: " + extraOpts, extraOptsOk);
}
Thread.sleep(1000);
}
diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp
index 243c301..840a588 100644
--- a/tests/StagedInstallTest/Android.bp
+++ b/tests/StagedInstallTest/Android.bp
@@ -25,14 +25,24 @@
name: "StagedInstallInternalTestApp",
manifest: "app/AndroidManifest.xml",
srcs: ["app/src/**/*.java"],
- static_libs: ["androidx.test.rules", "cts-install-lib"],
+ static_libs: [
+ "androidx.test.rules",
+ "cts-install-lib",
+ ],
test_suites: ["general-tests"],
+ java_resources: [
+ ":StagedInstallTestApexV2",
+ ],
+ platform_apis: true,
}
java_test_host {
name: "StagedInstallInternalTest",
srcs: ["src/**/*.java"],
- libs: ["tradefed", "cts-shim-host-lib"],
+ libs: [
+ "tradefed",
+ "cts-shim-host-lib",
+ ],
static_libs: [
"testng",
"compatibility-tradefed",
diff --git a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
index e673549..a0f4e0a 100644
--- a/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/app/src/com/android/tests/stagedinstallinternal/StagedInstallInternalTest.java
@@ -17,12 +17,24 @@
package com.android.tests.stagedinstallinternal;
import static com.android.cts.install.lib.InstallUtils.getPackageInstaller;
+import static com.android.cts.install.lib.InstallUtils.waitForSessionReady;
+import static com.android.cts.shim.lib.ShimPackage.SHIM_APEX_PACKAGE_NAME;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+
import android.Manifest;
+import android.content.pm.ApexStagedEvent;
+import android.content.pm.IPackageManagerNative;
+import android.content.pm.IStagedApexObserver;
import android.content.pm.PackageInstaller;
+import android.content.pm.StagedApexInfo;
+import android.os.IBinder;
+import android.os.ServiceManager;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -35,6 +47,8 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mockito;
import java.io.BufferedReader;
import java.io.BufferedWriter;
@@ -50,6 +64,10 @@
private static final String TAG = StagedInstallInternalTest.class.getSimpleName();
+ private static final TestApp APEX_V2 = new TestApp(
+ "ApexV2", SHIM_APEX_PACKAGE_NAME, 2, /* isApex= */ true,
+ "com.android.apex.cts.shim.v2.apex");
+
private File mTestStateFile = new File(
InstrumentationRegistry.getInstrumentation().getContext().getFilesDir(),
"stagedinstall_state");
@@ -109,6 +127,72 @@
Install.multi(TestApp.AIncompleteSplit, TestApp.B1, TestApp.Apex1).setStaged());
}
+ @Test
+ public void testGetStagedModuleNames() throws Exception {
+ // Before staging a session
+ String[] result = getPackageManagerNative().getStagedApexModuleNames();
+ assertThat(result).hasLength(0);
+ // Stage an apex
+ int sessionId = Install.single(APEX_V2).setStaged().commit();
+ waitForSessionReady(sessionId);
+ result = getPackageManagerNative().getStagedApexModuleNames();
+ assertThat(result).hasLength(1);
+ assertThat(result).isEqualTo(new String[]{SHIM_APEX_PACKAGE_NAME});
+ // Abandon the session
+ InstallUtils.openPackageInstallerSession(sessionId).abandon();
+ result = getPackageManagerNative().getStagedApexModuleNames();
+ assertThat(result).hasLength(0);
+ }
+
+ @Test
+ public void testGetStagedApexInfo() throws Exception {
+ // Ask for non-existing module
+ StagedApexInfo result = getPackageManagerNative().getStagedApexInfo("not found");
+ assertThat(result).isNull();
+ // Stage an apex
+ int sessionId = Install.single(APEX_V2).setStaged().commit();
+ waitForSessionReady(sessionId);
+ // Query proper module name
+ result = getPackageManagerNative().getStagedApexInfo(SHIM_APEX_PACKAGE_NAME);
+ assertThat(result.moduleName).isEqualTo(SHIM_APEX_PACKAGE_NAME);
+ InstallUtils.openPackageInstallerSession(sessionId).abandon();
+ }
+
+ public static class MockStagedApexObserver extends IStagedApexObserver.Stub {
+ @Override
+ public void onApexStaged(ApexStagedEvent event) {
+ assertThat(event).isNotNull();
+ }
+ }
+
+ @Test
+ public void testStagedApexObserver() throws Exception {
+ MockStagedApexObserver realObserver = new MockStagedApexObserver();
+ IStagedApexObserver observer = spy(realObserver);
+ assertThat(observer).isNotNull();
+ getPackageManagerNative().registerStagedApexObserver(observer);
+
+ // Stage an apex and verify observer was called
+ int sessionId = Install.single(APEX_V2).setStaged().commit();
+ waitForSessionReady(sessionId);
+ ArgumentCaptor<ApexStagedEvent> captor = ArgumentCaptor.forClass(ApexStagedEvent.class);
+ verify(observer, timeout(5000)).onApexStaged(captor.capture());
+ assertThat(captor.getValue().stagedApexModuleNames).isEqualTo(
+ new String[] {SHIM_APEX_PACKAGE_NAME});
+
+ // Abandon and verify observer is called
+ Mockito.clearInvocations(observer);
+ InstallUtils.openPackageInstallerSession(sessionId).abandon();
+ verify(observer, timeout(5000)).onApexStaged(captor.capture());
+ assertThat(captor.getValue().stagedApexModuleNames).hasLength(0);
+ }
+
+ private IPackageManagerNative getPackageManagerNative() {
+ IBinder binder = ServiceManager.waitForService("package_native");
+ assertThat(binder).isNotNull();
+ return IPackageManagerNative.Stub.asInterface(binder);
+ }
+
private static void assertSessionReady(int sessionId) {
assertSessionState(sessionId,
(session) -> assertThat(session.isStagedSessionReady()).isTrue());
diff --git a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
index dddb317..f92c31c 100644
--- a/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
+++ b/tests/StagedInstallTest/src/com/android/tests/stagedinstallinternal/host/StagedInstallInternalTest.java
@@ -216,6 +216,21 @@
assertThat(getStagingDirectories()).isEmpty();
}
+ @Test
+ public void testGetStagedModuleNames() throws Exception {
+ runPhase("testGetStagedModuleNames");
+ }
+
+ @Test
+ public void testGetStagedApexInfo() throws Exception {
+ runPhase("testGetStagedApexInfo");
+ }
+
+ @Test
+ public void testStagedApexObserver() throws Exception {
+ runPhase("testStagedApexObserver");
+ }
+
private List<String> getStagingDirectories() throws DeviceNotAvailableException {
String baseDir = "/data/app-staging";
try {
diff --git a/tools/aapt/AaptAssets.cpp b/tools/aapt/AaptAssets.cpp
index 672731c..899d268 100644
--- a/tools/aapt/AaptAssets.cpp
+++ b/tools/aapt/AaptAssets.cpp
@@ -319,12 +319,10 @@
// The second subtag can either be a script or a region code.
// If its size is 4, it's a script code, else it's a region code.
- bool hasRegion = false;
if (subtags[1].size() == 4) {
setScript(subtags[1]);
} else if (subtags[1].size() == 2 || subtags[1].size() == 3) {
setRegion(subtags[1]);
- hasRegion = true;
} else {
fprintf(stderr, "ERROR: Invalid BCP 47 tag in directory name %s\n", part.string());
return -1;
diff --git a/tools/aapt/Android.bp b/tools/aapt/Android.bp
index c75ba71..cf5f313 100644
--- a/tools/aapt/Android.bp
+++ b/tools/aapt/Android.bp
@@ -50,7 +50,6 @@
"libbase",
"libz",
],
- group_static_libs: true,
cflags: [
"-Wall",
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 257e96b..b9de11b 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -2475,11 +2475,10 @@
{
if (accessorCookie != NULL && fmt != NULL) {
AccessorCookie* ac = (AccessorCookie*)accessorCookie;
- int retval=0;
char buf[1024];
va_list ap;
va_start(ap, fmt);
- retval = vsnprintf(buf, sizeof(buf), fmt, ap);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
va_end(ap);
ac->sourcePos.error("Error: %s (at '%s' with value '%s').\n",
buf, ac->attr.string(), ac->value.string());
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index 5c5b3c3..5de0a63 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -72,7 +72,6 @@
"libidmap2_policies",
],
stl: "libc++_static",
- group_static_libs: true,
}
// ==========================================================
@@ -196,9 +195,9 @@
],
defaults: ["aapt2_defaults"],
data: [
- "integration-tests/CompileTest/**/*",
- "integration-tests/CommandTests/**/*",
- "integration-tests/ConvertTest/**/*"
+ "integration-tests/CompileTest/**/*",
+ "integration-tests/CommandTests/**/*",
+ "integration-tests/ConvertTest/**/*",
],
}
diff --git a/tools/aapt2/cmd/Diff.cpp b/tools/aapt2/cmd/Diff.cpp
index d56994e..97e4436 100644
--- a/tools/aapt2/cmd/Diff.cpp
+++ b/tools/aapt2/cmd/Diff.cpp
@@ -148,7 +148,7 @@
diff = true;
}
}
- return false;
+ return diff;
}
static bool EmitResourceTypeDiff(IAaptContext* context, LoadedApk* apk_a,
diff --git a/tools/aosp/aosp_sha.sh b/tools/aosp/aosp_sha.sh
index 3960856..d345422 100755
--- a/tools/aosp/aosp_sha.sh
+++ b/tools/aosp/aosp_sha.sh
@@ -35,6 +35,7 @@
echo
echo "If your change contains no confidential details (such as security fixes), please"
echo "upload and merge this change at https://android-review.googlesource.com/."
+ echo "Else add a tag 'Ignore-AOSP-First:' with the reason to bypass AOSP."
echo
exit 1
fi
diff --git a/tools/lint/OWNERS b/tools/lint/OWNERS
new file mode 100644
index 0000000..7c04519
--- /dev/null
+++ b/tools/lint/OWNERS
@@ -0,0 +1,5 @@
+brufino@google.com
+jsharkey@google.com
+
+per-file *CallingSettingsNonUserGetterMethods* = file:/packages/SettingsProvider/OWNERS
+
diff --git a/tools/split-select/Android.bp b/tools/split-select/Android.bp
index c12fc6a..5402657 100644
--- a/tools/split-select/Android.bp
+++ b/tools/split-select/Android.bp
@@ -48,7 +48,6 @@
"libbase",
"libz",
],
- group_static_libs: true,
target: {
windows: {