Merge "Refactoring of CrossSimRedialingController for plug-in architecture" into main
diff --git a/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java b/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java
index f1bb78c..44904f4 100644
--- a/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java
+++ b/src/com/android/services/telephony/domainselection/CrossSimRedialingController.java
@@ -31,16 +31,19 @@
import android.os.SystemProperties;
import android.telephony.Annotation.PreciseDisconnectCauses;
import android.telephony.CarrierConfigManager;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
import android.text.TextUtils;
import android.util.LocalLog;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.telephony.Phone;
-import com.android.internal.telephony.PhoneFactory;
import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
/** Controls the cross stack redialing. */
public class CrossSimRedialingController extends Handler {
@@ -53,11 +56,11 @@
/**
* Returns whether the number is an emergency number in the given modem slot.
*
- * @param slotId The slot id to be checked.
+ * @param subId The sub id to be checked.
* @param number The number.
* @return {@code true} if the number is an emergency number in the given slot.
*/
- boolean isEmergencyNumber(int slotId, String number);
+ boolean isEmergencyNumber(int subId, String number);
}
@VisibleForTesting
@@ -73,17 +76,23 @@
private EmergencyNumberHelper mEmergencyNumberHelper = new EmergencyNumberHelper() {
@Override
- public boolean isEmergencyNumber(int slotId, String number) {
- // TODO(b/258112541) Add System api to check emergency number per subscription.
+ public boolean isEmergencyNumber(int subId, String number) {
+ number = PhoneNumberUtils.stripSeparators(number);
+ if (TextUtils.isEmpty(number)) return false;
+ Map<Integer, List<EmergencyNumber>> lists = null;
try {
- Phone phone = PhoneFactory.getPhone(slotId);
- if (phone != null
- && phone.getEmergencyNumberTracker() != null
- && phone.getEmergencyNumberTracker().isEmergencyNumber(number)) {
- return true;
- }
- } catch (IllegalStateException e) {
- loge("isEmergencyNumber e=" + e);
+ lists = mTelephonyManager.getEmergencyNumberList();
+ } catch (IllegalStateException ise) {
+ loge("isEmergencyNumber ise=" + ise);
+ } catch (RuntimeException rte) {
+ loge("isEmergencyNumber rte=" + rte);
+ }
+ if (lists == null) return false;
+
+ List<EmergencyNumber> list = lists.get(subId);
+ if (list == null || list.isEmpty()) return false;
+ for (EmergencyNumber eNumber : list) {
+ if (number.equals(eNumber.getNumber())) return true;
}
return false;
}
@@ -242,11 +251,12 @@
continue;
}
- if (mEmergencyNumberHelper.isEmergencyNumber(i, mNumber)) {
- logi("isThereOtherSlot index=" + i + ", found");
+ int subId = SubscriptionManager.getSubscriptionId(i);
+ if (mEmergencyNumberHelper.isEmergencyNumber(subId, mNumber)) {
+ logi("isThereOtherSlot index=" + i + "(" + subId + "), found");
return true;
} else {
- logi("isThereOtherSlot index=" + i + ", not emergency number");
+ logi("isThereOtherSlot index=" + i + "(" + subId + "), not emergency number");
}
}
@@ -278,6 +288,12 @@
+ ", startQuickTimerInService=" + mStartQuickCrossStackTimerWhenInService);
}
+ /** Test purpose only. */
+ @VisibleForTesting
+ public EmergencyNumberHelper getEmergencyNumberHelper() {
+ return mEmergencyNumberHelper;
+ }
+
/** Destroys the instance. */
public void destroy() {
if (DBG) logd("destroy");
diff --git a/tests/src/com/android/services/telephony/domainselection/CrossSimRedialingControllerTest.java b/tests/src/com/android/services/telephony/domainselection/CrossSimRedialingControllerTest.java
index 7c58efd..2ed91b8 100644
--- a/tests/src/com/android/services/telephony/domainselection/CrossSimRedialingControllerTest.java
+++ b/tests/src/com/android/services/telephony/domainselection/CrossSimRedialingControllerTest.java
@@ -27,6 +27,7 @@
import static com.android.services.telephony.domainselection.CrossSimRedialingController.MSG_QUICK_CROSS_STACK_TIMEOUT;
import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -42,6 +43,7 @@
import android.os.PersistableBundle;
import android.telephony.CarrierConfigManager;
import android.telephony.TelephonyManager;
+import android.telephony.emergency.EmergencyNumber;
import android.testing.TestableLooper;
import android.util.Log;
@@ -54,6 +56,11 @@
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
/**
* Unit tests for CrossSimRedialingController
*/
@@ -462,6 +469,42 @@
verify(mEcds, times(0)).notifyCrossStackTimerExpired();
}
+ @Test
+ public void testEmergencyNumberHelper() throws Exception {
+ mCsrController = new CrossSimRedialingController(mContext,
+ mHandlerThread.getLooper());
+
+ CrossSimRedialingController.EmergencyNumberHelper helper =
+ mCsrController.getEmergencyNumberHelper();
+
+ assertNotNull(helper);
+
+ EmergencyNumber num1 = new EmergencyNumber(TEST_EMERGENCY_NUMBER, "us", "",
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE, new ArrayList<String>(),
+ EmergencyNumber.EMERGENCY_NUMBER_SOURCE_DATABASE,
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
+
+ EmergencyNumber num2 = new EmergencyNumber("119", "jp", "",
+ EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_POLICE, new ArrayList<String>(),
+ EmergencyNumber.EMERGENCY_NUMBER_SOURCE_DATABASE,
+ EmergencyNumber.EMERGENCY_CALL_ROUTING_UNKNOWN);
+
+ Map<Integer, List<EmergencyNumber>> lists = new HashMap<>();
+ List<EmergencyNumber> list = new ArrayList<>();
+ list.add(num1);
+ lists.put(1, list);
+
+ list = new ArrayList<>();
+ list.add(num2);
+ lists.put(2, list);
+
+ doReturn(lists).when(mTelephonyManager).getEmergencyNumberList();
+
+ assertTrue(helper.isEmergencyNumber(1, TEST_EMERGENCY_NUMBER));
+ assertFalse(helper.isEmergencyNumber(2, TEST_EMERGENCY_NUMBER));
+ assertFalse(helper.isEmergencyNumber(3, TEST_EMERGENCY_NUMBER));
+ }
+
private void createController() throws Exception {
mCsrController = new CrossSimRedialingController(mContext,
mHandlerThread.getLooper(), mEmergencyNumberHelper);