Merge "Cleaned up the deprecated APIs" into udc-dev
diff --git a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
index a23d0b7..f9973e6 100644
--- a/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
+++ b/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelector.java
@@ -180,6 +180,7 @@
     private boolean mRequiresVoLteEnabled;
     private boolean mLtePreferredAfterNrFailure;
     private boolean mTryCsWhenPsFails;
+    private boolean mTryEpsFallback;
     private int mModemCount;
 
     /** Indicates whether this instance is deactivated. */
@@ -566,6 +567,7 @@
                 onWwanNetworkTypeSelected(mCsNetworkType);
             }
         } else if (psAvailable) {
+            mTryEpsFallback = (mPsNetworkType == NGRAN) && isEpsFallbackAvailable();
             if (!mRequiresImsRegistration || isImsRegisteredWithVoiceCapability()) {
                 onWwanNetworkTypeSelected(mPsNetworkType);
             } else if (isDeactivatedSim()) {
@@ -574,6 +576,7 @@
             } else {
                 // Carrier configuration requires IMS registration for emergency services over PS,
                 // but not registered. Try CS emergency call.
+                mTryEpsFallback = false;
                 requestScan(true, true);
             }
         } else if (csAvailable) {
@@ -585,6 +588,7 @@
                 // but not registered. Try CS emergency call.
                 requestScan(true, true);
             } else {
+                mTryEpsFallback = isEpsFallbackAvailable();
                 requestScan(true);
             }
         }
@@ -622,7 +626,10 @@
 
         mCancelSignal = new CancellationSignal();
         // In case dialing over Wi-Fi has failed, do not the change the domain preference.
-        if (!wifiFailed) mLastPreferredNetworks = getNextPreferredNetworks(csPreferred);
+        if (!wifiFailed) {
+            mLastPreferredNetworks = getNextPreferredNetworks(csPreferred, mTryEpsFallback);
+        }
+        mTryEpsFallback = false;
 
         if (isInRoaming()
                 && (mPreferredNetworkScanType == DomainSelectionService.SCAN_TYPE_FULL_SERVICE)) {
@@ -654,10 +661,12 @@
      * Gets the list of preferred network type for the new scan request.
      *
      * @param csPreferred Indicates whether CS preferred scan is requested.
+     * @param tryEpsFallback Indicates whether scan requested for EPS fallback.
      * @return The list of preferred network types.
      */
     @VisibleForTesting
-    public @RadioAccessNetworkType List<Integer> getNextPreferredNetworks(boolean csPreferred) {
+    public @RadioAccessNetworkType List<Integer> getNextPreferredNetworks(boolean csPreferred,
+            boolean tryEpsFallback) {
         if (mRequiresVoLteEnabled && !isAdvancedCallingSettingEnabled()) {
             // Emergency call over IMS is not supported.
             logi("getNextPreferredNetworks VoLte setting is not enabled.");
@@ -670,10 +679,10 @@
         int psPriority = domains.indexOf(DOMAIN_PS_3GPP);
         int csPriority = domains.indexOf(DOMAIN_CS);
         logi("getNextPreferredNetworks psPriority=" + psPriority + ", csPriority=" + csPriority
-                + ", csPreferred=" + csPreferred
+                + ", csPreferred=" + csPreferred + ", epsFallback=" + tryEpsFallback
                 + ", lastNetworkType=" + accessNetworkTypeToString(mLastNetworkType));
 
-        if (!csPreferred && mLastNetworkType == UNKNOWN) {
+        if (!csPreferred && (mLastNetworkType == UNKNOWN || tryEpsFallback)) {
             // Generate the list per the domain preference.
 
             if (psPriority == NOT_SUPPORTED && csPriority == NOT_SUPPORTED) {
@@ -695,11 +704,17 @@
                 preferredNetworks = generatePreferredNetworks(getCsNetworkTypeConfiguration(),
                         getImsNetworkTypeConfiguration());
             }
+
+            // Make NGRAN have the lowest priority
+            if (tryEpsFallback && preferredNetworks.contains(NGRAN)) {
+                preferredNetworks.remove(Integer.valueOf(NGRAN));
+                preferredNetworks.add(NGRAN);
+            }
         } else if (csPreferred || mLastNetworkType == EUTRAN || mLastNetworkType == NGRAN) {
             if (!csPreferred && mLastNetworkType == NGRAN && mLtePreferredAfterNrFailure) {
                 // LTE is preferred after dialing over NR failed.
                 List<Integer> imsRats = getImsNetworkTypeConfiguration();
-                imsRats.remove(new Integer(NGRAN));
+                imsRats.remove(Integer.valueOf(NGRAN));
                 preferredNetworks = generatePreferredNetworks(imsRats,
                         getCsNetworkTypeConfiguration());
             } else  if (csPriority > NOT_SUPPORTED) {
@@ -870,6 +885,17 @@
         return UNKNOWN;
     }
 
+    private boolean isEpsFallbackAvailable() {
+        EmergencyRegResult regResult = mSelectionAttributes.getEmergencyRegResult();
+        if (regResult == null) return false;
+
+        List<Integer> ratList = getImsNetworkTypeConfiguration();
+        if (ratList.contains(EUTRAN)) {
+            return (regResult.getNwProvidedEmf() > 0);
+        }
+        return false;
+    }
+
     /**
      * Determines whether the SIM is a deactivated one.
      *
diff --git a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
index 673e586..6c7f220 100644
--- a/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/EmergencyCallDomainSelectorTest.java
@@ -18,6 +18,7 @@
 
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.EUTRAN;
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.GERAN;
+import static android.telephony.AccessNetworkConstants.AccessNetworkType.NGRAN;
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.UNKNOWN;
 import static android.telephony.AccessNetworkConstants.AccessNetworkType.UTRAN;
 import static android.telephony.BarringInfo.BARRING_SERVICE_TYPE_EMERGENCY;
@@ -1240,7 +1241,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false));
+        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false));
     }
 
     @Test
@@ -1254,7 +1255,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyPsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false));
+        verifyPsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false));
     }
 
     @Test
@@ -1269,7 +1270,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false));
+        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false, false));
     }
 
     @Test
@@ -1284,7 +1285,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyCsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false));
+        verifyCsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false, false));
 
     }
 
@@ -1299,7 +1300,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true));
+        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false));
     }
 
     @Test
@@ -1313,7 +1314,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true));
+        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false));
     }
 
     @Test
@@ -1329,7 +1330,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true));
+        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true, false));
     }
 
     @Test
@@ -1344,7 +1345,7 @@
 
         setupForScanListTest(bundle);
 
-        verifyCsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true));
+        verifyCsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true, false));
     }
 
     @Test
@@ -1361,7 +1362,7 @@
         bindImsService();
         processAllMessages();
 
-        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false));
+        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false));
     }
 
     @Test
@@ -1378,7 +1379,7 @@
         bindImsService();
         processAllMessages();
 
-        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false));
+        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(false, false));
     }
 
     @Test
@@ -1396,7 +1397,7 @@
         bindImsService();
         processAllMessages();
 
-        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false));
+        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(false, false));
     }
 
     @Test
@@ -1413,7 +1414,7 @@
         bindImsService();
         processAllMessages();
 
-        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true));
+        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false));
     }
 
     @Test
@@ -1430,7 +1431,7 @@
         bindImsService();
         processAllMessages();
 
-        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true));
+        verifyCsPreferredScanList(mDomainSelector.getNextPreferredNetworks(true, false));
     }
 
     @Test
@@ -1449,7 +1450,32 @@
         bindImsService();
         processAllMessages();
 
-        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true));
+        verifyPsOnlyScanList(mDomainSelector.getNextPreferredNetworks(true, false));
+    }
+
+    @Test
+    public void testEpsFallbackThenCsPreference() throws Exception {
+        PersistableBundle bundle = getDefaultPersistableBundle();
+        int[] domainPreference = new int[] {
+                CarrierConfigManager.ImsEmergency.DOMAIN_PS_3GPP,
+                CarrierConfigManager.ImsEmergency.DOMAIN_CS,
+                };
+        bundle.putIntArray(KEY_EMERGENCY_DOMAIN_PREFERENCE_INT_ARRAY, domainPreference);
+        bundle.putIntArray(KEY_EMERGENCY_OVER_IMS_SUPPORTED_3GPP_NETWORK_TYPES_INT_ARRAY,
+                    new int[] { NGRAN, EUTRAN });
+
+        setupForScanListTest(bundle);
+
+        List<Integer> networks = mDomainSelector.getNextPreferredNetworks(false, true);
+
+        assertFalse(networks.isEmpty());
+        assertTrue(networks.contains(EUTRAN));
+        assertTrue(networks.contains(NGRAN));
+        assertTrue(networks.contains(UTRAN));
+        assertTrue(networks.contains(GERAN));
+        assertTrue(networks.indexOf(EUTRAN) < networks.indexOf(UTRAN));
+        assertTrue(networks.indexOf(UTRAN) < networks.indexOf(GERAN));
+        assertTrue(networks.indexOf(GERAN) < networks.indexOf(NGRAN));
     }
 
     private void setupForScanListTest(PersistableBundle bundle) throws Exception {