Merge "Detect sim absent in EmergencyNumberTracker in multi-sim case" into sc-qpr1-dev
diff --git a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
index fb892e4..afd8a40 100644
--- a/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
+++ b/src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java
@@ -30,6 +30,7 @@
 import android.telephony.CarrierConfigManager;
 import android.telephony.PhoneNumberUtils;
 import android.telephony.ServiceState;
+import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
 import android.telephony.emergency.EmergencyNumber;
 import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting;
@@ -262,6 +263,22 @@
         return false;
     }
 
+    /**
+     * Checks if it's sim absent to decide whether to apply sim-absent emergency numbers from 3gpp
+     */
+    @VisibleForTesting
+    public boolean isSimAbsent() {
+        for (Phone phone: PhoneFactory.getPhones()) {
+            int slotId = SubscriptionController.getInstance().getSlotIndex(phone.getSubId());
+            // If slot id is invalid, it means that there is no sim card.
+            if (slotId != SubscriptionManager.INVALID_SIM_SLOT_INDEX) {
+                // If there is at least one sim active, sim is not absent; it returns false.
+                return false;
+            }
+        }
+        return true;
+    }
+
     private void initializeDatabaseEmergencyNumberList() {
         // If country iso has been cached when listener is set, don't need to cache the initial
         // country iso and initial database.
@@ -859,7 +876,7 @@
                 emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum));
             }
         }
-        emergencyNumbers = ((slotId < 0) ? "112,911,000,08,110,118,119,999" : "112,911");
+        emergencyNumbers = ((isSimAbsent()) ? "112,911,000,08,110,118,119,999" : "112,911");
         for (String emergencyNum : emergencyNumbers.split(",")) {
             emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum));
         }
@@ -1015,10 +1032,9 @@
         logd("System property doesn't provide any emergency numbers."
                 + " Use embedded logic for determining ones.");
 
-        // If slot id is invalid, means that there is no sim card.
         // According spec 3GPP TS22.101, the following numbers should be
         // ECC numbers when SIM/USIM is not present.
-        emergencyNumbers = ((slotId < 0) ? "112,911,000,08,110,118,119,999" : "112,911");
+        emergencyNumbers = ((isSimAbsent()) ? "112,911,000,08,110,118,119,999" : "112,911");
 
         for (String emergencyNum : emergencyNumbers.split(",")) {
             if (useExactMatch) {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
index 2aa3f18..29f2dab 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java
@@ -20,10 +20,12 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
 
 import android.os.AsyncResult;
 import android.os.Environment;
 import android.os.ParcelFileDescriptor;
+import android.telephony.SubscriptionManager;
 import android.telephony.emergency.EmergencyNumber;
 import android.testing.AndroidTestingRunner;
 import android.testing.TestableLooper;
@@ -33,6 +35,7 @@
 import com.android.internal.telephony.HalVersion;
 import com.android.internal.telephony.Phone;
 import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.SubscriptionController;
 import com.android.internal.telephony.TelephonyTest;
 
 import org.junit.After;
@@ -84,6 +87,14 @@
                                             EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
     private static final int OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION = 999999;
     private static final String OTA_EMERGENCY_NUMBER_ADDRESS = "98765";
+    private static final int SUB_ID_PHONE_1 = 1;
+    private static final int SUB_ID_PHONE_2 = 2;
+    private static final int VALID_SLOT_INDEX_VALID_1 = 1;
+    private static final int VALID_SLOT_INDEX_VALID_2 = 2;
+    private static final int INVALID_SLOT_INDEX_VALID = SubscriptionManager.INVALID_SIM_SLOT_INDEX;
+
+    @Mock
+    private SubscriptionController mSubControllerMock;
 
     @Mock
     private Phone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest.
@@ -107,9 +118,11 @@
 
         doReturn(mContext).when(mPhone).getContext();
         doReturn(0).when(mPhone).getPhoneId();
+        doReturn(SUB_ID_PHONE_1).when(mPhone).getSubId();
 
         doReturn(mContext).when(mPhone2).getContext();
         doReturn(1).when(mPhone2).getPhoneId();
+        doReturn(SUB_ID_PHONE_2).when(mPhone2).getSubId();
 
         initializeEmergencyNumberListTestSamples();
         mEmergencyNumberTrackerMock = new EmergencyNumberTracker(mPhone, mSimulatedCommands);
@@ -248,6 +261,36 @@
         replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
     }
 
+    /**
+     * Test EmergencyNumberTracker.isSimAbsent().
+     */
+    @Test
+    public void testIsSimAbsent() throws Exception {
+        setDsdsPhones();
+        replaceInstance(SubscriptionController.class, "sInstance", null, mSubControllerMock);
+
+        // Both sim slots are active
+        doReturn(VALID_SLOT_INDEX_VALID_1).when(mSubControllerMock).getSlotIndex(
+                eq(SUB_ID_PHONE_1));
+        doReturn(VALID_SLOT_INDEX_VALID_2).when(mSubControllerMock).getSlotIndex(
+                eq(SUB_ID_PHONE_2));
+        assertFalse(mEmergencyNumberTrackerMock.isSimAbsent());
+
+        // One sim slot is active; the other one is not active
+        doReturn(VALID_SLOT_INDEX_VALID_1).when(mSubControllerMock).getSlotIndex(
+                eq(SUB_ID_PHONE_1));
+        doReturn(INVALID_SLOT_INDEX_VALID).when(mSubControllerMock).getSlotIndex(
+                eq(SUB_ID_PHONE_2));
+        assertFalse(mEmergencyNumberTrackerMock.isSimAbsent());
+
+        // Both sim slots are not active
+        doReturn(INVALID_SLOT_INDEX_VALID).when(mSubControllerMock).getSlotIndex(
+                eq(SUB_ID_PHONE_1));
+        doReturn(INVALID_SLOT_INDEX_VALID).when(mSubControllerMock).getSlotIndex(
+                eq(SUB_ID_PHONE_2));
+        assertTrue(mEmergencyNumberTrackerMock.isSimAbsent());
+    }
+
     @Test
     public void testEmergencyNumberListFromRadio() throws Exception {
         sendEmergencyNumberListFromRadio();