Merge tag 'android-13.0.0_r43' into int/13/fp3

Android 13.0.0 release 43

* tag 'android-13.0.0_r43':
  Add control for enable/disable N1_MODE_CAPABILITY
  Add control for enable/disable N1_MODE_CAPABILITY
  Add control for enable/disable N1_MODE_CAPABILITY
  Add control for enable/disable N1_MODE_CAPABILITY
  Add control for enable/disable N1_MODE_CAPABILITY

Change-Id: Id38a0f0b3f6edc6fad0a1cf2a11bc6846165441d
diff --git a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
index 61bb270..ca2586f 100644
--- a/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
+++ b/src/com/google/android/iwlan/epdg/EpdgTunnelManager.java
@@ -1101,11 +1101,15 @@
             }
         }
 
-        if (setupRequest.pduSessionId() != 0) {
-            if (builder3gppParams == null) {
-                builder3gppParams = new Ike3gppParams.Builder();
+        if (isN1ModeSupported()) {
+            if (setupRequest.pduSessionId() != 0) {
+                // Configures the PduSession ID in N1_MODE_CAPABILITY payload
+                // to notify the server that UE supports N1_MODE
+                if (builder3gppParams == null) {
+                    builder3gppParams = new Ike3gppParams.Builder();
+                }
+                builder3gppParams.setPduSessionId((byte) setupRequest.pduSessionId());
             }
-            builder3gppParams.setPduSessionId((byte) setupRequest.pduSessionId());
         }
 
         if (builder3gppParams != null) {
@@ -2220,6 +2224,17 @@
     }
 
     @VisibleForTesting
+    boolean isN1ModeSupported() {
+        int[] nrCarrierCaps =
+                getConfig(CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY);
+        Log.d(TAG, "KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY : " + Arrays.toString(nrCarrierCaps));
+        if (Arrays.stream(nrCarrierCaps)
+                .anyMatch(cap -> cap == CarrierConfigManager.CARRIER_NR_AVAILABILITY_SA)) {
+            return true;
+        } else return false;
+    }
+
+    @VisibleForTesting
     boolean isTunnelConfigContainExistApn(String apnName) {
         boolean ret = mApnNameToTunnelConfig.containsKey(apnName);
         return ret;
diff --git a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
index 72fe266..4297dbf 100644
--- a/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
+++ b/test/com/google/android/iwlan/epdg/EpdgTunnelManagerTest.java
@@ -2105,4 +2105,31 @@
         verify(mMockIwlanTunnelCallback, times(1)).onClosed(eq(TEST_APN_NAME), eq(error));
         assertNull(mEpdgTunnelManager.getTunnelConfigForApn(TEST_APN_NAME));
     }
+
+    private boolean testIsN1ModeSupported(int[] nrAvailability) {
+        PersistableBundle bundle = new PersistableBundle();
+        bundle.putIntArray(
+                CarrierConfigManager.KEY_CARRIER_NR_AVAILABILITIES_INT_ARRAY, nrAvailability);
+
+        setupMockForGetConfig(bundle);
+
+        return mEpdgTunnelManager.isN1ModeSupported();
+    }
+
+    @Test
+    public void testIsN1ModeSupportedTrue() throws Exception {
+        assertTrue(
+                testIsN1ModeSupported(
+                        new int[] {
+                            CarrierConfigManager.CARRIER_NR_AVAILABILITY_NSA,
+                            CarrierConfigManager.CARRIER_NR_AVAILABILITY_SA
+                        }));
+    }
+
+    @Test
+    public void testIsN1ModeSupportedFalse() throws Exception {
+        assertFalse(
+                testIsN1ModeSupported(
+                        new int[] {CarrierConfigManager.CARRIER_NR_AVAILABILITY_NSA}));
+    }
 }