ContextFixture.java revision e41c3cd566ccbe92c6880f4ef3be8612f42d0340
10a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/*
29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2016 The Android Open Source Project
30a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
40a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License");
50a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * you may not use this file except in compliance with the License.
60a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * You may obtain a copy of the License at
70a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
80a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *      http://www.apache.org/licenses/LICENSE-2.0
90a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Unless required by applicable law or agreed to in writing, software
110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS,
120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * See the License for the specific language governing permissions and
140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * limitations under the License.
150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpackage com.android.internal.telephony;
180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
19311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.any;
20311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.anyInt;
21311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.doAnswer;
22311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.doReturn;
23311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.eq;
24311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.mock;
25311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.spy;
26311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport static org.mockito.Mockito.when;
270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.app.AlarmManager;
290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.AppOpsManager;
300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.NotificationManager;
31f21d2289021a94fc74023e2b5987d236df354fe1fionaxuimport android.app.usage.UsageStatsManager;
320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver;
330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName;
34ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider;
350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver;
36ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues;
370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context;
380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent;
390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter;
400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection;
410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences;
420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager;
430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo;
440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo;
4532b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration;
460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources;
47ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor;
48fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajanimport android.database.MatrixCursor;
4927b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager;
50ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri;
51b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager;
5250b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yuimport android.os.BatteryManager;
530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle;
540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler;
550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface;
560e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle;
570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle;
580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager;
59153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager;
600ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings;
610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager;
620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager;
630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager;
64ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider;
65ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver;
660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext;
670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log;
680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
69311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.ArrayListMultimap;
70311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport com.google.common.collect.Multimap;
71311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry
72311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.MockitoAnnotations;
73311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.invocation.InvocationOnMock;
74311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastryimport org.mockito.stubbing.Answer;
75311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry
760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList;
770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays;
7805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection;
790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap;
8018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuimport java.util.HashSet;
810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List;
8232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale;
830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map;
840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/**
860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an
870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component.
880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and
900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public
910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class.
920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> {
940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private static final String TAG = "ContextFixture";
9518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION";
960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
97ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    public class FakeContentProvider extends MockContentProvider {
98fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private String[] mColumns = {"name", "value"};
99fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>();
100fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private int mNumKeyValuePairs = 0;
101fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public int delete(Uri uri, String selection, String[] selectionArgs) {
104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return 0;
105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
108ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Uri insert(Uri uri, ContentValues values) {
109fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            Uri newUri = null;
110fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            if (values != null) {
111fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mKeyValuePairs.put(values.getAsString("name"), values.getAsString("value"));
112fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mNumKeyValuePairs++;
113fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                newUri = Uri.withAppendedPath(uri, "" + mNumKeyValuePairs);
114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("insert called, new mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri +
116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    " newUri: " + newUri);
117fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            return newUri;
118ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
119ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
120ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
121ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
122ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                            String sortOrder) {
123fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            //assuming query will always be of the form 'name = ?'
124fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("query called, mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri);
125fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            if (mKeyValuePairs.containsKey(selectionArgs[0])) {
126fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                MatrixCursor cursor = new MatrixCursor(projection);
127fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                cursor.addRow(new String[]{mKeyValuePairs.get(selectionArgs[0])});
128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                return cursor;
129fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
130ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return null;
131ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
1320ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu
1330ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        @Override
1340ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        public Bundle call(String method, String request, Bundle args) {
135fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method +
136fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    " request: " + request);
137fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            switch(method) {
138fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_GLOBAL:
139fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_SECURE:
140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_SYSTEM:
141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    if (mKeyValuePairs.containsKey(request)) {
142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        Bundle b = new Bundle(1);
143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        b.putCharSequence("value", mKeyValuePairs.get(request));
144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        logd("returning value pair: " + mKeyValuePairs.get(request) + " for " +
145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                                request);
146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        return b;
147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    }
148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    break;
149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_GLOBAL:
150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_SECURE:
151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_SYSTEM:
152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    logd("adding key-value pair: " + request + "-" + (String)args.get("value"));
153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    mKeyValuePairs.put(request, (String)args.get("value"));
154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    mNumKeyValuePairs++;
155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    break;
156fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
1570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu            return null;
1580ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        }
159ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    }
160ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
1616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>();
1626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1636bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setSystemService(String name, Object service) {
16418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mSystemServices) {
1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mSystemServices.put(name, service);
1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
1686bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public class FakeContext extends MockContext {
1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public PackageManager getPackageManager() {
1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mPackageManager;
1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public boolean bindService(
1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Intent serviceIntent,
1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection,
1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int flags) {
1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (mServiceByServiceConnection.containsKey(connection)) {
1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection already bound: " + connection);
1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByComponentName.get(serviceIntent.getComponent());
1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
185311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                service = mServiceByPackageName.get(serviceIntent.getPackage());
186311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry            }
187311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry            if (service == null) {
188311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                throw new RuntimeException(
189311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                        String.format("ServiceConnection not found for component: %s, package: %s",
190311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                                serviceIntent.getComponent(), serviceIntent.getPackage()));
1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            mServiceByServiceConnection.put(connection, service);
1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder());
1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return true;
1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void unbindService(
1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection) {
2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByServiceConnection.remove(connection);
2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection not found: " + connection);
2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
2040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceDisconnected(mComponentNameByService.get(service));
2050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Object getSystemService(String name) {
209f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            synchronized (mSystemServices) {
210f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                Object service = mSystemServices.get(name);
211f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                if (service != null) return service;
212f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            }
2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            switch (name) {
2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SERVICE:
2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mTelephonyManager;
2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.APP_OPS_SERVICE:
2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mAppOpsManager;
2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.NOTIFICATION_SERVICE:
2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mNotificationManager;
2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.USER_SERVICE:
2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mUserManager;
2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.CARRIER_CONFIG_SERVICE:
2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mCarrierConfigManager;
2240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
2250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mSubscriptionManager;
226b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                case Context.WIFI_SERVICE:
227b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                    return mWifiManager;
22859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                case Context.ALARM_SERVICE:
22959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                    return mAlarmManager;
23027b650c406018355a88a41528db7859e232728a0Jack Yu                case Context.CONNECTIVITY_SERVICE:
23127b650c406018355a88a41528db7859e232728a0Jack Yu                    return mConnectivityManager;
232f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                case Context.USAGE_STATS_SERVICE:
233f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                    return mUsageStatManager;
23450b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu                case Context.BATTERY_SERVICE:
23550b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu                    return mBatteryManager;
236e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                case Context.DISPLAY_SERVICE:
237e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                case Context.POWER_SERVICE:
238e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                    // PowerManager and DisplayManager are final classes so cannot be mocked,
239e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                    // return real services.
240e41c3cd566ccbe92c6880f4ef3be8612f42d0340Jack Yu                    return TestApplication.getAppContext().getSystemService(name);
2410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                default:
242f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                    return null;
2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public int getUserId() {
2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return 0;
2490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Resources getResources() {
2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mResources;
2540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getOpPackageName() {
2580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
2590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public ContentResolver getContentResolver() {
263ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return mContentResolver;
2640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2675755ef622fec6f3c592467c685503826862a7536fionaxu        public void unregisterReceiver(BroadcastReceiver receiver) {
2685755ef622fec6f3c592467c685503826862a7536fionaxu        }
2695755ef622fec6f3c592467c685503826862a7536fionaxu
2705755ef622fec6f3c592467c685503826862a7536fionaxu        @Override
2710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
2729b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiver(receiver, filter, null, null);
2739b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
2749b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2759b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
2769b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
2779b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                String broadcastPermission, Handler scheduler) {
2789b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiverAsUser(receiver, null, filter, broadcastPermission, scheduler);
2799b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
2809b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2819b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
2829b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
2839b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                IntentFilter filter, String broadcastPermission, Handler scheduler) {
28497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            Intent result = null;
28597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
28618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                for (int i = 0 ; i < filter.countActions() ; i++) {
28797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    mBroadcastReceiversByAction.put(filter.getAction(i), receiver);
28897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    if (result == null) {
28997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        result = mStickyBroadcastByAction.get(filter.getAction(i));
29097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    }
29197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
2920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
29397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
29497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            return result;
2950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent) {
299ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendBroadcast called for " + intent.getAction());
30097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
30197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                for (BroadcastReceiver broadcastReceiver :
30297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        mBroadcastReceiversByAction.get(intent.getAction())) {
30397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    broadcastReceiver.onReceive(mContext, intent);
30497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
305ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
3060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent, String receiverPermission) {
310ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            logd("sendBroadcast called for " + intent.getAction());
311ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            sendBroadcast(intent);
3120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
315e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
316e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            logd("sendOrderedBroadcast called for " + intent.getAction());
317e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendBroadcast(intent);
318e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
319e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
320e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
321e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission,
322e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
323e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
324e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission);
325e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            if (resultReceiver != null) {
326e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                synchronized (mOrderedBroadcastReceivers) {
327e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
328e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                }
329e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            }
330e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
331e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
332e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
333e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
334e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
335e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
336e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
337e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    initialCode, initialData, initialExtras);
338e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
339e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
340e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
341e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
342e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
343e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
344e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
345e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    initialCode, initialData, initialExtras);
346e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
347e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
348e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
3492416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user) {
3502416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3512416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3522416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3532416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3542416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3552416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission) {
3562416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3572416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3582416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3592416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3602416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3612416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission, int appOp) {
3622416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3632416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3642416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3652416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
3670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
3680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int initialCode, String initialData, Bundle initialExtras) {
3693c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
3703c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
3713c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
37205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
37305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
37405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
3753c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
3760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
3800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
3810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
3823c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
3833c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
3843c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
38505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
38605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
38705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
3883c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
3890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
392ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
393ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String receiverPermission, int appOp, Bundle options,
394ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
395ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String initialData, Bundle initialExtras) {
396ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
397ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            sendBroadcast(intent);
398ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            if (resultReceiver != null) {
39905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
40005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
40105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
402ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
403ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
404ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
405ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
40697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcast(Intent intent) {
4076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcast called for " + intent.getAction());
40897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
40997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                sendBroadcast(intent);
41097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                mStickyBroadcastByAction.put(intent.getAction(), intent);
41197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            }
41297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        }
41397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
41497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        @Override
41597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) {
4166bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcastAsUser called for " + intent.getAction());
41797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            sendStickyBroadcast(intent);
418b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
419b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
420b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        @Override
4210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
4220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throws PackageManager.NameNotFoundException {
4230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return this;
4240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void enforceCallingOrSelfPermission(String permission, String message) {
42818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable.contains(permission)
42918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                    || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
43018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                return;
43118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
43218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            logd("requested permission: " + permission + " got denied");
43318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            throw new SecurityException(permission + " denied: " + message);
4340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
437ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        public int checkCallingOrSelfPermission(String permission) {
438ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu            return PackageManager.PERMISSION_GRANTED;
439ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        }
440ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu
441ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        @Override
4420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public SharedPreferences getSharedPreferences(String name, int mode) {
4430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mSharedPreferences;
4440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getPackageName() {
4480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
4490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4500e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
4510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, ComponentName> mComponentNamesByAction =
4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, IInterface> mServiceByComponentName =
4550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, IInterface>();
456311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry    private final Map<String, IInterface> mServiceByPackageName =
457311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry            new HashMap<String, IInterface>();
4580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName =
4590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, ServiceInfo>();
4600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<IInterface, ComponentName> mComponentNameByService =
4610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<IInterface, ComponentName>();
4620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ServiceConnection, IInterface> mServiceByServiceConnection =
4630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ServiceConnection, IInterface>();
4640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction =
4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
46697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    private final HashMap<String, Intent> mStickyBroadcastByAction =
46797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            new HashMap<String, Intent>();
46805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers =
46905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            ArrayListMultimap.create();
47018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final HashSet<String> mPermissionTable = new HashSet<>();
47118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
47218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
4730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // The application context is the most important object this class provides to the system
4750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // under test.
4760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Context mContext = spy(new FakeContext());
4770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // We then create a spy on the application context allowing standard Mockito-style
4790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // when(...) logic to be used to add specific little responses where needed.
4800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Resources mResources = mock(Resources.class);
4820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final PackageManager mPackageManager = mock(PackageManager.class);
4830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
4840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
4850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final NotificationManager mNotificationManager = mock(NotificationManager.class);
4860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final UserManager mUserManager = mock(UserManager.class);
4870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
4880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
48959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    private final AlarmManager mAlarmManager = mock(AlarmManager.class);
49027b650c406018355a88a41528db7859e232728a0Jack Yu    private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class);
491f21d2289021a94fc74023e2b5987d236df354fe1fionaxu    private final UsageStatsManager mUsageStatManager = null;
492b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private final WifiManager mWifiManager = mock(WifiManager.class);
49350b941e59787a21dd2d4f3d25d700538efb9abc5Jack Yu    private final BatteryManager mBatteryManager = mock(BatteryManager.class);
494153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
495ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final ContentProvider mContentProvider = spy(new FakeContentProvider());
496153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
497153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    private final Configuration mConfiguration = new Configuration();
49818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final SharedPreferences mSharedPreferences = PreferenceManager
49918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            .getDefaultSharedPreferences(TestApplication.getAppContext());
500ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final MockContentResolver mContentResolver = new MockContentResolver();
5010e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    private final PersistableBundle mBundle = new PersistableBundle();
5020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public ContextFixture() {
5040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        MockitoAnnotations.initMocks(this);
5050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
5070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
5090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
5100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
5110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
5140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
5160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
5180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
5190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
5200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt());
5230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5240e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
5254c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //doReturn(mBundle).when(mCarrierConfigManager).getConfig(anyInt());
5264c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(mBundle).when(mCarrierConfigManager).getConfig();
5270e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
528cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan        mConfiguration.locale = Locale.US;
52932b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        doReturn(mConfiguration).when(mResources).getConfiguration();
53032b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
531fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
53218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        mPermissionTable.add(PERMISSION_ENABLE_ALL);
5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Override
5360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public Context getTestDouble() {
5370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return mContext;
5380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putResource(int id, final String value) {
5410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getText(eq(id))).thenReturn(value);
5420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id))).thenReturn(value);
5430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
5440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public String answer(InvocationOnMock invocation) {
5460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Object[] args = invocation.getArguments();
5470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return String.format(value, Arrays.copyOfRange(args, 1, args.length));
5480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        });
5500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putBooleanResource(int id, boolean value) {
5530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getBoolean(eq(id))).thenReturn(value);
5540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
556b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    public void putStringArrayResource(int id, String[] values) {
557b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        doReturn(values).when(mResources).getStringArray(eq(id));
558b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    }
559b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
560655bae990bdd7e4584491def4d30692e6173779cfionaxu    public void putIntArrayResource(int id, int[] values) {
561655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(values).when(mResources).getIntArray(eq(id));
562655bae990bdd7e4584491def4d30692e6173779cfionaxu    }
563655bae990bdd7e4584491def4d30692e6173779cfionaxu
5640e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    public PersistableBundle getCarrierConfigBundle() {
5650e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        return mBundle;
5660e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
5670e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
568311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry    public void addService(String action, ComponentName name, String packageName,
569311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry                           IInterface service, ServiceInfo serviceInfo) {
5700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNamesByAction.put(action, name);
571311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry        mServiceInfoByComponentName.put(name, serviceInfo);
572311e8950a8e2662422d999c5bda4f90cca7bf39aAbhijith Shastry        mServiceByPackageName.put(packageName, service);
5730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNameByService.put(service, name);
5740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
5770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        List<ResolveInfo> result = new ArrayList<ResolveInfo>();
5780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
5790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ResolveInfo resolveInfo = new ResolveInfo();
5800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
5810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            result.add(resolveInfo);
5820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
5830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return result;
5840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
58605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    public void sendBroadcastToOrderedBroadcastReceivers() {
58705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        synchronized (mOrderedBroadcastReceivers) {
58805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive()
58905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // call within the loop may lead to sendOrderedBroadcast() which can add to
59005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // mOrderedBroadcastReceivers
59105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            Collection<Map.Entry<Intent, BroadcastReceiver>> map =
59205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.entries();
59305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            for (Map.Entry<Intent, BroadcastReceiver> entry : map) {
59405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                entry.getValue().onReceive(mContext, entry.getKey());
59505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue());
59605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            }
59705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        }
59805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    }
59905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
60018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void addCallingOrSelfPermission(String permission) {
60118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
60218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
60318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(PERMISSION_ENABLE_ALL);
60418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.add(permission);
60518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
60618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
60718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
60818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
60918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void removeCallingOrSelfPermission(String permission) {
61018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
61118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
61218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(permission);
61318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
61418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
61518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
61618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
617ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private static void logd(String s) {
618ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        Log.d(TAG, s);
6190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
621