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