12f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu/* 22f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * Copyright (C) 2016 The Android Open Source Project 32f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * 42f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * Licensed under the Apache License, Version 2.0 (the "License"); 52f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * you may not use this file except in compliance with the License. 62f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * You may obtain a copy of the License at 72f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * 82f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * http://www.apache.org/licenses/LICENSE-2.0 92f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * 102f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * Unless required by applicable law or agreed to in writing, software 112f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * distributed under the License is distributed on an "AS IS" BASIS, 122f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * See the License for the specific language governing permissions and 142f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * limitations under the License. 152f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu */ 162f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxupackage com.android.internal.telephony; 172f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 182f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport android.os.Handler; 192f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport android.os.HandlerThread; 204f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxuimport android.os.Message; 219c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yuimport android.telephony.PhoneNumberUtils; 229c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yuimport android.telephony.ServiceState; 232f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport android.test.suitebuilder.annotation.SmallTest; 242f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 252f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport org.junit.After; 262f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport org.junit.Before; 279c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yuimport org.junit.Test; 282f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport org.mockito.ArgumentCaptor; 292f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport org.mockito.Mock; 302f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport org.mockito.Mockito; 319c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu 329c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yuimport java.lang.reflect.Field; 332f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 342f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.junit.Assert.assertEquals; 352f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.junit.Assert.assertFalse; 362f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.junit.Assert.assertTrue; 374f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxuimport static org.mockito.Matchers.anyBoolean; 382f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.mockito.Matchers.anyInt; 392f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.mockito.Matchers.eq; 402f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.mockito.Matchers.isA; 412f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.mockito.Matchers.isNull; 422f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.mockito.Mockito.doReturn; 432f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.mockito.Mockito.times; 442f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxuimport static org.mockito.Mockito.verify; 454f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxuimport static org.mockito.Mockito.mock; 464f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxuimport static org.mockito.Mockito.any; 474f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxuimport static org.mockito.Mockito.anyChar; 484f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxuimport static org.mockito.Mockito.anyString; 492f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 5021e1b42d578d90611f76c37d58841543821502fdJack Yupublic class CallManagerTest extends TelephonyTest { 519c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu 522f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @Mock 532f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu GsmCdmaCall mFgCall; 542f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @Mock 552f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu GsmCdmaCall mBgCall; 562f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @Mock 572f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu GsmCdmaCall mRingingCall; 584f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu @Mock 594f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu Phone mSecondPhone; 604f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 614f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu private CallManagerHandlerThread mCallManagerHandlerThread; 624f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu private Handler mHandler; 634f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu private static final int PHONE_REGISTER_EVENT = 0; 642f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 652f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu private class CallManagerHandlerThread extends HandlerThread { 662f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu private CallManagerHandlerThread(String name) { 672f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu super(name); 682f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 692f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @Override 702f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu public void onLooperPrepared() { 712f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu /* CallManager is a static object with private constructor,no need call constructor */ 724f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu registerForPhone(mPhone); 734f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 744f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu // create a custom handler for the Handler Thread 754f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mHandler = new Handler(mCallManagerHandlerThread.getLooper()) { 764f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu @Override 774f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void handleMessage(Message msg) { 784f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu switch (msg.what) { 794f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu case PHONE_REGISTER_EVENT: 804f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu logd("Phone registered with CallManager"); 814f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu registerForPhone((Phone) msg.obj); 824f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu setReady(true); 834f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu break; 844f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu default: 854f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu logd("Unknown Event " + msg.what); 864f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 874f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 884f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu }; 894f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 902f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu setReady(true); 912f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 924f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 934f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu private void registerForPhone(Phone mPhone) { 944f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().registerPhone(mPhone); 954f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 962f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 972f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 982f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @Before 992f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu public void setUp() throws Exception { 1002f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu super.setUp(this.getClass().getSimpleName()); 1019c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu restoreInstance(CallManager.class, "INSTANCE", null); 1022f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu /* Mock Phone and Call, initially all calls are idle */ 1032f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState(); 1042f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(mBgCall).when(mPhone).getBackgroundCall(); 1052f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(mFgCall).when(mPhone).getForegroundCall(); 1062f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(mRingingCall).when(mPhone).getRingingCall(); 1072f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(mPhone).when(mBgCall).getPhone(); 1082f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(mPhone).when(mFgCall).getPhone(); 1092f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(mPhone).when(mRingingCall).getPhone(); 1102f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(Call.State.IDLE).when(mBgCall).getState(); 1112f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(Call.State.IDLE).when(mFgCall).getState(); 1122f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(Call.State.IDLE).when(mRingingCall).getState(); 1132f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(true).when(mBgCall).isIdle(); 1142f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(true).when(mFgCall).isIdle(); 1152f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(true).when(mRingingCall).isIdle(); 1162f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1174f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mCallManagerHandlerThread = new CallManagerHandlerThread(TAG); 1184f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mCallManagerHandlerThread.start(); 1192f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu waitUntilReady(); 1202f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1212f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1222f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @After 1232f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu public void tearDown() throws Exception { 1242f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu CallManager.getInstance().unregisterPhone(mPhone); 125ae6e8f99bdb297f906d6dcdc0a385ba27eee47fdJack Yu mCallManagerHandlerThread.quit(); 126f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan super.tearDown(); 1272f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1282f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1292f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 1302f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu public void testSanity() { 131703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu assertEquals(mPhone, CallManager.getInstance().getDefaultPhone()); 1322f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu assertFalse(CallManager.getInstance().hasActiveBgCall()); 1332f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu assertFalse(CallManager.getInstance().hasActiveRingingCall()); 1342f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu assertFalse(CallManager.getInstance().hasActiveFgCall()); 1352f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu /* return the default phone if there is no any active call */ 136703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu assertEquals(mPhone, CallManager.getInstance().getRingingPhone()); 137703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu assertEquals(mPhone, CallManager.getInstance().getBgPhone()); 138703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu assertEquals(mPhone, CallManager.getInstance().getFgPhone()); 1392f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1402f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1412f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 1424f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testBasicDial() throws Exception { 1434f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu //verify can dial and dial function of the phone is being triggered 1444f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().dial(mPhone, 1454f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu PhoneNumberUtils.stripSeparators("+17005554141"), 0); 1464f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu ArgumentCaptor<String> mCaptorString = ArgumentCaptor.forClass(String.class); 1474f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu ArgumentCaptor<Integer> mCaptorInt = ArgumentCaptor.forClass(Integer.class); 1484f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).dial(mCaptorString.capture(), mCaptorInt.capture()); 1494f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(PhoneNumberUtils.stripSeparators("+17005554141"), 1504f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mCaptorString.getValue()); 1514f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(0, mCaptorInt.getValue().intValue()); 1522f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1532f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1542f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 1554f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testBasicAcceptCall() throws Exception { 1564f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().acceptCall(mRingingCall); 1574f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).acceptCall(anyInt()); 1582f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1592f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1602f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 1614f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testBasicRejectCall() throws Exception { 1624f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu //verify can dial and dial function of the phone is being triggered 1634f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().rejectCall(mRingingCall); 1644f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).rejectCall(); 1652f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1662f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1672f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 1684f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testSendDtmf() throws Exception { 1692f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu CallManager.getInstance().sendDtmf('a'); 1702f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu verify(mPhone, times(0)).sendDtmf(eq('a')); 1714f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 1724f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu //has active fg Call 1732f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(false).when(mFgCall).isIdle(); 174703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu assertEquals(mFgCall, CallManager.getInstance().getActiveFgCall()); 1752f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu CallManager.getInstance().sendDtmf('a'); 1762f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu verify(mPhone, times(1)).sendDtmf(eq('a')); 1772f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1782f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1792f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 1804f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testStartDtmf() throws Exception { 1814f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(true).when(mFgCall).isIdle(); 1824f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertFalse(CallManager.getInstance().startDtmf('a')); 1834f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(0)).startDtmf(anyChar()); 1844f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 1854f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu //has active fg Call 1864f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(false).when(mFgCall).isIdle(); 1874f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(mFgCall, CallManager.getInstance().getActiveFgCall()); 1884f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertTrue(CallManager.getInstance().startDtmf('a')); 1894f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).startDtmf('a'); 1902f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 1912f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 1922f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 1934f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testStopDtmf() throws Exception { 1944f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(true).when(mFgCall).isIdle(); 1954f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().stopDtmf(); 1964f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(0)).stopDtmf(); 1974f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 1984f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu //has active fg Call 1994f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(false).when(mFgCall).isIdle(); 2004f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(mPhone, CallManager.getInstance().getFgPhone()); 2014f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().stopDtmf(); 2024f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).stopDtmf(); 2034f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 2044f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2054f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu @SmallTest @Test 2064f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testSendBurstDtmf() throws Exception { 2074f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(true).when(mFgCall).isIdle(); 2084f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertFalse(CallManager.getInstance().sendBurstDtmf("12*#", 0, 0, null)); 2094f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(0)).sendBurstDtmf(anyString(), anyInt(), anyInt(), (Message) any()); 2104f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2114f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu //has active fg Call 2124f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(false).when(mFgCall).isIdle(); 2134f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertTrue(CallManager.getInstance().sendBurstDtmf("12*#", 0, 0, null)); 2144f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).sendBurstDtmf("12*#", 0, 0, null); 2154f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 2164f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2174f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu @SmallTest @Test 2184f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testSetGetMute() throws Exception { 2194f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().setMute(false); 2204f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(0)).setMute(anyBoolean()); 2214f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2224f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu //has active fg Call 2234f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(false).when(mFgCall).isIdle(); 2244f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().setMute(false); 2254f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).setMute(false); 2264f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2274f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().setMute(true); 2284f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).setMute(true); 2294f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 2304f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2314f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu @SmallTest @Test 2324f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testSwitchHoldingAndActive() throws Exception { 2334f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* case 1: only active call */ 2344f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(false).when(mFgCall).isIdle(); 2354f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().switchHoldingAndActive(null); 2364f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).switchHoldingAndActive(); 2374f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* case 2: no active call but only held call, aka, unhold */ 2384f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(true).when(mFgCall).isIdle(); 2394f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().switchHoldingAndActive(mBgCall); 2404f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(2)).switchHoldingAndActive(); 2414f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* case 3: both active and held calls from same phone, aka, swap */ 2424f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(false).when(mFgCall).isIdle(); 2434f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().switchHoldingAndActive(mBgCall); 2444f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(3)).switchHoldingAndActive(); 2454f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu GsmCdmaPhone mPhoneHold = Mockito.mock(GsmCdmaPhone.class); 2464f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* case 4: active and held calls from different phones, aka, phone swap */ 2474f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(mPhoneHold).when(mBgCall).getPhone(); 2484f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().switchHoldingAndActive(mBgCall); 2494f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(4)).switchHoldingAndActive(); 2504f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhoneHold, times(1)).switchHoldingAndActive(); 2514f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 2524f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2534f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu @SmallTest @Test 2544f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testHangupForegroundResumeBackground() throws Exception { 2554f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().hangupForegroundResumeBackground(mBgCall); 2564f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* no active fgCall */ 2574f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(0)).switchHoldingAndActive(); 2584f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mFgCall, times(0)).hangup(); 2594f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2604f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* have active foreground call, get hanged up */ 2614f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(false).when(mFgCall).isIdle(); 2624f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().hangupForegroundResumeBackground(mBgCall); 2634f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mFgCall, times(1)).hangup(); 2644f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(0)).switchHoldingAndActive(); 2654f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2664f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* mock bgcall and fgcall from different phone */ 2674f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu GsmCdmaPhone mPhoneHold = Mockito.mock(GsmCdmaPhone.class); 2684f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(mPhoneHold).when(mBgCall).getPhone(); 2694f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().hangupForegroundResumeBackground(mBgCall); 2704f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mFgCall, times(2)).hangup(); 2714f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* always hangup fgcall and both phone trigger swap */ 2724f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhoneHold, times(1)).switchHoldingAndActive(); 2734f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).switchHoldingAndActive(); 2742f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 2752f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 2762f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @SmallTest @Test 2774f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testFgCallActiveDial() throws Exception { 2782f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu /* set Fg/Bg Call state to active, verify CallManager Logical */ 2792f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(false).when(mFgCall).isIdle(); 2802f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu doReturn(false).when(mBgCall).isIdle(); 2812f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu assertTrue(CallManager.getInstance().hasActiveFgCall()); 2822f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu assertTrue(CallManager.getInstance().hasActiveBgCall()); 2832f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu assertTrue(CallManager.getInstance().hasActiveFgCall(mPhone.getSubId())); 2842f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu assertFalse(CallManager.getInstance().hasDisconnectedFgCall()); 2852f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu /* try dial with non-idle foreground call and background call */ 2864f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().dial(mPhone, 2874f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu PhoneNumberUtils.stripSeparators("+17005554141"), 0); 2884f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu ArgumentCaptor<String> mCaptorString = ArgumentCaptor.forClass(String.class); 2894f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu ArgumentCaptor<Integer> mCaptorInt = ArgumentCaptor.forClass(Integer.class); 2904f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 2914f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).dial(mCaptorString.capture(), mCaptorInt.capture()); 2924f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(PhoneNumberUtils.stripSeparators("+17005554141"), 2934f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mCaptorString.getValue()); 2944f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(0, mCaptorInt.getValue().intValue()); 2952f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 2962f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu 2972f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu @Test @SmallTest 2984f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testRegisterEvent() throws Exception { 2994f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu Field field = CallManager.class.getDeclaredField("EVENT_CALL_WAITING"); 3004f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu field.setAccessible(true); 3014f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu int mEvent = (Integer) field.get(CallManager.getInstance()); 3024f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).registerForCallWaiting(isA(Handler.class), 3034f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu eq(mEvent), isNull()); 3044f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3054f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu field = CallManager.class.getDeclaredField("EVENT_PRECISE_CALL_STATE_CHANGED"); 3064f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu field.setAccessible(true); 3074f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mEvent = (Integer) field.get(CallManager.getInstance()); 3084f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).registerForPreciseCallStateChanged(isA(Handler.class), 3094f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu eq(mEvent), isA(Object.class)); 3104f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3114f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu field = CallManager.class.getDeclaredField("EVENT_RINGBACK_TONE"); 3124f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu field.setAccessible(true); 3134f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mEvent = (Integer) field.get(CallManager.getInstance()); 3144f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu verify(mPhone, times(1)).registerForRingbackTone(isA(Handler.class), 3154f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu eq(mEvent), isA(Object.class)); 3164f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu } 3174f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3184f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu @Test @SmallTest 3194f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu public void testGetServiceState() throws Exception { 3204f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu // register for another phone 3214f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu ServiceState mSecondServiceState = mock(ServiceState.class); 3224f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(mSecondServiceState).when(mSecondPhone).getServiceState(); 3234f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3244f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu Message mRegisterPhone = mHandler.obtainMessage(PHONE_REGISTER_EVENT, 3254f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mSecondPhone); 3264f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu setReady(false); 3274f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu mRegisterPhone.sendToTarget(); 3284f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3294f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu waitUntilReady(); 3304f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3314f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu // mPhone: STATE_IN_SERVICE > mPhoneSecond: state STATE_OUT_OF_SERVICE 3324f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mSecondServiceState).getState(); 3334f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(ServiceState.STATE_IN_SERVICE, CallManager.getInstance().getServiceState()); 3344f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3354f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu // mPhone: STATE_IN_SERVICE > mPhoneSecond: state STATE_EMERGENCY_ONLY 3364f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(ServiceState.STATE_EMERGENCY_ONLY).when(mSecondServiceState).getState(); 3374f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(ServiceState.STATE_IN_SERVICE, CallManager.getInstance().getServiceState()); 3384f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3394f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu // mPhone: STATE_IN_SERVICE > mPhoneSecond: state STATE_POWER_OFF 3404f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(ServiceState.STATE_POWER_OFF).when(mSecondServiceState).getState(); 3414f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(ServiceState.STATE_IN_SERVICE, CallManager.getInstance().getServiceState()); 3424f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3434f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu // mPhone: STATE_EMERGENCY_ONLY < mPhoneSecond: state STATE_OUT_OF_SERVICE 3444f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mSecondServiceState).getState(); 3454f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(ServiceState.STATE_EMERGENCY_ONLY).when(mServiceState).getState(); 3464f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(ServiceState.STATE_OUT_OF_SERVICE, 3474f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().getServiceState()); 3484f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3494f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu // mPhone: STATE_POWER_OFF < mPhoneSecond: state STATE_OUT_OF_SERVICE 3504f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(ServiceState.STATE_POWER_OFF).when(mServiceState).getState(); 3514f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(ServiceState.STATE_OUT_OF_SERVICE, 3524f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().getServiceState()); 3534f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu 3544f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu /* mPhone: STATE_POWER_OFF < mPhoneSecond: state STATE_EMERGENCY_ONLY 3554f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu but OUT_OF_SERVICE will replaces EMERGENCY_ONLY and POWER_OFF */ 3564f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu doReturn(ServiceState.STATE_EMERGENCY_ONLY).when(mSecondServiceState).getState(); 3574f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu assertEquals(ServiceState.STATE_OUT_OF_SERVICE, 3584f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().getServiceState()); 3594f81d75a7961f20a9255d85d2f7b2ed366fae117fionaxu CallManager.getInstance().unregisterPhone(mSecondPhone); 3602f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu } 3612f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu} 362