Loading src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java +19 −3 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.SystemProperties; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.telephony.PhoneNumberUtils; import android.telephony.PhoneNumberUtils; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; Loading Loading @@ -262,6 +263,22 @@ public class EmergencyNumberTracker extends Handler { return false; 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() { private void initializeDatabaseEmergencyNumberList() { // If country iso has been cached when listener is set, don't need to cache the initial // If country iso has been cached when listener is set, don't need to cache the initial // country iso and initial database. // country iso and initial database. Loading Loading @@ -859,7 +876,7 @@ public class EmergencyNumberTracker extends Handler { emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum)); 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(",")) { for (String emergencyNum : emergencyNumbers.split(",")) { emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum)); emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum)); } } Loading Loading @@ -1015,10 +1032,9 @@ public class EmergencyNumberTracker extends Handler { logd("System property doesn't provide any emergency numbers." logd("System property doesn't provide any emergency numbers." + " Use embedded logic for determining ones."); + " 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 // According spec 3GPP TS22.101, the following numbers should be // ECC numbers when SIM/USIM is not present. // 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(",")) { for (String emergencyNum : emergencyNumbers.split(",")) { if (useExactMatch) { if (useExactMatch) { Loading tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java +43 −0 Original line number Original line Diff line number Diff line Loading @@ -20,10 +20,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import android.os.AsyncResult; import android.os.AsyncResult; import android.os.Environment; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor; import android.telephony.SubscriptionManager; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; Loading @@ -33,6 +35,7 @@ import androidx.test.InstrumentationRegistry; import com.android.internal.telephony.HalVersion; import com.android.internal.telephony.HalVersion; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.TelephonyTest; import org.junit.After; import org.junit.After; Loading Loading @@ -84,6 +87,14 @@ public class EmergencyNumberTrackerTest extends TelephonyTest { EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN); EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN); private static final int OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION = 999999; private static final int OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION = 999999; private static final String OTA_EMERGENCY_NUMBER_ADDRESS = "98765"; 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 @Mock private Phone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest. private Phone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest. Loading @@ -107,9 +118,11 @@ public class EmergencyNumberTrackerTest extends TelephonyTest { doReturn(mContext).when(mPhone).getContext(); doReturn(mContext).when(mPhone).getContext(); doReturn(0).when(mPhone).getPhoneId(); doReturn(0).when(mPhone).getPhoneId(); doReturn(SUB_ID_PHONE_1).when(mPhone).getSubId(); doReturn(mContext).when(mPhone2).getContext(); doReturn(mContext).when(mPhone2).getContext(); doReturn(1).when(mPhone2).getPhoneId(); doReturn(1).when(mPhone2).getPhoneId(); doReturn(SUB_ID_PHONE_2).when(mPhone2).getSubId(); initializeEmergencyNumberListTestSamples(); initializeEmergencyNumberListTestSamples(); mEmergencyNumberTrackerMock = new EmergencyNumberTracker(mPhone, mSimulatedCommands); mEmergencyNumberTrackerMock = new EmergencyNumberTracker(mPhone, mSimulatedCommands); Loading Loading @@ -248,6 +261,36 @@ public class EmergencyNumberTrackerTest extends TelephonyTest { replaceInstance(PhoneFactory.class, "sPhones", null, mPhones); 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 @Test public void testEmergencyNumberListFromRadio() throws Exception { public void testEmergencyNumberListFromRadio() throws Exception { sendEmergencyNumberListFromRadio(); sendEmergencyNumberListFromRadio(); Loading Loading
src/java/com/android/internal/telephony/emergency/EmergencyNumberTracker.java +19 −3 Original line number Original line Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.os.SystemProperties; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.telephony.PhoneNumberUtils; import android.telephony.PhoneNumberUtils; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; import android.telephony.emergency.EmergencyNumber.EmergencyCallRouting; Loading Loading @@ -262,6 +263,22 @@ public class EmergencyNumberTracker extends Handler { return false; 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() { private void initializeDatabaseEmergencyNumberList() { // If country iso has been cached when listener is set, don't need to cache the initial // If country iso has been cached when listener is set, don't need to cache the initial // country iso and initial database. // country iso and initial database. Loading Loading @@ -859,7 +876,7 @@ public class EmergencyNumberTracker extends Handler { emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum)); 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(",")) { for (String emergencyNum : emergencyNumbers.split(",")) { emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum)); emergencyNumberList.add(getLabeledEmergencyNumberForEcclist(emergencyNum)); } } Loading Loading @@ -1015,10 +1032,9 @@ public class EmergencyNumberTracker extends Handler { logd("System property doesn't provide any emergency numbers." logd("System property doesn't provide any emergency numbers." + " Use embedded logic for determining ones."); + " 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 // According spec 3GPP TS22.101, the following numbers should be // ECC numbers when SIM/USIM is not present. // 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(",")) { for (String emergencyNum : emergencyNumbers.split(",")) { if (useExactMatch) { if (useExactMatch) { Loading
tests/telephonytests/src/com/android/internal/telephony/emergency/EmergencyNumberTrackerTest.java +43 −0 Original line number Original line Diff line number Diff line Loading @@ -20,10 +20,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import android.os.AsyncResult; import android.os.AsyncResult; import android.os.Environment; import android.os.Environment; import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor; import android.telephony.SubscriptionManager; import android.telephony.emergency.EmergencyNumber; import android.telephony.emergency.EmergencyNumber; import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper; Loading @@ -33,6 +35,7 @@ import androidx.test.InstrumentationRegistry; import com.android.internal.telephony.HalVersion; import com.android.internal.telephony.HalVersion; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.SubscriptionController; import com.android.internal.telephony.TelephonyTest; import com.android.internal.telephony.TelephonyTest; import org.junit.After; import org.junit.After; Loading Loading @@ -84,6 +87,14 @@ public class EmergencyNumberTrackerTest extends TelephonyTest { EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN); EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN); private static final int OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION = 999999; private static final int OTA_UNIT_TEST_EMERGENCY_NUMBER_DB_VERSION = 999999; private static final String OTA_EMERGENCY_NUMBER_ADDRESS = "98765"; 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 @Mock private Phone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest. private Phone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest. Loading @@ -107,9 +118,11 @@ public class EmergencyNumberTrackerTest extends TelephonyTest { doReturn(mContext).when(mPhone).getContext(); doReturn(mContext).when(mPhone).getContext(); doReturn(0).when(mPhone).getPhoneId(); doReturn(0).when(mPhone).getPhoneId(); doReturn(SUB_ID_PHONE_1).when(mPhone).getSubId(); doReturn(mContext).when(mPhone2).getContext(); doReturn(mContext).when(mPhone2).getContext(); doReturn(1).when(mPhone2).getPhoneId(); doReturn(1).when(mPhone2).getPhoneId(); doReturn(SUB_ID_PHONE_2).when(mPhone2).getSubId(); initializeEmergencyNumberListTestSamples(); initializeEmergencyNumberListTestSamples(); mEmergencyNumberTrackerMock = new EmergencyNumberTracker(mPhone, mSimulatedCommands); mEmergencyNumberTrackerMock = new EmergencyNumberTracker(mPhone, mSimulatedCommands); Loading Loading @@ -248,6 +261,36 @@ public class EmergencyNumberTrackerTest extends TelephonyTest { replaceInstance(PhoneFactory.class, "sPhones", null, mPhones); 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 @Test public void testEmergencyNumberListFromRadio() throws Exception { public void testEmergencyNumberListFromRadio() throws Exception { sendEmergencyNumberListFromRadio(); sendEmergencyNumberListFromRadio(); Loading