ContextFixture.java revision f21d2289021a94fc74023e2b5987d236df354fe1
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
190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.google.common.collect.ArrayListMultimap;
200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.google.common.collect.Multimap;
210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.MockitoAnnotations;
230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.invocation.InvocationOnMock;
240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.stubbing.Answer;
250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.app.AlarmManager;
270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.AppOpsManager;
280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.NotificationManager;
29f21d2289021a94fc74023e2b5987d236df354fe1fionaxuimport android.app.usage.UsageStatsManager;
300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver;
310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName;
32ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider;
330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver;
34ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues;
350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context;
360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent;
370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter;
380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection;
390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences;
400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager;
410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo;
420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo;
4332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration;
440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources;
45ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor;
4627b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager;
47ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri;
48b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager;
490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle;
500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler;
510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface;
520e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle;
530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle;
540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager;
55153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager;
560ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings;
57ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.provider.Telephony;
580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager;
590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager;
600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager;
61ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider;
62ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver;
630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext;
640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log;
650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList;
670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays;
6805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection;
690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap;
700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List;
7132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale;
720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map;
730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyBoolean;
750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyString;
760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.any;
770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.anyInt;
780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.doAnswer;
79b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport static org.mockito.Mockito.doReturn;
800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.eq;
810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.mock;
820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.spy;
830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.when;
840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/**
860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an
870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component.
880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and
900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public
910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class.
920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> {
940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private static final String TAG = "ContextFixture";
950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
96ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    public class FakeContentProvider extends MockContentProvider {
97ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
98ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public int delete(Uri uri, String selection, String[] selectionArgs) {
99ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return 0;
100ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Uri insert(Uri uri, ContentValues values) {
104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return null;
105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
108ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
109ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                            String sortOrder) {
110ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return null;
111ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
1120ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu
1130ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        @Override
1140ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        public Bundle call(String method, String request, Bundle args) {
1150ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu            return null;
1160ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        }
117ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    }
118ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
1196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>();
1206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setSystemService(String name, Object service) {
1226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        synchronized(mSystemServices) {
1236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mSystemServices.put(name, service);
1246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
1256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
1266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public class FakeContext extends MockContext {
1280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public PackageManager getPackageManager() {
1300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mPackageManager;
1310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public boolean bindService(
1350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Intent serviceIntent,
1360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection,
1370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int flags) {
1380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (mServiceByServiceConnection.containsKey(connection)) {
1390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection already bound: " + connection);
1400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByComponentName.get(serviceIntent.getComponent());
1420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
1430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection not found: "
1440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        + serviceIntent.getComponent());
1450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            mServiceByServiceConnection.put(connection, service);
1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder());
1480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return true;
1490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void unbindService(
1530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection) {
1540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByServiceConnection.remove(connection);
1550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
1560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection not found: " + connection);
1570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceDisconnected(mComponentNameByService.get(service));
1590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Object getSystemService(String name) {
163f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            synchronized (mSystemServices) {
164f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                Object service = mSystemServices.get(name);
165f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                if (service != null) return service;
166f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            }
1670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            switch (name) {
1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SERVICE:
1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mTelephonyManager;
1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.APP_OPS_SERVICE:
1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mAppOpsManager;
1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.NOTIFICATION_SERVICE:
1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mNotificationManager;
1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.USER_SERVICE:
1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mUserManager;
1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.CARRIER_CONFIG_SERVICE:
1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mCarrierConfigManager;
1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.POWER_SERVICE:
1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    // PowerManager is a final class so cannot be mocked, return real service
1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return TestApplication.getAppContext().getSystemService(name);
1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mSubscriptionManager;
183b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                case Context.WIFI_SERVICE:
184b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                    return mWifiManager;
18559d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                case Context.ALARM_SERVICE:
18659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                    return mAlarmManager;
18727b650c406018355a88a41528db7859e232728a0Jack Yu                case Context.CONNECTIVITY_SERVICE:
18827b650c406018355a88a41528db7859e232728a0Jack Yu                    return mConnectivityManager;
189f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                case Context.USAGE_STATS_SERVICE:
190f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                    return mUsageStatManager;
1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                default:
192f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                    return null;
1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public int getUserId() {
1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return 0;
1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Resources getResources() {
2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mResources;
2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getOpPackageName() {
2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public ContentResolver getContentResolver() {
213ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return mContentResolver;
2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2175755ef622fec6f3c592467c685503826862a7536fionaxu        public void unregisterReceiver(BroadcastReceiver receiver) {
2185755ef622fec6f3c592467c685503826862a7536fionaxu        }
2195755ef622fec6f3c592467c685503826862a7536fionaxu
2205755ef622fec6f3c592467c685503826862a7536fionaxu        @Override
2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
22297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            Intent result = null;
22397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
22497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                for (int i = 0 ; i < filter.countActions(); i++) {
22597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    mBroadcastReceiversByAction.put(filter.getAction(i), receiver);
22697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    if (result == null) {
22797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        result = mStickyBroadcastByAction.get(filter.getAction(i));
22897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    }
22997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
2300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
23197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
23297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            return result;
2330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
2370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String broadcastPermission, Handler scheduler) {
23897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            return registerReceiver(receiver, filter);
23997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        }
24097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
24197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        @Override
24297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
24397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                IntentFilter filter, String broadcastPermission, Handler scheduler) {
24497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            return registerReceiver(receiver, filter);
2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent) {
249ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendBroadcast called for " + intent.getAction());
25097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
25197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                for (BroadcastReceiver broadcastReceiver :
25297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        mBroadcastReceiversByAction.get(intent.getAction())) {
25397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    broadcastReceiver.onReceive(mContext, intent);
25497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
255ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent, String receiverPermission) {
260ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            logd("sendBroadcast called for " + intent.getAction());
261ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            sendBroadcast(intent);
2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
2660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
2670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int initialCode, String initialData, Bundle initialExtras) {
2683c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
2693c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
2703c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
27105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
27205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
27305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
2743c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
2750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
2790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
2800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
2813c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
2823c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
2833c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
28405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
28505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
28605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
2873c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
291ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
292ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String receiverPermission, int appOp, Bundle options,
293ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
294ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String initialData, Bundle initialExtras) {
295ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
296ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            sendBroadcast(intent);
297ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            if (resultReceiver != null) {
29805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
29905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
30005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
301ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
302ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
303ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
304ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
30597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcast(Intent intent) {
3066bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcast called for " + intent.getAction());
30797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
30897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                sendBroadcast(intent);
30997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                mStickyBroadcastByAction.put(intent.getAction(), intent);
31097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            }
31197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        }
31297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
31397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        @Override
31497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) {
3156bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcastAsUser called for " + intent.getAction());
31697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            sendStickyBroadcast(intent);
317b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
318b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
319b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        @Override
3200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
3210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throws PackageManager.NameNotFoundException {
3220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return this;
3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void enforceCallingOrSelfPermission(String permission, String message) {
3270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            // Don't bother enforcing anything in mock.
3280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public SharedPreferences getSharedPreferences(String name, int mode) {
3320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mSharedPreferences;
3330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getPackageName() {
3370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
3380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3407a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt        public boolean testMethod() {
3417a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt            return true;
342ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
343ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
34432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        public int testMethod1() {
34532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan            return 0;
3460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3470e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
3480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, ComponentName> mComponentNamesByAction =
3500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
3510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, IInterface> mServiceByComponentName =
3520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, IInterface>();
3530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName =
3540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, ServiceInfo>();
3550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<IInterface, ComponentName> mComponentNameByService =
3560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<IInterface, ComponentName>();
3570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ServiceConnection, IInterface> mServiceByServiceConnection =
3580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ServiceConnection, IInterface>();
3590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction =
3600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
36197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    private final HashMap<String, Intent> mStickyBroadcastByAction =
36297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            new HashMap<String, Intent>();
36305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers =
36405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            ArrayListMultimap.create();
3650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // The application context is the most important object this class provides to the system
3670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // under test.
3680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Context mContext = spy(new FakeContext());
3690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // We then create a spy on the application context allowing standard Mockito-style
3710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // when(...) logic to be used to add specific little responses where needed.
3720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Resources mResources = mock(Resources.class);
3740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final PackageManager mPackageManager = mock(PackageManager.class);
3750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
3760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
3770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final NotificationManager mNotificationManager = mock(NotificationManager.class);
3780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final UserManager mUserManager = mock(UserManager.class);
3790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
3800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
38159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    private final AlarmManager mAlarmManager = mock(AlarmManager.class);
38227b650c406018355a88a41528db7859e232728a0Jack Yu    private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class);
383f21d2289021a94fc74023e2b5987d236df354fe1fionaxu    private final UsageStatsManager mUsageStatManager = null;
384b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private final WifiManager mWifiManager = mock(WifiManager.class);
385153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
386ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final ContentProvider mContentProvider = spy(new FakeContentProvider());
387153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
388153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    private final Configuration mConfiguration = new Configuration();
389153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    private final SharedPreferences mSharedPreferences = PreferenceManager.
390153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan            getDefaultSharedPreferences(TestApplication.getAppContext());
391ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final MockContentResolver mContentResolver = new MockContentResolver();
3920e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    private final PersistableBundle mBundle = new PersistableBundle();
3930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public ContextFixture() {
3950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        MockitoAnnotations.initMocks(this);
3960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
3980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
3990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
4000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
4010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
4020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
4030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
4040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
4050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
4080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
4090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
4100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
4110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
4120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
4130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt());
4140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4150e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
4160e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
417cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan        mConfiguration.locale = Locale.US;
41832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        doReturn(mConfiguration).when(mResources).getConfiguration();
41932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
4200ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        mContentResolver.addProvider(Settings.System.CONTENT_URI.getAuthority(), mContentProvider);
4210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Override
4240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public Context getTestDouble() {
4250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return mContext;
4260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putResource(int id, final String value) {
4290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getText(eq(id))).thenReturn(value);
4300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id))).thenReturn(value);
4310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
4320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
4330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public String answer(InvocationOnMock invocation) {
4340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Object[] args = invocation.getArguments();
4350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return String.format(value, Arrays.copyOfRange(args, 1, args.length));
4360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
4370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        });
4380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putBooleanResource(int id, boolean value) {
4410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getBoolean(eq(id))).thenReturn(value);
4420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
444b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    public void putStringArrayResource(int id, String[] values) {
445b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        doReturn(values).when(mResources).getStringArray(eq(id));
446b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    }
447b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
448655bae990bdd7e4584491def4d30692e6173779cfionaxu    public void putIntArrayResource(int id, int[] values) {
449655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(values).when(mResources).getIntArray(eq(id));
450655bae990bdd7e4584491def4d30692e6173779cfionaxu    }
451655bae990bdd7e4584491def4d30692e6173779cfionaxu
4520e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    public PersistableBundle getCarrierConfigBundle() {
4530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        return mBundle;
4540e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
4550e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
4560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private void addService(String action, ComponentName name, IInterface service) {
4570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNamesByAction.put(action, name);
4580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mServiceByComponentName.put(name, service);
4590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNameByService.put(service, name);
4600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
4630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        List<ResolveInfo> result = new ArrayList<ResolveInfo>();
4640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ResolveInfo resolveInfo = new ResolveInfo();
4660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
4670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            result.add(resolveInfo);
4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return result;
4700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
47205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    public void sendBroadcastToOrderedBroadcastReceivers() {
47305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        synchronized (mOrderedBroadcastReceivers) {
47405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive()
47505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // call within the loop may lead to sendOrderedBroadcast() which can add to
47605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // mOrderedBroadcastReceivers
47705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            Collection<Map.Entry<Intent, BroadcastReceiver>> map =
47805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.entries();
47905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            for (Map.Entry<Intent, BroadcastReceiver> entry : map) {
48005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                entry.getValue().onReceive(mContext, entry.getKey());
48105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue());
48205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            }
48305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        }
48405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    }
48505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
486ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private static void logd(String s) {
487ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        Log.d(TAG, s);
4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
4890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
490