Merge "Supports to get NR Duplex Mode in ServiceState" into main
diff --git a/flags/network.aconfig b/flags/network.aconfig
index ce4b2e4..1fbd100 100644
--- a/flags/network.aconfig
+++ b/flags/network.aconfig
@@ -57,3 +57,14 @@
         purpose: PURPOSE_FEATURE
     }
 }
+
+# OWNER=sangyun TARGET=26Q2
+flag {
+    name: "duplex_mode_for_ngran"
+    namespace: "telephony"
+    description: "NR Duplex Mode can be Calculated"
+    bug: "355284319"
+    metadata {
+        purpose: PURPOSE_BUGFIX
+    }
+}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTest.java
index ffc2fac..3fe527a 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTest.java
@@ -32,6 +32,8 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.internal.telephony.flags.Flags;
+
 import junit.framework.TestCase;
 
 import java.util.ArrayList;
@@ -387,6 +389,63 @@
     }
 
     @SmallTest
+    public void testDuplexMode_SupplementalLinksNgran() {
+        ServiceState ss = new ServiceState();
+        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
+                .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
+                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_NR)
+                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
+                .build();
+        ss.addNetworkRegistrationInfo(nri);
+
+        if (!Flags.duplexModeForNgran()) {
+            // Even if AccessNetwork is NR, getDuplexMode will be return FDD if the band is
+            // set to the FDD LTE band because there was no duplex implementation for NR.
+            ss.setChannelNumber(2400); // lte band 5
+            assertEquals(ServiceState.DUPLEX_MODE_FDD, ss.getDuplexMode());
+        } else {
+            ss.setChannelNumber(144400); // band n29, SDL
+            assertEquals(ServiceState.DUPLEX_MODE_UNKNOWN, ss.getDuplexMode());
+        }
+    }
+
+    @SmallTest
+    public void testDuplexMode_FddChannelNgran() {
+        ServiceState ss = new ServiceState();
+        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
+                .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
+                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_NR)
+                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
+                .build();
+        ss.addNetworkRegistrationInfo(nri);
+        ss.setChannelNumber(432000); // band n1
+
+        if (!Flags.duplexModeForNgran()) {
+            assertEquals(ServiceState.DUPLEX_MODE_UNKNOWN, ss.getDuplexMode());
+        } else {
+            assertEquals(ServiceState.DUPLEX_MODE_FDD, ss.getDuplexMode());
+        }
+    }
+
+    @SmallTest
+    public void testDuplexMode_TddChannelNgran() {
+        ServiceState ss = new ServiceState();
+        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
+                .setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
+                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_NR)
+                .setDomain(NetworkRegistrationInfo.DOMAIN_PS)
+                .build();
+        ss.addNetworkRegistrationInfo(nri);
+        ss.setChannelNumber(402000); // band n34
+
+        if (!Flags.duplexModeForNgran()) {
+            assertEquals(ServiceState.DUPLEX_MODE_UNKNOWN, ss.getDuplexMode());
+        } else {
+            assertEquals(ServiceState.DUPLEX_MODE_TDD, ss.getDuplexMode());
+        }
+    }
+
+    @SmallTest
     public void testCreateLocationInfoSanitizedCopy() {
         ServiceState ss = new ServiceState();
         NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()