132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan/*
22f2dba9413a3f14da0bcf45031986eb78f007dd8fionaxu * Copyright (C) 2016 The Android Open Source Project
332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan *
432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License");
532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * you may not use this file except in compliance with the License.
632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * You may obtain a copy of the License at
732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan *
832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan *      http://www.apache.org/licenses/LICENSE-2.0
932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan *
1032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * Unless required by applicable law or agreed to in writing, software
1132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS,
1232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * See the License for the specific language governing permissions and
1432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan * limitations under the License.
1532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan */
1632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
1732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanpackage com.android.internal.telephony;
1832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
195eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastryimport static org.junit.Assert.fail;
20e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Matchers.anyBoolean;
21e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Matchers.anyLong;
22e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Matchers.anyString;
23e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Mockito.any;
24e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Mockito.anyInt;
25e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Mockito.doAnswer;
26e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Mockito.doReturn;
27e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport static org.mockito.Mockito.eq;
28e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry
29655bae990bdd7e4584491def4d30692e6173779cfionaxuimport android.app.ActivityManagerNative;
30655bae990bdd7e4584491def4d30692e6173779cfionaxuimport android.app.IActivityManager;
3132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.Context;
321bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yuimport android.content.IIntentSender;
331bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yuimport android.content.Intent;
34153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.content.SharedPreferences;
356ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxuimport android.content.pm.PackageInfo;
366ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxuimport android.content.pm.PackageManager;
37871a2ec0bc8e8198aeb1913e7bf6cb22a7ff3604Amit Mahajanimport android.database.Cursor;
38e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport android.os.Bundle;
39b9d551db1795b30598e2ce98cfae7106788c12d6fionaxuimport android.os.Handler;
401bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yuimport android.os.IBinder;
4132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.os.IDeviceIdleController;
4232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.os.RegistrantList;
43ec6e2f9f13bac23cdfa0de0a56826b21050b6487fionaxuimport android.os.ServiceManager;
44e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport android.provider.BlockedNumberContract;
4532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.telephony.ServiceState;
461fe1dbf473755c4e812a1218f331759eccacb447Jack Yuimport android.telephony.TelephonyManager;
474c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxuimport android.telephony.SubscriptionManager;
48e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport android.test.mock.MockContentProvider;
49e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport android.test.mock.MockContentResolver;
5032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.util.Log;
51655bae990bdd7e4584491def4d30692e6173779cfionaxuimport android.util.Singleton;
52f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajanimport android.util.SparseArray;
5332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
54f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport com.android.ims.ImsCall;
55f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport com.android.ims.ImsCallProfile;
5675ba09a17a669f4906268088a769836aa87d8241fionaxuimport com.android.ims.ImsEcbm;
5732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport com.android.ims.ImsManager;
5832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
59dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport com.android.internal.telephony.cdma.EriManager;
6032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport com.android.internal.telephony.dataconnection.DcTracker;
61e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajanimport com.android.internal.telephony.imsphone.ImsExternalCallTracker;
62f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport com.android.internal.telephony.imsphone.ImsPhone;
63f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport com.android.internal.telephony.imsphone.ImsPhoneCallTracker;
64ec6e2f9f13bac23cdfa0de0a56826b21050b6487fionaxuimport com.android.internal.telephony.mocks.TelephonyRegistryMock;
6532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport com.android.internal.telephony.test.SimulatedCommands;
6632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport com.android.internal.telephony.test.SimulatedCommandsVerifier;
6732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport com.android.internal.telephony.uicc.IccCardProxy;
68655bae990bdd7e4584491def4d30692e6173779cfionaxuimport com.android.internal.telephony.uicc.IccRecords;
69e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport com.android.internal.telephony.uicc.IsimUiccRecords;
70153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport com.android.internal.telephony.uicc.RuimRecords;
71153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport com.android.internal.telephony.uicc.SIMRecords;
7278867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajanimport com.android.internal.telephony.uicc.UiccCardApplication;
7332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport com.android.internal.telephony.uicc.UiccController;
7432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
7532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport org.mockito.Mock;
7632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport org.mockito.MockitoAnnotations;
77e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport org.mockito.invocation.InvocationOnMock;
78e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport org.mockito.stubbing.Answer;
7932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
8032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.lang.reflect.Field;
8132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.HashMap;
82e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport java.util.HashSet;
839c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yuimport java.util.Iterator;
849c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yuimport java.util.LinkedList;
85e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastryimport java.util.Set;
8632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
8732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanpublic abstract class TelephonyTest {
8832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected static String TAG;
8932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
9032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
91f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan    protected GsmCdmaPhone mPhone;
9232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
93f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    protected ImsPhone mImsPhone;
94f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Mock
9532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected ServiceStateTracker mSST;
9632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
9732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected GsmCdmaCallTracker mCT;
9832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
99f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    protected ImsPhoneCallTracker mImsCT;
100f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Mock
10132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected UiccController mUiccController;
10232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
10332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected IccCardProxy mIccCardProxy;
10432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
10532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected CallManager mCallManager;
10632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
10732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected PhoneNotifier mNotifier;
10832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
10932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected TelephonyComponentFactory mTelephonyComponentFactory;
11032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
11132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected CdmaSubscriptionSourceManager mCdmaSSM;
11232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
11332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected RegistrantList mRegistrantList;
11432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
11532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected IccPhoneBookInterfaceManager mIccPhoneBookIntManager;
11632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
11775ba09a17a669f4906268088a769836aa87d8241fionaxu    protected ImsManager mImsManager;
11832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
11932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected DcTracker mDcTracker;
12032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
1214a9f066fbcbd20e2ea3ca3cbc914f81b230e3825fionaxu    protected GsmCdmaCall mGsmCdmaCall;
1224a9f066fbcbd20e2ea3ca3cbc914f81b230e3825fionaxu    @Mock
123f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    protected ImsCall mImsCall;
124f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Mock
125f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    protected ImsCallProfile mImsCallProfile;
126f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Mock
12775ba09a17a669f4906268088a769836aa87d8241fionaxu    protected ImsEcbm mImsEcbm;
12875ba09a17a669f4906268088a769836aa87d8241fionaxu    @Mock
12932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected SubscriptionController mSubscriptionController;
13032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
13132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected ServiceState mServiceState;
13232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
13332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected SimulatedCommandsVerifier mSimulatedCommandsVerifier;
13432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    @Mock
13532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected IDeviceIdleController mIDeviceIdleController;
13660a81bdb47cf64972c8edf5b0c51e8059765e5a0Amit Mahajan    @Mock
13760a81bdb47cf64972c8edf5b0c51e8059765e5a0Amit Mahajan    protected InboundSmsHandler mInboundSmsHandler;
13860a81bdb47cf64972c8edf5b0c51e8059765e5a0Amit Mahajan    @Mock
13960a81bdb47cf64972c8edf5b0c51e8059765e5a0Amit Mahajan    protected WspTypeDecoder mWspTypeDecoder;
140f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan    @Mock
141153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    protected UiccCardApplication mUiccCardApplication3gpp;
14278867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan    @Mock
143153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    protected UiccCardApplication mUiccCardApplication3gpp2;
144153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Mock
145153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    protected UiccCardApplication mUiccCardApplicationIms;
146153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Mock
147153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    protected SIMRecords mSimRecords;
148153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Mock
149153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    protected RuimRecords mRuimRecords;
150153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    @Mock
151153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    protected IsimUiccRecords mIsimUiccRecords;
152655bae990bdd7e4584491def4d30692e6173779cfionaxu    @Mock
153655bae990bdd7e4584491def4d30692e6173779cfionaxu    protected ProxyController mProxyController;
154655bae990bdd7e4584491def4d30692e6173779cfionaxu    @Mock
155217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan    protected Singleton<IActivityManager> mIActivityManagerSingleton;
156217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan    @Mock
157217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan    protected IActivityManager mIActivityManager;
15827f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan    @Mock
15927f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan    protected InboundSmsTracker mInboundSmsTracker;
1601bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu    @Mock
1611bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu    protected IIntentSender mIIntentSender;
1621bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu    @Mock
1631bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu    protected IBinder mIBinder;
1646ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    @Mock
1656ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    protected SmsStorageMonitor mSmsStorageMonitor;
1666ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    @Mock
1676ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    protected SmsUsageMonitor mSmsUsageMonitor;
1686ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    @Mock
1696ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    protected PackageInfo mPackageInfo;
170dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    @Mock
171dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    protected EriManager mEriManager;
1727a1c1b02c8603c2bf2f3b401facb389528180eedPavel Zhamaitsiak    @Mock
1737a1c1b02c8603c2bf2f3b401facb389528180eedPavel Zhamaitsiak    protected IBinder mConnMetLoggerBinder;
1744c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    @Mock
1754c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    protected CarrierSignalAgent mCarrierSignalAgent;
176e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan    @Mock
177e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan    protected ImsExternalCallTracker mImsExternalCallTracker;
17832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
179af59a35e945d60fc9ffb305c494a695b35b8a942fionaxu    protected TelephonyManager mTelephonyManager;
1804c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    protected SubscriptionManager mSubscriptionManager;
1814c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu    protected PackageManager mPackageManager;
18232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected SimulatedCommands mSimulatedCommands;
18332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected ContextFixture mContextFixture;
184f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan    protected Context mContext;
185e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry    protected FakeBlockedNumberContentProvider mFakeBlockedNumberContentProvider;
186f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan    private Object mLock = new Object();
187f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan    private boolean mReady;
188ec6e2f9f13bac23cdfa0de0a56826b21050b6487fionaxu    protected HashMap<String, IBinder> mServiceManagerMockedServices = new HashMap<>();
189ec6e2f9f13bac23cdfa0de0a56826b21050b6487fionaxu
190f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan
19175ba09a17a669f4906268088a769836aa87d8241fionaxu    protected HashMap<Integer, ImsManager> mImsManagerInstances = new HashMap<>();
1929c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    private HashMap<InstanceKey, Object> mOldInstances = new HashMap<InstanceKey, Object>();
1939c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu
1949c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    private LinkedList<InstanceKey> mInstanceKeys = new LinkedList<InstanceKey>();
1959c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu
1969c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    private class InstanceKey {
1979c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        public final Class mClass;
1989c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        public final String mInstName;
1999c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        public final Object mObj;
2009c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        InstanceKey(final Class c, final String instName, final Object obj) {
2019c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mClass = c;
2029c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mInstName = instName;
2039c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mObj = obj;
2049c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        }
2059c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu
2069c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        @Override
2079c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        public int hashCode() {
2089c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            return (mClass.getName().hashCode() * 31 + mInstName.hashCode()) * 31;
2099c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        }
2109c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu
2119c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        @Override
2129c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        public boolean equals(Object obj) {
2139c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            if (obj == null || obj.getClass() != getClass()) {
2149c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                return false;
2159c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            }
2169c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu
2179c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            InstanceKey other = (InstanceKey) obj;
218655bae990bdd7e4584491def4d30692e6173779cfionaxu            return (other.mClass == mClass && other.mInstName.equals(mInstName)
219655bae990bdd7e4584491def4d30692e6173779cfionaxu                    && other.mObj == mObj);
2209c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        }
2219c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    }
22232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
22332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected void waitUntilReady() {
224655bae990bdd7e4584491def4d30692e6173779cfionaxu        while (true) {
22532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            synchronized (mLock) {
22632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan                if (mReady) {
22732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan                    break;
22832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan                }
22932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            }
23032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        }
23132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    }
23232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
23332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected void setReady(boolean ready) {
23432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        synchronized (mLock) {
23532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            mReady = ready;
23632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        }
23732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    }
23832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
2399c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    protected synchronized void replaceInstance(final Class c, final String instanceName,
2409c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                                                final Object obj, final Object newValue)
2419c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            throws Exception {
2429c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        Field field = c.getDeclaredField(instanceName);
24321e1b42d578d90611f76c37d58841543821502fdJack Yu        field.setAccessible(true);
24432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
2459c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        InstanceKey key = new InstanceKey(c, instanceName, obj);
2469c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        if (!mOldInstances.containsKey(key)) {
2479c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mOldInstances.put(key, field.get(obj));
2489c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mInstanceKeys.add(key);
2499c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        }
2509c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        field.set(obj, newValue);
2519c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    }
25232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
2539c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    protected synchronized void restoreInstance(final Class c, final String instanceName,
2549c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                                                final Object obj) throws Exception {
2559c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        InstanceKey key = new InstanceKey(c, instanceName, obj);
2569c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        if (mOldInstances.containsKey(key)) {
2579c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            Field field = c.getDeclaredField(instanceName);
2589c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            field.setAccessible(true);
2599c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            field.set(obj, mOldInstances.get(key));
2609c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mOldInstances.remove(key);
2619c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            mInstanceKeys.remove(key);
2629c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        }
2639c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    }
26432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
2659c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    protected synchronized void restoreInstances() throws Exception {
2669c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        Iterator<InstanceKey> it = mInstanceKeys.descendingIterator();
26732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
2689c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        while (it.hasNext()) {
2699c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            InstanceKey key = it.next();
2709c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            Field field = key.mClass.getDeclaredField(key.mInstName);
2719c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            field.setAccessible(true);
2729c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu            field.set(key.mObj, mOldInstances.get(key));
2739c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        }
274f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan
2759c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        mInstanceKeys.clear();
2769c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        mOldInstances.clear();
2779c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    }
27832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
2799c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu    protected void setUp(String tag) throws Exception {
2809c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        TAG = tag;
2819c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        MockitoAnnotations.initMocks(this);
28221e1b42d578d90611f76c37d58841543821502fdJack Yu
2839c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        //Use reflection to mock singletons
2849c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(CallManager.class, "INSTANCE", null, mCallManager);
2859c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(TelephonyComponentFactory.class, "sInstance", null,
2869c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                mTelephonyComponentFactory);
2879c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(UiccController.class, "mInstance", null, mUiccController);
2889c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(CdmaSubscriptionSourceManager.class, "sInstance", null, mCdmaSSM);
2899c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(ImsManager.class, "sImsManagerInstances", null, mImsManagerInstances);
2909c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(SubscriptionController.class, "sInstance", null, mSubscriptionController);
291655bae990bdd7e4584491def4d30692e6173779cfionaxu        replaceInstance(ProxyController.class, "sProxyController", null, mProxyController);
292217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        replaceInstance(ActivityManagerNative.class, "gDefault", null, mIActivityManagerSingleton);
2939c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(CdmaSubscriptionSourceManager.class,
2949c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                "mCdmaSubscriptionSourceChangedRegistrants", mCdmaSSM, mRegistrantList);
2959c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(SimulatedCommandsVerifier.class, "sInstance", null,
2969c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                mSimulatedCommandsVerifier);
297325ea5a0aa71b9ff6134be71a84a7e1a288c70cbJack Yu        replaceInstance(Singleton.class, "mInstance", mIActivityManagerSingleton,
298325ea5a0aa71b9ff6134be71a84a7e1a288c70cbJack Yu                mIActivityManager);
299ec6e2f9f13bac23cdfa0de0a56826b21050b6487fionaxu        replaceInstance(ServiceManager.class, "sCache", null, mServiceManagerMockedServices);
30032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
30132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mSimulatedCommands = new SimulatedCommands();
30232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mContextFixture = new ContextFixture();
303f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        mContext = mContextFixture.getTestDouble();
304e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry        mFakeBlockedNumberContentProvider = new FakeBlockedNumberContentProvider();
305e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry        ((MockContentResolver)mContext.getContentResolver()).addProvider(
306e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry                BlockedNumberContract.AUTHORITY, mFakeBlockedNumberContentProvider);
30732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        mPhone.mCi = mSimulatedCommands;
3089c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        mCT.mCi = mSimulatedCommands;
309af59a35e945d60fc9ffb305c494a695b35b8a942fionaxu        mTelephonyManager = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
3104c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mSubscriptionManager = (SubscriptionManager) mContext.getSystemService(
3114c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu                Context.TELEPHONY_SUBSCRIPTION_SERVICE);
3124c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        mPackageManager = mContext.getPackageManager();
31332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
3149c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(TelephonyManager.class, "sInstance", null,
3159c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu                mContext.getSystemService(Context.TELEPHONY_SERVICE));
3161fe1dbf473755c4e812a1218f331759eccacb447Jack Yu
317217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        //mTelephonyComponentFactory
318655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mSST).when(mTelephonyComponentFactory)
319655bae990bdd7e4584491def4d30692e6173779cfionaxu                .makeServiceStateTracker(any(GsmCdmaPhone.class), any(CommandsInterface.class));
320655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mIccCardProxy).when(mTelephonyComponentFactory)
321655bae990bdd7e4584491def4d30692e6173779cfionaxu                .makeIccCardProxy(any(Context.class), any(CommandsInterface.class), anyInt());
322655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mCT).when(mTelephonyComponentFactory)
323655bae990bdd7e4584491def4d30692e6173779cfionaxu                .makeGsmCdmaCallTracker(any(GsmCdmaPhone.class));
324655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mIccPhoneBookIntManager).when(mTelephonyComponentFactory)
325655bae990bdd7e4584491def4d30692e6173779cfionaxu                .makeIccPhoneBookInterfaceManager(any(Phone.class));
326655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mDcTracker).when(mTelephonyComponentFactory)
327655bae990bdd7e4584491def4d30692e6173779cfionaxu                .makeDcTracker(any(Phone.class));
328655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mWspTypeDecoder).when(mTelephonyComponentFactory)
329655bae990bdd7e4584491def4d30692e6173779cfionaxu                .makeWspTypeDecoder(any(byte[].class));
33027f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan        doReturn(mInboundSmsTracker).when(mTelephonyComponentFactory)
33127f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan                .makeInboundSmsTracker(any(byte[].class), anyLong(), anyInt(), anyBoolean(),
3326e4abd849e12860a7459f7ec74496ca02b9d7ee0Amit Mahajan                        anyBoolean(), anyString(), anyString());
33327f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan        doReturn(mInboundSmsTracker).when(mTelephonyComponentFactory)
33427f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan                .makeInboundSmsTracker(any(byte[].class), anyLong(), anyInt(), anyBoolean(),
3356e4abd849e12860a7459f7ec74496ca02b9d7ee0Amit Mahajan                        anyString(), anyInt(), anyInt(), anyInt(), anyBoolean(), anyString());
336871a2ec0bc8e8198aeb1913e7bf6cb22a7ff3604Amit Mahajan        doReturn(mInboundSmsTracker).when(mTelephonyComponentFactory)
337871a2ec0bc8e8198aeb1913e7bf6cb22a7ff3604Amit Mahajan                .makeInboundSmsTracker(any(Cursor.class), anyBoolean());
338ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan        doReturn(mImsCT).when(mTelephonyComponentFactory)
339ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan                .makeImsPhoneCallTracker(any(ImsPhone.class));
340655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mCdmaSSM).when(mTelephonyComponentFactory)
341655bae990bdd7e4584491def4d30692e6173779cfionaxu                .getCdmaSubscriptionSourceManagerInstance(any(Context.class),
342b9d551db1795b30598e2ce98cfae7106788c12d6fionaxu                        any(CommandsInterface.class), any(Handler.class),
34378867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan                        anyInt(), any(Object.class));
34427f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan        doReturn(mIDeviceIdleController).when(mTelephonyComponentFactory)
34527f471647b2da3ff50620a766c048ebef8d45ae1Amit Mahajan                .getIDeviceIdleController();
346e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        doReturn(mImsExternalCallTracker).when(mTelephonyComponentFactory).
347e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan                makeImsExternalCallTracker(any(ImsPhone.class));
34878867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
349217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        //mPhone
35078867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        doReturn(mContext).when(mPhone).getContext();
351f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(mContext).when(mImsPhone).getContext();
35278867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan        doReturn(true).when(mPhone).getUnitTestMode();
353217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        doReturn(mIccCardProxy).when(mPhone).getIccCard();
354217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        doReturn(mServiceState).when(mPhone).getServiceState();
355e415b7b5ae3afec0b7a24d85b930e8cca47499a6fionaxu        doReturn(mServiceState).when(mImsPhone).getServiceState();
356a8f5a859f8e4a15902d729af5d2edc9a9433ba41Jack Yu        doReturn(mPhone).when(mImsPhone).getDefaultPhone();
357217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        doReturn(true).when(mPhone).isPhoneTypeGsm();
358217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        doReturn(PhoneConstants.PHONE_TYPE_GSM).when(mPhone).getPhoneType();
35927b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(mCT).when(mPhone).getCallTracker();
36027b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(mSST).when(mPhone).getServiceStateTracker();
3614c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(mCarrierSignalAgent).when(mPhone).getCarrierSignalAgent();
362dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        mPhone.mEriManager = mEriManager;
36332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
364217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        //mUiccController
365153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(mUiccCardApplication3gpp).when(mUiccController).getUiccCardApplication(anyInt(),
366153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan                eq(UiccController.APP_FAM_3GPP));
367153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(mUiccCardApplication3gpp2).when(mUiccController).getUiccCardApplication(anyInt(),
368153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan                eq(UiccController.APP_FAM_3GPP2));
369153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(mUiccCardApplicationIms).when(mUiccController).getUiccCardApplication(anyInt(),
370153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan                eq(UiccController.APP_FAM_IMS));
37178867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
37227b650c406018355a88a41528db7859e232728a0Jack Yu        doAnswer(new Answer<IccRecords>() {
37327b650c406018355a88a41528db7859e232728a0Jack Yu            public IccRecords answer(InvocationOnMock invocation) {
37427b650c406018355a88a41528db7859e232728a0Jack Yu                switch ((Integer) invocation.getArguments()[1]) {
37527b650c406018355a88a41528db7859e232728a0Jack Yu                    case UiccController.APP_FAM_3GPP:
37627b650c406018355a88a41528db7859e232728a0Jack Yu                        return mSimRecords;
37727b650c406018355a88a41528db7859e232728a0Jack Yu                    case UiccController.APP_FAM_3GPP2:
37827b650c406018355a88a41528db7859e232728a0Jack Yu                        return mRuimRecords;
37927b650c406018355a88a41528db7859e232728a0Jack Yu                    case UiccController.APP_FAM_IMS:
38027b650c406018355a88a41528db7859e232728a0Jack Yu                        return mIsimUiccRecords;
38127b650c406018355a88a41528db7859e232728a0Jack Yu                    default:
38227b650c406018355a88a41528db7859e232728a0Jack Yu                        logd("Unrecognized family " + invocation.getArguments()[1]);
38327b650c406018355a88a41528db7859e232728a0Jack Yu                        return null;
38427b650c406018355a88a41528db7859e232728a0Jack Yu                }
38527b650c406018355a88a41528db7859e232728a0Jack Yu            }
38627b650c406018355a88a41528db7859e232728a0Jack Yu        }).when(mUiccController).getIccRecords(anyInt(), anyInt());
38727b650c406018355a88a41528db7859e232728a0Jack Yu
388217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        //UiccCardApplication
389153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(mSimRecords).when(mUiccCardApplication3gpp).getIccRecords();
390153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(mRuimRecords).when(mUiccCardApplication3gpp2).getIccRecords();
391153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(mIsimUiccRecords).when(mUiccCardApplicationIms).getIccRecords();
392217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan
393217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        //mIccCardProxy
394655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(mSimRecords).when(mIccCardProxy).getIccRecords();
395655bae990bdd7e4584491def4d30692e6173779cfionaxu        doAnswer(new Answer<IccRecords>() {
396655bae990bdd7e4584491def4d30692e6173779cfionaxu            public IccRecords answer(InvocationOnMock invocation) {
397655bae990bdd7e4584491def4d30692e6173779cfionaxu                return (mPhone.isPhoneTypeGsm()) ? mSimRecords : mRuimRecords;
398655bae990bdd7e4584491def4d30692e6173779cfionaxu            }
399655bae990bdd7e4584491def4d30692e6173779cfionaxu        }).when(mIccCardProxy).getIccRecords();
40078867803826b15ff95c8ee8c7c6f65dfb7ad258fAmit Mahajan
4016ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu        //SMS
4026ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu        doReturn(true).when(mSmsStorageMonitor).isStorageAvailable();
4036ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu        doReturn(true).when(mSmsUsageMonitor).check(anyString(), anyInt());
4046ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu        doReturn(true).when(mTelephonyManager).getSmsReceiveCapableForPhone(anyInt(), anyBoolean());
4056ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu        doReturn(true).when(mTelephonyManager).getSmsSendCapableForPhone(
4066ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu                anyInt(), anyBoolean());
4076ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu
40827b650c406018355a88a41528db7859e232728a0Jack Yu        //Misc
40927b650c406018355a88a41528db7859e232728a0Jack Yu        doReturn(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS).when(mServiceState).
41027b650c406018355a88a41528db7859e232728a0Jack Yu                getRilDataRadioTechnology();
411217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        doReturn(mPhone).when(mCT).getPhone();
41275ba09a17a669f4906268088a769836aa87d8241fionaxu        mImsManagerInstances.put(mPhone.getPhoneId(), null);
41375ba09a17a669f4906268088a769836aa87d8241fionaxu        doReturn(mImsEcbm).when(mImsManager).getEcbmInterface(anyInt());
414217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan        doReturn(mPhone).when(mInboundSmsHandler).getPhone();
415f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(mImsCallProfile).when(mImsCall).getCallProfile();
4161bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu        doReturn(mIBinder).when(mIIntentSender).asBinder();
4171bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu        doReturn(mIIntentSender).when(mIActivityManager).getIntentSender(anyInt(),
4181bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu                anyString(), any(IBinder.class), anyString(), anyInt(), any(Intent[].class),
4191bcd7a866ddf8f6f63370c70972f057a4a1ba057Jack Yu                any(String[].class), anyInt(), any(Bundle.class), anyInt());
420ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajan        mSST.mSS = mServiceState;
4217a1c1b02c8603c2bf2f3b401facb389528180eedPavel Zhamaitsiak        mServiceManagerMockedServices.put("connectivity_metrics_logger", mConnMetLoggerBinder);
422217d4d9562a9476cf579dfc409b1278a02b18b87Amit Mahajan
42332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        setReady(false);
42432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    }
42532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
426f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan    protected void tearDown() throws Exception {
427153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
428153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        SharedPreferences sharedPreferences = mContext.getSharedPreferences((String) null, 0);
429153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        sharedPreferences.edit().clear().commit();
4309c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu
4319c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        restoreInstances();
432f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan    }
433f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan
43432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    protected static void logd(String s) {
43532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        Log.d(TAG, s);
43632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan    }
437e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry
438e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry    public static class FakeBlockedNumberContentProvider extends MockContentProvider {
439e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry        public Set<String> mBlockedNumbers = new HashSet<>();
4405eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry        public int mNumEmergencyContactNotifications = 0;
441e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry
442e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry        @Override
443e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry        public Bundle call(String method, String arg, Bundle extras) {
4445eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry            switch (method) {
4455eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                case BlockedNumberContract.SystemContract.METHOD_SHOULD_SYSTEM_BLOCK_NUMBER:
4465eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                    Bundle bundle = new Bundle();
4475eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                    bundle.putBoolean(BlockedNumberContract.RES_NUMBER_IS_BLOCKED,
4485eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                            mBlockedNumbers.contains(arg));
4495eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                    return bundle;
4505eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                case BlockedNumberContract.SystemContract.METHOD_NOTIFY_EMERGENCY_CONTACT:
4515eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                    mNumEmergencyContactNotifications++;
4525eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                    return new Bundle();
4535eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                default:
4545eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry                    fail("Method not expected: " + method);
4555eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry            }
4565eccb26b2bcf3a51326596e1b0bb49b073d2f9fcAbhijith Shastry            return null;
457e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry        }
458e2435e2d37c991bd6209a90cd884b5102939872eAbhijith Shastry    }
4596ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu
4606ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    protected void setupMockPackagePermissionChecks() throws Exception {
4614c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(new String[]{TAG}).when(mPackageManager).getPackagesForUid(anyInt());
4624c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(eq(TAG), anyInt());
4636ba18ef5f3733709f16ef03b3d2b2de076b63c3efionaxu    }
46418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu}
465