Merge changes Ie63a3583,I1354ec53,I3806750a,I48d0b0f9,I4da56735 into main

* changes:
  Move isAtLeastB to dependencies
  Pass nullable values to parse functions
  Rename EthernetTrackerConfig to EthernetConfigParser
  Do not support configuring test interfaces in config.xml
  Prevent mixing mutable and immutable lists
diff --git a/service-t/src/com/android/server/ethernet/EthernetTracker.java b/service-t/src/com/android/server/ethernet/EthernetTracker.java
index def701b..1c453cb 100644
--- a/service-t/src/com/android/server/ethernet/EthernetTracker.java
+++ b/service-t/src/com/android/server/ethernet/EthernetTracker.java
@@ -170,6 +170,10 @@
             return resources.get().getStringArray(
                     com.android.connectivity.resources.R.array.config_ethernet_interfaces);
         }
+
+        public boolean isAtLeastB() {
+            return SdkLevel.isAtLeastB();
+        }
     }
 
     private class EthernetNetlinkMonitor extends NetlinkMonitor {
@@ -758,7 +762,7 @@
      * <interface name|mac address>;[Network Capabilities];[IP config];[Override Transport]}
      */
     private void parseEthernetConfig(String configString) {
-        final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
+        final EthernetConfigParser config = new EthernetConfigParser(configString);
         NetworkCapabilities nc;
         // Starting with Android B (API level 36), we provide default NetworkCapabilities
         // for Ethernet interfaces when no explicit capabilities are specified in the
@@ -770,9 +774,8 @@
         // capabilities) to prevent certain Ethernet interfaces from becoming
         // the default network. To avoid breaking existing device configurations, this
         // change is gated by the SDK level.
-        if (SdkLevel.isAtLeastB() && config.mCaps.isEmpty()) {
-            boolean isTestIface = config.mIface.matches(TEST_IFACE_REGEXP);
-            nc = createDefaultNetworkCapabilities(isTestIface, config.mTransport);
+        if (mDeps.isAtLeastB() && config.mCaps.isEmpty()) {
+            nc = createDefaultNetworkCapabilities(false /* isTestIface */, config.mTransport);
         } else {
             nc = createNetworkCapabilities(config.mCaps, config.mTransport).build();
         }
@@ -1012,13 +1015,13 @@
     }
 
     @VisibleForTesting
-    static class EthernetTrackerConfig {
+    static class EthernetConfigParser {
         final String mIface;
         final List<Integer> mCaps;
         final String mIpConfig;
         final int mTransport;
 
-        private static List<Integer> parseCapabilities(String capabilitiesString) {
+        private static List<Integer> parseCapabilities(@Nullable String capabilitiesString) {
             if (TextUtils.isEmpty(capabilitiesString)) {
                 return Collections.emptyList();
             }
@@ -1037,10 +1040,10 @@
                 }
                 capabilities.add(capability);
             }
-            return capabilities;
+            return Collections.unmodifiableList(capabilities);
         }
 
-        private static int parseTransportType(String transportString) {
+        private static int parseTransportType(@Nullable String transportString) {
             if (TextUtils.isEmpty(transportString)) {
                 return TRANSPORT_ETHERNET;
             }
@@ -1068,13 +1071,13 @@
             }
         }
 
-        EthernetTrackerConfig(String configString) {
-            Objects.requireNonNull(configString, "EthernetTrackerConfig requires non-null config");
+        EthernetConfigParser(String configString) {
+            Objects.requireNonNull(configString, "EthernetConfigParser requires non-null config");
             final String[] tokens = configString.split(";", /* limit of tokens */ 4);
             mIface = tokens[0];
-            mCaps = tokens.length > 1 ? parseCapabilities(tokens[1]) : Collections.emptyList();
+            mCaps = parseCapabilities(tokens.length > 1 ? tokens[1] : null);
             mIpConfig = tokens.length > 2 && !TextUtils.isEmpty(tokens[2]) ? tokens[2] : null;
-            mTransport = tokens.length > 3 ? parseTransportType(tokens[3]) : TRANSPORT_ETHERNET;
+            mTransport = parseTransportType(tokens.length > 3 ? tokens[3] : null);
         }
     }
 }
diff --git a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java
index 6ce7dbc..03fb505 100644
--- a/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java
+++ b/tests/unit/java/com/android/server/ethernet/EthernetTrackerTest.java
@@ -46,7 +46,7 @@
 
 import androidx.test.filters.SmallTest;
 
-import com.android.server.ethernet.EthernetTracker.EthernetTrackerConfig;
+import com.android.server.ethernet.EthernetTracker.EthernetConfigParser;
 import com.android.testutils.DevSdkIgnoreRule;
 import com.android.testutils.DevSdkIgnoreRunner;
 import com.android.testutils.HandlerUtils;
@@ -291,20 +291,20 @@
         final String ipConfig = "";
         final String configString =
                 String.join(";", TEST_IFACE, configCapabilities, ipConfig, configTransports);
-        final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
+        final EthernetConfigParser config = new EthernetConfigParser(configString);
         assertEquals(
                 expectedNetworkCapabilities,
                 EthernetTracker.createNetworkCapabilities(config.mCaps, config.mTransport).build());
     }
 
     @Test
-    public void testCreateEthernetTrackerConfigReturnsCorrectValue() {
+    public void testCreateEthernetConfigParserReturnsCorrectValue() {
         final String capabilities = "2,4,6,8";
         final String ipConfig = "3";
         final String transport = "1";
         final String configString = String.join(";", TEST_IFACE, capabilities, ipConfig, transport);
 
-        final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
+        final EthernetConfigParser config = new EthernetConfigParser(configString);
 
         assertEquals(TEST_IFACE, config.mIface);
         assertThat(config.mCaps).containsExactly(2, 4, 6, 8);
@@ -313,30 +313,30 @@
     }
 
     @Test
-    public void testCreateEthernetTrackerConfig_withInvalidTransport() {
+    public void testCreateEthernetConfigParser_withInvalidTransport() {
         final String capabilities = "2";
         final String ipConfig = "3";
         final String transport = "100"; // Invalid transport type
         final String configString = String.join(";", TEST_IFACE, capabilities, ipConfig, transport);
 
-        final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
+        final EthernetConfigParser config = new EthernetConfigParser(configString);
         assertEquals(NetworkCapabilities.TRANSPORT_ETHERNET, config.mTransport);
     }
 
     @Test
-    public void testCreateEthernetTrackerConfig_withDisallowedTransport() {
+    public void testCreateEthernetConfigParser_withDisallowedTransport() {
         final String capabilities = "2";
         final String ipConfig = "3";
         final String transport = "4"; // TRANSPORT_VPN is not allowed
         final String configString = String.join(";", TEST_IFACE, capabilities, ipConfig, transport);
 
-        final EthernetTrackerConfig config = new EthernetTrackerConfig(configString);
+        final EthernetConfigParser config = new EthernetConfigParser(configString);
         assertEquals(NetworkCapabilities.TRANSPORT_ETHERNET, config.mTransport);
     }
 
     @Test
-    public void testCreateEthernetTrackerConfigThrowsNpeWithNullInput() {
-        assertThrows(NullPointerException.class, () -> new EthernetTrackerConfig(null));
+    public void testCreateEthernetConfigParserThrowsNpeWithNullInput() {
+        assertThrows(NullPointerException.class, () -> new EthernetConfigParser(null));
     }
 
     @Test