ContextFixture.java revision aba07fa1ac55d4f2866409f6c6bb85b66b8b3251
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
2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public int getUserId() {
2580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return 0;
2590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Resources getResources() {
2630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mResources;
2640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getOpPackageName() {
2680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
2690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public ContentResolver getContentResolver() {
273ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return mContentResolver;
2740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2775755ef622fec6f3c592467c685503826862a7536fionaxu        public void unregisterReceiver(BroadcastReceiver receiver) {
2785755ef622fec6f3c592467c685503826862a7536fionaxu        }
2795755ef622fec6f3c592467c685503826862a7536fionaxu
2805755ef622fec6f3c592467c685503826862a7536fionaxu        @Override
2810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
2829b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiver(receiver, filter, null, null);
2839b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
2849b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2859b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
2869b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
2879b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                String broadcastPermission, Handler scheduler) {
2889b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiverAsUser(receiver, null, filter, broadcastPermission, scheduler);
2899b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
2909b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2919b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
2929b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
2939b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                IntentFilter filter, String broadcastPermission, Handler scheduler) {
29497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            Intent result = null;
29597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
29618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                for (int i = 0 ; i < filter.countActions() ; i++) {
29797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    mBroadcastReceiversByAction.put(filter.getAction(i), receiver);
29897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    if (result == null) {
29997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        result = mStickyBroadcastByAction.get(filter.getAction(i));
30097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    }
30197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
3020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
30397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
30497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            return result;
3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent) {
309ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendBroadcast called for " + intent.getAction());
31097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
31197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                for (BroadcastReceiver broadcastReceiver :
31297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        mBroadcastReceiversByAction.get(intent.getAction())) {
31397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    broadcastReceiver.onReceive(mContext, intent);
31497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
315ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
3160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent, String receiverPermission) {
320ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            logd("sendBroadcast called for " + intent.getAction());
321ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            sendBroadcast(intent);
3220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
325e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
326e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            logd("sendOrderedBroadcast called for " + intent.getAction());
327e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendBroadcast(intent);
328e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
329e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
330e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
331e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission,
332e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
333e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
334e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission);
335e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            if (resultReceiver != null) {
336e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                synchronized (mOrderedBroadcastReceivers) {
337e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
338e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                }
339e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            }
340e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
341e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
342e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
343e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
344e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
345e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
346e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
347e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    initialCode, initialData, initialExtras);
348e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
349e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
350e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
351e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
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
3592416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user) {
3602416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3612416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3622416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3632416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3642416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3652416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission) {
3662416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3672416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3682416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3692416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3702416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3712416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission, int appOp) {
3722416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3732416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3742416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3752416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
3770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
3780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int initialCode, String initialData, Bundle initialExtras) {
3793c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
3803c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
3813c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
38205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
38305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
38405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
3853c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
3860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
3900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
3910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
3923c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
3933c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
3943c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
39505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
39605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
39705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
3983c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
3990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
402ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
403ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String receiverPermission, int appOp, Bundle options,
404ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
405ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String initialData, Bundle initialExtras) {
406ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
407ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            sendBroadcast(intent);
408ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            if (resultReceiver != null) {
40905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
41005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
41105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
412ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
413ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
414ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
415ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
41697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcast(Intent intent) {
4176bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcast called for " + intent.getAction());
41897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
41997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                sendBroadcast(intent);
42097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                mStickyBroadcastByAction.put(intent.getAction(), intent);
42197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            }
42297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        }
42397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
42497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        @Override
42597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) {
4266bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcastAsUser called for " + intent.getAction());
42797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            sendStickyBroadcast(intent);
428b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
429b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
430b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        @Override
4310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
4320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throws PackageManager.NameNotFoundException {
4330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return this;
4340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void enforceCallingOrSelfPermission(String permission, String message) {
43818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable.contains(permission)
43918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                    || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
44018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                return;
44118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
44218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            logd("requested permission: " + permission + " got denied");
44318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            throw new SecurityException(permission + " denied: " + message);
4440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
447ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        public int checkCallingOrSelfPermission(String permission) {
448ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian            if (mPermissionTable.contains(permission)
449ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                    || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
450ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                logd("checkCallingOrSelfPermission: " + permission + " return GRANTED");
451ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                return PackageManager.PERMISSION_GRANTED;
452ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian            } else {
453ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                logd("checkCallingOrSelfPermission: " + permission + " return DENIED");
454ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                return PackageManager.PERMISSION_DENIED;
455ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian            }
456ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        }
457ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu
458ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        @Override
4590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public SharedPreferences getSharedPreferences(String name, int mode) {
4600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mSharedPreferences;
4610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getPackageName() {
4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
4660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, ComponentName> mComponentNamesByAction =
4700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
4710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, IInterface> mServiceByComponentName =
4720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, IInterface>();
473311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry    private final Map<String, IInterface> mServiceByPackageName =
474311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry            new HashMap<String, IInterface>();
4750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName =
4760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, ServiceInfo>();
477277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson    private final Map<ComponentName, IntentFilter> mIntentFilterByComponentName = new HashMap<>();
4780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<IInterface, ComponentName> mComponentNameByService =
4790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<IInterface, ComponentName>();
4800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ServiceConnection, IInterface> mServiceByServiceConnection =
4810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ServiceConnection, IInterface>();
4820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction =
4830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
48497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    private final HashMap<String, Intent> mStickyBroadcastByAction =
48597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            new HashMap<String, Intent>();
48605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers =
48705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            ArrayListMultimap.create();
48818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final HashSet<String> mPermissionTable = new HashSet<>();
48918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
49018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
4910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // The application context is the most important object this class provides to the system
4930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // under test.
4940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Context mContext = spy(new FakeContext());
4950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // We then create a spy on the application context allowing standard Mockito-style
4970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // when(...) logic to be used to add specific little responses where needed.
4980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Resources mResources = mock(Resources.class);
5000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final PackageManager mPackageManager = mock(PackageManager.class);
5010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
502aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    private final DownloadManager mDownloadManager = mock(DownloadManager.class);
5030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
5040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final NotificationManager mNotificationManager = mock(NotificationManager.class);
5050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final UserManager mUserManager = mock(UserManager.class);
5060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
5070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
50859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    private final AlarmManager mAlarmManager = mock(AlarmManager.class);
50927b650c406018355a88a41528db7859e232728a0Jack Yu    private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class);
510f21d2289021a94fc74023e2b5987d236df354fe1fionaxu    private final UsageStatsManager mUsageStatManager = null;
511b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private final WifiManager mWifiManager = mock(WifiManager.class);
51250b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu    private final BatteryManager mBatteryManager = mock(BatteryManager.class);
513dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson    private final EuiccManager mEuiccManager = mock(EuiccManager.class);
5140e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu    private final TelecomManager mTelecomManager = mock(TelecomManager.class);
515153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
516ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final ContentProvider mContentProvider = spy(new FakeContentProvider());
517153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
518153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    private final Configuration mConfiguration = new Configuration();
51918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final SharedPreferences mSharedPreferences = PreferenceManager
52018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            .getDefaultSharedPreferences(TestApplication.getAppContext());
521ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final MockContentResolver mContentResolver = new MockContentResolver();
5220e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    private final PersistableBundle mBundle = new PersistableBundle();
5230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public ContextFixture() {
5250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        MockitoAnnotations.initMocks(this);
5260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
5280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
5300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
5310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
5320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
5350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
5370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
5390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
5400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
5410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt());
5440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5450e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
5464c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //doReturn(mBundle).when(mCarrierConfigManager).getConfig(anyInt());
5474c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(mBundle).when(mCarrierConfigManager).getConfig();
5480e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
549cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan        mConfiguration.locale = Locale.US;
55032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        doReturn(mConfiguration).when(mResources).getConfiguration();
55132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
552fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
5539f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu        // Settings caches the provider after first get/set call, this is needed to make sure
5549f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu        // Settings is using mContentProvider as the cached provider across all tests.
5559f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu        Settings.Global.getInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON, 0);
55698ddd3bea3eb6a1416887aedac8f59c16c119080Jordan Liu        mContentResolver.addProvider(ServiceStateTable.AUTHORITY, mContentProvider);
55718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        mPermissionTable.add(PERMISSION_ENABLE_ALL);
5580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Override
5610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public Context getTestDouble() {
5620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return mContext;
5630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putResource(int id, final String value) {
5660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getText(eq(id))).thenReturn(value);
5670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id))).thenReturn(value);
5680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
5690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public String answer(InvocationOnMock invocation) {
5710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Object[] args = invocation.getArguments();
5720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return String.format(value, Arrays.copyOfRange(args, 1, args.length));
5730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        });
5750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putBooleanResource(int id, boolean value) {
5780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getBoolean(eq(id))).thenReturn(value);
5790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
581b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    public void putStringArrayResource(int id, String[] values) {
582b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        doReturn(values).when(mResources).getStringArray(eq(id));
583b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    }
584b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
585655bae990bdd7e4584491def4d30692e6173779cfionaxu    public void putIntArrayResource(int id, int[] values) {
586655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(values).when(mResources).getIntArray(eq(id));
587655bae990bdd7e4584491def4d30692e6173779cfionaxu    }
588655bae990bdd7e4584491def4d30692e6173779cfionaxu
5890e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    public PersistableBundle getCarrierConfigBundle() {
5900e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        return mBundle;
5910e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
5920e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
593311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry    public void addService(String action, ComponentName name, String packageName,
594311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                           IInterface service, ServiceInfo serviceInfo) {
595277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson        addService(action, name, packageName, service, serviceInfo, null /* filter */);
596277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson    }
597277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson
598277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson    public void addService(String action, ComponentName name, String packageName,
599277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson            IInterface service, ServiceInfo serviceInfo, IntentFilter filter) {
6000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNamesByAction.put(action, name);
601311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry        mServiceInfoByComponentName.put(name, serviceInfo);
602277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson        mIntentFilterByComponentName.put(name, filter);
603277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson        mServiceByComponentName.put(name, service);
604311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry        mServiceByPackageName.put(packageName, service);
6050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNameByService.put(service, name);
6060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
6080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
6090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        List<ResolveInfo> result = new ArrayList<ResolveInfo>();
6100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
6110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ResolveInfo resolveInfo = new ResolveInfo();
6120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
613277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson            resolveInfo.filter = mIntentFilterByComponentName.get(componentName);
6140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            result.add(resolveInfo);
6150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
6160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return result;
6170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
61905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    public void sendBroadcastToOrderedBroadcastReceivers() {
62005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        synchronized (mOrderedBroadcastReceivers) {
62105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive()
62205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // call within the loop may lead to sendOrderedBroadcast() which can add to
62305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // mOrderedBroadcastReceivers
62405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            Collection<Map.Entry<Intent, BroadcastReceiver>> map =
62505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.entries();
62605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            for (Map.Entry<Intent, BroadcastReceiver> entry : map) {
62705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                entry.getValue().onReceive(mContext, entry.getKey());
62805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue());
62905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            }
63005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        }
63105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    }
63205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
63318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void addCallingOrSelfPermission(String permission) {
63418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
63518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
63618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(PERMISSION_ENABLE_ALL);
63718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.add(permission);
63818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
63918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
64018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
64118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
64218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void removeCallingOrSelfPermission(String permission) {
64318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
64418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
64518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(permission);
64618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
64718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
64818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
64918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
650ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private static void logd(String s) {
651ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        Log.d(TAG, s);
6520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
654