10a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/*
29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2016 The Android Open Source Project
30a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
40a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License");
50a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * you may not use this file except in compliance with the License.
60a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * You may obtain a copy of the License at
70a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
80a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *      http://www.apache.org/licenses/LICENSE-2.0
90a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Unless required by applicable law or agreed to in writing, software
110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS,
120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * See the License for the specific language governing permissions and
140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * limitations under the License.
150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpackage com.android.internal.telephony;
180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
19802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static com.android.internal.telephony.CommandsInterface.CF_ACTION_ENABLE;
20802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static com.android.internal.telephony.CommandsInterface.CF_REASON_UNCONDITIONAL;
21802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
22802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan
23802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.junit.Assert.assertEquals;
24802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.junit.Assert.assertFalse;
25802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.junit.Assert.assertTrue;
26802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.junit.Assert.fail;
27802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Matchers.anyLong;
28802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Matchers.nullable;
29802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.anyBoolean;
30802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.anyInt;
31802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.atLeast;
32802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.doReturn;
33802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.eq;
3496170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liuimport static org.mockito.Mockito.mock;
3509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Mengimport static org.mockito.Mockito.spy;
36802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.times;
37802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.verify;
38802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan
39de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport android.app.Activity;
40de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport android.app.IApplicationThread;
41de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport android.content.IIntentReceiver;
420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent;
4378867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajanimport android.content.SharedPreferences;
440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.AsyncResult;
45de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport android.os.Bundle;
46de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport android.os.Handler;
470c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajanimport android.os.HandlerThread;
4832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.os.Message;
498b38cd985149b459969dd2ac9e8013d852dc6760Sooraj Sasindranimport android.os.Process;
508b38cd985149b459969dd2ac9e8013d852dc6760Sooraj Sasindranimport android.os.WorkSource;
5197b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajanimport android.preference.PreferenceManager;
52516010d13181808ca8205316a419b615e5a9fe5eShuoqimport android.support.test.filters.FlakyTest;
530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager;
540c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajanimport android.telephony.CellLocation;
550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.ServiceState;
56d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajanimport android.telephony.SubscriptionManager;
570c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajanimport android.telephony.cdma.CdmaCellLocation;
580c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajanimport android.telephony.gsm.GsmCellLocation;
590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.suitebuilder.annotation.SmallTest;
600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
6114bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajanimport com.android.internal.telephony.test.SimulatedCommands;
62649c81576a5d145fffab05896f02b433612c2847Malcolm Chenimport com.android.internal.telephony.uicc.IccCardApplicationStatus;
63153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport com.android.internal.telephony.uicc.IccException;
642d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajanimport com.android.internal.telephony.uicc.IccRecords;
6509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Mengimport com.android.internal.telephony.uicc.UiccController;
66649c81576a5d145fffab05896f02b433612c2847Malcolm Chenimport com.android.internal.telephony.uicc.UiccProfile;
6796170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liuimport com.android.internal.telephony.uicc.UiccSlot;
680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.junit.After;
700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.junit.Before;
71802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport org.junit.Ignore;
720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.junit.Test;
73153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport org.mockito.ArgumentCaptor;
74de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport org.mockito.Mock;
7509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Mengimport org.mockito.Mockito;
76de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
77de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajanimport java.util.List;
7832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
7932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanpublic class GsmCdmaPhoneTest extends TelephonyTest {
80de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    @Mock
81de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    private Handler mTestHandler;
82de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
8332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    //mPhoneUnderTest
8432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    private GsmCdmaPhone mPhoneUT;
857e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    private GsmCdmaPhoneTestHandler mGsmCdmaPhoneTestHandler;
8614bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
87de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    private static final int EVENT_EMERGENCY_CALLBACK_MODE_EXIT = 1;
88de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    private static final int EVENT_EMERGENCY_CALL_TOGGLE = 2;
89649c81576a5d145fffab05896f02b433612c2847Malcolm Chen    private static final int EVENT_SET_ICC_LOCK_ENABLED = 3;
90de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
910c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    private class GsmCdmaPhoneTestHandler extends HandlerThread {
920c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
930c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        private GsmCdmaPhoneTestHandler(String name) {
940c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            super(name);
950c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        }
960c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
970c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        @Override
980c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        public void onLooperPrepared() {
99f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan            mPhoneUT = new GsmCdmaPhone(mContext, mSimulatedCommands, mNotifier, true, 0,
100f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan                    PhoneConstants.PHONE_TYPE_GSM, mTelephonyComponentFactory);
10132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            setReady(true);
1020c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        }
1030c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
1040c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
1050c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    private void switchToGsm() {
106b9d551db1795b30598e2ce98cfae7106788c12d6fionaxu        mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_GSM);
10732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_VOICE_RADIO_TECH_CHANGED,
10832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan                new AsyncResult(null, new int[]{ServiceState.RIL_RADIO_TECHNOLOGY_GSM}, null)));
1090c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        //wait for voice RAT to be updated
110153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        waitForMs(50);
111153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(PhoneConstants.PHONE_TYPE_GSM, mPhoneUT.getPhoneType());
1120c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
1130c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
1140c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    private void switchToCdma() {
115b9d551db1795b30598e2ce98cfae7106788c12d6fionaxu        mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_IS95A);
11632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_VOICE_RADIO_TECH_CHANGED,
1170c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                new AsyncResult(null, new int[]{ServiceState.RIL_RADIO_TECHNOLOGY_IS95A}, null)));
1180c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        //wait for voice RAT to be updated
1193374f09335e5b7681af05a35dd7454b565f8bb72Jordan Liu        waitForMs(100);
120153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(PhoneConstants.PHONE_TYPE_CDMA, mPhoneUT.getPhoneType());
1210c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
1220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Before
1240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void setUp() throws Exception {
125ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan        super.setUp(getClass().getSimpleName());
1260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doReturn(false).when(mSST).isDeviceShuttingDown();
1280c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
1297e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mGsmCdmaPhoneTestHandler = new GsmCdmaPhoneTestHandler(TAG);
1307e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mGsmCdmaPhoneTestHandler.start();
1315d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan        waitUntilReady();
132153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
133153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        verify(mUiccController).registerForIccChanged(eq(mPhoneUT), integerArgumentCaptor.capture(),
134b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Object.class));
135153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        Message msg = Message.obtain();
136153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        msg.what = integerArgumentCaptor.getValue();
137153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        mPhoneUT.sendMessage(msg);
138153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        waitForMs(50);
1390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @After
1420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void tearDown() throws Exception {
143f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        mPhoneUT.removeCallbacksAndMessages(null);
14432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT = null;
145ae6e8f99bdb297f906d6dcdc0a385ba27eee47fdJack Yu        mGsmCdmaPhoneTestHandler.quit();
146f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        super.tearDown();
1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
149153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
150153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
1510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void testPhoneTypeSwitch() {
15232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertTrue(mPhoneUT.isPhoneTypeGsm());
1530c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        switchToCdma();
15432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertTrue(mPhoneUT.isPhoneTypeCdmaLte());
1550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
157153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
158153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
1590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void testHandleActionCarrierConfigChanged() {
160e058dbf4b5b9e76cb70c10630f3d834821d751d1Amit Mahajan        Intent intent = new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED);
161e058dbf4b5b9e76cb70c10630f3d834821d751d1Amit Mahajan        mContext.sendBroadcast(intent);
162e058dbf4b5b9e76cb70c10630f3d834821d751d1Amit Mahajan        waitForMs(50);
163e058dbf4b5b9e76cb70c10630f3d834821d751d1Amit Mahajan        verify(mSST, times(1)).pollState();
164e058dbf4b5b9e76cb70c10630f3d834821d751d1Amit Mahajan
1650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        // set voice radio tech in RIL to 1xRTT. ACTION_CARRIER_CONFIG_CHANGED should trigger a
1660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        // query and change phone type
167ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT);
16832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertTrue(mPhoneUT.isPhoneTypeGsm());
169f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        mContext.sendBroadcast(intent);
170153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        waitForMs(50);
17132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertTrue(mPhoneUT.isPhoneTypeCdmaLte());
172e058dbf4b5b9e76cb70c10630f3d834821d751d1Amit Mahajan        verify(mSST, times(2)).pollState();
1730c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
1740c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
175153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
176153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
1770c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    public void testGetServiceState() {
1780c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        ServiceState serviceState = new ServiceState();
1790c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        mSST.mSS = serviceState;
18032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertEquals(serviceState, mPhoneUT.getServiceState());
1810c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
1820c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
183153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
184153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
18509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    public void testGetSubscriberIdForGsmPhone() {
18609e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        final String subscriberId = "123456789";
18709e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        IccRecords iccRecords = Mockito.mock(IccRecords.class);
18809e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(subscriberId).when(iccRecords).getIMSI();
18909e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(iccRecords).when(mUiccController)
19009e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng                .getIccRecords(anyInt() /* phoneId */, eq(UiccController.APP_FAM_3GPP));
19109e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
19209e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        // Ensure the phone type is GSM
19309e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        GsmCdmaPhone spyPhone = spy(mPhoneUT);
19409e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(false).when(spyPhone).isPhoneTypeCdma();
19509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(false).when(spyPhone).isPhoneTypeCdmaLte();
19609e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(true).when(spyPhone).isPhoneTypeGsm();
19709e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
19809e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        assertEquals(subscriberId, spyPhone.getSubscriberId());
19909e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    }
20009e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
20109e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    @Test
20209e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    @SmallTest
20309e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    public void testGetSubscriberIdForCdmaLtePhone() {
20409e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        final String subscriberId = "abcdefghijk";
20509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        IccRecords iccRecords = Mockito.mock(IccRecords.class);
20609e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(subscriberId).when(iccRecords).getIMSI();
20709e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(iccRecords).when(mUiccController)
20809e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng                .getIccRecords(anyInt() /* phoneId */, eq(UiccController.APP_FAM_3GPP));
20909e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
21009e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        // Ensure the phone type is CdmaLte
21109e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        GsmCdmaPhone spyPhone = spy(mPhoneUT);
21209e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(false).when(spyPhone).isPhoneTypeCdma();
21309e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(true).when(spyPhone).isPhoneTypeCdmaLte();
21409e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(false).when(spyPhone).isPhoneTypeGsm();
21509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
21609e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        assertEquals(subscriberId, spyPhone.getSubscriberId());
21709e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    }
21809e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
21909e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    @Test
22009e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    @SmallTest
22109e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    public void testGetSubscriberIdForCdmaPhone() {
22209e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        final String subscriberId = "987654321";
22309e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(subscriberId).when(mSST).getImsi();
22409e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
22509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        // Ensure the phone type is GSM
22609e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        GsmCdmaPhone spyPhone = spy(mPhoneUT);
22709e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(true).when(spyPhone).isPhoneTypeCdma();
22809e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(false).when(spyPhone).isPhoneTypeCdmaLte();
22909e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        doReturn(false).when(spyPhone).isPhoneTypeGsm();
23009e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
23109e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng        assertEquals(subscriberId, spyPhone.getSubscriberId());
23209e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    }
23309e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng
23409e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    @Test
23509e47aaeffc7f61b625e3e8a105b81cff99058fePengquan Meng    @SmallTest
2360c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    public void testGetCellLocation() {
2370c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // GSM
2380c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        CellLocation cellLocation = new GsmCellLocation();
2398b38cd985149b459969dd2ac9e8013d852dc6760Sooraj Sasindran        WorkSource workSource = new WorkSource(Process.myUid(),
2408b38cd985149b459969dd2ac9e8013d852dc6760Sooraj Sasindran            mContext.getPackageName());
2418b38cd985149b459969dd2ac9e8013d852dc6760Sooraj Sasindran        doReturn(cellLocation).when(mSST).getCellLocation(workSource);
2428b38cd985149b459969dd2ac9e8013d852dc6760Sooraj Sasindran        assertEquals(cellLocation, mPhoneUT.getCellLocation(workSource));
2430c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
2440c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // Switch to CDMA
2450c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        switchToCdma();
2460c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
2470c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        CdmaCellLocation cdmaCellLocation = new CdmaCellLocation();
2480c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        cdmaCellLocation.setCellLocationData(0, 0, 0, 0, 0);
2490c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        mSST.mCellLoc = cdmaCellLocation;
2500c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
251fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        /*
252fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        LOCATION_MODE is a special case in SettingsProvider. Adding the special handling in mock
253fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        content provider is probably not worth the effort; it will also tightly couple tests with
254fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        SettingsProvider implementation.
2550c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // LOCATION_MODE_ON
256fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        Settings.Secure.putInt(mContext.getContentResolver(),
2570c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_HIGH_ACCURACY);
258fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        waitForMs(50);
25932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        CdmaCellLocation actualCellLocation = (CdmaCellLocation) mPhoneUT.getCellLocation();
2600c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        assertEquals(0, actualCellLocation.getBaseStationLatitude());
2610c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        assertEquals(0, actualCellLocation.getBaseStationLongitude());
2620c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
2630c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // LOCATION_MODE_OFF
2640c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        Settings.Secure.putInt(TestApplication.getAppContext().getContentResolver(),
2650c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF);
266fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        waitForMs(50);
267fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        */
268fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
269b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        CdmaCellLocation actualCellLocation =
270b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                (CdmaCellLocation) mPhoneUT.getCellLocation(workSource);
2710c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        assertEquals(CdmaCellLocation.INVALID_LAT_LONG,
2720c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                actualCellLocation.getBaseStationLatitude());
2730c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        assertEquals(CdmaCellLocation.INVALID_LAT_LONG,
2740c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                actualCellLocation.getBaseStationLongitude());
2750c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
2760c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
277153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
278153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
2790c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    public void testGetPhoneType() {
28032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertEquals(PhoneConstants.PHONE_TYPE_GSM, mPhoneUT.getPhoneType());
2810c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
2820c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // Switch to CDMA
2830c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        switchToCdma();
2840c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
28532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertEquals(PhoneConstants.PHONE_TYPE_CDMA, mPhoneUT.getPhoneType());
2860c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
2870c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
288153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
289153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
2900c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    public void testGetDataConnectionState() {
2910c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // There are several cases possible. Testing few of them for now.
2920c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // 1. GSM, getCurrentDataConnectionState != STATE_IN_SERVICE, apn != APN_TYPE_EMERGENCY
2930c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        doReturn(ServiceState.STATE_OUT_OF_SERVICE).when(mSST).getCurrentDataConnectionState();
29432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertEquals(PhoneConstants.DataState.DISCONNECTED, mPhoneUT.getDataConnectionState(
2950c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                PhoneConstants.APN_TYPE_ALL));
2960c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
2970c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // 2. GSM, getCurrentDataConnectionState != STATE_IN_SERVICE, apn = APN_TYPE_EMERGENCY, apn
2985452ccfc4d32fab9933bdcfe775c38f73d4e1b15Robert Greenwalt        // not connected
2995452ccfc4d32fab9933bdcfe775c38f73d4e1b15Robert Greenwalt        doReturn(DctConstants.State.IDLE).when(mDcTracker).getState(
3005452ccfc4d32fab9933bdcfe775c38f73d4e1b15Robert Greenwalt                PhoneConstants.APN_TYPE_EMERGENCY);
30132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertEquals(PhoneConstants.DataState.DISCONNECTED, mPhoneUT.getDataConnectionState(
3020c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                PhoneConstants.APN_TYPE_EMERGENCY));
3030c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3040c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // 3. GSM, getCurrentDataConnectionState != STATE_IN_SERVICE, apn = APN_TYPE_EMERGENCY,
3055452ccfc4d32fab9933bdcfe775c38f73d4e1b15Robert Greenwalt        // APN is connected, callTracker state = idle
3060c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        doReturn(DctConstants.State.CONNECTED).when(mDcTracker).getState(
3070c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                PhoneConstants.APN_TYPE_EMERGENCY);
3080c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        mCT.mState = PhoneConstants.State.IDLE;
30932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertEquals(PhoneConstants.DataState.CONNECTED, mPhoneUT.getDataConnectionState(
3100c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                PhoneConstants.APN_TYPE_EMERGENCY));
3110c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3120c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // 3. GSM, getCurrentDataConnectionState != STATE_IN_SERVICE, apn = APN_TYPE_EMERGENCY,
3130c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        // APN enabled and CONNECTED, callTracker state != idle, !isConcurrentVoiceAndDataAllowed
3140c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        mCT.mState = PhoneConstants.State.RINGING;
3150c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        doReturn(false).when(mSST).isConcurrentVoiceAndDataAllowed();
31632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertEquals(PhoneConstants.DataState.SUSPENDED, mPhoneUT.getDataConnectionState(
3170c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan                PhoneConstants.APN_TYPE_EMERGENCY));
3180c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    }
3190c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
320153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
321153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
3220c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan    public void testHandleInCallMmiCommands() {
3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        try {
3240c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            // Switch to CDMA
3250c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            switchToCdma();
3260c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
32732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            assertFalse(mPhoneUT.handleInCallMmiCommands("0"));
3280c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3290c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            // Switch to GSM
3300c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            switchToGsm();
3310c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3320c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            mCT.mForegroundCall = mGsmCdmaCall;
3330c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            mCT.mBackgroundCall = mGsmCdmaCall;
3340c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            mCT.mRingingCall = mGsmCdmaCall;
3350c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            doReturn(GsmCdmaCall.State.IDLE).when(mGsmCdmaCall).getState();
3360c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3370c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            // !isInCall
33832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            assertFalse(mPhoneUT.handleInCallMmiCommands("0"));
3390c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3400c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            // isInCall
3410c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            doReturn(GsmCdmaCall.State.ACTIVE).when(mGsmCdmaCall).getState();
34232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            assertTrue(mPhoneUT.handleInCallMmiCommands("0"));
3430c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3440c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            // empty dialString
34532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            assertFalse(mPhoneUT.handleInCallMmiCommands(""));
34632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            assertFalse(mPhoneUT.handleInCallMmiCommands(null));
3470c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan
3480c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan        } catch (Exception e) {
3490c3ec24396bb8c21b4d89f743b626c13dd35ba7bAmit Mahajan            fail(e.toString());
3500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
3520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
353153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
354153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
35532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    public void testDial() {
35632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        try {
35732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            mSST.mSS = mServiceState;
35832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState();
35932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
36032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            mCT.mForegroundCall = mGsmCdmaCall;
36132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            mCT.mBackgroundCall = mGsmCdmaCall;
36232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            mCT.mRingingCall = mGsmCdmaCall;
36332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            doReturn(GsmCdmaCall.State.IDLE).when(mGsmCdmaCall).getState();
36432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
365794af81014ba7d6d75d1e9cd11058addb3368dabHall Liu            Connection connection = mPhoneUT.dial("1234567890",
366794af81014ba7d6d75d1e9cd11058addb3368dabHall Liu                    new PhoneInternalInterface.DialArgs.Builder().build());
36732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            verify(mCT).dial("1234567890", null, null);
368153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        } catch (CallStateException e) {
36932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            fail();
37032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        }
37132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    }
37232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
373153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
374153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
37532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    public void testHandlePinMmi() {
37632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        assertFalse(mPhoneUT.handlePinMmi("1234567890"));
37732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    }
37832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
379153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
380153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
38132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    public void testSendBurstDtmf() {
38232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        //Should do nothing for GSM
38332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT.sendBurstDtmf("1234567890", 0, 0, null);
384b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier, times(0)).sendBurstDtmf(nullable(String.class), anyInt(),
385b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                anyInt(), nullable(Message.class));
38632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
38732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        switchToCdma();
38832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        //invalid character
38932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT.sendBurstDtmf("12345a67890", 0, 0, null);
390b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier, times(0)).sendBurstDtmf(nullable(String.class), anyInt(),
391b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                anyInt(), nullable(Message.class));
39232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
39332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        //state IDLE
39432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mCT.mState = PhoneConstants.State.IDLE;
39532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT.sendBurstDtmf("1234567890", 0, 0, null);
396b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier, times(0)).sendBurstDtmf(nullable(String.class), anyInt(),
397b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                anyInt(), nullable(Message.class));
39832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
39932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        //state RINGING
40032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mCT.mState = PhoneConstants.State.RINGING;
40132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT.sendBurstDtmf("1234567890", 0, 0, null);
402b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier, times(0)).sendBurstDtmf(nullable(String.class), anyInt(),
403b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                anyInt(), nullable(Message.class));
40432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
40532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mCT.mState = PhoneConstants.State.OFFHOOK;
40632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhoneUT.sendBurstDtmf("1234567890", 0, 0, null);
40732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        verify(mSimulatedCommandsVerifier).sendBurstDtmf("1234567890", 0, 0, null);
4080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
40978867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
410153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
411153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
412153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    public void testVoiceMailNumberGsm() {
41378867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        String voiceMailNumber = "1234567890";
41478867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        // first test for GSM
41578867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        assertEquals(PhoneConstants.PHONE_TYPE_GSM, mPhoneUT.getPhoneType());
41678867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
417153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        // no resource or sharedPreference set -- should be null
418153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(null, mPhoneUT.getVoiceMailNumber());
419153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
420153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        // voicemail number from config
421f271e16613936c9f9600f20ae88cd9b865b88c6aJordan Liu        mContextFixture.getCarrierConfigBundle().
422f271e16613936c9f9600f20ae88cd9b865b88c6aJordan Liu                putString(CarrierConfigManager.KEY_DEFAULT_VM_NUMBER_STRING, voiceMailNumber);
423153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
424153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
425960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        // voicemail number from config for roaming network
426960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        String voiceMailNumberForRoaming = "1234567892";
427960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        mContextFixture.getCarrierConfigBundle()
428960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang                .putString(CarrierConfigManager.KEY_DEFAULT_VM_NUMBER_ROAMING_STRING,
429960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang                        voiceMailNumberForRoaming);
430960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        //Verify voicemail number for home
431960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        doReturn(false).when(mSST.mSS).getRoaming();
432960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
433960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        //Move to roaming condition, verify voicemail number for roaming
434960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        doReturn(true).when(mSST.mSS).getRoaming();
435960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        assertEquals(voiceMailNumberForRoaming, mPhoneUT.getVoiceMailNumber());
436960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        //Move to home condition, verify voicemail number for home
437960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        doReturn(false).when(mSST.mSS).getRoaming();
438960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
439960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang
440153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        // voicemail number that is explicitly set
441153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        voiceMailNumber = "1234567891";
44278867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        mPhoneUT.setVoiceMailNumber("alphaTag", voiceMailNumber, null);
443153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        verify(mSimRecords).setVoiceMailNumber(eq("alphaTag"), eq(voiceMailNumber),
444b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Message.class));
44578867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
446153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(voiceMailNumber).when(mSimRecords).getVoiceMailNumber();
447153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
448153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    }
44978867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
450153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Test
451153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @SmallTest
452153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    public void testVoiceMailNumberCdma() {
45378867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        switchToCdma();
454153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        String voiceMailNumber = "1234567890";
455153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
456153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        // no resource or sharedPreference set -- should be *86
457153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals("*86", mPhoneUT.getVoiceMailNumber());
458153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
459153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        // config_telephony_use_own_number_for_voicemail
460ad7647e78288747bd50ff5a8ad33dd39ddc2c9a4Cassie        mContextFixture.getCarrierConfigBundle()
461ad7647e78288747bd50ff5a8ad33dd39ddc2c9a4Cassie                .putBoolean(CarrierConfigManager
462ad7647e78288747bd50ff5a8ad33dd39ddc2c9a4Cassie                                .KEY_CONFIG_TELEPHONY_USE_OWN_NUMBER_FOR_VOICEMAIL_BOOL, true);
4630cf8dcd827da174a7d7f366aa8caa5dd29206ea1Amit Mahajan        doReturn(voiceMailNumber).when(mSST).getMdnNumber();
464153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
46578867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
466153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        // voicemail number from config
467153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        voiceMailNumber = "1234567891";
468f271e16613936c9f9600f20ae88cd9b865b88c6aJordan Liu        mContextFixture.getCarrierConfigBundle().
469f271e16613936c9f9600f20ae88cd9b865b88c6aJordan Liu                putString(CarrierConfigManager.KEY_DEFAULT_VM_NUMBER_STRING, voiceMailNumber);
470153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
471153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
472960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        // voicemail number from config for roaming network
473960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        String voiceMailNumberForRoaming = "1234567892";
474960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        mContextFixture.getCarrierConfigBundle()
475960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang                .putString(CarrierConfigManager.KEY_DEFAULT_VM_NUMBER_ROAMING_STRING,
476960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang                        voiceMailNumberForRoaming);
477960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        //Verify voicemail number for home
478960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        doReturn(false).when(mSST.mSS).getRoaming();
479960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
480960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        //Move to roaming condition, verify voicemail number for roaming
481960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        doReturn(true).when(mSST.mSS).getRoaming();
482960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        assertEquals(voiceMailNumberForRoaming, mPhoneUT.getVoiceMailNumber());
483960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        //Move to home condition, verify voicemail number for home
484960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        doReturn(false).when(mSST.mSS).getRoaming();
485960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
486960cd06cffdd03988e90dec325e07baf814ce7d4SongFerngWang
487153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        // voicemail number from sharedPreference
48878867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        mPhoneUT.setVoiceMailNumber("alphaTag", voiceMailNumber, null);
489153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
490153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        verify(mRuimRecords).setVoiceMailNumber(eq("alphaTag"), eq(voiceMailNumber),
491153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan                messageArgumentCaptor.capture());
49278867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
493153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        Message msg = messageArgumentCaptor.getValue();
494153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        AsyncResult.forMessage(msg).exception =
495153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan                new IccException("setVoiceMailNumber not implemented");
496153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        msg.sendToTarget();
497153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        waitForMs(50);
49878867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
499153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        assertEquals(voiceMailNumber, mPhoneUT.getVoiceMailNumber());
50078867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan    }
50197b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
502516010d13181808ca8205316a419b615e5a9fe5eShuoq    @FlakyTest
50397b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan    @Test
504802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan    @Ignore
50597b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan    public void testVoiceMailCount() {
50697b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // initial value
50797b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(0, mPhoneUT.getVoiceMessageCount());
50897b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
50997b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // old sharedPreference set (testing upgrade from M to N scenario)
51097b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        SharedPreferences sharedPreferences =
51197b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan                PreferenceManager.getDefaultSharedPreferences(mContext);
51297b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        SharedPreferences.Editor editor = sharedPreferences.edit();
51397b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        String imsi = "1234567890";
51497b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        editor.putString("vm_id_key", imsi);
51597b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        editor.putInt("vm_count_key", 5);
51697b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        editor.apply();
51797b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        doReturn(imsi).when(mSimRecords).getIMSI();
51897b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
51997b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // updateVoiceMail should read old shared pref and delete it and new sharedPref should be
52097b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // updated now
52197b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        doReturn(-1).when(mSimRecords).getVoiceMessageCount();
52297b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.updateVoiceMail();
52397b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(5, mPhoneUT.getVoiceMessageCount());
52497b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(null, sharedPreferences.getString("vm_id_key", null));
52597b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(5, sharedPreferences.getInt("vm_count_key" + mPhoneUT.getSubId(), 0));
52697b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
52797b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // sim records return count as 0, that overrides shared preference
52897b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        doReturn(0).when(mSimRecords).getVoiceMessageCount();
52997b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.updateVoiceMail();
53097b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(0, mPhoneUT.getVoiceMessageCount());
53197b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
53297b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // sim records return count as -1
53397b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        doReturn(-1).when(mSimRecords).getVoiceMessageCount();
53497b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.updateVoiceMail();
53597b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(-1, mPhoneUT.getVoiceMessageCount());
53697b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
53797b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // sim records return count as -1 and sharedPreference says 0
53897b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.setVoiceMessageCount(0);
53997b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.updateVoiceMail();
54097b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(-1, mPhoneUT.getVoiceMessageCount());
54197b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
54297b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // sim records return count as -1 and sharedPreference says 2
54397b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.setVoiceMessageCount(2);
54497b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.updateVoiceMail();
54597b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(2, mPhoneUT.getVoiceMessageCount());
54697b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan
54797b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        // sim records return count as 0 and sharedPreference says 2
54897b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        doReturn(0).when(mSimRecords).getVoiceMessageCount();
54997b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.setVoiceMessageCount(2);
55097b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        mPhoneUT.updateVoiceMail();
55197b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan        assertEquals(0, mPhoneUT.getVoiceMessageCount());
55297b3c4e45f156d8d5ae25a32357c9b31e018da32Amit Mahajan    }
5532d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan
5542d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    @Test
5552d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    @SmallTest
5562d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    public void testGetCallForwardingOption() {
5572d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        // invalid reason (-1)
5582d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        mPhoneUT.getCallForwardingOption(-1, null);
5592d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        verify(mSimulatedCommandsVerifier, times(0)).queryCallForwardStatus(
560b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                anyInt(), anyInt(), nullable(String.class), nullable(Message.class));
5612d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan
5622d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        // valid reason
5632d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        String imsi = "1234567890";
5642d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        doReturn(imsi).when(mSimRecords).getIMSI();
5652d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        mPhoneUT.getCallForwardingOption(CF_REASON_UNCONDITIONAL, null);
5662d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        verify(mSimulatedCommandsVerifier).queryCallForwardStatus(
5672e1b5b9d9fbbbe634229bd615293a6ef74d00d4aTyler Gunn                eq(CF_REASON_UNCONDITIONAL), eq(CommandsInterface.SERVICE_CLASS_VOICE),
5682e1b5b9d9fbbbe634229bd615293a6ef74d00d4aTyler Gunn                nullable(String.class), nullable(Message.class));
5692d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        waitForMs(50);
570b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimRecords).setVoiceCallForwardingFlag(anyInt(), anyBoolean(),
571b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(String.class));
5722d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan
5732d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        // should have updated shared preferences
5742d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        SharedPreferences sharedPreferences = PreferenceManager.
5752d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan                getDefaultSharedPreferences(mContext);
5762d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        assertEquals(IccRecords.CALL_FORWARDING_STATUS_DISABLED,
577d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan                sharedPreferences.getInt(Phone.CF_STATUS + mPhoneUT.getSubId(),
5782d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan                        IccRecords.CALL_FORWARDING_STATUS_ENABLED));
579d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
580d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // clean up
581d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        SharedPreferences.Editor editor = sharedPreferences.edit();
582d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.remove(Phone.CF_STATUS + mPhoneUT.getSubId());
583d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.apply();
5842d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    }
5852d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan
5862d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    @Test
5872d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    @SmallTest
5882d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    public void testSetCallForwardingOption() {
5892d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        String cfNumber = "1234567890";
5902d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan
5912d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        // invalid action
5922d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        mPhoneUT.setCallForwardingOption(-1, CF_REASON_UNCONDITIONAL,
5932d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan                cfNumber, 0, null);
5942d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        verify(mSimulatedCommandsVerifier, times(0)).setCallForward(anyInt(), anyInt(), anyInt(),
595b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(String.class), anyInt(), nullable(Message.class));
5962d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan
5972d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        // valid action
5982d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        mPhoneUT.setCallForwardingOption(CF_ACTION_ENABLE, CF_REASON_UNCONDITIONAL, cfNumber, 0,
5992d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan                null);
6002d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        verify(mSimulatedCommandsVerifier).setCallForward(eq(CF_ACTION_ENABLE),
601b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                eq(CF_REASON_UNCONDITIONAL), anyInt(), eq(cfNumber), eq(0),
602b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Message.class));
6032d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        waitForMs(50);
6042d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan        verify(mSimRecords).setVoiceCallForwardingFlag(anyInt(), anyBoolean(), eq(cfNumber));
6052d6df73e3bebb7d6aebd628730b9d20b23f1637aAmit Mahajan    }
60614bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
60714bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan    /**
60814bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan     * GsmCdmaPhone handles a lot of messages. This function verifies behavior for messages that are
60914bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan     * received when obj is created and that are received on phone type switch
61014bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan     */
611516010d13181808ca8205316a419b615e5a9fe5eShuoq    @FlakyTest
612cc940f429180765b6072a071becae8117e665954Amit Mahajan    @Ignore
61314bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan    @Test
61414bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan    @SmallTest
61514bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan    public void testHandleInitialMessages() {
61614bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // EVENT_RADIO_AVAILABLE
617b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier).getBasebandVersion(nullable(Message.class));
618b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier).getDeviceIdentity(nullable(Message.class));
619b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier).getRadioCapability(nullable(Message.class));
62014bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // once as part of constructor, and once on radio available
62114bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        verify(mSimulatedCommandsVerifier, times(2)).startLceService(anyInt(), anyBoolean(),
622b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Message.class));
62314bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
62414bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // EVENT_RADIO_ON
625b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier).getVoiceRadioTechnology(nullable(Message.class));
62614bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        verify(mSimulatedCommandsVerifier).setPreferredNetworkType(
627b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                eq(RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA), nullable(Message.class));
62814bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
62914bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // verify responses for above requests:
63014bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // baseband version
63114bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        verify(mTelephonyManager).setBasebandVersionForPhone(eq(mPhoneUT.getPhoneId()),
632b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(String.class));
63314bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // IMEI
63414bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        assertEquals(SimulatedCommands.FAKE_IMEI, mPhoneUT.getImei());
63514bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // IMEISV
63614bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        assertEquals(SimulatedCommands.FAKE_IMEISV, mPhoneUT.getDeviceSvn());
63714bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // radio capability
638b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier).getNetworkSelectionMode(nullable(Message.class));
63914bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
64014bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        switchToCdma(); // this leads to eventRadioAvailable handling on cdma
64114bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
64214bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // EVENT_RADIO_AVAILABLE
643b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier, times(2)).getBasebandVersion(nullable(Message.class));
644b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier, times(2)).getDeviceIdentity(nullable(Message.class));
64514bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        verify(mSimulatedCommandsVerifier, times(3)).startLceService(anyInt(), anyBoolean(),
646b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Message.class));
64714bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
64814bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // EVENT_RADIO_ON
649b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan        verify(mSimulatedCommandsVerifier, times(2)).getVoiceRadioTechnology(
650b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Message.class));
65114bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // once on radio on, and once on get baseband version
65214bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        verify(mSimulatedCommandsVerifier, times(3)).setPreferredNetworkType(
653b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                eq(RILConstants.NETWORK_MODE_LTE_CDMA_EVDO_GSM_WCDMA), nullable(Message.class));
65414bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan
65514bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // verify responses for above requests:
65614bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // baseband version
65714bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        verify(mTelephonyManager, times(2)).setBasebandVersionForPhone(eq(mPhoneUT.getPhoneId()),
658b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(String.class));
65914bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        // device identity
66014bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        assertEquals(SimulatedCommands.FAKE_IMEI, mPhoneUT.getImei());
66114bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        assertEquals(SimulatedCommands.FAKE_IMEISV, mPhoneUT.getDeviceSvn());
66214bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        assertEquals(SimulatedCommands.FAKE_ESN, mPhoneUT.getEsn());
66314bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan        assertEquals(SimulatedCommands.FAKE_MEID, mPhoneUT.getMeid());
66414bdfdca7a5412edf5fbdd6573e0f608233a5ae8Amit Mahajan    }
665de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
666de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    @Test
667de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    @SmallTest
668de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    public void testEmergencyCallbackMessages() {
669de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        verify(mSimulatedCommandsVerifier).setEmergencyCallbackMode(eq(mPhoneUT), anyInt(),
670b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Object.class));
671de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        verify(mSimulatedCommandsVerifier).registerForExitEmergencyCallbackMode(eq(mPhoneUT),
672b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                anyInt(), nullable(Object.class));
673de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
674de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify handling of emergency callback mode
675de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        mSimulatedCommands.notifyEmergencyCallbackMode();
676de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        waitForMs(50);
677de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
678de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify ACTION_EMERGENCY_CALLBACK_MODE_CHANGED
679de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
680de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        try {
68144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla            verify(mIActivityManager, atLeast(1)).broadcastIntent(eq((IApplicationThread) null),
682de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    intentArgumentCaptor.capture(),
68344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
68444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((IIntentReceiver) null),
685de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    eq(Activity.RESULT_OK),
68644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
68744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
68844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String[]) null),
689de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    anyInt(),
69044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
691de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    eq(false),
692de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    eq(true),
693de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    anyInt());
694de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        } catch(Exception e) {
695de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan            fail("Unexpected exception: " + e.getStackTrace());
696de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        }
697de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
698de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        Intent intent = intentArgumentCaptor.getValue();
699de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED, intent.getAction());
700de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(true, intent.getBooleanExtra(PhoneConstants.PHONE_IN_ECM_STATE, false));
70144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(true, mPhoneUT.isInEcm());
702de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
703de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify that wakeLock is acquired in ECM
704de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(true, mPhoneUT.getWakeLock().isHeld());
705de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
706de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        mPhoneUT.setOnEcbModeExitResponse(mTestHandler, EVENT_EMERGENCY_CALLBACK_MODE_EXIT, null);
707de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        mPhoneUT.registerForEmergencyCallToggle(mTestHandler, EVENT_EMERGENCY_CALL_TOGGLE, null);
708de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
709de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify handling of emergency callback mode exit
710de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        mSimulatedCommands.notifyExitEmergencyCallbackMode();
711de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        waitForMs(50);
712de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
713de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify ACTION_EMERGENCY_CALLBACK_MODE_CHANGED
714de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        try {
71544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla            verify(mIActivityManager, atLeast(2)).broadcastIntent(eq((IApplicationThread) null),
716de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    intentArgumentCaptor.capture(),
71744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
71844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((IIntentReceiver) null),
719de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    eq(Activity.RESULT_OK),
72044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
72144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
72244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String[]) null),
723de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    anyInt(),
72444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
725de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    eq(false),
726de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    eq(true),
727de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                    anyInt());
728de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        } catch(Exception e) {
729de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan            fail("Unexpected exception: " + e.getStackTrace());
730de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        }
731de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
732de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        intent = intentArgumentCaptor.getValue();
733de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED, intent.getAction());
734de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(false, intent.getBooleanExtra(PhoneConstants.PHONE_IN_ECM_STATE, true));
73544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(false, mPhoneUT.isInEcm());
73644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
73744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
73844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
73944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify EcmExitRespRegistrant and mEmergencyCallToggledRegistrants are notified
74044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        verify(mTestHandler, times(2)).sendMessageAtTime(messageArgumentCaptor.capture(),
74144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                anyLong());
74244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        List<Message> msgList = messageArgumentCaptor.getAllValues();
74344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(EVENT_EMERGENCY_CALLBACK_MODE_EXIT, msgList.get(0).what);
74444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(EVENT_EMERGENCY_CALL_TOGGLE, msgList.get(1).what);
74544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
74644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify setInternalDataEnabled
74744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        verify(mDcTracker).setInternalDataEnabled(true);
74844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
74944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify wakeLock released
75044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(false, mPhoneUT.getWakeLock().isHeld());
75144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla    }
75244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
75344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla    @Test
75444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla    @SmallTest
75544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla    public void testModemResetInEmergencyCallbackMessages() {
75644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        verify(mSimulatedCommandsVerifier).setEmergencyCallbackMode(eq(mPhoneUT), anyInt(),
75744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                nullable(Object.class));
75844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        verify(mSimulatedCommandsVerifier).registerForModemReset(eq(mPhoneUT),
75944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                anyInt(), nullable(Object.class));
76044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
76144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        switchToCdma();
76244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify handling of emergency callback mode
76344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        mSimulatedCommands.notifyEmergencyCallbackMode();
76444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        waitForMs(50);
76544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
76644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify ACTION_EMERGENCY_CALLBACK_MODE_CHANGED
76744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
76844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        try {
76944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla            verify(mIActivityManager, atLeast(1)).broadcastIntent(eq((IApplicationThread) null),
77044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    intentArgumentCaptor.capture(),
77144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
77244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((IIntentReceiver) null),
77344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq(Activity.RESULT_OK),
77444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
77544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
77644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String[]) null),
77744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    anyInt(),
77844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
77944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq(false),
78044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq(true),
78144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    anyInt());
78244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        } catch (Exception e) {
78344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla            fail("Unexpected exception: " + e.getStackTrace());
78444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        }
78544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
78644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        Intent intent = intentArgumentCaptor.getValue();
78744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED, intent.getAction());
78844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(true, intent.getBooleanExtra(PhoneConstants.PHONE_IN_ECM_STATE, false));
78944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(true, mPhoneUT.isInEcm());
79044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
79144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify that wakeLock is acquired in ECM
79244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(true, mPhoneUT.getWakeLock().isHeld());
79344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
79444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        mPhoneUT.setOnEcbModeExitResponse(mTestHandler, EVENT_EMERGENCY_CALLBACK_MODE_EXIT, null);
79544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        mPhoneUT.registerForEmergencyCallToggle(mTestHandler, EVENT_EMERGENCY_CALL_TOGGLE, null);
79644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
79744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify handling of emergency callback mode exit when modem resets
79844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        mSimulatedCommands.notifyModemReset();
79944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        waitForMs(50);
80044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
80144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        // verify ACTION_EMERGENCY_CALLBACK_MODE_CHANGED
80244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        try {
80344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla            verify(mIActivityManager, atLeast(2)).broadcastIntent(eq((IApplicationThread) null),
80444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    intentArgumentCaptor.capture(),
80544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
80644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((IIntentReceiver) null),
80744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq(Activity.RESULT_OK),
80844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String) null),
80944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
81044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((String[]) null),
81144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    anyInt(),
81244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq((Bundle) null),
81344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq(false),
81444fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    eq(true),
81544fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla                    anyInt());
81644fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        } catch (Exception e) {
81744fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla            fail("Unexpected exception: " + e.getStackTrace());
81844fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        }
81944fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla
82044fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        intent = intentArgumentCaptor.getValue();
82144fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(TelephonyIntents.ACTION_EMERGENCY_CALLBACK_MODE_CHANGED, intent.getAction());
82244fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(false, intent.getBooleanExtra(PhoneConstants.PHONE_IN_ECM_STATE, true));
82344fd6f60bc5aca75938a2c3e725f88b6e897983aNaveen Kalla        assertEquals(false, mPhoneUT.isInEcm());
824de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
825de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
826de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
827de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify EcmExitRespRegistrant and mEmergencyCallToggledRegistrants are notified
828de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        verify(mTestHandler, times(2)).sendMessageAtTime(messageArgumentCaptor.capture(),
829de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan                anyLong());
830de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        List<Message> msgList = messageArgumentCaptor.getAllValues();
831de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(EVENT_EMERGENCY_CALLBACK_MODE_EXIT, msgList.get(0).what);
832de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(EVENT_EMERGENCY_CALL_TOGGLE, msgList.get(1).what);
833de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
834de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify setInternalDataEnabled
835de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        verify(mDcTracker).setInternalDataEnabled(true);
836de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan
837de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        // verify wakeLock released
838de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan        assertEquals(false, mPhoneUT.getWakeLock().isHeld());
839de9c22e95d4e2797076db0c6b798e54f0638b7f0Amit Mahajan    }
840d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
841d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan    @Test
842d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan    @SmallTest
843d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan    public void testCallForwardingIndicator() {
844d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        doReturn(IccRecords.CALL_FORWARDING_STATUS_UNKNOWN).when(mSimRecords).
845d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan                getVoiceCallForwardingFlag();
846d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
847d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // invalid subId
848d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        doReturn(SubscriptionManager.INVALID_SUBSCRIPTION_ID).when(mSubscriptionController).
849d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan                getSubIdUsingPhoneId(anyInt());
850d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(false, mPhoneUT.getCallForwardingIndicator());
851d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
852d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // valid subId, sharedPreference not present
853d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        int subId1 = 0;
854d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        int subId2 = 1;
855d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        doReturn(subId1).when(mSubscriptionController).getSubIdUsingPhoneId(anyInt());
856d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(false, mPhoneUT.getCallForwardingIndicator());
857d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
858d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // old sharedPreference present
859d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        String imsi = "1234";
860d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        doReturn(imsi).when(mSimRecords).getIMSI();
861d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(mContext);
862d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        SharedPreferences.Editor editor = sp.edit();
863d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.putString(Phone.CF_ID, imsi);
864d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.putInt(Phone.CF_STATUS, IccRecords.CALL_FORWARDING_STATUS_ENABLED);
865d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.apply();
866d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(true, mPhoneUT.getCallForwardingIndicator());
867d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
868d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // old sharedPreference should be removed now
869d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(null, sp.getString(Phone.CF_ID, null));
870d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(IccRecords.CALL_FORWARDING_STATUS_UNKNOWN,
871d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan                sp.getInt(Phone.CF_ID, IccRecords.CALL_FORWARDING_STATUS_UNKNOWN));
872d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
873d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // now verify value from new sharedPreference
874d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(true, mPhoneUT.getCallForwardingIndicator());
875d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
876d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // check for another subId
877d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        doReturn(subId2).when(mSubscriptionController).getSubIdUsingPhoneId(anyInt());
878d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(false, mPhoneUT.getCallForwardingIndicator());
879d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
880d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // set value for the new subId in sharedPreference
881d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.putInt(Phone.CF_STATUS + subId2, IccRecords.CALL_FORWARDING_STATUS_ENABLED);
882d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.apply();
883d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(true, mPhoneUT.getCallForwardingIndicator());
884d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
885d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // switching back to previous subId, stored value should still be available
886d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        doReturn(subId1).when(mSubscriptionController).getSubIdUsingPhoneId(anyInt());
887d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        assertEquals(true, mPhoneUT.getCallForwardingIndicator());
888d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan
889d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        // cleanup
890d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.remove(Phone.CF_STATUS + subId1);
891d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.remove(Phone.CF_STATUS + subId2);
892d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan        editor.apply();
893d520d895c1af9974f61235bdf35cf5221abbe98aAmit Mahajan    }
8942dd874066ed871c8adf50f58e4b025d525db78ebJack Yu
8952dd874066ed871c8adf50f58e4b025d525db78ebJack Yu    @Test
8962dd874066ed871c8adf50f58e4b025d525db78ebJack Yu    @SmallTest
8972dd874066ed871c8adf50f58e4b025d525db78ebJack Yu    public void testEriLoading() {
8982dd874066ed871c8adf50f58e4b025d525db78ebJack Yu        mPhoneUT.mEriManager = mEriManager;
8992dd874066ed871c8adf50f58e4b025d525db78ebJack Yu        mPhoneUT.sendMessage(mPhoneUT.obtainMessage(GsmCdmaPhone.EVENT_CARRIER_CONFIG_CHANGED,
9002dd874066ed871c8adf50f58e4b025d525db78ebJack Yu                null));
9012dd874066ed871c8adf50f58e4b025d525db78ebJack Yu        waitForMs(100);
9022dd874066ed871c8adf50f58e4b025d525db78ebJack Yu        verify(mEriManager, times(1)).loadEriFile();
9032dd874066ed871c8adf50f58e4b025d525db78ebJack Yu    }
904649c81576a5d145fffab05896f02b433612c2847Malcolm Chen
905649c81576a5d145fffab05896f02b433612c2847Malcolm Chen    @Test
906649c81576a5d145fffab05896f02b433612c2847Malcolm Chen    @SmallTest
90796170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu    public void testGetIccCardUnknownAndAbsent() {
90896170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        // If UiccSlot.isStateUnknown is true, we should return a dummy IccCard with the state
90996170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        // set to UNKNOWN
91096170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        doReturn(null).when(mUiccController).getUiccProfileForPhone(anyInt());
91196170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        UiccSlot mockSlot = mock(UiccSlot.class);
91296170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        doReturn(mockSlot).when(mUiccController).getUiccSlotForPhone(anyInt());
91396170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        doReturn(true).when(mockSlot).isStateUnknown();
91496170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu
91596170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        IccCard iccCard = mPhoneUT.getIccCard();
91696170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        assertEquals(IccCardConstants.State.UNKNOWN, iccCard.getState());
91796170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu
91896170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        // if isStateUnknown is false, we should return a dummy IccCard with the state set to
91996170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        // ABSENT
92096170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        doReturn(false).when(mockSlot).isStateUnknown();
92196170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        iccCard = mPhoneUT.getIccCard();
92296170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu        assertEquals(IccCardConstants.State.ABSENT, iccCard.getState());
92396170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu    }
92496170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu
92596170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu    @Test
92696170b8afa17db4832f5f0e7fab0f64dc2428a64Jordan Liu    @SmallTest
927649c81576a5d145fffab05896f02b433612c2847Malcolm Chen    public void testGetEmptyIccCard() {
928649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        doReturn(null).when(mUiccController).getUiccProfileForPhone(anyInt());
929649c81576a5d145fffab05896f02b433612c2847Malcolm Chen
930649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        IccCard iccCard = mPhoneUT.getIccCard();
931649c81576a5d145fffab05896f02b433612c2847Malcolm Chen
932649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        // The iccCard should be a dummy object, not null.
933649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertTrue(!(iccCard instanceof UiccProfile));
934649c81576a5d145fffab05896f02b433612c2847Malcolm Chen
935649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertTrue(iccCard != null);
936649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(IccCardConstants.State.UNKNOWN, iccCard.getState());
937649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(null, iccCard.getIccRecords());
938649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(false, iccCard.getIccLockEnabled());
939649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(false, iccCard.getIccFdnEnabled());
940649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(false, iccCard.isApplicationOnIcc(
941649c81576a5d145fffab05896f02b433612c2847Malcolm Chen                IccCardApplicationStatus.AppType.APPTYPE_SIM));
942649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(false, iccCard.hasIccCard());
943649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(false, iccCard.getIccPin2Blocked());
944649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(false, iccCard.getIccPuk2Blocked());
945649c81576a5d145fffab05896f02b433612c2847Malcolm Chen
946649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        Message onComplete = mTestHandler.obtainMessage(EVENT_SET_ICC_LOCK_ENABLED);
947649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        iccCard.setIccLockEnabled(true, "password", onComplete);
948649c81576a5d145fffab05896f02b433612c2847Malcolm Chen
949649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        waitForMs(100);
950649c81576a5d145fffab05896f02b433612c2847Malcolm Chen
951649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
952649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        // Verify that message is sent back with exception.
953649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        verify(mTestHandler, times(1)).sendMessageAtTime(messageArgumentCaptor.capture(),
954649c81576a5d145fffab05896f02b433612c2847Malcolm Chen                anyLong());
955649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        Message message = messageArgumentCaptor.getAllValues().get(0);
956649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        AsyncResult ret = (AsyncResult) message.obj;
957649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertEquals(EVENT_SET_ICC_LOCK_ENABLED, message.what);
958649c81576a5d145fffab05896f02b433612c2847Malcolm Chen        assertTrue(ret.exception != null);
959649c81576a5d145fffab05896f02b433612c2847Malcolm Chen    }
960e5e4b94927937ac5cbc83ac577d4a572fa412784Robert Greenwalt}
961