ContextFixture.java revision 7aac0858ed9535dbb56baa34f00879bc6b9e960b
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; 30aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwarimport android.app.DownloadManager; 310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.NotificationManager; 32f21d2289021a94fc74023e2b5987d236df354fe1fionaxuimport android.app.usage.UsageStatsManager; 330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver; 340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName; 35ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider; 360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver; 37ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues; 380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context; 390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent; 400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter; 410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection; 420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences; 430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager; 440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo; 450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo; 4632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration; 470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources; 48ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor; 49fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajanimport android.database.MatrixCursor; 5027b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager; 51ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri; 52b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager; 5350b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yuimport android.os.BatteryManager; 540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle; 550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler; 560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface; 570e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle; 580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle; 590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager; 60153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager; 610ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings; 6298ddd3bea3eb6a1416887aedac8f59c16c119080Jordan Liuimport android.provider.Telephony.ServiceStateTable; 630e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yuimport android.telecom.TelecomManager; 640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager; 650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager; 660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager; 67dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidsonimport android.telephony.euicc.EuiccManager; 68ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider; 69ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver; 700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext; 710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log; 720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 73311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.ArrayListMultimap; 74311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.Multimap; 75311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry 76311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.MockitoAnnotations; 77311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.invocation.InvocationOnMock; 78311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.stubbing.Answer; 79311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry 800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList; 810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays; 8205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection; 830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap; 8418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuimport java.util.HashSet; 850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List; 8632b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale; 870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map; 880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/** 900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an 910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component. 920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * 930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and 940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public 950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class. 960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */ 970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> { 980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private static final String TAG = "ContextFixture"; 9918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION"; 1000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public class FakeContentProvider extends MockContentProvider { 102fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private String[] mColumns = {"name", "value"}; 103fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>(); 104fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan private int mNumKeyValuePairs = 0; 105fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan 106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public int delete(Uri uri, String selection, String[] selectionArgs) { 108ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return 0; 109ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 110ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 111ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 112ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Uri insert(Uri uri, ContentValues values) { 113fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Uri newUri = null; 114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (values != null) { 115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mKeyValuePairs.put(values.getAsString("name"), values.getAsString("value")); 116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mNumKeyValuePairs++; 117fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan newUri = Uri.withAppendedPath(uri, "" + mNumKeyValuePairs); 118fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 119fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("insert called, new mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri + 120fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan " newUri: " + newUri); 121fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return newUri; 122ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 123ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 124ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 125ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 126ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String sortOrder) { 127fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan //assuming query will always be of the form 'name = ?' 128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("query called, mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri); 129fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (mKeyValuePairs.containsKey(selectionArgs[0])) { 130fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan MatrixCursor cursor = new MatrixCursor(projection); 131fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan cursor.addRow(new String[]{mKeyValuePairs.get(selectionArgs[0])}); 132fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return cursor; 133fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 134ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return null; 135ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 1360ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu 1370ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu @Override 1380ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu public Bundle call(String method, String request, Bundle args) { 139fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method + 140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan " request: " + request); 141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan switch(method) { 142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_GLOBAL: 143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_SECURE: 144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_GET_SYSTEM: 145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan if (mKeyValuePairs.containsKey(request)) { 146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan Bundle b = new Bundle(1); 147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan b.putCharSequence("value", mKeyValuePairs.get(request)); 148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("returning value pair: " + mKeyValuePairs.get(request) + " for " + 149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan request); 150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan return b; 151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan break; 153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_GLOBAL: 154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_SECURE: 155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan case Settings.CALL_METHOD_PUT_SYSTEM: 156fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan logd("adding key-value pair: " + request + "-" + (String)args.get("value")); 157fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mKeyValuePairs.put(request, (String)args.get("value")); 158fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mNumKeyValuePairs++; 159fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan break; 160fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan } 1610ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu return null; 1620ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu } 163ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 164ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>(); 1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt public void setSystemService(String name, Object service) { 16818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mSystemServices) { 1696bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt mSystemServices.put(name, service); 1706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt } 1726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt 1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public class FakeContext extends MockContext { 1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public PackageManager getPackageManager() { 1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mPackageManager; 1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public boolean bindService( 1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Intent serviceIntent, 1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection, 1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int flags) { 1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (mServiceByServiceConnection.containsKey(connection)) { 1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection already bound: " + connection); 1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByComponentName.get(serviceIntent.getComponent()); 1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 189311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry service = mServiceByPackageName.get(serviceIntent.getPackage()); 190311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry } 191311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry if (service == null) { 192311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry throw new RuntimeException( 193311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry String.format("ServiceConnection not found for component: %s, package: %s", 194311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry serviceIntent.getComponent(), serviceIntent.getPackage())); 1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mServiceByServiceConnection.put(connection, service); 1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder()); 1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return true; 1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void unbindService( 2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ServiceConnection connection) { 2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan IInterface service = mServiceByServiceConnection.remove(connection); 2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan if (service == null) { 2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throw new RuntimeException("ServiceConnection not found: " + connection); 2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan connection.onServiceDisconnected(mComponentNameByService.get(service)); 2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Object getSystemService(String name) { 213f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt synchronized (mSystemServices) { 214f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt Object service = mSystemServices.get(name); 215f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt if (service != null) return service; 216f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt } 2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan switch (name) { 2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SERVICE: 2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mTelephonyManager; 2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.APP_OPS_SERVICE: 2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mAppOpsManager; 2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.NOTIFICATION_SERVICE: 2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mNotificationManager; 2240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.USER_SERVICE: 2250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mUserManager; 2260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.CARRIER_CONFIG_SERVICE: 2270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mCarrierConfigManager; 2280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan case Context.TELEPHONY_SUBSCRIPTION_SERVICE: 2290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSubscriptionManager; 230b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu case Context.WIFI_SERVICE: 231b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu return mWifiManager; 23259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu case Context.ALARM_SERVICE: 23359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu return mAlarmManager; 23427b650c406018355a88a41528db7859e232728a0Jack Yu case Context.CONNECTIVITY_SERVICE: 23527b650c406018355a88a41528db7859e232728a0Jack Yu return mConnectivityManager; 236f21d2289021a94fc74023e2b5987d236df354fe1fionaxu case Context.USAGE_STATS_SERVICE: 237f21d2289021a94fc74023e2b5987d236df354fe1fionaxu return mUsageStatManager; 23850b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu case Context.BATTERY_SERVICE: 23950b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu return mBatteryManager; 240dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson case Context.EUICC_SERVICE: 241dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson return mEuiccManager; 2420e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu case Context.TELECOM_SERVICE: 2430e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu return mTelecomManager; 244aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar case Context.DOWNLOAD_SERVICE: 245aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar return mDownloadManager; 246e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu case Context.DISPLAY_SERVICE: 247e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu case Context.POWER_SERVICE: 248e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu // PowerManager and DisplayManager are final classes so cannot be mocked, 249e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu // return real services. 250e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu return TestApplication.getAppContext().getSystemService(name); 2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan default: 252f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt return null; 2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 25774e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller public String getSystemServiceName(Class<?> serviceClass) { 25874e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller if (serviceClass == SubscriptionManager.class) { 25974e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller return Context.TELEPHONY_SUBSCRIPTION_SERVICE; 26074e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller } 26174e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller return super.getSystemServiceName(serviceClass); 26274e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller } 26374e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller 26474e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller @Override 2650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public int getUserId() { 2660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return 0; 2670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Resources getResources() { 2710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mResources; 2720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getOpPackageName() { 2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 2770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContentResolver getContentResolver() { 281ec334adf4017ca172f44612d01456e671f922344Amit Mahajan return mContentResolver; 2820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 2830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 2840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 2855755ef622fec6f3c592467c685503826862a7536fionaxu public void unregisterReceiver(BroadcastReceiver receiver) { 2865755ef622fec6f3c592467c685503826862a7536fionaxu } 2875755ef622fec6f3c592467c685503826862a7536fionaxu 2885755ef622fec6f3c592467c685503826862a7536fionaxu @Override 2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) { 2909b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan return registerReceiver(receiver, filter, null, null); 2919b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan } 2929b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan 2939b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan @Override 2949b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter, 2959b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan String broadcastPermission, Handler scheduler) { 2969b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan return registerReceiverAsUser(receiver, null, filter, broadcastPermission, scheduler); 2979b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan } 2989b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan 2999b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan @Override 3009b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user, 3019b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan IntentFilter filter, String broadcastPermission, Handler scheduler) { 30297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan Intent result = null; 30397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 30418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu for (int i = 0 ; i < filter.countActions() ; i++) { 30597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.put(filter.getAction(i), receiver); 30697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan if (result == null) { 30797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan result = mStickyBroadcastByAction.get(filter.getAction(i)); 30897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 30997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 3100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 31197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 31297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan return result; 3130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent) { 317ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendBroadcast called for " + intent.getAction()); 31897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 31997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan for (BroadcastReceiver broadcastReceiver : 32097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mBroadcastReceiversByAction.get(intent.getAction())) { 32197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan broadcastReceiver.onReceive(mContext, intent); 32297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 323ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendBroadcast(Intent intent, String receiverPermission) { 328ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan logd("sendBroadcast called for " + intent.getAction()); 329ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan sendBroadcast(intent); 3300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 333e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission) { 334e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak logd("sendOrderedBroadcast called for " + intent.getAction()); 335e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendBroadcast(intent); 336e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 337e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 338e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 339e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission, 340e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 341e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak String initialData, Bundle initialExtras) { 342e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendOrderedBroadcast(intent, receiverPermission); 343e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak if (resultReceiver != null) { 344e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak synchronized (mOrderedBroadcastReceivers) { 345e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak mOrderedBroadcastReceivers.put(intent, resultReceiver); 346e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 347e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 348e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 349e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 350e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 351e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options, 352e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 353e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak String initialData, Bundle initialExtras) { 354e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, 355e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak initialCode, initialData, initialExtras); 356e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 357e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 358e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 359e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp, 360e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 361e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak String initialData, Bundle initialExtras) { 362e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, 363e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak initialCode, initialData, initialExtras); 364e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak } 365e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak 366e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak @Override 3672416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan public void sendBroadcastAsUser(Intent intent, UserHandle user) { 3682416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan sendBroadcast(intent); 3692416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan } 3702416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3712416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan @Override 3722416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan public void sendBroadcastAsUser(Intent intent, UserHandle user, 3732416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan String receiverPermission) { 3742416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan sendBroadcast(intent); 3752416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan } 3762416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3772416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan @Override 3782416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan public void sendBroadcastAsUser(Intent intent, UserHandle user, 3792416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan String receiverPermission, int appOp) { 3802416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan sendBroadcast(intent); 3812416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan } 3822416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan 3832416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan @Override 3840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 3850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler, 3860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan int initialCode, String initialData, Bundle initialExtras) { 3873c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 3883c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 3893c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 39005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 39105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 39205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 3933c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 3940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 3950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 3960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 3970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 3980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan String receiverPermission, int appOp, BroadcastReceiver resultReceiver, 3990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Handler scheduler, int initialCode, String initialData, Bundle initialExtras) { 4003c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 4013c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan sendBroadcast(intent); 4023c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan if (resultReceiver != null) { 40305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 40405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 40505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 4063c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan } 4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 410ec334adf4017ca172f44612d01456e671f922344Amit Mahajan public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user, 411ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String receiverPermission, int appOp, Bundle options, 412ec334adf4017ca172f44612d01456e671f922344Amit Mahajan BroadcastReceiver resultReceiver, Handler scheduler, int initialCode, 413ec334adf4017ca172f44612d01456e671f922344Amit Mahajan String initialData, Bundle initialExtras) { 414ec334adf4017ca172f44612d01456e671f922344Amit Mahajan logd("sendOrderedBroadcastAsUser called for " + intent.getAction()); 415ec334adf4017ca172f44612d01456e671f922344Amit Mahajan sendBroadcast(intent); 416ec334adf4017ca172f44612d01456e671f922344Amit Mahajan if (resultReceiver != null) { 41705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 41805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.put(intent, resultReceiver); 41905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 420ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 421ec334adf4017ca172f44612d01456e671f922344Amit Mahajan } 422ec334adf4017ca172f44612d01456e671f922344Amit Mahajan 423ec334adf4017ca172f44612d01456e671f922344Amit Mahajan @Override 42497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcast(Intent intent) { 4256bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcast called for " + intent.getAction()); 42697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan synchronized (mBroadcastReceiversByAction) { 42797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendBroadcast(intent); 42897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan mStickyBroadcastByAction.put(intent.getAction(), intent); 42997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 43097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan } 43197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan 43297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan @Override 43397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) { 4346bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt logd("sendStickyBroadcastAsUser called for " + intent.getAction()); 43597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan sendStickyBroadcast(intent); 436b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 437b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 438b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu @Override 4390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context createPackageContextAsUser(String packageName, int flags, UserHandle user) 4400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan throws PackageManager.NameNotFoundException { 4410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return this; 4420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void enforceCallingOrSelfPermission(String permission, String message) { 44618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable.contains(permission) 44718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) { 44818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu return; 44918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 45018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu logd("requested permission: " + permission + " got denied"); 45118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu throw new SecurityException(permission + " denied: " + message); 4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 455ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu public int checkCallingOrSelfPermission(String permission) { 456ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian if (mPermissionTable.contains(permission) 457ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) { 458ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian logd("checkCallingOrSelfPermission: " + permission + " return GRANTED"); 459ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian return PackageManager.PERMISSION_GRANTED; 460ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian } else { 461ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian logd("checkCallingOrSelfPermission: " + permission + " return DENIED"); 462ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian return PackageManager.PERMISSION_DENIED; 463ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian } 464ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu } 465ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu 466ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu @Override 4670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public SharedPreferences getSharedPreferences(String name, int mode) { 4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mSharedPreferences; 4690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 4720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String getPackageName() { 4730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return "com.android.internal.telephony"; 4740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 4750e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 4760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 4770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, ComponentName> mComponentNamesByAction = 4780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 4790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, IInterface> mServiceByComponentName = 4800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, IInterface>(); 481311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry private final Map<String, IInterface> mServiceByPackageName = 482311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry new HashMap<String, IInterface>(); 4830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = 4840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ComponentName, ServiceInfo>(); 485277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson private final Map<ComponentName, IntentFilter> mIntentFilterByComponentName = new HashMap<>(); 4860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<IInterface, ComponentName> mComponentNameByService = 4870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<IInterface, ComponentName>(); 4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = 4890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan new HashMap<ServiceConnection, IInterface>(); 4900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction = 4910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ArrayListMultimap.create(); 49297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan private final HashMap<String, Intent> mStickyBroadcastByAction = 49397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan new HashMap<String, Intent>(); 49405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers = 49505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan ArrayListMultimap.create(); 49618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu private final HashSet<String> mPermissionTable = new HashSet<>(); 49718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 49818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 4990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // The application context is the most important object this class provides to the system 5010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // under test. 5020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Context mContext = spy(new FakeContext()); 5030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // We then create a spy on the application context allowing standard Mockito-style 5050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan // when(...) logic to be used to add specific little responses where needed. 5060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final Resources mResources = mock(Resources.class); 5080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final PackageManager mPackageManager = mock(PackageManager.class); 5090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class); 510aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar private final DownloadManager mDownloadManager = mock(DownloadManager.class); 5110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class); 5120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final NotificationManager mNotificationManager = mock(NotificationManager.class); 5130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final UserManager mUserManager = mock(UserManager.class); 5140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class); 5150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class); 51659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu private final AlarmManager mAlarmManager = mock(AlarmManager.class); 51727b650c406018355a88a41528db7859e232728a0Jack Yu private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class); 518f21d2289021a94fc74023e2b5987d236df354fe1fionaxu private final UsageStatsManager mUsageStatManager = null; 519b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu private final WifiManager mWifiManager = mock(WifiManager.class); 52050b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu private final BatteryManager mBatteryManager = mock(BatteryManager.class); 521dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson private final EuiccManager mEuiccManager = mock(EuiccManager.class); 5220e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu private final TelecomManager mTelecomManager = mock(TelecomManager.class); 523153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 524ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final ContentProvider mContentProvider = spy(new FakeContentProvider()); 525153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan 526153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan private final Configuration mConfiguration = new Configuration(); 52718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu private final SharedPreferences mSharedPreferences = PreferenceManager 52818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu .getDefaultSharedPreferences(TestApplication.getAppContext()); 529ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private final MockContentResolver mContentResolver = new MockContentResolver(); 5300e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu private final PersistableBundle mBundle = new PersistableBundle(); 5310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public ContextFixture() { 5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan MockitoAnnotations.initMocks(this); 5340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 5360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 5380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 5390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 5400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 5410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt()); 5430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan doAnswer(new Answer<List<ResolveInfo>>() { 5450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable { 5470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return doQueryIntentServices( 5480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Intent) invocation.getArguments()[0], 5490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan (Integer) invocation.getArguments()[1]); 5500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt()); 5520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt()); 5544c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu //doReturn(mBundle).when(mCarrierConfigManager).getConfig(anyInt()); 5554c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu doReturn(mBundle).when(mCarrierConfigManager).getConfig(); 5560e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 557cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan mConfiguration.locale = Locale.US; 55832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan doReturn(mConfiguration).when(mResources).getConfiguration(); 55932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan 560fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider); 5619f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu // Settings caches the provider after first get/set call, this is needed to make sure 5629f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu // Settings is using mContentProvider as the cached provider across all tests. 5639f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu Settings.Global.getInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON, 0); 56498ddd3bea3eb6a1416887aedac8f59c16c119080Jordan Liu mContentResolver.addProvider(ServiceStateTable.AUTHORITY, mContentProvider); 56518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.add(PERMISSION_ENABLE_ALL); 5660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public Context getTestDouble() { 5700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return mContext; 5710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putResource(int id, final String value) { 5740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getText(eq(id))).thenReturn(value); 5750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id))).thenReturn(value); 5760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() { 5770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan @Override 5780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public String answer(InvocationOnMock invocation) { 5790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan Object[] args = invocation.getArguments(); 5800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return String.format(value, Arrays.copyOfRange(args, 1, args.length)); 5810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan }); 5830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 5850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan public void putBooleanResource(int id, boolean value) { 5860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan when(mResources.getBoolean(eq(id))).thenReturn(value); 5870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 5880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 589b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu public void putStringArrayResource(int id, String[] values) { 590b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu doReturn(values).when(mResources).getStringArray(eq(id)); 591b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu } 592b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu 593655bae990bdd7e4584491def4d30692e6173779cfionaxu public void putIntArrayResource(int id, int[] values) { 594655bae990bdd7e4584491def4d30692e6173779cfionaxu doReturn(values).when(mResources).getIntArray(eq(id)); 595655bae990bdd7e4584491def4d30692e6173779cfionaxu } 596655bae990bdd7e4584491def4d30692e6173779cfionaxu 5977aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan public void putIntResource(int id, int value) { 5987aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan doReturn(value).when(mResources).getInteger(eq(id)); 5997aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan } 6007aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan 6010e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu public PersistableBundle getCarrierConfigBundle() { 6020e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu return mBundle; 6030e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu } 6040e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu 605311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry public void addService(String action, ComponentName name, String packageName, 606311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry IInterface service, ServiceInfo serviceInfo) { 607277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson addService(action, name, packageName, service, serviceInfo, null /* filter */); 608277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson } 609277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson 610277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson public void addService(String action, ComponentName name, String packageName, 611277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson IInterface service, ServiceInfo serviceInfo, IntentFilter filter) { 6120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNamesByAction.put(action, name); 613311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry mServiceInfoByComponentName.put(name, serviceInfo); 614277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson mIntentFilterByComponentName.put(name, filter); 615277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson mServiceByComponentName.put(name, service); 616311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry mServiceByPackageName.put(packageName, service); 6170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan mComponentNameByService.put(service, name); 6180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 6190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 6200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) { 6210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan List<ResolveInfo> result = new ArrayList<ResolveInfo>(); 6220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) { 6230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan ResolveInfo resolveInfo = new ResolveInfo(); 6240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName); 625277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson resolveInfo.filter = mIntentFilterByComponentName.get(componentName); 6260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan result.add(resolveInfo); 6270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 6280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan return result; 6290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 6300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan 63105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan public void sendBroadcastToOrderedBroadcastReceivers() { 63205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan synchronized (mOrderedBroadcastReceivers) { 63305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive() 63405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // call within the loop may lead to sendOrderedBroadcast() which can add to 63505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan // mOrderedBroadcastReceivers 63605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan Collection<Map.Entry<Intent, BroadcastReceiver>> map = 63705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.entries(); 63805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan for (Map.Entry<Intent, BroadcastReceiver> entry : map) { 63905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan entry.getValue().onReceive(mContext, entry.getKey()); 64005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue()); 64105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 64205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 64305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan } 64405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan 64518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public void addCallingOrSelfPermission(String permission) { 64618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mPermissionTable) { 64718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable != null && permission != null) { 64818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.remove(PERMISSION_ENABLE_ALL); 64918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.add(permission); 65018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 65118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 65218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 65318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 65418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu public void removeCallingOrSelfPermission(String permission) { 65518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu synchronized (mPermissionTable) { 65618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu if (mPermissionTable != null && permission != null) { 65718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu mPermissionTable.remove(permission); 65818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 65918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 66018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu } 66118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu 662ec334adf4017ca172f44612d01456e671f922344Amit Mahajan private static void logd(String s) { 663ec334adf4017ca172f44612d01456e671f922344Amit Mahajan Log.d(TAG, s); 6640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan } 6650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan} 666