Merge "Lazy bundle"
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/Android.bp b/cmds/idmap2/Android.bp
index aad5d23..5370dc3 100644
--- a/cmds/idmap2/Android.bp
+++ b/cmds/idmap2/Android.bp
@@ -56,9 +56,6 @@
"-readability-redundant-access-specifiers",
"-readability-uppercase-literal-suffix",
],
- tidy_flags: [
- "-system-headers",
- ],
}
cc_library {
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/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 193f775..56ec8ea 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -352,11 +352,12 @@
@UnsupportedAppUsage
Configuration mConfiguration;
Configuration mCompatConfiguration;
+ @GuardedBy("this")
+ private boolean mUpdateHttpProxyOnBind = false;
@UnsupportedAppUsage
Application mInitialApplication;
@UnsupportedAppUsage
- final ArrayList<Application> mAllApplications
- = new ArrayList<Application>();
+ final ArrayList<Application> mAllApplications = new ArrayList<>();
/**
* Bookkeeping of instantiated backup agents indexed first by user id, then by package name.
* Indexing by user id supports parallel backups across users on system packages as they run in
@@ -1040,17 +1041,16 @@
IUiAutomationConnection instrumentationUiConnection, int debugMode,
boolean enableBinderTracking, boolean trackAllocation,
boolean isRestrictedBackupMode, boolean persistent, Configuration config,
- CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
+ CompatibilityInfo compatInfo, Map<String, IBinder> services, Bundle coreSettings,
String buildSerial, AutofillOptions autofillOptions,
ContentCaptureOptions contentCaptureOptions, long[] disabledCompatChanges) {
if (services != null) {
if (false) {
// Test code to make sure the app could see the passed-in services.
- for (Object oname : services.keySet()) {
- if (services.get(oname) == null) {
+ for (String name : services.keySet()) {
+ if (services.get(name) == null) {
continue; // AM just passed in a null service.
}
- String name = (String) oname;
// See b/79378449 about the following exemption.
switch (name) {
@@ -1127,8 +1127,18 @@
}
public void updateHttpProxy() {
- ActivityThread.updateHttpProxy(
- getApplication() != null ? getApplication() : getSystemContext());
+ final Application app;
+ synchronized (ActivityThread.this) {
+ app = getApplication();
+ if (null == app) {
+ // The app is not bound yet. Make a note to update the HTTP proxy when the
+ // app is bound.
+ mUpdateHttpProxyOnBind = true;
+ return;
+ }
+ }
+ // App is present, update the proxy inline.
+ ActivityThread.updateHttpProxy(app);
}
public void processInBackground() {
@@ -6697,6 +6707,15 @@
app.setContentCaptureOptions(data.contentCaptureOptions);
mInitialApplication = app;
+ final boolean updateHttpProxy;
+ synchronized (this) {
+ updateHttpProxy = mUpdateHttpProxyOnBind;
+ // This synchronized block ensures that any subsequent call to updateHttpProxy()
+ // will see a non-null mInitialApplication.
+ }
+ if (updateHttpProxy) {
+ ActivityThread.updateHttpProxy(app);
+ }
// don't bring up providers in restricted mode; they may depend on the
// app's custom Application class
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index 6e9157e..45a8388 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -72,7 +72,7 @@
IInstrumentationWatcher testWatcher, IUiAutomationConnection uiAutomationConnection,
int debugMode, boolean enableBinderTracking, boolean trackAllocation,
boolean restrictedBackupMode, boolean persistent, in Configuration config,
- in CompatibilityInfo compatInfo, in Map services,
+ in CompatibilityInfo compatInfo, in Map<String, IBinder> services,
in Bundle coreSettings, in String buildSerial, in AutofillOptions autofillOptions,
in ContentCaptureOptions contentCaptureOptions, in long[] disabledCompatChanges);
void runIsolatedEntryPoint(in String entryPoint, in String[] entryPointArgs);
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/bluetooth/le/ScanFilter.java b/core/java/android/bluetooth/le/ScanFilter.java
index ddc93327..9da6ff3 100644
--- a/core/java/android/bluetooth/le/ScanFilter.java
+++ b/core/java/android/bluetooth/le/ScanFilter.java
@@ -168,6 +168,15 @@
dest.writeByteArray(mManufacturerDataMask);
}
}
+
+ // IRK
+ if (mDeviceAddress != null) {
+ dest.writeInt(mAddressType);
+ dest.writeInt(mIrk == null ? 0 : 1);
+ if (mIrk != null) {
+ dest.writeByteArray(mIrk);
+ }
+ }
}
/**
@@ -187,8 +196,10 @@
if (in.readInt() == 1) {
builder.setDeviceName(in.readString());
}
+ String address = null;
+ // If we have a non-null address
if (in.readInt() == 1) {
- builder.setDeviceAddress(in.readString());
+ address = in.readString();
}
if (in.readInt() == 1) {
ParcelUuid uuid = in.readParcelable(ParcelUuid.class.getClassLoader());
@@ -245,6 +256,17 @@
}
}
+ // IRK
+ if (address != null) {
+ final int addressType = in.readInt();
+ if (in.readInt() == 1) {
+ final byte[] irk = new byte[16];
+ in.readByteArray(irk);
+ builder.setDeviceAddress(address, addressType, irk);
+ } else {
+ builder.setDeviceAddress(address, addressType);
+ }
+ }
return builder.build();
}
};
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/debug/PairDevice.aidl b/core/java/android/debug/PairDevice.aidl
new file mode 100644
index 0000000..c72a5ed
--- /dev/null
+++ b/core/java/android/debug/PairDevice.aidl
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.debug;
+
+/**
+ * Contains information about the client in an ADB connection.
+ * @see {@link android.debug.IAdbManager#getPairedDevices()}
+ * @hide
+ */
+parcelable PairDevice {
+ /**
+ * The human-readable name of the device.
+ */
+ String name;
+
+ /**
+ * The device's guid.
+ */
+ String guid;
+
+ /**
+ * Indicates whether the device is currently connected to adbd.
+ */
+ boolean connected;
+}
\ No newline at end of file
diff --git a/core/java/android/debug/PairDevice.java b/core/java/android/debug/PairDevice.java
deleted file mode 100644
index 2d5b446..0000000
--- a/core/java/android/debug/PairDevice.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.debug;
-
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.internal.annotations.Immutable;
-import com.android.internal.util.Preconditions;
-
-/**
- * Contains information about the client in an ADB connection.
- * @hide
- */
-@Immutable
-public class PairDevice implements Parcelable {
- /**
- * The human-readable name of the device.
- */
- @NonNull private final String mName;
-
- /**
- * The device's guid.
- */
- @NonNull private final String mGuid;
-
- /**
- * Indicates whether the device is currently connected to adbd.
- */
- private final boolean mConnected;
-
- public PairDevice(@NonNull String name, @NonNull String guid, boolean connected) {
- Preconditions.checkStringNotEmpty(name);
- Preconditions.checkStringNotEmpty(guid);
- mName = name;
- mGuid = guid;
- mConnected = connected;
- }
-
- /**
- * @return the device name.
- */
- @NonNull
- public String getDeviceName() {
- return mName;
- }
-
- /**
- * @return the device GUID.
- */
- @NonNull
- public String getGuid() {
- return mGuid;
- }
-
- /**
- * @return the adb connection state of the device.
- */
- public boolean isConnected() {
- return mConnected;
- }
-
- @Override
- public void writeToParcel(@NonNull Parcel dest, int flags) {
- dest.writeString(mName);
- dest.writeString(mGuid);
- dest.writeBoolean(mConnected);
- }
-
- /**
- * @return Human-readable info about the object.
- */
- @Override
- public String toString() {
- return "\n" + mName + "\n" + mGuid + "\n" + mConnected;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @NonNull
- public static final Parcelable.Creator<PairDevice> CREATOR =
- new Creator<PairDevice>() {
- @Override
- public PairDevice createFromParcel(Parcel source) {
- return new PairDevice(source.readString(), source.readString(),
- source.readBoolean());
- }
-
- @Override
- public PairDevice[] newArray(int size) {
- return new PairDevice[size];
- }
- };
-}
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/net/VpnManager.java b/core/java/android/net/VpnManager.java
index 662ebb3..5c28553 100644
--- a/core/java/android/net/VpnManager.java
+++ b/core/java/android/net/VpnManager.java
@@ -389,6 +389,10 @@
/**
* Starts a legacy VPN.
+ *
+ * Legacy VPN is deprecated starting from Android S. So this API shouldn't be called if the
+ * initial SDK version of device is Android S+. Otherwise, UnsupportedOperationException will be
+ * thrown.
* @hide
*/
public void startLegacyVpn(VpnProfile profile) {
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/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/android/util/apk/ApkSignatureSchemeV2Verifier.java b/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
index 346fe29..0771157 100644
--- a/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
+++ b/core/java/android/util/apk/ApkSignatureSchemeV2Verifier.java
@@ -210,7 +210,7 @@
if (contentDigests.containsKey(CONTENT_DIGEST_VERITY_CHUNKED_SHA256)) {
byte[] verityDigest = contentDigests.get(CONTENT_DIGEST_VERITY_CHUNKED_SHA256);
verityRootHash = ApkSigningBlockUtils.parseVerityDigestAndVerifySourceLength(
- verityDigest, apk.length(), signatureInfo);
+ verityDigest, apk.getChannel().size(), signatureInfo);
}
byte[] digest = pickBestDigestForV4(contentDigests);
diff --git a/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java b/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
index 4ab541b..44f01a4 100644
--- a/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
+++ b/core/java/android/util/apk/ApkSignatureSchemeV3Verifier.java
@@ -209,7 +209,7 @@
if (contentDigests.containsKey(CONTENT_DIGEST_VERITY_CHUNKED_SHA256)) {
byte[] verityDigest = contentDigests.get(CONTENT_DIGEST_VERITY_CHUNKED_SHA256);
result.verityRootHash = ApkSigningBlockUtils.parseVerityDigestAndVerifySourceLength(
- verityDigest, apk.length(), signatureInfo);
+ verityDigest, apk.getChannel().size(), signatureInfo);
}
result.digest = pickBestDigestForV4(contentDigests);
diff --git a/core/java/android/util/apk/ApkSigningBlockUtils.java b/core/java/android/util/apk/ApkSigningBlockUtils.java
index 6efe95c..f79b5b9 100644
--- a/core/java/android/util/apk/ApkSigningBlockUtils.java
+++ b/core/java/android/util/apk/ApkSigningBlockUtils.java
@@ -349,7 +349,7 @@
SignatureInfo signatureInfo) throws SecurityException {
try {
byte[] expectedRootHash = parseVerityDigestAndVerifySourceLength(expectedDigest,
- apk.length(), signatureInfo);
+ apk.getChannel().size(), signatureInfo);
VerityBuilder.VerityResult verity = VerityBuilder.generateApkVerityTree(apk,
signatureInfo, new ByteBufferFactory() {
@Override
diff --git a/core/java/android/util/apk/VerityBuilder.java b/core/java/android/util/apk/VerityBuilder.java
index e81e3f7..3dfa4cd 100644
--- a/core/java/android/util/apk/VerityBuilder.java
+++ b/core/java/android/util/apk/VerityBuilder.java
@@ -90,7 +90,7 @@
throws IOException, SecurityException, NoSuchAlgorithmException, DigestException {
long signingBlockSize =
signatureInfo.centralDirOffset - signatureInfo.apkSigningBlockOffset;
- long dataSize = apk.length() - signingBlockSize;
+ long dataSize = apk.getChannel().size() - signingBlockSize;
int[] levelOffset = calculateVerityLevelOffset(dataSize);
int merkleTreeSize = levelOffset[levelOffset.length - 1];
@@ -108,7 +108,7 @@
@NonNull SignatureInfo signatureInfo, @NonNull ByteBuffer footerOutput)
throws IOException {
footerOutput.order(ByteOrder.LITTLE_ENDIAN);
- generateApkVerityHeader(footerOutput, apk.length(), DEFAULT_SALT);
+ generateApkVerityHeader(footerOutput, apk.getChannel().size(), DEFAULT_SALT);
long signingBlockSize =
signatureInfo.centralDirOffset - signatureInfo.apkSigningBlockOffset;
generateApkVerityExtensions(footerOutput, signatureInfo.apkSigningBlockOffset,
@@ -310,11 +310,11 @@
eocdCdOffsetFieldPosition + ZIP_EOCD_CENTRAL_DIR_OFFSET_FIELD_SIZE;
consumeByChunk(digester,
new MemoryMappedFileDataSource(apk.getFD(), offsetAfterEocdCdOffsetField,
- apk.length() - offsetAfterEocdCdOffsetField),
+ apk.getChannel().size() - offsetAfterEocdCdOffsetField),
MMAP_REGION_SIZE_BYTES);
// 5. Pad 0s up to the nearest 4096-byte block before hashing.
- int lastIncompleteChunkSize = (int) (apk.length() % CHUNK_SIZE_BYTES);
+ int lastIncompleteChunkSize = (int) (apk.getChannel().size() % CHUNK_SIZE_BYTES);
if (lastIncompleteChunkSize != 0) {
digester.consume(ByteBuffer.allocate(CHUNK_SIZE_BYTES - lastIncompleteChunkSize));
}
diff --git a/core/java/com/android/internal/net/VpnProfile.java b/core/java/com/android/internal/net/VpnProfile.java
index 6e1d3ce..5f84b5a 100644
--- a/core/java/com/android/internal/net/VpnProfile.java
+++ b/core/java/com/android/internal/net/VpnProfile.java
@@ -377,12 +377,15 @@
/** Checks if this profile specifies a LegacyVpn type. */
public static boolean isLegacyType(int type) {
switch (type) {
- case VpnProfile.TYPE_IKEV2_IPSEC_USER_PASS: // fall through
- case VpnProfile.TYPE_IKEV2_IPSEC_RSA: // fall through
- case VpnProfile.TYPE_IKEV2_IPSEC_PSK:
- return false;
- default:
+ case VpnProfile.TYPE_PPTP:
+ case VpnProfile.TYPE_L2TP_IPSEC_PSK:
+ case VpnProfile.TYPE_L2TP_IPSEC_RSA:
+ case VpnProfile.TYPE_IPSEC_XAUTH_PSK:
+ case VpnProfile.TYPE_IPSEC_XAUTH_RSA:
+ case VpnProfile.TYPE_IPSEC_HYBRID_RSA:
return true;
+ default:
+ return false;
}
}
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/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index 2be5c47..37d059a 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -88,9 +88,12 @@
<!-- Cyprus: 4-6 digits (not confirmed), known premium codes listed, plus EU -->
<shortcode country="cy" pattern="\\d{4,6}" premium="7510" free="116\\d{3}" />
- <!-- Czechia: 7-8 digits, starting with 9, plus EU:
- http://www.o2.cz/osobni/en/services-by-alphabet/91670-premium_sms.html -->
- <shortcode country="cz" premium="9\\d{6,7}" free="116\\d{3}" />
+ <!-- Czechia: Premium numbers start with 90, and are either 5 or 7 digits (5 digits is a
+ subscription request, you will be charged for the messages received, but it's necessary
+ to warn on the _request_ as that's the last chance to stop), plus EU:
+ https://www.t-mobile.cz/platebni-a-premium-sms
+ https://www.vodafone.cz/pece/vyuctovani-platby-kredit/platby-mobilem/cena-premium-sms/ -->
+ <shortcode country="cz" premium="90\\d{5}|90\\d{3}" free="116\\d{3}" />
<!-- Germany: 4-5 digits plus 1232xxx (premium codes from http://www.vodafone.de/infofaxe/537.pdf and http://premiumdienste.eplus.de/pdf/kodex.pdf), plus EU. To keep the premium regex from being too large, it only includes payment processors that have been used by SMS malware, with the regular pattern matching the other premium short codes. -->
<shortcode country="de" pattern="\\d{4,5}|1232\\d{3}" premium="11(?:111|833)|1232(?:013|021|060|075|286|358)|118(?:44|80|86)|20[25]00|220(?:21|22|88|99)|221(?:14|21)|223(?:44|53|77)|224[13]0|225(?:20|59|90)|226(?:06|10|20|26|30|40|56|70)|227(?:07|33|39|66|76|78|79|88|99)|228(?:08|11|66|77)|23300|30030|3[12347]000|330(?:33|55|66)|33(?:233|331|366|533)|34(?:34|567)|37000|40(?:040|123|444|[3568]00)|41(?:010|414)|44(?:000|044|344|44[24]|544)|50005|50100|50123|50555|51000|52(?:255|783)|54(?:100|2542)|55(?:077|[24]00|222|333|55|[12369]55)|56(?:789|886)|60800|6[13]000|66(?:[12348]66|566|766|777|88|999)|68888|70(?:07|123|777)|76766|77(?:007|070|222|444|[567]77)|80(?:008|123|888)|82(?:002|[378]00|323|444|472|474|488|727)|83(?:005|[169]00|333|830)|84(?:141|300|32[34]|343|488|499|777|888)|85888|86(?:188|566|640|644|650|677|868|888)|870[24]9|871(?:23|[49]9)|872(?:1[0-8]|49|99)|87499|875(?:49|55|99)|876(?:0[1367]|1[1245678]|54|99)|877(?:00|99)|878(?:15|25|3[567]|8[12])|87999|880(?:08|44|55|77|99)|88688|888(?:03|10|8|89)|8899|90(?:009|999)|99999" free="116\\d{3}|81214|81215|47529|70296|83782|3011|73240|72438" />
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/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index 11d1b0a..087275e 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -322,6 +322,11 @@
return true;
}
+ if (TextUtils.equals(Environment.DIRECTORY_ANDROID.toLowerCase(),
+ path.toLowerCase())) {
+ return true;
+ }
+
return false;
} catch (IOException e) {
throw new IllegalArgumentException(
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/VpnManagerService.java b/services/core/java/com/android/server/VpnManagerService.java
index 26ecee8..d483f18 100644
--- a/services/core/java/com/android/server/VpnManagerService.java
+++ b/services/core/java/com/android/server/VpnManagerService.java
@@ -38,6 +38,7 @@
import android.net.VpnService;
import android.net.util.NetdService;
import android.os.Binder;
+import android.os.Build;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.INetworkManagementService;
@@ -348,9 +349,18 @@
/**
* Start legacy VPN, controlling native daemons as needed. Creates a
* secondary thread to perform connection work, returning quickly.
+ *
+ * Legacy VPN is deprecated starting from Android S. So this API shouldn't be called if the
+ * initial SDK version of device is Android S+. Otherwise, UnsupportedOperationException will be
+ * thrown.
*/
+ @SuppressWarnings("AndroidFrameworkCompatChange") // This is not an app-visible API.
@Override
public void startLegacyVpn(VpnProfile profile) {
+ if (Build.VERSION.DEVICE_INITIAL_SDK_INT >= Build.VERSION_CODES.S
+ && VpnProfile.isLegacyType(profile.type)) {
+ throw new UnsupportedOperationException("Legacy VPN is deprecated");
+ }
int user = UserHandle.getUserId(mDeps.getCallingUid());
// Note that if the caller is not system (uid >= Process.FIRST_APPLICATION_UID),
// the code might not work well since getActiveNetwork might return null if the uid is
diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
index ed83a64..bfc4fe7 100644
--- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java
+++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java
@@ -1362,7 +1362,10 @@
if (args.length > 1) {
hostname = args[1];
}
- PairDevice device = new PairDevice(fingerprints, hostname, false);
+ PairDevice device = new PairDevice();
+ device.name = fingerprints;
+ device.guid = hostname;
+ device.connected = false;
intent.putExtra(AdbManager.WIRELESS_PAIR_DEVICE_EXTRA, device);
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
// Add the key into the keystore
@@ -1844,8 +1847,11 @@
if (args.length > 1) {
hostname = args[1];
}
- pairedDevices.put(keyEntry.getKey(), new PairDevice(
- hostname, fingerprints, mWifiConnectedKeys.contains(keyEntry.getKey())));
+ PairDevice pairDevice = new PairDevice();
+ pairDevice.name = hostname;
+ pairDevice.guid = fingerprints;
+ pairDevice.connected = mWifiConnectedKeys.contains(keyEntry.getKey());
+ pairedDevices.put(keyEntry.getKey(), pairDevice);
}
return pairedDevices;
}
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/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java
index b886dc1..b1ffaeb 100644
--- a/services/core/java/com/android/server/am/ActiveServices.java
+++ b/services/core/java/com/android/server/am/ActiveServices.java
@@ -935,7 +935,18 @@
void killMisbehavingService(ServiceRecord r,
int appUid, int appPid, String localPackageName) {
synchronized (mAm) {
- stopServiceLocked(r);
+ if (!r.destroying) {
+ // This service is still alive, stop it.
+ stopServiceLocked(r);
+ } else {
+ // Check if there is another instance of it being started in parallel,
+ // if so, stop that too to avoid spamming the system.
+ final ServiceMap smap = getServiceMapLocked(r.userId);
+ final ServiceRecord found = smap.mServicesByInstanceName.remove(r.instanceName);
+ if (found != null) {
+ stopServiceLocked(found);
+ }
+ }
mAm.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground", true /*force*/);
}
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/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 4ee867b..097b071 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -289,8 +289,7 @@
private String mActiveIface;
/** Set of any ifaces associated with mobile networks since boot. */
- @GuardedBy("mStatsLock")
- private String[] mMobileIfaces = new String[0];
+ private volatile String[] mMobileIfaces = new String[0];
/** Set of all ifaces currently used by traffic that does not explicitly specify a Network. */
@GuardedBy("mStatsLock")
@@ -935,7 +934,12 @@
@Override
public String[] getMobileIfaces() {
- return mMobileIfaces;
+ // TODO (b/192758557): Remove debug log.
+ if (ArrayUtils.contains(mMobileIfaces, null)) {
+ throw new NullPointerException(
+ "null element in mMobileIfaces: " + Arrays.toString(mMobileIfaces));
+ }
+ return mMobileIfaces.clone();
}
@Override
@@ -1084,7 +1088,8 @@
}
@Override
- public long getIfaceStats(String iface, int type) {
+ public long getIfaceStats(@NonNull String iface, int type) {
+ Objects.requireNonNull(iface);
long nativeIfaceStats = nativeGetIfaceStat(iface, type, checkBpfStatsEnable());
if (nativeIfaceStats == -1) {
return nativeIfaceStats;
@@ -1382,7 +1387,12 @@
}
}
- mMobileIfaces = mobileIfaces.toArray(new String[mobileIfaces.size()]);
+ mMobileIfaces = mobileIfaces.toArray(new String[0]);
+ // TODO (b/192758557): Remove debug log.
+ if (ArrayUtils.contains(mMobileIfaces, null)) {
+ throw new NullPointerException(
+ "null element in mMobileIfaces: " + Arrays.toString(mMobileIfaces));
+ }
}
private static int getSubIdForMobile(@NonNull NetworkStateSnapshot state) {
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/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
index 5decf5e..0390015 100644
--- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
+++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java
@@ -3362,7 +3362,11 @@
int pullFaceSettingsLocked(int atomTag, List<StatsEvent> pulledData) {
final long callingToken = Binder.clearCallingIdentity();
try {
- List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
+ UserManager manager = mContext.getSystemService(UserManager.class);
+ if (manager == null) {
+ return StatsManager.PULL_SKIP;
+ }
+ List<UserInfo> users = manager.getUsers();
int numUsers = users.size();
FaceManager faceManager = mContext.getSystemService(FaceManager.class);
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/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index ddad1db..eaf7693 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -3372,7 +3372,7 @@
}
/**
- * Find all task stacks containing {@param userId} and intercept them with an activity
+ * Find all visible task stacks containing {@param userId} and intercept them with an activity
* to block out the contents and possibly start a credential-confirming intent.
*
* @param userId user handle for the locked managed profile.
@@ -3380,18 +3380,42 @@
void lockAllProfileTasks(@UserIdInt int userId) {
mService.deferWindowLayout();
try {
- forAllLeafTasks(task -> {
- if (task.getActivity(activity -> !activity.finishing && activity.mUserId == userId)
- != null) {
- mService.getTaskChangeNotificationController().notifyTaskProfileLocked(
- task.mTaskId, userId);
- }
- }, true /* traverseTopToBottom */);
+ final PooledConsumer c = PooledLambda.obtainConsumer(
+ RootWindowContainer::taskTopActivityIsUser, this, PooledLambda.__(Task.class),
+ userId);
+ forAllLeafTasks(c, true /* traverseTopToBottom */);
+ c.recycle();
} finally {
mService.continueWindowLayout();
}
}
+ /**
+ * Detects whether we should show a lock screen in front of this task for a locked user.
+ * <p>
+ * We'll do this if either of the following holds:
+ * <ul>
+ * <li>The top activity explicitly belongs to {@param userId}.</li>
+ * <li>The top activity returns a result to an activity belonging to {@param userId}.</li>
+ * </ul>
+ *
+ * @return {@code true} if the top activity looks like it belongs to {@param userId}.
+ */
+ private void taskTopActivityIsUser(Task task, @UserIdInt int userId) {
+ // To handle the case that work app is in the task but just is not the top one.
+ final ActivityRecord activityRecord = task.getTopNonFinishingActivity();
+ final ActivityRecord resultTo = (activityRecord != null ? activityRecord.resultTo : null);
+
+ // Check the task for a top activity belonging to userId, or returning a
+ // result to an activity belonging to userId. Example case: a document
+ // picker for personal files, opened by a work app, should still get locked.
+ if ((activityRecord != null && activityRecord.mUserId == userId)
+ || (resultTo != null && resultTo.mUserId == userId)) {
+ mService.getTaskChangeNotificationController().notifyTaskProfileLocked(
+ task.mTaskId, userId);
+ }
+ }
+
void cancelInitializingActivities() {
for (int displayNdx = getChildCount() - 1; displayNdx >= 0; --displayNdx) {
final DisplayContent display = getChildAt(displayNdx);
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/services/tests/servicestests/src/com/android/server/pm/OWNERS b/services/tests/servicestests/src/com/android/server/pm/OWNERS
index e15b5f5..2f51994 100644
--- a/services/tests/servicestests/src/com/android/server/pm/OWNERS
+++ b/services/tests/servicestests/src/com/android/server/pm/OWNERS
@@ -1,3 +1,7 @@
include /services/core/java/com/android/server/pm/OWNERS
per-file *Shortcut* = file:/core/java/android/content/pm/SHORTCUT_OWNERS
+
+# apex support
+per-file ApexManagerTest.java = dariofreni@google.com, ioffe@google.com, olilan@google.com
+
diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
index 1aff8a7..35d1b17 100644
--- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
+++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java
@@ -25,7 +25,6 @@
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_TOAST;
-import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.android.server.wm.ActivityStack.ActivityState.FINISHING;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSED;
import static com.android.server.wm.ActivityStack.ActivityState.PAUSING;
@@ -37,13 +36,10 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
import android.app.WindowConfiguration;
import android.content.ComponentName;
import android.content.pm.ActivityInfo;
-import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import androidx.test.filters.SmallTest;
@@ -173,34 +169,5 @@
activity.setState(FINISHING, "test FINISHING");
assertThat(mWm.mRoot.allPausedActivitiesComplete()).isTrue();
}
-
- @Test
- public void testLockAllProfileTasks() {
- // Make an activity visible with the user id set to 0
- DisplayContent displayContent = mWm.mRoot.getDisplayContent(DEFAULT_DISPLAY);
- TaskDisplayArea taskDisplayArea = displayContent.getTaskDisplayAreaAt(0);
- final ActivityStack stack = createTaskStackOnDisplay(WINDOWING_MODE_FULLSCREEN,
- ACTIVITY_TYPE_STANDARD, displayContent);
- final ActivityRecord activity = new ActivityTestsBase.ActivityBuilder(stack.mAtmService)
- .setStack(stack)
- .setUid(0)
- .setCreateTask(true)
- .build();
-
- // Create another activity on top and the user id is 1
- Task task = activity.getTask();
- final ActivityRecord topActivity = new ActivityTestsBase.ActivityBuilder(mWm.mAtmService)
- .setStack(stack)
- .setUid(UserHandle.PER_USER_RANGE + 1)
- .setTask(task)
- .build();
-
- // Make sure the listeners will be notified for putting the task to locked state
- TaskChangeNotificationController controller =
- mWm.mAtmService.getTaskChangeNotificationController();
- spyOn(controller);
- mWm.mRoot.lockAllProfileTasks(0);
- verify(controller).notifyTaskProfileLocked(eq(task.mTaskId), eq(0));
- }
}
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/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index 2bbfdba..c86bedb 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -575,6 +575,13 @@
/**
* @hide
*/
+ public void clearGroupUuid() {
+ this.mGroupUUID = null;
+ }
+
+ /**
+ * @hide
+ */
public List<String> getEhplmns() {
return mEhplmns == null ? Collections.emptyList() : Arrays.asList(mEhplmns);
}
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/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/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp
index 7546e41..ca1c1c2 100644
--- a/tools/aapt2/SdkConstants.cpp
+++ b/tools/aapt2/SdkConstants.cpp
@@ -26,9 +26,8 @@
namespace aapt {
static ApiVersion sDevelopmentSdkLevel = 10000;
-static const auto sDevelopmentSdkCodeNames = std::unordered_set<StringPiece>({
- "Q", "R", "S", "T"
-});
+static const auto sDevelopmentSdkCodeNames =
+ std::unordered_set<StringPiece>({"Q", "R", "S", "Tiramisu"});
static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = {
{0x021c, 1},
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
+