ContextFixture.java revision f5c24214ded1e0b49f91844bc987bd6f5c17e4e2
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; 290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver; 300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName; 31ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider; 320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver; 33ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues; 340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context; 350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent; 360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter; 370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection; 380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences; 390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager; 400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo; 410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo; 4232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration; 430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources; 44ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor; 4527b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager; 46ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri; 47b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager; 480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle; 490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler; 500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface; 510e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle; 520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle; 530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager; 54153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager; 550ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings; 56ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.provider.Telephony; 570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager; 580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager; 590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager; 60ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider; 61ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver; 620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext; 630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log; 640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList; 660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays; 6705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection; 680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap; 690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List; 7032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale; 710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map; 720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyBoolean; 740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Matchers.anyString; 750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.any; 760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.anyInt; 770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.doAnswer; 78b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport static org.mockito.Mockito.doReturn; 790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.eq; 800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.mock; 810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.spy; 820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.when; 830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/** 850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an 860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component. 870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and 890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public 900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class. 910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> { 930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private static final String TAG = "ContextFixture"; 940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 95ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public class FakeContentProvider extends MockContentProvider { 96ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 97ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public int delete(Uri uri, String selection, String[] selectionArgs) { 98ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return 0; 99ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 100ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Uri insert(Uri uri, ContentValues values) { 103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return null; 104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 108ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String sortOrder) { 109ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return null; 110ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 1110ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu 1120ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu @Override 1130ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu public Bundle call(String method, String request, Bundle args) { 1140ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu return null; 1150ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu } 116ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 117ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 1186bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>(); 1196bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1206bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt public void setSystemService(String name, Object service) { 1216bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt synchronized(mSystemServices) { 1226bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt mSystemServices.put(name, service); 1236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1246bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public class FakeContext extends MockContext { 1270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public PackageManager getPackageManager() { 1290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mPackageManager; 1300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean bindService( 1340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Intent serviceIntent, 1350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection, 1360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int flags) { 1370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (mServiceByServiceConnection.containsKey(connection)) { 1380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection already bound: " + connection); 1390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByComponentName.get(serviceIntent.getComponent()); 1410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 1420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " 1430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan + serviceIntent.getComponent()); 1440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByServiceConnection.put(connection, service); 1460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder()); 1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return true; 1480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void unbindService( 1520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection) { 1530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByServiceConnection.remove(connection); 1540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 1550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " + connection); 1560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceDisconnected(mComponentNameByService.get(service)); 1580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object getSystemService(String name) { 162f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt synchronized (mSystemServices) { 163f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt Object service = mSystemServices.get(name); 164f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt if (service != null) return service; 165f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt } 1660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (name) { 1670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SERVICE: 1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mTelephonyManager; 1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.APP_OPS_SERVICE: 1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mAppOpsManager; 1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.NOTIFICATION_SERVICE: 1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mNotificationManager; 1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.USER_SERVICE: 1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mUserManager; 1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.CARRIER_CONFIG_SERVICE: 1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mCarrierConfigManager; 1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.POWER_SERVICE: 1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // PowerManager is a final class so cannot be mocked, return real service 1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return TestApplication.getAppContext().getSystemService(name); 1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SUBSCRIPTION_SERVICE: 1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSubscriptionManager; 182b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu case Context.WIFI_SERVICE: 183b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu return mWifiManager; 18459d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu case Context.ALARM_SERVICE: 18559d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu return mAlarmManager; 18627b650c406018355a88a41528db7859e232728a0Jack Yu case Context.CONNECTIVITY_SERVICE: 18727b650c406018355a88a41528db7859e232728a0Jack Yu return mConnectivityManager; 1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan default: 189f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt return null; 1900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public int getUserId() { 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return 0; 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Resources getResources() { 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mResources; 2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getOpPackageName() { 2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContentResolver getContentResolver() { 210ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return mContentResolver; 2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2145755ef622fec6f3c592467c685503826862a7536fionaxu public void unregisterReceiver(BroadcastReceiver receiver) { 2155755ef622fec6f3c592467c685503826862a7536fionaxu } 2165755ef622fec6f3c592467c685503826862a7536fionaxu 2175755ef622fec6f3c592467c685503826862a7536fionaxu @Override 2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 21997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan Intent result = null; 22097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 22197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan for (int i = 0 ; i < filter.countActions(); i++) { 22297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.put(filter.getAction(i), receiver); 22397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan if (result == null) { 22497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan result = mStickyBroadcastByAction.get(filter.getAction(i)); 22597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 22697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 2270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 22897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 22997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return result; 2300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String broadcastPermission, Handler scheduler) { 23597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return registerReceiver(receiver, filter); 23697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 23797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 23897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan @Override 23997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 24097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan IntentFilter filter, String broadcastPermission, Handler scheduler) { 24197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return registerReceiver(receiver, filter); 2420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent) { 246ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendBroadcast called for " + intent.getAction()); 24797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 24897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan for (BroadcastReceiver broadcastReceiver : 24997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.get(intent.getAction())) { 25097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan broadcastReceiver.onReceive(mContext, intent); 25197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 252ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent, String receiverPermission) { 257ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan logd("sendBroadcast called for " + intent.getAction()); 258ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan sendBroadcast(intent); 2590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 2630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 2640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int initialCode, String initialData, Bundle initialExtras) { 2653c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 2663c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 2673c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 26805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 26905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 27005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 2713c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 2720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 2770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 2783c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 2793c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 2803c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 28105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 28205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 28305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 2843c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 2850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 288ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 289ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String receiverPermission, int appOp, Bundle options, 290ec334adf4017ca172f44612d01456e671f922344Amit Mahajan BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 291ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String initialData, Bundle initialExtras) { 292ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 293ec334adf4017ca172f44612d01456e671f922344Amit Mahajan sendBroadcast(intent); 294ec334adf4017ca172f44612d01456e671f922344Amit Mahajan if (resultReceiver != null) { 29505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 29605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 29705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 298ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 299ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 300ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 301ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 30297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcast(Intent intent) { 3036bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcast called for " + intent.getAction()); 30497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 30597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendBroadcast(intent); 30697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mStickyBroadcastByAction.put(intent.getAction(), intent); 30797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 30897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 30997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 31097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan @Override 31197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) { 3126bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcastAsUser called for " + intent.getAction()); 31397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendStickyBroadcast(intent); 314b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 315b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 316b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu @Override 3170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 3180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throws PackageManager.NameNotFoundException { 3190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return this; 3200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void enforceCallingOrSelfPermission(String permission, String message) { 3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // Don't bother enforcing anything in mock. 3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public SharedPreferences getSharedPreferences(String name, int mode) { 3290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSharedPreferences; 3300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getPackageName() { 3340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 3350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3377a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt public boolean testMethod() { 3387a477263108748903cf5a4151a4e8b739f12264aRobert Greenwalt return true; 339ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 340ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 34132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan public int testMethod1() { 34232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan return 0; 3430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3440e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 3450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, ComponentName> mComponentNamesByAction = 3470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 3480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, IInterface> mServiceByComponentName = 3490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, IInterface>(); 3500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = 3510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, ServiceInfo>(); 3520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<IInterface, ComponentName> mComponentNameByService = 3530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<IInterface, ComponentName>(); 3540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = 3550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ServiceConnection, IInterface>(); 3560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction = 3570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 35897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan private final HashMap<String, Intent> mStickyBroadcastByAction = 35997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan new HashMap<String, Intent>(); 36005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers = 36105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan ArrayListMultimap.create(); 3620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // The application context is the most important object this class provides to the system 3640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // under test. 3650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Context mContext = spy(new FakeContext()); 3660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // We then create a spy on the application context allowing standard Mockito-style 3680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // when(...) logic to be used to add specific little responses where needed. 3690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Resources mResources = mock(Resources.class); 3710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final PackageManager mPackageManager = mock(PackageManager.class); 3720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class); 3730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class); 3740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final NotificationManager mNotificationManager = mock(NotificationManager.class); 3750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final UserManager mUserManager = mock(UserManager.class); 3760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class); 3770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class); 37859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu private final AlarmManager mAlarmManager = mock(AlarmManager.class); 37927b650c406018355a88a41528db7859e232728a0Jack Yu private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class); 380b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu private final WifiManager mWifiManager = mock(WifiManager.class); 381153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 382ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final ContentProvider mContentProvider = spy(new FakeContentProvider()); 383153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 384153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan private final Configuration mConfiguration = new Configuration(); 385153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan private final SharedPreferences mSharedPreferences = PreferenceManager. 386153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan getDefaultSharedPreferences(TestApplication.getAppContext()); 387ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final MockContentResolver mContentResolver = new MockContentResolver(); 3880e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private final PersistableBundle mBundle = new PersistableBundle(); 3890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContextFixture() { 3910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan MockitoAnnotations.initMocks(this); 3920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 3940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 3960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 3970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 3980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 3990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt()); 4010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 4030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 4050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 4060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 4080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt()); 4100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4110e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt()); 4120e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 413cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan mConfiguration.locale = Locale.US; 41432b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan doReturn(mConfiguration).when(mResources).getConfiguration(); 41532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan 4160ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu mContentResolver.addProvider(Settings.System.CONTENT_URI.getAuthority(), mContentProvider); 4170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context getTestDouble() { 4210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContext; 4220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putResource(int id, final String value) { 4250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getText(eq(id))).thenReturn(value); 4260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id))).thenReturn(value); 4270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() { 4280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String answer(InvocationOnMock invocation) { 4300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 4310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return String.format(value, Arrays.copyOfRange(args, 1, args.length)); 4320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }); 4340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putBooleanResource(int id, boolean value) { 4370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getBoolean(eq(id))).thenReturn(value); 4380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 440b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu public void putStringArrayResource(int id, String[] values) { 441b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu doReturn(values).when(mResources).getStringArray(eq(id)); 442b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 443b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 444655bae990bdd7e4584491def4d30692e6173779cfionaxu public void putIntArrayResource(int id, int[] values) { 445655bae990bdd7e4584491def4d30692e6173779cfionaxu doReturn(values).when(mResources).getIntArray(eq(id)); 446655bae990bdd7e4584491def4d30692e6173779cfionaxu } 447655bae990bdd7e4584491def4d30692e6173779cfionaxu 4480e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu public PersistableBundle getCarrierConfigBundle() { 4490e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return mBundle; 4500e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 4510e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private void addService(String action, ComponentName name, IInterface service) { 4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNamesByAction.put(action, name); 4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByComponentName.put(name, service); 4550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNameByService.put(service, name); 4560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) { 4590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan List<ResolveInfo> result = new ArrayList<ResolveInfo>(); 4600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) { 4610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ResolveInfo resolveInfo = new ResolveInfo(); 4620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName); 4630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan result.add(resolveInfo); 4640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return result; 4660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 46805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan public void sendBroadcastToOrderedBroadcastReceivers() { 46905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 47005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive() 47105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // call within the loop may lead to sendOrderedBroadcast() which can add to 47205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // mOrderedBroadcastReceivers 47305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan Collection<Map.Entry<Intent, BroadcastReceiver>> map = 47405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.entries(); 47505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan for (Map.Entry<Intent, BroadcastReceiver> entry : map) { 47605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan entry.getValue().onReceive(mContext, entry.getKey()); 47705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue()); 47805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 47905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 48005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 48105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 482ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private static void logd(String s) { 483ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Log.d(TAG, s); 4840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 486