ContextFixture.java revision 0e9e0387678b3d3cd9694f342a8f40eeb7dbbdca
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 19311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.any; 20311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.anyInt; 21311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.doAnswer; 22311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.doReturn; 23311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.eq; 24311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.mock; 25311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.spy; 26311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.when; 270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.app.AlarmManager; 290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.AppOpsManager; 300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.NotificationManager; 31f21d2289021a94fc74023e2b5987d236df354fe1fionaxuimport android.app.usage.UsageStatsManager; 320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver; 330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName; 34ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider; 350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver; 36ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues; 370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context; 380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent; 390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter; 400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection; 410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences; 420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager; 430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo; 440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo; 4532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration; 460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources; 47ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor; 48fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajanimport android.database.MatrixCursor; 4927b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager; 50ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri; 51b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager; 5250b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yuimport android.os.BatteryManager; 530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle; 540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler; 550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface; 560e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle; 570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle; 580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager; 59153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager; 600ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings; 6198ddd3bea3eb6a1416887aedac8f59c16c119080Jordan Liuimport android.provider.Telephony.ServiceStateTable; 620e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yuimport android.telecom.TelecomManager; 630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager; 640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager; 650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager; 66dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidsonimport android.telephony.euicc.EuiccManager; 67ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider; 68ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver; 690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext; 700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log; 710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 72311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.ArrayListMultimap; 73311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.Multimap; 74311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry 75311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.MockitoAnnotations; 76311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.invocation.InvocationOnMock; 77311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.stubbing.Answer; 78311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry 790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList; 800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays; 8105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection; 820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap; 8318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuimport java.util.HashSet; 840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List; 8532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale; 860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map; 870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/** 890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an 900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component. 910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and 930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public 940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class. 950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> { 970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private static final String TAG = "ContextFixture"; 9818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION"; 990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 100ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public class FakeContentProvider extends MockContentProvider { 101fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private String[] mColumns = {"name", "value"}; 102fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>(); 103fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private int mNumKeyValuePairs = 0; 104fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public int delete(Uri uri, String selection, String[] selectionArgs) { 107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return 0; 108ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 109ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 110ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 111ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Uri insert(Uri uri, ContentValues values) { 112fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Uri newUri = null; 113fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (values != null) { 114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mKeyValuePairs.put(values.getAsString("name"), values.getAsString("value")); 115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mNumKeyValuePairs++; 116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan newUri = Uri.withAppendedPath(uri, "" + mNumKeyValuePairs); 117fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 118fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("insert called, new mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri + 119fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan " newUri: " + newUri); 120fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return newUri; 121ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 122ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 123ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 124ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 125ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String sortOrder) { 126fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan //assuming query will always be of the form 'name = ?' 127fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("query called, mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri); 128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (mKeyValuePairs.containsKey(selectionArgs[0])) { 129fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan MatrixCursor cursor = new MatrixCursor(projection); 130fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan cursor.addRow(new String[]{mKeyValuePairs.get(selectionArgs[0])}); 131fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return cursor; 132fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 133ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return null; 134ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 1350ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu 1360ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu @Override 1370ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu public Bundle call(String method, String request, Bundle args) { 138fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method + 139fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan " request: " + request); 140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan switch(method) { 141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_GLOBAL: 142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_SECURE: 143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_SYSTEM: 144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (mKeyValuePairs.containsKey(request)) { 145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Bundle b = new Bundle(1); 146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan b.putCharSequence("value", mKeyValuePairs.get(request)); 147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("returning value pair: " + mKeyValuePairs.get(request) + " for " + 148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan request); 149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return b; 150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan break; 152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_GLOBAL: 153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_SECURE: 154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_SYSTEM: 155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("adding key-value pair: " + request + "-" + (String)args.get("value")); 156fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mKeyValuePairs.put(request, (String)args.get("value")); 157fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mNumKeyValuePairs++; 158fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan break; 159fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 1600ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu return null; 1610ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu } 162ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 163ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 1646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>(); 1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt public void setSystemService(String name, Object service) { 16718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mSystemServices) { 1686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt mSystemServices.put(name, service); 1696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public class FakeContext extends MockContext { 1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public PackageManager getPackageManager() { 1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mPackageManager; 1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean bindService( 1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Intent serviceIntent, 1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection, 1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int flags) { 1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (mServiceByServiceConnection.containsKey(connection)) { 1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection already bound: " + connection); 1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByComponentName.get(serviceIntent.getComponent()); 1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 188311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry service = mServiceByPackageName.get(serviceIntent.getPackage()); 189311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry } 190311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry if (service == null) { 191311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry throw new RuntimeException( 192311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry String.format("ServiceConnection not found for component: %s, package: %s", 193311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry serviceIntent.getComponent(), serviceIntent.getPackage())); 1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByServiceConnection.put(connection, service); 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder()); 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return true; 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void unbindService( 2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection) { 2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByServiceConnection.remove(connection); 2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " + connection); 2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceDisconnected(mComponentNameByService.get(service)); 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object getSystemService(String name) { 212f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt synchronized (mSystemServices) { 213f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt Object service = mSystemServices.get(name); 214f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt if (service != null) return service; 215f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt } 2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (name) { 2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SERVICE: 2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mTelephonyManager; 2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.APP_OPS_SERVICE: 2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mAppOpsManager; 2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.NOTIFICATION_SERVICE: 2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mNotificationManager; 2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.USER_SERVICE: 2240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mUserManager; 2250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.CARRIER_CONFIG_SERVICE: 2260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mCarrierConfigManager; 2270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SUBSCRIPTION_SERVICE: 2280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSubscriptionManager; 229b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu case Context.WIFI_SERVICE: 230b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu return mWifiManager; 23159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu case Context.ALARM_SERVICE: 23259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu return mAlarmManager; 23327b650c406018355a88a41528db7859e232728a0Jack Yu case Context.CONNECTIVITY_SERVICE: 23427b650c406018355a88a41528db7859e232728a0Jack Yu return mConnectivityManager; 235f21d2289021a94fc74023e2b5987d236df354fe1fionaxu case Context.USAGE_STATS_SERVICE: 236f21d2289021a94fc74023e2b5987d236df354fe1fionaxu return mUsageStatManager; 23750b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu case Context.BATTERY_SERVICE: 23850b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu return mBatteryManager; 239dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson case Context.EUICC_SERVICE: 240dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson return mEuiccManager; 2410e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu case Context.TELECOM_SERVICE: 2420e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu return mTelecomManager; 243e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu case Context.DISPLAY_SERVICE: 244e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu case Context.POWER_SERVICE: 245e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu // PowerManager and DisplayManager are final classes so cannot be mocked, 246e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu // return real services. 247e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu return TestApplication.getAppContext().getSystemService(name); 2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan default: 249f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt return null; 2500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public int getUserId() { 2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return 0; 2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Resources getResources() { 2600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mResources; 2610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getOpPackageName() { 2650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 2660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContentResolver getContentResolver() { 270ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return mContentResolver; 2710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2745755ef622fec6f3c592467c685503826862a7536fionaxu public void unregisterReceiver(BroadcastReceiver receiver) { 2755755ef622fec6f3c592467c685503826862a7536fionaxu } 2765755ef622fec6f3c592467c685503826862a7536fionaxu 2775755ef622fec6f3c592467c685503826862a7536fionaxu @Override 2780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 2799b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan return registerReceiver(receiver, filter, null, null); 2809b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan } 2819b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan 2829b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan @Override 2839b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 2849b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan String broadcastPermission, Handler scheduler) { 2859b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan return registerReceiverAsUser(receiver, null, filter, broadcastPermission, scheduler); 2869b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan } 2879b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan 2889b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan @Override 2899b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 2909b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan IntentFilter filter, String broadcastPermission, Handler scheduler) { 29197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan Intent result = null; 29297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 29318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu for (int i = 0 ; i < filter.countActions() ; i++) { 29497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.put(filter.getAction(i), receiver); 29597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan if (result == null) { 29697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan result = mStickyBroadcastByAction.get(filter.getAction(i)); 29797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 29897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 2990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 30097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 30197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return result; 3020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent) { 306ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendBroadcast called for " + intent.getAction()); 30797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 30897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan for (BroadcastReceiver broadcastReceiver : 30997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.get(intent.getAction())) { 31097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan broadcastReceiver.onReceive(mContext, intent); 31197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 312ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 3130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent, String receiverPermission) { 317ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan logd("sendBroadcast called for " + intent.getAction()); 318ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan sendBroadcast(intent); 3190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 322e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission) { 323e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak logd("sendOrderedBroadcast called for " + intent.getAction()); 324e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendBroadcast(intent); 325e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 326e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 327e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 328e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission, 329e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 330e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak String initialData, Bundle initialExtras) { 331e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendOrderedBroadcast(intent, receiverPermission); 332e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak if (resultReceiver != null) { 333e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak synchronized (mOrderedBroadcastReceivers) { 334e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak mOrderedBroadcastReceivers.put(intent, resultReceiver); 335e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 336e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 337e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 338e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 339e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 340e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, 341e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 342e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak String initialData, Bundle initialExtras) { 343e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, 344e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak initialCode, initialData, initialExtras); 345e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 346e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 347e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 348e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, 349e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 350e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak String initialData, Bundle initialExtras) { 351e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, 352e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak initialCode, initialData, initialExtras); 353e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 354e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 355e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 3562416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan public void sendBroadcastAsUser(Intent intent, UserHandle user) { 3572416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan sendBroadcast(intent); 3582416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan } 3592416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3602416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan @Override 3612416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan public void sendBroadcastAsUser(Intent intent, UserHandle user, 3622416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan String receiverPermission) { 3632416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan sendBroadcast(intent); 3642416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan } 3652416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3662416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan @Override 3672416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan public void sendBroadcastAsUser(Intent intent, UserHandle user, 3682416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan String receiverPermission, int appOp) { 3692416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan sendBroadcast(intent); 3702416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan } 3712416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3722416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan @Override 3730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 3740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 3750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int initialCode, String initialData, Bundle initialExtras) { 3763c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 3773c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 3783c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 37905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 38005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 38105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 3823c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 3830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 3870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 3880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 3893c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 3903c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 3913c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 39205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 39305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 39405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 3953c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 3960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 399ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 400ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String receiverPermission, int appOp, Bundle options, 401ec334adf4017ca172f44612d01456e671f922344Amit Mahajan BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 402ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String initialData, Bundle initialExtras) { 403ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 404ec334adf4017ca172f44612d01456e671f922344Amit Mahajan sendBroadcast(intent); 405ec334adf4017ca172f44612d01456e671f922344Amit Mahajan if (resultReceiver != null) { 40605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 40705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 40805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 409ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 410ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 411ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 412ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 41397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcast(Intent intent) { 4146bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcast called for " + intent.getAction()); 41597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 41697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendBroadcast(intent); 41797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mStickyBroadcastByAction.put(intent.getAction(), intent); 41897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 41997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 42097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 42197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan @Override 42297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) { 4236bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcastAsUser called for " + intent.getAction()); 42497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendStickyBroadcast(intent); 425b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 426b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 427b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu @Override 4280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 4290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throws PackageManager.NameNotFoundException { 4300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return this; 4310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void enforceCallingOrSelfPermission(String permission, String message) { 43518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable.contains(permission) 43618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) { 43718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu return; 43818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 43918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu logd("requested permission: " + permission + " got denied"); 44018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu throw new SecurityException(permission + " denied: " + message); 4410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 444ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu public int checkCallingOrSelfPermission(String permission) { 445ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu return PackageManager.PERMISSION_GRANTED; 446ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu } 447ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu 448ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu @Override 4490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public SharedPreferences getSharedPreferences(String name, int mode) { 4500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSharedPreferences; 4510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getPackageName() { 4550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 4560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4570e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 4580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, ComponentName> mComponentNamesByAction = 4600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 4610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, IInterface> mServiceByComponentName = 4620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, IInterface>(); 463311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry private final Map<String, IInterface> mServiceByPackageName = 464311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry new HashMap<String, IInterface>(); 4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = 4660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, ServiceInfo>(); 467277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson private final Map<ComponentName, IntentFilter> mIntentFilterByComponentName = new HashMap<>(); 4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<IInterface, ComponentName> mComponentNameByService = 4690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<IInterface, ComponentName>(); 4700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = 4710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ServiceConnection, IInterface>(); 4720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction = 4730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 47497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan private final HashMap<String, Intent> mStickyBroadcastByAction = 47597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan new HashMap<String, Intent>(); 47605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers = 47705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan ArrayListMultimap.create(); 47818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu private final HashSet<String> mPermissionTable = new HashSet<>(); 47918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 48018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 4810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // The application context is the most important object this class provides to the system 4830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // under test. 4840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Context mContext = spy(new FakeContext()); 4850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // We then create a spy on the application context allowing standard Mockito-style 4870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // when(...) logic to be used to add specific little responses where needed. 4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Resources mResources = mock(Resources.class); 4900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final PackageManager mPackageManager = mock(PackageManager.class); 4910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class); 4920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class); 4930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final NotificationManager mNotificationManager = mock(NotificationManager.class); 4940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final UserManager mUserManager = mock(UserManager.class); 4950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class); 4960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class); 49759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu private final AlarmManager mAlarmManager = mock(AlarmManager.class); 49827b650c406018355a88a41528db7859e232728a0Jack Yu private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class); 499f21d2289021a94fc74023e2b5987d236df354fe1fionaxu private final UsageStatsManager mUsageStatManager = null; 500b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu private final WifiManager mWifiManager = mock(WifiManager.class); 50150b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu private final BatteryManager mBatteryManager = mock(BatteryManager.class); 502dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson private final EuiccManager mEuiccManager = mock(EuiccManager.class); 5030e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu private final TelecomManager mTelecomManager = mock(TelecomManager.class); 504153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 505ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final ContentProvider mContentProvider = spy(new FakeContentProvider()); 506153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 507153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan private final Configuration mConfiguration = new Configuration(); 50818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu private final SharedPreferences mSharedPreferences = PreferenceManager 50918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu .getDefaultSharedPreferences(TestApplication.getAppContext()); 510ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final MockContentResolver mContentResolver = new MockContentResolver(); 5110e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private final PersistableBundle mBundle = new PersistableBundle(); 5120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContextFixture() { 5140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan MockitoAnnotations.initMocks(this); 5150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 5170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 5190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 5200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 5210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 5220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt()); 5240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 5260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 5280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 5290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 5300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 5310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt()); 5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5340e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt()); 5354c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu //doReturn(mBundle).when(mCarrierConfigManager).getConfig(anyInt()); 5364c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu doReturn(mBundle).when(mCarrierConfigManager).getConfig(); 5370e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 538cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan mConfiguration.locale = Locale.US; 53932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan doReturn(mConfiguration).when(mResources).getConfiguration(); 54032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan 541fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider); 5429f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu // Settings caches the provider after first get/set call, this is needed to make sure 5439f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu // Settings is using mContentProvider as the cached provider across all tests. 5449f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu Settings.Global.getInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON, 0); 54598ddd3bea3eb6a1416887aedac8f59c16c119080Jordan Liu mContentResolver.addProvider(ServiceStateTable.AUTHORITY, mContentProvider); 54618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.add(PERMISSION_ENABLE_ALL); 5470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context getTestDouble() { 5510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContext; 5520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putResource(int id, final String value) { 5550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getText(eq(id))).thenReturn(value); 5560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id))).thenReturn(value); 5570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() { 5580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String answer(InvocationOnMock invocation) { 5600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 5610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return String.format(value, Arrays.copyOfRange(args, 1, args.length)); 5620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }); 5640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putBooleanResource(int id, boolean value) { 5670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getBoolean(eq(id))).thenReturn(value); 5680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 570b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu public void putStringArrayResource(int id, String[] values) { 571b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu doReturn(values).when(mResources).getStringArray(eq(id)); 572b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 573b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 574655bae990bdd7e4584491def4d30692e6173779cfionaxu public void putIntArrayResource(int id, int[] values) { 575655bae990bdd7e4584491def4d30692e6173779cfionaxu doReturn(values).when(mResources).getIntArray(eq(id)); 576655bae990bdd7e4584491def4d30692e6173779cfionaxu } 577655bae990bdd7e4584491def4d30692e6173779cfionaxu 5780e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu public PersistableBundle getCarrierConfigBundle() { 5790e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return mBundle; 5800e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 5810e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 582311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry public void addService(String action, ComponentName name, String packageName, 583311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry IInterface service, ServiceInfo serviceInfo) { 584277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson addService(action, name, packageName, service, serviceInfo, null /* filter */); 585277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson } 586277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson 587277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson public void addService(String action, ComponentName name, String packageName, 588277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson IInterface service, ServiceInfo serviceInfo, IntentFilter filter) { 5890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNamesByAction.put(action, name); 590311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry mServiceInfoByComponentName.put(name, serviceInfo); 591277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson mIntentFilterByComponentName.put(name, filter); 592277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson mServiceByComponentName.put(name, service); 593311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry mServiceByPackageName.put(packageName, service); 5940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNameByService.put(service, name); 5950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) { 5980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan List<ResolveInfo> result = new ArrayList<ResolveInfo>(); 5990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) { 6000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ResolveInfo resolveInfo = new ResolveInfo(); 6010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName); 602277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson resolveInfo.filter = mIntentFilterByComponentName.get(componentName); 6030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan result.add(resolveInfo); 6040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 6050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return result; 6060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 6070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 60805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan public void sendBroadcastToOrderedBroadcastReceivers() { 60905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 61005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive() 61105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // call within the loop may lead to sendOrderedBroadcast() which can add to 61205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // mOrderedBroadcastReceivers 61305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan Collection<Map.Entry<Intent, BroadcastReceiver>> map = 61405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.entries(); 61505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan for (Map.Entry<Intent, BroadcastReceiver> entry : map) { 61605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan entry.getValue().onReceive(mContext, entry.getKey()); 61705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue()); 61805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 61905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 62005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 62105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 62218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public void addCallingOrSelfPermission(String permission) { 62318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mPermissionTable) { 62418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable != null && permission != null) { 62518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.remove(PERMISSION_ENABLE_ALL); 62618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.add(permission); 62718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 62818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 62918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 63018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 63118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public void removeCallingOrSelfPermission(String permission) { 63218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mPermissionTable) { 63318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable != null && permission != null) { 63418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.remove(permission); 63518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 63618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 63718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 63818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 639ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private static void logd(String s) { 640ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Log.d(TAG, s); 6410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 6420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 643