Merge "Include linux/fsverity.h and remove inlined definition"
diff --git a/Android.bp b/Android.bp
index a5da97b..7d95b9a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -459,7 +459,8 @@
installable: false, // this lib is a build-only library
static_libs: [
"framework-minus-apex",
- // TODO(jiyong): add stubs for APEXes here
+ "framework-sdkext-stubs-systemapi",
+ // TODO(jiyong): add more stubs for APEXes here
],
sdk_version: "core_platform",
}
@@ -1630,11 +1631,11 @@
"core/java/com/android/internal/os/SomeArgs.java",
"core/java/com/android/internal/util/FastXmlSerializer.java",
"core/java/com/android/internal/util/HexDump.java",
+ "core/java/com/android/internal/util/IState.java",
"core/java/com/android/internal/util/IndentingPrintWriter.java",
"core/java/com/android/internal/util/Preconditions.java",
"core/java/com/android/internal/util/State.java",
"core/java/com/android/internal/util/StateMachine.java",
"core/java/com/android/internal/util/UserIcons.java",
- "core/java/com/android/internal/util/XmlUtils.java",
],
}
diff --git a/apex/Android.bp b/apex/Android.bp
new file mode 100644
index 0000000..9ea3953
--- /dev/null
+++ b/apex/Android.bp
@@ -0,0 +1,39 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+mainline_stubs_args =
+ "--error UnhiddenSystemApi " +
+ "--hide BroadcastBehavior " +
+ "--hide DeprecationMismatch " +
+ "--hide HiddenSuperclass " +
+ "--hide HiddenTypedefConstant " +
+ "--hide HiddenTypeParameter " +
+ "--hide MissingPermission " +
+ "--hide RequiresPermission " +
+ "--hide SdkConstant " +
+ "--hide Todo " +
+ "--hide Typo " +
+ "--hide UnavailableSymbol "
+
+stubs_defaults {
+ name: "framework-module-stubs-defaults-publicapi",
+ args: mainline_stubs_args,
+ installable: false,
+}
+
+stubs_defaults {
+ name: "framework-module-stubs-defaults-systemapi",
+ args: mainline_stubs_args + " --show-annotation android.annotation.SystemApi ",
+ installable: false,
+}
diff --git a/apex/sdkext/Android.bp b/apex/sdkext/Android.bp
index aaf25b1..5369a96 100644
--- a/apex/sdkext/Android.bp
+++ b/apex/sdkext/Android.bp
@@ -12,6 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+package {
+ default_visibility: [":__subpackages__"],
+}
+
apex {
name: "com.android.sdkext",
manifest: "manifest.json",
@@ -19,12 +23,18 @@
java_libs: [ "framework-sdkext" ],
prebuilts: [
"com.android.sdkext.ldconfig",
+ "cur_sdkinfo",
"derive_sdk.rc",
],
key: "com.android.sdkext.key",
certificate: ":com.android.sdkext.certificate",
}
+sdk {
+ name: "sdkext-sdk",
+ java_libs: [ "framework-sdkext-stubs-systemapi" ],
+}
+
apex_key {
name: "com.android.sdkext.key",
public_key: "com.android.sdkext.avbpubkey",
@@ -42,3 +52,33 @@
filename: "ld.config.txt",
installable: false,
}
+
+python_binary_host {
+ name: "gen_sdkinfo",
+ srcs: [
+ "sdk.proto",
+ "gen_sdkinfo.py",
+ ],
+ proto: {
+ canonical_path_from_root: false,
+ },
+ version: {
+ py3: {
+ embedded_launcher: true,
+ },
+ },
+}
+
+gensrcs {
+ name: "cur_sdkinfo_src",
+ srcs: [""],
+ tools: [ "gen_sdkinfo" ],
+ cmd: "$(location) -v 0 -o $(out)",
+}
+
+prebuilt_etc {
+ name: "cur_sdkinfo",
+ src: ":cur_sdkinfo_src",
+ filename: "sdkinfo.binarypb",
+ installable: false,
+}
diff --git a/apex/sdkext/framework/Android.bp b/apex/sdkext/framework/Android.bp
index b17f0f8..a50dc3d 100644
--- a/apex/sdkext/framework/Android.bp
+++ b/apex/sdkext/framework/Android.bp
@@ -12,12 +12,17 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+package {
+ default_visibility: [ ":__pkg__" ]
+}
+
filegroup {
name: "framework-sdkext-sources",
srcs: [
"java/**/*.java",
],
path: "java",
+ visibility: [ "//frameworks/base:__pkg__" ] // For the "global" stubs.
}
java_library {
@@ -27,4 +32,40 @@
libs: [ "framework-annotations-lib" ],
permitted_packages: [ "android.os.ext" ],
installable: true,
+ visibility: [ "//frameworks/base/apex/sdkext:__pkg__" ],
+}
+
+droidstubs {
+ name: "framework-sdkext-droidstubs-publicapi",
+ defaults: [
+ "framework-sdkext-stubs-defaults",
+ "framework-module-stubs-defaults-publicapi",
+ ]
+}
+
+droidstubs {
+ name: "framework-sdkext-droidstubs-systemapi",
+ defaults: [
+ "framework-sdkext-stubs-defaults",
+ "framework-module-stubs-defaults-systemapi",
+ ]
+}
+
+stubs_defaults {
+ name: "framework-sdkext-stubs-defaults",
+ srcs: [
+ ":framework-sdkext-sources",
+ ":framework-annotations",
+ ],
+ sdk_version: "system_current",
+}
+
+java_library {
+ name: "framework-sdkext-stubs-systemapi",
+ srcs: [":framework-sdkext-droidstubs-systemapi"],
+ sdk_version: "system_current",
+ visibility: [
+ "//frameworks/base:__pkg__", // Framework
+ "//frameworks/base/apex/sdkext:__pkg__", // sdkext SDK
+ ]
}
diff --git a/apex/sdkext/gen_sdkinfo.py b/apex/sdkext/gen_sdkinfo.py
new file mode 100644
index 0000000..5af478b
--- /dev/null
+++ b/apex/sdkext/gen_sdkinfo.py
@@ -0,0 +1,19 @@
+import sdk_pb2
+import sys
+
+if __name__ == '__main__':
+ argv = sys.argv[1:]
+ if not len(argv) == 4 or sorted([argv[0], argv[2]]) != ['-o', '-v']:
+ print('usage: gen_sdkinfo -v <version> -o <output-file>')
+ sys.exit(1)
+
+ for i in range(len(argv)):
+ if sys.argv[i] == '-o':
+ filename = sys.argv[i+1]
+ if sys.argv[i] == '-v':
+ version = int(sys.argv[i+1])
+
+ proto = sdk_pb2.SdkVersion()
+ proto.version = version
+ with open(filename, 'wb') as f:
+ f.write(proto.SerializeToString())
diff --git a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl b/apex/sdkext/sdk.proto
similarity index 70%
copy from telephony/java/com/android/internal/telephony/IApnSourceService.aidl
copy to apex/sdkext/sdk.proto
index 34c9067..d15b935 100644
--- a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl
+++ b/apex/sdkext/sdk.proto
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,11 +14,12 @@
* limitations under the License.
*/
-package com.android.internal.telephony;
+syntax = "proto3";
+package com.android.sdkext.proto;
-import android.content.ContentValues;
+option java_outer_classname = "SdkProto";
+option optimize_for = LITE_RUNTIME;
-interface IApnSourceService {
- /** Retreive APNs. */
- ContentValues[] getApns(int subId);
+message SdkVersion {
+ int32 version = 1;
}
diff --git a/api/current.txt b/api/current.txt
index 21ea6e6..5fbd967 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -44668,6 +44668,12 @@
field public static final int SCAN_TYPE_PERIODIC = 1; // 0x1
}
+ public final class PhoneCapability implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.telephony.PhoneCapability> CREATOR;
+ }
+
public class PhoneNumberFormattingTextWatcher implements android.text.TextWatcher {
ctor public PhoneNumberFormattingTextWatcher();
ctor public PhoneNumberFormattingTextWatcher(String);
@@ -45162,7 +45168,7 @@
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getMeid(int);
method public String getMmsUAProfUrl();
method public String getMmsUserAgent();
- method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getNai();
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getNai();
method public String getNetworkCountryIso();
method public String getNetworkOperator();
method public String getNetworkOperatorName();
diff --git a/api/system-current.txt b/api/system-current.txt
index 13c9aaf..21542de 100755
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -75,6 +75,7 @@
field public static final String GET_TOP_ACTIVITY_INFO = "android.permission.GET_TOP_ACTIVITY_INFO";
field public static final String GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS = "android.permission.GRANT_PROFILE_OWNER_DEVICE_IDS_ACCESS";
field public static final String GRANT_RUNTIME_PERMISSIONS = "android.permission.GRANT_RUNTIME_PERMISSIONS";
+ field public static final String GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS = "android.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS";
field public static final String HANDLE_CAR_MODE_CHANGES = "android.permission.HANDLE_CAR_MODE_CHANGES";
field public static final String HARDWARE_TEST = "android.permission.HARDWARE_TEST";
field public static final String HDMI_CEC = "android.permission.HDMI_CEC";
@@ -1225,6 +1226,7 @@
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public int getAppStandbyBucket(String);
method @RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS) public java.util.Map<java.lang.String,java.lang.Integer> getAppStandbyBuckets();
method public int getUsageSource();
+ method @RequiresPermission(android.Manifest.permission.BIND_CARRIER_SERVICES) public void onCarrierPrivilegedAppsChanged();
method @RequiresPermission(allOf={android.Manifest.permission.SUSPEND_APPS, android.Manifest.permission.OBSERVE_APP_USAGE}) public void registerAppUsageLimitObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @Nullable android.app.PendingIntent);
method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerAppUsageObserver(int, @NonNull String[], long, @NonNull java.util.concurrent.TimeUnit, @NonNull android.app.PendingIntent);
method @RequiresPermission(android.Manifest.permission.OBSERVE_APP_USAGE) public void registerUsageSessionObserver(int, @NonNull String[], @NonNull java.time.Duration, @NonNull java.time.Duration, @NonNull android.app.PendingIntent, @Nullable android.app.PendingIntent);
@@ -1269,6 +1271,14 @@
field public static final int OPTIONAL_CODECS_SUPPORT_UNKNOWN = -1; // 0xffffffff
}
+ public final class BluetoothA2dpSink implements android.bluetooth.BluetoothProfile {
+ method public void finalize();
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public int getConnectionPolicy(@Nullable android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH) public boolean isAudioPlaying(@Nullable android.bluetooth.BluetoothDevice);
+ method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean setConnectionPolicy(@Nullable android.bluetooth.BluetoothDevice, int);
+ field @RequiresPermission(android.Manifest.permission.BLUETOOTH) public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED";
+ }
+
public final class BluetoothAdapter {
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED) public boolean addOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull java.util.concurrent.Executor, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener);
method @RequiresPermission(android.Manifest.permission.BLUETOOTH_ADMIN) public boolean connectAllEnabledProfiles(@NonNull android.bluetooth.BluetoothDevice);
@@ -1416,6 +1426,11 @@
field public static final int REMOTE_PANU_ROLE = 2; // 0x2
}
+ public class BluetoothPbap implements android.bluetooth.BluetoothProfile {
+ method public int getConnectionState(@Nullable android.bluetooth.BluetoothDevice);
+ field public static final String ACTION_CONNECTION_STATE_CHANGED = "android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
+ }
+
public interface BluetoothProfile {
field public static final int CONNECTION_POLICY_ALLOWED = 100; // 0x64
field public static final int CONNECTION_POLICY_FORBIDDEN = 0; // 0x0
@@ -1537,6 +1552,7 @@
field public static final String STATS_MANAGER = "stats";
field public static final String STATUS_BAR_SERVICE = "statusbar";
field public static final String SYSTEM_UPDATE_SERVICE = "system_update";
+ field public static final String TELEPHONY_IMS_SERVICE = "telephony_ims";
field public static final String TELEPHONY_REGISTRY_SERVICE = "telephony_registry";
field public static final String VR_SERVICE = "vrmanager";
field @Deprecated public static final String WIFI_RTT_SERVICE = "rttmanager";
@@ -3875,10 +3891,22 @@
package android.media.session {
public final class MediaSessionManager {
+ method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void addOnMediaKeyEventDispatchedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.session.MediaSessionManager.OnMediaKeyEventDispatchedListener);
+ method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void addOnMediaKeyEventSessionChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.session.MediaSessionManager.OnMediaKeyEventSessionChangedListener);
+ method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void removeOnMediaKeyEventDispatchedListener(@NonNull android.media.session.MediaSessionManager.OnMediaKeyEventDispatchedListener);
+ method @RequiresPermission(android.Manifest.permission.MEDIA_CONTENT_CONTROL) public void removeOnMediaKeyEventSessionChangedListener(@NonNull android.media.session.MediaSessionManager.OnMediaKeyEventSessionChangedListener);
method @RequiresPermission(android.Manifest.permission.SET_MEDIA_KEY_LISTENER) public void setOnMediaKeyListener(android.media.session.MediaSessionManager.OnMediaKeyListener, @Nullable android.os.Handler);
method @RequiresPermission(android.Manifest.permission.SET_VOLUME_KEY_LONG_PRESS_LISTENER) public void setOnVolumeKeyLongPressListener(android.media.session.MediaSessionManager.OnVolumeKeyLongPressListener, @Nullable android.os.Handler);
}
+ public static interface MediaSessionManager.OnMediaKeyEventDispatchedListener {
+ method public default void onMediaKeyEventDispatched(@NonNull android.view.KeyEvent, @NonNull String, @NonNull android.media.session.MediaSession.Token);
+ }
+
+ public static interface MediaSessionManager.OnMediaKeyEventSessionChangedListener {
+ method public default void onMediaKeyEventSessionChanged(@NonNull String, @Nullable android.media.session.MediaSession.Token);
+ }
+
public static interface MediaSessionManager.OnMediaKeyListener {
method public boolean onMediaKey(android.view.KeyEvent);
}
@@ -4555,7 +4583,7 @@
method @NonNull public java.util.List<android.net.LinkAddress> getInternalAddresses();
method @NonNull public java.util.List<java.net.InetAddress> getInternalDhcpServers();
method @NonNull public java.util.List<java.net.InetAddress> getInternalDnsServers();
- method @NonNull public java.util.List<android.net.LinkAddress> getInternalSubnets();
+ method @NonNull public java.util.List<android.net.IpPrefix> getInternalSubnets();
method @NonNull public java.util.List<android.net.ipsec.ike.IkeTrafficSelector> getOutboundTrafficSelectors();
}
@@ -4624,6 +4652,7 @@
public final class IkeSessionConfiguration {
ctor public IkeSessionConfiguration();
method @NonNull public String getRemoteApplicationVersion();
+ method @NonNull public java.util.List<byte[]> getRemoteVendorIDs();
method public boolean isIkeExtensionEnabled(int);
field public static final int EXTENSION_TYPE_FRAGMENTATION = 1; // 0x1
field public static final int EXTENSION_TYPE_MOBIKE = 2; // 0x2
@@ -4643,9 +4672,9 @@
ctor public IkeSessionParams.Builder();
method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder addSaProposal(@NonNull android.net.ipsec.ike.IkeSaProposal);
method @NonNull public android.net.ipsec.ike.IkeSessionParams build();
- method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setAuthDigitalSignature(@NonNull java.security.cert.X509Certificate, @NonNull java.security.cert.X509Certificate, @NonNull java.security.PrivateKey);
- method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setAuthDigitalSignature(@NonNull java.security.cert.X509Certificate, @NonNull java.security.cert.X509Certificate, @NonNull java.util.List<java.security.cert.X509Certificate>, @NonNull java.security.PrivateKey);
- method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setAuthEap(@NonNull java.security.cert.X509Certificate, @NonNull android.net.eap.EapSessionConfig);
+ method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setAuthDigitalSignature(@Nullable java.security.cert.X509Certificate, @NonNull java.security.cert.X509Certificate, @NonNull java.security.PrivateKey);
+ method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setAuthDigitalSignature(@Nullable java.security.cert.X509Certificate, @NonNull java.security.cert.X509Certificate, @NonNull java.util.List<java.security.cert.X509Certificate>, @NonNull java.security.PrivateKey);
+ method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setAuthEap(@Nullable java.security.cert.X509Certificate, @NonNull android.net.eap.EapSessionConfig);
method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setAuthPsk(@NonNull byte[]);
method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setLocalIdentification(@NonNull android.net.ipsec.ike.IkeIdentification);
method @NonNull public android.net.ipsec.ike.IkeSessionParams.Builder setRemoteIdentification(@NonNull android.net.ipsec.ike.IkeIdentification);
@@ -4663,7 +4692,7 @@
}
public static class IkeSessionParams.IkeAuthDigitalSignRemoteConfig extends android.net.ipsec.ike.IkeSessionParams.IkeAuthConfig {
- method @NonNull public java.security.cert.X509Certificate getRemoteCaCert();
+ method @Nullable public java.security.cert.X509Certificate getRemoteCaCert();
}
public static class IkeSessionParams.IkeAuthEapConfig extends android.net.ipsec.ike.IkeSessionParams.IkeAuthConfig {
@@ -4727,12 +4756,10 @@
ctor public TunnelModeChildSessionParams.Builder();
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInboundTrafficSelectors(@NonNull android.net.ipsec.ike.IkeTrafficSelector);
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalAddressRequest(int);
- method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalAddressRequest(@NonNull java.net.InetAddress, int);
+ method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalAddressRequest(@NonNull java.net.Inet4Address);
+ method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalAddressRequest(@NonNull java.net.Inet6Address, int);
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalDhcpServerRequest(int);
- method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalDhcpServerRequest(@NonNull java.net.InetAddress);
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalDnsServerRequest(int);
- method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalDnsServerRequest(@NonNull java.net.InetAddress);
- method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addInternalSubnetRequest(int);
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addOutboundTrafficSelectors(@NonNull android.net.ipsec.ike.IkeTrafficSelector);
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams.Builder addSaProposal(@NonNull android.net.ipsec.ike.ChildSaProposal);
method @NonNull public android.net.ipsec.ike.TunnelModeChildSessionParams build();
@@ -4756,9 +4783,6 @@
public static interface TunnelModeChildSessionParams.ConfigRequestIpv4Netmask extends android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequest {
}
- public static interface TunnelModeChildSessionParams.ConfigRequestIpv4Subnet extends android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequest {
- }
-
public static interface TunnelModeChildSessionParams.ConfigRequestIpv6Address extends android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequest {
method @Nullable public java.net.Inet6Address getAddress();
method public int getPrefixLength();
@@ -4768,9 +4792,6 @@
method @Nullable public java.net.Inet6Address getAddress();
}
- public static interface TunnelModeChildSessionParams.ConfigRequestIpv6Subnet extends android.net.ipsec.ike.TunnelModeChildSessionParams.ConfigRequest {
- }
-
}
package android.net.ipsec.ike.exceptions {
@@ -6729,6 +6750,10 @@
field public static final String SUB_ID = "sub_id";
}
+ public static final class Telephony.SimInfo {
+ field @NonNull public static final android.net.Uri CONTENT_URI;
+ }
+
public static final class Telephony.Sms.Intents {
field public static final String ACTION_SMS_EMERGENCY_CB_RECEIVED = "android.provider.action.SMS_EMERGENCY_CB_RECEIVED";
}
@@ -8847,9 +8872,6 @@
public class TelephonyManager {
method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void carrierActionReportDefaultNetworkStatus(int, boolean);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void carrierActionResetAll(int);
- method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void carrierActionSetRadioEnabled(int, boolean);
method public int checkCarrierPrivilegesForPackage(String);
method public int checkCarrierPrivilegesForPackageAnyPhone(String);
method public void dial(String);
@@ -8883,7 +8905,7 @@
method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public java.util.Map<java.lang.Integer,java.lang.Integer> getLogicalToPhysicalSlotMapping();
method public int getMaxNumberOfSimultaneouslyActiveSims();
method public static long getMaxNumberVerificationTimeoutMillis();
- method @NonNull public String getNetworkCountryIso(int);
+ method @NonNull @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public String getNetworkCountryIso(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public long getPreferredNetworkTypeBitmask();
method @RequiresPermission(anyOf={android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public int getRadioPowerState();
method public int getSimApplicationState();
@@ -8920,8 +8942,10 @@
method public boolean needsOtaServiceProvisioning();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyOtaEmergencyNumberDbInstalled();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean);
method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestNumberVerification(@NonNull android.telephony.PhoneNumberRange, long, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.NumberVerificationCallback);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetAllCarrierActions();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void resetCarrierKeysForImsiEncryption();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean resetRadioConfig();
method @RequiresPermission(android.Manifest.permission.CONNECTIVITY_INTERNAL) public void resetSettings();
@@ -8935,6 +8959,7 @@
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setOpportunisticNetworkState(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setPreferredNetworkTypeBitmask(long);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadio(boolean);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRadioEnabled(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean setRadioPower(boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerState(int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setSimPowerStateForSlot(int, int);
@@ -9544,6 +9569,11 @@
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsExternalCallState> CREATOR;
}
+ public class ImsManager {
+ method @NonNull public android.telephony.ims.ImsMmTelManager getImsMmTelManager(int);
+ method @NonNull public android.telephony.ims.ImsRcsManager getImsRcsManager(int);
+ }
+
public class ImsMmTelManager implements android.telephony.ims.RegistrationManager {
method @NonNull public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException;
@@ -9587,6 +9617,22 @@
ctor @Deprecated public ImsMmTelManager.RegistrationCallback();
}
+ public class ImsRcsManager implements android.telephony.ims.RegistrationManager {
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isAvailable(int) throws android.telephony.ims.ImsException;
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isCapable(int, int) throws android.telephony.ims.ImsException;
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerRcsAvailabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsRcsManager.AvailabilityCallback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterRcsAvailabilityCallback(@NonNull android.telephony.ims.ImsRcsManager.AvailabilityCallback) throws android.telephony.ims.ImsException;
+ }
+
+ public static class ImsRcsManager.AvailabilityCallback {
+ ctor public ImsRcsManager.AvailabilityCallback();
+ method public void onAvailabilityChanged(@NonNull android.telephony.ims.feature.RcsFeature.RcsImsCapabilities);
+ }
+
public final class ImsReasonInfo implements android.os.Parcelable {
field public static final String EXTRA_MSG_SERVICE_NOT_AUTHORIZED = "Forbidden. Not Authorized for Service";
}
@@ -9948,9 +9994,22 @@
public class RcsFeature extends android.telephony.ims.feature.ImsFeature {
ctor public RcsFeature();
- method public void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
+ method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
+ method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.RcsFeature.RcsImsCapabilities);
method public void onFeatureReady();
method public void onFeatureRemoved();
+ method public boolean queryCapabilityConfiguration(int, int);
+ method @NonNull public final android.telephony.ims.feature.RcsFeature.RcsImsCapabilities queryCapabilityStatus();
+ }
+
+ public static class RcsFeature.RcsImsCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities {
+ ctor public RcsFeature.RcsImsCapabilities(int);
+ method public void addCapabilities(int);
+ method public boolean isCapable(int);
+ method public void removeCapabilities(int);
+ field public static final int CAPABILITY_TYPE_NONE = 0; // 0x0
+ field public static final int CAPABILITY_TYPE_OPTIONS_UCE = 1; // 0x1
+ field public static final int CAPABILITY_TYPE_PRESENCE_UCE = 2; // 0x2
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index c29ef99..44498dd 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -653,6 +653,7 @@
field public static final String PERMISSION_SERVICE = "permission";
field public static final String ROLLBACK_SERVICE = "rollback";
field public static final String STATUS_BAR_SERVICE = "statusbar";
+ field public static final String TELEPHONY_IMS_SERVICE = "telephony_ims";
field public static final String TEST_NETWORK_SERVICE = "test_network";
}
@@ -3041,7 +3042,7 @@
method @Nullable public static android.content.ComponentName getDefaultRespondViaMessageApplication(@NonNull android.content.Context, boolean);
method public int getEmergencyNumberDbVersion();
method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public String getLine1AlphaTag();
- method @NonNull public String getNetworkCountryIso(int);
+ method @NonNull @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public String getNetworkCountryIso(int);
method public android.util.Pair<java.lang.Integer,java.lang.Integer> getRadioHalVersion();
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void refreshUiccProfile();
method @Deprecated public void setCarrierTestOverride(String, String, String, String, String, String, String);
@@ -3269,6 +3270,11 @@
field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.ImsExternalCallState> CREATOR;
}
+ public class ImsManager {
+ method @NonNull public android.telephony.ims.ImsMmTelManager getImsMmTelManager(int);
+ method @NonNull public android.telephony.ims.ImsRcsManager getImsRcsManager(int);
+ }
+
public class ImsMmTelManager implements android.telephony.ims.RegistrationManager {
method @NonNull public static android.telephony.ims.ImsMmTelManager createForSubscriptionId(int);
method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getFeatureState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>) throws android.telephony.ims.ImsException;
@@ -3312,6 +3318,22 @@
ctor @Deprecated public ImsMmTelManager.RegistrationCallback();
}
+ public class ImsRcsManager implements android.telephony.ims.RegistrationManager {
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationState(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void getRegistrationTransportType(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Integer>);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isAvailable(int) throws android.telephony.ims.ImsException;
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public boolean isCapable(int, int) throws android.telephony.ims.ImsException;
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerImsRegistrationCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.RegistrationManager.RegistrationCallback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void registerRcsAvailabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ImsRcsManager.AvailabilityCallback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterImsRegistrationCallback(@NonNull android.telephony.ims.RegistrationManager.RegistrationCallback);
+ method @RequiresPermission("android.permission.READ_PRIVILEGED_PHONE_STATE") public void unregisterRcsAvailabilityCallback(@NonNull android.telephony.ims.ImsRcsManager.AvailabilityCallback) throws android.telephony.ims.ImsException;
+ }
+
+ public static class ImsRcsManager.AvailabilityCallback {
+ ctor public ImsRcsManager.AvailabilityCallback();
+ method public void onAvailabilityChanged(@NonNull android.telephony.ims.feature.RcsFeature.RcsImsCapabilities);
+ }
+
public class ImsService extends android.app.Service {
ctor public ImsService();
method public android.telephony.ims.feature.MmTelFeature createMmTelFeature(int);
@@ -3669,9 +3691,22 @@
public class RcsFeature extends android.telephony.ims.feature.ImsFeature {
ctor public RcsFeature();
- method public void changeEnabledCapabilities(android.telephony.ims.feature.CapabilityChangeRequest, android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
+ method public void changeEnabledCapabilities(@NonNull android.telephony.ims.feature.CapabilityChangeRequest, @NonNull android.telephony.ims.feature.ImsFeature.CapabilityCallbackProxy);
+ method public final void notifyCapabilitiesStatusChanged(@NonNull android.telephony.ims.feature.RcsFeature.RcsImsCapabilities);
method public void onFeatureReady();
method public void onFeatureRemoved();
+ method public boolean queryCapabilityConfiguration(int, int);
+ method @NonNull public final android.telephony.ims.feature.RcsFeature.RcsImsCapabilities queryCapabilityStatus();
+ }
+
+ public static class RcsFeature.RcsImsCapabilities extends android.telephony.ims.feature.ImsFeature.Capabilities {
+ ctor public RcsFeature.RcsImsCapabilities(int);
+ method public void addCapabilities(int);
+ method public boolean isCapable(int);
+ method public void removeCapabilities(int);
+ field public static final int CAPABILITY_TYPE_NONE = 0; // 0x0
+ field public static final int CAPABILITY_TYPE_OPTIONS_UCE = 1; // 0x1
+ field public static final int CAPABILITY_TYPE_PRESENCE_UCE = 2; // 0x2
}
}
diff --git a/cmds/svc/src/com/android/commands/svc/DataCommand.java b/cmds/svc/src/com/android/commands/svc/DataCommand.java
index 35510cf..b4dbd1d 100644
--- a/cmds/svc/src/com/android/commands/svc/DataCommand.java
+++ b/cmds/svc/src/com/android/commands/svc/DataCommand.java
@@ -16,12 +16,16 @@
package com.android.commands.svc;
-import android.os.ServiceManager;
-import android.os.RemoteException;
-import android.content.Context;
-import com.android.internal.telephony.ITelephony;
-
+/**
+ * @deprecated Please use adb shell cmd phone data enabled/disable instead.
+ */
+@Deprecated
public class DataCommand extends Svc.Command {
+
+ private static final String DECPRECATED_MESSAGE =
+ "adb shell svc data enable/disable is deprecated;"
+ + "please use adb shell cmd phone data enable/disable instead.";
+
public DataCommand() {
super("data");
}
@@ -33,36 +37,10 @@
public String longHelp() {
return shortHelp() + "\n"
+ "\n"
- + "usage: svc data [enable|disable]\n"
- + " Turn mobile data on or off.\n\n";
+ + DECPRECATED_MESSAGE;
}
public void run(String[] args) {
- boolean validCommand = false;
- if (args.length >= 2) {
- boolean flag = false;
- if ("enable".equals(args[1])) {
- flag = true;
- validCommand = true;
- } else if ("disable".equals(args[1])) {
- flag = false;
- validCommand = true;
- }
- if (validCommand) {
- ITelephony phoneMgr
- = ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
- try {
- if (flag) {
- phoneMgr.enableDataConnectivity();
- } else
- phoneMgr.disableDataConnectivity();
- }
- catch (RemoteException e) {
- System.err.println("Mobile data operation failed: " + e);
- }
- return;
- }
- }
- System.err.println(longHelp());
+ System.err.println(DECPRECATED_MESSAGE);
}
}
diff --git a/core/java/android/annotation/OWNERS b/core/java/android/annotation/OWNERS
index e07028b..8aceb56 100644
--- a/core/java/android/annotation/OWNERS
+++ b/core/java/android/annotation/OWNERS
@@ -1,2 +1,3 @@
tnorbye@google.com
+aurimas@google.com
per-file UnsupportedAppUsage.java = mathewi@google.com, dbrazdil@google.com, atrost@google.com, andreionea@google.com
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index d8ccc62..c56e8d8 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -1245,6 +1245,14 @@
return new TimeZoneDetector();
}});
+ registerService(Context.TELEPHONY_IMS_SERVICE, android.telephony.ims.ImsManager.class,
+ new CachedServiceFetcher<android.telephony.ims.ImsManager>() {
+ @Override
+ public android.telephony.ims.ImsManager createService(ContextImpl ctx) {
+ return new android.telephony.ims.ImsManager(ctx.getOuterContext());
+ }
+ });
+
registerService(Context.PERMISSION_SERVICE, PermissionManager.class,
new CachedServiceFetcher<PermissionManager>() {
@Override
diff --git a/core/java/android/app/role/IRoleManager.aidl b/core/java/android/app/role/IRoleManager.aidl
index d8cea28..6d790b3 100644
--- a/core/java/android/app/role/IRoleManager.aidl
+++ b/core/java/android/app/role/IRoleManager.aidl
@@ -19,7 +19,6 @@
import android.app.role.IOnRoleHoldersChangedListener;
import android.os.Bundle;
import android.os.RemoteCallback;
-import android.telephony.IFinancialSmsCallback;
/**
* @hide
@@ -55,9 +54,4 @@
List<String> getHeldRolesFromController(in String packageName);
String getDefaultSmsPackage(int userId);
-
- /**
- * Get filtered SMS messages for financial app.
- */
- void getSmsMessagesForFinancialApp(in String callingPkg, in Bundle params, in IFinancialSmsCallback callback);
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index 749a011..92e1b30 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -1041,8 +1041,11 @@
/**
* Inform usage stats that the carrier privileged apps access rules have changed.
+ * <p> The caller must have {@link android.Manifest.permission#BIND_CARRIER_SERVICES} </p>
* @hide
*/
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.BIND_CARRIER_SERVICES)
public void onCarrierPrivilegedAppsChanged() {
try {
mService.onCarrierPrivilegedAppsChanged();
diff --git a/core/java/android/bluetooth/BluetoothA2dpSink.java b/core/java/android/bluetooth/BluetoothA2dpSink.java
index cf33676..c6957e1 100755
--- a/core/java/android/bluetooth/BluetoothA2dpSink.java
+++ b/core/java/android/bluetooth/BluetoothA2dpSink.java
@@ -17,7 +17,9 @@
package android.bluetooth;
import android.Manifest;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
+import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.content.Context;
@@ -39,6 +41,7 @@
*
* @hide
*/
+@SystemApi
public final class BluetoothA2dpSink implements BluetoothProfile {
private static final String TAG = "BluetoothA2dpSink";
private static final boolean DBG = true;
@@ -59,71 +62,14 @@
* {@link #STATE_DISCONNECTED}, {@link #STATE_CONNECTING},
* {@link #STATE_CONNECTED}, {@link #STATE_DISCONNECTING}.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to
- * receive.
+ * @hide
*/
+ @SystemApi
+ @SuppressLint("ActionValue")
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
public static final String ACTION_CONNECTION_STATE_CHANGED =
"android.bluetooth.a2dp-sink.profile.action.CONNECTION_STATE_CHANGED";
- /**
- * Intent used to broadcast the change in the Playing state of the A2DP Sink
- * profile.
- *
- * <p>This intent will have 3 extras:
- * <ul>
- * <li> {@link #EXTRA_STATE} - The current state of the profile. </li>
- * <li> {@link #EXTRA_PREVIOUS_STATE}- The previous state of the profile. </li>
- * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. </li>
- * </ul>
- *
- * <p>{@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} can be any of
- * {@link #STATE_PLAYING}, {@link #STATE_NOT_PLAYING},
- *
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to
- * receive.
- */
- public static final String ACTION_PLAYING_STATE_CHANGED =
- "android.bluetooth.a2dp-sink.profile.action.PLAYING_STATE_CHANGED";
-
- /**
- * A2DP sink device is streaming music. This state can be one of
- * {@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} of
- * {@link #ACTION_PLAYING_STATE_CHANGED} intent.
- */
- public static final int STATE_PLAYING = 10;
-
- /**
- * A2DP sink device is NOT streaming music. This state can be one of
- * {@link #EXTRA_STATE} or {@link #EXTRA_PREVIOUS_STATE} of
- * {@link #ACTION_PLAYING_STATE_CHANGED} intent.
- */
- public static final int STATE_NOT_PLAYING = 11;
-
- /**
- * Intent used to broadcast the change in the Playing state of the A2DP Sink
- * profile.
- *
- * <p>This intent will have 3 extras:
- * <ul>
- * <li> {@link #EXTRA_AUDIO_CONFIG} - The audio configuration for the remote device. </li>
- * <li> {@link BluetoothDevice#EXTRA_DEVICE} - The remote device. </li>
- * </ul>
- *
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to
- * receive.
- */
- public static final String ACTION_AUDIO_CONFIG_CHANGED =
- "android.bluetooth.a2dp-sink.profile.action.AUDIO_CONFIG_CHANGED";
-
- /**
- * Extra for the {@link #ACTION_AUDIO_CONFIG_CHANGED} intent.
- *
- * This extra represents the current audio configuration of the A2DP source device.
- * {@see BluetoothAudioConfig}
- */
- public static final String EXTRA_AUDIO_CONFIG =
- "android.bluetooth.a2dp-sink.profile.extra.AUDIO_CONFIG";
-
private BluetoothAdapter mAdapter;
private final BluetoothProfileConnector<IBluetoothA2dpSink> mProfileConnector =
new BluetoothProfileConnector(this, BluetoothProfile.A2DP_SINK,
@@ -170,13 +116,11 @@
* the state. Users can get the connection state of the profile
* from this intent.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
*/
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean connect(BluetoothDevice device) {
if (DBG) log("connect(" + device + ")");
final IBluetoothA2dpSink service = getService();
@@ -210,14 +154,12 @@
* {@link #STATE_DISCONNECTING} can be used to distinguish between the
* two scenarios.
*
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH_ADMIN}
- * permission.
- *
* @param device Remote Bluetooth Device
* @return false on immediate error, true otherwise
* @hide
*/
@UnsupportedAppUsage
+ @RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean disconnect(BluetoothDevice device) {
if (DBG) log("disconnect(" + device + ")");
final IBluetoothA2dpSink service = getService();
@@ -235,6 +177,8 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
@Override
public List<BluetoothDevice> getConnectedDevices() {
@@ -254,6 +198,8 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
@@ -273,6 +219,8 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
@Override
public int getConnectionState(BluetoothDevice device) {
@@ -300,6 +248,8 @@
* @return audio configuration for the device, or null
*
* {@see BluetoothAudioConfig}
+ *
+ * @hide
*/
public BluetoothAudioConfig getAudioConfig(BluetoothDevice device) {
if (VDBG) log("getAudioConfig(" + device + ")");
@@ -347,7 +297,7 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
- public boolean setConnectionPolicy(BluetoothDevice device, int connectionPolicy) {
+ public boolean setConnectionPolicy(@Nullable BluetoothDevice device, int connectionPolicy) {
if (DBG) log("setConnectionPolicy(" + device + ", " + connectionPolicy + ")");
final IBluetoothA2dpSink service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
@@ -395,7 +345,7 @@
*/
@SystemApi
@RequiresPermission(Manifest.permission.BLUETOOTH)
- public int getConnectionPolicy(BluetoothDevice device) {
+ public int getConnectionPolicy(@Nullable BluetoothDevice device) {
if (VDBG) log("getConnectionPolicy(" + device + ")");
final IBluetoothA2dpSink service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
@@ -411,13 +361,16 @@
}
/**
- * Check if A2DP profile is streaming music.
- *
- * <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission.
+ * Check if audio is playing on the bluetooth device (A2DP profile is streaming music).
*
* @param device BluetoothDevice device
+ * @return true if audio is playing (A2dp is streaming music), false otherwise
+ *
+ * @hide
*/
- public boolean isA2dpPlaying(BluetoothDevice device) {
+ @SystemApi
+ @RequiresPermission(Manifest.permission.BLUETOOTH)
+ public boolean isAudioPlaying(@Nullable BluetoothDevice device) {
final IBluetoothA2dpSink service = getService();
if (service != null && isEnabled() && isValidDevice(device)) {
try {
@@ -448,9 +401,9 @@
return "connected";
case STATE_DISCONNECTING:
return "disconnecting";
- case STATE_PLAYING:
+ case BluetoothA2dp.STATE_PLAYING:
return "playing";
- case STATE_NOT_PLAYING:
+ case BluetoothA2dp.STATE_NOT_PLAYING:
return "not playing";
default:
return "<unknown state " + state + ">";
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 3f8cb62..291d1d9 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -847,7 +847,8 @@
}
synchronized (mLock) {
if (sBluetoothLeScanner == null) {
- sBluetoothLeScanner = new BluetoothLeScanner(mManagerService);
+ sBluetoothLeScanner = new BluetoothLeScanner(mManagerService, getOpPackageName(),
+ getFeatureId());
}
}
return sBluetoothLeScanner;
@@ -1637,6 +1638,15 @@
return ActivityThread.currentOpPackageName();
}
+ private String getFeatureId() {
+ // Workaround for legacy API for getting a BluetoothAdapter not
+ // passing a context
+ if (mContext != null) {
+ return null;
+ }
+ return null;
+ }
+
/**
* Start the remote device discovery process.
* <p>The discovery process usually involves an inquiry scan of about 12
@@ -1674,7 +1684,7 @@
try {
mServiceLock.readLock().lock();
if (mService != null) {
- return mService.startDiscovery(getOpPackageName());
+ return mService.startDiscovery(getOpPackageName(), getFeatureId());
}
} catch (RemoteException e) {
Log.e(TAG, "", e);
diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java
index adedff3..cff4c2d 100644
--- a/core/java/android/bluetooth/BluetoothManager.java
+++ b/core/java/android/bluetooth/BluetoothManager.java
@@ -22,7 +22,9 @@
import android.annotation.SystemService;
import android.content.Context;
import android.content.pm.PackageManager;
+import android.os.IBinder;
import android.os.RemoteException;
+import android.os.ServiceManager;
import android.util.Log;
import java.util.ArrayList;
@@ -60,22 +62,34 @@
* @hide
*/
public BluetoothManager(Context context) {
- context = context.getApplicationContext();
- if (context == null) {
- throw new IllegalArgumentException(
- "context not associated with any application (using a mock context?)");
+ if (null == null) {
+ context = context.getApplicationContext();
+ if (context == null) {
+ throw new IllegalArgumentException(
+ "context not associated with any application (using a mock context?)");
+ }
+
+ mAdapter = BluetoothAdapter.getDefaultAdapter();
+ } else {
+ IBinder b = ServiceManager.getService(BluetoothAdapter.BLUETOOTH_MANAGER_SERVICE);
+ if (b != null) {
+ mAdapter = new BluetoothAdapter(IBluetoothManager.Stub.asInterface(b));
+ } else {
+ Log.e(TAG, "Bluetooth binder is null");
+ mAdapter = null;
+ }
}
- // Legacy api - getDefaultAdapter does not take in the context
- mAdapter = BluetoothAdapter.getDefaultAdapter();
+
+ // Context is not initialized in constructor
if (mAdapter != null) {
mAdapter.setContext(context);
}
}
/**
- * Get the default BLUETOOTH Adapter for this device.
+ * Get the BLUETOOTH Adapter for this device.
*
- * @return the default BLUETOOTH Adapter
+ * @return the BLUETOOTH Adapter
*/
public BluetoothAdapter getAdapter() {
return mAdapter;
diff --git a/core/java/android/bluetooth/BluetoothPbap.java b/core/java/android/bluetooth/BluetoothPbap.java
index d94c657..df02896 100644
--- a/core/java/android/bluetooth/BluetoothPbap.java
+++ b/core/java/android/bluetooth/BluetoothPbap.java
@@ -16,7 +16,10 @@
package android.bluetooth;
+import android.annotation.Nullable;
import android.annotation.SdkConstant;
+import android.annotation.SuppressLint;
+import android.annotation.SystemApi;
import android.annotation.UnsupportedAppUsage;
import android.content.ComponentName;
import android.content.Context;
@@ -54,6 +57,7 @@
*
* @hide
*/
+@SystemApi
public class BluetoothPbap implements BluetoothProfile {
private static final String TAG = "BluetoothPbap";
@@ -75,7 +79,11 @@
* {@link BluetoothProfile#STATE_DISCONNECTING}.
* <p>Requires {@link android.Manifest.permission#BLUETOOTH} permission to
* receive.
+ *
+ * @hide
*/
+ @SuppressLint("ActionValue")
+ @SystemApi
@SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_CONNECTION_STATE_CHANGED =
"android.bluetooth.pbap.profile.action.CONNECTION_STATE_CHANGED";
@@ -85,33 +93,16 @@
private ServiceListener mServiceListener;
private BluetoothAdapter mAdapter;
+ /** @hide */
public static final int RESULT_FAILURE = 0;
+ /** @hide */
public static final int RESULT_SUCCESS = 1;
- /** Connection canceled before completion. */
- public static final int RESULT_CANCELED = 2;
-
/**
- * An interface for notifying Bluetooth PCE IPC clients when they have
- * been connected to the BluetoothPbap service.
+ * Connection canceled before completion.
+ *
+ * @hide
*/
- public interface ServiceListener {
- /**
- * Called to notify the client when this proxy object has been
- * connected to the BluetoothPbap service. Clients must wait for
- * this callback before making IPC calls on the BluetoothPbap
- * service.
- */
- public void onServiceConnected(BluetoothPbap proxy);
-
- /**
- * Called to notify the client that this proxy object has been
- * disconnected from the BluetoothPbap service. Clients must not
- * make IPC calls on the BluetoothPbap service after this callback.
- * This callback will currently only occur if the application hosting
- * the BluetoothPbap service, but may be called more often in future.
- */
- public void onServiceDisconnected();
- }
+ public static final int RESULT_CANCELED = 2;
private final IBluetoothStateChangeCallback mBluetoothStateChangeCallback =
new IBluetoothStateChangeCallback.Stub() {
@@ -127,6 +118,8 @@
/**
* Create a BluetoothPbap proxy object.
+ *
+ * @hide
*/
public BluetoothPbap(Context context, ServiceListener l) {
mContext = context;
@@ -181,6 +174,7 @@
}
}
+ /** @hide */
protected void finalize() throws Throwable {
try {
close();
@@ -194,6 +188,8 @@
* Other public functions of BluetoothPbap will return default error
* results once close() has been called. Multiple invocations of close()
* are ok.
+ *
+ * @hide
*/
public synchronized void close() {
IBluetoothManager mgr = mAdapter.getBluetoothManager();
@@ -210,6 +206,8 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
@Override
public List<BluetoothDevice> getConnectedDevices() {
@@ -229,17 +227,22 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
+ @SystemApi
@Override
- public int getConnectionState(BluetoothDevice device) {
+ public int getConnectionState(@Nullable BluetoothDevice device) {
log("getConnectionState: device=" + device);
- final IBluetoothPbap service = mService;
- if (service == null) {
- Log.w(TAG, "Proxy not attached to service");
- return BluetoothProfile.STATE_DISCONNECTED;
- }
try {
- return service.getConnectionState(device);
+ final IBluetoothPbap service = mService;
+ if (service != null && isEnabled() && isValidDevice(device)) {
+ return service.getConnectionState(device);
+ }
+ if (service == null) {
+ Log.w(TAG, "Proxy not attached to service");
+ }
+ return BluetoothProfile.STATE_DISCONNECTED;
} catch (RemoteException e) {
Log.e(TAG, e.toString());
}
@@ -248,6 +251,8 @@
/**
* {@inheritDoc}
+ *
+ * @hide
*/
@Override
public List<BluetoothDevice> getDevicesMatchingConnectionStates(int[] states) {
@@ -266,22 +271,12 @@
}
/**
- * Returns true if the specified Bluetooth device is connected (does not
- * include connecting). Returns false if not connected, or if this proxy
- * object is not currently connected to the Pbap service.
- */
- // TODO: This is currently being used by SettingsLib and internal app.
- public boolean isConnected(BluetoothDevice device) {
- return getConnectionState(device) == BluetoothAdapter.STATE_CONNECTED;
- }
-
- /**
* Disconnects the current Pbap client (PCE). Currently this call blocks,
* it may soon be made asynchronous. Returns false if this proxy object is
* not currently connected to the Pbap service.
+ *
+ * @hide
*/
- // TODO: This is currently being used by SettingsLib and will be used in the future.
- // TODO: Must specify target device. Implement this in the service.
@UnsupportedAppUsage
public boolean disconnect(BluetoothDevice device) {
log("disconnect()");
@@ -304,7 +299,7 @@
log("Proxy object connected");
mService = IBluetoothPbap.Stub.asInterface(service);
if (mServiceListener != null) {
- mServiceListener.onServiceConnected(BluetoothPbap.this);
+ mServiceListener.onServiceConnected(BluetoothProfile.PBAP, BluetoothPbap.this);
}
}
@@ -312,11 +307,23 @@
log("Proxy object disconnected");
doUnbind();
if (mServiceListener != null) {
- mServiceListener.onServiceDisconnected();
+ mServiceListener.onServiceDisconnected(BluetoothProfile.PBAP);
}
}
};
+ private boolean isEnabled() {
+ if (mAdapter.getState() == BluetoothAdapter.STATE_ON) return true;
+ return false;
+ }
+
+ private boolean isValidDevice(BluetoothDevice device) {
+ if (device == null) return false;
+
+ if (BluetoothAdapter.checkBluetoothAddress(device.getAddress())) return true;
+ return false;
+ }
+
private static void log(String msg) {
if (DBG) {
Log.d(TAG, msg);
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index ac126ae..9a17346 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -21,7 +21,6 @@
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
-import android.app.ActivityThread;
import android.app.PendingIntent;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothGatt;
@@ -84,17 +83,25 @@
private BluetoothAdapter mBluetoothAdapter;
private final Map<ScanCallback, BleScanCallbackWrapper> mLeScanClients;
+ private final String mOpPackageName;
+ private final String mFeatureId;
+
/**
* Use {@link BluetoothAdapter#getBluetoothLeScanner()} instead.
*
* @param bluetoothManager BluetoothManager that conducts overall Bluetooth Management.
+ * @param opPackageName The opPackageName of the context this object was created from
+ * @param featureId The featureId of the context this object was created from
* @hide
*/
- public BluetoothLeScanner(IBluetoothManager bluetoothManager) {
+ public BluetoothLeScanner(IBluetoothManager bluetoothManager,
+ @NonNull String opPackageName, @Nullable String featureId) {
mBluetoothManager = bluetoothManager;
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mHandler = new Handler(Looper.getMainLooper());
mLeScanClients = new HashMap<ScanCallback, BleScanCallbackWrapper>();
+ mOpPackageName = opPackageName;
+ mFeatureId = featureId;
}
/**
@@ -246,8 +253,8 @@
wrapper.startRegistration();
} else {
try {
- gatt.startScanForIntent(callbackIntent, settings, filters,
- ActivityThread.currentOpPackageName());
+ gatt.startScanForIntent(callbackIntent, settings, filters, mOpPackageName,
+ mFeatureId);
} catch (RemoteException e) {
return ScanCallback.SCAN_FAILED_INTERNAL_ERROR;
}
@@ -288,7 +295,7 @@
IBluetoothGatt gatt;
try {
gatt = mBluetoothManager.getBluetoothGatt();
- gatt.stopScanForIntent(callbackIntent, ActivityThread.currentOpPackageName());
+ gatt.stopScanForIntent(callbackIntent, mOpPackageName);
} catch (RemoteException e) {
}
}
@@ -448,8 +455,7 @@
} else {
mScannerId = scannerId;
mBluetoothGatt.startScan(mScannerId, mSettings, mFilters,
- mResultStorages,
- ActivityThread.currentOpPackageName());
+ mResultStorages, mOpPackageName, mFeatureId);
}
} catch (RemoteException e) {
Log.e(TAG, "fail to start le scan: " + e);
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index 2086053..39a7115 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -4821,6 +4821,8 @@
* {@link android.telephony.ims.ImsManager}.
* @hide
*/
+ @SystemApi
+ @TestApi
public static final String TELEPHONY_IMS_SERVICE = "telephony_ims";
/**
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 8a3d79c..7754666 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -25,7 +25,6 @@
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.annotation.UnsupportedAppUsage;
-import android.app.job.JobService;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.ContentValues;
@@ -1272,8 +1271,7 @@
* Broadcast action: When SMS-MMS db is being created. If file-based encryption is
* supported, this broadcast indicates creation of the db in credential-encrypted
* storage. A boolean is specified in {@link #EXTRA_IS_INITIAL_CREATE} to indicate if
- * this is the initial create of the db. Requires
- * {@link android.Manifest.permission#READ_SMS} to receive.
+ * this is the initial create of the db.
*
* @see #EXTRA_IS_INITIAL_CREATE
*
@@ -4119,20 +4117,6 @@
public static final String CID = "cid";
/**
- * Message code. <em>OBSOLETE: merged into SERIAL_NUMBER.</em>
- * <P>Type: INTEGER</P>
- * @hide
- */
- public static final String V1_MESSAGE_CODE = "message_code";
-
- /**
- * Message identifier. <em>OBSOLETE: renamed to SERVICE_CATEGORY.</em>
- * <P>Type: INTEGER</P>
- * @hide
- */
- public static final String V1_MESSAGE_IDENTIFIER = "message_id";
-
- /**
* Service category which represents the general topic of the message.
* <p>
* For GSM/UMTS: message identifier (see 3GPP TS 23.041 section 9.4.1.2.2)
@@ -4380,9 +4364,11 @@
* ServiceState provider.
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
- * {@link ServiceState} while your app is running. You can also use a {@link JobService} to
+ * {@link ServiceState} while your app is running.
+ * You can also use a {@link android.app.job.JobService} to
* ensure your app is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
+ * Note, however, that using a {@link android.app.job.JobService}
+ * does not guarantee timely delivery of
* updates to the {@link Uri}.
*
* @param subscriptionId the subscriptionId to receive updates on
@@ -4399,9 +4385,11 @@
* ServiceState provider.
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
- * {@link ServiceState} while your app is running. You can also use a {@link JobService} to
+ * {@link ServiceState} while your app is running. You can also use a
+ * {@link android.app.job.JobService} to
* ensure your app is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
+ * Note, however, that using a {@link android.app.job.JobService}
+ * does not guarantee timely delivery of
* updates to the {@link Uri}.
*
* @param subscriptionId the subscriptionId to receive updates on
@@ -4655,10 +4643,11 @@
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* carrier identity {@link TelephonyManager#getSimCarrierId()}
- * while your app is running. You can also use a {@link JobService} to ensure your app
+ * while your app is running. You can also use a {@link android.app.job.JobService}
+ * to ensure your app
* is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee
+ * timely delivery of updates to the {@link Uri}.
*
* @param subscriptionId the subscriptionId to receive updates on
* @return the Uri used to observe carrier identity changes
@@ -4676,10 +4665,11 @@
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* specific carrier identity {@link TelephonyManager#getSimSpecificCarrierId()}
- * while your app is running. You can also use a {@link JobService} to ensure your app
+ * while your app is running. You can also use a {@link android.app.job.JobService}
+ * to ensure your app
* is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee timely
+ * delivery of updates to the {@link Uri}.
*
* @param subscriptionId the subscriptionId to receive updates on
* @return the Uri used to observe specific carrier identity changes
@@ -4810,4 +4800,23 @@
public static final Uri CONTENT_URI = Uri.parse("content://carrier_id/all");
}
}
+
+ /**
+ * Contains SIM Information
+ * @hide
+ */
+ @SystemApi
+ public static final class SimInfo {
+ /**
+ * Not instantiable.
+ * @hide
+ */
+ private SimInfo() {}
+
+ /**
+ * The {@code content://} style URI for this provider.
+ */
+ @NonNull
+ public static final Uri CONTENT_URI = Uri.parse("content://telephony/siminfo");
+ }
}
diff --git a/core/java/android/service/carrier/ApnService.java b/core/java/android/service/carrier/ApnService.java
index 57e4b1b..0c12fd4 100644
--- a/core/java/android/service/carrier/ApnService.java
+++ b/core/java/android/service/carrier/ApnService.java
@@ -26,7 +26,7 @@
import android.os.IBinder;
import android.util.Log;
-import com.android.internal.telephony.IApnSourceService;
+import android.service.carrier.IApnSourceService;
import java.util.List;
diff --git a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl b/core/java/android/service/carrier/IApnSourceService.aidl
similarity index 93%
rename from telephony/java/com/android/internal/telephony/IApnSourceService.aidl
rename to core/java/android/service/carrier/IApnSourceService.aidl
index 34c9067..fadd2ff 100644
--- a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl
+++ b/core/java/android/service/carrier/IApnSourceService.aidl
@@ -14,10 +14,11 @@
* limitations under the License.
*/
-package com.android.internal.telephony;
+package android.service.carrier;
import android.content.ContentValues;
+/** @hide */
interface IApnSourceService {
/** Retreive APNs. */
ContentValues[] getApns(int subId);
diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java
index a65c8fd..716a522 100644
--- a/core/java/android/telephony/PhoneStateListener.java
+++ b/core/java/android/telephony/PhoneStateListener.java
@@ -286,14 +286,6 @@
public static final int LISTEN_USER_MOBILE_DATA_STATE = 0x00080000;
/**
- * Listen for changes to the physical channel configuration.
- *
- * @see #onPhysicalChannelConfigurationChanged
- * @hide
- */
- public static final int LISTEN_PHYSICAL_CHANNEL_CONFIGURATION = 0x00100000;
-
- /**
* Listen for changes to the phone capability.
*
* @see #onPhoneCapabilityChanged
@@ -831,24 +823,6 @@
}
/**
- * Callback invoked when the current physical channel configuration has changed on the
- * registered subscription.
- * Note, the registration subId comes from {@link TelephonyManager} object which registers
- * PhoneStateListener by {@link TelephonyManager#listen(PhoneStateListener, int)}.
- * If this TelephonyManager object was created with
- * {@link TelephonyManager#createForSubscriptionId(int)}, then the callback applies to the
- * subId. Otherwise, this callback applies to
- * {@link SubscriptionManager#getDefaultSubscriptionId()}.
- *
- * @param configs List of the current {@link PhysicalChannelConfig}s
- * @hide
- */
- public void onPhysicalChannelConfigurationChanged(
- @NonNull List<PhysicalChannelConfig> configs) {
- // default implementation empty
- }
-
- /**
* Callback invoked when the current emergency number list has changed on the registered
* subscription.
* Note, the registration subId comes from {@link TelephonyManager} object which registers
@@ -1194,15 +1168,6 @@
() -> mExecutor.execute(() -> psl.onCarrierNetworkChange(active)));
}
- public void onPhysicalChannelConfigurationChanged(List<PhysicalChannelConfig> configs) {
- PhoneStateListener psl = mPhoneStateListenerWeakRef.get();
- if (psl == null) return;
-
- Binder.withCleanCallingIdentity(
- () -> mExecutor.execute(
- () -> psl.onPhysicalChannelConfigurationChanged(configs)));
- }
-
public void onEmergencyNumberListChanged(Map emergencyNumberList) {
PhoneStateListener psl = mPhoneStateListenerWeakRef.get();
if (psl == null) return;
diff --git a/telephony/java/com/android/ims/internal/uce/common/CapInfo.aidl b/core/java/com/android/ims/internal/uce/common/CapInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/common/CapInfo.aidl
rename to core/java/com/android/ims/internal/uce/common/CapInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/common/CapInfo.java b/core/java/com/android/ims/internal/uce/common/CapInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/common/CapInfo.java
rename to core/java/com/android/ims/internal/uce/common/CapInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/common/StatusCode.aidl b/core/java/com/android/ims/internal/uce/common/StatusCode.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/common/StatusCode.aidl
rename to core/java/com/android/ims/internal/uce/common/StatusCode.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/common/StatusCode.java b/core/java/com/android/ims/internal/uce/common/StatusCode.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/common/StatusCode.java
rename to core/java/com/android/ims/internal/uce/common/StatusCode.java
diff --git a/telephony/java/com/android/ims/internal/uce/common/UceLong.aidl b/core/java/com/android/ims/internal/uce/common/UceLong.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/common/UceLong.aidl
rename to core/java/com/android/ims/internal/uce/common/UceLong.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/common/UceLong.java b/core/java/com/android/ims/internal/uce/common/UceLong.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/common/UceLong.java
rename to core/java/com/android/ims/internal/uce/common/UceLong.java
diff --git a/telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl b/core/java/com/android/ims/internal/uce/options/IOptionsListener.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/IOptionsListener.aidl
rename to core/java/com/android/ims/internal/uce/options/IOptionsListener.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl b/core/java/com/android/ims/internal/uce/options/IOptionsService.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/IOptionsService.aidl
rename to core/java/com/android/ims/internal/uce/options/IOptionsService.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsCapInfo.aidl b/core/java/com/android/ims/internal/uce/options/OptionsCapInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsCapInfo.aidl
rename to core/java/com/android/ims/internal/uce/options/OptionsCapInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsCapInfo.java b/core/java/com/android/ims/internal/uce/options/OptionsCapInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsCapInfo.java
rename to core/java/com/android/ims/internal/uce/options/OptionsCapInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsCmdId.aidl b/core/java/com/android/ims/internal/uce/options/OptionsCmdId.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsCmdId.aidl
rename to core/java/com/android/ims/internal/uce/options/OptionsCmdId.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsCmdId.java b/core/java/com/android/ims/internal/uce/options/OptionsCmdId.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsCmdId.java
rename to core/java/com/android/ims/internal/uce/options/OptionsCmdId.java
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsCmdStatus.aidl b/core/java/com/android/ims/internal/uce/options/OptionsCmdStatus.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsCmdStatus.aidl
rename to core/java/com/android/ims/internal/uce/options/OptionsCmdStatus.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsCmdStatus.java b/core/java/com/android/ims/internal/uce/options/OptionsCmdStatus.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsCmdStatus.java
rename to core/java/com/android/ims/internal/uce/options/OptionsCmdStatus.java
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsSipResponse.aidl b/core/java/com/android/ims/internal/uce/options/OptionsSipResponse.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsSipResponse.aidl
rename to core/java/com/android/ims/internal/uce/options/OptionsSipResponse.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/options/OptionsSipResponse.java b/core/java/com/android/ims/internal/uce/options/OptionsSipResponse.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/options/OptionsSipResponse.java
rename to core/java/com/android/ims/internal/uce/options/OptionsSipResponse.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl b/core/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl
rename to core/java/com/android/ims/internal/uce/presence/IPresenceListener.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl b/core/java/com/android/ims/internal/uce/presence/IPresenceService.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/IPresenceService.aidl
rename to core/java/com/android/ims/internal/uce/presence/IPresenceService.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresCapInfo.aidl b/core/java/com/android/ims/internal/uce/presence/PresCapInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresCapInfo.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresCapInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresCapInfo.java b/core/java/com/android/ims/internal/uce/presence/PresCapInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresCapInfo.java
rename to core/java/com/android/ims/internal/uce/presence/PresCapInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresCmdId.aidl b/core/java/com/android/ims/internal/uce/presence/PresCmdId.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresCmdId.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresCmdId.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresCmdId.java b/core/java/com/android/ims/internal/uce/presence/PresCmdId.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresCmdId.java
rename to core/java/com/android/ims/internal/uce/presence/PresCmdId.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresCmdStatus.aidl b/core/java/com/android/ims/internal/uce/presence/PresCmdStatus.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresCmdStatus.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresCmdStatus.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresCmdStatus.java b/core/java/com/android/ims/internal/uce/presence/PresCmdStatus.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresCmdStatus.java
rename to core/java/com/android/ims/internal/uce/presence/PresCmdStatus.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.aidl b/core/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.java b/core/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.java
rename to core/java/com/android/ims/internal/uce/presence/PresPublishTriggerType.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresResInfo.aidl b/core/java/com/android/ims/internal/uce/presence/PresResInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresResInfo.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresResInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresResInfo.java b/core/java/com/android/ims/internal/uce/presence/PresResInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresResInfo.java
rename to core/java/com/android/ims/internal/uce/presence/PresResInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.aidl b/core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java b/core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java
rename to core/java/com/android/ims/internal/uce/presence/PresResInstanceInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresRlmiInfo.aidl b/core/java/com/android/ims/internal/uce/presence/PresRlmiInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresRlmiInfo.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresRlmiInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresRlmiInfo.java b/core/java/com/android/ims/internal/uce/presence/PresRlmiInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresRlmiInfo.java
rename to core/java/com/android/ims/internal/uce/presence/PresRlmiInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresServiceInfo.aidl b/core/java/com/android/ims/internal/uce/presence/PresServiceInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresServiceInfo.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresServiceInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresServiceInfo.java b/core/java/com/android/ims/internal/uce/presence/PresServiceInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresServiceInfo.java
rename to core/java/com/android/ims/internal/uce/presence/PresServiceInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresSipResponse.aidl b/core/java/com/android/ims/internal/uce/presence/PresSipResponse.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresSipResponse.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresSipResponse.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresSipResponse.java b/core/java/com/android/ims/internal/uce/presence/PresSipResponse.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresSipResponse.java
rename to core/java/com/android/ims/internal/uce/presence/PresSipResponse.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresSubscriptionState.aidl b/core/java/com/android/ims/internal/uce/presence/PresSubscriptionState.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresSubscriptionState.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresSubscriptionState.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresSubscriptionState.java b/core/java/com/android/ims/internal/uce/presence/PresSubscriptionState.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresSubscriptionState.java
rename to core/java/com/android/ims/internal/uce/presence/PresSubscriptionState.java
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresTupleInfo.aidl b/core/java/com/android/ims/internal/uce/presence/PresTupleInfo.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresTupleInfo.aidl
rename to core/java/com/android/ims/internal/uce/presence/PresTupleInfo.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/presence/PresTupleInfo.java b/core/java/com/android/ims/internal/uce/presence/PresTupleInfo.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/presence/PresTupleInfo.java
rename to core/java/com/android/ims/internal/uce/presence/PresTupleInfo.java
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl b/core/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl
rename to core/java/com/android/ims/internal/uce/uceservice/IUceListener.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl b/core/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
rename to core/java/com/android/ims/internal/uce/uceservice/IUceService.aidl
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/ImsUceManager.java b/core/java/com/android/ims/internal/uce/uceservice/ImsUceManager.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/uceservice/ImsUceManager.java
rename to core/java/com/android/ims/internal/uce/uceservice/ImsUceManager.java
diff --git a/telephony/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java b/core/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java
similarity index 100%
rename from telephony/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java
rename to core/java/com/android/ims/internal/uce/uceservice/UceServiceBase.java
diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
index 084a3cc..01f5743 100644
--- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
+++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl
@@ -21,7 +21,6 @@
import android.telephony.CellInfo;
import android.telephony.DataConnectionRealTimeInfo;
import android.telephony.PhoneCapability;
-import android.telephony.PhysicalChannelConfig;
import android.telephony.PreciseCallState;
import android.telephony.PreciseDataConnectionState;
import android.telephony.ServiceState;
@@ -44,7 +43,6 @@
void onDataConnectionStateChanged(int state, int networkType);
void onDataActivity(int direction);
void onSignalStrengthsChanged(in SignalStrength signalStrength);
- void onPhysicalChannelConfigurationChanged(in List<PhysicalChannelConfig> configs);
void onOtaspChanged(in int otaspMode);
void onCellInfoChanged(in List<CellInfo> cellInfo);
void onPreciseCallStateChanged(in PreciseCallState callState);
diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index d7a7af1..f4e6318 100644
--- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -24,7 +24,6 @@
import android.telephony.CellInfo;
import android.telephony.ims.ImsReasonInfo;
import android.telephony.PhoneCapability;
-import android.telephony.PhysicalChannelConfig;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.emergency.EmergencyNumber;
@@ -72,8 +71,6 @@
void notifyOtaspChanged(in int subId, in int otaspMode);
@UnsupportedAppUsage
void notifyCellInfo(in List<CellInfo> cellInfo);
- void notifyPhysicalChannelConfigurationForSubscriber(in int phoneId, in int subId,
- in List<PhysicalChannelConfig> configs);
void notifyPreciseCallState(int phoneId, int subId, int ringingCallState,
int foregroundCallState, int backgroundCallState);
void notifyDisconnectCause(int phoneId, int subId, int disconnectCause,
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index 7cd3e95..4c399f8 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -24,6 +24,7 @@
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Environment;
+import android.os.FileUtils;
import android.os.Process;
import android.os.SystemProperties;
import android.os.storage.StorageManager;
@@ -417,6 +418,19 @@
Environment.getSystemExtDirectory(), "etc", "sysconfig"), ALLOW_ALL);
readPermissions(Environment.buildPath(
Environment.getSystemExtDirectory(), "etc", "permissions"), ALLOW_ALL);
+
+ // Skip loading configuration from apex if it is not a system process.
+ if (!isSystemProcess()) {
+ return;
+ }
+ // Read configuration of libs from apex module.
+ // TODO(146407631): 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);
+ }
}
void readPermissions(File libraryDir, int permissionFlag) {
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index a3f5311..58fd9c0 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -74,6 +74,7 @@
#include <android-base/strings.h>
#include <android-base/unique_fd.h>
#include <bionic/malloc.h>
+#include <bionic/page.h>
#include <cutils/fs.h>
#include <cutils/multiuser.h>
#include <private/android_filesystem_config.h>
@@ -1673,9 +1674,14 @@
static int disable_execute_only(struct dl_phdr_info *info, size_t size, void *data) {
// Search for any execute-only segments and mark them read+execute.
for (int i = 0; i < info->dlpi_phnum; i++) {
- if ((info->dlpi_phdr[i].p_type == PT_LOAD) && (info->dlpi_phdr[i].p_flags == PF_X)) {
- mprotect(reinterpret_cast<void*>(info->dlpi_addr + info->dlpi_phdr[i].p_vaddr),
- info->dlpi_phdr[i].p_memsz, PROT_READ | PROT_EXEC);
+ const auto& phdr = info->dlpi_phdr[i];
+ if ((phdr.p_type == PT_LOAD) && (phdr.p_flags == PF_X)) {
+ auto addr = reinterpret_cast<void*>(info->dlpi_addr + PAGE_START(phdr.p_vaddr));
+ size_t len = PAGE_OFFSET(phdr.p_vaddr) + phdr.p_memsz;
+ if (mprotect(addr, len, PROT_READ | PROT_EXEC) == -1) {
+ ALOGE("mprotect(%p, %zu, PROT_READ | PROT_EXEC) failed: %m", addr, len);
+ return -1;
+ }
}
}
// Return non-zero to exit dl_iterate_phdr.
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index a35c4db..8dc84c8 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2030,6 +2030,11 @@
<!-- =========================================== -->
<eat-comment />
+ <!-- @SystemApi Allows granting runtime permissions to telephony related components.
+ @hide Used internally. -->
+ <permission android:name="android.permission.GRANT_RUNTIME_PERMISSIONS_TO_TELEPHONY_DEFAULTS"
+ android:protectionLevel="signature|telephony" />
+
<!-- Allows modification of the telephony state - power on, mmi, etc.
Does not include placing calls.
<p>Not for use by third-party applications. -->
diff --git a/core/res/res/values-mcc510-mnc08/config.xml b/core/res/res/values-mcc510-mnc08/config.xml
index 7b27554..58fbb9e 100644
--- a/core/res/res/values-mcc510-mnc08/config.xml
+++ b/core/res/res/values-mcc510-mnc08/config.xml
@@ -23,4 +23,6 @@
and "333" is used for other purpose -->
<string-array translatable="false" name="config_callBarringMMI">
</string-array>
+ <string-array translatable="false" name="config_callBarringMMI_for_ims">
+ </string-array>
</resources>
diff --git a/core/res/res/values-mcc510-mnc89/config.xml b/core/res/res/values-mcc510-mnc89/config.xml
index 82efecf..c262247 100644
--- a/core/res/res/values-mcc510-mnc89/config.xml
+++ b/core/res/res/values-mcc510-mnc89/config.xml
@@ -23,4 +23,6 @@
and "333" is used for other purpose -->
<string-array translatable="false" name="config_callBarringMMI">
</string-array>
+ <string-array translatable="false" name="config_callBarringMMI_for_ims">
+ </string-array>
</resources>
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 4c25a7a..4b5840e 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2797,6 +2797,18 @@
<item>353</item>
</string-array>
+ <!-- Ims supported call barring MMI code -->
+ <string-array translatable="false" name="config_callBarringMMI_for_ims">
+ <item>33</item>
+ <item>331</item>
+ <item>332</item>
+ <item>35</item>
+ <item>351</item>
+ <item>330</item>
+ <item>333</item>
+ <item>353</item>
+ </string-array>
+
<!-- Override the default detection behavior for the framework method
android.view.ViewConfiguration#hasPermanentMenuKey().
Valid settings are:
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index a1f66d3..04b86a8 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1312,6 +1312,7 @@
<java-symbol type="array" name="config_cdma_dun_supported_types" />
<java-symbol type="array" name="config_disabledUntilUsedPreinstalledImes" />
<java-symbol type="array" name="config_callBarringMMI" />
+ <java-symbol type="array" name="config_callBarringMMI_for_ims" />
<java-symbol type="array" name="config_globalActionsList" />
<java-symbol type="array" name="config_telephonyEuiccDeviceCapabilities" />
<java-symbol type="array" name="config_telephonyHardware" />
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 375b35c..51fc1e1 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -139,7 +139,7 @@
<permission name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/>
<permission name="android.permission.CHANGE_CONFIGURATION"/>
<permission name="android.permission.CHANGE_DEVICE_IDLE_TEMP_WHITELIST"/>
- <permission name="android.permission.CONNECTIVITY_INTERNAL"/>
+ <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
<permission name="android.permission.CONTROL_INCALL_EXPERIENCE"/>
<permission name="android.permission.DUMP"/>
<permission name="android.permission.INTERACT_ACROSS_USERS"/>
diff --git a/libs/androidfw/LocaleDataTables.cpp b/libs/androidfw/LocaleDataTables.cpp
index c276a23..c462eb7 100644
--- a/libs/androidfw/LocaleDataTables.cpp
+++ b/libs/androidfw/LocaleDataTables.cpp
@@ -10,1439 +10,1466 @@
/* 6 */ {'B', 'a', 's', 's'},
/* 7 */ {'B', 'e', 'n', 'g'},
/* 8 */ {'B', 'r', 'a', 'h'},
- /* 9 */ {'C', 'a', 'n', 's'},
- /* 10 */ {'C', 'a', 'r', 'i'},
- /* 11 */ {'C', 'h', 'a', 'm'},
- /* 12 */ {'C', 'h', 'e', 'r'},
- /* 13 */ {'C', 'o', 'p', 't'},
- /* 14 */ {'C', 'p', 'r', 't'},
- /* 15 */ {'C', 'y', 'r', 'l'},
- /* 16 */ {'D', 'e', 'v', 'a'},
- /* 17 */ {'E', 'g', 'y', 'p'},
- /* 18 */ {'E', 't', 'h', 'i'},
- /* 19 */ {'G', 'e', 'o', 'r'},
- /* 20 */ {'G', 'o', 't', 'h'},
- /* 21 */ {'G', 'r', 'e', 'k'},
- /* 22 */ {'G', 'u', 'j', 'r'},
- /* 23 */ {'G', 'u', 'r', 'u'},
- /* 24 */ {'H', 'a', 'n', 's'},
- /* 25 */ {'H', 'a', 'n', 't'},
- /* 26 */ {'H', 'a', 't', 'r'},
- /* 27 */ {'H', 'e', 'b', 'r'},
- /* 28 */ {'H', 'l', 'u', 'w'},
- /* 29 */ {'H', 'm', 'n', 'g'},
- /* 30 */ {'I', 't', 'a', 'l'},
- /* 31 */ {'J', 'p', 'a', 'n'},
- /* 32 */ {'K', 'a', 'l', 'i'},
- /* 33 */ {'K', 'a', 'n', 'a'},
- /* 34 */ {'K', 'h', 'a', 'r'},
- /* 35 */ {'K', 'h', 'm', 'r'},
- /* 36 */ {'K', 'n', 'd', 'a'},
- /* 37 */ {'K', 'o', 'r', 'e'},
- /* 38 */ {'L', 'a', 'n', 'a'},
- /* 39 */ {'L', 'a', 'o', 'o'},
- /* 40 */ {'L', 'a', 't', 'n'},
- /* 41 */ {'L', 'e', 'p', 'c'},
- /* 42 */ {'L', 'i', 'n', 'a'},
- /* 43 */ {'L', 'i', 's', 'u'},
- /* 44 */ {'L', 'y', 'c', 'i'},
- /* 45 */ {'L', 'y', 'd', 'i'},
- /* 46 */ {'M', 'a', 'n', 'd'},
- /* 47 */ {'M', 'a', 'n', 'i'},
- /* 48 */ {'M', 'e', 'r', 'c'},
- /* 49 */ {'M', 'l', 'y', 'm'},
- /* 50 */ {'M', 'o', 'n', 'g'},
- /* 51 */ {'M', 'r', 'o', 'o'},
- /* 52 */ {'M', 'y', 'm', 'r'},
- /* 53 */ {'N', 'a', 'r', 'b'},
- /* 54 */ {'N', 'k', 'o', 'o'},
- /* 55 */ {'O', 'g', 'a', 'm'},
- /* 56 */ {'O', 'r', 'k', 'h'},
- /* 57 */ {'O', 'r', 'y', 'a'},
- /* 58 */ {'O', 's', 'g', 'e'},
- /* 59 */ {'P', 'a', 'u', 'c'},
- /* 60 */ {'P', 'h', 'l', 'i'},
- /* 61 */ {'P', 'h', 'n', 'x'},
- /* 62 */ {'P', 'l', 'r', 'd'},
- /* 63 */ {'P', 'r', 't', 'i'},
- /* 64 */ {'R', 'u', 'n', 'r'},
- /* 65 */ {'S', 'a', 'm', 'r'},
- /* 66 */ {'S', 'a', 'r', 'b'},
- /* 67 */ {'S', 'a', 'u', 'r'},
- /* 68 */ {'S', 'g', 'n', 'w'},
- /* 69 */ {'S', 'i', 'n', 'h'},
- /* 70 */ {'S', 'o', 'r', 'a'},
- /* 71 */ {'S', 'y', 'r', 'c'},
- /* 72 */ {'T', 'a', 'l', 'e'},
- /* 73 */ {'T', 'a', 'l', 'u'},
- /* 74 */ {'T', 'a', 'm', 'l'},
- /* 75 */ {'T', 'a', 'n', 'g'},
- /* 76 */ {'T', 'a', 'v', 't'},
- /* 77 */ {'T', 'e', 'l', 'u'},
- /* 78 */ {'T', 'f', 'n', 'g'},
- /* 79 */ {'T', 'h', 'a', 'a'},
- /* 80 */ {'T', 'h', 'a', 'i'},
- /* 81 */ {'T', 'i', 'b', 't'},
- /* 82 */ {'U', 'g', 'a', 'r'},
- /* 83 */ {'V', 'a', 'i', 'i'},
- /* 84 */ {'X', 'p', 'e', 'o'},
- /* 85 */ {'X', 's', 'u', 'x'},
- /* 86 */ {'Y', 'i', 'i', 'i'},
- /* 87 */ {'~', '~', '~', 'A'},
- /* 88 */ {'~', '~', '~', 'B'},
+ /* 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', 'o', 'p', 't'},
+ /* 15 */ {'C', 'p', 'r', 't'},
+ /* 16 */ {'C', 'y', 'r', 'l'},
+ /* 17 */ {'D', 'e', 'v', 'a'},
+ /* 18 */ {'E', 'g', 'y', 'p'},
+ /* 19 */ {'E', 't', 'h', 'i'},
+ /* 20 */ {'G', 'e', 'o', 'r'},
+ /* 21 */ {'G', 'o', 'n', 'g'},
+ /* 22 */ {'G', 'o', 'n', 'm'},
+ /* 23 */ {'G', 'o', 't', 'h'},
+ /* 24 */ {'G', 'r', 'e', 'k'},
+ /* 25 */ {'G', 'u', 'j', 'r'},
+ /* 26 */ {'G', 'u', 'r', 'u'},
+ /* 27 */ {'H', 'a', 'n', 's'},
+ /* 28 */ {'H', 'a', 'n', 't'},
+ /* 29 */ {'H', 'a', 't', 'r'},
+ /* 30 */ {'H', 'e', 'b', 'r'},
+ /* 31 */ {'H', 'l', 'u', 'w'},
+ /* 32 */ {'H', 'm', 'n', 'g'},
+ /* 33 */ {'H', 'm', 'n', 'p'},
+ /* 34 */ {'I', 't', 'a', 'l'},
+ /* 35 */ {'J', 'p', 'a', 'n'},
+ /* 36 */ {'K', 'a', 'l', 'i'},
+ /* 37 */ {'K', 'a', 'n', 'a'},
+ /* 38 */ {'K', 'h', 'a', 'r'},
+ /* 39 */ {'K', 'h', 'm', 'r'},
+ /* 40 */ {'K', 'n', 'd', 'a'},
+ /* 41 */ {'K', 'o', 'r', 'e'},
+ /* 42 */ {'L', 'a', 'n', 'a'},
+ /* 43 */ {'L', 'a', 'o', 'o'},
+ /* 44 */ {'L', 'a', 't', 'n'},
+ /* 45 */ {'L', 'e', 'p', 'c'},
+ /* 46 */ {'L', 'i', 'n', 'a'},
+ /* 47 */ {'L', 'i', 's', 'u'},
+ /* 48 */ {'L', 'y', 'c', 'i'},
+ /* 49 */ {'L', 'y', 'd', 'i'},
+ /* 50 */ {'M', 'a', 'n', 'd'},
+ /* 51 */ {'M', 'a', 'n', 'i'},
+ /* 52 */ {'M', 'e', 'r', 'c'},
+ /* 53 */ {'M', 'l', 'y', 'm'},
+ /* 54 */ {'M', 'o', 'n', 'g'},
+ /* 55 */ {'M', 'r', 'o', 'o'},
+ /* 56 */ {'M', 'y', 'm', 'r'},
+ /* 57 */ {'N', 'a', 'r', 'b'},
+ /* 58 */ {'N', 'k', 'o', 'o'},
+ /* 59 */ {'N', 's', 'h', 'u'},
+ /* 60 */ {'O', 'g', 'a', 'm'},
+ /* 61 */ {'O', 'r', 'k', 'h'},
+ /* 62 */ {'O', 'r', 'y', 'a'},
+ /* 63 */ {'O', 's', 'g', 'e'},
+ /* 64 */ {'P', 'a', 'u', 'c'},
+ /* 65 */ {'P', 'h', 'l', 'i'},
+ /* 66 */ {'P', 'h', 'n', 'x'},
+ /* 67 */ {'P', 'l', 'r', 'd'},
+ /* 68 */ {'P', 'r', 't', 'i'},
+ /* 69 */ {'R', 'u', 'n', 'r'},
+ /* 70 */ {'S', 'a', 'm', 'r'},
+ /* 71 */ {'S', 'a', 'r', 'b'},
+ /* 72 */ {'S', 'a', 'u', 'r'},
+ /* 73 */ {'S', 'g', 'n', 'w'},
+ /* 74 */ {'S', 'i', 'n', 'h'},
+ /* 75 */ {'S', 'o', 'g', 'd'},
+ /* 76 */ {'S', 'o', 'r', 'a'},
+ /* 77 */ {'S', 'o', 'y', 'o'},
+ /* 78 */ {'S', 'y', 'r', 'c'},
+ /* 79 */ {'T', 'a', 'l', 'e'},
+ /* 80 */ {'T', 'a', 'l', 'u'},
+ /* 81 */ {'T', 'a', 'm', 'l'},
+ /* 82 */ {'T', 'a', 'n', 'g'},
+ /* 83 */ {'T', 'a', 'v', 't'},
+ /* 84 */ {'T', 'e', 'l', 'u'},
+ /* 85 */ {'T', 'f', 'n', 'g'},
+ /* 86 */ {'T', 'h', 'a', 'a'},
+ /* 87 */ {'T', 'h', 'a', 'i'},
+ /* 88 */ {'T', 'i', 'b', 't'},
+ /* 89 */ {'U', 'g', 'a', 'r'},
+ /* 90 */ {'V', 'a', 'i', 'i'},
+ /* 91 */ {'W', 'c', 'h', 'o'},
+ /* 92 */ {'X', 'p', 'e', 'o'},
+ /* 93 */ {'X', 's', 'u', 'x'},
+ /* 94 */ {'Y', 'i', 'i', 'i'},
+ /* 95 */ {'~', '~', '~', 'A'},
+ /* 96 */ {'~', '~', '~', 'B'},
};
const std::unordered_map<uint32_t, uint8_t> LIKELY_SCRIPTS({
- {0x61610000u, 40u}, // aa -> Latn
- {0xA0000000u, 40u}, // aai -> Latn
- {0xA8000000u, 40u}, // aak -> Latn
- {0xD0000000u, 40u}, // aau -> Latn
- {0x61620000u, 15u}, // ab -> Cyrl
- {0xA0200000u, 40u}, // abi -> Latn
- {0xC4200000u, 40u}, // abr -> Latn
- {0xCC200000u, 40u}, // abt -> Latn
- {0xE0200000u, 40u}, // aby -> Latn
- {0x8C400000u, 40u}, // acd -> Latn
- {0x90400000u, 40u}, // ace -> Latn
- {0x9C400000u, 40u}, // ach -> Latn
- {0x80600000u, 40u}, // ada -> Latn
- {0x90600000u, 40u}, // ade -> Latn
- {0xA4600000u, 40u}, // adj -> Latn
- {0xE0600000u, 15u}, // ady -> Cyrl
- {0xE4600000u, 40u}, // adz -> Latn
+ {0x61610000u, 44u}, // aa -> Latn
+ {0xA0000000u, 44u}, // aai -> Latn
+ {0xA8000000u, 44u}, // aak -> Latn
+ {0xD0000000u, 44u}, // aau -> Latn
+ {0x61620000u, 16u}, // ab -> Cyrl
+ {0xA0200000u, 44u}, // abi -> Latn
+ {0xC0200000u, 16u}, // abq -> Cyrl
+ {0xC4200000u, 44u}, // abr -> Latn
+ {0xCC200000u, 44u}, // abt -> Latn
+ {0xE0200000u, 44u}, // aby -> Latn
+ {0x8C400000u, 44u}, // acd -> Latn
+ {0x90400000u, 44u}, // ace -> Latn
+ {0x9C400000u, 44u}, // ach -> Latn
+ {0x80600000u, 44u}, // ada -> Latn
+ {0x90600000u, 44u}, // ade -> Latn
+ {0xA4600000u, 44u}, // adj -> Latn
+ {0xE0600000u, 16u}, // ady -> Cyrl
+ {0xE4600000u, 44u}, // adz -> Latn
{0x61650000u, 4u}, // ae -> Avst
{0x84800000u, 1u}, // aeb -> Arab
- {0xE0800000u, 40u}, // aey -> Latn
- {0x61660000u, 40u}, // af -> Latn
- {0x88C00000u, 40u}, // agc -> Latn
- {0x8CC00000u, 40u}, // agd -> Latn
- {0x98C00000u, 40u}, // agg -> Latn
- {0xB0C00000u, 40u}, // agm -> Latn
- {0xB8C00000u, 40u}, // ago -> Latn
- {0xC0C00000u, 40u}, // agq -> Latn
- {0x80E00000u, 40u}, // aha -> Latn
- {0xACE00000u, 40u}, // ahl -> Latn
+ {0xE0800000u, 44u}, // aey -> Latn
+ {0x61660000u, 44u}, // af -> Latn
+ {0x88C00000u, 44u}, // agc -> Latn
+ {0x8CC00000u, 44u}, // agd -> Latn
+ {0x98C00000u, 44u}, // agg -> Latn
+ {0xB0C00000u, 44u}, // agm -> Latn
+ {0xB8C00000u, 44u}, // ago -> Latn
+ {0xC0C00000u, 44u}, // agq -> Latn
+ {0x80E00000u, 44u}, // aha -> Latn
+ {0xACE00000u, 44u}, // ahl -> Latn
{0xB8E00000u, 0u}, // aho -> Ahom
- {0x99200000u, 40u}, // ajg -> Latn
- {0x616B0000u, 40u}, // ak -> Latn
- {0xA9400000u, 85u}, // akk -> Xsux
- {0x81600000u, 40u}, // ala -> Latn
- {0xA1600000u, 40u}, // ali -> Latn
- {0xB5600000u, 40u}, // aln -> Latn
- {0xCD600000u, 15u}, // alt -> Cyrl
- {0x616D0000u, 18u}, // am -> Ethi
- {0xB1800000u, 40u}, // amm -> Latn
- {0xB5800000u, 40u}, // amn -> Latn
- {0xB9800000u, 40u}, // amo -> Latn
- {0xBD800000u, 40u}, // amp -> Latn
- {0x89A00000u, 40u}, // anc -> Latn
- {0xA9A00000u, 40u}, // ank -> Latn
- {0xB5A00000u, 40u}, // ann -> Latn
- {0xE1A00000u, 40u}, // any -> Latn
- {0xA5C00000u, 40u}, // aoj -> Latn
- {0xB1C00000u, 40u}, // aom -> Latn
- {0xE5C00000u, 40u}, // aoz -> Latn
+ {0x99200000u, 44u}, // ajg -> Latn
+ {0x616B0000u, 44u}, // ak -> Latn
+ {0xA9400000u, 93u}, // akk -> Xsux
+ {0x81600000u, 44u}, // ala -> Latn
+ {0xA1600000u, 44u}, // ali -> Latn
+ {0xB5600000u, 44u}, // aln -> Latn
+ {0xCD600000u, 16u}, // alt -> Cyrl
+ {0x616D0000u, 19u}, // am -> Ethi
+ {0xB1800000u, 44u}, // amm -> Latn
+ {0xB5800000u, 44u}, // amn -> Latn
+ {0xB9800000u, 44u}, // amo -> Latn
+ {0xBD800000u, 44u}, // amp -> Latn
+ {0x89A00000u, 44u}, // anc -> Latn
+ {0xA9A00000u, 44u}, // ank -> Latn
+ {0xB5A00000u, 44u}, // ann -> Latn
+ {0xE1A00000u, 44u}, // any -> Latn
+ {0xA5C00000u, 44u}, // aoj -> Latn
+ {0xB1C00000u, 44u}, // aom -> Latn
+ {0xE5C00000u, 44u}, // aoz -> Latn
{0x89E00000u, 1u}, // apc -> Arab
{0x8DE00000u, 1u}, // apd -> Arab
- {0x91E00000u, 40u}, // ape -> Latn
- {0xC5E00000u, 40u}, // apr -> Latn
- {0xC9E00000u, 40u}, // aps -> Latn
- {0xE5E00000u, 40u}, // apz -> Latn
+ {0x91E00000u, 44u}, // ape -> Latn
+ {0xC5E00000u, 44u}, // apr -> Latn
+ {0xC9E00000u, 44u}, // aps -> Latn
+ {0xE5E00000u, 44u}, // apz -> Latn
{0x61720000u, 1u}, // ar -> Arab
- {0x61725842u, 88u}, // ar-XB -> ~~~B
+ {0x61725842u, 96u}, // ar-XB -> ~~~B
{0x8A200000u, 2u}, // arc -> Armi
- {0x9E200000u, 40u}, // arh -> Latn
- {0xB6200000u, 40u}, // arn -> Latn
- {0xBA200000u, 40u}, // aro -> Latn
+ {0x9E200000u, 44u}, // arh -> Latn
+ {0xB6200000u, 44u}, // arn -> Latn
+ {0xBA200000u, 44u}, // aro -> Latn
{0xC2200000u, 1u}, // arq -> Arab
{0xE2200000u, 1u}, // ary -> Arab
{0xE6200000u, 1u}, // arz -> Arab
{0x61730000u, 7u}, // as -> Beng
- {0x82400000u, 40u}, // asa -> Latn
- {0x92400000u, 68u}, // ase -> Sgnw
- {0x9A400000u, 40u}, // asg -> Latn
- {0xBA400000u, 40u}, // aso -> Latn
- {0xCE400000u, 40u}, // ast -> Latn
- {0x82600000u, 40u}, // ata -> Latn
- {0x9A600000u, 40u}, // atg -> Latn
- {0xA6600000u, 40u}, // atj -> Latn
- {0xE2800000u, 40u}, // auy -> Latn
- {0x61760000u, 15u}, // av -> Cyrl
+ {0x82400000u, 44u}, // asa -> Latn
+ {0x92400000u, 73u}, // ase -> Sgnw
+ {0x9A400000u, 44u}, // asg -> Latn
+ {0xBA400000u, 44u}, // aso -> Latn
+ {0xCE400000u, 44u}, // ast -> Latn
+ {0x82600000u, 44u}, // ata -> Latn
+ {0x9A600000u, 44u}, // atg -> Latn
+ {0xA6600000u, 44u}, // atj -> Latn
+ {0xE2800000u, 44u}, // auy -> Latn
+ {0x61760000u, 16u}, // av -> Cyrl
{0xAEA00000u, 1u}, // avl -> Arab
- {0xB6A00000u, 40u}, // avn -> Latn
- {0xCEA00000u, 40u}, // avt -> Latn
- {0xD2A00000u, 40u}, // avu -> Latn
- {0x82C00000u, 16u}, // awa -> Deva
- {0x86C00000u, 40u}, // awb -> Latn
- {0xBAC00000u, 40u}, // awo -> Latn
- {0xDEC00000u, 40u}, // awx -> Latn
- {0x61790000u, 40u}, // ay -> Latn
- {0x87000000u, 40u}, // ayb -> Latn
- {0x617A0000u, 40u}, // az -> Latn
+ {0xB6A00000u, 44u}, // avn -> Latn
+ {0xCEA00000u, 44u}, // avt -> Latn
+ {0xD2A00000u, 44u}, // avu -> Latn
+ {0x82C00000u, 17u}, // awa -> Deva
+ {0x86C00000u, 44u}, // awb -> Latn
+ {0xBAC00000u, 44u}, // awo -> Latn
+ {0xDEC00000u, 44u}, // awx -> Latn
+ {0x61790000u, 44u}, // ay -> Latn
+ {0x87000000u, 44u}, // ayb -> Latn
+ {0x617A0000u, 44u}, // az -> Latn
{0x617A4951u, 1u}, // az-IQ -> Arab
{0x617A4952u, 1u}, // az-IR -> Arab
- {0x617A5255u, 15u}, // az-RU -> Cyrl
- {0x62610000u, 15u}, // ba -> Cyrl
+ {0x617A5255u, 16u}, // az-RU -> Cyrl
+ {0x62610000u, 16u}, // ba -> Cyrl
{0xAC010000u, 1u}, // bal -> Arab
- {0xB4010000u, 40u}, // ban -> Latn
- {0xBC010000u, 16u}, // bap -> Deva
- {0xC4010000u, 40u}, // bar -> Latn
- {0xC8010000u, 40u}, // bas -> Latn
- {0xD4010000u, 40u}, // bav -> Latn
+ {0xB4010000u, 44u}, // ban -> Latn
+ {0xBC010000u, 17u}, // bap -> Deva
+ {0xC4010000u, 44u}, // bar -> Latn
+ {0xC8010000u, 44u}, // bas -> Latn
+ {0xD4010000u, 44u}, // bav -> Latn
{0xDC010000u, 5u}, // bax -> Bamu
- {0x80210000u, 40u}, // bba -> Latn
- {0x84210000u, 40u}, // bbb -> Latn
- {0x88210000u, 40u}, // bbc -> Latn
- {0x8C210000u, 40u}, // bbd -> Latn
- {0xA4210000u, 40u}, // bbj -> Latn
- {0xBC210000u, 40u}, // bbp -> Latn
- {0xC4210000u, 40u}, // bbr -> Latn
- {0x94410000u, 40u}, // bcf -> Latn
- {0x9C410000u, 40u}, // bch -> Latn
- {0xA0410000u, 40u}, // bci -> Latn
- {0xB0410000u, 40u}, // bcm -> Latn
- {0xB4410000u, 40u}, // bcn -> Latn
- {0xB8410000u, 40u}, // bco -> Latn
- {0xC0410000u, 18u}, // bcq -> Ethi
- {0xD0410000u, 40u}, // bcu -> Latn
- {0x8C610000u, 40u}, // bdd -> Latn
- {0x62650000u, 15u}, // be -> Cyrl
- {0x94810000u, 40u}, // bef -> Latn
- {0x9C810000u, 40u}, // beh -> Latn
+ {0x80210000u, 44u}, // bba -> Latn
+ {0x84210000u, 44u}, // bbb -> Latn
+ {0x88210000u, 44u}, // bbc -> Latn
+ {0x8C210000u, 44u}, // bbd -> Latn
+ {0xA4210000u, 44u}, // bbj -> Latn
+ {0xBC210000u, 44u}, // bbp -> Latn
+ {0xC4210000u, 44u}, // bbr -> Latn
+ {0x94410000u, 44u}, // bcf -> Latn
+ {0x9C410000u, 44u}, // bch -> Latn
+ {0xA0410000u, 44u}, // bci -> Latn
+ {0xB0410000u, 44u}, // bcm -> Latn
+ {0xB4410000u, 44u}, // bcn -> Latn
+ {0xB8410000u, 44u}, // bco -> Latn
+ {0xC0410000u, 19u}, // bcq -> Ethi
+ {0xD0410000u, 44u}, // bcu -> Latn
+ {0x8C610000u, 44u}, // bdd -> Latn
+ {0x62650000u, 16u}, // be -> Cyrl
+ {0x94810000u, 44u}, // bef -> Latn
+ {0x9C810000u, 44u}, // beh -> Latn
{0xA4810000u, 1u}, // bej -> Arab
- {0xB0810000u, 40u}, // bem -> Latn
- {0xCC810000u, 40u}, // bet -> Latn
- {0xD8810000u, 40u}, // bew -> Latn
- {0xDC810000u, 40u}, // bex -> Latn
- {0xE4810000u, 40u}, // bez -> Latn
- {0x8CA10000u, 40u}, // bfd -> Latn
- {0xC0A10000u, 74u}, // bfq -> Taml
+ {0xB0810000u, 44u}, // bem -> Latn
+ {0xCC810000u, 44u}, // bet -> Latn
+ {0xD8810000u, 44u}, // bew -> Latn
+ {0xDC810000u, 44u}, // bex -> Latn
+ {0xE4810000u, 44u}, // bez -> Latn
+ {0x8CA10000u, 44u}, // bfd -> Latn
+ {0xC0A10000u, 81u}, // bfq -> Taml
{0xCCA10000u, 1u}, // bft -> Arab
- {0xE0A10000u, 16u}, // bfy -> Deva
- {0x62670000u, 15u}, // bg -> Cyrl
- {0x88C10000u, 16u}, // bgc -> Deva
+ {0xE0A10000u, 17u}, // bfy -> Deva
+ {0x62670000u, 16u}, // bg -> Cyrl
+ {0x88C10000u, 17u}, // bgc -> Deva
{0xB4C10000u, 1u}, // bgn -> Arab
- {0xDCC10000u, 21u}, // bgx -> Grek
- {0x84E10000u, 16u}, // bhb -> Deva
- {0x98E10000u, 40u}, // bhg -> Latn
- {0xA0E10000u, 16u}, // bhi -> Deva
- {0xA8E10000u, 40u}, // bhk -> Latn
- {0xACE10000u, 40u}, // bhl -> Latn
- {0xB8E10000u, 16u}, // bho -> Deva
- {0xE0E10000u, 40u}, // bhy -> Latn
- {0x62690000u, 40u}, // bi -> Latn
- {0x85010000u, 40u}, // bib -> Latn
- {0x99010000u, 40u}, // big -> Latn
- {0xA9010000u, 40u}, // bik -> Latn
- {0xB1010000u, 40u}, // bim -> Latn
- {0xB5010000u, 40u}, // bin -> Latn
- {0xB9010000u, 40u}, // bio -> Latn
- {0xC1010000u, 40u}, // biq -> Latn
- {0x9D210000u, 40u}, // bjh -> Latn
- {0xA1210000u, 18u}, // bji -> Ethi
- {0xA5210000u, 16u}, // bjj -> Deva
- {0xB5210000u, 40u}, // bjn -> Latn
- {0xB9210000u, 40u}, // bjo -> Latn
- {0xC5210000u, 40u}, // bjr -> Latn
- {0xE5210000u, 40u}, // bjz -> Latn
- {0x89410000u, 40u}, // bkc -> Latn
- {0xB1410000u, 40u}, // bkm -> Latn
- {0xC1410000u, 40u}, // bkq -> Latn
- {0xD1410000u, 40u}, // bku -> Latn
- {0xD5410000u, 40u}, // bkv -> Latn
- {0xCD610000u, 76u}, // blt -> Tavt
- {0x626D0000u, 40u}, // bm -> Latn
- {0x9D810000u, 40u}, // bmh -> Latn
- {0xA9810000u, 40u}, // bmk -> Latn
- {0xC1810000u, 40u}, // bmq -> Latn
- {0xD1810000u, 40u}, // bmu -> Latn
+ {0xDCC10000u, 24u}, // bgx -> Grek
+ {0x84E10000u, 17u}, // bhb -> Deva
+ {0x98E10000u, 44u}, // bhg -> Latn
+ {0xA0E10000u, 17u}, // bhi -> Deva
+ {0xA8E10000u, 44u}, // bhk -> Latn
+ {0xACE10000u, 44u}, // bhl -> Latn
+ {0xB8E10000u, 17u}, // bho -> Deva
+ {0xE0E10000u, 44u}, // bhy -> Latn
+ {0x62690000u, 44u}, // bi -> Latn
+ {0x85010000u, 44u}, // bib -> Latn
+ {0x99010000u, 44u}, // big -> Latn
+ {0xA9010000u, 44u}, // bik -> Latn
+ {0xB1010000u, 44u}, // bim -> Latn
+ {0xB5010000u, 44u}, // bin -> Latn
+ {0xB9010000u, 44u}, // bio -> Latn
+ {0xC1010000u, 44u}, // biq -> Latn
+ {0x9D210000u, 44u}, // bjh -> Latn
+ {0xA1210000u, 19u}, // bji -> Ethi
+ {0xA5210000u, 17u}, // bjj -> Deva
+ {0xB5210000u, 44u}, // bjn -> Latn
+ {0xB9210000u, 44u}, // bjo -> Latn
+ {0xC5210000u, 44u}, // bjr -> Latn
+ {0xCD210000u, 44u}, // bjt -> Latn
+ {0xE5210000u, 44u}, // bjz -> Latn
+ {0x89410000u, 44u}, // bkc -> Latn
+ {0xB1410000u, 44u}, // bkm -> Latn
+ {0xC1410000u, 44u}, // bkq -> Latn
+ {0xD1410000u, 44u}, // bku -> Latn
+ {0xD5410000u, 44u}, // bkv -> Latn
+ {0xCD610000u, 83u}, // blt -> Tavt
+ {0x626D0000u, 44u}, // bm -> Latn
+ {0x9D810000u, 44u}, // bmh -> Latn
+ {0xA9810000u, 44u}, // bmk -> Latn
+ {0xC1810000u, 44u}, // bmq -> Latn
+ {0xD1810000u, 44u}, // bmu -> Latn
{0x626E0000u, 7u}, // bn -> Beng
- {0x99A10000u, 40u}, // bng -> Latn
- {0xB1A10000u, 40u}, // bnm -> Latn
- {0xBDA10000u, 40u}, // bnp -> Latn
- {0x626F0000u, 81u}, // bo -> Tibt
- {0xA5C10000u, 40u}, // boj -> Latn
- {0xB1C10000u, 40u}, // bom -> Latn
- {0xB5C10000u, 40u}, // bon -> Latn
+ {0x99A10000u, 44u}, // bng -> Latn
+ {0xB1A10000u, 44u}, // bnm -> Latn
+ {0xBDA10000u, 44u}, // bnp -> Latn
+ {0x626F0000u, 88u}, // bo -> Tibt
+ {0xA5C10000u, 44u}, // boj -> Latn
+ {0xB1C10000u, 44u}, // bom -> Latn
+ {0xB5C10000u, 44u}, // bon -> Latn
{0xE1E10000u, 7u}, // bpy -> Beng
- {0x8A010000u, 40u}, // bqc -> Latn
+ {0x8A010000u, 44u}, // bqc -> Latn
{0xA2010000u, 1u}, // bqi -> Arab
- {0xBE010000u, 40u}, // bqp -> Latn
- {0xD6010000u, 40u}, // bqv -> Latn
- {0x62720000u, 40u}, // br -> Latn
- {0x82210000u, 16u}, // bra -> Deva
+ {0xBE010000u, 44u}, // bqp -> Latn
+ {0xD6010000u, 44u}, // bqv -> Latn
+ {0x62720000u, 44u}, // br -> Latn
+ {0x82210000u, 17u}, // bra -> Deva
{0x9E210000u, 1u}, // brh -> Arab
- {0xDE210000u, 16u}, // brx -> Deva
- {0xE6210000u, 40u}, // brz -> Latn
- {0x62730000u, 40u}, // bs -> Latn
- {0xA6410000u, 40u}, // bsj -> Latn
+ {0xDE210000u, 17u}, // brx -> Deva
+ {0xE6210000u, 44u}, // brz -> Latn
+ {0x62730000u, 44u}, // bs -> Latn
+ {0xA6410000u, 44u}, // bsj -> Latn
{0xC2410000u, 6u}, // bsq -> Bass
- {0xCA410000u, 40u}, // bss -> Latn
- {0xCE410000u, 18u}, // bst -> Ethi
- {0xBA610000u, 40u}, // bto -> Latn
- {0xCE610000u, 40u}, // btt -> Latn
- {0xD6610000u, 16u}, // btv -> Deva
- {0x82810000u, 15u}, // bua -> Cyrl
- {0x8A810000u, 40u}, // buc -> Latn
- {0x8E810000u, 40u}, // bud -> Latn
- {0x9A810000u, 40u}, // bug -> Latn
- {0xAA810000u, 40u}, // buk -> Latn
- {0xB2810000u, 40u}, // bum -> Latn
- {0xBA810000u, 40u}, // buo -> Latn
- {0xCA810000u, 40u}, // bus -> Latn
- {0xD2810000u, 40u}, // buu -> Latn
- {0x86A10000u, 40u}, // bvb -> Latn
- {0x8EC10000u, 40u}, // bwd -> Latn
- {0xC6C10000u, 40u}, // bwr -> Latn
- {0x9EE10000u, 40u}, // bxh -> Latn
- {0x93010000u, 40u}, // bye -> Latn
- {0xB7010000u, 18u}, // byn -> Ethi
- {0xC7010000u, 40u}, // byr -> Latn
- {0xCB010000u, 40u}, // bys -> Latn
- {0xD7010000u, 40u}, // byv -> Latn
- {0xDF010000u, 40u}, // byx -> Latn
- {0x83210000u, 40u}, // bza -> Latn
- {0x93210000u, 40u}, // bze -> Latn
- {0x97210000u, 40u}, // bzf -> Latn
- {0x9F210000u, 40u}, // bzh -> Latn
- {0xDB210000u, 40u}, // bzw -> Latn
- {0x63610000u, 40u}, // ca -> Latn
- {0xB4020000u, 40u}, // can -> Latn
- {0xA4220000u, 40u}, // cbj -> Latn
- {0x9C420000u, 40u}, // cch -> Latn
- {0xBC420000u, 7u}, // ccp -> Beng
- {0x63650000u, 15u}, // ce -> Cyrl
- {0x84820000u, 40u}, // ceb -> Latn
- {0x80A20000u, 40u}, // cfa -> Latn
- {0x98C20000u, 40u}, // cgg -> Latn
- {0x63680000u, 40u}, // ch -> Latn
- {0xA8E20000u, 40u}, // chk -> Latn
- {0xB0E20000u, 15u}, // chm -> Cyrl
- {0xB8E20000u, 40u}, // cho -> Latn
- {0xBCE20000u, 40u}, // chp -> Latn
- {0xC4E20000u, 12u}, // chr -> Cher
+ {0xCA410000u, 44u}, // bss -> Latn
+ {0xCE410000u, 19u}, // bst -> Ethi
+ {0xBA610000u, 44u}, // bto -> Latn
+ {0xCE610000u, 44u}, // btt -> Latn
+ {0xD6610000u, 17u}, // btv -> Deva
+ {0x82810000u, 16u}, // bua -> Cyrl
+ {0x8A810000u, 44u}, // buc -> Latn
+ {0x8E810000u, 44u}, // bud -> Latn
+ {0x9A810000u, 44u}, // bug -> Latn
+ {0xAA810000u, 44u}, // buk -> Latn
+ {0xB2810000u, 44u}, // bum -> Latn
+ {0xBA810000u, 44u}, // buo -> Latn
+ {0xCA810000u, 44u}, // bus -> Latn
+ {0xD2810000u, 44u}, // buu -> Latn
+ {0x86A10000u, 44u}, // bvb -> Latn
+ {0x8EC10000u, 44u}, // bwd -> Latn
+ {0xC6C10000u, 44u}, // bwr -> Latn
+ {0x9EE10000u, 44u}, // bxh -> Latn
+ {0x93010000u, 44u}, // bye -> Latn
+ {0xB7010000u, 19u}, // byn -> Ethi
+ {0xC7010000u, 44u}, // byr -> Latn
+ {0xCB010000u, 44u}, // bys -> Latn
+ {0xD7010000u, 44u}, // byv -> Latn
+ {0xDF010000u, 44u}, // byx -> Latn
+ {0x83210000u, 44u}, // bza -> Latn
+ {0x93210000u, 44u}, // bze -> Latn
+ {0x97210000u, 44u}, // bzf -> Latn
+ {0x9F210000u, 44u}, // bzh -> Latn
+ {0xDB210000u, 44u}, // bzw -> Latn
+ {0x63610000u, 44u}, // ca -> Latn
+ {0xB4020000u, 44u}, // can -> Latn
+ {0xA4220000u, 44u}, // cbj -> Latn
+ {0x9C420000u, 44u}, // cch -> Latn
+ {0xBC420000u, 9u}, // ccp -> Cakm
+ {0x63650000u, 16u}, // ce -> Cyrl
+ {0x84820000u, 44u}, // ceb -> Latn
+ {0x80A20000u, 44u}, // cfa -> Latn
+ {0x98C20000u, 44u}, // cgg -> Latn
+ {0x63680000u, 44u}, // ch -> Latn
+ {0xA8E20000u, 44u}, // chk -> Latn
+ {0xB0E20000u, 16u}, // chm -> Cyrl
+ {0xB8E20000u, 44u}, // cho -> Latn
+ {0xBCE20000u, 44u}, // chp -> Latn
+ {0xC4E20000u, 13u}, // chr -> Cher
{0x81220000u, 1u}, // cja -> Arab
- {0xB1220000u, 11u}, // cjm -> Cham
- {0xD5220000u, 40u}, // cjv -> Latn
+ {0xB1220000u, 12u}, // cjm -> Cham
+ {0xD5220000u, 44u}, // cjv -> Latn
{0x85420000u, 1u}, // ckb -> Arab
- {0xAD420000u, 40u}, // ckl -> Latn
- {0xB9420000u, 40u}, // cko -> Latn
- {0xE1420000u, 40u}, // cky -> Latn
- {0x81620000u, 40u}, // cla -> Latn
- {0x91820000u, 40u}, // cme -> Latn
- {0x636F0000u, 40u}, // co -> Latn
- {0xBDC20000u, 13u}, // cop -> Copt
- {0xC9E20000u, 40u}, // cps -> Latn
- {0x63720000u, 9u}, // cr -> Cans
- {0xA6220000u, 9u}, // crj -> Cans
- {0xAA220000u, 9u}, // crk -> Cans
- {0xAE220000u, 9u}, // crl -> Cans
- {0xB2220000u, 9u}, // crm -> Cans
- {0xCA220000u, 40u}, // crs -> Latn
- {0x63730000u, 40u}, // cs -> Latn
- {0x86420000u, 40u}, // csb -> Latn
- {0xDA420000u, 9u}, // csw -> Cans
- {0x8E620000u, 59u}, // ctd -> Pauc
- {0x63750000u, 15u}, // cu -> Cyrl
- {0x63760000u, 15u}, // cv -> Cyrl
- {0x63790000u, 40u}, // cy -> Latn
- {0x64610000u, 40u}, // da -> Latn
- {0x8C030000u, 40u}, // dad -> Latn
- {0x94030000u, 40u}, // daf -> Latn
- {0x98030000u, 40u}, // dag -> Latn
- {0x9C030000u, 40u}, // dah -> Latn
- {0xA8030000u, 40u}, // dak -> Latn
- {0xC4030000u, 15u}, // dar -> Cyrl
- {0xD4030000u, 40u}, // dav -> Latn
- {0x8C230000u, 40u}, // dbd -> Latn
- {0xC0230000u, 40u}, // dbq -> Latn
+ {0xAD420000u, 44u}, // ckl -> Latn
+ {0xB9420000u, 44u}, // cko -> Latn
+ {0xE1420000u, 44u}, // cky -> Latn
+ {0x81620000u, 44u}, // cla -> Latn
+ {0x91820000u, 44u}, // cme -> Latn
+ {0x99820000u, 77u}, // cmg -> Soyo
+ {0x636F0000u, 44u}, // co -> Latn
+ {0xBDC20000u, 14u}, // cop -> Copt
+ {0xC9E20000u, 44u}, // cps -> Latn
+ {0x63720000u, 10u}, // cr -> Cans
+ {0x9E220000u, 16u}, // crh -> Cyrl
+ {0xA6220000u, 10u}, // crj -> Cans
+ {0xAA220000u, 10u}, // crk -> Cans
+ {0xAE220000u, 10u}, // crl -> Cans
+ {0xB2220000u, 10u}, // crm -> Cans
+ {0xCA220000u, 44u}, // crs -> Latn
+ {0x63730000u, 44u}, // cs -> Latn
+ {0x86420000u, 44u}, // csb -> Latn
+ {0xDA420000u, 10u}, // csw -> Cans
+ {0x8E620000u, 64u}, // ctd -> Pauc
+ {0x63750000u, 16u}, // cu -> Cyrl
+ {0x63760000u, 16u}, // cv -> Cyrl
+ {0x63790000u, 44u}, // cy -> Latn
+ {0x64610000u, 44u}, // da -> Latn
+ {0x8C030000u, 44u}, // dad -> Latn
+ {0x94030000u, 44u}, // daf -> Latn
+ {0x98030000u, 44u}, // dag -> Latn
+ {0x9C030000u, 44u}, // dah -> Latn
+ {0xA8030000u, 44u}, // dak -> Latn
+ {0xC4030000u, 16u}, // dar -> Cyrl
+ {0xD4030000u, 44u}, // dav -> Latn
+ {0x8C230000u, 44u}, // dbd -> Latn
+ {0xC0230000u, 44u}, // dbq -> Latn
{0x88430000u, 1u}, // dcc -> Arab
- {0xB4630000u, 40u}, // ddn -> Latn
- {0x64650000u, 40u}, // de -> Latn
- {0x8C830000u, 40u}, // ded -> Latn
- {0xB4830000u, 40u}, // den -> Latn
- {0x80C30000u, 40u}, // dga -> Latn
- {0x9CC30000u, 40u}, // dgh -> Latn
- {0xA0C30000u, 40u}, // dgi -> Latn
+ {0xB4630000u, 44u}, // ddn -> Latn
+ {0x64650000u, 44u}, // de -> Latn
+ {0x8C830000u, 44u}, // ded -> Latn
+ {0xB4830000u, 44u}, // den -> Latn
+ {0x80C30000u, 44u}, // dga -> Latn
+ {0x9CC30000u, 44u}, // dgh -> Latn
+ {0xA0C30000u, 44u}, // dgi -> Latn
{0xACC30000u, 1u}, // dgl -> Arab
- {0xC4C30000u, 40u}, // dgr -> Latn
- {0xE4C30000u, 40u}, // dgz -> Latn
- {0x81030000u, 40u}, // dia -> Latn
- {0x91230000u, 40u}, // dje -> Latn
- {0xA5A30000u, 40u}, // dnj -> Latn
- {0x85C30000u, 40u}, // dob -> Latn
+ {0xC4C30000u, 44u}, // dgr -> Latn
+ {0xE4C30000u, 44u}, // dgz -> Latn
+ {0x81030000u, 44u}, // dia -> Latn
+ {0x91230000u, 44u}, // dje -> Latn
+ {0xA5A30000u, 44u}, // dnj -> Latn
+ {0x85C30000u, 44u}, // dob -> Latn
{0xA1C30000u, 1u}, // doi -> Arab
- {0xBDC30000u, 40u}, // dop -> Latn
- {0xD9C30000u, 40u}, // dow -> Latn
- {0xA2230000u, 40u}, // dri -> Latn
- {0xCA230000u, 18u}, // drs -> Ethi
- {0x86430000u, 40u}, // dsb -> Latn
- {0xB2630000u, 40u}, // dtm -> Latn
- {0xBE630000u, 40u}, // dtp -> Latn
- {0xCA630000u, 40u}, // dts -> Latn
- {0xE2630000u, 16u}, // dty -> Deva
- {0x82830000u, 40u}, // dua -> Latn
- {0x8A830000u, 40u}, // duc -> Latn
- {0x8E830000u, 40u}, // dud -> Latn
- {0x9A830000u, 40u}, // dug -> Latn
- {0x64760000u, 79u}, // dv -> Thaa
- {0x82A30000u, 40u}, // dva -> Latn
- {0xDAC30000u, 40u}, // dww -> Latn
- {0xBB030000u, 40u}, // dyo -> Latn
- {0xD3030000u, 40u}, // dyu -> Latn
- {0x647A0000u, 81u}, // dz -> Tibt
- {0x9B230000u, 40u}, // dzg -> Latn
- {0xD0240000u, 40u}, // ebu -> Latn
- {0x65650000u, 40u}, // ee -> Latn
- {0xA0A40000u, 40u}, // efi -> Latn
- {0xACC40000u, 40u}, // egl -> Latn
- {0xE0C40000u, 17u}, // egy -> Egyp
- {0xE1440000u, 32u}, // eky -> Kali
- {0x656C0000u, 21u}, // el -> Grek
- {0x81840000u, 40u}, // ema -> Latn
- {0xA1840000u, 40u}, // emi -> Latn
- {0x656E0000u, 40u}, // en -> Latn
- {0x656E5841u, 87u}, // en-XA -> ~~~A
- {0xB5A40000u, 40u}, // enn -> Latn
- {0xC1A40000u, 40u}, // enq -> Latn
- {0x656F0000u, 40u}, // eo -> Latn
- {0xA2240000u, 40u}, // eri -> Latn
- {0x65730000u, 40u}, // es -> Latn
- {0xD2440000u, 40u}, // esu -> Latn
- {0x65740000u, 40u}, // et -> Latn
- {0xC6640000u, 40u}, // etr -> Latn
- {0xCE640000u, 30u}, // ett -> Ital
- {0xD2640000u, 40u}, // etu -> Latn
- {0xDE640000u, 40u}, // etx -> Latn
- {0x65750000u, 40u}, // eu -> Latn
- {0xBAC40000u, 40u}, // ewo -> Latn
- {0xCEE40000u, 40u}, // ext -> Latn
+ {0xBDC30000u, 44u}, // dop -> Latn
+ {0xD9C30000u, 44u}, // dow -> Latn
+ {0xA2230000u, 44u}, // dri -> Latn
+ {0xCA230000u, 19u}, // drs -> Ethi
+ {0x86430000u, 44u}, // dsb -> Latn
+ {0xB2630000u, 44u}, // dtm -> Latn
+ {0xBE630000u, 44u}, // dtp -> Latn
+ {0xCA630000u, 44u}, // dts -> Latn
+ {0xE2630000u, 17u}, // dty -> Deva
+ {0x82830000u, 44u}, // dua -> Latn
+ {0x8A830000u, 44u}, // duc -> Latn
+ {0x8E830000u, 44u}, // dud -> Latn
+ {0x9A830000u, 44u}, // dug -> Latn
+ {0x64760000u, 86u}, // dv -> Thaa
+ {0x82A30000u, 44u}, // dva -> Latn
+ {0xDAC30000u, 44u}, // dww -> Latn
+ {0xBB030000u, 44u}, // dyo -> Latn
+ {0xD3030000u, 44u}, // dyu -> Latn
+ {0x647A0000u, 88u}, // dz -> Tibt
+ {0x9B230000u, 44u}, // dzg -> Latn
+ {0xD0240000u, 44u}, // ebu -> Latn
+ {0x65650000u, 44u}, // ee -> Latn
+ {0xA0A40000u, 44u}, // efi -> Latn
+ {0xACC40000u, 44u}, // egl -> Latn
+ {0xE0C40000u, 18u}, // egy -> Egyp
+ {0x81440000u, 44u}, // eka -> Latn
+ {0xE1440000u, 36u}, // eky -> Kali
+ {0x656C0000u, 24u}, // el -> Grek
+ {0x81840000u, 44u}, // ema -> Latn
+ {0xA1840000u, 44u}, // emi -> Latn
+ {0x656E0000u, 44u}, // en -> Latn
+ {0x656E5841u, 95u}, // en-XA -> ~~~A
+ {0xB5A40000u, 44u}, // enn -> Latn
+ {0xC1A40000u, 44u}, // enq -> Latn
+ {0x656F0000u, 44u}, // eo -> Latn
+ {0xA2240000u, 44u}, // eri -> Latn
+ {0x65730000u, 44u}, // es -> Latn
+ {0x9A440000u, 22u}, // esg -> Gonm
+ {0xD2440000u, 44u}, // esu -> Latn
+ {0x65740000u, 44u}, // et -> Latn
+ {0xC6640000u, 44u}, // etr -> Latn
+ {0xCE640000u, 34u}, // ett -> Ital
+ {0xD2640000u, 44u}, // etu -> Latn
+ {0xDE640000u, 44u}, // etx -> Latn
+ {0x65750000u, 44u}, // eu -> Latn
+ {0xBAC40000u, 44u}, // ewo -> Latn
+ {0xCEE40000u, 44u}, // ext -> Latn
{0x66610000u, 1u}, // fa -> Arab
- {0x80050000u, 40u}, // faa -> Latn
- {0x84050000u, 40u}, // fab -> Latn
- {0x98050000u, 40u}, // fag -> Latn
- {0xA0050000u, 40u}, // fai -> Latn
- {0xB4050000u, 40u}, // fan -> Latn
- {0x66660000u, 40u}, // ff -> Latn
- {0xA0A50000u, 40u}, // ffi -> Latn
- {0xB0A50000u, 40u}, // ffm -> Latn
- {0x66690000u, 40u}, // fi -> Latn
+ {0x80050000u, 44u}, // faa -> Latn
+ {0x84050000u, 44u}, // fab -> Latn
+ {0x98050000u, 44u}, // fag -> Latn
+ {0xA0050000u, 44u}, // fai -> Latn
+ {0xB4050000u, 44u}, // fan -> Latn
+ {0x66660000u, 44u}, // ff -> Latn
+ {0xA0A50000u, 44u}, // ffi -> Latn
+ {0xB0A50000u, 44u}, // ffm -> Latn
+ {0x66690000u, 44u}, // fi -> Latn
{0x81050000u, 1u}, // fia -> Arab
- {0xAD050000u, 40u}, // fil -> Latn
- {0xCD050000u, 40u}, // fit -> Latn
- {0x666A0000u, 40u}, // fj -> Latn
- {0xC5650000u, 40u}, // flr -> Latn
- {0xBD850000u, 40u}, // fmp -> Latn
- {0x666F0000u, 40u}, // fo -> Latn
- {0x8DC50000u, 40u}, // fod -> Latn
- {0xB5C50000u, 40u}, // fon -> Latn
- {0xC5C50000u, 40u}, // for -> Latn
- {0x91E50000u, 40u}, // fpe -> Latn
- {0xCA050000u, 40u}, // fqs -> Latn
- {0x66720000u, 40u}, // fr -> Latn
- {0x8A250000u, 40u}, // frc -> Latn
- {0xBE250000u, 40u}, // frp -> Latn
- {0xC6250000u, 40u}, // frr -> Latn
- {0xCA250000u, 40u}, // frs -> Latn
+ {0xAD050000u, 44u}, // fil -> Latn
+ {0xCD050000u, 44u}, // fit -> Latn
+ {0x666A0000u, 44u}, // fj -> Latn
+ {0xC5650000u, 44u}, // flr -> Latn
+ {0xBD850000u, 44u}, // fmp -> Latn
+ {0x666F0000u, 44u}, // fo -> Latn
+ {0x8DC50000u, 44u}, // fod -> Latn
+ {0xB5C50000u, 44u}, // fon -> Latn
+ {0xC5C50000u, 44u}, // for -> Latn
+ {0x91E50000u, 44u}, // fpe -> Latn
+ {0xCA050000u, 44u}, // fqs -> Latn
+ {0x66720000u, 44u}, // fr -> Latn
+ {0x8A250000u, 44u}, // frc -> Latn
+ {0xBE250000u, 44u}, // frp -> Latn
+ {0xC6250000u, 44u}, // frr -> Latn
+ {0xCA250000u, 44u}, // frs -> Latn
{0x86850000u, 1u}, // fub -> Arab
- {0x8E850000u, 40u}, // fud -> Latn
- {0x92850000u, 40u}, // fue -> Latn
- {0x96850000u, 40u}, // fuf -> Latn
- {0x9E850000u, 40u}, // fuh -> Latn
- {0xC2850000u, 40u}, // fuq -> Latn
- {0xC6850000u, 40u}, // fur -> Latn
- {0xD6850000u, 40u}, // fuv -> Latn
- {0xE2850000u, 40u}, // fuy -> Latn
- {0xC6A50000u, 40u}, // fvr -> Latn
- {0x66790000u, 40u}, // fy -> Latn
- {0x67610000u, 40u}, // ga -> Latn
- {0x80060000u, 40u}, // gaa -> Latn
- {0x94060000u, 40u}, // gaf -> Latn
- {0x98060000u, 40u}, // gag -> Latn
- {0x9C060000u, 40u}, // gah -> Latn
- {0xA4060000u, 40u}, // gaj -> Latn
- {0xB0060000u, 40u}, // gam -> Latn
- {0xB4060000u, 24u}, // gan -> Hans
- {0xD8060000u, 40u}, // gaw -> Latn
- {0xE0060000u, 40u}, // gay -> Latn
- {0x94260000u, 40u}, // gbf -> Latn
- {0xB0260000u, 16u}, // gbm -> Deva
- {0xE0260000u, 40u}, // gby -> Latn
+ {0x8E850000u, 44u}, // fud -> Latn
+ {0x92850000u, 44u}, // fue -> Latn
+ {0x96850000u, 44u}, // fuf -> Latn
+ {0x9E850000u, 44u}, // fuh -> Latn
+ {0xC2850000u, 44u}, // fuq -> Latn
+ {0xC6850000u, 44u}, // fur -> Latn
+ {0xD6850000u, 44u}, // fuv -> Latn
+ {0xE2850000u, 44u}, // fuy -> Latn
+ {0xC6A50000u, 44u}, // fvr -> Latn
+ {0x66790000u, 44u}, // fy -> Latn
+ {0x67610000u, 44u}, // ga -> Latn
+ {0x80060000u, 44u}, // gaa -> Latn
+ {0x94060000u, 44u}, // gaf -> Latn
+ {0x98060000u, 44u}, // gag -> Latn
+ {0x9C060000u, 44u}, // gah -> Latn
+ {0xA4060000u, 44u}, // gaj -> Latn
+ {0xB0060000u, 44u}, // gam -> Latn
+ {0xB4060000u, 27u}, // gan -> Hans
+ {0xD8060000u, 44u}, // gaw -> Latn
+ {0xE0060000u, 44u}, // gay -> Latn
+ {0x80260000u, 44u}, // gba -> Latn
+ {0x94260000u, 44u}, // gbf -> Latn
+ {0xB0260000u, 17u}, // gbm -> Deva
+ {0xE0260000u, 44u}, // gby -> Latn
{0xE4260000u, 1u}, // gbz -> Arab
- {0xC4460000u, 40u}, // gcr -> Latn
- {0x67640000u, 40u}, // gd -> Latn
- {0x90660000u, 40u}, // gde -> Latn
- {0xB4660000u, 40u}, // gdn -> Latn
- {0xC4660000u, 40u}, // gdr -> Latn
- {0x84860000u, 40u}, // geb -> Latn
- {0xA4860000u, 40u}, // gej -> Latn
- {0xAC860000u, 40u}, // gel -> Latn
- {0xE4860000u, 18u}, // gez -> Ethi
- {0xA8A60000u, 40u}, // gfk -> Latn
- {0xB4C60000u, 16u}, // ggn -> Deva
- {0xC8E60000u, 40u}, // ghs -> Latn
- {0xAD060000u, 40u}, // gil -> Latn
- {0xB1060000u, 40u}, // gim -> Latn
+ {0xC4460000u, 44u}, // gcr -> Latn
+ {0x67640000u, 44u}, // gd -> Latn
+ {0x90660000u, 44u}, // gde -> Latn
+ {0xB4660000u, 44u}, // gdn -> Latn
+ {0xC4660000u, 44u}, // gdr -> Latn
+ {0x84860000u, 44u}, // geb -> Latn
+ {0xA4860000u, 44u}, // gej -> Latn
+ {0xAC860000u, 44u}, // gel -> Latn
+ {0xE4860000u, 19u}, // gez -> Ethi
+ {0xA8A60000u, 44u}, // gfk -> Latn
+ {0xB4C60000u, 17u}, // ggn -> Deva
+ {0xC8E60000u, 44u}, // ghs -> Latn
+ {0xAD060000u, 44u}, // gil -> Latn
+ {0xB1060000u, 44u}, // gim -> Latn
{0xA9260000u, 1u}, // gjk -> Arab
- {0xB5260000u, 40u}, // gjn -> Latn
+ {0xB5260000u, 44u}, // gjn -> Latn
{0xD1260000u, 1u}, // gju -> Arab
- {0xB5460000u, 40u}, // gkn -> Latn
- {0xBD460000u, 40u}, // gkp -> Latn
- {0x676C0000u, 40u}, // gl -> Latn
+ {0xB5460000u, 44u}, // gkn -> Latn
+ {0xBD460000u, 44u}, // gkp -> Latn
+ {0x676C0000u, 44u}, // gl -> Latn
{0xA9660000u, 1u}, // glk -> Arab
- {0xB1860000u, 40u}, // gmm -> Latn
- {0xD5860000u, 18u}, // gmv -> Ethi
- {0x676E0000u, 40u}, // gn -> Latn
- {0x8DA60000u, 40u}, // gnd -> Latn
- {0x99A60000u, 40u}, // gng -> Latn
- {0x8DC60000u, 40u}, // god -> Latn
- {0x95C60000u, 18u}, // gof -> Ethi
- {0xA1C60000u, 40u}, // goi -> Latn
- {0xB1C60000u, 16u}, // gom -> Deva
- {0xB5C60000u, 77u}, // gon -> Telu
- {0xC5C60000u, 40u}, // gor -> Latn
- {0xC9C60000u, 40u}, // gos -> Latn
- {0xCDC60000u, 20u}, // got -> Goth
- {0x8A260000u, 14u}, // grc -> Cprt
+ {0xB1860000u, 44u}, // gmm -> Latn
+ {0xD5860000u, 19u}, // gmv -> Ethi
+ {0x676E0000u, 44u}, // gn -> Latn
+ {0x8DA60000u, 44u}, // gnd -> Latn
+ {0x99A60000u, 44u}, // gng -> Latn
+ {0x8DC60000u, 44u}, // god -> Latn
+ {0x95C60000u, 19u}, // gof -> Ethi
+ {0xA1C60000u, 44u}, // goi -> Latn
+ {0xB1C60000u, 17u}, // gom -> Deva
+ {0xB5C60000u, 84u}, // gon -> Telu
+ {0xC5C60000u, 44u}, // gor -> Latn
+ {0xC9C60000u, 44u}, // gos -> Latn
+ {0xCDC60000u, 23u}, // got -> Goth
+ {0x86260000u, 44u}, // grb -> Latn
+ {0x8A260000u, 15u}, // grc -> Cprt
{0xCE260000u, 7u}, // grt -> Beng
- {0xDA260000u, 40u}, // grw -> Latn
- {0xDA460000u, 40u}, // gsw -> Latn
- {0x67750000u, 22u}, // gu -> Gujr
- {0x86860000u, 40u}, // gub -> Latn
- {0x8A860000u, 40u}, // guc -> Latn
- {0x8E860000u, 40u}, // gud -> Latn
- {0xC6860000u, 40u}, // gur -> Latn
- {0xDA860000u, 40u}, // guw -> Latn
- {0xDE860000u, 40u}, // gux -> Latn
- {0xE6860000u, 40u}, // guz -> Latn
- {0x67760000u, 40u}, // gv -> Latn
- {0x96A60000u, 40u}, // gvf -> Latn
- {0xC6A60000u, 16u}, // gvr -> Deva
- {0xCAA60000u, 40u}, // gvs -> Latn
+ {0xDA260000u, 44u}, // grw -> Latn
+ {0xDA460000u, 44u}, // gsw -> Latn
+ {0x67750000u, 25u}, // gu -> Gujr
+ {0x86860000u, 44u}, // gub -> Latn
+ {0x8A860000u, 44u}, // guc -> Latn
+ {0x8E860000u, 44u}, // gud -> Latn
+ {0xC6860000u, 44u}, // gur -> Latn
+ {0xDA860000u, 44u}, // guw -> Latn
+ {0xDE860000u, 44u}, // gux -> Latn
+ {0xE6860000u, 44u}, // guz -> Latn
+ {0x67760000u, 44u}, // gv -> Latn
+ {0x96A60000u, 44u}, // gvf -> Latn
+ {0xC6A60000u, 17u}, // gvr -> Deva
+ {0xCAA60000u, 44u}, // gvs -> Latn
{0x8AC60000u, 1u}, // gwc -> Arab
- {0xA2C60000u, 40u}, // gwi -> Latn
+ {0xA2C60000u, 44u}, // gwi -> Latn
{0xCEC60000u, 1u}, // gwt -> Arab
- {0xA3060000u, 40u}, // gyi -> Latn
- {0x68610000u, 40u}, // ha -> Latn
+ {0xA3060000u, 44u}, // gyi -> Latn
+ {0x68610000u, 44u}, // ha -> Latn
{0x6861434Du, 1u}, // ha-CM -> Arab
{0x68615344u, 1u}, // ha-SD -> Arab
- {0x98070000u, 40u}, // hag -> Latn
- {0xA8070000u, 24u}, // hak -> Hans
- {0xB0070000u, 40u}, // ham -> Latn
- {0xD8070000u, 40u}, // haw -> Latn
+ {0x98070000u, 44u}, // hag -> Latn
+ {0xA8070000u, 27u}, // hak -> Hans
+ {0xB0070000u, 44u}, // ham -> Latn
+ {0xD8070000u, 44u}, // haw -> Latn
{0xE4070000u, 1u}, // haz -> Arab
- {0x84270000u, 40u}, // hbb -> Latn
- {0xE0670000u, 18u}, // hdy -> Ethi
- {0x68650000u, 27u}, // he -> Hebr
- {0xE0E70000u, 40u}, // hhy -> Latn
- {0x68690000u, 16u}, // hi -> Deva
- {0x81070000u, 40u}, // hia -> Latn
- {0x95070000u, 40u}, // hif -> Latn
- {0x99070000u, 40u}, // hig -> Latn
- {0x9D070000u, 40u}, // hih -> Latn
- {0xAD070000u, 40u}, // hil -> Latn
- {0x81670000u, 40u}, // hla -> Latn
- {0xD1670000u, 28u}, // hlu -> Hluw
- {0x8D870000u, 62u}, // hmd -> Plrd
- {0xCD870000u, 40u}, // hmt -> Latn
+ {0x84270000u, 44u}, // hbb -> Latn
+ {0xE0670000u, 19u}, // hdy -> Ethi
+ {0x68650000u, 30u}, // he -> Hebr
+ {0xE0E70000u, 44u}, // hhy -> Latn
+ {0x68690000u, 17u}, // hi -> Deva
+ {0x81070000u, 44u}, // hia -> Latn
+ {0x95070000u, 44u}, // hif -> Latn
+ {0x99070000u, 44u}, // hig -> Latn
+ {0x9D070000u, 44u}, // hih -> Latn
+ {0xAD070000u, 44u}, // hil -> Latn
+ {0x81670000u, 44u}, // hla -> Latn
+ {0xD1670000u, 31u}, // hlu -> Hluw
+ {0x8D870000u, 67u}, // hmd -> Plrd
+ {0xCD870000u, 44u}, // hmt -> Latn
{0x8DA70000u, 1u}, // hnd -> Arab
- {0x91A70000u, 16u}, // hne -> Deva
- {0xA5A70000u, 29u}, // hnj -> Hmng
- {0xB5A70000u, 40u}, // hnn -> Latn
+ {0x91A70000u, 17u}, // hne -> Deva
+ {0xA5A70000u, 32u}, // hnj -> Hmng
+ {0xB5A70000u, 44u}, // hnn -> Latn
{0xB9A70000u, 1u}, // hno -> Arab
- {0x686F0000u, 40u}, // ho -> Latn
- {0x89C70000u, 16u}, // hoc -> Deva
- {0xA5C70000u, 16u}, // hoj -> Deva
- {0xCDC70000u, 40u}, // hot -> Latn
- {0x68720000u, 40u}, // hr -> Latn
- {0x86470000u, 40u}, // hsb -> Latn
- {0xB6470000u, 24u}, // hsn -> Hans
- {0x68740000u, 40u}, // ht -> Latn
- {0x68750000u, 40u}, // hu -> Latn
- {0xA2870000u, 40u}, // hui -> Latn
+ {0x686F0000u, 44u}, // ho -> Latn
+ {0x89C70000u, 17u}, // hoc -> Deva
+ {0xA5C70000u, 17u}, // hoj -> Deva
+ {0xCDC70000u, 44u}, // hot -> Latn
+ {0x68720000u, 44u}, // hr -> Latn
+ {0x86470000u, 44u}, // hsb -> Latn
+ {0xB6470000u, 27u}, // hsn -> Hans
+ {0x68740000u, 44u}, // ht -> Latn
+ {0x68750000u, 44u}, // hu -> Latn
+ {0xA2870000u, 44u}, // hui -> Latn
{0x68790000u, 3u}, // hy -> Armn
- {0x687A0000u, 40u}, // hz -> Latn
- {0x69610000u, 40u}, // ia -> Latn
- {0xB4080000u, 40u}, // ian -> Latn
- {0xC4080000u, 40u}, // iar -> Latn
- {0x80280000u, 40u}, // iba -> Latn
- {0x84280000u, 40u}, // ibb -> Latn
- {0xE0280000u, 40u}, // iby -> Latn
- {0x80480000u, 40u}, // ica -> Latn
- {0x9C480000u, 40u}, // ich -> Latn
- {0x69640000u, 40u}, // id -> Latn
- {0x8C680000u, 40u}, // idd -> Latn
- {0xA0680000u, 40u}, // idi -> Latn
- {0xD0680000u, 40u}, // idu -> Latn
- {0x69670000u, 40u}, // ig -> Latn
- {0x84C80000u, 40u}, // igb -> Latn
- {0x90C80000u, 40u}, // ige -> Latn
- {0x69690000u, 86u}, // ii -> Yiii
- {0xA5280000u, 40u}, // ijj -> Latn
- {0x696B0000u, 40u}, // ik -> Latn
- {0xA9480000u, 40u}, // ikk -> Latn
- {0xCD480000u, 40u}, // ikt -> Latn
- {0xD9480000u, 40u}, // ikw -> Latn
- {0xDD480000u, 40u}, // ikx -> Latn
- {0xB9680000u, 40u}, // ilo -> Latn
- {0xB9880000u, 40u}, // imo -> Latn
- {0x696E0000u, 40u}, // in -> Latn
- {0x9DA80000u, 15u}, // inh -> Cyrl
- {0xD1C80000u, 40u}, // iou -> Latn
- {0xA2280000u, 40u}, // iri -> Latn
- {0x69730000u, 40u}, // is -> Latn
- {0x69740000u, 40u}, // it -> Latn
- {0x69750000u, 9u}, // iu -> Cans
- {0x69770000u, 27u}, // iw -> Hebr
- {0xB2C80000u, 40u}, // iwm -> Latn
- {0xCAC80000u, 40u}, // iws -> Latn
- {0x9F280000u, 40u}, // izh -> Latn
- {0xA3280000u, 40u}, // izi -> Latn
- {0x6A610000u, 31u}, // ja -> Jpan
- {0x84090000u, 40u}, // jab -> Latn
- {0xB0090000u, 40u}, // jam -> Latn
- {0xD0290000u, 40u}, // jbu -> Latn
- {0xB4890000u, 40u}, // jen -> Latn
- {0xA8C90000u, 40u}, // jgk -> Latn
- {0xB8C90000u, 40u}, // jgo -> Latn
- {0x6A690000u, 27u}, // ji -> Hebr
- {0x85090000u, 40u}, // jib -> Latn
- {0x89890000u, 40u}, // jmc -> Latn
- {0xAD890000u, 16u}, // jml -> Deva
- {0x82290000u, 40u}, // jra -> Latn
- {0xCE890000u, 40u}, // jut -> Latn
- {0x6A760000u, 40u}, // jv -> Latn
- {0x6A770000u, 40u}, // jw -> Latn
- {0x6B610000u, 19u}, // ka -> Geor
- {0x800A0000u, 15u}, // kaa -> Cyrl
- {0x840A0000u, 40u}, // kab -> Latn
- {0x880A0000u, 40u}, // kac -> Latn
- {0x8C0A0000u, 40u}, // kad -> Latn
- {0xA00A0000u, 40u}, // kai -> Latn
- {0xA40A0000u, 40u}, // kaj -> Latn
- {0xB00A0000u, 40u}, // kam -> Latn
- {0xB80A0000u, 40u}, // kao -> Latn
- {0x8C2A0000u, 15u}, // kbd -> Cyrl
- {0xB02A0000u, 40u}, // kbm -> Latn
- {0xBC2A0000u, 40u}, // kbp -> Latn
- {0xC02A0000u, 40u}, // kbq -> Latn
- {0xDC2A0000u, 40u}, // kbx -> Latn
+ {0x687A0000u, 44u}, // hz -> Latn
+ {0x69610000u, 44u}, // ia -> Latn
+ {0xB4080000u, 44u}, // ian -> Latn
+ {0xC4080000u, 44u}, // iar -> Latn
+ {0x80280000u, 44u}, // iba -> Latn
+ {0x84280000u, 44u}, // ibb -> Latn
+ {0xE0280000u, 44u}, // iby -> Latn
+ {0x80480000u, 44u}, // ica -> Latn
+ {0x9C480000u, 44u}, // ich -> Latn
+ {0x69640000u, 44u}, // id -> Latn
+ {0x8C680000u, 44u}, // idd -> Latn
+ {0xA0680000u, 44u}, // idi -> Latn
+ {0xD0680000u, 44u}, // idu -> Latn
+ {0x90A80000u, 44u}, // ife -> Latn
+ {0x69670000u, 44u}, // ig -> Latn
+ {0x84C80000u, 44u}, // igb -> Latn
+ {0x90C80000u, 44u}, // ige -> Latn
+ {0x69690000u, 94u}, // ii -> Yiii
+ {0xA5280000u, 44u}, // ijj -> Latn
+ {0x696B0000u, 44u}, // ik -> Latn
+ {0xA9480000u, 44u}, // ikk -> Latn
+ {0xCD480000u, 44u}, // ikt -> Latn
+ {0xD9480000u, 44u}, // ikw -> Latn
+ {0xDD480000u, 44u}, // ikx -> Latn
+ {0xB9680000u, 44u}, // ilo -> Latn
+ {0xB9880000u, 44u}, // imo -> Latn
+ {0x696E0000u, 44u}, // in -> Latn
+ {0x9DA80000u, 16u}, // inh -> Cyrl
+ {0x696F0000u, 44u}, // io -> Latn
+ {0xD1C80000u, 44u}, // iou -> Latn
+ {0xA2280000u, 44u}, // iri -> Latn
+ {0x69730000u, 44u}, // is -> Latn
+ {0x69740000u, 44u}, // it -> Latn
+ {0x69750000u, 10u}, // iu -> Cans
+ {0x69770000u, 30u}, // iw -> Hebr
+ {0xB2C80000u, 44u}, // iwm -> Latn
+ {0xCAC80000u, 44u}, // iws -> Latn
+ {0x9F280000u, 44u}, // izh -> Latn
+ {0xA3280000u, 44u}, // izi -> Latn
+ {0x6A610000u, 35u}, // ja -> Jpan
+ {0x84090000u, 44u}, // jab -> Latn
+ {0xB0090000u, 44u}, // jam -> Latn
+ {0xB8290000u, 44u}, // jbo -> Latn
+ {0xD0290000u, 44u}, // jbu -> Latn
+ {0xB4890000u, 44u}, // jen -> Latn
+ {0xA8C90000u, 44u}, // jgk -> Latn
+ {0xB8C90000u, 44u}, // jgo -> Latn
+ {0x6A690000u, 30u}, // ji -> Hebr
+ {0x85090000u, 44u}, // jib -> Latn
+ {0x89890000u, 44u}, // jmc -> Latn
+ {0xAD890000u, 17u}, // jml -> Deva
+ {0x82290000u, 44u}, // jra -> Latn
+ {0xCE890000u, 44u}, // jut -> Latn
+ {0x6A760000u, 44u}, // jv -> Latn
+ {0x6A770000u, 44u}, // jw -> Latn
+ {0x6B610000u, 20u}, // ka -> Geor
+ {0x800A0000u, 16u}, // kaa -> Cyrl
+ {0x840A0000u, 44u}, // kab -> Latn
+ {0x880A0000u, 44u}, // kac -> Latn
+ {0x8C0A0000u, 44u}, // kad -> Latn
+ {0xA00A0000u, 44u}, // kai -> Latn
+ {0xA40A0000u, 44u}, // kaj -> Latn
+ {0xB00A0000u, 44u}, // kam -> Latn
+ {0xB80A0000u, 44u}, // kao -> Latn
+ {0x8C2A0000u, 16u}, // kbd -> Cyrl
+ {0xB02A0000u, 44u}, // kbm -> Latn
+ {0xBC2A0000u, 44u}, // kbp -> Latn
+ {0xC02A0000u, 44u}, // kbq -> Latn
+ {0xDC2A0000u, 44u}, // kbx -> Latn
{0xE02A0000u, 1u}, // kby -> Arab
- {0x984A0000u, 40u}, // kcg -> Latn
- {0xA84A0000u, 40u}, // kck -> Latn
- {0xAC4A0000u, 40u}, // kcl -> Latn
- {0xCC4A0000u, 40u}, // kct -> Latn
- {0x906A0000u, 40u}, // kde -> Latn
+ {0x984A0000u, 44u}, // kcg -> Latn
+ {0xA84A0000u, 44u}, // kck -> Latn
+ {0xAC4A0000u, 44u}, // kcl -> Latn
+ {0xCC4A0000u, 44u}, // kct -> Latn
+ {0x906A0000u, 44u}, // kde -> Latn
{0x9C6A0000u, 1u}, // kdh -> Arab
- {0xAC6A0000u, 40u}, // kdl -> Latn
- {0xCC6A0000u, 80u}, // kdt -> Thai
- {0x808A0000u, 40u}, // kea -> Latn
- {0xB48A0000u, 40u}, // ken -> Latn
- {0xE48A0000u, 40u}, // kez -> Latn
- {0xB8AA0000u, 40u}, // kfo -> Latn
- {0xC4AA0000u, 16u}, // kfr -> Deva
- {0xE0AA0000u, 16u}, // kfy -> Deva
- {0x6B670000u, 40u}, // kg -> Latn
- {0x90CA0000u, 40u}, // kge -> Latn
- {0x94CA0000u, 40u}, // kgf -> Latn
- {0xBCCA0000u, 40u}, // kgp -> Latn
- {0x80EA0000u, 40u}, // kha -> Latn
- {0x84EA0000u, 73u}, // khb -> Talu
- {0xB4EA0000u, 16u}, // khn -> Deva
- {0xC0EA0000u, 40u}, // khq -> Latn
- {0xC8EA0000u, 40u}, // khs -> Latn
- {0xCCEA0000u, 52u}, // kht -> Mymr
+ {0xAC6A0000u, 44u}, // kdl -> Latn
+ {0xCC6A0000u, 87u}, // kdt -> Thai
+ {0x808A0000u, 44u}, // kea -> Latn
+ {0xB48A0000u, 44u}, // ken -> Latn
+ {0xE48A0000u, 44u}, // kez -> Latn
+ {0xB8AA0000u, 44u}, // kfo -> Latn
+ {0xC4AA0000u, 17u}, // kfr -> Deva
+ {0xE0AA0000u, 17u}, // kfy -> Deva
+ {0x6B670000u, 44u}, // kg -> Latn
+ {0x90CA0000u, 44u}, // kge -> Latn
+ {0x94CA0000u, 44u}, // kgf -> Latn
+ {0xBCCA0000u, 44u}, // kgp -> Latn
+ {0x80EA0000u, 44u}, // kha -> Latn
+ {0x84EA0000u, 80u}, // khb -> Talu
+ {0xB4EA0000u, 17u}, // khn -> Deva
+ {0xC0EA0000u, 44u}, // khq -> Latn
+ {0xC8EA0000u, 44u}, // khs -> Latn
+ {0xCCEA0000u, 56u}, // kht -> Mymr
{0xD8EA0000u, 1u}, // khw -> Arab
- {0xE4EA0000u, 40u}, // khz -> Latn
- {0x6B690000u, 40u}, // ki -> Latn
- {0xA50A0000u, 40u}, // kij -> Latn
- {0xD10A0000u, 40u}, // kiu -> Latn
- {0xD90A0000u, 40u}, // kiw -> Latn
- {0x6B6A0000u, 40u}, // kj -> Latn
- {0x8D2A0000u, 40u}, // kjd -> Latn
- {0x992A0000u, 39u}, // kjg -> Laoo
- {0xC92A0000u, 40u}, // kjs -> Latn
- {0xE12A0000u, 40u}, // kjy -> Latn
- {0x6B6B0000u, 15u}, // kk -> Cyrl
+ {0xE4EA0000u, 44u}, // khz -> Latn
+ {0x6B690000u, 44u}, // ki -> Latn
+ {0xA50A0000u, 44u}, // kij -> Latn
+ {0xD10A0000u, 44u}, // kiu -> Latn
+ {0xD90A0000u, 44u}, // kiw -> Latn
+ {0x6B6A0000u, 44u}, // kj -> Latn
+ {0x8D2A0000u, 44u}, // kjd -> Latn
+ {0x992A0000u, 43u}, // kjg -> Laoo
+ {0xC92A0000u, 44u}, // kjs -> Latn
+ {0xE12A0000u, 44u}, // kjy -> Latn
+ {0x6B6B0000u, 16u}, // kk -> Cyrl
{0x6B6B4146u, 1u}, // kk-AF -> Arab
{0x6B6B434Eu, 1u}, // kk-CN -> Arab
{0x6B6B4952u, 1u}, // kk-IR -> Arab
{0x6B6B4D4Eu, 1u}, // kk-MN -> Arab
- {0x894A0000u, 40u}, // kkc -> Latn
- {0xA54A0000u, 40u}, // kkj -> Latn
- {0x6B6C0000u, 40u}, // kl -> Latn
- {0xB56A0000u, 40u}, // kln -> Latn
- {0xC16A0000u, 40u}, // klq -> Latn
- {0xCD6A0000u, 40u}, // klt -> Latn
- {0xDD6A0000u, 40u}, // klx -> Latn
- {0x6B6D0000u, 35u}, // km -> Khmr
- {0x858A0000u, 40u}, // kmb -> Latn
- {0x9D8A0000u, 40u}, // kmh -> Latn
- {0xB98A0000u, 40u}, // kmo -> Latn
- {0xC98A0000u, 40u}, // kms -> Latn
- {0xD18A0000u, 40u}, // kmu -> Latn
- {0xD98A0000u, 40u}, // kmw -> Latn
- {0x6B6E0000u, 36u}, // kn -> Knda
- {0xBDAA0000u, 40u}, // knp -> Latn
- {0x6B6F0000u, 37u}, // ko -> Kore
- {0xA1CA0000u, 15u}, // koi -> Cyrl
- {0xA9CA0000u, 16u}, // kok -> Deva
- {0xADCA0000u, 40u}, // kol -> Latn
- {0xC9CA0000u, 40u}, // kos -> Latn
- {0xE5CA0000u, 40u}, // koz -> Latn
- {0x91EA0000u, 40u}, // kpe -> Latn
- {0x95EA0000u, 40u}, // kpf -> Latn
- {0xB9EA0000u, 40u}, // kpo -> Latn
- {0xC5EA0000u, 40u}, // kpr -> Latn
- {0xDDEA0000u, 40u}, // kpx -> Latn
- {0x860A0000u, 40u}, // kqb -> Latn
- {0x960A0000u, 40u}, // kqf -> Latn
- {0xCA0A0000u, 40u}, // kqs -> Latn
- {0xE20A0000u, 18u}, // kqy -> Ethi
- {0x8A2A0000u, 15u}, // krc -> Cyrl
- {0xA22A0000u, 40u}, // kri -> Latn
- {0xA62A0000u, 40u}, // krj -> Latn
- {0xAE2A0000u, 40u}, // krl -> Latn
- {0xCA2A0000u, 40u}, // krs -> Latn
- {0xD22A0000u, 16u}, // kru -> Deva
+ {0x894A0000u, 44u}, // kkc -> Latn
+ {0xA54A0000u, 44u}, // kkj -> Latn
+ {0x6B6C0000u, 44u}, // kl -> Latn
+ {0xB56A0000u, 44u}, // kln -> Latn
+ {0xC16A0000u, 44u}, // klq -> Latn
+ {0xCD6A0000u, 44u}, // klt -> Latn
+ {0xDD6A0000u, 44u}, // klx -> Latn
+ {0x6B6D0000u, 39u}, // km -> Khmr
+ {0x858A0000u, 44u}, // kmb -> Latn
+ {0x9D8A0000u, 44u}, // kmh -> Latn
+ {0xB98A0000u, 44u}, // kmo -> Latn
+ {0xC98A0000u, 44u}, // kms -> Latn
+ {0xD18A0000u, 44u}, // kmu -> Latn
+ {0xD98A0000u, 44u}, // kmw -> Latn
+ {0x6B6E0000u, 40u}, // kn -> Knda
+ {0x95AA0000u, 44u}, // knf -> Latn
+ {0xBDAA0000u, 44u}, // knp -> Latn
+ {0x6B6F0000u, 41u}, // ko -> Kore
+ {0xA1CA0000u, 16u}, // koi -> Cyrl
+ {0xA9CA0000u, 17u}, // kok -> Deva
+ {0xADCA0000u, 44u}, // kol -> Latn
+ {0xC9CA0000u, 44u}, // kos -> Latn
+ {0xE5CA0000u, 44u}, // koz -> Latn
+ {0x91EA0000u, 44u}, // kpe -> Latn
+ {0x95EA0000u, 44u}, // kpf -> Latn
+ {0xB9EA0000u, 44u}, // kpo -> Latn
+ {0xC5EA0000u, 44u}, // kpr -> Latn
+ {0xDDEA0000u, 44u}, // kpx -> Latn
+ {0x860A0000u, 44u}, // kqb -> Latn
+ {0x960A0000u, 44u}, // kqf -> Latn
+ {0xCA0A0000u, 44u}, // kqs -> Latn
+ {0xE20A0000u, 19u}, // kqy -> Ethi
+ {0x6B720000u, 44u}, // kr -> Latn
+ {0x8A2A0000u, 16u}, // krc -> Cyrl
+ {0xA22A0000u, 44u}, // kri -> Latn
+ {0xA62A0000u, 44u}, // krj -> Latn
+ {0xAE2A0000u, 44u}, // krl -> Latn
+ {0xCA2A0000u, 44u}, // krs -> Latn
+ {0xD22A0000u, 17u}, // kru -> Deva
{0x6B730000u, 1u}, // ks -> Arab
- {0x864A0000u, 40u}, // ksb -> Latn
- {0x8E4A0000u, 40u}, // ksd -> Latn
- {0x964A0000u, 40u}, // ksf -> Latn
- {0x9E4A0000u, 40u}, // ksh -> Latn
- {0xA64A0000u, 40u}, // ksj -> Latn
- {0xC64A0000u, 40u}, // ksr -> Latn
- {0x866A0000u, 18u}, // ktb -> Ethi
- {0xB26A0000u, 40u}, // ktm -> Latn
- {0xBA6A0000u, 40u}, // kto -> Latn
- {0x6B750000u, 40u}, // ku -> Latn
+ {0x864A0000u, 44u}, // ksb -> Latn
+ {0x8E4A0000u, 44u}, // ksd -> Latn
+ {0x964A0000u, 44u}, // ksf -> Latn
+ {0x9E4A0000u, 44u}, // ksh -> Latn
+ {0xA64A0000u, 44u}, // ksj -> Latn
+ {0xC64A0000u, 44u}, // ksr -> Latn
+ {0x866A0000u, 19u}, // ktb -> Ethi
+ {0xB26A0000u, 44u}, // ktm -> Latn
+ {0xBA6A0000u, 44u}, // kto -> Latn
+ {0x6B750000u, 44u}, // ku -> Latn
{0x6B754952u, 1u}, // ku-IR -> Arab
{0x6B754C42u, 1u}, // ku-LB -> Arab
- {0x868A0000u, 40u}, // kub -> Latn
- {0x8E8A0000u, 40u}, // kud -> Latn
- {0x928A0000u, 40u}, // kue -> Latn
- {0xA68A0000u, 40u}, // kuj -> Latn
- {0xB28A0000u, 15u}, // kum -> Cyrl
- {0xB68A0000u, 40u}, // kun -> Latn
- {0xBE8A0000u, 40u}, // kup -> Latn
- {0xCA8A0000u, 40u}, // kus -> Latn
- {0x6B760000u, 15u}, // kv -> Cyrl
- {0x9AAA0000u, 40u}, // kvg -> Latn
- {0xC6AA0000u, 40u}, // kvr -> Latn
+ {0x868A0000u, 44u}, // kub -> Latn
+ {0x8E8A0000u, 44u}, // kud -> Latn
+ {0x928A0000u, 44u}, // kue -> Latn
+ {0xA68A0000u, 44u}, // kuj -> Latn
+ {0xB28A0000u, 16u}, // kum -> Cyrl
+ {0xB68A0000u, 44u}, // kun -> Latn
+ {0xBE8A0000u, 44u}, // kup -> Latn
+ {0xCA8A0000u, 44u}, // kus -> Latn
+ {0x6B760000u, 16u}, // kv -> Cyrl
+ {0x9AAA0000u, 44u}, // kvg -> Latn
+ {0xC6AA0000u, 44u}, // kvr -> Latn
{0xDEAA0000u, 1u}, // kvx -> Arab
- {0x6B770000u, 40u}, // kw -> Latn
- {0xA6CA0000u, 40u}, // kwj -> Latn
- {0xBACA0000u, 40u}, // kwo -> Latn
- {0x82EA0000u, 40u}, // kxa -> Latn
- {0x8AEA0000u, 18u}, // kxc -> Ethi
- {0xB2EA0000u, 80u}, // kxm -> Thai
+ {0x6B770000u, 44u}, // kw -> Latn
+ {0xA6CA0000u, 44u}, // kwj -> Latn
+ {0xBACA0000u, 44u}, // kwo -> Latn
+ {0x82EA0000u, 44u}, // kxa -> Latn
+ {0x8AEA0000u, 19u}, // kxc -> Ethi
+ {0xB2EA0000u, 87u}, // kxm -> Thai
{0xBEEA0000u, 1u}, // kxp -> Arab
- {0xDAEA0000u, 40u}, // kxw -> Latn
- {0xE6EA0000u, 40u}, // kxz -> Latn
- {0x6B790000u, 15u}, // ky -> Cyrl
+ {0xDAEA0000u, 44u}, // kxw -> Latn
+ {0xE6EA0000u, 44u}, // kxz -> Latn
+ {0x6B790000u, 16u}, // ky -> Cyrl
{0x6B79434Eu, 1u}, // ky-CN -> Arab
- {0x6B795452u, 40u}, // ky-TR -> Latn
- {0x930A0000u, 40u}, // kye -> Latn
- {0xDF0A0000u, 40u}, // kyx -> Latn
- {0xC72A0000u, 40u}, // kzr -> Latn
- {0x6C610000u, 40u}, // la -> Latn
- {0x840B0000u, 42u}, // lab -> Lina
- {0x8C0B0000u, 27u}, // lad -> Hebr
- {0x980B0000u, 40u}, // lag -> Latn
+ {0x6B795452u, 44u}, // ky-TR -> Latn
+ {0x930A0000u, 44u}, // kye -> Latn
+ {0xDF0A0000u, 44u}, // kyx -> Latn
+ {0xC72A0000u, 44u}, // kzr -> Latn
+ {0x6C610000u, 44u}, // la -> Latn
+ {0x840B0000u, 46u}, // lab -> Lina
+ {0x8C0B0000u, 30u}, // lad -> Hebr
+ {0x980B0000u, 44u}, // lag -> Latn
{0x9C0B0000u, 1u}, // lah -> Arab
- {0xA40B0000u, 40u}, // laj -> Latn
- {0xC80B0000u, 40u}, // las -> Latn
- {0x6C620000u, 40u}, // lb -> Latn
- {0x902B0000u, 15u}, // lbe -> Cyrl
- {0xD02B0000u, 40u}, // lbu -> Latn
- {0xD82B0000u, 40u}, // lbw -> Latn
- {0xB04B0000u, 40u}, // lcm -> Latn
- {0xBC4B0000u, 80u}, // lcp -> Thai
- {0x846B0000u, 40u}, // ldb -> Latn
- {0x8C8B0000u, 40u}, // led -> Latn
- {0x908B0000u, 40u}, // lee -> Latn
- {0xB08B0000u, 40u}, // lem -> Latn
- {0xBC8B0000u, 41u}, // lep -> Lepc
- {0xC08B0000u, 40u}, // leq -> Latn
- {0xD08B0000u, 40u}, // leu -> Latn
- {0xE48B0000u, 15u}, // lez -> Cyrl
- {0x6C670000u, 40u}, // lg -> Latn
- {0x98CB0000u, 40u}, // lgg -> Latn
- {0x6C690000u, 40u}, // li -> Latn
- {0x810B0000u, 40u}, // lia -> Latn
- {0x8D0B0000u, 40u}, // lid -> Latn
- {0x950B0000u, 16u}, // lif -> Deva
- {0x990B0000u, 40u}, // lig -> Latn
- {0x9D0B0000u, 40u}, // lih -> Latn
- {0xA50B0000u, 40u}, // lij -> Latn
- {0xC90B0000u, 43u}, // lis -> Lisu
- {0xBD2B0000u, 40u}, // ljp -> Latn
+ {0xA40B0000u, 44u}, // laj -> Latn
+ {0xC80B0000u, 44u}, // las -> Latn
+ {0x6C620000u, 44u}, // lb -> Latn
+ {0x902B0000u, 16u}, // lbe -> Cyrl
+ {0xD02B0000u, 44u}, // lbu -> Latn
+ {0xD82B0000u, 44u}, // lbw -> Latn
+ {0xB04B0000u, 44u}, // lcm -> Latn
+ {0xBC4B0000u, 87u}, // lcp -> Thai
+ {0x846B0000u, 44u}, // ldb -> Latn
+ {0x8C8B0000u, 44u}, // led -> Latn
+ {0x908B0000u, 44u}, // lee -> Latn
+ {0xB08B0000u, 44u}, // lem -> Latn
+ {0xBC8B0000u, 45u}, // lep -> Lepc
+ {0xC08B0000u, 44u}, // leq -> Latn
+ {0xD08B0000u, 44u}, // leu -> Latn
+ {0xE48B0000u, 16u}, // lez -> Cyrl
+ {0x6C670000u, 44u}, // lg -> Latn
+ {0x98CB0000u, 44u}, // lgg -> Latn
+ {0x6C690000u, 44u}, // li -> Latn
+ {0x810B0000u, 44u}, // lia -> Latn
+ {0x8D0B0000u, 44u}, // lid -> Latn
+ {0x950B0000u, 17u}, // lif -> Deva
+ {0x990B0000u, 44u}, // lig -> Latn
+ {0x9D0B0000u, 44u}, // lih -> Latn
+ {0xA50B0000u, 44u}, // lij -> Latn
+ {0xC90B0000u, 47u}, // lis -> Lisu
+ {0xBD2B0000u, 44u}, // ljp -> Latn
{0xA14B0000u, 1u}, // lki -> Arab
- {0xCD4B0000u, 40u}, // lkt -> Latn
- {0x916B0000u, 40u}, // lle -> Latn
- {0xB56B0000u, 40u}, // lln -> Latn
- {0xB58B0000u, 77u}, // lmn -> Telu
- {0xB98B0000u, 40u}, // lmo -> Latn
- {0xBD8B0000u, 40u}, // lmp -> Latn
- {0x6C6E0000u, 40u}, // ln -> Latn
- {0xC9AB0000u, 40u}, // lns -> Latn
- {0xD1AB0000u, 40u}, // lnu -> Latn
- {0x6C6F0000u, 39u}, // lo -> Laoo
- {0xA5CB0000u, 40u}, // loj -> Latn
- {0xA9CB0000u, 40u}, // lok -> Latn
- {0xADCB0000u, 40u}, // lol -> Latn
- {0xC5CB0000u, 40u}, // lor -> Latn
- {0xC9CB0000u, 40u}, // los -> Latn
- {0xE5CB0000u, 40u}, // loz -> Latn
+ {0xCD4B0000u, 44u}, // lkt -> Latn
+ {0x916B0000u, 44u}, // lle -> Latn
+ {0xB56B0000u, 44u}, // lln -> Latn
+ {0xB58B0000u, 84u}, // lmn -> Telu
+ {0xB98B0000u, 44u}, // lmo -> Latn
+ {0xBD8B0000u, 44u}, // lmp -> Latn
+ {0x6C6E0000u, 44u}, // ln -> Latn
+ {0xC9AB0000u, 44u}, // lns -> Latn
+ {0xD1AB0000u, 44u}, // lnu -> Latn
+ {0x6C6F0000u, 43u}, // lo -> Laoo
+ {0xA5CB0000u, 44u}, // loj -> Latn
+ {0xA9CB0000u, 44u}, // lok -> Latn
+ {0xADCB0000u, 44u}, // lol -> Latn
+ {0xC5CB0000u, 44u}, // lor -> Latn
+ {0xC9CB0000u, 44u}, // los -> Latn
+ {0xE5CB0000u, 44u}, // loz -> Latn
{0x8A2B0000u, 1u}, // lrc -> Arab
- {0x6C740000u, 40u}, // lt -> Latn
- {0x9A6B0000u, 40u}, // ltg -> Latn
- {0x6C750000u, 40u}, // lu -> Latn
- {0x828B0000u, 40u}, // lua -> Latn
- {0xBA8B0000u, 40u}, // luo -> Latn
- {0xE28B0000u, 40u}, // luy -> Latn
+ {0x6C740000u, 44u}, // lt -> Latn
+ {0x9A6B0000u, 44u}, // ltg -> Latn
+ {0x6C750000u, 44u}, // lu -> Latn
+ {0x828B0000u, 44u}, // lua -> Latn
+ {0xBA8B0000u, 44u}, // luo -> Latn
+ {0xE28B0000u, 44u}, // luy -> Latn
{0xE68B0000u, 1u}, // luz -> Arab
- {0x6C760000u, 40u}, // lv -> Latn
- {0xAECB0000u, 80u}, // lwl -> Thai
- {0x9F2B0000u, 24u}, // lzh -> Hans
- {0xE72B0000u, 40u}, // lzz -> Latn
- {0x8C0C0000u, 40u}, // mad -> Latn
- {0x940C0000u, 40u}, // maf -> Latn
- {0x980C0000u, 16u}, // mag -> Deva
- {0xA00C0000u, 16u}, // mai -> Deva
- {0xA80C0000u, 40u}, // mak -> Latn
- {0xB40C0000u, 40u}, // man -> Latn
- {0xB40C474Eu, 54u}, // man-GN -> Nkoo
- {0xC80C0000u, 40u}, // mas -> Latn
- {0xD80C0000u, 40u}, // maw -> Latn
- {0xE40C0000u, 40u}, // maz -> Latn
- {0x9C2C0000u, 40u}, // mbh -> Latn
- {0xB82C0000u, 40u}, // mbo -> Latn
- {0xC02C0000u, 40u}, // mbq -> Latn
- {0xD02C0000u, 40u}, // mbu -> Latn
- {0xD82C0000u, 40u}, // mbw -> Latn
- {0xA04C0000u, 40u}, // mci -> Latn
- {0xBC4C0000u, 40u}, // mcp -> Latn
- {0xC04C0000u, 40u}, // mcq -> Latn
- {0xC44C0000u, 40u}, // mcr -> Latn
- {0xD04C0000u, 40u}, // mcu -> Latn
- {0x806C0000u, 40u}, // mda -> Latn
+ {0x6C760000u, 44u}, // lv -> Latn
+ {0xAECB0000u, 87u}, // lwl -> Thai
+ {0x9F2B0000u, 27u}, // lzh -> Hans
+ {0xE72B0000u, 44u}, // lzz -> Latn
+ {0x8C0C0000u, 44u}, // mad -> Latn
+ {0x940C0000u, 44u}, // maf -> Latn
+ {0x980C0000u, 17u}, // mag -> Deva
+ {0xA00C0000u, 17u}, // mai -> Deva
+ {0xA80C0000u, 44u}, // mak -> Latn
+ {0xB40C0000u, 44u}, // man -> Latn
+ {0xB40C474Eu, 58u}, // man-GN -> Nkoo
+ {0xC80C0000u, 44u}, // mas -> Latn
+ {0xD80C0000u, 44u}, // maw -> Latn
+ {0xE40C0000u, 44u}, // maz -> Latn
+ {0x9C2C0000u, 44u}, // mbh -> Latn
+ {0xB82C0000u, 44u}, // mbo -> Latn
+ {0xC02C0000u, 44u}, // mbq -> Latn
+ {0xD02C0000u, 44u}, // mbu -> Latn
+ {0xD82C0000u, 44u}, // mbw -> Latn
+ {0xA04C0000u, 44u}, // mci -> Latn
+ {0xBC4C0000u, 44u}, // mcp -> Latn
+ {0xC04C0000u, 44u}, // mcq -> Latn
+ {0xC44C0000u, 44u}, // mcr -> Latn
+ {0xD04C0000u, 44u}, // mcu -> Latn
+ {0x806C0000u, 44u}, // mda -> Latn
{0x906C0000u, 1u}, // mde -> Arab
- {0x946C0000u, 15u}, // mdf -> Cyrl
- {0x9C6C0000u, 40u}, // mdh -> Latn
- {0xA46C0000u, 40u}, // mdj -> Latn
- {0xC46C0000u, 40u}, // mdr -> Latn
- {0xDC6C0000u, 18u}, // mdx -> Ethi
- {0x8C8C0000u, 40u}, // med -> Latn
- {0x908C0000u, 40u}, // mee -> Latn
- {0xA88C0000u, 40u}, // mek -> Latn
- {0xB48C0000u, 40u}, // men -> Latn
- {0xC48C0000u, 40u}, // mer -> Latn
- {0xCC8C0000u, 40u}, // met -> Latn
- {0xD08C0000u, 40u}, // meu -> Latn
+ {0x946C0000u, 16u}, // mdf -> Cyrl
+ {0x9C6C0000u, 44u}, // mdh -> Latn
+ {0xA46C0000u, 44u}, // mdj -> Latn
+ {0xC46C0000u, 44u}, // mdr -> Latn
+ {0xDC6C0000u, 19u}, // mdx -> Ethi
+ {0x8C8C0000u, 44u}, // med -> Latn
+ {0x908C0000u, 44u}, // mee -> Latn
+ {0xA88C0000u, 44u}, // mek -> Latn
+ {0xB48C0000u, 44u}, // men -> Latn
+ {0xC48C0000u, 44u}, // mer -> Latn
+ {0xCC8C0000u, 44u}, // met -> Latn
+ {0xD08C0000u, 44u}, // meu -> Latn
{0x80AC0000u, 1u}, // mfa -> Arab
- {0x90AC0000u, 40u}, // mfe -> Latn
- {0xB4AC0000u, 40u}, // mfn -> Latn
- {0xB8AC0000u, 40u}, // mfo -> Latn
- {0xC0AC0000u, 40u}, // mfq -> Latn
- {0x6D670000u, 40u}, // mg -> Latn
- {0x9CCC0000u, 40u}, // mgh -> Latn
- {0xACCC0000u, 40u}, // mgl -> Latn
- {0xB8CC0000u, 40u}, // mgo -> Latn
- {0xBCCC0000u, 16u}, // mgp -> Deva
- {0xE0CC0000u, 40u}, // mgy -> Latn
- {0x6D680000u, 40u}, // mh -> Latn
- {0xA0EC0000u, 40u}, // mhi -> Latn
- {0xACEC0000u, 40u}, // mhl -> Latn
- {0x6D690000u, 40u}, // mi -> Latn
- {0x950C0000u, 40u}, // mif -> Latn
- {0xB50C0000u, 40u}, // min -> Latn
- {0xC90C0000u, 26u}, // mis -> Hatr
- {0xD90C0000u, 40u}, // miw -> Latn
- {0x6D6B0000u, 15u}, // mk -> Cyrl
+ {0x90AC0000u, 44u}, // mfe -> Latn
+ {0xB4AC0000u, 44u}, // mfn -> Latn
+ {0xB8AC0000u, 44u}, // mfo -> Latn
+ {0xC0AC0000u, 44u}, // mfq -> Latn
+ {0x6D670000u, 44u}, // mg -> Latn
+ {0x9CCC0000u, 44u}, // mgh -> Latn
+ {0xACCC0000u, 44u}, // mgl -> Latn
+ {0xB8CC0000u, 44u}, // mgo -> Latn
+ {0xBCCC0000u, 17u}, // mgp -> Deva
+ {0xE0CC0000u, 44u}, // mgy -> Latn
+ {0x6D680000u, 44u}, // mh -> Latn
+ {0xA0EC0000u, 44u}, // mhi -> Latn
+ {0xACEC0000u, 44u}, // mhl -> Latn
+ {0x6D690000u, 44u}, // mi -> Latn
+ {0x950C0000u, 44u}, // mif -> Latn
+ {0xB50C0000u, 44u}, // min -> Latn
+ {0xC90C0000u, 29u}, // mis -> Hatr
+ {0xD90C0000u, 44u}, // miw -> Latn
+ {0x6D6B0000u, 16u}, // mk -> Cyrl
{0xA14C0000u, 1u}, // mki -> Arab
- {0xAD4C0000u, 40u}, // mkl -> Latn
- {0xBD4C0000u, 40u}, // mkp -> Latn
- {0xD94C0000u, 40u}, // mkw -> Latn
- {0x6D6C0000u, 49u}, // ml -> Mlym
- {0x916C0000u, 40u}, // mle -> Latn
- {0xBD6C0000u, 40u}, // mlp -> Latn
- {0xC96C0000u, 40u}, // mls -> Latn
- {0xB98C0000u, 40u}, // mmo -> Latn
- {0xD18C0000u, 40u}, // mmu -> Latn
- {0xDD8C0000u, 40u}, // mmx -> Latn
- {0x6D6E0000u, 15u}, // mn -> Cyrl
- {0x6D6E434Eu, 50u}, // mn-CN -> Mong
- {0x81AC0000u, 40u}, // mna -> Latn
- {0x95AC0000u, 40u}, // mnf -> Latn
+ {0xAD4C0000u, 44u}, // mkl -> Latn
+ {0xBD4C0000u, 44u}, // mkp -> Latn
+ {0xD94C0000u, 44u}, // mkw -> Latn
+ {0x6D6C0000u, 53u}, // ml -> Mlym
+ {0x916C0000u, 44u}, // mle -> Latn
+ {0xBD6C0000u, 44u}, // mlp -> Latn
+ {0xC96C0000u, 44u}, // mls -> Latn
+ {0xB98C0000u, 44u}, // mmo -> Latn
+ {0xD18C0000u, 44u}, // mmu -> Latn
+ {0xDD8C0000u, 44u}, // mmx -> Latn
+ {0x6D6E0000u, 16u}, // mn -> Cyrl
+ {0x6D6E434Eu, 54u}, // mn-CN -> Mong
+ {0x81AC0000u, 44u}, // mna -> Latn
+ {0x95AC0000u, 44u}, // mnf -> Latn
{0xA1AC0000u, 7u}, // mni -> Beng
- {0xD9AC0000u, 52u}, // mnw -> Mymr
- {0x81CC0000u, 40u}, // moa -> Latn
- {0x91CC0000u, 40u}, // moe -> Latn
- {0x9DCC0000u, 40u}, // moh -> Latn
- {0xC9CC0000u, 40u}, // mos -> Latn
- {0xDDCC0000u, 40u}, // mox -> Latn
- {0xBDEC0000u, 40u}, // mpp -> Latn
- {0xC9EC0000u, 40u}, // mps -> Latn
- {0xCDEC0000u, 40u}, // mpt -> Latn
- {0xDDEC0000u, 40u}, // mpx -> Latn
- {0xAE0C0000u, 40u}, // mql -> Latn
- {0x6D720000u, 16u}, // mr -> Deva
- {0x8E2C0000u, 16u}, // mrd -> Deva
- {0xA62C0000u, 15u}, // mrj -> Cyrl
- {0xBA2C0000u, 51u}, // mro -> Mroo
- {0x6D730000u, 40u}, // ms -> Latn
+ {0xD9AC0000u, 56u}, // mnw -> Mymr
+ {0x81CC0000u, 44u}, // moa -> Latn
+ {0x91CC0000u, 44u}, // moe -> Latn
+ {0x9DCC0000u, 44u}, // moh -> Latn
+ {0xC9CC0000u, 44u}, // mos -> Latn
+ {0xDDCC0000u, 44u}, // mox -> Latn
+ {0xBDEC0000u, 44u}, // mpp -> Latn
+ {0xC9EC0000u, 44u}, // mps -> Latn
+ {0xCDEC0000u, 44u}, // mpt -> Latn
+ {0xDDEC0000u, 44u}, // mpx -> Latn
+ {0xAE0C0000u, 44u}, // mql -> Latn
+ {0x6D720000u, 17u}, // mr -> Deva
+ {0x8E2C0000u, 17u}, // mrd -> Deva
+ {0xA62C0000u, 16u}, // mrj -> Cyrl
+ {0xBA2C0000u, 55u}, // mro -> Mroo
+ {0x6D730000u, 44u}, // ms -> Latn
{0x6D734343u, 1u}, // ms-CC -> Arab
{0x6D734944u, 1u}, // ms-ID -> Arab
- {0x6D740000u, 40u}, // mt -> Latn
- {0x8A6C0000u, 40u}, // mtc -> Latn
- {0x966C0000u, 40u}, // mtf -> Latn
- {0xA26C0000u, 40u}, // mti -> Latn
- {0xC66C0000u, 16u}, // mtr -> Deva
- {0x828C0000u, 40u}, // mua -> Latn
- {0xC68C0000u, 40u}, // mur -> Latn
- {0xCA8C0000u, 40u}, // mus -> Latn
- {0x82AC0000u, 40u}, // mva -> Latn
- {0xB6AC0000u, 40u}, // mvn -> Latn
+ {0x6D740000u, 44u}, // mt -> Latn
+ {0x8A6C0000u, 44u}, // mtc -> Latn
+ {0x966C0000u, 44u}, // mtf -> Latn
+ {0xA26C0000u, 44u}, // mti -> Latn
+ {0xC66C0000u, 17u}, // mtr -> Deva
+ {0x828C0000u, 44u}, // mua -> Latn
+ {0xC68C0000u, 44u}, // mur -> Latn
+ {0xCA8C0000u, 44u}, // mus -> Latn
+ {0x82AC0000u, 44u}, // mva -> Latn
+ {0xB6AC0000u, 44u}, // mvn -> Latn
{0xE2AC0000u, 1u}, // mvy -> Arab
- {0xAACC0000u, 40u}, // mwk -> Latn
- {0xC6CC0000u, 16u}, // mwr -> Deva
- {0xD6CC0000u, 40u}, // mwv -> Latn
- {0x8AEC0000u, 40u}, // mxc -> Latn
- {0xB2EC0000u, 40u}, // mxm -> Latn
- {0x6D790000u, 52u}, // my -> Mymr
- {0xAB0C0000u, 40u}, // myk -> Latn
- {0xB30C0000u, 18u}, // mym -> Ethi
- {0xD70C0000u, 15u}, // myv -> Cyrl
- {0xDB0C0000u, 40u}, // myw -> Latn
- {0xDF0C0000u, 40u}, // myx -> Latn
- {0xE70C0000u, 46u}, // myz -> Mand
- {0xAB2C0000u, 40u}, // mzk -> Latn
- {0xB32C0000u, 40u}, // mzm -> Latn
+ {0xAACC0000u, 44u}, // mwk -> Latn
+ {0xC6CC0000u, 17u}, // mwr -> Deva
+ {0xD6CC0000u, 44u}, // mwv -> Latn
+ {0xDACC0000u, 33u}, // mww -> Hmnp
+ {0x8AEC0000u, 44u}, // mxc -> Latn
+ {0xB2EC0000u, 44u}, // mxm -> Latn
+ {0x6D790000u, 56u}, // my -> Mymr
+ {0xAB0C0000u, 44u}, // myk -> Latn
+ {0xB30C0000u, 19u}, // mym -> Ethi
+ {0xD70C0000u, 16u}, // myv -> Cyrl
+ {0xDB0C0000u, 44u}, // myw -> Latn
+ {0xDF0C0000u, 44u}, // myx -> Latn
+ {0xE70C0000u, 50u}, // myz -> Mand
+ {0xAB2C0000u, 44u}, // mzk -> Latn
+ {0xB32C0000u, 44u}, // mzm -> Latn
{0xB72C0000u, 1u}, // mzn -> Arab
- {0xBF2C0000u, 40u}, // mzp -> Latn
- {0xDB2C0000u, 40u}, // mzw -> Latn
- {0xE72C0000u, 40u}, // mzz -> Latn
- {0x6E610000u, 40u}, // na -> Latn
- {0x880D0000u, 40u}, // nac -> Latn
- {0x940D0000u, 40u}, // naf -> Latn
- {0xA80D0000u, 40u}, // nak -> Latn
- {0xB40D0000u, 24u}, // nan -> Hans
- {0xBC0D0000u, 40u}, // nap -> Latn
- {0xC00D0000u, 40u}, // naq -> Latn
- {0xC80D0000u, 40u}, // nas -> Latn
- {0x6E620000u, 40u}, // nb -> Latn
- {0x804D0000u, 40u}, // nca -> Latn
- {0x904D0000u, 40u}, // nce -> Latn
- {0x944D0000u, 40u}, // ncf -> Latn
- {0x9C4D0000u, 40u}, // nch -> Latn
- {0xB84D0000u, 40u}, // nco -> Latn
- {0xD04D0000u, 40u}, // ncu -> Latn
- {0x6E640000u, 40u}, // nd -> Latn
- {0x886D0000u, 40u}, // ndc -> Latn
- {0xC86D0000u, 40u}, // nds -> Latn
- {0x6E650000u, 16u}, // ne -> Deva
- {0x848D0000u, 40u}, // neb -> Latn
- {0xD88D0000u, 16u}, // new -> Deva
- {0xDC8D0000u, 40u}, // nex -> Latn
- {0xC4AD0000u, 40u}, // nfr -> Latn
- {0x6E670000u, 40u}, // ng -> Latn
- {0x80CD0000u, 40u}, // nga -> Latn
- {0x84CD0000u, 40u}, // ngb -> Latn
- {0xACCD0000u, 40u}, // ngl -> Latn
- {0x84ED0000u, 40u}, // nhb -> Latn
- {0x90ED0000u, 40u}, // nhe -> Latn
- {0xD8ED0000u, 40u}, // nhw -> Latn
- {0x950D0000u, 40u}, // nif -> Latn
- {0xA10D0000u, 40u}, // nii -> Latn
- {0xA50D0000u, 40u}, // nij -> Latn
- {0xB50D0000u, 40u}, // nin -> Latn
- {0xD10D0000u, 40u}, // niu -> Latn
- {0xE10D0000u, 40u}, // niy -> Latn
- {0xE50D0000u, 40u}, // niz -> Latn
- {0xB92D0000u, 40u}, // njo -> Latn
- {0x994D0000u, 40u}, // nkg -> Latn
- {0xB94D0000u, 40u}, // nko -> Latn
- {0x6E6C0000u, 40u}, // nl -> Latn
- {0x998D0000u, 40u}, // nmg -> Latn
- {0xE58D0000u, 40u}, // nmz -> Latn
- {0x6E6E0000u, 40u}, // nn -> Latn
- {0x95AD0000u, 40u}, // nnf -> Latn
- {0x9DAD0000u, 40u}, // nnh -> Latn
- {0xA9AD0000u, 40u}, // nnk -> Latn
- {0xB1AD0000u, 40u}, // nnm -> Latn
- {0x6E6F0000u, 40u}, // no -> Latn
- {0x8DCD0000u, 38u}, // nod -> Lana
- {0x91CD0000u, 16u}, // noe -> Deva
- {0xB5CD0000u, 64u}, // non -> Runr
- {0xBDCD0000u, 40u}, // nop -> Latn
- {0xD1CD0000u, 40u}, // nou -> Latn
- {0xBA0D0000u, 54u}, // nqo -> Nkoo
- {0x6E720000u, 40u}, // nr -> Latn
- {0x862D0000u, 40u}, // nrb -> Latn
- {0xAA4D0000u, 9u}, // nsk -> Cans
- {0xB64D0000u, 40u}, // nsn -> Latn
- {0xBA4D0000u, 40u}, // nso -> Latn
- {0xCA4D0000u, 40u}, // nss -> Latn
- {0xB26D0000u, 40u}, // ntm -> Latn
- {0xC66D0000u, 40u}, // ntr -> Latn
- {0xA28D0000u, 40u}, // nui -> Latn
- {0xBE8D0000u, 40u}, // nup -> Latn
- {0xCA8D0000u, 40u}, // nus -> Latn
- {0xD68D0000u, 40u}, // nuv -> Latn
- {0xDE8D0000u, 40u}, // nux -> Latn
- {0x6E760000u, 40u}, // nv -> Latn
- {0x86CD0000u, 40u}, // nwb -> Latn
- {0xC2ED0000u, 40u}, // nxq -> Latn
- {0xC6ED0000u, 40u}, // nxr -> Latn
- {0x6E790000u, 40u}, // ny -> Latn
- {0xB30D0000u, 40u}, // nym -> Latn
- {0xB70D0000u, 40u}, // nyn -> Latn
- {0xA32D0000u, 40u}, // nzi -> Latn
- {0x6F630000u, 40u}, // oc -> Latn
- {0x88CE0000u, 40u}, // ogc -> Latn
- {0xC54E0000u, 40u}, // okr -> Latn
- {0xD54E0000u, 40u}, // okv -> Latn
- {0x6F6D0000u, 40u}, // om -> Latn
- {0x99AE0000u, 40u}, // ong -> Latn
- {0xB5AE0000u, 40u}, // onn -> Latn
- {0xC9AE0000u, 40u}, // ons -> Latn
- {0xB1EE0000u, 40u}, // opm -> Latn
- {0x6F720000u, 57u}, // or -> Orya
- {0xBA2E0000u, 40u}, // oro -> Latn
+ {0xBF2C0000u, 44u}, // mzp -> Latn
+ {0xDB2C0000u, 44u}, // mzw -> Latn
+ {0xE72C0000u, 44u}, // mzz -> Latn
+ {0x6E610000u, 44u}, // na -> Latn
+ {0x880D0000u, 44u}, // nac -> Latn
+ {0x940D0000u, 44u}, // naf -> Latn
+ {0xA80D0000u, 44u}, // nak -> Latn
+ {0xB40D0000u, 27u}, // nan -> Hans
+ {0xBC0D0000u, 44u}, // nap -> Latn
+ {0xC00D0000u, 44u}, // naq -> Latn
+ {0xC80D0000u, 44u}, // nas -> Latn
+ {0x6E620000u, 44u}, // nb -> Latn
+ {0x804D0000u, 44u}, // nca -> Latn
+ {0x904D0000u, 44u}, // nce -> Latn
+ {0x944D0000u, 44u}, // ncf -> Latn
+ {0x9C4D0000u, 44u}, // nch -> Latn
+ {0xB84D0000u, 44u}, // nco -> Latn
+ {0xD04D0000u, 44u}, // ncu -> Latn
+ {0x6E640000u, 44u}, // nd -> Latn
+ {0x886D0000u, 44u}, // ndc -> Latn
+ {0xC86D0000u, 44u}, // nds -> Latn
+ {0x6E650000u, 17u}, // ne -> Deva
+ {0x848D0000u, 44u}, // neb -> Latn
+ {0xD88D0000u, 17u}, // new -> Deva
+ {0xDC8D0000u, 44u}, // nex -> Latn
+ {0xC4AD0000u, 44u}, // nfr -> Latn
+ {0x6E670000u, 44u}, // ng -> Latn
+ {0x80CD0000u, 44u}, // nga -> Latn
+ {0x84CD0000u, 44u}, // ngb -> Latn
+ {0xACCD0000u, 44u}, // ngl -> Latn
+ {0x84ED0000u, 44u}, // nhb -> Latn
+ {0x90ED0000u, 44u}, // nhe -> Latn
+ {0xD8ED0000u, 44u}, // nhw -> Latn
+ {0x950D0000u, 44u}, // nif -> Latn
+ {0xA10D0000u, 44u}, // nii -> Latn
+ {0xA50D0000u, 44u}, // nij -> Latn
+ {0xB50D0000u, 44u}, // nin -> Latn
+ {0xD10D0000u, 44u}, // niu -> Latn
+ {0xE10D0000u, 44u}, // niy -> Latn
+ {0xE50D0000u, 44u}, // niz -> Latn
+ {0xB92D0000u, 44u}, // njo -> Latn
+ {0x994D0000u, 44u}, // nkg -> Latn
+ {0xB94D0000u, 44u}, // nko -> Latn
+ {0x6E6C0000u, 44u}, // nl -> Latn
+ {0x998D0000u, 44u}, // nmg -> Latn
+ {0xE58D0000u, 44u}, // nmz -> Latn
+ {0x6E6E0000u, 44u}, // nn -> Latn
+ {0x95AD0000u, 44u}, // nnf -> Latn
+ {0x9DAD0000u, 44u}, // nnh -> Latn
+ {0xA9AD0000u, 44u}, // nnk -> Latn
+ {0xB1AD0000u, 44u}, // nnm -> Latn
+ {0xBDAD0000u, 91u}, // nnp -> Wcho
+ {0x6E6F0000u, 44u}, // no -> Latn
+ {0x8DCD0000u, 42u}, // nod -> Lana
+ {0x91CD0000u, 17u}, // noe -> Deva
+ {0xB5CD0000u, 69u}, // non -> Runr
+ {0xBDCD0000u, 44u}, // nop -> Latn
+ {0xD1CD0000u, 44u}, // nou -> Latn
+ {0xBA0D0000u, 58u}, // nqo -> Nkoo
+ {0x6E720000u, 44u}, // nr -> Latn
+ {0x862D0000u, 44u}, // nrb -> Latn
+ {0xAA4D0000u, 10u}, // nsk -> Cans
+ {0xB64D0000u, 44u}, // nsn -> Latn
+ {0xBA4D0000u, 44u}, // nso -> Latn
+ {0xCA4D0000u, 44u}, // nss -> Latn
+ {0xB26D0000u, 44u}, // ntm -> Latn
+ {0xC66D0000u, 44u}, // ntr -> Latn
+ {0xA28D0000u, 44u}, // nui -> Latn
+ {0xBE8D0000u, 44u}, // nup -> Latn
+ {0xCA8D0000u, 44u}, // nus -> Latn
+ {0xD68D0000u, 44u}, // nuv -> Latn
+ {0xDE8D0000u, 44u}, // nux -> Latn
+ {0x6E760000u, 44u}, // nv -> Latn
+ {0x86CD0000u, 44u}, // nwb -> Latn
+ {0xC2ED0000u, 44u}, // nxq -> Latn
+ {0xC6ED0000u, 44u}, // nxr -> Latn
+ {0x6E790000u, 44u}, // ny -> Latn
+ {0xB30D0000u, 44u}, // nym -> Latn
+ {0xB70D0000u, 44u}, // nyn -> Latn
+ {0xA32D0000u, 44u}, // nzi -> Latn
+ {0x6F630000u, 44u}, // oc -> Latn
+ {0x88CE0000u, 44u}, // ogc -> Latn
+ {0xC54E0000u, 44u}, // okr -> Latn
+ {0xD54E0000u, 44u}, // okv -> Latn
+ {0x6F6D0000u, 44u}, // om -> Latn
+ {0x99AE0000u, 44u}, // ong -> Latn
+ {0xB5AE0000u, 44u}, // onn -> Latn
+ {0xC9AE0000u, 44u}, // ons -> Latn
+ {0xB1EE0000u, 44u}, // opm -> Latn
+ {0x6F720000u, 62u}, // or -> Orya
+ {0xBA2E0000u, 44u}, // oro -> Latn
{0xD22E0000u, 1u}, // oru -> Arab
- {0x6F730000u, 15u}, // os -> Cyrl
- {0x824E0000u, 58u}, // osa -> Osge
+ {0x6F730000u, 16u}, // os -> Cyrl
+ {0x824E0000u, 63u}, // osa -> Osge
{0x826E0000u, 1u}, // ota -> Arab
- {0xAA6E0000u, 56u}, // otk -> Orkh
- {0xB32E0000u, 40u}, // ozm -> Latn
- {0x70610000u, 23u}, // pa -> Guru
+ {0xAA6E0000u, 61u}, // otk -> Orkh
+ {0xB32E0000u, 44u}, // ozm -> Latn
+ {0x70610000u, 26u}, // pa -> Guru
{0x7061504Bu, 1u}, // pa-PK -> Arab
- {0x980F0000u, 40u}, // pag -> Latn
- {0xAC0F0000u, 60u}, // pal -> Phli
- {0xB00F0000u, 40u}, // pam -> Latn
- {0xBC0F0000u, 40u}, // pap -> Latn
- {0xD00F0000u, 40u}, // pau -> Latn
- {0xA02F0000u, 40u}, // pbi -> Latn
- {0x8C4F0000u, 40u}, // pcd -> Latn
- {0xB04F0000u, 40u}, // pcm -> Latn
- {0x886F0000u, 40u}, // pdc -> Latn
- {0xCC6F0000u, 40u}, // pdt -> Latn
- {0x8C8F0000u, 40u}, // ped -> Latn
- {0xB88F0000u, 84u}, // peo -> Xpeo
- {0xDC8F0000u, 40u}, // pex -> Latn
- {0xACAF0000u, 40u}, // pfl -> Latn
+ {0x980F0000u, 44u}, // pag -> Latn
+ {0xAC0F0000u, 65u}, // pal -> Phli
+ {0xB00F0000u, 44u}, // pam -> Latn
+ {0xBC0F0000u, 44u}, // pap -> Latn
+ {0xD00F0000u, 44u}, // pau -> Latn
+ {0xA02F0000u, 44u}, // pbi -> Latn
+ {0x8C4F0000u, 44u}, // pcd -> Latn
+ {0xB04F0000u, 44u}, // pcm -> Latn
+ {0x886F0000u, 44u}, // pdc -> Latn
+ {0xCC6F0000u, 44u}, // pdt -> Latn
+ {0x8C8F0000u, 44u}, // ped -> Latn
+ {0xB88F0000u, 92u}, // peo -> Xpeo
+ {0xDC8F0000u, 44u}, // pex -> Latn
+ {0xACAF0000u, 44u}, // pfl -> Latn
{0xACEF0000u, 1u}, // phl -> Arab
- {0xB4EF0000u, 61u}, // phn -> Phnx
- {0xAD0F0000u, 40u}, // pil -> Latn
- {0xBD0F0000u, 40u}, // pip -> Latn
+ {0xB4EF0000u, 66u}, // phn -> Phnx
+ {0xAD0F0000u, 44u}, // pil -> Latn
+ {0xBD0F0000u, 44u}, // pip -> Latn
{0x814F0000u, 8u}, // pka -> Brah
- {0xB94F0000u, 40u}, // pko -> Latn
- {0x706C0000u, 40u}, // pl -> Latn
- {0x816F0000u, 40u}, // pla -> Latn
- {0xC98F0000u, 40u}, // pms -> Latn
- {0x99AF0000u, 40u}, // png -> Latn
- {0xB5AF0000u, 40u}, // pnn -> Latn
- {0xCDAF0000u, 21u}, // pnt -> Grek
- {0xB5CF0000u, 40u}, // pon -> Latn
- {0xB9EF0000u, 40u}, // ppo -> Latn
- {0x822F0000u, 34u}, // pra -> Khar
+ {0xB94F0000u, 44u}, // pko -> Latn
+ {0x706C0000u, 44u}, // pl -> Latn
+ {0x816F0000u, 44u}, // pla -> Latn
+ {0xC98F0000u, 44u}, // pms -> Latn
+ {0x99AF0000u, 44u}, // png -> Latn
+ {0xB5AF0000u, 44u}, // pnn -> Latn
+ {0xCDAF0000u, 24u}, // pnt -> Grek
+ {0xB5CF0000u, 44u}, // pon -> Latn
+ {0xB9EF0000u, 44u}, // ppo -> Latn
+ {0x822F0000u, 38u}, // pra -> Khar
{0x8E2F0000u, 1u}, // prd -> Arab
- {0x9A2F0000u, 40u}, // prg -> Latn
+ {0x9A2F0000u, 44u}, // prg -> Latn
{0x70730000u, 1u}, // ps -> Arab
- {0xCA4F0000u, 40u}, // pss -> Latn
- {0x70740000u, 40u}, // pt -> Latn
- {0xBE6F0000u, 40u}, // ptp -> Latn
- {0xD28F0000u, 40u}, // puu -> Latn
- {0x82CF0000u, 40u}, // pwa -> Latn
- {0x71750000u, 40u}, // qu -> Latn
- {0x8A900000u, 40u}, // quc -> Latn
- {0x9A900000u, 40u}, // qug -> Latn
- {0xA0110000u, 40u}, // rai -> Latn
- {0xA4110000u, 16u}, // raj -> Deva
- {0xB8110000u, 40u}, // rao -> Latn
- {0x94510000u, 40u}, // rcf -> Latn
- {0xA4910000u, 40u}, // rej -> Latn
- {0xAC910000u, 40u}, // rel -> Latn
- {0xC8910000u, 40u}, // res -> Latn
- {0xB4D10000u, 40u}, // rgn -> Latn
+ {0xCA4F0000u, 44u}, // pss -> Latn
+ {0x70740000u, 44u}, // pt -> Latn
+ {0xBE6F0000u, 44u}, // ptp -> Latn
+ {0xD28F0000u, 44u}, // puu -> Latn
+ {0x82CF0000u, 44u}, // pwa -> Latn
+ {0x71750000u, 44u}, // qu -> Latn
+ {0x8A900000u, 44u}, // quc -> Latn
+ {0x9A900000u, 44u}, // qug -> Latn
+ {0xA0110000u, 44u}, // rai -> Latn
+ {0xA4110000u, 17u}, // raj -> Deva
+ {0xB8110000u, 44u}, // rao -> Latn
+ {0x94510000u, 44u}, // rcf -> Latn
+ {0xA4910000u, 44u}, // rej -> Latn
+ {0xAC910000u, 44u}, // rel -> Latn
+ {0xC8910000u, 44u}, // res -> Latn
+ {0xB4D10000u, 44u}, // rgn -> Latn
{0x98F10000u, 1u}, // rhg -> Arab
- {0x81110000u, 40u}, // ria -> Latn
- {0x95110000u, 78u}, // rif -> Tfng
- {0x95114E4Cu, 40u}, // rif-NL -> Latn
- {0xC9310000u, 16u}, // rjs -> Deva
+ {0x81110000u, 44u}, // ria -> Latn
+ {0x95110000u, 85u}, // rif -> Tfng
+ {0x95114E4Cu, 44u}, // rif-NL -> Latn
+ {0xC9310000u, 17u}, // rjs -> Deva
{0xCD510000u, 7u}, // rkt -> Beng
- {0x726D0000u, 40u}, // rm -> Latn
- {0x95910000u, 40u}, // rmf -> Latn
- {0xB9910000u, 40u}, // rmo -> Latn
+ {0x726D0000u, 44u}, // rm -> Latn
+ {0x95910000u, 44u}, // rmf -> Latn
+ {0xB9910000u, 44u}, // rmo -> Latn
{0xCD910000u, 1u}, // rmt -> Arab
- {0xD1910000u, 40u}, // rmu -> Latn
- {0x726E0000u, 40u}, // rn -> Latn
- {0x81B10000u, 40u}, // rna -> Latn
- {0x99B10000u, 40u}, // rng -> Latn
- {0x726F0000u, 40u}, // ro -> Latn
- {0x85D10000u, 40u}, // rob -> Latn
- {0x95D10000u, 40u}, // rof -> Latn
- {0xB9D10000u, 40u}, // roo -> Latn
- {0xBA310000u, 40u}, // rro -> Latn
- {0xB2710000u, 40u}, // rtm -> Latn
- {0x72750000u, 15u}, // ru -> Cyrl
- {0x92910000u, 15u}, // rue -> Cyrl
- {0x9A910000u, 40u}, // rug -> Latn
- {0x72770000u, 40u}, // rw -> Latn
- {0xAAD10000u, 40u}, // rwk -> Latn
- {0xBAD10000u, 40u}, // rwo -> Latn
- {0xD3110000u, 33u}, // ryu -> Kana
- {0x73610000u, 16u}, // sa -> Deva
- {0x94120000u, 40u}, // saf -> Latn
- {0x9C120000u, 15u}, // sah -> Cyrl
- {0xC0120000u, 40u}, // saq -> Latn
- {0xC8120000u, 40u}, // sas -> Latn
- {0xCC120000u, 40u}, // sat -> Latn
- {0xE4120000u, 67u}, // saz -> Saur
- {0x80320000u, 40u}, // sba -> Latn
- {0x90320000u, 40u}, // sbe -> Latn
- {0xBC320000u, 40u}, // sbp -> Latn
- {0x73630000u, 40u}, // sc -> Latn
- {0xA8520000u, 16u}, // sck -> Deva
+ {0xD1910000u, 44u}, // rmu -> Latn
+ {0x726E0000u, 44u}, // rn -> Latn
+ {0x81B10000u, 44u}, // rna -> Latn
+ {0x99B10000u, 44u}, // rng -> Latn
+ {0x726F0000u, 44u}, // ro -> Latn
+ {0x85D10000u, 44u}, // rob -> Latn
+ {0x95D10000u, 44u}, // rof -> Latn
+ {0xB9D10000u, 44u}, // roo -> Latn
+ {0xBA310000u, 44u}, // rro -> Latn
+ {0xB2710000u, 44u}, // rtm -> Latn
+ {0x72750000u, 16u}, // ru -> Cyrl
+ {0x92910000u, 16u}, // rue -> Cyrl
+ {0x9A910000u, 44u}, // rug -> Latn
+ {0x72770000u, 44u}, // rw -> Latn
+ {0xAAD10000u, 44u}, // rwk -> Latn
+ {0xBAD10000u, 44u}, // rwo -> Latn
+ {0xD3110000u, 37u}, // ryu -> Kana
+ {0x73610000u, 17u}, // sa -> Deva
+ {0x94120000u, 44u}, // saf -> Latn
+ {0x9C120000u, 16u}, // sah -> Cyrl
+ {0xC0120000u, 44u}, // saq -> Latn
+ {0xC8120000u, 44u}, // sas -> Latn
+ {0xCC120000u, 44u}, // sat -> Latn
+ {0xD4120000u, 44u}, // sav -> Latn
+ {0xE4120000u, 72u}, // saz -> Saur
+ {0x80320000u, 44u}, // sba -> Latn
+ {0x90320000u, 44u}, // sbe -> Latn
+ {0xBC320000u, 44u}, // sbp -> Latn
+ {0x73630000u, 44u}, // sc -> Latn
+ {0xA8520000u, 17u}, // sck -> Deva
{0xAC520000u, 1u}, // scl -> Arab
- {0xB4520000u, 40u}, // scn -> Latn
- {0xB8520000u, 40u}, // sco -> Latn
- {0xC8520000u, 40u}, // scs -> Latn
+ {0xB4520000u, 44u}, // scn -> Latn
+ {0xB8520000u, 44u}, // sco -> Latn
+ {0xC8520000u, 44u}, // scs -> Latn
{0x73640000u, 1u}, // sd -> Arab
- {0x88720000u, 40u}, // sdc -> Latn
+ {0x88720000u, 44u}, // sdc -> Latn
{0x9C720000u, 1u}, // sdh -> Arab
- {0x73650000u, 40u}, // se -> Latn
- {0x94920000u, 40u}, // sef -> Latn
- {0x9C920000u, 40u}, // seh -> Latn
- {0xA0920000u, 40u}, // sei -> Latn
- {0xC8920000u, 40u}, // ses -> Latn
- {0x73670000u, 40u}, // sg -> Latn
- {0x80D20000u, 55u}, // sga -> Ogam
- {0xC8D20000u, 40u}, // sgs -> Latn
- {0xD8D20000u, 18u}, // sgw -> Ethi
- {0xE4D20000u, 40u}, // sgz -> Latn
- {0x73680000u, 40u}, // sh -> Latn
- {0xA0F20000u, 78u}, // shi -> Tfng
- {0xA8F20000u, 40u}, // shk -> Latn
- {0xB4F20000u, 52u}, // shn -> Mymr
+ {0x73650000u, 44u}, // se -> Latn
+ {0x94920000u, 44u}, // sef -> Latn
+ {0x9C920000u, 44u}, // seh -> Latn
+ {0xA0920000u, 44u}, // sei -> Latn
+ {0xC8920000u, 44u}, // ses -> Latn
+ {0x73670000u, 44u}, // sg -> Latn
+ {0x80D20000u, 60u}, // sga -> Ogam
+ {0xC8D20000u, 44u}, // sgs -> Latn
+ {0xD8D20000u, 19u}, // sgw -> Ethi
+ {0xE4D20000u, 44u}, // sgz -> Latn
+ {0x73680000u, 44u}, // sh -> Latn
+ {0xA0F20000u, 85u}, // shi -> Tfng
+ {0xA8F20000u, 44u}, // shk -> Latn
+ {0xB4F20000u, 56u}, // shn -> Mymr
{0xD0F20000u, 1u}, // shu -> Arab
- {0x73690000u, 69u}, // si -> Sinh
- {0x8D120000u, 40u}, // sid -> Latn
- {0x99120000u, 40u}, // sig -> Latn
- {0xAD120000u, 40u}, // sil -> Latn
- {0xB1120000u, 40u}, // sim -> Latn
- {0xC5320000u, 40u}, // sjr -> Latn
- {0x736B0000u, 40u}, // sk -> Latn
- {0x89520000u, 40u}, // skc -> Latn
+ {0x73690000u, 74u}, // si -> Sinh
+ {0x8D120000u, 44u}, // sid -> Latn
+ {0x99120000u, 44u}, // sig -> Latn
+ {0xAD120000u, 44u}, // sil -> Latn
+ {0xB1120000u, 44u}, // sim -> Latn
+ {0xC5320000u, 44u}, // sjr -> Latn
+ {0x736B0000u, 44u}, // sk -> Latn
+ {0x89520000u, 44u}, // skc -> Latn
{0xC5520000u, 1u}, // skr -> Arab
- {0xC9520000u, 40u}, // sks -> Latn
- {0x736C0000u, 40u}, // sl -> Latn
- {0x8D720000u, 40u}, // sld -> Latn
- {0xA1720000u, 40u}, // sli -> Latn
- {0xAD720000u, 40u}, // sll -> Latn
- {0xE1720000u, 40u}, // sly -> Latn
- {0x736D0000u, 40u}, // sm -> Latn
- {0x81920000u, 40u}, // sma -> Latn
- {0xA5920000u, 40u}, // smj -> Latn
- {0xB5920000u, 40u}, // smn -> Latn
- {0xBD920000u, 65u}, // smp -> Samr
- {0xC1920000u, 40u}, // smq -> Latn
- {0xC9920000u, 40u}, // sms -> Latn
- {0x736E0000u, 40u}, // sn -> Latn
- {0x89B20000u, 40u}, // snc -> Latn
- {0xA9B20000u, 40u}, // snk -> Latn
- {0xBDB20000u, 40u}, // snp -> Latn
- {0xDDB20000u, 40u}, // snx -> Latn
- {0xE1B20000u, 40u}, // sny -> Latn
- {0x736F0000u, 40u}, // so -> Latn
- {0xA9D20000u, 40u}, // sok -> Latn
- {0xC1D20000u, 40u}, // soq -> Latn
- {0xD1D20000u, 80u}, // sou -> Thai
- {0xE1D20000u, 40u}, // soy -> Latn
- {0x8DF20000u, 40u}, // spd -> Latn
- {0xADF20000u, 40u}, // spl -> Latn
- {0xC9F20000u, 40u}, // sps -> Latn
- {0x73710000u, 40u}, // sq -> Latn
- {0x73720000u, 15u}, // sr -> Cyrl
- {0x73724D45u, 40u}, // sr-ME -> Latn
- {0x7372524Fu, 40u}, // sr-RO -> Latn
- {0x73725255u, 40u}, // sr-RU -> Latn
- {0x73725452u, 40u}, // sr-TR -> Latn
- {0x86320000u, 70u}, // srb -> Sora
- {0xB6320000u, 40u}, // srn -> Latn
- {0xC6320000u, 40u}, // srr -> Latn
- {0xDE320000u, 16u}, // srx -> Deva
- {0x73730000u, 40u}, // ss -> Latn
- {0x8E520000u, 40u}, // ssd -> Latn
- {0x9A520000u, 40u}, // ssg -> Latn
- {0xE2520000u, 40u}, // ssy -> Latn
- {0x73740000u, 40u}, // st -> Latn
- {0xAA720000u, 40u}, // stk -> Latn
- {0xC2720000u, 40u}, // stq -> Latn
- {0x73750000u, 40u}, // su -> Latn
- {0x82920000u, 40u}, // sua -> Latn
- {0x92920000u, 40u}, // sue -> Latn
- {0xAA920000u, 40u}, // suk -> Latn
- {0xC6920000u, 40u}, // sur -> Latn
- {0xCA920000u, 40u}, // sus -> Latn
- {0x73760000u, 40u}, // sv -> Latn
- {0x73770000u, 40u}, // sw -> Latn
+ {0xC9520000u, 44u}, // sks -> Latn
+ {0x736C0000u, 44u}, // sl -> Latn
+ {0x8D720000u, 44u}, // sld -> Latn
+ {0xA1720000u, 44u}, // sli -> Latn
+ {0xAD720000u, 44u}, // sll -> Latn
+ {0xE1720000u, 44u}, // sly -> Latn
+ {0x736D0000u, 44u}, // sm -> Latn
+ {0x81920000u, 44u}, // sma -> Latn
+ {0xA5920000u, 44u}, // smj -> Latn
+ {0xB5920000u, 44u}, // smn -> Latn
+ {0xBD920000u, 70u}, // smp -> Samr
+ {0xC1920000u, 44u}, // smq -> Latn
+ {0xC9920000u, 44u}, // sms -> Latn
+ {0x736E0000u, 44u}, // sn -> Latn
+ {0x89B20000u, 44u}, // snc -> Latn
+ {0xA9B20000u, 44u}, // snk -> Latn
+ {0xBDB20000u, 44u}, // snp -> Latn
+ {0xDDB20000u, 44u}, // snx -> Latn
+ {0xE1B20000u, 44u}, // sny -> Latn
+ {0x736F0000u, 44u}, // so -> Latn
+ {0x99D20000u, 75u}, // sog -> Sogd
+ {0xA9D20000u, 44u}, // sok -> Latn
+ {0xC1D20000u, 44u}, // soq -> Latn
+ {0xD1D20000u, 87u}, // sou -> Thai
+ {0xE1D20000u, 44u}, // soy -> Latn
+ {0x8DF20000u, 44u}, // spd -> Latn
+ {0xADF20000u, 44u}, // spl -> Latn
+ {0xC9F20000u, 44u}, // sps -> Latn
+ {0x73710000u, 44u}, // sq -> Latn
+ {0x73720000u, 16u}, // sr -> Cyrl
+ {0x73724D45u, 44u}, // sr-ME -> Latn
+ {0x7372524Fu, 44u}, // sr-RO -> Latn
+ {0x73725255u, 44u}, // sr-RU -> Latn
+ {0x73725452u, 44u}, // sr-TR -> Latn
+ {0x86320000u, 76u}, // srb -> Sora
+ {0xB6320000u, 44u}, // srn -> Latn
+ {0xC6320000u, 44u}, // srr -> Latn
+ {0xDE320000u, 17u}, // srx -> Deva
+ {0x73730000u, 44u}, // ss -> Latn
+ {0x8E520000u, 44u}, // ssd -> Latn
+ {0x9A520000u, 44u}, // ssg -> Latn
+ {0xE2520000u, 44u}, // ssy -> Latn
+ {0x73740000u, 44u}, // st -> Latn
+ {0xAA720000u, 44u}, // stk -> Latn
+ {0xC2720000u, 44u}, // stq -> Latn
+ {0x73750000u, 44u}, // su -> Latn
+ {0x82920000u, 44u}, // sua -> Latn
+ {0x92920000u, 44u}, // sue -> Latn
+ {0xAA920000u, 44u}, // suk -> Latn
+ {0xC6920000u, 44u}, // sur -> Latn
+ {0xCA920000u, 44u}, // sus -> Latn
+ {0x73760000u, 44u}, // sv -> Latn
+ {0x73770000u, 44u}, // sw -> Latn
{0x86D20000u, 1u}, // swb -> Arab
- {0x8AD20000u, 40u}, // swc -> Latn
- {0x9AD20000u, 40u}, // swg -> Latn
- {0xBED20000u, 40u}, // swp -> Latn
- {0xD6D20000u, 16u}, // swv -> Deva
- {0xB6F20000u, 40u}, // sxn -> Latn
- {0xDAF20000u, 40u}, // sxw -> Latn
+ {0x8AD20000u, 44u}, // swc -> Latn
+ {0x9AD20000u, 44u}, // swg -> Latn
+ {0xBED20000u, 44u}, // swp -> Latn
+ {0xD6D20000u, 17u}, // swv -> Deva
+ {0xB6F20000u, 44u}, // sxn -> Latn
+ {0xDAF20000u, 44u}, // sxw -> Latn
{0xAF120000u, 7u}, // syl -> Beng
- {0xC7120000u, 71u}, // syr -> Syrc
- {0xAF320000u, 40u}, // szl -> Latn
- {0x74610000u, 74u}, // ta -> Taml
- {0xA4130000u, 16u}, // taj -> Deva
- {0xAC130000u, 40u}, // tal -> Latn
- {0xB4130000u, 40u}, // tan -> Latn
- {0xC0130000u, 40u}, // taq -> Latn
- {0x88330000u, 40u}, // tbc -> Latn
- {0x8C330000u, 40u}, // tbd -> Latn
- {0x94330000u, 40u}, // tbf -> Latn
- {0x98330000u, 40u}, // tbg -> Latn
- {0xB8330000u, 40u}, // tbo -> Latn
- {0xD8330000u, 40u}, // tbw -> Latn
- {0xE4330000u, 40u}, // tbz -> Latn
- {0xA0530000u, 40u}, // tci -> Latn
- {0xE0530000u, 36u}, // tcy -> Knda
- {0x8C730000u, 72u}, // tdd -> Tale
- {0x98730000u, 16u}, // tdg -> Deva
- {0x9C730000u, 16u}, // tdh -> Deva
- {0x74650000u, 77u}, // te -> Telu
- {0x8C930000u, 40u}, // ted -> Latn
- {0xB0930000u, 40u}, // tem -> Latn
- {0xB8930000u, 40u}, // teo -> Latn
- {0xCC930000u, 40u}, // tet -> Latn
- {0xA0B30000u, 40u}, // tfi -> Latn
- {0x74670000u, 15u}, // tg -> Cyrl
+ {0xC7120000u, 78u}, // syr -> Syrc
+ {0xAF320000u, 44u}, // szl -> Latn
+ {0x74610000u, 81u}, // ta -> Taml
+ {0xA4130000u, 17u}, // taj -> Deva
+ {0xAC130000u, 44u}, // tal -> Latn
+ {0xB4130000u, 44u}, // tan -> Latn
+ {0xC0130000u, 44u}, // taq -> Latn
+ {0x88330000u, 44u}, // tbc -> Latn
+ {0x8C330000u, 44u}, // tbd -> Latn
+ {0x94330000u, 44u}, // tbf -> Latn
+ {0x98330000u, 44u}, // tbg -> Latn
+ {0xB8330000u, 44u}, // tbo -> Latn
+ {0xD8330000u, 44u}, // tbw -> Latn
+ {0xE4330000u, 44u}, // tbz -> Latn
+ {0xA0530000u, 44u}, // tci -> Latn
+ {0xE0530000u, 40u}, // tcy -> Knda
+ {0x8C730000u, 79u}, // tdd -> Tale
+ {0x98730000u, 17u}, // tdg -> Deva
+ {0x9C730000u, 17u}, // tdh -> Deva
+ {0x74650000u, 84u}, // te -> Telu
+ {0x8C930000u, 44u}, // ted -> Latn
+ {0xB0930000u, 44u}, // tem -> Latn
+ {0xB8930000u, 44u}, // teo -> Latn
+ {0xCC930000u, 44u}, // tet -> Latn
+ {0xA0B30000u, 44u}, // tfi -> Latn
+ {0x74670000u, 16u}, // tg -> Cyrl
{0x7467504Bu, 1u}, // tg-PK -> Arab
- {0x88D30000u, 40u}, // tgc -> Latn
- {0xB8D30000u, 40u}, // tgo -> Latn
- {0xD0D30000u, 40u}, // tgu -> Latn
- {0x74680000u, 80u}, // th -> Thai
- {0xACF30000u, 16u}, // thl -> Deva
- {0xC0F30000u, 16u}, // thq -> Deva
- {0xC4F30000u, 16u}, // thr -> Deva
- {0x74690000u, 18u}, // ti -> Ethi
- {0x95130000u, 40u}, // tif -> Latn
- {0x99130000u, 18u}, // tig -> Ethi
- {0xA9130000u, 40u}, // tik -> Latn
- {0xB1130000u, 40u}, // tim -> Latn
- {0xB9130000u, 40u}, // tio -> Latn
- {0xD5130000u, 40u}, // tiv -> Latn
- {0x746B0000u, 40u}, // tk -> Latn
- {0xAD530000u, 40u}, // tkl -> Latn
- {0xC5530000u, 40u}, // tkr -> Latn
- {0xCD530000u, 16u}, // tkt -> Deva
- {0x746C0000u, 40u}, // tl -> Latn
- {0x95730000u, 40u}, // tlf -> Latn
- {0xDD730000u, 40u}, // tlx -> Latn
- {0xE1730000u, 40u}, // tly -> Latn
- {0x9D930000u, 40u}, // tmh -> Latn
- {0xE1930000u, 40u}, // tmy -> Latn
- {0x746E0000u, 40u}, // tn -> Latn
- {0x9DB30000u, 40u}, // tnh -> Latn
- {0x746F0000u, 40u}, // to -> Latn
- {0x95D30000u, 40u}, // tof -> Latn
- {0x99D30000u, 40u}, // tog -> Latn
- {0xC1D30000u, 40u}, // toq -> Latn
- {0xA1F30000u, 40u}, // tpi -> Latn
- {0xB1F30000u, 40u}, // tpm -> Latn
- {0xE5F30000u, 40u}, // tpz -> Latn
- {0xBA130000u, 40u}, // tqo -> Latn
- {0x74720000u, 40u}, // tr -> Latn
- {0xD2330000u, 40u}, // tru -> Latn
- {0xD6330000u, 40u}, // trv -> Latn
+ {0x88D30000u, 44u}, // tgc -> Latn
+ {0xB8D30000u, 44u}, // tgo -> Latn
+ {0xD0D30000u, 44u}, // tgu -> Latn
+ {0x74680000u, 87u}, // th -> Thai
+ {0xACF30000u, 17u}, // thl -> Deva
+ {0xC0F30000u, 17u}, // thq -> Deva
+ {0xC4F30000u, 17u}, // thr -> Deva
+ {0x74690000u, 19u}, // ti -> Ethi
+ {0x95130000u, 44u}, // tif -> Latn
+ {0x99130000u, 19u}, // tig -> Ethi
+ {0xA9130000u, 44u}, // tik -> Latn
+ {0xB1130000u, 44u}, // tim -> Latn
+ {0xB9130000u, 44u}, // tio -> Latn
+ {0xD5130000u, 44u}, // tiv -> Latn
+ {0x746B0000u, 44u}, // tk -> Latn
+ {0xAD530000u, 44u}, // tkl -> Latn
+ {0xC5530000u, 44u}, // tkr -> Latn
+ {0xCD530000u, 17u}, // tkt -> Deva
+ {0x746C0000u, 44u}, // tl -> Latn
+ {0x95730000u, 44u}, // tlf -> Latn
+ {0xDD730000u, 44u}, // tlx -> Latn
+ {0xE1730000u, 44u}, // tly -> Latn
+ {0x9D930000u, 44u}, // tmh -> Latn
+ {0xE1930000u, 44u}, // tmy -> Latn
+ {0x746E0000u, 44u}, // tn -> Latn
+ {0x9DB30000u, 44u}, // tnh -> Latn
+ {0x746F0000u, 44u}, // to -> Latn
+ {0x95D30000u, 44u}, // tof -> Latn
+ {0x99D30000u, 44u}, // tog -> Latn
+ {0xC1D30000u, 44u}, // toq -> Latn
+ {0xA1F30000u, 44u}, // tpi -> Latn
+ {0xB1F30000u, 44u}, // tpm -> Latn
+ {0xE5F30000u, 44u}, // tpz -> Latn
+ {0xBA130000u, 44u}, // tqo -> Latn
+ {0x74720000u, 44u}, // tr -> Latn
+ {0xD2330000u, 44u}, // tru -> Latn
+ {0xD6330000u, 44u}, // trv -> Latn
{0xDA330000u, 1u}, // trw -> Arab
- {0x74730000u, 40u}, // ts -> Latn
- {0x8E530000u, 21u}, // tsd -> Grek
- {0x96530000u, 16u}, // tsf -> Deva
- {0x9A530000u, 40u}, // tsg -> Latn
- {0xA6530000u, 81u}, // tsj -> Tibt
- {0xDA530000u, 40u}, // tsw -> Latn
- {0x74740000u, 15u}, // tt -> Cyrl
- {0x8E730000u, 40u}, // ttd -> Latn
- {0x92730000u, 40u}, // tte -> Latn
- {0xA6730000u, 40u}, // ttj -> Latn
- {0xC6730000u, 40u}, // ttr -> Latn
- {0xCA730000u, 80u}, // tts -> Thai
- {0xCE730000u, 40u}, // ttt -> Latn
- {0x9E930000u, 40u}, // tuh -> Latn
- {0xAE930000u, 40u}, // tul -> Latn
- {0xB2930000u, 40u}, // tum -> Latn
- {0xC2930000u, 40u}, // tuq -> Latn
- {0x8EB30000u, 40u}, // tvd -> Latn
- {0xAEB30000u, 40u}, // tvl -> Latn
- {0xD2B30000u, 40u}, // tvu -> Latn
- {0x9ED30000u, 40u}, // twh -> Latn
- {0xC2D30000u, 40u}, // twq -> Latn
- {0x9AF30000u, 75u}, // txg -> Tang
- {0x74790000u, 40u}, // ty -> Latn
- {0x83130000u, 40u}, // tya -> Latn
- {0xD7130000u, 15u}, // tyv -> Cyrl
- {0xB3330000u, 40u}, // tzm -> Latn
- {0xD0340000u, 40u}, // ubu -> Latn
- {0xB0740000u, 15u}, // udm -> Cyrl
+ {0x74730000u, 44u}, // ts -> Latn
+ {0x8E530000u, 24u}, // tsd -> Grek
+ {0x96530000u, 17u}, // tsf -> Deva
+ {0x9A530000u, 44u}, // tsg -> Latn
+ {0xA6530000u, 88u}, // tsj -> Tibt
+ {0xDA530000u, 44u}, // tsw -> Latn
+ {0x74740000u, 16u}, // tt -> Cyrl
+ {0x8E730000u, 44u}, // ttd -> Latn
+ {0x92730000u, 44u}, // tte -> Latn
+ {0xA6730000u, 44u}, // ttj -> Latn
+ {0xC6730000u, 44u}, // ttr -> Latn
+ {0xCA730000u, 87u}, // tts -> Thai
+ {0xCE730000u, 44u}, // ttt -> Latn
+ {0x9E930000u, 44u}, // tuh -> Latn
+ {0xAE930000u, 44u}, // tul -> Latn
+ {0xB2930000u, 44u}, // tum -> Latn
+ {0xC2930000u, 44u}, // tuq -> Latn
+ {0x8EB30000u, 44u}, // tvd -> Latn
+ {0xAEB30000u, 44u}, // tvl -> Latn
+ {0xD2B30000u, 44u}, // tvu -> Latn
+ {0x9ED30000u, 44u}, // twh -> Latn
+ {0xC2D30000u, 44u}, // twq -> Latn
+ {0x9AF30000u, 82u}, // txg -> Tang
+ {0x74790000u, 44u}, // ty -> Latn
+ {0x83130000u, 44u}, // tya -> Latn
+ {0xD7130000u, 16u}, // tyv -> Cyrl
+ {0xB3330000u, 44u}, // tzm -> Latn
+ {0xD0340000u, 44u}, // ubu -> Latn
+ {0xB0740000u, 16u}, // udm -> Cyrl
{0x75670000u, 1u}, // ug -> Arab
- {0x75674B5Au, 15u}, // ug-KZ -> Cyrl
- {0x75674D4Eu, 15u}, // ug-MN -> Cyrl
- {0x80D40000u, 82u}, // uga -> Ugar
- {0x756B0000u, 15u}, // uk -> Cyrl
- {0xA1740000u, 40u}, // uli -> Latn
- {0x85940000u, 40u}, // umb -> Latn
+ {0x75674B5Au, 16u}, // ug-KZ -> Cyrl
+ {0x75674D4Eu, 16u}, // ug-MN -> Cyrl
+ {0x80D40000u, 89u}, // uga -> Ugar
+ {0x756B0000u, 16u}, // uk -> Cyrl
+ {0xA1740000u, 44u}, // uli -> Latn
+ {0x85940000u, 44u}, // umb -> Latn
{0xC5B40000u, 7u}, // unr -> Beng
- {0xC5B44E50u, 16u}, // unr-NP -> Deva
+ {0xC5B44E50u, 17u}, // unr-NP -> Deva
{0xDDB40000u, 7u}, // unx -> Beng
{0x75720000u, 1u}, // ur -> Arab
- {0xA2340000u, 40u}, // uri -> Latn
- {0xCE340000u, 40u}, // urt -> Latn
- {0xDA340000u, 40u}, // urw -> Latn
- {0x82540000u, 40u}, // usa -> Latn
- {0xC6740000u, 40u}, // utr -> Latn
- {0x9EB40000u, 40u}, // uvh -> Latn
- {0xAEB40000u, 40u}, // uvl -> Latn
- {0x757A0000u, 40u}, // uz -> Latn
+ {0xA2340000u, 44u}, // uri -> Latn
+ {0xCE340000u, 44u}, // urt -> Latn
+ {0xDA340000u, 44u}, // urw -> Latn
+ {0x82540000u, 44u}, // usa -> Latn
+ {0xC6740000u, 44u}, // utr -> Latn
+ {0x9EB40000u, 44u}, // uvh -> Latn
+ {0xAEB40000u, 44u}, // uvl -> Latn
+ {0x757A0000u, 44u}, // uz -> Latn
{0x757A4146u, 1u}, // uz-AF -> Arab
- {0x757A434Eu, 15u}, // uz-CN -> Cyrl
- {0x98150000u, 40u}, // vag -> Latn
- {0xA0150000u, 83u}, // vai -> Vaii
- {0xB4150000u, 40u}, // van -> Latn
- {0x76650000u, 40u}, // ve -> Latn
- {0x88950000u, 40u}, // vec -> Latn
- {0xBC950000u, 40u}, // vep -> Latn
- {0x76690000u, 40u}, // vi -> Latn
- {0x89150000u, 40u}, // vic -> Latn
- {0xD5150000u, 40u}, // viv -> Latn
- {0xC9750000u, 40u}, // vls -> Latn
- {0x95950000u, 40u}, // vmf -> Latn
- {0xD9950000u, 40u}, // vmw -> Latn
- {0x766F0000u, 40u}, // vo -> Latn
- {0xCDD50000u, 40u}, // vot -> Latn
- {0xBA350000u, 40u}, // vro -> Latn
- {0xB6950000u, 40u}, // vun -> Latn
- {0xCE950000u, 40u}, // vut -> Latn
- {0x77610000u, 40u}, // wa -> Latn
- {0x90160000u, 40u}, // wae -> Latn
- {0xA4160000u, 40u}, // waj -> Latn
- {0xAC160000u, 18u}, // wal -> Ethi
- {0xB4160000u, 40u}, // wan -> Latn
- {0xC4160000u, 40u}, // war -> Latn
- {0xBC360000u, 40u}, // wbp -> Latn
- {0xC0360000u, 77u}, // wbq -> Telu
- {0xC4360000u, 16u}, // wbr -> Deva
- {0xA0560000u, 40u}, // wci -> Latn
- {0xC4960000u, 40u}, // wer -> Latn
- {0xA0D60000u, 40u}, // wgi -> Latn
- {0x98F60000u, 40u}, // whg -> Latn
- {0x85160000u, 40u}, // wib -> Latn
- {0xD1160000u, 40u}, // wiu -> Latn
- {0xD5160000u, 40u}, // wiv -> Latn
- {0x81360000u, 40u}, // wja -> Latn
- {0xA1360000u, 40u}, // wji -> Latn
- {0xC9760000u, 40u}, // wls -> Latn
- {0xB9960000u, 40u}, // wmo -> Latn
- {0x89B60000u, 40u}, // wnc -> Latn
+ {0x757A434Eu, 16u}, // uz-CN -> Cyrl
+ {0x98150000u, 44u}, // vag -> Latn
+ {0xA0150000u, 90u}, // vai -> Vaii
+ {0xB4150000u, 44u}, // van -> Latn
+ {0x76650000u, 44u}, // ve -> Latn
+ {0x88950000u, 44u}, // vec -> Latn
+ {0xBC950000u, 44u}, // vep -> Latn
+ {0x76690000u, 44u}, // vi -> Latn
+ {0x89150000u, 44u}, // vic -> Latn
+ {0xD5150000u, 44u}, // viv -> Latn
+ {0xC9750000u, 44u}, // vls -> Latn
+ {0x95950000u, 44u}, // vmf -> Latn
+ {0xD9950000u, 44u}, // vmw -> Latn
+ {0x766F0000u, 44u}, // vo -> Latn
+ {0xCDD50000u, 44u}, // vot -> Latn
+ {0xBA350000u, 44u}, // vro -> Latn
+ {0xB6950000u, 44u}, // vun -> Latn
+ {0xCE950000u, 44u}, // vut -> Latn
+ {0x77610000u, 44u}, // wa -> Latn
+ {0x90160000u, 44u}, // wae -> Latn
+ {0xA4160000u, 44u}, // waj -> Latn
+ {0xAC160000u, 19u}, // wal -> Ethi
+ {0xB4160000u, 44u}, // wan -> Latn
+ {0xC4160000u, 44u}, // war -> Latn
+ {0xBC360000u, 44u}, // wbp -> Latn
+ {0xC0360000u, 84u}, // wbq -> Telu
+ {0xC4360000u, 17u}, // wbr -> Deva
+ {0xA0560000u, 44u}, // wci -> Latn
+ {0xC4960000u, 44u}, // wer -> Latn
+ {0xA0D60000u, 44u}, // wgi -> Latn
+ {0x98F60000u, 44u}, // whg -> Latn
+ {0x85160000u, 44u}, // wib -> Latn
+ {0xD1160000u, 44u}, // wiu -> Latn
+ {0xD5160000u, 44u}, // wiv -> Latn
+ {0x81360000u, 44u}, // wja -> Latn
+ {0xA1360000u, 44u}, // wji -> Latn
+ {0xC9760000u, 44u}, // wls -> Latn
+ {0xB9960000u, 44u}, // wmo -> Latn
+ {0x89B60000u, 44u}, // wnc -> Latn
{0xA1B60000u, 1u}, // wni -> Arab
- {0xD1B60000u, 40u}, // wnu -> Latn
- {0x776F0000u, 40u}, // wo -> Latn
- {0x85D60000u, 40u}, // wob -> Latn
- {0xC9D60000u, 40u}, // wos -> Latn
- {0xCA360000u, 40u}, // wrs -> Latn
- {0xAA560000u, 40u}, // wsk -> Latn
- {0xB2760000u, 16u}, // wtm -> Deva
- {0xD2960000u, 24u}, // wuu -> Hans
- {0xD6960000u, 40u}, // wuv -> Latn
- {0x82D60000u, 40u}, // wwa -> Latn
- {0xD4170000u, 40u}, // xav -> Latn
- {0xA0370000u, 40u}, // xbi -> Latn
- {0xC4570000u, 10u}, // xcr -> Cari
- {0xC8970000u, 40u}, // xes -> Latn
- {0x78680000u, 40u}, // xh -> Latn
- {0x81770000u, 40u}, // xla -> Latn
- {0x89770000u, 44u}, // xlc -> Lyci
- {0x8D770000u, 45u}, // xld -> Lydi
- {0x95970000u, 19u}, // xmf -> Geor
- {0xB5970000u, 47u}, // xmn -> Mani
- {0xC5970000u, 48u}, // xmr -> Merc
- {0x81B70000u, 53u}, // xna -> Narb
- {0xC5B70000u, 16u}, // xnr -> Deva
- {0x99D70000u, 40u}, // xog -> Latn
- {0xB5D70000u, 40u}, // xon -> Latn
- {0xC5F70000u, 63u}, // xpr -> Prti
- {0x86370000u, 40u}, // xrb -> Latn
- {0x82570000u, 66u}, // xsa -> Sarb
- {0xA2570000u, 40u}, // xsi -> Latn
- {0xB2570000u, 40u}, // xsm -> Latn
- {0xC6570000u, 16u}, // xsr -> Deva
- {0x92D70000u, 40u}, // xwe -> Latn
- {0xB0180000u, 40u}, // yam -> Latn
- {0xB8180000u, 40u}, // yao -> Latn
- {0xBC180000u, 40u}, // yap -> Latn
- {0xC8180000u, 40u}, // yas -> Latn
- {0xCC180000u, 40u}, // yat -> Latn
- {0xD4180000u, 40u}, // yav -> Latn
- {0xE0180000u, 40u}, // yay -> Latn
- {0xE4180000u, 40u}, // yaz -> Latn
- {0x80380000u, 40u}, // yba -> Latn
- {0x84380000u, 40u}, // ybb -> Latn
- {0xE0380000u, 40u}, // yby -> Latn
- {0xC4980000u, 40u}, // yer -> Latn
- {0xC4D80000u, 40u}, // ygr -> Latn
- {0xD8D80000u, 40u}, // ygw -> Latn
- {0x79690000u, 27u}, // yi -> Hebr
- {0xB9580000u, 40u}, // yko -> Latn
- {0x91780000u, 40u}, // yle -> Latn
- {0x99780000u, 40u}, // ylg -> Latn
- {0xAD780000u, 40u}, // yll -> Latn
- {0xAD980000u, 40u}, // yml -> Latn
- {0x796F0000u, 40u}, // yo -> Latn
- {0xB5D80000u, 40u}, // yon -> Latn
- {0x86380000u, 40u}, // yrb -> Latn
- {0x92380000u, 40u}, // yre -> Latn
- {0xAE380000u, 40u}, // yrl -> Latn
- {0xCA580000u, 40u}, // yss -> Latn
- {0x82980000u, 40u}, // yua -> Latn
- {0x92980000u, 25u}, // yue -> Hant
- {0x9298434Eu, 24u}, // yue-CN -> Hans
- {0xA6980000u, 40u}, // yuj -> Latn
- {0xCE980000u, 40u}, // yut -> Latn
- {0xDA980000u, 40u}, // yuw -> Latn
- {0x7A610000u, 40u}, // za -> Latn
- {0x98190000u, 40u}, // zag -> Latn
+ {0xD1B60000u, 44u}, // wnu -> Latn
+ {0x776F0000u, 44u}, // wo -> Latn
+ {0x85D60000u, 44u}, // wob -> Latn
+ {0xC9D60000u, 44u}, // wos -> Latn
+ {0xCA360000u, 44u}, // wrs -> Latn
+ {0x9A560000u, 21u}, // wsg -> Gong
+ {0xAA560000u, 44u}, // wsk -> Latn
+ {0xB2760000u, 17u}, // wtm -> Deva
+ {0xD2960000u, 27u}, // wuu -> Hans
+ {0xD6960000u, 44u}, // wuv -> Latn
+ {0x82D60000u, 44u}, // wwa -> Latn
+ {0xD4170000u, 44u}, // xav -> Latn
+ {0xA0370000u, 44u}, // xbi -> Latn
+ {0xC4570000u, 11u}, // xcr -> Cari
+ {0xC8970000u, 44u}, // xes -> Latn
+ {0x78680000u, 44u}, // xh -> Latn
+ {0x81770000u, 44u}, // xla -> Latn
+ {0x89770000u, 48u}, // xlc -> Lyci
+ {0x8D770000u, 49u}, // xld -> Lydi
+ {0x95970000u, 20u}, // xmf -> Geor
+ {0xB5970000u, 51u}, // xmn -> Mani
+ {0xC5970000u, 52u}, // xmr -> Merc
+ {0x81B70000u, 57u}, // xna -> Narb
+ {0xC5B70000u, 17u}, // xnr -> Deva
+ {0x99D70000u, 44u}, // xog -> Latn
+ {0xB5D70000u, 44u}, // xon -> Latn
+ {0xC5F70000u, 68u}, // xpr -> Prti
+ {0x86370000u, 44u}, // xrb -> Latn
+ {0x82570000u, 71u}, // xsa -> Sarb
+ {0xA2570000u, 44u}, // xsi -> Latn
+ {0xB2570000u, 44u}, // xsm -> Latn
+ {0xC6570000u, 17u}, // xsr -> Deva
+ {0x92D70000u, 44u}, // xwe -> Latn
+ {0xB0180000u, 44u}, // yam -> Latn
+ {0xB8180000u, 44u}, // yao -> Latn
+ {0xBC180000u, 44u}, // yap -> Latn
+ {0xC8180000u, 44u}, // yas -> Latn
+ {0xCC180000u, 44u}, // yat -> Latn
+ {0xD4180000u, 44u}, // yav -> Latn
+ {0xE0180000u, 44u}, // yay -> Latn
+ {0xE4180000u, 44u}, // yaz -> Latn
+ {0x80380000u, 44u}, // yba -> Latn
+ {0x84380000u, 44u}, // ybb -> Latn
+ {0xE0380000u, 44u}, // yby -> Latn
+ {0xC4980000u, 44u}, // yer -> Latn
+ {0xC4D80000u, 44u}, // ygr -> Latn
+ {0xD8D80000u, 44u}, // ygw -> Latn
+ {0x79690000u, 30u}, // yi -> Hebr
+ {0xB9580000u, 44u}, // yko -> Latn
+ {0x91780000u, 44u}, // yle -> Latn
+ {0x99780000u, 44u}, // ylg -> Latn
+ {0xAD780000u, 44u}, // yll -> Latn
+ {0xAD980000u, 44u}, // yml -> Latn
+ {0x796F0000u, 44u}, // yo -> Latn
+ {0xB5D80000u, 44u}, // yon -> Latn
+ {0x86380000u, 44u}, // yrb -> Latn
+ {0x92380000u, 44u}, // yre -> Latn
+ {0xAE380000u, 44u}, // yrl -> Latn
+ {0xCA580000u, 44u}, // yss -> Latn
+ {0x82980000u, 44u}, // yua -> Latn
+ {0x92980000u, 28u}, // yue -> Hant
+ {0x9298434Eu, 27u}, // yue-CN -> Hans
+ {0xA6980000u, 44u}, // yuj -> Latn
+ {0xCE980000u, 44u}, // yut -> Latn
+ {0xDA980000u, 44u}, // yuw -> Latn
+ {0x7A610000u, 44u}, // za -> Latn
+ {0x98190000u, 44u}, // zag -> Latn
{0xA4790000u, 1u}, // zdj -> Arab
- {0x80990000u, 40u}, // zea -> Latn
- {0x9CD90000u, 78u}, // zgh -> Tfng
- {0x7A680000u, 24u}, // zh -> Hans
- {0x7A684155u, 25u}, // zh-AU -> Hant
- {0x7A68424Eu, 25u}, // zh-BN -> Hant
- {0x7A684742u, 25u}, // zh-GB -> Hant
- {0x7A684746u, 25u}, // zh-GF -> Hant
- {0x7A68484Bu, 25u}, // zh-HK -> Hant
- {0x7A684944u, 25u}, // zh-ID -> Hant
- {0x7A684D4Fu, 25u}, // zh-MO -> Hant
- {0x7A684D59u, 25u}, // zh-MY -> Hant
- {0x7A685041u, 25u}, // zh-PA -> Hant
- {0x7A685046u, 25u}, // zh-PF -> Hant
- {0x7A685048u, 25u}, // zh-PH -> Hant
- {0x7A685352u, 25u}, // zh-SR -> Hant
- {0x7A685448u, 25u}, // zh-TH -> Hant
- {0x7A685457u, 25u}, // zh-TW -> Hant
- {0x7A685553u, 25u}, // zh-US -> Hant
- {0x7A68564Eu, 25u}, // zh-VN -> Hant
- {0x81190000u, 40u}, // zia -> Latn
- {0xB1790000u, 40u}, // zlm -> Latn
- {0xA1990000u, 40u}, // zmi -> Latn
- {0x91B90000u, 40u}, // zne -> Latn
- {0x7A750000u, 40u}, // zu -> Latn
- {0x83390000u, 40u}, // zza -> Latn
+ {0x80990000u, 44u}, // zea -> Latn
+ {0x9CD90000u, 85u}, // zgh -> Tfng
+ {0x7A680000u, 27u}, // zh -> Hans
+ {0x7A684155u, 28u}, // zh-AU -> Hant
+ {0x7A68424Eu, 28u}, // zh-BN -> Hant
+ {0x7A684742u, 28u}, // zh-GB -> Hant
+ {0x7A684746u, 28u}, // zh-GF -> Hant
+ {0x7A68484Bu, 28u}, // zh-HK -> Hant
+ {0x7A684944u, 28u}, // zh-ID -> Hant
+ {0x7A684D4Fu, 28u}, // zh-MO -> Hant
+ {0x7A684D59u, 28u}, // zh-MY -> Hant
+ {0x7A685041u, 28u}, // zh-PA -> Hant
+ {0x7A685046u, 28u}, // zh-PF -> Hant
+ {0x7A685048u, 28u}, // zh-PH -> Hant
+ {0x7A685352u, 28u}, // zh-SR -> Hant
+ {0x7A685448u, 28u}, // zh-TH -> Hant
+ {0x7A685457u, 28u}, // zh-TW -> Hant
+ {0x7A685553u, 28u}, // zh-US -> Hant
+ {0x7A68564Eu, 28u}, // zh-VN -> Hant
+ {0xDCF90000u, 59u}, // zhx -> Nshu
+ {0x81190000u, 44u}, // zia -> Latn
+ {0xB1790000u, 44u}, // zlm -> Latn
+ {0xA1990000u, 44u}, // zmi -> Latn
+ {0x91B90000u, 44u}, // zne -> Latn
+ {0x7A750000u, 44u}, // zu -> Latn
+ {0x83390000u, 44u}, // zza -> Latn
});
std::unordered_set<uint64_t> REPRESENTATIVE_LOCALES({
@@ -1517,6 +1544,7 @@
0xB5014E474C61746ELLU, // bin_Latn_NG
0xA521494E44657661LLU, // bjj_Deva_IN
0xB52149444C61746ELLU, // bjn_Latn_ID
+ 0xCD21534E4C61746ELLU, // bjt_Latn_SN
0xB141434D4C61746ELLU, // bkm_Latn_CM
0xD14150484C61746ELLU, // bku_Latn_PH
0xCD61564E54617674LLU, // blt_Tavt_VN
@@ -1546,7 +1574,6 @@
0x93214D4C4C61746ELLU, // bze_Latn_ML
0x636145534C61746ELLU, // ca_Latn_ES
0x9C424E474C61746ELLU, // cch_Latn_NG
- 0xBC42494E42656E67LLU, // ccp_Beng_IN
0xBC42424443616B6DLLU, // ccp_Cakm_BD
0x636552554379726CLLU, // ce_Cyrl_RU
0x848250484C61746ELLU, // ceb_Latn_PH
@@ -1560,10 +1587,12 @@
0x81224B4841726162LLU, // cja_Arab_KH
0xB122564E4368616DLLU, // cjm_Cham_VN
0x8542495141726162LLU, // ckb_Arab_IQ
+ 0x99824D4E536F796FLLU, // cmg_Soyo_MN
0x636F46524C61746ELLU, // co_Latn_FR
0xBDC24547436F7074LLU, // cop_Copt_EG
0xC9E250484C61746ELLU, // cps_Latn_PH
0x6372434143616E73LLU, // cr_Cans_CA
+ 0x9E2255414379726CLLU, // crh_Cyrl_UA
0xA622434143616E73LLU, // crj_Cans_CA
0xAA22434143616E73LLU, // crk_Cans_CA
0xAE22434143616E73LLU, // crl_Cans_CA
@@ -1610,6 +1639,7 @@
0x657345534C61746ELLU, // es_Latn_ES
0x65734D584C61746ELLU, // es_Latn_MX
0x657355534C61746ELLU, // es_Latn_US
+ 0x9A44494E476F6E6DLLU, // esg_Gonm_IN
0xD24455534C61746ELLU, // esu_Latn_US
0x657445454C61746ELLU, // et_Latn_EE
0xCE6449544974616CLLU, // ett_Ital_IT
@@ -1700,10 +1730,10 @@
0x687548554C61746ELLU, // hu_Latn_HU
0x6879414D41726D6ELLU, // hy_Armn_AM
0x687A4E414C61746ELLU, // hz_Latn_NA
- 0x696146524C61746ELLU, // ia_Latn_FR
0x80284D594C61746ELLU, // iba_Latn_MY
0x84284E474C61746ELLU, // ibb_Latn_NG
0x696449444C61746ELLU, // id_Latn_ID
+ 0x90A854474C61746ELLU, // ife_Latn_TG
0x69674E474C61746ELLU, // ig_Latn_NG
0x6969434E59696969LLU, // ii_Yiii_CN
0x696B55534C61746ELLU, // ik_Latn_US
@@ -1764,6 +1794,7 @@
0x6B6D4B484B686D72LLU, // km_Khmr_KH
0x858A414F4C61746ELLU, // kmb_Latn_AO
0x6B6E494E4B6E6461LLU, // kn_Knda_IN
+ 0x95AA47574C61746ELLU, // knf_Latn_GW
0x6B6F4B524B6F7265LLU, // ko_Kore_KR
0xA1CA52554379726CLLU, // koi_Cyrl_RU
0xA9CA494E44657661LLU, // kok_Deva_IN
@@ -1854,6 +1885,7 @@
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
@@ -1877,6 +1909,7 @@
0xAACC4D4C4C61746ELLU, // mwk_Latn_ML
0xC6CC494E44657661LLU, // mwr_Deva_IN
0xD6CC49444C61746ELLU, // mwv_Latn_ID
+ 0xDACC5553486D6E70LLU, // mww_Hmnp_US
0x8AEC5A574C61746ELLU, // mxc_Latn_ZW
0x6D794D4D4D796D72LLU, // my_Mymr_MM
0xD70C52554379726CLLU, // myv_Cyrl_RU
@@ -1905,6 +1938,7 @@
0x998D434D4C61746ELLU, // nmg_Latn_CM
0x6E6E4E4F4C61746ELLU, // nn_Latn_NO
0x9DAD434D4C61746ELLU, // nnh_Latn_CM
+ 0xBDAD494E5763686FLLU, // nnp_Wcho_IN
0x6E6F4E4F4C61746ELLU, // no_Latn_NO
0x8DCD54484C616E61LLU, // nod_Lana_TH
0x91CD494E44657661LLU, // noe_Deva_IN
@@ -1959,6 +1993,7 @@
0x945152454C61746ELLU, // rcf_Latn_RE
0xA49149444C61746ELLU, // rej_Latn_ID
0xB4D149544C61746ELLU, // rgn_Latn_IT
+ 0x98F14D4D41726162LLU, // rhg_Arab_MM
0x8111494E4C61746ELLU, // ria_Latn_IN
0x95114D4154666E67LLU, // rif_Tfng_MA
0xC9314E5044657661LLU, // rjs_Deva_NP
@@ -1986,6 +2021,7 @@
0xC0124B454C61746ELLU, // saq_Latn_KE
0xC81249444C61746ELLU, // sas_Latn_ID
0xCC12494E4C61746ELLU, // sat_Latn_IN
+ 0xD412534E4C61746ELLU, // sav_Latn_SN
0xE412494E53617572LLU, // saz_Saur_IN
0xBC32545A4C61746ELLU, // sbp_Latn_TZ
0x736349544C61746ELLU, // sc_Latn_IT
@@ -2025,6 +2061,7 @@
0x736E5A574C61746ELLU, // sn_Latn_ZW
0xA9B24D4C4C61746ELLU, // snk_Latn_ML
0x736F534F4C61746ELLU, // so_Latn_SO
+ 0x99D2555A536F6764LLU, // sog_Sogd_UZ
0xD1D2544854686169LLU, // sou_Thai_TH
0x7371414C4C61746ELLU, // sq_Latn_AL
0x737252534379726CLLU, // sr_Cyrl_RS
@@ -2135,6 +2172,7 @@
0xC97657464C61746ELLU, // wls_Latn_WF
0xA1B64B4D41726162LLU, // wni_Arab_KM
0x776F534E4C61746ELLU, // wo_Latn_SN
+ 0x9A56494E476F6E67LLU, // wsg_Gong_IN
0xB276494E44657661LLU, // wtm_Deva_IN
0xD296434E48616E73LLU, // wuu_Hans_CN
0xD41742524C61746ELLU, // xav_Latn_BR
@@ -2169,6 +2207,7 @@
0x7A68545748616E62LLU, // zh_Hanb_TW
0x7A68434E48616E73LLU, // zh_Hans_CN
0x7A68545748616E74LLU, // zh_Hant_TW
+ 0xDCF9434E4E736875LLU, // zhx_Nshu_CN
0xB17954474C61746ELLU, // zlm_Latn_TG
0xA1994D594C61746ELLU, // zmi_Latn_MY
0x7A755A414C61746ELLU, // zu_Latn_ZA
@@ -2194,7 +2233,7 @@
{0x656E4154u, 0x656E80A1u}, // en-AT -> en-150
{0x656E4155u, 0x656E8400u}, // en-AU -> en-001
{0x656E4242u, 0x656E8400u}, // en-BB -> en-001
- {0x656E4245u, 0x656E8400u}, // en-BE -> en-001
+ {0x656E4245u, 0x656E80A1u}, // en-BE -> en-150
{0x656E424Du, 0x656E8400u}, // en-BM -> en-001
{0x656E4253u, 0x656E8400u}, // en-BS -> en-001
{0x656E4257u, 0x656E8400u}, // en-BW -> en-001
@@ -2285,6 +2324,7 @@
{0x65734152u, 0x6573A424u}, // es-AR -> es-419
{0x6573424Fu, 0x6573A424u}, // es-BO -> es-419
{0x65734252u, 0x6573A424u}, // es-BR -> es-419
+ {0x6573425Au, 0x6573A424u}, // es-BZ -> es-419
{0x6573434Cu, 0x6573A424u}, // es-CL -> es-419
{0x6573434Fu, 0x6573A424u}, // es-CO -> es-419
{0x65734352u, 0x6573A424u}, // es-CR -> es-419
@@ -2315,6 +2355,10 @@
{0x7074544Cu, 0x70745054u}, // pt-TL -> pt-PT
});
+const std::unordered_map<uint32_t, uint32_t> ___B_PARENTS({
+ {0x61725842u, 0x61729420u}, // ar-XB -> ar-015
+});
+
const struct {
const char script[4];
const std::unordered_map<uint32_t, uint32_t>* map;
@@ -2322,6 +2366,7 @@
{{'A', 'r', 'a', 'b'}, &ARAB_PARENTS},
{{'H', 'a', 'n', 't'}, &HANT_PARENTS},
{{'L', 'a', 't', 'n'}, &LATN_PARENTS},
+ {{'~', '~', '~', 'B'}, &___B_PARENTS},
};
const size_t MAX_PARENT_DEPTH = 3;
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index 3455c4f..1033e56 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -25,6 +25,7 @@
import android.content.pm.PackageManager;
import android.media.audiofx.AudioEffect;
import android.media.audiopolicy.AudioMix;
+import android.telephony.TelephonyManager;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -1239,7 +1240,8 @@
* </ul>
*/
public static int getPlatformType(Context context) {
- if (context.getResources().getBoolean(com.android.internal.R.bool.config_voice_capable)) {
+ if (((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE))
+ .isVoiceCapable()) {
return PLATFORM_VOICE;
} else if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
return PLATFORM_TELEVISION;
diff --git a/media/java/android/media/session/ICallback.aidl b/media/java/android/media/session/ICallback.aidl
deleted file mode 100644
index 322bffa..0000000
--- a/media/java/android/media/session/ICallback.aidl
+++ /dev/null
@@ -1,35 +0,0 @@
-/* Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media.session;
-
-import android.app.PendingIntent;
-import android.content.ComponentName;
-import android.media.session.MediaSession;
-import android.view.KeyEvent;
-
-/**
- * @hide
- */
-oneway interface ICallback {
- void onMediaKeyEventDispatchedToMediaSession(in KeyEvent event,
- in MediaSession.Token sessionToken);
- void onMediaKeyEventDispatchedToMediaButtonReceiver(in KeyEvent event,
- in ComponentName mediaButtonReceiver);
-
- void onAddressedPlayerChangedToMediaSession(in MediaSession.Token sessionToken);
- void onAddressedPlayerChangedToMediaButtonReceiver(in ComponentName mediaButtonReceiver);
-}
-
diff --git a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl b/media/java/android/media/session/IOnMediaKeyEventDispatchedListener.aidl
similarity index 61%
copy from telephony/java/com/android/internal/telephony/IApnSourceService.aidl
copy to media/java/android/media/session/IOnMediaKeyEventDispatchedListener.aidl
index 34c9067..90d9134 100644
--- a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl
+++ b/media/java/android/media/session/IOnMediaKeyEventDispatchedListener.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,11 +14,15 @@
* limitations under the License.
*/
-package com.android.internal.telephony;
+package android.media.session;
-import android.content.ContentValues;
+import android.media.session.MediaSession;
+import android.view.KeyEvent;
-interface IApnSourceService {
- /** Retreive APNs. */
- ContentValues[] getApns(int subId);
+/**
+ * @hide
+ */
+oneway interface IOnMediaKeyEventDispatchedListener {
+ void onMediaKeyEventDispatched(in KeyEvent event, in String packageName,
+ in MediaSession.Token sessionToken);
}
diff --git a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl b/media/java/android/media/session/IOnMediaKeyEventSessionChangedListener.aidl
similarity index 63%
copy from telephony/java/com/android/internal/telephony/IApnSourceService.aidl
copy to media/java/android/media/session/IOnMediaKeyEventSessionChangedListener.aidl
index 34c9067..9566e75 100644
--- a/telephony/java/com/android/internal/telephony/IApnSourceService.aidl
+++ b/media/java/android/media/session/IOnMediaKeyEventSessionChangedListener.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,11 +14,15 @@
* limitations under the License.
*/
-package com.android.internal.telephony;
+package android.media.session;
-import android.content.ContentValues;
+import android.media.session.MediaSession;
-interface IApnSourceService {
- /** Retreive APNs. */
- ContentValues[] getApns(int subId);
+/**
+ * @hide
+ */
+oneway interface IOnMediaKeyEventSessionChangedListener {
+ void onMediaKeyEventSessionChanged(in String packageName,
+ in MediaSession.Token mediaKeyEventSessionToken);
}
+
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index a67a37e..c8502a5 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -20,7 +20,8 @@
import android.media.IRemoteVolumeController;
import android.media.Session2Token;
import android.media.session.IActiveSessionsListener;
-import android.media.session.ICallback;
+import android.media.session.IOnMediaKeyEventDispatchedListener;
+import android.media.session.IOnMediaKeyEventSessionChangedListener;
import android.media.session.IOnMediaKeyListener;
import android.media.session.IOnVolumeKeyLongPressListener;
import android.media.session.ISession;
@@ -62,7 +63,12 @@
// For PhoneWindowManager to precheck media keys
boolean isGlobalPriorityActive();
- void setCallback(in ICallback callback);
+ void addOnMediaKeyEventDispatchedListener(in IOnMediaKeyEventDispatchedListener listener);
+ void removeOnMediaKeyEventDispatchedListener(in IOnMediaKeyEventDispatchedListener listener);
+ void addOnMediaKeyEventSessionChangedListener(
+ in IOnMediaKeyEventSessionChangedListener listener);
+ void removeOnMediaKeyEventSessionChangedListener(
+ in IOnMediaKeyEventSessionChangedListener listener);
void setOnVolumeKeyLongPressListener(in IOnVolumeKeyLongPressListener listener);
void setOnMediaKeyListener(in IOnMediaKeyListener listener);
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 9685c4b..a89dc5f 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -16,6 +16,7 @@
package android.media.session;
+import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -46,8 +47,11 @@
import com.android.internal.annotations.GuardedBy;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
+import java.util.concurrent.Executor;
/**
* Provides support for interacting with {@link MediaSession media sessions}
@@ -72,19 +76,32 @@
* @hide
*/
public static final int RESULT_MEDIA_KEY_HANDLED = 1;
+ private final ISessionManager mService;
+ private final OnMediaKeyEventDispatchedListenerStub mOnMediaKeyEventDispatchedListenerStub =
+ new OnMediaKeyEventDispatchedListenerStub();
+ private final OnMediaKeyEventSessionChangedListenerStub
+ mOnMediaKeyEventSessionChangedListenerStub =
+ new OnMediaKeyEventSessionChangedListenerStub();
private final Object mLock = new Object();
@GuardedBy("mLock")
- private final ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper> mListeners
- = new ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper>();
+ private final ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper> mListeners =
+ new ArrayMap<OnActiveSessionsChangedListener, SessionsChangedWrapper>();
@GuardedBy("mLock")
private final ArrayMap<OnSession2TokensChangedListener, Session2TokensChangedWrapper>
mSession2TokensListeners = new ArrayMap<>();
- private final ISessionManager mService;
+ @GuardedBy("mLock")
+ private final Map<OnMediaKeyEventDispatchedListener, Executor>
+ mOnMediaKeyEventDispatchedListeners = new HashMap<>();
+ @GuardedBy("mLock")
+ private final Map<OnMediaKeyEventSessionChangedListener, Executor>
+ mMediaKeyEventSessionChangedCallbacks = new HashMap<>();
+ @GuardedBy("mLock")
+ private String mCurMediaKeyEventSessionPackage;
+ @GuardedBy("mLock")
+ private MediaSession.Token mCurMediaKeyEventSession;
private Context mContext;
-
- private CallbackImpl mCallback;
private OnVolumeKeyLongPressListenerImpl mOnVolumeKeyLongPressListener;
private OnMediaKeyListenerImpl mOnMediaKeyListener;
@@ -742,31 +759,118 @@
}
/**
- * Set a {@link Callback}.
+ * Add a {@link OnMediaKeyEventDispatchedListener}.
*
- * <p>System can only have a single callback, and the callback can only be set by
- * Bluetooth service process.
- *
- * @param callback A {@link Callback}. {@code null} to reset.
- * @param handler The handler on which the callback should be invoked, or {@code null}
- * if the callback should be invoked on the calling thread's looper.
+ * @param executor The executor on which the callback should be invoked
+ * @param listener A {@link OnMediaKeyEventDispatchedListener}.
* @hide
*/
- public void setCallback(@Nullable Callback callback, @Nullable Handler handler) {
+ @SystemApi
+ @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+ public void addOnMediaKeyEventDispatchedListener(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnMediaKeyEventDispatchedListener listener) {
+ if (executor == null) {
+ throw new NullPointerException("executor shouldn't be null");
+ }
+ if (listener == null) {
+ throw new NullPointerException("listener shouldn't be null");
+ }
synchronized (mLock) {
try {
- if (callback == null) {
- mCallback = null;
- mService.setCallback(null);
- } else {
- if (handler == null) {
- handler = new Handler();
- }
- mCallback = new CallbackImpl(callback, handler);
- mService.setCallback(mCallback);
+ mOnMediaKeyEventDispatchedListeners.put(listener, executor);
+ if (mOnMediaKeyEventDispatchedListeners.size() == 1) {
+ mService.addOnMediaKeyEventDispatchedListener(
+ mOnMediaKeyEventDispatchedListenerStub);
}
} catch (RemoteException e) {
- Log.e(TAG, "Failed to set media key callback", e);
+ Log.e(TAG, "Failed to set media key listener", e);
+ }
+ }
+ }
+
+ /**
+ * Remove a {@link OnMediaKeyEventDispatchedListener}.
+ *
+ * @param listener A {@link OnMediaKeyEventDispatchedListener}.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+ public void removeOnMediaKeyEventDispatchedListener(
+ @NonNull OnMediaKeyEventDispatchedListener listener) {
+ if (listener == null) {
+ throw new NullPointerException("listener shouldn't be null");
+ }
+ synchronized (mLock) {
+ try {
+ mOnMediaKeyEventDispatchedListeners.remove(listener);
+ if (mOnMediaKeyEventDispatchedListeners.size() == 0) {
+ mService.removeOnMediaKeyEventDispatchedListener(
+ mOnMediaKeyEventDispatchedListenerStub);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to set media key event dispatched listener", e);
+ }
+ }
+ }
+
+ /**
+ * Add a {@link OnMediaKeyEventDispatchedListener}.
+ *
+ * @param executor The executor on which the callback should be invoked
+ * @param listener A {@link OnMediaKeyEventSessionChangedListener}.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+ public void addOnMediaKeyEventSessionChangedListener(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnMediaKeyEventSessionChangedListener listener) {
+ if (executor == null) {
+ throw new NullPointerException("executor shouldn't be null");
+ }
+ if (listener == null) {
+ throw new NullPointerException("listener shouldn't be null");
+ }
+ synchronized (mLock) {
+ try {
+ mMediaKeyEventSessionChangedCallbacks.put(listener, executor);
+ executor.execute(
+ () -> listener.onMediaKeyEventSessionChanged(
+ mCurMediaKeyEventSessionPackage, mCurMediaKeyEventSession));
+ if (mMediaKeyEventSessionChangedCallbacks.size() == 1) {
+ mService.addOnMediaKeyEventSessionChangedListener(
+ mOnMediaKeyEventSessionChangedListenerStub);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to set media key listener", e);
+ }
+ }
+ }
+
+ /**
+ * Remove a {@link OnMediaKeyEventSessionChangedListener}.
+ *
+ * @param listener A {@link OnMediaKeyEventSessionChangedListener}.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(value = android.Manifest.permission.MEDIA_CONTENT_CONTROL)
+ public void removeOnMediaKeyEventSessionChangedListener(
+ @NonNull OnMediaKeyEventSessionChangedListener listener) {
+ if (listener == null) {
+ throw new NullPointerException("listener shouldn't be null");
+ }
+ synchronized (mLock) {
+ try {
+ mMediaKeyEventSessionChangedCallbacks.remove(listener);
+ if (mMediaKeyEventSessionChangedCallbacks.size() == 0) {
+ mService.removeOnMediaKeyEventSessionChangedListener(
+ mOnMediaKeyEventSessionChangedListenerStub);
+ }
+ } catch (RemoteException e) {
+ Log.e(TAG, "Failed to set media key listener", e);
}
}
}
@@ -828,53 +932,46 @@
}
/**
- * Callbacks for the media session service.
- *
- * <p>Called when a media key event is dispatched or the addressed player is changed.
- * The addressed player is either the media session or the media button receiver that will
- * receive media key events.
+ * Listener to receive when the media session service
* @hide
*/
- public static abstract class Callback {
+ @SystemApi
+ public interface OnMediaKeyEventDispatchedListener {
/**
- * Called when a media key event is dispatched to the media session
- * through the media session service.
+ * Called when a media key event is dispatched through the media session service. The
+ * session token can be {@link null} if the framework has sent the media key event to the
+ * media button receiver to revive the media app's playback.
+ *
+ * the session is dead when , but the framework sent
*
* @param event Dispatched media key event.
- * @param sessionToken The media session's token.
+ * @param packageName Package
+ * @param sessionToken The media session's token. Can be {@code null}.
*/
- public abstract void onMediaKeyEventDispatched(KeyEvent event,
- MediaSession.Token sessionToken);
+ default void onMediaKeyEventDispatched(@NonNull KeyEvent event, @NonNull String packageName,
+ @NonNull MediaSession.Token sessionToken) { }
+ }
+ /**
+ * Listener to receive changes in the media key event session, which would receive the media key
+ * event unless specified.
+ * @hide
+ */
+ @SystemApi
+ public interface OnMediaKeyEventSessionChangedListener {
/**
- * Called when a media key event is dispatched to the media button receiver
- * through the media session service.
- * <p>MediaSessionService may broadcast key events to the media button receiver
- * when reviving playback after the media session is released.
+ * Called when the media key session is changed to the given media session. The key event
+ * session is the media session which would receive key event by default, unless the caller
+ * has specified the target.
+ * <p>
+ * The session token can be {@link null} if the media button session is unset. In that case,
+ * framework would dispatch to the last sessions's media button receiver.
*
- * @param event Dispatched media key event.
- * @param mediaButtonReceiver The media button receiver.
+ * @param packageName The package name who would receive the media key event. Can be empty.
+ * @param sessionToken The media session's token. Can be {@code null.}
*/
- public abstract void onMediaKeyEventDispatched(KeyEvent event,
- ComponentName mediaButtonReceiver);
-
- /**
- * Called when the addressed player is changed to a media session.
- * <p>One of the {@ #onAddressedPlayerChanged} will be also called immediately after
- * {@link #setCallback} if the addressed player exists.
- *
- * @param sessionToken The media session's token.
- */
- public abstract void onAddressedPlayerChanged(MediaSession.Token sessionToken);
-
- /**
- * Called when the addressed player is changed to the media button receiver.
- * <p>One of the {@ #onAddressedPlayerChanged} will be also called immediately after
- * {@link #setCallback} if the addressed player exists.
- *
- * @param mediaButtonReceiver The media button receiver.
- */
- public abstract void onAddressedPlayerChanged(ComponentName mediaButtonReceiver);
+ default void onMediaKeyEventSessionChanged(@NonNull String packageName,
+ @Nullable MediaSession.Token sessionToken) { }
}
/**
@@ -1076,56 +1173,37 @@
}
}
- private static final class CallbackImpl extends ICallback.Stub {
- private final Callback mCallback;
- private final Handler mHandler;
-
- public CallbackImpl(@NonNull Callback callback, @NonNull Handler handler) {
- mCallback = callback;
- mHandler = handler;
- }
+ private final class OnMediaKeyEventDispatchedListenerStub
+ extends IOnMediaKeyEventDispatchedListener.Stub {
@Override
- public void onMediaKeyEventDispatchedToMediaSession(KeyEvent event,
+ public void onMediaKeyEventDispatched(KeyEvent event, String packageName,
MediaSession.Token sessionToken) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onMediaKeyEventDispatched(event, sessionToken);
+ synchronized (mLock) {
+ for (Map.Entry<OnMediaKeyEventDispatchedListener, Executor> e
+ : mOnMediaKeyEventDispatchedListeners.entrySet()) {
+ e.getValue().execute(
+ () -> e.getKey().onMediaKeyEventDispatched(event, packageName,
+ sessionToken));
}
- });
+ }
}
+ }
+ private final class OnMediaKeyEventSessionChangedListenerStub
+ extends IOnMediaKeyEventSessionChangedListener.Stub {
@Override
- public void onMediaKeyEventDispatchedToMediaButtonReceiver(KeyEvent event,
- ComponentName mediaButtonReceiver) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onMediaKeyEventDispatched(event, mediaButtonReceiver);
+ public void onMediaKeyEventSessionChanged(String packageName,
+ MediaSession.Token sessionToken) {
+ synchronized (mLock) {
+ mCurMediaKeyEventSessionPackage = packageName;
+ mCurMediaKeyEventSession = sessionToken;
+ for (Map.Entry<OnMediaKeyEventSessionChangedListener, Executor> e
+ : mMediaKeyEventSessionChangedCallbacks.entrySet()) {
+ e.getValue().execute(() -> e.getKey().onMediaKeyEventSessionChanged(packageName,
+ sessionToken));
}
- });
- }
-
- @Override
- public void onAddressedPlayerChangedToMediaSession(MediaSession.Token sessionToken) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onAddressedPlayerChanged(sessionToken);
- }
- });
- }
-
- @Override
- public void onAddressedPlayerChangedToMediaButtonReceiver(
- ComponentName mediaButtonReceiver) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onAddressedPlayerChanged(mediaButtonReceiver);
- }
- });
+ }
}
}
}
diff --git a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
index 3258d57..2697a10 100644
--- a/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
+++ b/packages/CarrierDefaultApp/src/com/android/carrierdefaultapp/CarrierActionUtils.java
@@ -29,6 +29,7 @@
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
+
import com.android.internal.telephony.PhoneConstants;
/**
@@ -138,7 +139,7 @@
SubscriptionManager.getDefaultVoiceSubscriptionId());
logd("onRegisterDefaultNetworkAvail subId: " + subId);
final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
- telephonyMgr.carrierActionReportDefaultNetworkStatus(subId, true);
+ telephonyMgr.createForSubscriptionId(subId).reportDefaultNetworkStatus(true);
}
private static void onDeregisterDefaultNetworkAvail(Intent intent, Context context) {
@@ -146,7 +147,7 @@
SubscriptionManager.getDefaultVoiceSubscriptionId());
logd("onDeregisterDefaultNetworkAvail subId: " + subId);
final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
- telephonyMgr.carrierActionReportDefaultNetworkStatus(subId, false);
+ telephonyMgr.createForSubscriptionId(subId).reportDefaultNetworkStatus(false);
}
private static void onDisableRadio(Intent intent, Context context) {
@@ -154,7 +155,7 @@
SubscriptionManager.getDefaultVoiceSubscriptionId());
logd("onDisableRadio subId: " + subId);
final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
- telephonyMgr.carrierActionSetRadioEnabled(subId, !ENABLE);
+ telephonyMgr.createForSubscriptionId(subId).setRadioEnabled(!ENABLE);
}
private static void onEnableRadio(Intent intent, Context context) {
@@ -162,7 +163,7 @@
SubscriptionManager.getDefaultVoiceSubscriptionId());
logd("onEnableRadio subId: " + subId);
final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
- telephonyMgr.carrierActionSetRadioEnabled(subId, ENABLE);
+ telephonyMgr.createForSubscriptionId(subId).setRadioEnabled(ENABLE);
}
private static void onShowCaptivePortalNotification(Intent intent, Context context) {
@@ -205,7 +206,7 @@
SubscriptionManager.getDefaultVoiceSubscriptionId());
logd("onResetAllCarrierActions subId: " + subId);
final TelephonyManager telephonyMgr = context.getSystemService(TelephonyManager.class);
- telephonyMgr.carrierActionResetAll(subId);
+ telephonyMgr.createForSubscriptionId(subId).resetAllCarrierActions();
}
private static Notification getNotification(Context context, int titleId, int textId,
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
index 9c896c8..bc03c34 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
@@ -164,13 +164,13 @@
}
}
- boolean isA2dpPlaying() {
+ boolean isAudioPlaying() {
if (mService == null) {
return false;
}
List<BluetoothDevice> srcs = mService.getConnectedDevices();
if (!srcs.isEmpty()) {
- if (mService.isA2dpPlaying(srcs.get(0))) {
+ if (mService.isAudioPlaying(srcs.get(0))) {
return true;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java
index 8f40ab4..80b03a4 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothAdapter.java
@@ -175,7 +175,7 @@
return;
}
A2dpSinkProfile a2dpSink = mProfileManager.getA2dpSinkProfile();
- if ((a2dpSink != null) && (a2dpSink.isA2dpPlaying())){
+ if ((a2dpSink != null) && (a2dpSink.isAudioPlaying())) {
return;
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
index d91226e..3f920a8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
@@ -16,6 +16,7 @@
package com.android.settingslib.bluetooth;
+import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothPbap;
@@ -52,14 +53,16 @@
// These callbacks run on the main thread.
private final class PbapServiceListener
- implements BluetoothPbap.ServiceListener {
+ implements BluetoothProfile.ServiceListener {
- public void onServiceConnected(BluetoothPbap proxy) {
+ @Override
+ public void onServiceConnected(int profile, BluetoothProfile proxy) {
mService = (BluetoothPbap) proxy;
mIsProfileReady=true;
}
- public void onServiceDisconnected() {
+ @Override
+ public void onServiceDisconnected(int profile) {
mIsProfileReady=false;
}
}
@@ -74,7 +77,8 @@
}
PbapServerProfile(Context context) {
- BluetoothPbap pbap = new BluetoothPbap(context, new PbapServiceListener());
+ BluetoothAdapter.getDefaultAdapter().getProfileProxy(context, new PbapServiceListener(),
+ BluetoothProfile.PBAP);
}
public boolean accessProfileEnabled() {
@@ -97,13 +101,8 @@
}
public int getConnectionStatus(BluetoothDevice device) {
- if (mService == null) {
- return BluetoothProfile.STATE_DISCONNECTED;
- }
- if (mService.isConnected(device))
- return BluetoothProfile.STATE_CONNECTED;
- else
- return BluetoothProfile.STATE_DISCONNECTED;
+ if (mService == null) return BluetoothProfile.STATE_DISCONNECTED;
+ return mService.getConnectionState(device);
}
public boolean isPreferred(BluetoothDevice device) {
@@ -142,7 +141,8 @@
Log.d(TAG, "finalize()");
if (mService != null) {
try {
- mService.close();
+ BluetoothAdapter.getDefaultAdapter().closeProfileProxy(BluetoothProfile.PBAP,
+ mService);
mService = null;
}catch (Throwable t) {
Log.w(TAG, "Error cleaning up PBAP proxy", t);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
index 5e2b7c8..6821942 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -949,8 +949,7 @@
(1 << AudioManager.STREAM_NOTIFICATION) |
(1 << AudioManager.STREAM_SYSTEM) |
(1 << AudioManager.STREAM_SYSTEM_ENFORCED);
- if (!mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_voice_capable)) {
+ if (!getTelephonyManager().isVoiceCapable()) {
ringerModeAffectedStreams |= (1 << AudioManager.STREAM_MUSIC);
}
db.execSQL("DELETE FROM system WHERE name='"
@@ -2579,7 +2578,7 @@
String val = "";
String mode;
for (int phoneId = 0;
- phoneId < TelephonyManager.getDefault().getPhoneCount(); phoneId++) {
+ phoneId < getTelephonyManager().getPhoneCount(); phoneId++) {
mode = TelephonyManager.getTelephonyProperty(phoneId,
"ro.telephony.default_network",
Integer.toString(RILConstants.PREFERRED_NETWORK_MODE));
@@ -2693,4 +2692,9 @@
private String getDefaultDeviceName() {
return mContext.getResources().getString(R.string.def_device_name_simple, Build.MODEL);
}
+
+ private TelephonyManager getTelephonyManager() {
+ return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ }
+
}
diff --git a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
index 4dbca47..9d9cad8 100644
--- a/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
+++ b/packages/SystemUI/src/com/android/keyguard/CarrierTextController.java
@@ -163,8 +163,7 @@
public CarrierTextController(Context context, CharSequence separator, boolean showAirplaneMode,
boolean showMissingSim) {
mContext = context;
- mIsEmergencyCallCapable = context.getResources().getBoolean(
- com.android.internal.R.bool.config_voice_capable);
+ mIsEmergencyCallCapable = getTelephonyManager().isVoiceCapable();
mShowAirplaneMode = showAirplaneMode;
mShowMissingSim = showMissingSim;
diff --git a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
index 210b82d..1acccf9 100644
--- a/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
+++ b/packages/SystemUI/src/com/android/keyguard/EmergencyButton.java
@@ -26,6 +26,7 @@
import android.os.SystemClock;
import android.os.UserHandle;
import android.telecom.TelecomManager;
+import android.telephony.TelephonyManager;
import android.util.AttributeSet;
import android.util.Slog;
import android.view.MotionEvent;
@@ -92,13 +93,16 @@
public EmergencyButton(Context context, AttributeSet attrs) {
super(context, attrs);
- mIsVoiceCapable = context.getResources().getBoolean(
- com.android.internal.R.bool.config_voice_capable);
+ mIsVoiceCapable = getTelephonyManager().isVoiceCapable();
mEnableEmergencyCallWhileSimLocked = mContext.getResources().getBoolean(
com.android.internal.R.bool.config_enable_emergency_call_while_sim_locked);
mEmergencyAffordanceManager = new EmergencyAffordanceManager(context);
}
+ private TelephonyManager getTelephonyManager() {
+ return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ }
+
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java
index 812f215..0210e08 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockInfo.java
@@ -25,12 +25,12 @@
final class ClockInfo {
private final String mName;
- private final String mTitle;
+ private final Supplier<String> mTitle;
private final String mId;
private final Supplier<Bitmap> mThumbnail;
private final Supplier<Bitmap> mPreview;
- private ClockInfo(String name, String title, String id,
+ private ClockInfo(String name, Supplier<String> title, String id,
Supplier<Bitmap> thumbnail, Supplier<Bitmap> preview) {
mName = name;
mTitle = title;
@@ -50,7 +50,7 @@
* Gets the name (title) of the clock face to be shown in the picker app.
*/
String getTitle() {
- return mTitle;
+ return mTitle.get();
}
/**
@@ -80,7 +80,7 @@
static class Builder {
private String mName;
- private String mTitle;
+ private Supplier<String> mTitle;
private String mId;
private Supplier<Bitmap> mThumbnail;
private Supplier<Bitmap> mPreview;
@@ -94,7 +94,7 @@
return this;
}
- public Builder setTitle(String title) {
+ public Builder setTitle(Supplier<String> title) {
mTitle = title;
return this;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
index 9e2464e..5668c5f 100644
--- a/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
+++ b/packages/SystemUI/src/com/android/keyguard/clock/ClockManager.java
@@ -243,11 +243,12 @@
mPreviewClocks.reloadCurrentClock();
mListeners.forEach((listener, clocks) -> {
clocks.reloadCurrentClock();
- ClockPlugin clock = clocks.getCurrentClock();
- if (clock instanceof DefaultClockController) {
- listener.onClockChanged(null);
+ final ClockPlugin clock = clocks.getCurrentClock();
+ if (Looper.myLooper() == Looper.getMainLooper()) {
+ listener.onClockChanged(clock instanceof DefaultClockController ? null : clock);
} else {
- listener.onClockChanged(clock);
+ mMainHandler.post(() -> listener.onClockChanged(
+ clock instanceof DefaultClockController ? null : clock));
}
});
}
@@ -322,7 +323,7 @@
mClocks.put(plugin.getClass().getName(), plugin);
mClockInfo.add(ClockInfo.builder()
.setName(plugin.getName())
- .setTitle(plugin.getTitle())
+ .setTitle(plugin::getTitle)
.setId(id)
.setThumbnail(plugin::getThumbnail)
.setPreview(() -> plugin.getPreview(mWidth, mHeight))
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS b/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS
new file mode 100644
index 0000000..8765c9a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+kchyn@google.com
+jaggies@google.com
+curtislb@google.com
+ilyamaty@google.com
+joshmccloskey@google.com
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java
index d2b2654..4c0890a 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockInfoTest.java
@@ -57,7 +57,7 @@
@Test
public void testGetTitle() {
final String title = "title";
- ClockInfo info = ClockInfo.builder().setTitle(title).build();
+ ClockInfo info = ClockInfo.builder().setTitle(() -> title).build();
assertThat(info.getTitle()).isEqualTo(title);
}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java
index 0cd6f9a..d2832fb9 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/clock/ClockOptionsProviderTest.java
@@ -117,12 +117,12 @@
public void testQuery_listOptions() {
mClocks.add(ClockInfo.builder()
.setName("name_a")
- .setTitle("title_a")
+ .setTitle(() -> "title_a")
.setId("id_a")
.build());
mClocks.add(ClockInfo.builder()
.setName("name_b")
- .setTitle("title_b")
+ .setTitle(() -> "title_b")
.setId("id_b")
.build());
Cursor cursor = mProvider.query(mListOptionsUri, null, null, null);
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 87b1bdf..b719435 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -5864,19 +5864,6 @@
return INetd.PERMISSION_NONE;
}
- private void updateNetworkPermissions(@NonNull final NetworkAgentInfo nai,
- @NonNull final NetworkCapabilities newNc) {
- final int oldPermission = getNetworkPermission(nai.networkCapabilities);
- final int newPermission = getNetworkPermission(newNc);
- if (oldPermission != newPermission && nai.created && !nai.isVPN()) {
- try {
- mNMS.setNetworkPermission(nai.network.netId, newPermission);
- } catch (RemoteException e) {
- loge("Exception in setNetworkPermission: " + e);
- }
- }
- }
-
/**
* Augments the NetworkCapabilities passed in by a NetworkAgent with capabilities that are
* maintained here that the NetworkAgent is not aware of (e.g., validated, captive portal,
@@ -5948,11 +5935,21 @@
* @param nai the network having its capabilities updated.
* @param nc the new network capabilities.
*/
- private void updateCapabilities(final int oldScore, @NonNull final NetworkAgentInfo nai,
- @NonNull final NetworkCapabilities nc) {
+ private void updateCapabilities(int oldScore, NetworkAgentInfo nai, NetworkCapabilities nc) {
NetworkCapabilities newNc = mixInCapabilities(nai, nc);
+
if (Objects.equals(nai.networkCapabilities, newNc)) return;
- updateNetworkPermissions(nai, nc);
+
+ final int oldPermission = getNetworkPermission(nai.networkCapabilities);
+ final int newPermission = getNetworkPermission(newNc);
+ if (oldPermission != newPermission && nai.created && !nai.isVPN()) {
+ try {
+ mNMS.setNetworkPermission(nai.network.netId, newPermission);
+ } catch (RemoteException e) {
+ loge("Exception in setNetworkPermission: " + e);
+ }
+ }
+
final NetworkCapabilities prevNc = nai.getAndSetNetworkCapabilities(newNc);
updateUids(nai, prevNc, newNc);
@@ -6299,52 +6296,6 @@
}
}
- // An accumulator class to gather the list of changes that result from a rematch.
- // TODO : enrich to represent an entire set of changes to apply.
- private static class NetworkReassignment {
- static class NetworkBgStatePair {
- @NonNull final NetworkAgentInfo mNetwork;
- final boolean mOldBackground;
- NetworkBgStatePair(@NonNull final NetworkAgentInfo network,
- final boolean oldBackground) {
- mNetwork = network;
- mOldBackground = oldBackground;
- }
- }
-
- static class RequestReassignment {
- @NonNull public final NetworkRequestInfo mRequest;
- @Nullable public final NetworkAgentInfo mOldNetwork;
- @Nullable public final NetworkAgentInfo mNewNetwork;
- RequestReassignment(@NonNull final NetworkRequestInfo request,
- @Nullable final NetworkAgentInfo oldNetwork,
- @Nullable final NetworkAgentInfo newNetwork) {
- mRequest = request;
- mOldNetwork = oldNetwork;
- mNewNetwork = newNetwork;
- }
- }
-
- @NonNull private final Set<NetworkBgStatePair> mRematchedNetworks = new ArraySet<>();
- @NonNull private final List<RequestReassignment> mReassignments = new ArrayList<>();
-
- @NonNull Iterable<NetworkBgStatePair> getRematchedNetworks() {
- return mRematchedNetworks;
- }
-
- @NonNull Iterable<RequestReassignment> getRequestReassignments() {
- return mReassignments;
- }
-
- void addRequestReassignment(@NonNull final RequestReassignment reassignment) {
- mReassignments.add(reassignment);
- }
-
- void addRematchedNetwork(@NonNull final NetworkBgStatePair network) {
- mRematchedNetworks.add(network);
- }
- }
-
private ArrayMap<NetworkRequestInfo, NetworkAgentInfo> computeRequestReassignmentForNetwork(
@NonNull final NetworkAgentInfo newNetwork) {
final int score = newNetwork.getCurrentScore();
@@ -6390,8 +6341,8 @@
// needed. A network is needed if it is the best network for
// one or more NetworkRequests, or if it is a VPN.
//
- // - Writes into the passed reassignment object all changes that should be done for
- // rematching this network with all requests, to be applied later.
+ // - Tears down newNetwork if it just became validated
+ // but turns out to be unneeded.
//
// NOTE: This function only adds NetworkRequests that "newNetwork" could satisfy,
// it does not remove NetworkRequests that other Networks could better satisfy.
@@ -6399,29 +6350,29 @@
// This function should be used when possible instead of {@code rematchAllNetworksAndRequests}
// as it performs better by a factor of the number of Networks.
//
- // TODO : stop writing to the passed reassignment. This is temporarily more useful, but
- // it's unidiomatic Java and it's hard to read.
- //
- // @param changes a currently-building list of changes to write to
// @param newNetwork is the network to be matched against NetworkRequests.
// @param now the time the rematch starts, as returned by SystemClock.elapsedRealtime();
- private void rematchNetworkAndRequests(@NonNull final NetworkReassignment changes,
- @NonNull final NetworkAgentInfo newNetwork, final long now) {
+ private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork, long now) {
ensureRunningOnConnectivityServiceThread();
if (!newNetwork.everConnected) return;
boolean isNewDefault = false;
NetworkAgentInfo oldDefaultNetwork = null;
- changes.addRematchedNetwork(new NetworkReassignment.NetworkBgStatePair(newNetwork,
- newNetwork.isBackgroundNetwork()));
+ final boolean wasBackgroundNetwork = newNetwork.isBackgroundNetwork();
+ final int score = newNetwork.getCurrentScore();
if (VDBG || DDBG) log("rematching " + newNetwork.name());
final ArrayMap<NetworkRequestInfo, NetworkAgentInfo> reassignedRequests =
computeRequestReassignmentForNetwork(newNetwork);
+ NetworkCapabilities nc = newNetwork.networkCapabilities;
+ if (VDBG) log(" network has: " + nc);
+
// Find and migrate to this Network any NetworkRequests for
// which this network is now the best.
+ final ArrayList<NetworkAgentInfo> removedRequests = new ArrayList<>();
+ final ArrayList<NetworkRequestInfo> addedRequests = new ArrayList<>();
for (final Map.Entry<NetworkRequestInfo, NetworkAgentInfo> entry :
reassignedRequests.entrySet()) {
final NetworkRequestInfo nri = entry.getKey();
@@ -6435,6 +6386,7 @@
}
previousSatisfier.removeRequest(nri.request.requestId);
previousSatisfier.lingerRequest(nri.request, now, mLingerDelayMs);
+ removedRequests.add(previousSatisfier);
} else {
if (VDBG || DDBG) log(" accepting network in place of null");
}
@@ -6443,8 +6395,7 @@
if (!newSatisfier.addRequest(nri.request)) {
Slog.wtf(TAG, "BUG: " + newSatisfier.name() + " already has " + nri.request);
}
- changes.addRequestReassignment(new NetworkReassignment.RequestReassignment(
- nri, previousSatisfier, newSatisfier));
+ addedRequests.add(nri);
// Tell NetworkFactories about the new score, so they can stop
// trying to connect if they know they cannot match it.
// TODO - this could get expensive if we have a lot of requests for this
@@ -6501,6 +6452,48 @@
// Have a new default network, release the transition wakelock in
scheduleReleaseNetworkTransitionWakelock();
}
+
+ if (!newNetwork.networkCapabilities.equalRequestableCapabilities(nc)) {
+ Slog.wtf(TAG, String.format(
+ "BUG: %s changed requestable capabilities during rematch: %s -> %s",
+ newNetwork.name(), nc, newNetwork.networkCapabilities));
+ }
+ if (newNetwork.getCurrentScore() != score) {
+ Slog.wtf(TAG, String.format(
+ "BUG: %s changed score during rematch: %d -> %d",
+ newNetwork.name(), score, newNetwork.getCurrentScore()));
+ }
+
+ // Notify requested networks are available after the default net is switched, but
+ // before LegacyTypeTracker sends legacy broadcasts
+ for (NetworkRequestInfo nri : addedRequests) notifyNetworkAvailable(newNetwork, nri);
+
+ // Finally, process listen requests and update capabilities if the background state has
+ // changed for this network. For consistency with previous behavior, send onLost callbacks
+ // before onAvailable.
+ processNewlyLostListenRequests(newNetwork);
+
+ // Maybe the network changed background states. Update its capabilities.
+ final boolean backgroundChanged = wasBackgroundNetwork != newNetwork.isBackgroundNetwork();
+ if (backgroundChanged) {
+ final NetworkCapabilities newNc = mixInCapabilities(newNetwork,
+ newNetwork.networkCapabilities);
+
+ final int oldPermission = getNetworkPermission(newNetwork.networkCapabilities);
+ final int newPermission = getNetworkPermission(newNc);
+ if (oldPermission != newPermission) {
+ try {
+ mNMS.setNetworkPermission(newNetwork.network.netId, newPermission);
+ } catch (RemoteException e) {
+ loge("Exception in setNetworkPermission: " + e);
+ }
+ }
+
+ newNetwork.getAndSetNetworkCapabilities(newNc);
+ notifyNetworkCallbacks(newNetwork, ConnectivityManager.CALLBACK_CAP_CHANGED);
+ }
+
+ processNewlySatisfiedListenRequests(newNetwork);
}
/**
@@ -6522,33 +6515,12 @@
// scoring network and then a higher scoring network, which could produce multiple
// callbacks.
Arrays.sort(nais);
- final NetworkReassignment changes = new NetworkReassignment();
for (final NetworkAgentInfo nai : nais) {
- rematchNetworkAndRequests(changes, nai, now);
+ rematchNetworkAndRequests(nai, now);
}
final NetworkAgentInfo newDefaultNetwork = getDefaultNetwork();
- // Notify requested networks are available after the default net is switched, but
- // before LegacyTypeTracker sends legacy broadcasts
- for (final NetworkReassignment.RequestReassignment event :
- changes.getRequestReassignments()) {
- if (null != event.mNewNetwork) {
- notifyNetworkAvailable(event.mNewNetwork, event.mRequest);
- }
- }
-
- for (final NetworkReassignment.NetworkBgStatePair event : changes.getRematchedNetworks()) {
- // Process listen requests and update capabilities if the background state has
- // changed for this network. For consistency with previous behavior, send onLost
- // callbacks before onAvailable.
- processNewlyLostListenRequests(event.mNetwork);
- if (event.mOldBackground != event.mNetwork.isBackgroundNetwork()) {
- applyBackgroundChangeForRematch(event.mNetwork);
- }
- processNewlySatisfiedListenRequests(event.mNetwork);
- }
-
for (final NetworkAgentInfo nai : nais) {
// Rematching may have altered the linger state of some networks, so update all linger
// timers. updateLingerState reads the state from the network agent and does nothing
@@ -6580,24 +6552,6 @@
}
}
- /**
- * Apply a change in background state resulting from rematching networks with requests.
- *
- * During rematch, a network may change background states by starting to satisfy or stopping
- * to satisfy a foreground request. Listens don't count for this. When a network changes
- * background states, its capabilities need to be updated and callbacks fired for the
- * capability change.
- *
- * @param nai The network that changed background states
- */
- private void applyBackgroundChangeForRematch(@NonNull final NetworkAgentInfo nai) {
- final NetworkCapabilities newNc = mixInCapabilities(nai, nai.networkCapabilities);
- if (Objects.equals(nai.networkCapabilities, newNc)) return;
- updateNetworkPermissions(nai, newNc);
- nai.getAndSetNetworkCapabilities(newNc);
- notifyNetworkCallbacks(nai, ConnectivityManager.CALLBACK_CAP_CHANGED);
- }
-
private void updateLegacyTypeTrackerAndVpnLockdownForRematch(
@Nullable final NetworkAgentInfo oldDefaultNetwork,
@Nullable final NetworkAgentInfo newDefaultNetwork,
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index be95456..92f6241 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -52,7 +52,6 @@
import android.telephony.LocationAccessPolicy;
import android.telephony.PhoneCapability;
import android.telephony.PhoneStateListener;
-import android.telephony.PhysicalChannelConfig;
import android.telephony.PreciseCallState;
import android.telephony.PreciseDataConnectionState;
import android.telephony.PreciseDisconnectCause;
@@ -213,8 +212,6 @@
private ArrayList<List<CellInfo>> mCellInfo = null;
- private ArrayList<List<PhysicalChannelConfig>> mPhysicalChannelConfigs;
-
private Map<Integer, List<EmergencyNumber>> mEmergencyNumberList;
private EmergencyNumber[] mOutgoingSmsEmergencyNumber;
@@ -424,7 +421,6 @@
if (mNumPhones < oldNumPhones) {
cutListToSize(mCellInfo, mNumPhones);
cutListToSize(mImsReasonInfo, mNumPhones);
- cutListToSize(mPhysicalChannelConfigs, mNumPhones);
return;
}
@@ -445,7 +441,6 @@
mCellInfo.add(i, null);
mImsReasonInfo.add(i, null);
mSrvccState[i] = TelephonyManager.SRVCC_STATE_HANDOVER_NONE;
- mPhysicalChannelConfigs.add(i, new ArrayList<>());
mOtaspMode[i] = TelephonyManager.OTASP_UNKNOWN;
mCallDisconnectCause[i] = DisconnectCause.NOT_VALID;
mCallPreciseDisconnectCause[i] = PreciseDisconnectCause.NOT_VALID;
@@ -522,7 +517,6 @@
mPreciseDataConnectionState = new PreciseDataConnectionState[numPhones];
mCellInfo = new ArrayList<>();
mImsReasonInfo = new ArrayList<>();
- mPhysicalChannelConfigs = new ArrayList<>();
mEmergencyNumberList = new HashMap<>();
mOutgoingCallEmergencyNumber = new EmergencyNumber[numPhones];
mOutgoingSmsEmergencyNumber = new EmergencyNumber[numPhones];
@@ -542,7 +536,6 @@
mCellInfo.add(i, null);
mImsReasonInfo.add(i, null);
mSrvccState[i] = TelephonyManager.SRVCC_STATE_HANDOVER_NONE;
- mPhysicalChannelConfigs.add(i, new ArrayList<>());
mOtaspMode[i] = TelephonyManager.OTASP_UNKNOWN;
mCallDisconnectCause[i] = DisconnectCause.NOT_VALID;
mCallPreciseDisconnectCause[i] = PreciseDisconnectCause.NOT_VALID;
@@ -950,14 +943,6 @@
remove(r.binder);
}
}
- if ((events & PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION) != 0) {
- try {
- r.callback.onPhysicalChannelConfigurationChanged(
- mPhysicalChannelConfigs.get(phoneId));
- } catch (RemoteException ex) {
- remove(r.binder);
- }
- }
if ((events & PhoneStateListener.LISTEN_EMERGENCY_NUMBER_LIST) != 0) {
try {
r.callback.onEmergencyNumberListChanged(mEmergencyNumberList);
@@ -1382,43 +1367,6 @@
}
}
- /**
- * Notify physical channel configuration according to subscripton ID and phone ID
- */
- public void notifyPhysicalChannelConfigurationForSubscriber(int phoneId, int subId,
- List<PhysicalChannelConfig> configs) {
- if (!checkNotifyPermission("notifyPhysicalChannelConfiguration()")) {
- return;
- }
-
- if (VDBG) {
- log("notifyPhysicalChannelConfiguration: subId=" + subId + " phoneId=" + phoneId
- + " configs=" + configs);
- }
-
- synchronized (mRecords) {
- if (validatePhoneId(phoneId)) {
- mPhysicalChannelConfigs.set(phoneId, configs);
- for (Record r : mRecords) {
- if (r.matchPhoneStateListenerEvent(
- PhoneStateListener.LISTEN_PHYSICAL_CHANNEL_CONFIGURATION)
- && idMatch(r.subId, subId, phoneId)) {
- try {
- if (DBG_LOC) {
- log("notifyPhysicalChannelConfiguration: mPhysicalChannelConfigs="
- + configs + " r=" + r);
- }
- r.callback.onPhysicalChannelConfigurationChanged(configs);
- } catch (RemoteException ex) {
- mRemoveList.add(r.binder);
- }
- }
- }
- }
- handleRemoveListLocked();
- }
- }
-
@Override
public void notifyMessageWaitingChangedForPhoneId(int phoneId, int subId, boolean mwi) {
if (!checkNotifyPermission("notifyMessageWaitingChanged()")) {
diff --git a/services/core/java/com/android/server/biometrics/OWNERS b/services/core/java/com/android/server/biometrics/OWNERS
new file mode 100644
index 0000000..8765c9a
--- /dev/null
+++ b/services/core/java/com/android/server/biometrics/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+kchyn@google.com
+jaggies@google.com
+curtislb@google.com
+ilyamaty@google.com
+joshmccloskey@google.com
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 5bd4b20..49398b9 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -47,7 +47,8 @@
import android.media.Session2CommandGroup;
import android.media.Session2Token;
import android.media.session.IActiveSessionsListener;
-import android.media.session.ICallback;
+import android.media.session.IOnMediaKeyEventDispatchedListener;
+import android.media.session.IOnMediaKeyEventSessionChangedListener;
import android.media.session.IOnMediaKeyListener;
import android.media.session.IOnVolumeKeyLongPressListener;
import android.media.session.ISession;
@@ -92,6 +93,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
/**
@@ -748,6 +750,11 @@
private final int mFullUserId;
private final MediaSessionStack mPriorityStack;
+ private final HashMap<IBinder, OnMediaKeyEventDispatchedListenerRecord>
+ mOnMediaKeyEventDispatchedListeners = new HashMap<>();
+ private final HashMap<IBinder, OnMediaKeyEventSessionChangedListenerRecord>
+ mOnMediaKeyEventSessionChangedListeners = new HashMap<>();
+
private PendingIntent mLastMediaButtonReceiver;
private ComponentName mRestoredMediaButtonReceiver;
private int mRestoredMediaButtonReceiverComponentType;
@@ -761,7 +768,6 @@
private IOnMediaKeyListener mOnMediaKeyListener;
private int mOnMediaKeyListenerUid;
- private ICallback mCallback;
FullUserRecord(int fullUserId) {
mFullUserId = fullUserId;
@@ -793,6 +799,50 @@
}
}
+ public void addOnMediaKeyEventDispatchedListenerLocked(
+ IOnMediaKeyEventDispatchedListener listener, int uid) {
+ IBinder cbBinder = listener.asBinder();
+ OnMediaKeyEventDispatchedListenerRecord cr =
+ new OnMediaKeyEventDispatchedListenerRecord(listener, uid);
+ mOnMediaKeyEventDispatchedListeners.put(cbBinder, cr);
+ try {
+ cbBinder.linkToDeath(cr, 0);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to register listener", e);
+ mOnMediaKeyEventDispatchedListeners.remove(cbBinder);
+ }
+ }
+
+ public void removeOnMediaKeyEventDispatchedListenerLocked(
+ IOnMediaKeyEventDispatchedListener listener) {
+ IBinder cbBinder = listener.asBinder();
+ OnMediaKeyEventDispatchedListenerRecord cr =
+ mOnMediaKeyEventDispatchedListeners.remove(cbBinder);
+ cbBinder.unlinkToDeath(cr, 0);
+ }
+
+ public void addOnMediaKeyEventSessionChangedListenerLocked(
+ IOnMediaKeyEventSessionChangedListener listener, int uid) {
+ IBinder cbBinder = listener.asBinder();
+ OnMediaKeyEventSessionChangedListenerRecord cr =
+ new OnMediaKeyEventSessionChangedListenerRecord(listener, uid);
+ mOnMediaKeyEventSessionChangedListeners.put(cbBinder, cr);
+ try {
+ cbBinder.linkToDeath(cr, 0);
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to register callback", e);
+ mOnMediaKeyEventSessionChangedListeners.remove(cbBinder);
+ }
+ }
+
+ public void removeOnMediaKeyEventSessionChangedListener(
+ IOnMediaKeyEventSessionChangedListener listener) {
+ IBinder cbBinder = listener.asBinder();
+ OnMediaKeyEventSessionChangedListenerRecord cr =
+ mOnMediaKeyEventSessionChangedListeners.remove(cbBinder);
+ cbBinder.unlinkToDeath(cr, 0);
+ }
+
public void dumpLocked(PrintWriter pw, String prefix) {
pw.print(prefix + "Record for full_user=" + mFullUserId);
// Dump managed profile user ids associated with this user.
@@ -811,7 +861,18 @@
pw.println(indent + "Media key listener: " + mOnMediaKeyListener);
pw.println(indent + "Media key listener package: "
+ getCallingPackageName(mOnMediaKeyListenerUid));
- pw.println(indent + "Callback: " + mCallback);
+ pw.println(indent + "OnMediaKeyEventDispatchedListener: added "
+ + mOnMediaKeyEventDispatchedListeners.size() + " listener(s)");
+ for (OnMediaKeyEventDispatchedListenerRecord cr
+ : mOnMediaKeyEventDispatchedListeners.values()) {
+ pw.println(indent + " from " + getCallingPackageName(cr.uid));
+ }
+ pw.println(indent + "OnMediaKeyEventSessionChangedListener: added "
+ + mOnMediaKeyEventSessionChangedListeners.size() + " listener(s)");
+ for (OnMediaKeyEventSessionChangedListenerRecord cr
+ : mOnMediaKeyEventSessionChangedListeners.values()) {
+ pw.println(indent + " from " + getCallingPackageName(cr.uid));
+ }
pw.println(indent + "Last MediaButtonReceiver: " + mLastMediaButtonReceiver);
pw.println(indent + "Restored MediaButtonReceiver: " + mRestoredMediaButtonReceiver);
pw.println(indent + "Restored MediaButtonReceiverComponentType: "
@@ -871,28 +932,35 @@
mFullUserId);
}
- private void pushAddressedPlayerChangedLocked() {
- if (mCallback == null) {
- return;
- }
+ private void pushAddressedPlayerChangedLocked(
+ IOnMediaKeyEventSessionChangedListener callback) {
try {
MediaSessionRecord mediaButtonSession = getMediaButtonSessionLocked();
if (mediaButtonSession != null) {
- mCallback.onAddressedPlayerChangedToMediaSession(
+ callback.onMediaKeyEventSessionChanged(mediaButtonSession.getPackageName(),
mediaButtonSession.getSessionToken());
} else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null) {
- mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
+ callback.onMediaKeyEventSessionChanged(
mCurrentFullUserRecord.mLastMediaButtonReceiver
- .getIntent().getComponent());
+ .getIntent().getComponent().getPackageName(),
+ null);
} else if (mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
- mCallback.onAddressedPlayerChangedToMediaButtonReceiver(
- mCurrentFullUserRecord.mRestoredMediaButtonReceiver);
+ callback.onMediaKeyEventSessionChanged(
+ mCurrentFullUserRecord.mRestoredMediaButtonReceiver.getPackageName(),
+ null);
}
} catch (RemoteException e) {
Log.w(TAG, "Failed to pushAddressedPlayerChangedLocked", e);
}
}
+ private void pushAddressedPlayerChangedLocked() {
+ for (OnMediaKeyEventSessionChangedListenerRecord cr
+ : mOnMediaKeyEventSessionChangedListeners.values()) {
+ pushAddressedPlayerChangedLocked(cr.callback);
+ }
+ }
+
private MediaSessionRecord getMediaButtonSessionLocked() {
return isGlobalPriorityActiveLocked()
? mGlobalPrioritySession : mPriorityStack.getMediaButtonSession();
@@ -926,6 +994,42 @@
// Pick legacy behavior for BroadcastReceiver or unknown.
return COMPONENT_TYPE_BROADCAST;
}
+
+ final class OnMediaKeyEventDispatchedListenerRecord implements IBinder.DeathRecipient {
+ public final IOnMediaKeyEventDispatchedListener callback;
+ public final int uid;
+
+ OnMediaKeyEventDispatchedListenerRecord(IOnMediaKeyEventDispatchedListener callback,
+ int uid) {
+ this.callback = callback;
+ this.uid = uid;
+ }
+
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ mOnMediaKeyEventDispatchedListeners.remove(callback.asBinder());
+ }
+ }
+ }
+
+ final class OnMediaKeyEventSessionChangedListenerRecord implements IBinder.DeathRecipient {
+ public final IOnMediaKeyEventSessionChangedListener callback;
+ public final int uid;
+
+ OnMediaKeyEventSessionChangedListenerRecord(
+ IOnMediaKeyEventSessionChangedListener callback, int uid) {
+ this.callback = callback;
+ this.uid = uid;
+ }
+
+ @Override
+ public void binderDied() {
+ synchronized (mLock) {
+ mOnMediaKeyEventSessionChangedListeners.remove(callback.asBinder());
+ }
+ }
+ }
}
final class SessionsListenerRecord implements IBinder.DeathRecipient {
@@ -1305,44 +1409,111 @@
}
@Override
- public void setCallback(ICallback callback) {
+ public void addOnMediaKeyEventDispatchedListener(
+ final IOnMediaKeyEventDispatchedListener callback) {
final int pid = Binder.getCallingPid();
final int uid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(uid);
final long token = Binder.clearCallingIdentity();
try {
- if (!UserHandle.isSameApp(uid, Process.BLUETOOTH_UID)) {
- throw new SecurityException("Only Bluetooth service processes can set"
- + " Callback");
+ if (!hasMediaControlPermission(pid, uid)) {
+ throw new SecurityException("MEDIA_CONTENT_CONTROL permission is required to"
+ + " register MediaKeyEventDispatchedCallback");
}
synchronized (mLock) {
- int userId = UserHandle.getUserId(uid);
FullUserRecord user = getFullUserRecordLocked(userId);
if (user == null || user.mFullUserId != userId) {
- Log.w(TAG, "Only the full user can set the callback"
+ Log.w(TAG, "Only the full user can register the callback"
+ ", userId=" + userId);
return;
}
- user.mCallback = callback;
- Log.d(TAG, "The callback " + user.mCallback
- + " is set by " + getCallingPackageName(uid));
- if (user.mCallback == null) {
+ user.addOnMediaKeyEventDispatchedListenerLocked(callback, uid);
+ Log.d(TAG, "The MediaKeyEventDispatchedCallback (" + callback.asBinder()
+ + ") is registered by " + getCallingPackageName(uid));
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void removeOnMediaKeyEventDispatchedListener(
+ final IOnMediaKeyEventDispatchedListener callback) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(uid);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (!hasMediaControlPermission(pid, uid)) {
+ throw new SecurityException("MEDIA_CONTENT_CONTROL permission is required to"
+ + " unregister MediaKeyEventDispatchedCallback");
+ }
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can unregister the callback"
+ + ", userId=" + userId);
return;
}
- try {
- user.mCallback.asBinder().linkToDeath(
- new IBinder.DeathRecipient() {
- @Override
- public void binderDied() {
- synchronized (mLock) {
- user.mCallback = null;
- }
- }
- }, 0);
- user.pushAddressedPlayerChangedLocked();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set callback", e);
- user.mCallback = null;
+ user.removeOnMediaKeyEventDispatchedListenerLocked(callback);
+ Log.d(TAG, "The MediaKeyEventDispatchedCallback (" + callback.asBinder()
+ + ") is unregistered by " + getCallingPackageName(uid));
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void addOnMediaKeyEventSessionChangedListener(
+ final IOnMediaKeyEventSessionChangedListener listener) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(uid);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (!hasMediaControlPermission(pid, uid)) {
+ throw new SecurityException("MEDIA_CONTENT_CONTROL permission is required to"
+ + " register MediaKeyEventSessionChangedListener");
+ }
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can register the listener"
+ + ", userId=" + userId);
+ return;
}
+ user.addOnMediaKeyEventSessionChangedListenerLocked(listener, uid);
+ Log.d(TAG, "The MediaKeyEventSessionChangedListener (" + listener.asBinder()
+ + ") is registered by " + getCallingPackageName(uid));
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ @Override
+ public void removeOnMediaKeyEventSessionChangedListener(
+ final IOnMediaKeyEventSessionChangedListener callback) {
+ final int pid = Binder.getCallingPid();
+ final int uid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(uid);
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (!hasMediaControlPermission(pid, uid)) {
+ throw new SecurityException("MEDIA_CONTENT_CONTROL permission is required to"
+ + " unregister MediaKeyEventSessionChangedListener");
+ }
+ synchronized (mLock) {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null || user.mFullUserId != userId) {
+ Log.w(TAG, "Only the full user can unregister the listener"
+ + ", userId=" + userId);
+ return;
+ }
+ user.removeOnMediaKeyEventSessionChangedListener(callback);
+ Log.d(TAG, "The MediaKeyEventSessionChangedListener (" + callback.asBinder()
+ + ") is unregistered by " + getCallingPackageName(uid));
}
} finally {
Binder.restoreCallingIdentity(token);
@@ -1771,6 +1942,7 @@
public boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid)
throws RemoteException {
final int uid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(uid);
final long token = Binder.clearCallingIdentity();
try {
// Don't perform sanity check between controllerPackageName and controllerUid.
@@ -1781,8 +1953,8 @@
// Note that we can use Context#getOpPackageName() instead of
// Context#getPackageName() for getting package name that matches with the PID/UID,
// but it doesn't tell which package has created the MediaController, so useless.
- return hasMediaControlPermission(UserHandle.getUserId(uid), controllerPackageName,
- controllerPid, controllerUid);
+ return hasMediaControlPermission(controllerPid, controllerUid)
+ || hasEnabledNotificationListener(userId, controllerPackageName);
} finally {
Binder.restoreCallingIdentity(token);
}
@@ -1808,13 +1980,7 @@
return resolvedUserId;
}
- private boolean hasMediaControlPermission(int resolvedUserId, String packageName,
- int pid, int uid) throws RemoteException {
- // Allow API calls from the System UI and Settings
- if (hasStatusBarServicePermission(pid, uid)) {
- return true;
- }
-
+ private boolean hasMediaControlPermission(int pid, int uid) {
// Check if it's system server or has MEDIA_CONTENT_CONTROL.
// Note that system server doesn't have MEDIA_CONTENT_CONTROL, so we need extra
// check here.
@@ -1823,11 +1989,15 @@
== PackageManager.PERMISSION_GRANTED) {
return true;
} else if (DEBUG) {
- Log.d(TAG, packageName + " (uid=" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL");
+ Log.d(TAG, "uid(" + uid + ") hasn't granted MEDIA_CONTENT_CONTROL");
}
+ return false;
+ }
+ private boolean hasEnabledNotificationListener(int resolvedUserId, String packageName)
+ throws RemoteException {
// You may not access another user's content as an enabled listener.
- final int userId = UserHandle.getUserId(uid);
+ final int userId = UserHandle.getUserId(resolvedUserId);
if (resolvedUserId != userId) {
return false;
}
@@ -1845,7 +2015,7 @@
}
}
if (DEBUG) {
- Log.d(TAG, packageName + " (uid=" + uid + ") doesn't have an enabled "
+ Log.d(TAG, packageName + " (uid=" + resolvedUserId + ") doesn't have an enabled "
+ "notification listener");
}
return false;
@@ -1950,13 +2120,14 @@
session.sendMediaButton(packageName, pid, uid, asSystemService, keyEvent,
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
mKeyEventReceiver);
- if (mCurrentFullUserRecord.mCallback != null) {
- try {
- mCurrentFullUserRecord.mCallback.onMediaKeyEventDispatchedToMediaSession(
- keyEvent, session.getSessionToken());
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to send callback", e);
+ try {
+ for (FullUserRecord.OnMediaKeyEventDispatchedListenerRecord cr
+ : mCurrentFullUserRecord.mOnMediaKeyEventDispatchedListeners.values()) {
+ cr.callback.onMediaKeyEventDispatched(
+ keyEvent, session.getPackageName(), session.getSessionToken());
}
+ } catch (RemoteException e) {
+ Log.w(TAG, "Failed to send callback", e);
}
} else if (mCurrentFullUserRecord.mLastMediaButtonReceiver != null
|| mCurrentFullUserRecord.mRestoredMediaButtonReceiver != null) {
@@ -1980,13 +2151,14 @@
receiver.send(mContext,
needWakeLock ? mKeyEventReceiver.mLastTimeoutId : -1,
mediaButtonIntent, mKeyEventReceiver, mHandler);
- if (mCurrentFullUserRecord.mCallback != null) {
- ComponentName componentName = mCurrentFullUserRecord
- .mLastMediaButtonReceiver.getIntent().getComponent();
- if (componentName != null) {
- mCurrentFullUserRecord.mCallback
- .onMediaKeyEventDispatchedToMediaButtonReceiver(
- keyEvent, componentName);
+ ComponentName componentName = mCurrentFullUserRecord
+ .mLastMediaButtonReceiver.getIntent().getComponent();
+ if (componentName != null) {
+ for (FullUserRecord.OnMediaKeyEventDispatchedListenerRecord cr
+ : mCurrentFullUserRecord
+ .mOnMediaKeyEventDispatchedListeners.values()) {
+ cr.callback.onMediaKeyEventDispatched(keyEvent,
+ componentName.getPackageName(), null);
}
}
} else {
@@ -2018,10 +2190,11 @@
Log.w(TAG, "Error sending media button to the restored intent "
+ receiver + ", type=" + componentType, e);
}
- if (mCurrentFullUserRecord.mCallback != null) {
- mCurrentFullUserRecord.mCallback
- .onMediaKeyEventDispatchedToMediaButtonReceiver(
- keyEvent, receiver);
+ for (FullUserRecord.OnMediaKeyEventDispatchedListenerRecord cr
+ : mCurrentFullUserRecord
+ .mOnMediaKeyEventDispatchedListeners.values()) {
+ cr.callback.onMediaKeyEventDispatched(keyEvent,
+ receiver.getPackageName(), null);
}
}
} catch (CanceledException e) {
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index 12e8069..cf5ec05 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -22,6 +22,7 @@
import android.apex.ApexInfo;
import android.apex.ApexInfoList;
import android.apex.ApexSessionInfo;
+import android.apex.ApexSessionParams;
import android.apex.IApexService;
import android.content.BroadcastReceiver;
import android.content.Context;
@@ -439,7 +440,10 @@
throws PackageManagerException {
try {
final ApexInfoList apexInfoList = new ApexInfoList();
- mApexService.submitStagedSession(sessionId, childSessionIds, apexInfoList);
+ ApexSessionParams params = new ApexSessionParams();
+ params.sessionId = sessionId;
+ params.childSessionIds = childSessionIds;
+ mApexService.submitStagedSession(params, apexInfoList);
return apexInfoList;
} catch (RemoteException re) {
Slog.e(TAG, "Unable to contact apexservice", re);
diff --git a/services/core/java/com/android/server/role/RoleManagerService.java b/services/core/java/com/android/server/role/RoleManagerService.java
index fff9ec7..0caf8f8 100644
--- a/services/core/java/com/android/server/role/RoleManagerService.java
+++ b/services/core/java/com/android/server/role/RoleManagerService.java
@@ -50,7 +50,6 @@
import android.os.UserHandle;
import android.os.UserManagerInternal;
import android.service.sms.FinancialSmsService;
-import android.telephony.IFinancialSmsCallback;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -675,40 +674,6 @@
dumpOutputStream.flush();
}
- /**
- * Get filtered SMS messages for financial app.
- */
- @Override
- public void getSmsMessagesForFinancialApp(
- String callingPkg, Bundle params, IFinancialSmsCallback callback) {
- int mode = PermissionChecker.checkCallingOrSelfPermissionForDataDelivery(
- getContext(),
- AppOpsManager.OPSTR_SMS_FINANCIAL_TRANSACTIONS);
-
- if (mode == PermissionChecker.PERMISSION_GRANTED) {
- FinancialSmsManager financialSmsManager = new FinancialSmsManager(getContext());
- financialSmsManager.getSmsMessages(new RemoteCallback((result) -> {
- CursorWindow messages = null;
- if (result == null) {
- Slog.w(LOG_TAG, "result is null.");
- } else {
- messages = result.getParcelable(FinancialSmsService.EXTRA_SMS_MSGS);
- }
- try {
- callback.onGetSmsMessagesForFinancialApp(messages);
- } catch (RemoteException e) {
- // do nothing
- }
- }), params);
- } else {
- try {
- callback.onGetSmsMessagesForFinancialApp(null);
- } catch (RemoteException e) {
- // do nothing
- }
- }
- }
-
private int getUidForPackage(String packageName) {
long ident = Binder.clearCallingIdentity();
try {
diff --git a/services/tests/servicestests/src/com/android/server/biometrics/OWNERS b/services/tests/servicestests/src/com/android/server/biometrics/OWNERS
new file mode 100644
index 0000000..8765c9a
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/biometrics/OWNERS
@@ -0,0 +1,7 @@
+set noparent
+
+kchyn@google.com
+jaggies@google.com
+curtislb@google.com
+ilyamaty@google.com
+joshmccloskey@google.com
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 6bb4202..143dc28 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ApexManagerTest.java
@@ -183,7 +183,7 @@
public void testSubmitStagedSession_throwPackageManagerException() throws RemoteException {
doAnswer(invocation -> {
throw new Exception();
- }).when(mApexService).submitStagedSession(anyInt(), any(), any());
+ }).when(mApexService).submitStagedSession(any(), any());
assertThrows(PackageManagerException.class,
() -> mApexManager.submitStagedSession(TEST_SESSION_ID, TEST_CHILD_SESSION_ID));
@@ -191,8 +191,7 @@
@Test
public void testSubmitStagedSession_throwRunTimeException() throws RemoteException {
- doThrow(RemoteException.class).when(mApexService).submitStagedSession(anyInt(), any(),
- any());
+ doThrow(RemoteException.class).when(mApexService).submitStagedSession(any(), any());
assertThrows(RuntimeException.class,
() -> mApexManager.submitStagedSession(TEST_SESSION_ID, TEST_CHILD_SESSION_ID));
diff --git a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyTest.java b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyTest.java
index cb49fef..2429cfc 100644
--- a/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezonedetector/TimeZoneDetectorStrategyTest.java
@@ -453,7 +453,7 @@
@Override
public boolean isDeviceTimeZoneInitialized() {
- return mTimeZoneId != null;
+ return mTimeZoneId.getLatest() != null;
}
@Override
diff --git a/telephony/java/com/android/internal/telephony/EncodeException.java b/telephony/common/com/android/internal/telephony/EncodeException.java
similarity index 100%
rename from telephony/java/com/android/internal/telephony/EncodeException.java
rename to telephony/common/com/android/internal/telephony/EncodeException.java
diff --git a/telephony/common/com/android/internal/telephony/SmsApplication.java b/telephony/common/com/android/internal/telephony/SmsApplication.java
index 7cf4eeb..df668ea 100644
--- a/telephony/common/com/android/internal/telephony/SmsApplication.java
+++ b/telephony/common/com/android/internal/telephony/SmsApplication.java
@@ -305,7 +305,7 @@
Uri.fromParts(SCHEME_SMSTO, "", null));
List<ResolveInfo> respondServices = packageManager.queryIntentServicesAsUser(intent,
PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE,
- UserHandle.getUserHandleForUid(userId));
+ UserHandle.of(userId));
for (ResolveInfo resolveInfo : respondServices) {
final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
if (serviceInfo == null) {
diff --git a/telephony/java/android/telephony/CbGeoUtils.java b/telephony/java/android/telephony/CbGeoUtils.java
index f4ce6e7..ce5e3f3 100644
--- a/telephony/java/android/telephony/CbGeoUtils.java
+++ b/telephony/java/android/telephony/CbGeoUtils.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
+import android.os.Build;
import android.text.TextUtils;
import java.util.ArrayList;
@@ -257,6 +258,15 @@
return new Point(x - p.x, y - p.y);
}
}
+
+ @Override
+ public String toString() {
+ String str = "Polygon: ";
+ if (Build.IS_DEBUGGABLE) {
+ str += mVertices;
+ }
+ return str;
+ }
}
/**
@@ -284,6 +294,16 @@
public boolean contains(LatLng p) {
return mCenter.distance(p) <= mRadiusMeter;
}
+
+ @Override
+ public String toString() {
+ String str = "Circle: ";
+ if (Build.IS_DEBUGGABLE) {
+ str += mCenter + ", radius = " + mRadiusMeter;
+ }
+
+ return str;
+ }
}
/**
diff --git a/telephony/java/android/telephony/IFinancialSmsCallback.aidl b/telephony/java/android/telephony/IFinancialSmsCallback.aidl
deleted file mode 100644
index aa88615..0000000
--- a/telephony/java/android/telephony/IFinancialSmsCallback.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-** Copyright 2019, The Android Open Source Project
-**
-** Licensed under the Apache License, Version 2.0 (the "License");
-** you may not use this file except in compliance with the License.
-** You may obtain a copy of the License at
-**
-** http://www.apache.org/licenses/LICENSE-2.0
-**
-** Unless required by applicable law or agreed to in writing, software
-** distributed under the License is distributed on an "AS IS" BASIS,
-** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-** See the License for the specific language governing permissions and
-** limitations under the License.
-*/
-package android.telephony;
-
-import android.app.PendingIntent;
-import android.database.CursorWindow;
-import android.net.Uri;
-import android.os.Bundle;
-import com.android.internal.telephony.SmsRawData;
-
-/** Interface for returning back the financial sms messages asynchrously.
- * @hide
- */
-interface IFinancialSmsCallback {
- /**
- * Return sms messages back to calling financial app.
- *
- * @param messages the sms messages returned for cinancial app.
- */
- oneway void onGetSmsMessagesForFinancialApp(in CursorWindow messages);
-}
diff --git a/telephony/java/android/telephony/ImsManager.java b/telephony/java/android/telephony/ImsManager.java
index 02d8be3..39af34c 100644
--- a/telephony/java/android/telephony/ImsManager.java
+++ b/telephony/java/android/telephony/ImsManager.java
@@ -16,7 +16,10 @@
package android.telephony.ims;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.annotation.SystemService;
+import android.annotation.TestApi;
import android.content.Context;
import android.telephony.SubscriptionManager;
@@ -25,12 +28,15 @@
*
* @hide
*/
+@SystemApi
+@TestApi
@SystemService(Context.TELEPHONY_IMS_SERVICE)
public class ImsManager {
private Context mContext;
- public ImsManager(Context context) {
+ /** @hide */
+ public ImsManager(@NonNull Context context) {
mContext = context;
}
@@ -41,6 +47,7 @@
* @throws IllegalArgumentException if the subscription is invalid.
* @return a ImsRcsManager instance with the specific subscription ID.
*/
+ @NonNull
public ImsRcsManager getImsRcsManager(int subscriptionId) {
if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)) {
throw new IllegalArgumentException("Invalid subscription ID: " + subscriptionId);
@@ -56,6 +63,7 @@
* @throws IllegalArgumentException if the subscription is invalid.
* @return a ImsMmTelManager instance with the specific subscription ID.
*/
+ @NonNull
public ImsMmTelManager getImsMmTelManager(int subscriptionId) {
if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)) {
throw new IllegalArgumentException("Invalid subscription ID: " + subscriptionId);
diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java
index eb744f6..d4526a4 100644
--- a/telephony/java/android/telephony/LocationAccessPolicy.java
+++ b/telephony/java/android/telephony/LocationAccessPolicy.java
@@ -33,6 +33,8 @@
import android.util.Log;
import android.widget.Toast;
+import com.android.internal.telephony.util.TelephonyUtils;
+
import java.util.List;
/**
@@ -162,7 +164,7 @@
}
Log.e(TAG, errorMsg);
try {
- if (Build.IS_DEBUGGABLE) {
+ if (TelephonyUtils.IS_DEBUGGABLE) {
Toast.makeText(context, errorMsg, Toast.LENGTH_SHORT).show();
}
} catch (Throwable t) {
diff --git a/telephony/java/android/telephony/PhoneCapability.java b/telephony/java/android/telephony/PhoneCapability.java
index 17b7963f..8a75831 100644
--- a/telephony/java/android/telephony/PhoneCapability.java
+++ b/telephony/java/android/telephony/PhoneCapability.java
@@ -16,6 +16,8 @@
package android.telephony;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
import android.os.Parcel;
import android.os.Parcelable;
@@ -27,12 +29,13 @@
/**
* Define capability of a modem group. That is, the capabilities
* are shared between those modems defined by list of modem IDs.
- * @hide
*/
-public class PhoneCapability implements Parcelable {
+public final class PhoneCapability implements Parcelable {
// Hardcoded default DSDS capability.
+ /** @hide */
public static final PhoneCapability DEFAULT_DSDS_CAPABILITY;
// Hardcoded default Single SIM single standby capability.
+ /** @hide */
public static final PhoneCapability DEFAULT_SSSS_CAPABILITY;
static {
@@ -48,13 +51,18 @@
logicalModemList.add(modemInfo1);
DEFAULT_SSSS_CAPABILITY = new PhoneCapability(1, 1, 0, logicalModemList, false);
}
-
+ /** @hide */
public final int maxActiveVoiceCalls;
+ /** @hide */
public final int maxActiveData;
+ /** @hide */
public final int max5G;
+ /** @hide */
public final boolean validationBeforeSwitchSupported;
+ /** @hide */
public final List<ModemInfo> logicalModemList;
+ /** @hide */
public PhoneCapability(int maxActiveVoiceCalls, int maxActiveData, int max5G,
List<ModemInfo> logicalModemList, boolean validationBeforeSwitchSupported) {
this.maxActiveVoiceCalls = maxActiveVoiceCalls;
@@ -116,7 +124,7 @@
/**
* {@link Parcelable#writeToParcel}
*/
- public void writeToParcel(Parcel dest, @Parcelable.WriteFlags int flags) {
+ public void writeToParcel(@NonNull Parcel dest, @Parcelable.WriteFlags int flags) {
dest.writeInt(maxActiveVoiceCalls);
dest.writeInt(maxActiveData);
dest.writeInt(max5G);
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index d2c8517..d7d85c2 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -941,7 +941,7 @@
rtString = "LTE_CA";
break;
case RIL_RADIO_TECHNOLOGY_NR:
- rtString = "LTE_NR";
+ rtString = "NR_SA";
break;
default:
rtString = "Unexpected";
@@ -1479,8 +1479,9 @@
return AccessNetworkType.CDMA2000;
case RIL_RADIO_TECHNOLOGY_LTE:
case RIL_RADIO_TECHNOLOGY_LTE_CA:
- case RIL_RADIO_TECHNOLOGY_NR:
return AccessNetworkType.EUTRAN;
+ case RIL_RADIO_TECHNOLOGY_NR:
+ return AccessNetworkType.NGRAN;
case RIL_RADIO_TECHNOLOGY_IWLAN:
return AccessNetworkType.IWLAN;
case RIL_RADIO_TECHNOLOGY_UNKNOWN:
diff --git a/telephony/java/android/telephony/SmsCbMessage.java b/telephony/java/android/telephony/SmsCbMessage.java
index c7f9529..045d1eb 100644
--- a/telephony/java/android/telephony/SmsCbMessage.java
+++ b/telephony/java/android/telephony/SmsCbMessage.java
@@ -533,7 +533,8 @@
+ ", priority=" + mPriority
+ (mEtwsWarningInfo != null ? (", " + mEtwsWarningInfo.toString()) : "")
+ (mCmasWarningInfo != null ? (", " + mCmasWarningInfo.toString()) : "")
- + ", maximumWaitingTime = " + mMaximumWaitTimeSec
+ + ", maximumWaitingTime=" + mMaximumWaitTimeSec
+ + ", received time=" + mReceivedTimeMillis
+ ", slotIndex = " + mSlotIndex
+ ", geo=" + (mGeometries != null
? CbGeoUtils.encodeGeometriesToString(mGeometries) : "null")
diff --git a/telephony/java/android/telephony/SmsManager.java b/telephony/java/android/telephony/SmsManager.java
index daeacf8..5b49117 100644
--- a/telephony/java/android/telephony/SmsManager.java
+++ b/telephony/java/android/telephony/SmsManager.java
@@ -32,6 +32,7 @@
import android.database.CursorWindow;
import android.net.Uri;
import android.os.Binder;
+import android.os.BaseBundle;
import android.os.Build;
import android.os.Bundle;
import android.os.RemoteException;
@@ -79,11 +80,6 @@
SubscriptionManager.DEFAULT_SUBSCRIPTION_ID);
private static final Object sLockObject = new Object();
- /** @hide */
- public static final int CELL_BROADCAST_RAN_TYPE_GSM = 0;
- /** @hide */
- public static final int CELL_BROADCAST_RAN_TYPE_CDMA = 1;
-
/** SMS record length from TS 51.011 10.5.3
* @hide
*/
@@ -2457,7 +2453,9 @@
}
}
- /** callback for providing asynchronous sms messages for financial app. */
+ /**
+ * callback for providing asynchronous sms messages for financial app.
+ */
public abstract static class FinancialSmsCallback {
/**
* Callback to send sms messages back to financial app asynchronously.
@@ -2483,24 +2481,14 @@
* @param params the parameters to filter SMS messages returned.
* @param executor the executor on which callback will be invoked.
* @param callback a callback to receive CursorWindow with SMS messages.
+ *
*/
@RequiresPermission(android.Manifest.permission.SMS_FINANCIAL_TRANSACTIONS)
public void getSmsMessagesForFinancialApp(
Bundle params,
@NonNull @CallbackExecutor Executor executor,
@NonNull FinancialSmsCallback callback) {
- try {
- ISms iccSms = getISmsServiceOrThrow();
- iccSms.getSmsMessagesForFinancialApp(
- getSubscriptionId(), ActivityThread.currentPackageName(), params,
- new IFinancialSmsCallback.Stub() {
- public void onGetSmsMessagesForFinancialApp(CursorWindow msgs) {
- Binder.withCleanCallingIdentity(() -> executor.execute(
- () -> callback.onFinancialSmsMessages(msgs)));
- }});
- } catch (RemoteException ex) {
- ex.rethrowFromSystemServer();
- }
+ // This API is not functional and thus removed to avoid future confusion.
}
/**
diff --git a/telephony/java/android/telephony/SubscriptionInfo.java b/telephony/java/android/telephony/SubscriptionInfo.java
index ebb5175..257c606 100644
--- a/telephony/java/android/telephony/SubscriptionInfo.java
+++ b/telephony/java/android/telephony/SubscriptionInfo.java
@@ -30,7 +30,6 @@
import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.Typeface;
-import android.os.Build;
import android.os.Parcel;
import android.os.ParcelUuid;
import android.os.Parcelable;
@@ -38,6 +37,8 @@
import android.util.DisplayMetrics;
import android.util.Log;
+import com.android.internal.telephony.util.TelephonyUtils;
+
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -748,7 +749,7 @@
public static String givePrintableIccid(String iccId) {
String iccIdToPrint = null;
if (iccId != null) {
- if (iccId.length() > 9 && !Build.IS_DEBUGGABLE) {
+ if (iccId.length() > 9 && !TelephonyUtils.IS_DEBUGGABLE) {
iccIdToPrint = iccId.substring(0, 9) + Rlog.pii(false, iccId.substring(9));
} else {
iccIdToPrint = iccId;
@@ -764,7 +765,8 @@
return "{id=" + mId + " iccId=" + iccIdToPrint + " simSlotIndex=" + mSimSlotIndex
+ " carrierId=" + mCarrierId + " displayName=" + mDisplayName
+ " carrierName=" + mCarrierName + " nameSource=" + mNameSource
- + " iconTint=" + mIconTint + " mNumber=" + Rlog.pii(Build.IS_DEBUGGABLE, mNumber)
+ + " iconTint=" + mIconTint
+ + " mNumber=" + Rlog.pii(TelephonyUtils.IS_DEBUGGABLE, mNumber)
+ " dataRoaming=" + mDataRoaming + " iconBitmap=" + mIconBitmap + " mcc " + mMcc
+ " mnc " + mMnc + "mCountryIso=" + mCountryIso + " isEmbedded " + mIsEmbedded
+ " nativeAccessRules " + Arrays.toString(mNativeAccessRules)
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 16415ea..f4f0503 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -35,7 +35,6 @@
import android.annotation.UnsupportedAppUsage;
import android.app.BroadcastOptions;
import android.app.PendingIntent;
-import android.app.job.JobService;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
@@ -55,6 +54,7 @@
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.provider.Telephony.SimInfo;
import android.telephony.euicc.EuiccManager;
import android.telephony.ims.ImsMmTelManager;
import android.util.DisplayMetrics;
@@ -130,7 +130,7 @@
/** @hide */
@UnsupportedAppUsage
- public static final Uri CONTENT_URI = Uri.parse("content://telephony/siminfo");
+ public static final Uri CONTENT_URI = SimInfo.CONTENT_URI;
/**
* Generates a content {@link Uri} used to receive updates on simInfo change
@@ -148,10 +148,11 @@
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* subscription wfc enabled {@link ImsMmTelManager#isVoWiFiSettingEnabled()}
- * while your app is running. You can also use a {@link JobService} to ensure your app
+ * while your app is running. You can also use a {@link android.app.job.JobService}
+ * to ensure your app
* is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee timely
+ * delivery of updates to the {@link Uri}.
* To be notified of changes to a specific subId, append subId to the URI
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
@@ -168,10 +169,10 @@
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* subscription advanced calling enabled
* {@link ImsMmTelManager#isAdvancedCallingSettingEnabled()} while your app is running.
- * You can also use a {@link JobService} to ensure your app is notified of changes to the
- * {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * You can also use a {@link android.app.job.JobService} to ensure your app is notified of
+ * changes to the {@link Uri} even when it is not running.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee timely
+ * delivery of updates to the {@link Uri}.
* To be notified of changes to a specific subId, append subId to the URI
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
@@ -187,10 +188,10 @@
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* subscription wfc mode {@link ImsMmTelManager#getVoWiFiModeSetting()}
- * while your app is running. You can also use a {@link JobService} to ensure your app
- * is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * while your app is running. You can also use a {@link android.app.job.JobService} to ensure
+ * your app is notified of changes to the {@link Uri} even when it is not running.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee timely
+ * delivery of updates to the {@link Uri}.
* To be notified of changes to a specific subId, append subId to the URI
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
@@ -205,10 +206,10 @@
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* subscription wfc roaming mode {@link ImsMmTelManager#getVoWiFiRoamingModeSetting()}
- * while your app is running. You can also use a {@link JobService} to ensure your app
- * is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * while your app is running. You can also use a {@link android.app.job.JobService}
+ * to ensure your app is notified of changes to the {@link Uri} even when it is not running.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee timely
+ * delivery of updates to the {@link Uri}.
* To be notified of changes to a specific subId, append subId to the URI
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
@@ -225,10 +226,10 @@
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* subscription vt enabled {@link ImsMmTelManager#isVtSettingEnabled()}
- * while your app is running. You can also use a {@link JobService} to ensure your app
- * is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * while your app is running. You can also use a {@link android.app.job.JobService} to ensure
+ * your app is notified of changes to the {@link Uri} even when it is not running.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee timely
+ * delivery of updates to the {@link Uri}.
* To be notified of changes to a specific subId, append subId to the URI
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
@@ -244,10 +245,10 @@
* <p>
* Use this {@link Uri} with a {@link ContentObserver} to be notified of changes to the
* subscription wfc roaming enabled {@link ImsMmTelManager#isVoWiFiRoamingSettingEnabled()}
- * while your app is running. You can also use a {@link JobService} to ensure your app
- * is notified of changes to the {@link Uri} even when it is not running.
- * Note, however, that using a {@link JobService} does not guarantee timely delivery of
- * updates to the {@link Uri}.
+ * while your app is running. You can also use a {@link android.app.job.JobService} to ensure
+ * your app is notified of changes to the {@link Uri} even when it is not running.
+ * Note, however, that using a {@link android.app.job.JobService} does not guarantee timely
+ * delivery of updates to the {@link Uri}.
* To be notified of changes to a specific subId, append subId to the URI
* {@link Uri#withAppendedPath(Uri, String)}.
* @hide
@@ -2914,8 +2915,7 @@
*
* @throws SecurityException if the caller doesn't meet the requirements
* outlined above.
- * @throws IllegalArgumentException if the some subscriptions in the list doesn't exist,
- * or the groupUuid doesn't exist.
+ * @throws IllegalArgumentException if the some subscriptions in the list doesn't exist.
* @throws IllegalStateException if Telephony service is in bad state.
*
* @param subIdList list of subId that need adding into the group
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 58f1e84..de0b478 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -1769,11 +1769,23 @@
/**
* Returns the Network Access Identifier (NAI). Return null if NAI is not available.
*
- * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
- * or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
+ * <p>Requires Permission: READ_PRIVILEGED_PHONE_STATE, for the calling app to be the device or
+ * profile owner and have the READ_PHONE_STATE permission, or that the calling app has carrier
+ * privileges (see {@link #hasCarrierPrivileges}). The profile owner is an app that owns a
+ * managed profile on the device; for more details see <a
+ * href="https://developer.android.com/work/managed-profiles">Work profiles</a>. Profile owner
+ * access is deprecated and will be removed in a future release.
+ *
+ * <ul>
+ * <li>If the calling app's target SDK is API level 28 or lower and the app has the
+ * READ_PHONE_STATE permission then null is returned.</li>
+ * <li>If the calling app's target SDK is API level 28 or lower and the app does not have
+ * the READ_PHONE_STATE permission, or if the calling app is targeting API level 29 or
+ * higher, then a SecurityException is thrown.</li>
+ * </ul>
*/
- @SuppressAutoDoc // Blocked by b/72967236 - no support for carrier privileges
- @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE)
+ @SuppressAutoDoc // No support for device / profile owner or carrier privileges (b/72967236).
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getNai() {
return getNaiBySubscriberId(getSubId());
}
@@ -1781,6 +1793,21 @@
/**
* Returns the NAI. Return null if NAI is not available.
*
+ * <p>Requires Permission: READ_PRIVILEGED_PHONE_STATE, for the calling app to be the device or
+ * profile owner and have the READ_PHONE_STATE permission, or that the calling app has carrier
+ * privileges (see {@link #hasCarrierPrivileges}). The profile owner is an app that owns a
+ * managed profile on the device; for more details see <a
+ * href="https://developer.android.com/work/managed-profiles">Work profiles</a>. Profile owner
+ * access is deprecated and will be removed in a future release.
+ *
+ * <ul>
+ * <li>If the calling app's target SDK is API level 28 or lower and the app has the
+ * READ_PHONE_STATE permission then null is returned.</li>
+ * <li>If the calling app's target SDK is API level 28 or lower and the app does not have
+ * the READ_PHONE_STATE permission, or if the calling app is targeting API level 29 or
+ * higher, then a SecurityException is thrown.</li>
+ * </ul>
+ *
* @param slotIndex of which Nai is returned
*/
/** {@hide}*/
@@ -2346,7 +2373,14 @@
* @return the lowercase 2 character ISO-3166 country code, or empty string if not available.
*/
public String getNetworkCountryIso() {
- return getNetworkCountryIso(getPhoneId());
+ try {
+ ITelephony telephony = getITelephony();
+ if (telephony == null) return "";
+ return telephony.getNetworkCountryIsoForPhone(getPhoneId(),
+ null /* no permission check */);
+ } catch (RemoteException ex) {
+ return "";
+ }
}
/**
@@ -2367,16 +2401,23 @@
*
* @return the lowercase 2 character ISO-3166 country code, or empty string if not available.
*
+ * @throws IllegalArgumentException when the slotIndex is invalid.
+ *
* {@hide}
*/
@SystemApi
@TestApi
@NonNull
+ @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public String getNetworkCountryIso(int slotIndex) {
try {
+ if (!SubscriptionManager.isValidSlotIndex(slotIndex)) {
+ throw new IllegalArgumentException("invalid slot index " + slotIndex);
+ }
+
ITelephony telephony = getITelephony();
if (telephony == null) return "";
- return telephony.getNetworkCountryIsoForPhone(slotIndex);
+ return telephony.getNetworkCountryIsoForPhone(slotIndex, getOpPackageName());
} catch (RemoteException ex) {
return "";
}
@@ -6692,7 +6733,8 @@
* If the list is longer than the size of EFfplmn, then the file will be written from the
* beginning of the list up to the file size.
*
- * <p>Requires Permission: {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE}
+ * <p>Requires Permission: {@link android.Manifest.permission#MODIFY_PHONE_STATE
+ * MODIFY_PHONE_STATE}
* or that the calling app has carrier privileges (see {@link #hasCarrierPrivileges}).
*
* @param fplmns a list of PLMNs to be forbidden.
@@ -6706,7 +6748,7 @@
public int setForbiddenPlmns(@NonNull List<String> fplmns) {
try {
ITelephony telephony = getITelephony();
- if (telephony == null) return 0;
+ if (telephony == null) return -1;
return telephony.setForbiddenPlmns(
getSubId(), APPTYPE_USIM, fplmns, getOpPackageName());
} catch (RemoteException ex) {
@@ -6715,7 +6757,7 @@
// This could happen before phone starts
Rlog.e(TAG, "setForbiddenPlmns NullPointerException: " + ex.getMessage());
}
- return 0;
+ return -1;
}
/**
@@ -10088,19 +10130,25 @@
}
/**
- * Action set from carrier signalling broadcast receivers to enable/disable radio
- * Permissions {@link android.Manifest.permission.MODIFY_PHONE_STATE} is required.
- * @param subId the subscription ID that this action applies to.
+ * Carrier action to enable or disable the radio.
+ *
+ * <p>If this object has been created with {@link #createForSubscriptionId}, applies to the
+ * given subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()}
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
+ *
* @param enabled control enable or disable radio.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- public void carrierActionSetRadioEnabled(int subId, boolean enabled) {
+ public void setRadioEnabled(boolean enabled) {
try {
ITelephony service = getITelephony();
if (service != null) {
- service.carrierActionSetRadioEnabled(subId, enabled);
+ service.carrierActionSetRadioEnabled(
+ getSubId(SubscriptionManager.getDefaultDataSubscriptionId()), enabled);
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#carrierActionSetRadioEnabled", e);
@@ -10108,20 +10156,25 @@
}
/**
- * Action set from carrier signalling broadcast receivers to start/stop reporting default
- * network available events
- * Permissions {@link android.Manifest.permission.MODIFY_PHONE_STATE} is required.
- * @param subId the subscription ID that this action applies to.
+ * Carrier action to start or stop reporting default network available events.
+ *
+ * <p>If this object has been created with {@link #createForSubscriptionId}, applies to the
+ * given subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()}
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
+ *
* @param report control start/stop reporting network status.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- public void carrierActionReportDefaultNetworkStatus(int subId, boolean report) {
+ public void reportDefaultNetworkStatus(boolean report) {
try {
ITelephony service = getITelephony();
if (service != null) {
- service.carrierActionReportDefaultNetworkStatus(subId, report);
+ service.carrierActionReportDefaultNetworkStatus(
+ getSubId(SubscriptionManager.getDefaultDataSubscriptionId()), report);
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#carrierActionReportDefaultNetworkStatus", e);
@@ -10129,18 +10182,24 @@
}
/**
- * Action set from carrier signalling broadcast receivers to reset all carrier actions
- * Permissions {@link android.Manifest.permission.MODIFY_PHONE_STATE} is required.
- * @param subId the subscription ID that this action applies to.
+ * Reset all carrier actions previously set by {@link #setRadioEnabled},
+ * {@link #reportDefaultNetworkStatus} and {@link #setCarrierDataEnabled}.
+ *
+ * <p>If this object has been created with {@link #createForSubscriptionId}, applies to the
+ * given subId. Otherwise, applies to {@link SubscriptionManager#getDefaultDataSubscriptionId()}
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}.
* @hide
*/
@SystemApi
@RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE)
- public void carrierActionResetAll(int subId) {
+ public void resetAllCarrierActions() {
try {
ITelephony service = getITelephony();
if (service != null) {
- service.carrierActionResetAll(subId);
+ service.carrierActionResetAll(
+ getSubId(SubscriptionManager.getDefaultDataSubscriptionId()));
}
} catch (RemoteException e) {
Log.e(TAG, "Error calling ITelephony#carrierActionResetAll", e);
diff --git a/telephony/java/android/telephony/data/DataProfile.java b/telephony/java/android/telephony/data/DataProfile.java
index 30c209b..96a5a81 100644
--- a/telephony/java/android/telephony/data/DataProfile.java
+++ b/telephony/java/android/telephony/data/DataProfile.java
@@ -22,7 +22,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
-import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.Annotation.ApnType;
@@ -31,6 +30,7 @@
import android.text.TextUtils;
import com.android.internal.telephony.RILConstants;
+import com.android.internal.telephony.util.TelephonyUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -261,7 +261,7 @@
@Override
public String toString() {
return "DataProfile=" + mProfileId + "/" + mProtocolType + "/" + mAuthType
- + "/" + (Build.IS_USER ? "***/***/***" :
+ + "/" + (TelephonyUtils.IS_USER ? "***/***/***" :
(mApn + "/" + mUserName + "/" + mPassword)) + "/" + mType + "/"
+ mMaxConnectionsTime + "/" + mMaxConnections + "/"
+ mWaitTime + "/" + mEnabled + "/" + mSupportedApnTypesBitmask + "/"
diff --git a/telephony/java/android/telephony/ims/ImsRcsManager.java b/telephony/java/android/telephony/ims/ImsRcsManager.java
index 21707b0..0c8dba6 100644
--- a/telephony/java/android/telephony/ims/ImsRcsManager.java
+++ b/telephony/java/android/telephony/ims/ImsRcsManager.java
@@ -20,6 +20,8 @@
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.RequiresPermission;
+import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.Context;
import android.os.Binder;
import android.os.IBinder;
@@ -30,6 +32,7 @@
import android.telephony.ims.aidl.IImsRcsController;
import android.telephony.ims.feature.ImsFeature;
import android.telephony.ims.feature.RcsFeature;
+import android.telephony.ims.stub.ImsRegistrationImplBase;
import android.util.Log;
import java.util.concurrent.Executor;
@@ -42,6 +45,8 @@
* Use {@link ImsManager#getImsRcsManager(int)} to create an instance of this manager.
* @hide
*/
+@SystemApi
+@TestApi
public class ImsRcsManager implements RegistrationManager {
private static final String TAG = "ImsRcsManager";
@@ -101,7 +106,7 @@
*
* @param capabilities The new availability of the capabilities.
*/
- public void onAvailabilityChanged(RcsFeature.RcsImsCapabilities capabilities) {
+ public void onAvailabilityChanged(@NonNull RcsFeature.RcsImsCapabilities capabilities) {
}
/**@hide*/
@@ -138,6 +143,7 @@
/**{@inheritDoc}*/
@Override
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void registerImsRegistrationCallback(
@NonNull @CallbackExecutor Executor executor,
@NonNull RegistrationCallback c)
@@ -155,6 +161,7 @@
/**{@inheritDoc}*/
@Override
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void unregisterImsRegistrationCallback(
@NonNull RegistrationManager.RegistrationCallback c) {
if (c == null) {
@@ -166,6 +173,7 @@
/**{@inheritDoc}*/
@Override
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void getRegistrationState(@NonNull @CallbackExecutor Executor executor,
@NonNull @ImsRegistrationState Consumer<Integer> stateCallback) {
if (stateCallback == null) {
@@ -180,6 +188,7 @@
/**{@inheritDoc}*/
@Override
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void getRegistrationTransportType(@NonNull @CallbackExecutor Executor executor,
@NonNull @AccessNetworkConstants.TransportType
Consumer<Integer> transportTypeCallback) {
@@ -215,7 +224,7 @@
* becomes inactive. See {@link ImsException#getCode()} for more information on the error codes.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
- public void registerRcsAvailabilityCallback(@CallbackExecutor Executor executor,
+ public void registerRcsAvailabilityCallback(@NonNull @CallbackExecutor Executor executor,
@NonNull AvailabilityCallback c) throws ImsException {
if (c == null) {
throw new IllegalArgumentException("Must include a non-null AvailabilityCallback.");
@@ -227,13 +236,13 @@
IImsRcsController imsRcsController = getIImsRcsController();
if (imsRcsController == null) {
Log.e(TAG, "Register availability callback: IImsRcsController is null");
- throw new ImsException("Can not find remote IMS service",
+ throw new ImsException("Cannot find remote IMS service",
ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
}
c.setExecutor(executor);
try {
- imsRcsController.registerRcsAvailabilityCallback(c.getBinder());
+ imsRcsController.registerRcsAvailabilityCallback(mSubId, c.getBinder());
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#registerRcsAvailabilityCallback", e);
throw new ImsException("Remote IMS Service is not available",
@@ -263,12 +272,12 @@
IImsRcsController imsRcsController = getIImsRcsController();
if (imsRcsController == null) {
Log.e(TAG, "Unregister availability callback: IImsRcsController is null");
- throw new ImsException("Can not find remote IMS service",
+ throw new ImsException("Cannot find remote IMS service",
ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
}
try {
- imsRcsController.unregisterRcsAvailabilityCallback(c.getBinder());
+ imsRcsController.unregisterRcsAvailabilityCallback(mSubId, c.getBinder());
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#unregisterRcsAvailabilityCallback", e);
throw new ImsException("Remote IMS Service is not available",
@@ -283,6 +292,9 @@
* RCS capabilities provided over-the-top by applications.
*
* @param capability The RCS capability to query.
+ * @param radioTech The radio tech that this capability failed for, defined as
+ * {@link ImsRegistrationImplBase#REGISTRATION_TECH_LTE} or
+ * {@link ImsRegistrationImplBase#REGISTRATION_TECH_IWLAN}.
* @return true if the RCS capability is capable for this subscription, false otherwise. This
* does not necessarily mean that we are registered for IMS and the capability is available, but
* rather the subscription is capable of this service over IMS.
@@ -293,17 +305,17 @@
* See {@link ImsException#getCode()} for more information on the error codes.
*/
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
- public boolean isCapable(@RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability)
- throws ImsException {
+ public boolean isCapable(@RcsFeature.RcsImsCapabilities.RcsImsCapabilityFlag int capability,
+ @ImsRegistrationImplBase.ImsRegistrationTech int radioTech) throws ImsException {
IImsRcsController imsRcsController = getIImsRcsController();
if (imsRcsController == null) {
Log.e(TAG, "isCapable: IImsRcsController is null");
- throw new ImsException("Can not find remote IMS service",
+ throw new ImsException("Cannot find remote IMS service",
ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
}
try {
- return imsRcsController.isCapable(mSubId, capability);
+ return imsRcsController.isCapable(mSubId, capability, radioTech);
} catch (RemoteException e) {
Log.e(TAG, "Error calling IImsRcsController#isCapable", e);
throw new ImsException("Remote IMS Service is not available",
@@ -332,7 +344,7 @@
IImsRcsController imsRcsController = getIImsRcsController();
if (imsRcsController == null) {
Log.e(TAG, "isAvailable: IImsRcsController is null");
- throw new ImsException("Can not find remote IMS service",
+ throw new ImsException("Cannot find remote IMS service",
ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
}
diff --git a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
index b379bd0..e81bac0 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
@@ -26,9 +26,9 @@
* {@hide}
*/
interface IImsRcsController {
- void registerRcsAvailabilityCallback(IImsCapabilityCallback c);
- void unregisterRcsAvailabilityCallback(IImsCapabilityCallback c);
- boolean isCapable(int subId, int capability);
+ void registerRcsAvailabilityCallback(int subId, IImsCapabilityCallback c);
+ void unregisterRcsAvailabilityCallback(int subId, IImsCapabilityCallback c);
+ boolean isCapable(int subId, int capability, int radioTech);
boolean isAvailable(int subId, int capability);
// ImsUceAdapter specific
diff --git a/telephony/java/android/telephony/ims/feature/RcsFeature.java b/telephony/java/android/telephony/ims/feature/RcsFeature.java
index e96d082..501e0e8 100644
--- a/telephony/java/android/telephony/ims/feature/RcsFeature.java
+++ b/telephony/java/android/telephony/ims/feature/RcsFeature.java
@@ -193,7 +193,6 @@
* of the capability and notify the capability status as true using
* {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)}. This will signal to the
* framework that the capability is available for usage.
- * @hide
*/
public static class RcsImsCapabilities extends Capabilities {
/** @hide*/
@@ -207,7 +206,6 @@
/**
* Undefined capability type for initialization
- * @hide
*/
public static final int CAPABILITY_TYPE_NONE = 0;
@@ -215,7 +213,6 @@
* This carrier supports User Capability Exchange using SIP OPTIONS as defined by the
* framework. If set, the RcsFeature should support capability exchange using SIP OPTIONS.
* If not set, this RcsFeature should not service capability requests.
- * @hide
*/
public static final int CAPABILITY_TYPE_OPTIONS_UCE = 1 << 0;
@@ -224,33 +221,27 @@
* framework. If set, the RcsFeature should support capability exchange using a presence
* server. If not set, this RcsFeature should not publish capabilities or service capability
* requests using presence.
- * @hide
*/
public static final int CAPABILITY_TYPE_PRESENCE_UCE = 1 << 1;
- /**@hide*/
public RcsImsCapabilities(@RcsImsCapabilityFlag int capabilities) {
super(capabilities);
}
- /**@hide*/
private RcsImsCapabilities(Capabilities c) {
super(c.getMask());
}
- /**@hide*/
@Override
public void addCapabilities(@RcsImsCapabilityFlag int capabilities) {
super.addCapabilities(capabilities);
}
- /**@hide*/
@Override
public void removeCapabilities(@RcsImsCapabilityFlag int capabilities) {
super.removeCapabilities(capabilities);
}
- /**@hide*/
@Override
public boolean isCapable(@RcsImsCapabilityFlag int capabilities) {
return super.isCapable(capabilities);
@@ -295,10 +286,9 @@
* set, the {@link RcsFeature} has brought up the capability and is ready for framework
* requests. To change the status of the capabilities
* {@link #notifyCapabilitiesStatusChanged(RcsImsCapabilities)} should be called.
- * @hide
*/
@Override
- public final RcsImsCapabilities queryCapabilityStatus() {
+ public @NonNull final RcsImsCapabilities queryCapabilityStatus() {
return new RcsImsCapabilities(super.queryCapabilityStatus());
}
@@ -306,7 +296,6 @@
* Notify the framework that the capabilities status has changed. If a capability is enabled,
* this signals to the framework that the capability has been initialized and is ready.
* Call {@link #queryCapabilityStatus()} to return the current capability status.
- * @hide
*/
public final void notifyCapabilitiesStatusChanged(@NonNull RcsImsCapabilities c) {
if (c == null) {
@@ -321,7 +310,6 @@
* {@link #changeEnabledCapabilities(CapabilityChangeRequest, CapabilityCallbackProxy)} to
* enable or disable capability A, this method should return the correct configuration for
* capability A afterwards (until it has changed).
- * @hide
*/
public boolean queryCapabilityConfiguration(
@RcsImsCapabilities.RcsImsCapabilityFlag int capability,
@@ -343,11 +331,10 @@
* If for some reason one or more of these capabilities can not be enabled/disabled,
* {@link CapabilityCallbackProxy#onChangeCapabilityConfigurationError(int, int, int)} should
* be called for each capability change that resulted in an error.
- * @hide
*/
@Override
- public void changeEnabledCapabilities(CapabilityChangeRequest request,
- CapabilityCallbackProxy c) {
+ public void changeEnabledCapabilities(@NonNull CapabilityChangeRequest request,
+ @NonNull CapabilityCallbackProxy c) {
// Base Implementation - Override to provide functionality
}
diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl
index c1d700a..91aa3ce 100644
--- a/telephony/java/com/android/internal/telephony/ISms.aidl
+++ b/telephony/java/com/android/internal/telephony/ISms.aidl
@@ -19,7 +19,6 @@
import android.app.PendingIntent;
import android.net.Uri;
import android.os.Bundle;
-import android.telephony.IFinancialSmsCallback;
import com.android.internal.telephony.SmsRawData;
/**
@@ -570,17 +569,6 @@
int subId, String callingPkg, String prefixes, in PendingIntent intent);
/**
- * Get sms inbox messages for the calling financial app.
- *
- * @param subId the SIM id.
- * @param callingPkg the package name of the calling app.
- * @param params parameters to filter the sms messages.
- * @param callback the callback interface to deliver the result.
- */
- void getSmsMessagesForFinancialApp(
- int subId, String callingPkg, in Bundle params, in IFinancialSmsCallback callback);
-
- /**
* Check if the destination is a possible premium short code.
*
* @param destAddress the destination address to test for possible short code
diff --git a/telephony/java/com/android/internal/telephony/ISmsImplBase.java b/telephony/java/com/android/internal/telephony/ISmsImplBase.java
index ff816f2..d9d4b60 100644
--- a/telephony/java/com/android/internal/telephony/ISmsImplBase.java
+++ b/telephony/java/com/android/internal/telephony/ISmsImplBase.java
@@ -19,7 +19,6 @@
import android.app.PendingIntent;
import android.net.Uri;
import android.os.Bundle;
-import android.telephony.IFinancialSmsCallback;
import java.util.List;
@@ -198,12 +197,6 @@
}
@Override
- public void getSmsMessagesForFinancialApp(
- int subId, String callingPkg, Bundle params, IFinancialSmsCallback callback) {
- throw new UnsupportedOperationException();
- }
-
- @Override
public int checkSmsShortCodeDestination(
int subid, String callingApk, String destAddress, String countryIso) {
throw new UnsupportedOperationException();
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index eedfc6a..3264c751 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -301,7 +301,7 @@
* operator's MCC (Mobile Country Code).
* @see android.telephony.TelephonyManager#getNetworkCountryIso
*/
- String getNetworkCountryIsoForPhone(int phoneId);
+ String getNetworkCountryIsoForPhone(int phoneId, String callingPkg);
/**
* Returns the neighboring cell information of the device.
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 03ea920..4421c77 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -485,6 +485,8 @@
int RIL_REQUEST_EMERGENCY_DIAL = 205;
int RIL_REQUEST_GET_PHONE_CAPABILITY = 206;
int RIL_REQUEST_SWITCH_DUAL_SIM_CONFIG = 207;
+ int RIL_REQUEST_ENABLE_UICC_APPLICATIONS = 208;
+ int RIL_REQUEST_GET_UICC_APPLICATIONS_ENABLEMENT = 209;
/* Responses begin */
int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
@@ -548,4 +550,5 @@
int RIL_UNSOL_ICC_SLOT_STATUS = 1100;
int RIL_UNSOL_PHYSICAL_CHANNEL_CONFIG = 1101;
int RIL_UNSOL_EMERGENCY_NUMBER_LIST = 1102;
+ int RIL_UNSOL_UICC_APPLICATIONS_ENABLEMENT_CHANGED = 1103;
}
diff --git a/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java b/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java
index 2cdf2f6..dcea9bb 100644
--- a/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java
+++ b/telephony/java/com/android/internal/telephony/Sms7BitEncodingTranslator.java
@@ -23,7 +23,7 @@
import android.util.SparseIntArray;
import com.android.internal.telephony.cdma.sms.UserData;
-import com.android.internal.util.XmlUtils;
+import com.android.internal.telephony.util.XmlUtils;
import dalvik.annotation.compat.UnsupportedAppUsage;
diff --git a/telephony/java/com/android/internal/telephony/util/TelephonyUtils.java b/telephony/java/com/android/internal/telephony/util/TelephonyUtils.java
new file mode 100644
index 0000000..a28d65c
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/util/TelephonyUtils.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.telephony.util;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.Context;
+import android.content.pm.ComponentInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.os.SystemProperties;
+
+import java.io.PrintWriter;
+
+/**
+ * This class provides various util functions
+ */
+public final class TelephonyUtils {
+ public static boolean IS_USER = "user".equals(android.os.Build.TYPE);
+ public static boolean IS_DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0) == 1;
+
+ /**
+ * Verify that caller holds {@link android.Manifest.permission#DUMP}.
+ *
+ * @return true if access should be granted.
+ */
+ public static boolean checkDumpPermission(Context context, String tag, PrintWriter pw) {
+ if (context.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
+ != PackageManager.PERMISSION_GRANTED) {
+ pw.println("Permission Denial: can't dump " + tag + " from from pid="
+ + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
+ + " due to missing android.permission.DUMP permission");
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ /** Returns an empty string if the input is {@code null}. */
+ public static String emptyIfNull(@Nullable String str) {
+ return str == null ? "" : str;
+ }
+
+ /** Throws a {@link RuntimeException} that wrapps the {@link RemoteException}. */
+ public static RuntimeException rethrowAsRuntimeException(RemoteException remoteException) {
+ throw new RuntimeException(remoteException);
+ }
+
+ /**
+ * Returns a {@link ComponentInfo} from the {@link ResolveInfo},
+ * or throws an {@link IllegalStateException} if not available.
+ */
+ public static ComponentInfo getComponentInfo(@NonNull ResolveInfo resolveInfo) {
+ if (resolveInfo.activityInfo != null) return resolveInfo.activityInfo;
+ if (resolveInfo.serviceInfo != null) return resolveInfo.serviceInfo;
+ if (resolveInfo.providerInfo != null) return resolveInfo.providerInfo;
+ throw new IllegalStateException("Missing ComponentInfo!");
+ }
+}
diff --git a/telephony/java/com/android/internal/telephony/util/XmlUtils.java b/telephony/java/com/android/internal/telephony/util/XmlUtils.java
new file mode 100644
index 0000000..72c5d3a
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/util/XmlUtils.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.telephony.util;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+import java.io.IOException;
+
+/** Utility methods for XML operations. */
+public final class XmlUtils {
+ private XmlUtils() {}
+
+ /**
+ * Moves parser to the first start tag, and expects the tag name being {@code firstElementName}.
+ */
+ public static void beginDocument(XmlPullParser parser, String firstElementName)
+ throws XmlPullParserException, IOException {
+ int type;
+ while ((type = parser.next()) != parser.START_TAG && type != parser.END_DOCUMENT) {
+ // no-op
+ }
+
+ if (type != parser.START_TAG) {
+ throw new XmlPullParserException("No start tag found");
+ }
+
+ if (!parser.getName().equals(firstElementName)) {
+ throw new XmlPullParserException("Unexpected start tag: found " + parser.getName()
+ + ", expected " + firstElementName);
+ }
+ }
+
+ /**
+ * Moves parser to the next start tag.
+ */
+ public static void nextElement(XmlPullParser parser)
+ throws XmlPullParserException, IOException {
+ int type;
+ while ((type = parser.next()) != parser.START_TAG && type != parser.END_DOCUMENT) {
+ // no-op
+ }
+ }
+
+ /**
+ * Moves parser to the next start tag within the {@code outerDepth}.
+ */
+ public static boolean nextElementWithin(XmlPullParser parser, int outerDepth)
+ throws IOException, XmlPullParserException {
+ for (;;) {
+ int type = parser.next();
+ if (type == XmlPullParser.END_DOCUMENT
+ || (type == XmlPullParser.END_TAG && parser.getDepth() == outerDepth)) {
+ return false;
+ }
+ if (type == XmlPullParser.START_TAG && parser.getDepth() == outerDepth + 1) {
+ return true;
+ }
+ }
+ }
+}
diff --git a/tools/localedata/extract_icu_data.py b/tools/localedata/extract_icu_data.py
index 6b4c346..ca1847a 100755
--- a/tools/localedata/extract_icu_data.py
+++ b/tools/localedata/extract_icu_data.py
@@ -176,6 +176,9 @@
dump_representative_locales(representative_locales)
return likely_script_dict
+def escape_script_variable_name(script):
+ """Escape characters, e.g. '~', in a C++ variable name"""
+ return script.replace("~", "_")
def read_parent_data(icu_data_dir):
"""Read locale parent data from ICU data files."""
@@ -221,7 +224,7 @@
for script in sorted_scripts:
parent_dict = script_organized_dict[script]
print ('const std::unordered_map<uint32_t, uint32_t> %s_PARENTS({'
- % script.upper())
+ % escape_script_variable_name(script.upper()))
for locale in sorted(parent_dict.keys()):
parent = parent_dict[locale]
print ' {0x%08Xu, 0x%08Xu}, // %s -> %s' % (
@@ -239,7 +242,7 @@
for script in sorted_scripts:
print " {{'%c', '%c', '%c', '%c'}, &%s_PARENTS}," % (
script[0], script[1], script[2], script[3],
- script.upper())
+ escape_script_variable_name(script.upper()))
print '};'