Merge "Dynamic broadcast receivers that are not exported need to be filtered in checkBroadcastFromSystem"
diff --git a/core/api/current.txt b/core/api/current.txt
index e3ec90ed..ff9c7b1 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -11938,6 +11938,7 @@
field public static final String FEATURE_IDENTITY_CREDENTIAL_HARDWARE_DIRECT_ACCESS = "android.hardware.identity_credential_direct_access";
field public static final String FEATURE_INPUT_METHODS = "android.software.input_methods";
field public static final String FEATURE_IPSEC_TUNNELS = "android.software.ipsec_tunnels";
+ field public static final String FEATURE_IPSEC_TUNNEL_MIGRATION = "android.software.ipsec_tunnel_migration";
field public static final String FEATURE_IRIS = "android.hardware.biometrics.iris";
field public static final String FEATURE_KEYSTORE_APP_ATTEST_KEY = "android.hardware.keystore.app_attest_key";
field public static final String FEATURE_KEYSTORE_LIMITED_USE_KEY = "android.hardware.keystore.limited_use_key";
@@ -41837,6 +41838,9 @@
field public static final int AUTHENTICATION_METHOD_CERT = 1; // 0x1
field public static final int AUTHENTICATION_METHOD_EAP_ONLY = 0; // 0x0
field public static final int EPDG_ADDRESS_CELLULAR_LOC = 3; // 0x3
+ field public static final int EPDG_ADDRESS_IPV4_ONLY = 2; // 0x2
+ field public static final int EPDG_ADDRESS_IPV4_PREFERRED = 0; // 0x0
+ field public static final int EPDG_ADDRESS_IPV6_PREFERRED = 1; // 0x1
field public static final int EPDG_ADDRESS_PCO = 2; // 0x2
field public static final int EPDG_ADDRESS_PLMN = 1; // 0x1
field public static final int EPDG_ADDRESS_STATIC = 0; // 0x0
@@ -41851,6 +41855,7 @@
field public static final String KEY_CHILD_SESSION_AES_CTR_KEY_SIZE_INT_ARRAY = "iwlan.child_session_aes_ctr_key_size_int_array";
field public static final String KEY_DIFFIE_HELLMAN_GROUPS_INT_ARRAY = "iwlan.diffie_hellman_groups_int_array";
field public static final String KEY_DPD_TIMER_SEC_INT = "iwlan.dpd_timer_sec_int";
+ field public static final String KEY_EPDG_ADDRESS_IP_TYPE_PREFERENCE_INT = "iwlan.epdg_address_ip_type_preference_int";
field public static final String KEY_EPDG_ADDRESS_PRIORITY_INT_ARRAY = "iwlan.epdg_address_priority_int_array";
field public static final String KEY_EPDG_AUTHENTICATION_METHOD_INT = "iwlan.epdg_authentication_method_int";
field public static final String KEY_EPDG_PCO_ID_IPV4_INT = "iwlan.epdg_pco_id_ipv4_int";
diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt
index ed2c8eb..8d53959 100644
--- a/core/api/module-lib-current.txt
+++ b/core/api/module-lib-current.txt
@@ -446,6 +446,10 @@
package android.telephony {
+ public class CarrierConfigManager {
+ field public static final String KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT = "min_udp_port_4500_nat_timeout_sec_int";
+ }
+
public abstract class CellSignalStrength {
method public static int getNumSignalStrengthLevels();
}
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 7d9ed29..d83ad3d 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -4058,6 +4058,17 @@
public static final String FEATURE_IPSEC_TUNNELS = "android.software.ipsec_tunnels";
/**
+ * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: The device has
+ * the requisite kernel support for migrating IPsec tunnels to new source/destination addresses.
+ *
+ * <p>This feature implies that the device supports XFRM Migration (CONFIG_XFRM_MIGRATE) and has
+ * the kernel fixes to support cross-address-family IPsec tunnel migration
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_IPSEC_TUNNEL_MIGRATION =
+ "android.software.ipsec_tunnel_migration";
+
+ /**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device supports a system interface for the user to select
* and bind device control services provided by applications.
diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java
index 399f11b..c731a80 100644
--- a/core/java/android/os/Debug.java
+++ b/core/java/android/os/Debug.java
@@ -982,6 +982,43 @@
/**
+ * Wait until a debugger attaches. As soon as a debugger attaches,
+ * suspend all Java threads and send VM_START (a.k.a VM_INIT)
+ * packet.
+ *
+ * @hide
+ */
+ public static void suspendAllAndSendVmStart() {
+ if (!VMDebug.isDebuggingEnabled()) {
+ return;
+ }
+
+ // if DDMS is listening, inform them of our plight
+ System.out.println("Sending WAIT chunk");
+ byte[] data = new byte[] { 0 }; // 0 == "waiting for debugger"
+ Chunk waitChunk = new Chunk(ChunkHandler.type("WAIT"), data, 0, 1);
+ DdmServer.sendChunk(waitChunk);
+
+ // We must wait until a debugger is connected (debug socket is
+ // open and at least one non-DDM JDWP packedt has been received.
+ // This guarantees that oj-libjdwp has been attached and that
+ // ART's default implementation of suspendAllAndSendVmStart has
+ // been replaced with an implementation that will suspendAll and
+ // send VM_START.
+ System.out.println("Waiting for debugger first packet");
+ while (!isDebuggerConnected()) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException ie) {
+ }
+ }
+
+ System.out.println("Debug.suspendAllAndSentVmStart");
+ VMDebug.suspendAllAndSendVmStart();
+ System.out.println("Debug.suspendAllAndSendVmStart, resumed");
+ }
+
+ /**
* Wait until a debugger attaches. As soon as the debugger attaches,
* this returns, so you will need to place a breakpoint after the
* waitForDebugger() call if you want to start tracing immediately.
diff --git a/core/java/android/os/ServiceManager.java b/core/java/android/os/ServiceManager.java
index 394927e..b210c46 100644
--- a/core/java/android/os/ServiceManager.java
+++ b/core/java/android/os/ServiceManager.java
@@ -292,8 +292,10 @@
* If the service is not running, servicemanager will attempt to start it, and this function
* will wait for it to be ready.
*
- * @return {@code null} if the service is not declared in the manifest, or if there are
- * permission problems, or if there are fatal errors.
+ * @throws SecurityException if the process does not have the permissions to check
+ * isDeclared() for the service.
+ * @return {@code null} if the service is not declared in the manifest, or if there
+ * are fatal errors.
* @hide
*/
@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
diff --git a/core/java/android/os/ThreadLocalWorkSource.java b/core/java/android/os/ThreadLocalWorkSource.java
index 894b1cc4..e9adb20 100644
--- a/core/java/android/os/ThreadLocalWorkSource.java
+++ b/core/java/android/os/ThreadLocalWorkSource.java
@@ -39,8 +39,8 @@
*/
public final class ThreadLocalWorkSource {
public static final int UID_NONE = Message.UID_NONE;
- private static final ThreadLocal<Integer> sWorkSourceUid =
- ThreadLocal.withInitial(() -> UID_NONE);
+ private static final ThreadLocal<int []> sWorkSourceUid =
+ ThreadLocal.withInitial(() -> new int[] {UID_NONE});
/**
* Returns the UID to blame for the code currently executed on this thread.
@@ -50,7 +50,7 @@
* <p>It can also be set manually using {@link #setUid(int)}.
*/
public static int getUid() {
- return sWorkSourceUid.get();
+ return sWorkSourceUid.get()[0];
}
/**
@@ -65,7 +65,7 @@
*/
public static long setUid(int uid) {
final long token = getToken();
- sWorkSourceUid.set(uid);
+ sWorkSourceUid.get()[0] = uid;
return token;
}
@@ -73,7 +73,7 @@
* Restores the state using the provided token.
*/
public static void restore(long token) {
- sWorkSourceUid.set(parseUidFromToken(token));
+ sWorkSourceUid.get()[0] = parseUidFromToken(token);
}
/**
@@ -88,7 +88,7 @@
* </pre>
*
* @return a token that can be used to restore the state.
- **/
+ */
public static long clear() {
return setUid(UID_NONE);
}
@@ -98,7 +98,7 @@
}
private static long getToken() {
- return sWorkSourceUid.get();
+ return sWorkSourceUid.get()[0];
}
private ThreadLocalWorkSource() {
diff --git a/core/java/android/security/net/config/SystemCertificateSource.java b/core/java/android/security/net/config/SystemCertificateSource.java
index cfb195b..4892312 100644
--- a/core/java/android/security/net/config/SystemCertificateSource.java
+++ b/core/java/android/security/net/config/SystemCertificateSource.java
@@ -18,6 +18,7 @@
import android.os.Environment;
import android.os.UserHandle;
+
import java.io.File;
/**
@@ -32,11 +33,20 @@
private final File mUserRemovedCaDir;
private SystemCertificateSource() {
- super(new File(System.getenv("ANDROID_ROOT") + "/etc/security/cacerts"));
+ super(getDirectory());
File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
mUserRemovedCaDir = new File(configDir, "cacerts-removed");
}
+ private static File getDirectory() {
+ // TODO(miguelaranda): figure out correct code path.
+ File updatable_dir = new File("/apex/com.android.conscrypt/cacerts");
+ if (updatable_dir.exists()) {
+ return updatable_dir;
+ }
+ return new File(System.getenv("ANDROID_ROOT") + "/etc/security/cacerts");
+ }
+
public static SystemCertificateSource getInstance() {
return NoPreloadHolder.INSTANCE;
}
diff --git a/core/java/android/security/rkp/IRemoteProvisioning.aidl b/core/java/android/security/rkp/IRemoteProvisioning.aidl
index 23d8159..0efaa89 100644
--- a/core/java/android/security/rkp/IRemoteProvisioning.aidl
+++ b/core/java/android/security/rkp/IRemoteProvisioning.aidl
@@ -58,11 +58,4 @@
*
*/
void getRegistration(String irpcName, IGetRegistrationCallback callback);
-
- /**
- * Cancel any active {@link getRegistration} call associated with the given
- * callback. If no getRegistration call is currently active, this function is
- * a noop.
- */
- void cancelGetRegistration(IGetRegistrationCallback callback);
}
diff --git a/core/java/android/service/chooser/OWNERS b/core/java/android/service/chooser/OWNERS
index a5acba5..dcd4a7b 100644
--- a/core/java/android/service/chooser/OWNERS
+++ b/core/java/android/service/chooser/OWNERS
@@ -1,4 +1,3 @@
-asc@google.com
-mpietal@google.com
-dsandler@android.com
-dsandler@google.com
+mrcasey@google.com
+ayepin@google.com
+joshtrask@google.com
diff --git a/core/java/android/service/controls/OWNERS b/core/java/android/service/controls/OWNERS
new file mode 100644
index 0000000..4bb78c7
--- /dev/null
+++ b/core/java/android/service/controls/OWNERS
@@ -0,0 +1,4 @@
+# Bug component: 802726
+asc@google.com
+kozynski@google.com
+juliacr@google.com
\ No newline at end of file
diff --git a/core/java/android/view/InputEventReceiver.java b/core/java/android/view/InputEventReceiver.java
index a24c1f9..492c938 100644
--- a/core/java/android/view/InputEventReceiver.java
+++ b/core/java/android/view/InputEventReceiver.java
@@ -77,7 +77,7 @@
mInputChannel = inputChannel;
mMessageQueue = looper.getQueue();
mReceiverPtr = nativeInit(new WeakReference<InputEventReceiver>(this),
- inputChannel, mMessageQueue);
+ mInputChannel, mMessageQueue);
mCloseGuard.open("InputEventReceiver.dispose");
}
diff --git a/core/java/android/view/InputEventSender.java b/core/java/android/view/InputEventSender.java
index 9035f3f..64f62c7 100644
--- a/core/java/android/view/InputEventSender.java
+++ b/core/java/android/view/InputEventSender.java
@@ -65,7 +65,7 @@
mInputChannel = inputChannel;
mMessageQueue = looper.getQueue();
mSenderPtr = nativeInit(new WeakReference<InputEventSender>(this),
- inputChannel, mMessageQueue);
+ mInputChannel, mMessageQueue);
mCloseGuard.open("InputEventSender.dispose");
}
diff --git a/core/java/com/android/internal/app/OWNERS b/core/java/com/android/internal/app/OWNERS
index 3833976..970728f 100644
--- a/core/java/com/android/internal/app/OWNERS
+++ b/core/java/com/android/internal/app/OWNERS
@@ -2,6 +2,7 @@
per-file *Resolver* = file:/packages/SystemUI/OWNERS
per-file *Chooser* = file:/packages/SystemUI/OWNERS
per-file SimpleIconFactory.java = file:/packages/SystemUI/OWNERS
+per-file AbstractMultiProfilePagerAdapter.java = file:/packages/SystemUI/OWNERS
per-file NetInitiatedActivity.java = file:/location/java/android/location/OWNERS
per-file *BatteryStats* = file:/BATTERY_STATS_OWNERS
@@ -11,4 +12,4 @@
per-file *Voice* = file:/core/java/android/service/voice/OWNERS
# System language settings
-per-file *Locale* = file:platform/packages/apps/Settings:/src/com/android/settings/localepicker/OWNERS
\ No newline at end of file
+per-file *Locale* = file:platform/packages/apps/Settings:/src/com/android/settings/localepicker/OWNERS
diff --git a/core/jni/com_android_internal_os_KernelAllocationStats.cpp b/core/jni/com_android_internal_os_KernelAllocationStats.cpp
index 5b10497..35c9487 100644
--- a/core/jni/com_android_internal_os_KernelAllocationStats.cpp
+++ b/core/jni/com_android_internal_os_KernelAllocationStats.cpp
@@ -44,7 +44,7 @@
static jobjectArray KernelAllocationStats_getDmabufAllocations(JNIEnv *env, jobject) {
std::vector<DmaBuffer> buffers;
- if (!dmabufinfo::ReadDmaBufs(&buffers)) {
+ if (!dmabufinfo::ReadProcfsDmaBufs(&buffers)) {
return nullptr;
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index e027332..5bcba48 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -257,6 +257,7 @@
android:name="com.android.bluetooth.BluetoothMapContentObserver.action.MESSAGE_DELIVERY" />
<protected-broadcast
android:name="android.bluetooth.pan.profile.action.CONNECTION_STATE_CHANGED" />
+ <protected-broadcast android:name="android.bluetooth.action.HAP_CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.action.LE_AUDIO_CONNECTION_STATE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.action.LE_AUDIO_ACTIVE_DEVICE_CHANGED" />
<protected-broadcast android:name="android.bluetooth.action.LE_AUDIO_CONF_CHANGED" />
diff --git a/core/tests/coretests/src/android/service/controls/OWNERS b/core/tests/coretests/src/android/service/controls/OWNERS
new file mode 100644
index 0000000..bf67034
--- /dev/null
+++ b/core/tests/coretests/src/android/service/controls/OWNERS
@@ -0,0 +1 @@
+include platform/frameworks/base:/core/java/android/service/controls/OWNERS
\ No newline at end of file
diff --git a/data/keyboards/Vendor_054c_Product_0df2.kl b/data/keyboards/Vendor_054c_Product_0df2.kl
new file mode 100644
index 0000000..a47b310
--- /dev/null
+++ b/data/keyboards/Vendor_054c_Product_0df2.kl
@@ -0,0 +1,73 @@
+# Copyright (C) 2022 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.
+
+#
+# Sony Playstation(R) DualSense Edge Controller
+#
+
+# Only use this key layout if we have HID_PLAYSTATION!
+requires_kernel_config CONFIG_HID_PLAYSTATION
+
+# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html
+
+# Square
+key 0x134 BUTTON_X
+# Cross
+key 0x130 BUTTON_A
+# Circle
+key 0x131 BUTTON_B
+# Triangle
+key 0x133 BUTTON_Y
+
+key 0x136 BUTTON_L1
+key 0x137 BUTTON_R1
+key 0x138 BUTTON_L2
+key 0x139 BUTTON_R2
+
+# L2 axis
+axis 0x02 LTRIGGER
+# R2 axis
+axis 0x05 RTRIGGER
+
+# Left Analog Stick
+axis 0x00 X
+axis 0x01 Y
+# Right Analog Stick
+axis 0x03 Z
+axis 0x04 RZ
+
+# Left stick click
+key 0x13d BUTTON_THUMBL
+# Right stick click
+key 0x13e BUTTON_THUMBR
+
+# Hat
+axis 0x10 HAT_X
+axis 0x11 HAT_Y
+
+# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
+# Share / "half-sun"
+key 0x13a BUTTON_SELECT
+# Options / three horizontal lines
+key 0x13b BUTTON_START
+# PS key
+key 0x13c BUTTON_MODE
+
+# SENSORs
+sensor 0x00 ACCELEROMETER X
+sensor 0x01 ACCELEROMETER Y
+sensor 0x02 ACCELEROMETER Z
+sensor 0x03 GYROSCOPE X
+sensor 0x04 GYROSCOPE Y
+sensor 0x05 GYROSCOPE Z
diff --git a/data/keyboards/Vendor_054c_Product_0df2_fallback.kl b/data/keyboards/Vendor_054c_Product_0df2_fallback.kl
new file mode 100644
index 0000000..bfebb17
--- /dev/null
+++ b/data/keyboards/Vendor_054c_Product_0df2_fallback.kl
@@ -0,0 +1,75 @@
+# Copyright (C) 2022 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.
+
+#
+# Sony Playstation(R) DualSense Edge Controller
+#
+
+# Use this if HID_PLAYSTATION is not available
+
+# Mapping according to https://developer.android.com/training/game-controllers/controller-input.html
+
+# Square
+key 304 BUTTON_X
+# Cross
+key 305 BUTTON_A
+# Circle
+key 306 BUTTON_B
+# Triangle
+key 307 BUTTON_Y
+
+key 308 BUTTON_L1
+key 309 BUTTON_R1
+key 310 BUTTON_L2
+key 311 BUTTON_R2
+
+# L2 axis
+axis 0x03 LTRIGGER
+# R2 axis
+axis 0x04 RTRIGGER
+
+# Left Analog Stick
+axis 0x00 X
+axis 0x01 Y
+# Right Analog Stick
+axis 0x02 Z
+axis 0x05 RZ
+
+# Left stick click
+key 314 BUTTON_THUMBL
+# Right stick click
+key 315 BUTTON_THUMBR
+
+# Hat
+axis 0x10 HAT_X
+axis 0x11 HAT_Y
+
+# Mapping according to https://www.kernel.org/doc/Documentation/input/gamepad.txt
+# Share / "half-sun"
+key 312 BUTTON_SELECT
+# Options / three horizontal lines
+key 313 BUTTON_START
+# PS key
+key 316 BUTTON_MODE
+
+# Touchpad press
+key 317 BUTTON_1
+
+# SENSORs
+sensor 0x00 ACCELEROMETER X
+sensor 0x01 ACCELEROMETER Y
+sensor 0x02 ACCELEROMETER Z
+sensor 0x03 GYROSCOPE X
+sensor 0x04 GYROSCOPE Y
+sensor 0x05 GYROSCOPE Z
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
index 9947d34..c55a781 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
@@ -38,6 +38,7 @@
import java.security.Security;
import java.security.Signature;
import java.security.UnrecoverableKeyException;
+import java.security.cert.X509Certificate;
import java.security.interfaces.ECPublicKey;
import java.security.interfaces.RSAPublicKey;
@@ -221,7 +222,14 @@
}
final byte[] x509PublicCert = metadata.certificate;
- PublicKey publicKey = AndroidKeyStoreSpi.toCertificate(x509PublicCert).getPublicKey();
+ final X509Certificate parsedX509Certificate =
+ AndroidKeyStoreSpi.toCertificate(x509PublicCert);
+ if (parsedX509Certificate == null) {
+ throw new UnrecoverableKeyException("Failed to parse the X.509 certificate containing"
+ + " the public key. This likely indicates a hardware problem.");
+ }
+
+ PublicKey publicKey = parsedX509Certificate.getPublicKey();
String jcaKeyAlgorithm = publicKey.getAlgorithm();
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index e60d537..667a9ae 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -946,6 +946,10 @@
id = generateInputId(componentName, mTvInputHardwareInfo);
type = sHardwareTypeToTvInputType.get(mTvInputHardwareInfo.getType(), TYPE_TUNER);
isHardwareInput = true;
+ if (mTvInputHardwareInfo.getType() == TvInputHardwareInfo.TV_INPUT_TYPE_HDMI) {
+ mHdmiDeviceInfo = HdmiDeviceInfo.hardwarePort(
+ HdmiDeviceInfo.PATH_INVALID, mTvInputHardwareInfo.getHdmiPortId());
+ }
} else {
id = generateInputId(componentName);
type = TYPE_TUNER;
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 1183ca3..d8705a7 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -1285,7 +1285,7 @@
CHECK(clazz.get() != NULL);
jmethodID constructID =
- env->GetMethodID(clazz.get(), "<init>", "(ILjava/lang/String;)V");
+ env->GetMethodID(clazz.get(), "<init>", "(Ljava/lang/String;IIII)V");
CHECK(constructID != NULL);
std::string defaultMsg = "Unknown Error";
@@ -1335,14 +1335,14 @@
break;
}
- std::string msgStr(msg != NULL ? msg : defaultMsg.c_str());
- if (crypto != NULL) {
- msgStr = DrmUtils::GetExceptionMessage(err, msgStr.c_str(), crypto);
- }
- jstring msgObj = env->NewStringUTF(msgStr.c_str());
+ std::string originalMsg(msg != NULL ? msg : defaultMsg.c_str());
+ DrmStatus dStatus(err, originalMsg.c_str());
+ std::string detailedMsg(DrmUtils::GetExceptionMessage(dStatus, defaultMsg.c_str(), crypto));
+ jstring msgObj = env->NewStringUTF(detailedMsg.c_str());
jthrowable exception =
- (jthrowable)env->NewObject(clazz.get(), constructID, jerr, msgObj);
+ (jthrowable)env->NewObject(clazz.get(), constructID, msgObj, jerr,
+ dStatus.getCdmErr(), dStatus.getOemErr(), dStatus.getContext());
env->Throw(exception);
}
diff --git a/media/jni/android_media_MediaDrm.cpp b/media/jni/android_media_MediaDrm.cpp
index c9d920f..681d76a 100644
--- a/media/jni/android_media_MediaDrm.cpp
+++ b/media/jni/android_media_MediaDrm.cpp
@@ -244,6 +244,20 @@
}
return arrayList;
}
+
+int drmThrowException(JNIEnv* env, const char *className, const DrmStatus &err, const char *msg) {
+ using namespace android::jnihelp;
+ jstring _detailMessage = CreateExceptionMsg(env, msg);
+ int _status = ThrowException(env, className, "(Ljava/lang/String;III)V",
+ _detailMessage,
+ err.getCdmErr(),
+ err.getOemErr(),
+ err.getContext());
+ if (_detailMessage != NULL) {
+ env->DeleteLocalRef(_detailMessage);
+ }
+ return _status;
+}
} // namespace anonymous
// ----------------------------------------------------------------------------
@@ -393,8 +407,8 @@
jint jerr = MediaErrorToJavaError(err);
jobject exception = env->NewObject(gFields.stateException.classId,
- gFields.stateException.init, static_cast<int>(jerr),
- env->NewStringUTF(msg));
+ gFields.stateException.init, env->NewStringUTF(msg), static_cast<int>(jerr),
+ err.getCdmErr(), err.getOemErr(), err.getContext());
env->Throw(static_cast<jthrowable>(exception));
}
@@ -411,10 +425,13 @@
}
jobject exception = env->NewObject(gFields.sessionException.classId,
- gFields.sessionException.init, static_cast<int>(err),
- env->NewStringUTF(msg));
+ gFields.sessionException.init,
+ env->NewStringUTF(msg),
+ jErrorCode,
+ err.getCdmErr(),
+ err.getOemErr(),
+ err.getContext());
- env->SetIntField(exception, gFields.sessionException.errorCode, jErrorCode);
env->Throw(static_cast<jthrowable>(exception));
}
@@ -437,13 +454,13 @@
jniThrowException(env, "java/lang/UnsupportedOperationException", msg);
return true;
} else if (err == ERROR_DRM_NOT_PROVISIONED) {
- jniThrowException(env, "android/media/NotProvisionedException", msg);
+ drmThrowException(env, "android/media/NotProvisionedException", err, msg);
return true;
} else if (err == ERROR_DRM_RESOURCE_BUSY) {
- jniThrowException(env, "android/media/ResourceBusyException", msg);
+ drmThrowException(env, "android/media/ResourceBusyException", err, msg);
return true;
} else if (err == ERROR_DRM_DEVICE_REVOKED) {
- jniThrowException(env, "android/media/DeniedByServerException", msg);
+ drmThrowException(env, "android/media/DeniedByServerException", err, msg);
return true;
} else if (err == DEAD_OBJECT) {
jniThrowException(env, "android/media/MediaDrmResetException", msg);
@@ -915,11 +932,11 @@
gFields.arraylistClassId = static_cast<jclass>(env->NewGlobalRef(clazz));
FIND_CLASS(clazz, "android/media/MediaDrm$MediaDrmStateException");
- GET_METHOD_ID(gFields.stateException.init, clazz, "<init>", "(ILjava/lang/String;)V");
+ GET_METHOD_ID(gFields.stateException.init, clazz, "<init>", "(Ljava/lang/String;IIII)V");
gFields.stateException.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
FIND_CLASS(clazz, "android/media/MediaDrm$SessionException");
- GET_METHOD_ID(gFields.sessionException.init, clazz, "<init>", "(ILjava/lang/String;)V");
+ GET_METHOD_ID(gFields.sessionException.init, clazz, "<init>", "(Ljava/lang/String;IIII)V");
gFields.sessionException.classId = static_cast<jclass>(env->NewGlobalRef(clazz));
GET_FIELD_ID(gFields.sessionException.errorCode, clazz, "mErrorCode", "I");
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index 19dbee7..c15e419 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -140,6 +140,7 @@
import com.android.internal.net.VpnConfig;
import com.android.internal.net.VpnProfile;
import com.android.modules.utils.build.SdkLevel;
+import com.android.net.module.util.BinderUtils;
import com.android.net.module.util.NetdUtils;
import com.android.net.module.util.NetworkStackConstants;
import com.android.server.DeviceIdleInternal;
@@ -2783,6 +2784,16 @@
return hasIPV6 && !hasIPV4;
}
+ private void setVpnNetworkPreference(String session, Set<Range<Integer>> ranges) {
+ BinderUtils.withCleanCallingIdentity(
+ () -> mConnectivityManager.setVpnDefaultForUids(session, ranges));
+ }
+
+ private void clearVpnNetworkPreference(String session) {
+ BinderUtils.withCleanCallingIdentity(
+ () -> mConnectivityManager.setVpnDefaultForUids(session, Collections.EMPTY_LIST));
+ }
+
/**
* Internal class managing IKEv2/IPsec VPN connectivity
*
@@ -2894,6 +2905,9 @@
(r, exe) -> {
Log.d(TAG, "Runnable " + r + " rejected by the mExecutor");
});
+ setVpnNetworkPreference(mSessionKey,
+ createUserAndRestrictedProfilesRanges(mUserId,
+ mConfig.allowedApplications, mConfig.disallowedApplications));
}
@Override
@@ -3047,7 +3061,6 @@
mConfig.dnsServers.addAll(dnsAddrStrings);
mConfig.underlyingNetworks = new Network[] {network};
- mConfig.disallowedApplications = getAppExclusionList(mPackage);
networkAgent = mNetworkAgent;
@@ -3750,6 +3763,7 @@
mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
mConnectivityDiagnosticsManager.unregisterConnectivityDiagnosticsCallback(
mDiagnosticsCallback);
+ clearVpnNetworkPreference(mSessionKey);
mExecutor.shutdown();
}
@@ -4310,6 +4324,7 @@
mConfig.requiresInternetValidation = profile.requiresInternetValidation;
mConfig.excludeLocalRoutes = profile.excludeLocalRoutes;
mConfig.allowBypass = profile.isBypassable;
+ mConfig.disallowedApplications = getAppExclusionList(mPackage);
switch (profile.type) {
case VpnProfile.TYPE_IKEV2_IPSEC_USER_PASS:
@@ -4462,6 +4477,9 @@
.setUids(createUserAndRestrictedProfilesRanges(
mUserId, null /* allowedApplications */, excludedApps))
.build();
+ setVpnNetworkPreference(getSessionKeyLocked(),
+ createUserAndRestrictedProfilesRanges(mUserId,
+ mConfig.allowedApplications, mConfig.disallowedApplications));
doSendNetworkCapabilities(mNetworkAgent, mNetworkCapabilities);
}
}
diff --git a/services/core/java/com/android/server/net/NetworkPolicyLogger.java b/services/core/java/com/android/server/net/NetworkPolicyLogger.java
index 4a0a07b..dc8fcb0 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyLogger.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyLogger.java
@@ -94,7 +94,7 @@
void networkBlocked(int uid, @Nullable UidBlockedState uidBlockedState) {
synchronized (mLock) {
if (LOGD || uid == mDebugUid) {
- Slog.d(TAG, "Blocked state of " + uid + ": " + uidBlockedState.toString());
+ Slog.d(TAG, "Blocked state of " + uid + ": " + uidBlockedState);
}
if (uidBlockedState == null) {
mNetworkBlockedBuffer.networkBlocked(uid, BLOCKED_REASON_NONE, ALLOWED_REASON_NONE,
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index dbf05f1..ed4ba0d 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -4212,8 +4212,8 @@
}
private boolean forceSuspendInternal(int uid) {
- try {
- synchronized (mLock) {
+ synchronized (mLock) {
+ try {
mForceSuspendActive = true;
// Place the system in an non-interactive state
for (int idx = 0; idx < mPowerGroups.size(); idx++) {
@@ -4223,16 +4223,14 @@
// Disable all the partial wake locks as well
updateWakeLockDisabledStatesLocked();
- }
- Slog.i(TAG, "Force-Suspending (uid " + uid + ")...");
- boolean success = mNativeWrapper.nativeForceSuspend();
- if (!success) {
- Slog.i(TAG, "Force-Suspending failed in native.");
- }
- return success;
- } finally {
- synchronized (mLock) {
+ Slog.i(TAG, "Force-Suspending (uid " + uid + ")...");
+ boolean success = mNativeWrapper.nativeForceSuspend();
+ if (!success) {
+ Slog.i(TAG, "Force-Suspending failed in native.");
+ }
+ return success;
+ } finally {
mForceSuspendActive = false;
// Re-enable wake locks once again.
updateWakeLockDisabledStatesLocked();
diff --git a/services/core/java/com/android/server/security/OWNERS b/services/core/java/com/android/server/security/OWNERS
index 5c2d5ba..5bcc98b6 100644
--- a/services/core/java/com/android/server/security/OWNERS
+++ b/services/core/java/com/android/server/security/OWNERS
@@ -1,4 +1,4 @@
# Bug component: 36824
per-file *AttestationVerification* = file:/core/java/android/security/attestationverification/OWNERS
-per-file FileIntegrityService.java = victorhsieh@google.com
+per-file FileIntegrity*.java = victorhsieh@google.com
diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java
new file mode 100644
index 0000000..868f34b
--- /dev/null
+++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningRegistration.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.security.rkp;
+
+import android.os.CancellationSignal;
+import android.os.OperationCanceledException;
+import android.os.OutcomeReceiver;
+import android.security.rkp.IGetKeyCallback;
+import android.security.rkp.IRegistration;
+import android.security.rkp.service.RegistrationProxy;
+import android.security.rkp.service.RemotelyProvisionedKey;
+import android.util.Log;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Executor;
+
+/**
+ * Implements android.security.rkp.IRegistration as a thin wrapper around the java code
+ * exported by com.android.rkp.
+ *
+ * @hide
+ */
+final class RemoteProvisioningRegistration extends IRegistration.Stub {
+ static final String TAG = RemoteProvisioningService.TAG;
+ private final ConcurrentHashMap<IGetKeyCallback, CancellationSignal> mOperations =
+ new ConcurrentHashMap<>();
+ private final RegistrationProxy mRegistration;
+ private final Executor mExecutor;
+
+ private class GetKeyReceiver implements OutcomeReceiver<RemotelyProvisionedKey, Exception> {
+ IGetKeyCallback mCallback;
+ GetKeyReceiver(IGetKeyCallback callback) {
+ mCallback = callback;
+ }
+
+ @Override
+ public void onResult(RemotelyProvisionedKey result) {
+ mOperations.remove(mCallback);
+ Log.i(TAG, "Successfully fetched key for client " + mCallback.hashCode());
+ android.security.rkp.RemotelyProvisionedKey parcelable =
+ new android.security.rkp.RemotelyProvisionedKey();
+ parcelable.keyBlob = result.getKeyBlob();
+ parcelable.encodedCertChain = result.getEncodedCertChain();
+ wrapCallback(() -> mCallback.onSuccess(parcelable));
+ }
+
+ @Override
+ public void onError(Exception e) {
+ mOperations.remove(mCallback);
+ if (e instanceof OperationCanceledException) {
+ Log.i(TAG, "Operation cancelled for client " + mCallback.hashCode());
+ wrapCallback(mCallback::onCancel);
+ } else {
+ Log.e(TAG, "Error fetching key for client " + mCallback.hashCode(), e);
+ wrapCallback(() -> mCallback.onError(e.getMessage()));
+ }
+ }
+ }
+
+ RemoteProvisioningRegistration(RegistrationProxy registration, Executor executor) {
+ mRegistration = registration;
+ mExecutor = executor;
+ }
+
+ @Override
+ public void getKey(int keyId, IGetKeyCallback callback) {
+ CancellationSignal cancellationSignal = new CancellationSignal();
+ if (mOperations.putIfAbsent(callback, cancellationSignal) != null) {
+ Log.e(TAG, "Client can only request one call at a time " + callback.hashCode());
+ throw new IllegalArgumentException(
+ "Callback is already associated with an existing operation: "
+ + callback.hashCode());
+ }
+
+ try {
+ Log.i(TAG, "Fetching key " + keyId + " for client " + callback.hashCode());
+ mRegistration.getKeyAsync(keyId, cancellationSignal, mExecutor,
+ new GetKeyReceiver(callback));
+ } catch (Exception e) {
+ Log.e(TAG, "getKeyAsync threw an exception for client " + callback.hashCode(), e);
+ mOperations.remove(callback);
+ wrapCallback(() -> callback.onError(e.getMessage()));
+ }
+ }
+
+ @Override
+ public void cancelGetKey(IGetKeyCallback callback) {
+ CancellationSignal cancellationSignal = mOperations.remove(callback);
+ if (cancellationSignal == null) {
+ throw new IllegalArgumentException(
+ "Invalid client in cancelGetKey: " + callback.hashCode());
+ }
+
+ Log.i(TAG, "Requesting cancellation for client " + callback.hashCode());
+ cancellationSignal.cancel();
+ }
+
+ @Override
+ public void storeUpgradedKey(byte[] oldKeyBlob, byte[] newKeyBlob) {
+ // TODO(b/262748535)
+ Log.e(TAG, "RegistrationBinder.storeUpgradedKey NOT YET IMPLEMENTED");
+ }
+
+ interface CallbackRunner {
+ void run() throws Exception;
+ }
+
+ private void wrapCallback(CallbackRunner callback) {
+ // Exceptions resulting from notifications to IGetKeyCallback objects can only be logged,
+ // since getKey execution is asynchronous, and there's no way for an exception to be
+ // properly handled up the stack.
+ try {
+ callback.run();
+ } catch (Exception e) {
+ Log.e(TAG, "Error invoking callback on client binder", e);
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java b/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java
index 65a4b38..cd1a968 100644
--- a/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java
+++ b/services/core/java/com/android/server/security/rkp/RemoteProvisioningService.java
@@ -20,9 +20,7 @@
import android.os.Binder;
import android.os.OutcomeReceiver;
import android.os.RemoteException;
-import android.security.rkp.IGetKeyCallback;
import android.security.rkp.IGetRegistrationCallback;
-import android.security.rkp.IRegistration;
import android.security.rkp.IRemoteProvisioning;
import android.security.rkp.service.RegistrationProxy;
import android.util.Log;
@@ -30,6 +28,7 @@
import com.android.server.SystemService;
import java.time.Duration;
+import java.util.concurrent.Executor;
/**
* Implements the remote provisioning system service. This service is backed by a mainline
@@ -43,6 +42,35 @@
private static final Duration CREATE_REGISTRATION_TIMEOUT = Duration.ofSeconds(10);
private final RemoteProvisioningImpl mBinderImpl = new RemoteProvisioningImpl();
+ private static class RegistrationReceiver implements
+ OutcomeReceiver<RegistrationProxy, Exception> {
+ private final Executor mExecutor;
+ private final IGetRegistrationCallback mCallback;
+
+ RegistrationReceiver(Executor executor, IGetRegistrationCallback callback) {
+ mExecutor = executor;
+ mCallback = callback;
+ }
+
+ @Override
+ public void onResult(RegistrationProxy registration) {
+ try {
+ mCallback.onSuccess(new RemoteProvisioningRegistration(registration, mExecutor));
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling success callback " + mCallback.hashCode(), e);
+ }
+ }
+
+ @Override
+ public void onError(Exception error) {
+ try {
+ mCallback.onError(error.toString());
+ } catch (RemoteException e) {
+ Log.e(TAG, "Error calling error callback " + mCallback.hashCode(), e);
+ }
+ }
+ }
+
/** @hide */
public RemoteProvisioningService(Context context) {
super(context);
@@ -54,73 +82,20 @@
}
private final class RemoteProvisioningImpl extends IRemoteProvisioning.Stub {
-
- final class RegistrationBinder extends IRegistration.Stub {
- static final String TAG = RemoteProvisioningService.TAG;
- private final RegistrationProxy mRegistration;
-
- RegistrationBinder(RegistrationProxy registration) {
- mRegistration = registration;
- }
-
- @Override
- public void getKey(int keyId, IGetKeyCallback callback) {
- Log.e(TAG, "RegistrationBinder.getKey NOT YET IMPLEMENTED");
- }
-
- @Override
- public void cancelGetKey(IGetKeyCallback callback) {
- Log.e(TAG, "RegistrationBinder.cancelGetKey NOT YET IMPLEMENTED");
- }
-
- @Override
- public void storeUpgradedKey(byte[] oldKeyBlob, byte[] newKeyBlob) {
- Log.e(TAG, "RegistrationBinder.storeUpgradedKey NOT YET IMPLEMENTED");
- }
- }
-
@Override
public void getRegistration(String irpcName, IGetRegistrationCallback callback)
throws RemoteException {
final int callerUid = Binder.getCallingUidOrThrow();
final long callingIdentity = Binder.clearCallingIdentity();
+ final Executor executor = getContext().getMainExecutor();
try {
Log.i(TAG, "getRegistration(" + irpcName + ")");
- RegistrationProxy.createAsync(
- getContext(),
- callerUid,
- irpcName,
- CREATE_REGISTRATION_TIMEOUT,
- getContext().getMainExecutor(),
- new OutcomeReceiver<>() {
- @Override
- public void onResult(RegistrationProxy registration) {
- try {
- callback.onSuccess(new RegistrationBinder(registration));
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling success callback", e);
- }
- }
-
- @Override
- public void onError(Exception error) {
- try {
- callback.onError(error.toString());
- } catch (RemoteException e) {
- Log.e(TAG, "Error calling error callback", e);
- }
- }
- });
+ RegistrationProxy.createAsync(getContext(), callerUid, irpcName,
+ CREATE_REGISTRATION_TIMEOUT, executor,
+ new RegistrationReceiver(executor, callback));
} finally {
Binder.restoreCallingIdentity(callingIdentity);
}
}
-
- @Override
- public void cancelGetRegistration(IGetRegistrationCallback callback)
- throws RemoteException {
- Log.i(TAG, "cancelGetRegistration()");
- callback.onError("cancelGetRegistration not yet implemented");
- }
}
}
diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java
index ff09163..330c098 100644
--- a/services/core/java/com/android/server/wm/TaskDisplayArea.java
+++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java
@@ -1085,10 +1085,14 @@
// Use launch-adjacent-flag-root if launching with launch-adjacent flag.
if ((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) != 0
&& mLaunchAdjacentFlagRootTask != null) {
- // If the adjacent launch is coming from the same root, launch to adjacent root instead.
- if (sourceTask != null && mLaunchAdjacentFlagRootTask.getAdjacentTaskFragment() != null
+ if (sourceTask != null && sourceTask == candidateTask) {
+ // Do nothing when task that is getting opened is same as the source.
+ } else if (sourceTask != null
+ && mLaunchAdjacentFlagRootTask.getAdjacentTaskFragment() != null
&& (sourceTask == mLaunchAdjacentFlagRootTask
|| sourceTask.isDescendantOf(mLaunchAdjacentFlagRootTask))) {
+ // If the adjacent launch is coming from the same root, launch to
+ // adjacent root instead.
return mLaunchAdjacentFlagRootTask.getAdjacentTaskFragment().asTask();
} else {
return mLaunchAdjacentFlagRootTask;
diff --git a/telephony/java/android/telephony/AccessNetworkConstants.java b/telephony/java/android/telephony/AccessNetworkConstants.java
index 0fdf40d..27ba676 100644
--- a/telephony/java/android/telephony/AccessNetworkConstants.java
+++ b/telephony/java/android/telephony/AccessNetworkConstants.java
@@ -605,9 +605,9 @@
EUTRAN_ARFCN_FREQUENCY_BAND_41(
EutranBand.BAND_41, 2496000, 39650, 41589, 2496000, 39650, 41589),
EUTRAN_ARFCN_FREQUENCY_BAND_42(
- EutranBand.BAND_42, 3400000, 41950, 43589, 3400000, 41950, 43589),
+ EutranBand.BAND_42, 3400000, 41590, 43589, 3400000, 41590, 43589),
EUTRAN_ARFCN_FREQUENCY_BAND_43(
- EutranBand.BAND_43, 3600000, 43950, 45589, 3600000, 43950, 45589),
+ EutranBand.BAND_43, 3600000, 43590, 45589, 3600000, 43590, 45589),
EUTRAN_ARFCN_FREQUENCY_BAND_44(
EutranBand.BAND_44, 703000, 45590, 46589, 703000, 45590, 46589),
EUTRAN_ARFCN_FREQUENCY_BAND_45(
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 12d1bc3..d8c1b57e3 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -4308,6 +4308,18 @@
"data_switch_validation_timeout_long";
/**
+ * The minimum timeout of UDP port 4500 NAT / firewall entries on the Internet PDN of this
+ * carrier network. This will be used by Android platform VPNs to tune IPsec NAT keepalive
+ * interval. If this value is too low to provide uninterrupted inbound connectivity, then
+ * Android system VPNs may indicate to applications that the VPN cannot support long-lived
+ * TCP connections.
+ * @hide
+ */
+ @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+ public static final String KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT =
+ "min_udp_port_4500_nat_timeout_sec_int";
+
+ /**
* Specifies whether the system should prefix the EAP method to the anonymous identity.
* The following prefix will be added if this key is set to TRUE:
* EAP-AKA: "0"
@@ -8008,6 +8020,14 @@
public static final String KEY_SUPPORTS_EAP_AKA_FAST_REAUTH_BOOL =
KEY_PREFIX + "supports_eap_aka_fast_reauth_bool";
+ /**
+ * Type of IP preference used to prioritize ePDG servers. Possible values are
+ * {@link #EPDG_ADDRESS_IPV4_PREFERRED}, {@link #EPDG_ADDRESS_IPV6_PREFERRED},
+ * {@link #EPDG_ADDRESS_IPV4_ONLY}
+ */
+ public static final String KEY_EPDG_ADDRESS_IP_TYPE_PREFERENCE_INT =
+ KEY_PREFIX + "epdg_address_ip_type_preference_int";
+
/** @hide */
@IntDef({AUTHENTICATION_METHOD_EAP_ONLY, AUTHENTICATION_METHOD_CERT})
public @interface AuthenticationMethodType {}
@@ -8072,6 +8092,39 @@
*/
public static final int ID_TYPE_KEY_ID = 11;
+ /** @hide */
+ @IntDef({
+ EPDG_ADDRESS_IPV4_PREFERRED,
+ EPDG_ADDRESS_IPV6_PREFERRED,
+ EPDG_ADDRESS_IPV4_ONLY,
+ EPDG_ADDRESS_IPV6_ONLY,
+ EPDG_ADDRESS_SYSTEM_PREFERRED
+ })
+ public @interface EpdgAddressIpPreference {}
+
+ /** Prioritize IPv4 ePDG addresses. */
+ public static final int EPDG_ADDRESS_IPV4_PREFERRED = 0;
+
+ /** Prioritize IPv6 ePDG addresses */
+ public static final int EPDG_ADDRESS_IPV6_PREFERRED = 1;
+
+ /** Use IPv4 ePDG addresses only. */
+ public static final int EPDG_ADDRESS_IPV4_ONLY = 2;
+
+ /** Use IPv6 ePDG addresses only.
+ * @hide
+ */
+ public static final int EPDG_ADDRESS_IPV6_ONLY = 3;
+
+ /** Follow the priority from DNS resolution results, which are sorted by using RFC6724
+ * algorithm.
+ *
+ * @see <a href="https://tools.ietf.org/html/rfc6724#section-6">RFC 6724, Default Address
+ * Selection for Internet Protocol Version 6 (IPv6)</a>
+ * @hide
+ */
+ public static final int EPDG_ADDRESS_SYSTEM_PREFERRED = 4;
+
private Iwlan() {}
private static PersistableBundle getDefaults() {
@@ -8155,7 +8208,7 @@
defaults.putInt(KEY_EPDG_PCO_ID_IPV6_INT, 0);
defaults.putInt(KEY_EPDG_PCO_ID_IPV4_INT, 0);
defaults.putBoolean(KEY_SUPPORTS_EAP_AKA_FAST_REAUTH_BOOL, false);
-
+ defaults.putInt(KEY_EPDG_ADDRESS_IP_TYPE_PREFERENCE_INT, EPDG_ADDRESS_IPV4_PREFERRED);
return defaults;
}
}
@@ -9130,6 +9183,7 @@
sDefaults.putStringArray(KEY_MMI_TWO_DIGIT_NUMBER_PATTERN_STRING_ARRAY, new String[0]);
sDefaults.putInt(KEY_PARAMETERS_USED_FOR_LTE_SIGNAL_BAR_INT,
CellSignalStrengthLte.USE_RSRP);
+ sDefaults.putInt(KEY_MIN_UDP_PORT_4500_NAT_TIMEOUT_SEC_INT, 300);
// Default wifi configurations.
sDefaults.putAll(Wifi.getDefaults());
sDefaults.putBoolean(ENABLE_EAP_METHOD_PREFIX_BOOL, false);
diff --git a/telephony/java/android/telephony/data/QosBearerFilter.java b/telephony/java/android/telephony/data/QosBearerFilter.java
index 0ab7b61..a0d9c1bd 100644
--- a/telephony/java/android/telephony/data/QosBearerFilter.java
+++ b/telephony/java/android/telephony/data/QosBearerFilter.java
@@ -130,6 +130,10 @@
return precedence;
}
+ public int getProtocol() {
+ return protocol;
+ }
+
public static class PortRange implements Parcelable {
int start;
int end;