Loading src/java/com/android/internal/telephony/Connection.java +59 −3 Original line number Diff line number Diff line Loading @@ -327,6 +327,41 @@ public abstract class Connection { /* Instance Methods */ /** * PhoneFactory Dependencies for testing. */ @VisibleForTesting public interface PhoneFactoryProxy { Phone getPhone(int index); Phone getDefaultPhone(); Phone[] getPhones(); } private PhoneFactoryProxy mPhoneFactoryProxy = new PhoneFactoryProxy() { @Override public Phone getPhone(int index) { return PhoneFactory.getPhone(index); } @Override public Phone getDefaultPhone() { return PhoneFactory.getDefaultPhone(); } @Override public Phone[] getPhones() { return PhoneFactory.getPhones(); } }; /** * Overrides PhoneFactory dependencies for testing. */ @VisibleForTesting public void setPhoneFactoryProxy(PhoneFactoryProxy proxy) { mPhoneFactoryProxy = proxy; } /** * @return The telecom internal call ID associated with this connection. Only to be used for * debugging purposes. Loading Loading @@ -590,14 +625,35 @@ public abstract class Connection { */ public void setEmergencyCallInfo(CallTracker ct) { if (ct != null) { Phone phone = ct.getPhone(); if (phone != null) { EmergencyNumberTracker tracker = phone.getEmergencyNumberTracker(); Phone currentPhone = ct.getPhone(); if (currentPhone != null) { EmergencyNumberTracker tracker = currentPhone.getEmergencyNumberTracker(); if (tracker != null) { EmergencyNumber num = tracker.getEmergencyNumber(mAddress); Phone[] allPhones = mPhoneFactoryProxy.getPhones(); if (num != null) { mIsEmergencyCall = true; mEmergencyNumberInfo = num; } else if (allPhones.length > 1) { // If there are multiple active SIMs, check all instances: boolean found = false; for (Phone phone : allPhones) { // If the current iteration was already checked, skip: if (phone.getPhoneId() == currentPhone.getPhoneId()){ continue; } num = phone.getEmergencyNumberTracker() .getEmergencyNumber(mAddress); if (num != null){ found = true; mIsEmergencyCall = true; mEmergencyNumberInfo = num; break; } } if (!found){ Rlog.e(TAG, "setEmergencyCallInfo: emergency number is null"); } } else { Rlog.e(TAG, "setEmergencyCallInfo: emergency number is null"); } Loading tests/telephonytests/src/com/android/internal/telephony/ConnectionTest.java +35 −0 Original line number Diff line number Diff line Loading @@ -20,11 +20,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.os.Handler; import android.os.Looper; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import org.junit.After; import org.junit.Before; Loading @@ -39,6 +42,10 @@ public class ConnectionTest extends TelephonyTest { // Mocked classes protected Call mCall; protected GsmCdmaPhone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest. protected EmergencyNumberTracker mEmergencyNumberTracker2; protected Connection.PhoneFactoryProxy mPhoneFactoryProxy; protected Connection mTestConnection; private class TestConnection extends Connection { Loading Loading @@ -117,7 +124,16 @@ public class ConnectionTest extends TelephonyTest { super.setUp(getClass().getSimpleName()); mCall = mock(Call.class); doReturn(mPhone).when(mCall).getPhone(); doReturn(mPhone).when(mCT).getPhone(); replaceInstance(Handler.class, "mLooper", mCT, Looper.getMainLooper()); mPhone2 = mock(GsmCdmaPhone.class); mEmergencyNumberTracker2 = mock(EmergencyNumberTracker.class); doReturn(mEmergencyNumberTracker2).when(mPhone2).getEmergencyNumberTracker(); mTestConnection = new TestConnection(TEST_PHONE_TYPE); mPhoneFactoryProxy = mock(Connection.PhoneFactoryProxy.class); mTestConnection.setPhoneFactoryProxy(mPhoneFactoryProxy); } @After Loading Loading @@ -156,5 +172,24 @@ public class ConnectionTest extends TelephonyTest { assertTrue(connection.hasKnownUserIntentEmergency()); } @Test public void testSetEmergencyCallInfo() { //Replicate Dual-SIM: Phone [] phones = {mPhone, mPhone2}; when(mPhoneFactoryProxy.getPhones()).thenReturn(phones); doReturn(1).when(mPhone).getPhoneId(); doReturn(2).when(mPhone2).getPhoneId(); //Replicate behavior when a number is an emergency number // on the secondary SIM but not on the default SIM: when(mPhone.getEmergencyNumberTracker().getEmergencyNumber(any())).thenReturn(null); when(mEmergencyNumberTracker2.getEmergencyNumber(any())) .thenReturn(getTestEmergencyNumber()); //Ensure the connection is considered as an emergency call: mTestConnection.setEmergencyCallInfo(mCT); assertTrue(mTestConnection.isEmergencyCall()); } // TODO Verify more methods in Connection } Loading
src/java/com/android/internal/telephony/Connection.java +59 −3 Original line number Diff line number Diff line Loading @@ -327,6 +327,41 @@ public abstract class Connection { /* Instance Methods */ /** * PhoneFactory Dependencies for testing. */ @VisibleForTesting public interface PhoneFactoryProxy { Phone getPhone(int index); Phone getDefaultPhone(); Phone[] getPhones(); } private PhoneFactoryProxy mPhoneFactoryProxy = new PhoneFactoryProxy() { @Override public Phone getPhone(int index) { return PhoneFactory.getPhone(index); } @Override public Phone getDefaultPhone() { return PhoneFactory.getDefaultPhone(); } @Override public Phone[] getPhones() { return PhoneFactory.getPhones(); } }; /** * Overrides PhoneFactory dependencies for testing. */ @VisibleForTesting public void setPhoneFactoryProxy(PhoneFactoryProxy proxy) { mPhoneFactoryProxy = proxy; } /** * @return The telecom internal call ID associated with this connection. Only to be used for * debugging purposes. Loading Loading @@ -590,14 +625,35 @@ public abstract class Connection { */ public void setEmergencyCallInfo(CallTracker ct) { if (ct != null) { Phone phone = ct.getPhone(); if (phone != null) { EmergencyNumberTracker tracker = phone.getEmergencyNumberTracker(); Phone currentPhone = ct.getPhone(); if (currentPhone != null) { EmergencyNumberTracker tracker = currentPhone.getEmergencyNumberTracker(); if (tracker != null) { EmergencyNumber num = tracker.getEmergencyNumber(mAddress); Phone[] allPhones = mPhoneFactoryProxy.getPhones(); if (num != null) { mIsEmergencyCall = true; mEmergencyNumberInfo = num; } else if (allPhones.length > 1) { // If there are multiple active SIMs, check all instances: boolean found = false; for (Phone phone : allPhones) { // If the current iteration was already checked, skip: if (phone.getPhoneId() == currentPhone.getPhoneId()){ continue; } num = phone.getEmergencyNumberTracker() .getEmergencyNumber(mAddress); if (num != null){ found = true; mIsEmergencyCall = true; mEmergencyNumberInfo = num; break; } } if (!found){ Rlog.e(TAG, "setEmergencyCallInfo: emergency number is null"); } } else { Rlog.e(TAG, "setEmergencyCallInfo: emergency number is null"); } Loading
tests/telephonytests/src/com/android/internal/telephony/ConnectionTest.java +35 −0 Original line number Diff line number Diff line Loading @@ -20,11 +20,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.os.Handler; import android.os.Looper; import com.android.internal.telephony.emergency.EmergencyNumberTracker; import org.junit.After; import org.junit.Before; Loading @@ -39,6 +42,10 @@ public class ConnectionTest extends TelephonyTest { // Mocked classes protected Call mCall; protected GsmCdmaPhone mPhone2; // mPhone as phone 1 is already defined in TelephonyTest. protected EmergencyNumberTracker mEmergencyNumberTracker2; protected Connection.PhoneFactoryProxy mPhoneFactoryProxy; protected Connection mTestConnection; private class TestConnection extends Connection { Loading Loading @@ -117,7 +124,16 @@ public class ConnectionTest extends TelephonyTest { super.setUp(getClass().getSimpleName()); mCall = mock(Call.class); doReturn(mPhone).when(mCall).getPhone(); doReturn(mPhone).when(mCT).getPhone(); replaceInstance(Handler.class, "mLooper", mCT, Looper.getMainLooper()); mPhone2 = mock(GsmCdmaPhone.class); mEmergencyNumberTracker2 = mock(EmergencyNumberTracker.class); doReturn(mEmergencyNumberTracker2).when(mPhone2).getEmergencyNumberTracker(); mTestConnection = new TestConnection(TEST_PHONE_TYPE); mPhoneFactoryProxy = mock(Connection.PhoneFactoryProxy.class); mTestConnection.setPhoneFactoryProxy(mPhoneFactoryProxy); } @After Loading Loading @@ -156,5 +172,24 @@ public class ConnectionTest extends TelephonyTest { assertTrue(connection.hasKnownUserIntentEmergency()); } @Test public void testSetEmergencyCallInfo() { //Replicate Dual-SIM: Phone [] phones = {mPhone, mPhone2}; when(mPhoneFactoryProxy.getPhones()).thenReturn(phones); doReturn(1).when(mPhone).getPhoneId(); doReturn(2).when(mPhone2).getPhoneId(); //Replicate behavior when a number is an emergency number // on the secondary SIM but not on the default SIM: when(mPhone.getEmergencyNumberTracker().getEmergencyNumber(any())).thenReturn(null); when(mEmergencyNumberTracker2.getEmergencyNumber(any())) .thenReturn(getTestEmergencyNumber()); //Ensure the connection is considered as an emergency call: mTestConnection.setEmergencyCallInfo(mCT); assertTrue(mTestConnection.isEmergencyCall()); } // TODO Verify more methods in Connection }