Merge "DSDA: Set call EXTRA if either sub doesn't allow hold" into main
diff --git a/ecc/input/eccdata.txt b/ecc/input/eccdata.txt
index fe11383..c4edc9e 100644
--- a/ecc/input/eccdata.txt
+++ b/ecc/input/eccdata.txt
@@ -2359,77 +2359,6 @@
     types: POLICE
     types: AMBULANCE
     types: FIRE
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "984"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "985"
-    types: MOUNTAIN_RESCUE
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "986"
-    types: POLICE
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "997"
-    types: POLICE
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "998"
-    types: FIRE
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "999"
-    types: AMBULANCE
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "991"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "992"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "993"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "994"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "995"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "996"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "987"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
-  }
-  eccs {
-    phone_number: "989"
-    types: TYPE_UNSPECIFIED
-    routing: EMERGENCY
   }
   ecc_fallback: "112"
 }
diff --git a/ecc/output/eccdata b/ecc/output/eccdata
index 55d8151..482ed79 100644
--- a/ecc/output/eccdata
+++ b/ecc/output/eccdata
Binary files differ
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index 3d6a4d1..8c2b6a8 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -654,10 +654,11 @@
         if (!csInService && !psInService) {
             mPsNetworkType = getSelectablePsNetworkType(false);
             logi("selectDomain limited service ps=" + accessNetworkTypeToString(mPsNetworkType));
-            if (mPsNetworkType == UNKNOWN) {
-                requestScan(true);
-            } else {
+            // If NGRAN, request scan to trigger emergency registration.
+            if (mPsNetworkType == EUTRAN) {
                 onWwanNetworkTypeSelected(mPsNetworkType);
+            } else {
+                requestScan(true);
             }
             return;
         }
@@ -1543,7 +1544,12 @@
     private void selectDomainForTestEmergencyNumber() {
         logi("selectDomainForTestEmergencyNumber");
         if (isImsRegisteredWithVoiceCapability()) {
-            onWwanNetworkTypeSelected(EUTRAN);
+            if (isImsRegisteredOverWifi()
+                    || isImsRegisteredOverCrossSim()) {
+                mTransportSelectorCallback.onWlanSelected(mVoWifiOverEmergencyPdn);
+            } else {
+                onWwanNetworkTypeSelected(EUTRAN);
+            }
         } else {
             onWwanNetworkTypeSelected(UTRAN);
         }
diff --git a/testapps/TestRcsApp/TestApp/Android.bp b/testapps/TestRcsApp/TestApp/Android.bp
index 40254af..ea62925 100644
--- a/testapps/TestRcsApp/TestApp/Android.bp
+++ b/testapps/TestRcsApp/TestApp/Android.bp
@@ -14,7 +14,7 @@
         "androidx-constraintlayout_constraintlayout",
         "aosp_test_rcs_client_base",
         "androidx.appcompat_appcompat",
-        "libphonenumber-platform"
+        "libphonenumber-platform",
     ],
 
     libs: ["org.apache.http.legacy"],
@@ -25,12 +25,15 @@
 
     sdk_version: "system_current",
     min_sdk_version: "30",
-    required: ["privapp-permissions-com.google.android.sample.rcsclient.xml"]
+    required: ["privapp-permissions-com.google.android.sample.rcsclient.xml"],
+    lint: {
+        baseline_filename: "lint-baseline.xml",
+    },
 }
 
 prebuilt_etc {
     name: "privapp-permissions-com.google.android.sample.rcsclient.xml",
     src: "etc/permissions/privapp-permissions-com.google.android.sample.rcsclient.xml",
-    sub_dir:"permissions",
+    sub_dir: "permissions",
     product_specific: true,
 }
diff --git a/testapps/TestRcsApp/aosp_test_rcsclient/Android.bp b/testapps/TestRcsApp/aosp_test_rcsclient/Android.bp
index 34b0a12..e1de685 100644
--- a/testapps/TestRcsApp/aosp_test_rcsclient/Android.bp
+++ b/testapps/TestRcsApp/aosp_test_rcsclient/Android.bp
@@ -26,4 +26,7 @@
 
     sdk_version: "system_current",
     min_sdk_version: "30",
+    lint: {
+        baseline_filename: "lint-baseline.xml",
+    },
 }
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index eab40f9..ccb59b2 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -100,6 +100,7 @@
 import android.telephony.TelephonyManager;
 import android.telephony.TransportSelectorCallback;
 import android.telephony.WwanSelectorCallback;
+import android.telephony.emergency.EmergencyNumber;
 import android.telephony.ims.ImsManager;
 import android.telephony.ims.ImsMmTelManager;
 import android.telephony.ims.ProvisioningManager;
@@ -119,7 +120,10 @@
 import org.mockito.stubbing.Answer;
 
 import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Consumer;
 
 /**
@@ -130,6 +134,7 @@
 
     private static final int SLOT_0 = 0;
     private static final int SLOT_0_SUB_ID = 1;
+    private static final String TEST_EMERGENCY_NUMBER = "911";
 
     @Mock private CarrierConfigManager mCarrierConfigManager;
     @Mock private ConnectivityManager mConnectivityManager;
@@ -2108,6 +2113,123 @@
         assertEquals(GERAN, (int) mAccessNetwork.get(3));
     }
 
+    @Test
+    public void testDefaultLimitedServiceEutran() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyPsDialed();
+    }
+
+    @Test
+    public void testDefaultLimitedServiceNgran() throws Exception {
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegResult regResult = getEmergencyRegResult(NGRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyScanPsPreferred();
+    }
+
+    @Test
+    public void testTestEmergencyNumberOverCs() throws Exception {
+        EmergencyNumber num = new EmergencyNumber(TEST_EMERGENCY_NUMBER, "us", "",
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE, new ArrayList<String>(),
+                EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST,
+                EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
+
+        Map<Integer, List<EmergencyNumber>> lists = new HashMap<>();
+        List<EmergencyNumber> list = new ArrayList<>();
+        list.add(num);
+        lists.put(SLOT_0_SUB_ID, list);
+
+        doReturn(lists).when(mTelephonyManager).getEmergencyNumberList();
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsServiceUnregistered();
+
+        verifyCsDialed();
+    }
+
+    @Test
+    public void testTestEmergencyNumberOverPs() throws Exception {
+        EmergencyNumber num = new EmergencyNumber(TEST_EMERGENCY_NUMBER, "us", "",
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE, new ArrayList<String>(),
+                EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST,
+                EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
+
+        Map<Integer, List<EmergencyNumber>> lists = new HashMap<>();
+        List<EmergencyNumber> list = new ArrayList<>();
+        list.add(num);
+        lists.put(SLOT_0_SUB_ID, list);
+
+        doReturn(lists).when(mTelephonyManager).getEmergencyNumberList();
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsService();
+
+        verifyPsDialed();
+    }
+
+    @Test
+    public void testTestEmergencyNumberOverWifi() throws Exception {
+        EmergencyNumber num = new EmergencyNumber(TEST_EMERGENCY_NUMBER, "us", "",
+                EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE, new ArrayList<String>(),
+                EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST,
+                EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
+
+        Map<Integer, List<EmergencyNumber>> lists = new HashMap<>();
+        List<EmergencyNumber> list = new ArrayList<>();
+        list.add(num);
+        lists.put(SLOT_0_SUB_ID, list);
+
+        doReturn(lists).when(mTelephonyManager).getEmergencyNumberList();
+
+        createSelector(SLOT_0_SUB_ID);
+        unsolBarringInfoChanged(false);
+
+        EmergencyRegResult regResult = getEmergencyRegResult(EUTRAN, REGISTRATION_STATE_UNKNOWN,
+                0, false, true, 0, 0, "", "");
+        SelectionAttributes attr = getSelectionAttributes(SLOT_0, SLOT_0_SUB_ID, regResult);
+        mDomainSelector.selectDomain(attr, mTransportSelectorCallback);
+        processAllMessages();
+
+        bindImsService(true);
+        processAllMessages();
+
+        verify(mTransportSelectorCallback, times(1)).onWlanSelected(anyBoolean());
+    }
+
     private void setupForScanListTest(PersistableBundle bundle) throws Exception {
         setupForScanListTest(bundle, false);
     }
@@ -2354,6 +2476,7 @@
             EmergencyRegResult regResult) {
         SelectionAttributes.Builder builder =
                 new SelectionAttributes.Builder(slotId, subId, SELECTOR_TYPE_CALLING)
+                .setNumber(TEST_EMERGENCY_NUMBER)
                 .setEmergency(true)
                 .setEmergencyRegResult(regResult);
         return builder.build();