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;
464e02298cad18be1643e1ea8add27d35838b20535Jordan Liuimport android.content.res.AssetManager;
4732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration;
480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources;
49ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor;
50fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajanimport android.database.MatrixCursor;
5127b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager;
52ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri;
53b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager;
5450b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yuimport android.os.BatteryManager;
550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle;
560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler;
570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface;
580e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle;
590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle;
600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager;
61153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager;
620ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings;
6398ddd3bea3eb6a1416887aedac8f59c16c119080Jordan Liuimport android.provider.Telephony.ServiceStateTable;
640e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yuimport android.telecom.TelecomManager;
650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager;
660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager;
670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager;
68dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidsonimport android.telephony.euicc.EuiccManager;
69ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider;
70ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver;
710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext;
720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log;
730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
74311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.ArrayListMultimap;
75311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.Multimap;
76311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry
77311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.MockitoAnnotations;
78311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.invocation.InvocationOnMock;
79311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.stubbing.Answer;
80311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry
810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList;
820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays;
8305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection;
840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap;
8518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuimport java.util.HashSet;
860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List;
8732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale;
880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map;
890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/**
910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an
920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component.
930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and
950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public
960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class.
970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> {
990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private static final String TAG = "ContextFixture";
10018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION";
1010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    public class FakeContentProvider extends MockContentProvider {
103fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private String[] mColumns = {"name", "value"};
104fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>();
105fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private int mNumKeyValuePairs = 0;
106fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
108ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public int delete(Uri uri, String selection, String[] selectionArgs) {
109ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return 0;
110ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
111ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
112ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
113ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Uri insert(Uri uri, ContentValues values) {
114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            Uri newUri = null;
115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            if (values != null) {
116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mKeyValuePairs.put(values.getAsString("name"), values.getAsString("value"));
117fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mNumKeyValuePairs++;
118fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                newUri = Uri.withAppendedPath(uri, "" + mNumKeyValuePairs);
119fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
120fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("insert called, new mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri +
121fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    " newUri: " + newUri);
122fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            return newUri;
123ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
124ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
125ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
126ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
127ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                            String sortOrder) {
128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            //assuming query will always be of the form 'name = ?'
129fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("query called, mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri);
130fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            if (mKeyValuePairs.containsKey(selectionArgs[0])) {
131fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                MatrixCursor cursor = new MatrixCursor(projection);
132fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                cursor.addRow(new String[]{mKeyValuePairs.get(selectionArgs[0])});
133fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                return cursor;
134fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
135ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return null;
136ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
1370ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu
1380ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        @Override
1390ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        public Bundle call(String method, String request, Bundle args) {
140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method +
141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    " request: " + request);
142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            switch(method) {
143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_GLOBAL:
144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_SECURE:
145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_SYSTEM:
146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    if (mKeyValuePairs.containsKey(request)) {
147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        Bundle b = new Bundle(1);
148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        b.putCharSequence("value", mKeyValuePairs.get(request));
149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        logd("returning value pair: " + mKeyValuePairs.get(request) + " for " +
150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                                request);
151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        return b;
152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    }
153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    break;
154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_GLOBAL:
155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_SECURE:
156fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_SYSTEM:
157fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    logd("adding key-value pair: " + request + "-" + (String)args.get("value"));
158fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    mKeyValuePairs.put(request, (String)args.get("value"));
159fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    mNumKeyValuePairs++;
160fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    break;
161fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
1620ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu            return null;
1630ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        }
164ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    }
165ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>();
1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setSystemService(String name, Object service) {
16918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mSystemServices) {
1706bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mSystemServices.put(name, service);
1716bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
1726bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
1736bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public class FakeContext extends MockContext {
1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public PackageManager getPackageManager() {
1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mPackageManager;
1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public boolean bindService(
1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Intent serviceIntent,
1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection,
1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int flags) {
1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (mServiceByServiceConnection.containsKey(connection)) {
1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection already bound: " + connection);
1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByComponentName.get(serviceIntent.getComponent());
1890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
190311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                service = mServiceByPackageName.get(serviceIntent.getPackage());
191311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry            }
192311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry            if (service == null) {
193311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                throw new RuntimeException(
194311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                        String.format("ServiceConnection not found for component: %s, package: %s",
195311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                                serviceIntent.getComponent(), serviceIntent.getPackage()));
1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            mServiceByServiceConnection.put(connection, service);
1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder());
1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return true;
2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void unbindService(
2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection) {
2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByServiceConnection.remove(connection);
2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection not found: " + connection);
2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceDisconnected(mComponentNameByService.get(service));
2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Object getSystemService(String name) {
214f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            synchronized (mSystemServices) {
215f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                Object service = mSystemServices.get(name);
216f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                if (service != null) return service;
217f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            }
2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            switch (name) {
2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SERVICE:
2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mTelephonyManager;
2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.APP_OPS_SERVICE:
2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mAppOpsManager;
2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.NOTIFICATION_SERVICE:
2240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mNotificationManager;
2250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.USER_SERVICE:
2260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mUserManager;
2270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.CARRIER_CONFIG_SERVICE:
2280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mCarrierConfigManager;
2290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
2300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mSubscriptionManager;
231b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                case Context.WIFI_SERVICE:
232b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                    return mWifiManager;
23359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                case Context.ALARM_SERVICE:
23459d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                    return mAlarmManager;
23527b650c406018355a88a41528db7859e232728a0Jack Yu                case Context.CONNECTIVITY_SERVICE:
23627b650c406018355a88a41528db7859e232728a0Jack Yu                    return mConnectivityManager;
237f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                case Context.USAGE_STATS_SERVICE:
238f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                    return mUsageStatManager;
23950b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu                case Context.BATTERY_SERVICE:
24050b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu                    return mBatteryManager;
241dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson                case Context.EUICC_SERVICE:
242dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson                    return mEuiccManager;
2430e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu                case Context.TELECOM_SERVICE:
2440e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu                    return mTelecomManager;
245aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar                case Context.DOWNLOAD_SERVICE:
246aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar                    return mDownloadManager;
247e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                case Context.DISPLAY_SERVICE:
248e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                case Context.POWER_SERVICE:
249e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                    // PowerManager and DisplayManager are final classes so cannot be mocked,
250e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                    // return real services.
251e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                    return TestApplication.getAppContext().getSystemService(name);
2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                default:
253f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                    return null;
2540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
25874e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller        public String getSystemServiceName(Class<?> serviceClass) {
25974e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller            if (serviceClass == SubscriptionManager.class) {
26074e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller                return Context.TELEPHONY_SUBSCRIPTION_SERVICE;
26174e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller            }
26274e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller            return super.getSystemServiceName(serviceClass);
26374e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller        }
26474e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller
26574e3ea542d86d6f5cc60cd029289dee622e45d52Neil Fuller        @Override
2660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public int getUserId() {
2670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return 0;
2680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2714e02298cad18be1643e1ea8add27d35838b20535Jordan Liu        public AssetManager getAssets() {
2724e02298cad18be1643e1ea8add27d35838b20535Jordan Liu            return mAssetManager;
2734e02298cad18be1643e1ea8add27d35838b20535Jordan Liu        }
2744e02298cad18be1643e1ea8add27d35838b20535Jordan Liu
2754e02298cad18be1643e1ea8add27d35838b20535Jordan Liu        @Override
2760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Resources getResources() {
2770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mResources;
2780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getOpPackageName() {
2820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
2830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public ContentResolver getContentResolver() {
287ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return mContentResolver;
2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
291ee1df74bea617d89fc7c795b3fdd47e98294093bJordan Liu        public Resources.Theme getTheme() {
292ee1df74bea617d89fc7c795b3fdd47e98294093bJordan Liu            return null;
293ee1df74bea617d89fc7c795b3fdd47e98294093bJordan Liu        }
294ee1df74bea617d89fc7c795b3fdd47e98294093bJordan Liu
295ee1df74bea617d89fc7c795b3fdd47e98294093bJordan Liu        @Override
2965755ef622fec6f3c592467c685503826862a7536fionaxu        public void unregisterReceiver(BroadcastReceiver receiver) {
2975755ef622fec6f3c592467c685503826862a7536fionaxu        }
2985755ef622fec6f3c592467c685503826862a7536fionaxu
2995755ef622fec6f3c592467c685503826862a7536fionaxu        @Override
3000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
3019b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiver(receiver, filter, null, null);
3029b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
3039b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
3049b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
3059b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
3069b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                String broadcastPermission, Handler scheduler) {
3079b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiverAsUser(receiver, null, filter, broadcastPermission, scheduler);
3089b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
3099b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
3109b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
3119b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
3129b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                IntentFilter filter, String broadcastPermission, Handler scheduler) {
31397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            Intent result = null;
31497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
31518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                for (int i = 0 ; i < filter.countActions() ; i++) {
31697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    mBroadcastReceiversByAction.put(filter.getAction(i), receiver);
31797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    if (result == null) {
31897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        result = mStickyBroadcastByAction.get(filter.getAction(i));
31997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    }
32097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
3210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
32297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
32397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            return result;
3240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent) {
328ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendBroadcast called for " + intent.getAction());
32997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
33097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                for (BroadcastReceiver broadcastReceiver :
33197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        mBroadcastReceiversByAction.get(intent.getAction())) {
33297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    broadcastReceiver.onReceive(mContext, intent);
33397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
334ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
3350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent, String receiverPermission) {
339ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            logd("sendBroadcast called for " + intent.getAction());
340ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            sendBroadcast(intent);
3410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
344e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
345e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            logd("sendOrderedBroadcast called for " + intent.getAction());
346e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendBroadcast(intent);
347e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
348e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
349e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
350e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission,
351e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
352e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
353e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission);
354e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            if (resultReceiver != null) {
355e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                synchronized (mOrderedBroadcastReceivers) {
356e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
357e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                }
358e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            }
359e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
360e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
361e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
362e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
363e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
364e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
365e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
366e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    initialCode, initialData, initialExtras);
367e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
368e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
369e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
370e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
371e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
372e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
373e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
374e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    initialCode, initialData, initialExtras);
375e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
376e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
377e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
3782416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user) {
3792416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3802416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3812416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3822416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3832416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3842416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission) {
3852416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3862416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3872416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3882416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3892416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3902416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission, int appOp) {
3912416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3922416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3932416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3942416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
3960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
3970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int initialCode, String initialData, Bundle initialExtras) {
3983c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
3993c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
4003c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
40105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
40205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
40305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
4043c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
4050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
4090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
4100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
4113c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
4123c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
4133c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
41405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
41505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
41605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
4173c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
4180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
421ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
422ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String receiverPermission, int appOp, Bundle options,
423ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
424ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String initialData, Bundle initialExtras) {
425ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
426ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            sendBroadcast(intent);
427ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            if (resultReceiver != null) {
42805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
42905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
43005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
431ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
432ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
433ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
434ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
43597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcast(Intent intent) {
4366bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcast called for " + intent.getAction());
43797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
43897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                sendBroadcast(intent);
43997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                mStickyBroadcastByAction.put(intent.getAction(), intent);
44097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            }
44197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        }
44297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
44397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        @Override
44497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) {
4456bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcastAsUser called for " + intent.getAction());
44697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            sendStickyBroadcast(intent);
447b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
448b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
449b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        @Override
4500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
4510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throws PackageManager.NameNotFoundException {
4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return this;
4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void enforceCallingOrSelfPermission(String permission, String message) {
45718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable.contains(permission)
45818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                    || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
45918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                return;
46018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
46118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            logd("requested permission: " + permission + " got denied");
46218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            throw new SecurityException(permission + " denied: " + message);
4630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
466828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson        public void enforcePermission(String permission, int pid, int uid, String message) {
467828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson            enforceCallingOrSelfPermission(permission, message);
468828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson        }
469828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson
470828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson        @Override
471ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        public int checkCallingOrSelfPermission(String permission) {
472ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian            if (mPermissionTable.contains(permission)
473ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                    || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
474ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                logd("checkCallingOrSelfPermission: " + permission + " return GRANTED");
475ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                return PackageManager.PERMISSION_GRANTED;
476ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian            } else {
477ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                logd("checkCallingOrSelfPermission: " + permission + " return DENIED");
478ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian                return PackageManager.PERMISSION_DENIED;
479ba3b8c9ebd8e36da54ce0fec81c6ea5f460aa51esqian            }
480ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        }
481ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu
482ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        @Override
483828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson        public int checkPermission(String permission, int pid, int uid) {
484828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson            return checkCallingOrSelfPermission(permission);
485828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson        }
486828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson
487828a763161a8e9312052de1864f2f1954dd468c5Jeff Davidson        @Override
4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public SharedPreferences getSharedPreferences(String name, int mode) {
4890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mSharedPreferences;
4900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getPackageName() {
4940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
4950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4960e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
4970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, ComponentName> mComponentNamesByAction =
4990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
5000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, IInterface> mServiceByComponentName =
5010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, IInterface>();
502311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry    private final Map<String, IInterface> mServiceByPackageName =
503311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry            new HashMap<String, IInterface>();
5040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName =
5050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, ServiceInfo>();
506277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson    private final Map<ComponentName, IntentFilter> mIntentFilterByComponentName = new HashMap<>();
5070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<IInterface, ComponentName> mComponentNameByService =
5080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<IInterface, ComponentName>();
5090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ServiceConnection, IInterface> mServiceByServiceConnection =
5100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ServiceConnection, IInterface>();
5110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction =
5120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
51397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    private final HashMap<String, Intent> mStickyBroadcastByAction =
51497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            new HashMap<String, Intent>();
51505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers =
51605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            ArrayListMultimap.create();
51718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final HashSet<String> mPermissionTable = new HashSet<>();
51818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
51918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
5200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // The application context is the most important object this class provides to the system
5220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // under test.
5230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Context mContext = spy(new FakeContext());
5240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // We then create a spy on the application context allowing standard Mockito-style
5260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // when(...) logic to be used to add specific little responses where needed.
5270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Resources mResources = mock(Resources.class);
5290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final PackageManager mPackageManager = mock(PackageManager.class);
5300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
531aba07fa1ac55d4f2866409f6c6bb85b66b8b3251pkanwar    private final DownloadManager mDownloadManager = mock(DownloadManager.class);
5320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final NotificationManager mNotificationManager = mock(NotificationManager.class);
5340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final UserManager mUserManager = mock(UserManager.class);
5350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
5360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
53759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    private final AlarmManager mAlarmManager = mock(AlarmManager.class);
5384e02298cad18be1643e1ea8add27d35838b20535Jordan Liu    private final AssetManager mAssetManager = new AssetManager();
53927b650c406018355a88a41528db7859e232728a0Jack Yu    private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class);
540f21d2289021a94fc74023e2b5987d236df354fe1fionaxu    private final UsageStatsManager mUsageStatManager = null;
541b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private final WifiManager mWifiManager = mock(WifiManager.class);
54250b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu    private final BatteryManager mBatteryManager = mock(BatteryManager.class);
543dce529f00c52bedf4377ee5f7ae1b284fe6452beJeff Davidson    private final EuiccManager mEuiccManager = mock(EuiccManager.class);
5440e9e0387678b3d3cd9694f342a8f40eeb7dbbdcaJack Yu    private final TelecomManager mTelecomManager = mock(TelecomManager.class);
545153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
546ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final ContentProvider mContentProvider = spy(new FakeContentProvider());
547153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
548153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    private final Configuration mConfiguration = new Configuration();
54918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final SharedPreferences mSharedPreferences = PreferenceManager
55018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            .getDefaultSharedPreferences(TestApplication.getAppContext());
551ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final MockContentResolver mContentResolver = new MockContentResolver();
5520e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    private final PersistableBundle mBundle = new PersistableBundle();
5530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public ContextFixture() {
5550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        MockitoAnnotations.initMocks(this);
5560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
5580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
5600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
5610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
5620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
5650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
5670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
5690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
5700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
5710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt());
5740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5750e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
5764c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //doReturn(mBundle).when(mCarrierConfigManager).getConfig(anyInt());
5774c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(mBundle).when(mCarrierConfigManager).getConfig();
5780e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
579cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan        mConfiguration.locale = Locale.US;
58032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        doReturn(mConfiguration).when(mResources).getConfiguration();
58132b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
582fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
5839f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu        // Settings caches the provider after first get/set call, this is needed to make sure
5849f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu        // Settings is using mContentProvider as the cached provider across all tests.
5859f78bc2eb2db658d1b22a9be514ffa6f7a916d64fionaxu        Settings.Global.getInt(mContentResolver, Settings.Global.AIRPLANE_MODE_ON, 0);
58698ddd3bea3eb6a1416887aedac8f59c16c119080Jordan Liu        mContentResolver.addProvider(ServiceStateTable.AUTHORITY, mContentProvider);
58718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        mPermissionTable.add(PERMISSION_ENABLE_ALL);
5880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Override
5910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public Context getTestDouble() {
5920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return mContext;
5930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putResource(int id, final String value) {
5960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getText(eq(id))).thenReturn(value);
5970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id))).thenReturn(value);
5980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
5990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
6000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public String answer(InvocationOnMock invocation) {
6010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Object[] args = invocation.getArguments();
6020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return String.format(value, Arrays.copyOfRange(args, 1, args.length));
6030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
6040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        });
6050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
6070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putBooleanResource(int id, boolean value) {
6080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getBoolean(eq(id))).thenReturn(value);
6090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
611b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    public void putStringArrayResource(int id, String[] values) {
612b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        doReturn(values).when(mResources).getStringArray(eq(id));
613b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    }
614b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
615655bae990bdd7e4584491def4d30692e6173779cfionaxu    public void putIntArrayResource(int id, int[] values) {
616655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(values).when(mResources).getIntArray(eq(id));
617655bae990bdd7e4584491def4d30692e6173779cfionaxu    }
618655bae990bdd7e4584491def4d30692e6173779cfionaxu
6197aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan    public void putIntResource(int id, int value) {
6207aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan        doReturn(value).when(mResources).getInteger(eq(id));
6217aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan    }
6227aac0858ed9535dbb56baa34f00879bc6b9e960bAmit Mahajan
6230e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    public PersistableBundle getCarrierConfigBundle() {
6240e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        return mBundle;
6250e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
6260e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
627311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry    public void addService(String action, ComponentName name, String packageName,
628311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                           IInterface service, ServiceInfo serviceInfo) {
629277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson        addService(action, name, packageName, service, serviceInfo, null /* filter */);
630277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson    }
631277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson
632277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson    public void addService(String action, ComponentName name, String packageName,
633277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson            IInterface service, ServiceInfo serviceInfo, IntentFilter filter) {
6340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNamesByAction.put(action, name);
635311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry        mServiceInfoByComponentName.put(name, serviceInfo);
636277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson        mIntentFilterByComponentName.put(name, filter);
637277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson        mServiceByComponentName.put(name, service);
638311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry        mServiceByPackageName.put(packageName, service);
6390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNameByService.put(service, name);
6400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
6420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
6430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        List<ResolveInfo> result = new ArrayList<ResolveInfo>();
6440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
6450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ResolveInfo resolveInfo = new ResolveInfo();
6460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
647277a5a2aae73ef0233fffc350f3829aee779899fJeff Davidson            resolveInfo.filter = mIntentFilterByComponentName.get(componentName);
6480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            result.add(resolveInfo);
6490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
6500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return result;
6510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
65305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    public void sendBroadcastToOrderedBroadcastReceivers() {
65405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        synchronized (mOrderedBroadcastReceivers) {
65505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive()
65605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // call within the loop may lead to sendOrderedBroadcast() which can add to
65705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // mOrderedBroadcastReceivers
65805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            Collection<Map.Entry<Intent, BroadcastReceiver>> map =
65905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.entries();
66005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            for (Map.Entry<Intent, BroadcastReceiver> entry : map) {
66105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                entry.getValue().onReceive(mContext, entry.getKey());
66205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue());
66305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            }
66405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        }
66505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    }
66605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
66718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void addCallingOrSelfPermission(String permission) {
66818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
66918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
67018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(PERMISSION_ENABLE_ALL);
67118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.add(permission);
67218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
67318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
67418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
67518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
67618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void removeCallingOrSelfPermission(String permission) {
67718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
67818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
67918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(permission);
68018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
68118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
68218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
68318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
684ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private static void logd(String s) {
685ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        Log.d(TAG, s);
6860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
688