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
190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.google.common.collect.ArrayListMultimap;
200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.google.common.collect.Multimap;
210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.MockitoAnnotations;
230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.invocation.InvocationOnMock;
240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport org.mockito.stubbing.Answer;
250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.app.AlarmManager;
270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.AppOpsManager;
280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.app.NotificationManager;
29f21d2289021a94fc74023e2b5987d236df354fe1fionaxuimport android.app.usage.UsageStatsManager;
300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.BroadcastReceiver;
310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ComponentName;
32ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentProvider;
330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ContentResolver;
34ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.content.ContentValues;
350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Context;
360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.Intent;
370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.IntentFilter;
380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.ServiceConnection;
390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.SharedPreferences;
400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.PackageManager;
410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ResolveInfo;
420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.pm.ServiceInfo;
4332b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport android.content.res.Configuration;
440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.content.res.Resources;
45ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.database.Cursor;
46fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajanimport android.database.MatrixCursor;
4727b650c406018355a88a41528db7859e232728a0Jack Yuimport android.net.ConnectivityManager;
48ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.net.Uri;
49b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.net.wifi.WifiManager;
500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Bundle;
510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.Handler;
520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.IInterface;
530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yuimport android.os.PersistableBundle;
540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserHandle;
550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.os.UserManager;
56153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajanimport android.preference.PreferenceManager;
570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yuimport android.provider.Settings;
580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.CarrierConfigManager;
590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.SubscriptionManager;
600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.telephony.TelephonyManager;
61ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentProvider;
62ec334adf4017ca172f44612d01456e671f922344Amit Mahajanimport android.test.mock.MockContentResolver;
630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.test.mock.MockContext;
640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport android.util.Log;
650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.ArrayList;
670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Arrays;
6805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajanimport java.util.Collection;
690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.HashMap;
7018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxuimport java.util.HashSet;
710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.List;
7232b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajanimport java.util.Locale;
730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport java.util.Map;
740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.any;
760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.anyInt;
770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.doAnswer;
78b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport static org.mockito.Mockito.doReturn;
790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.eq;
800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.mock;
810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.spy;
820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport static org.mockito.Mockito.when;
830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/**
850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Controls a test {@link Context} as would be provided by the Android framework to an
860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * {@code Activity}, {@code Service} or other system-instantiated component.
870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Contains Fake<Component> classes like FakeContext for components that require complex and
890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * reusable stubbing. Others can be mocked using Mockito functions in tests or constructor/public
900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * methods of this class.
910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpublic class ContextFixture implements TestFixture<Context> {
930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private static final String TAG = "ContextFixture";
9418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public static final String PERMISSION_ENABLE_ALL = "android.permission.STUB_PERMISSION";
950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
96ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    public class FakeContentProvider extends MockContentProvider {
97fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private String[] mColumns = {"name", "value"};
98fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private HashMap<String, String> mKeyValuePairs = new HashMap<String, String>();
99fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        private int mNumKeyValuePairs = 0;
100fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan
101ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
102ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public int delete(Uri uri, String selection, String[] selectionArgs) {
103ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return 0;
104ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
105ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
106ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
107ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Uri insert(Uri uri, ContentValues values) {
108fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            Uri newUri = null;
109fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            if (values != null) {
110fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mKeyValuePairs.put(values.getAsString("name"), values.getAsString("value"));
111fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                mNumKeyValuePairs++;
112fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                newUri = Uri.withAppendedPath(uri, "" + mNumKeyValuePairs);
113fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
114fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("insert called, new mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri +
115fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    " newUri: " + newUri);
116fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            return newUri;
117ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
118ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
119ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
120ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
121ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                            String sortOrder) {
122fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            //assuming query will always be of the form 'name = ?'
123fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("query called, mNumKeyValuePairs: " + mNumKeyValuePairs + " uri: " + uri);
124fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            if (mKeyValuePairs.containsKey(selectionArgs[0])) {
125fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                MatrixCursor cursor = new MatrixCursor(projection);
126fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                cursor.addRow(new String[]{mKeyValuePairs.get(selectionArgs[0])});
127fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                return cursor;
128fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
129ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return null;
130ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
1310ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu
1320ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        @Override
1330ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        public Bundle call(String method, String request, Bundle args) {
134fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            logd("call called, mNumKeyValuePairs: " + mNumKeyValuePairs + " method: " + method +
135fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    " request: " + request);
136fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            switch(method) {
137fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_GLOBAL:
138fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_SECURE:
139fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_GET_SYSTEM:
140fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    if (mKeyValuePairs.containsKey(request)) {
141fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        Bundle b = new Bundle(1);
142fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        b.putCharSequence("value", mKeyValuePairs.get(request));
143fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        logd("returning value pair: " + mKeyValuePairs.get(request) + " for " +
144fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                                request);
145fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                        return b;
146fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    }
147fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    break;
148fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_GLOBAL:
149fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_SECURE:
150fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                case Settings.CALL_METHOD_PUT_SYSTEM:
151fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    logd("adding key-value pair: " + request + "-" + (String)args.get("value"));
152fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    mKeyValuePairs.put(request, (String)args.get("value"));
153fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    mNumKeyValuePairs++;
154fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan                    break;
155fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan            }
1560ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu            return null;
1570ffd5632e025ebbe0d3eedfda942f1fb07342a43Jack Yu        }
158ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    }
159ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
1606bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    private final HashMap<String, Object> mSystemServices = new HashMap<String, Object>();
1616bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1626bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    public void setSystemService(String name, Object service) {
16318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mSystemServices) {
1646bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            mSystemServices.put(name, service);
1656bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt        }
1666bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt    }
1676bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt
1680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public class FakeContext extends MockContext {
1690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public PackageManager getPackageManager() {
1710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mPackageManager;
1720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public boolean bindService(
1760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Intent serviceIntent,
1770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection,
1780a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int flags) {
1790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (mServiceByServiceConnection.containsKey(connection)) {
1800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection already bound: " + connection);
1810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByComponentName.get(serviceIntent.getComponent());
1830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
1840a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection not found: "
1850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        + serviceIntent.getComponent());
1860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            mServiceByServiceConnection.put(connection, service);
1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder());
1890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return true;
1900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
1910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void unbindService(
1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                ServiceConnection connection) {
1950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            IInterface service = mServiceByServiceConnection.remove(connection);
1960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            if (service == null) {
1970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throw new RuntimeException("ServiceConnection not found: " + connection);
1980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
1990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            connection.onServiceDisconnected(mComponentNameByService.get(service));
2000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Object getSystemService(String name) {
204f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            synchronized (mSystemServices) {
205f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                Object service = mSystemServices.get(name);
206f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                if (service != null) return service;
207f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt            }
2080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            switch (name) {
2090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SERVICE:
2100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mTelephonyManager;
2110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.APP_OPS_SERVICE:
2120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mAppOpsManager;
2130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.NOTIFICATION_SERVICE:
2140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mNotificationManager;
2150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.USER_SERVICE:
2160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mUserManager;
2170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.CARRIER_CONFIG_SERVICE:
2180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mCarrierConfigManager;
2190a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.POWER_SERVICE:
2200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    // PowerManager is a final class so cannot be mocked, return real service
2210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return TestApplication.getAppContext().getSystemService(name);
2220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
2230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                    return mSubscriptionManager;
224b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                case Context.WIFI_SERVICE:
225b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                    return mWifiManager;
22659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                case Context.ALARM_SERVICE:
22759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                    return mAlarmManager;
22827b650c406018355a88a41528db7859e232728a0Jack Yu                case Context.CONNECTIVITY_SERVICE:
22927b650c406018355a88a41528db7859e232728a0Jack Yu                    return mConnectivityManager;
230f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                case Context.USAGE_STATS_SERVICE:
231f21d2289021a94fc74023e2b5987d236df354fe1fionaxu                    return mUsageStatManager;
2320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                default:
233f5c24214ded1e0b49f91844bc987bd6f5c17e4e2Robert Greenwalt                    return null;
2340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
2350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public int getUserId() {
2390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return 0;
2400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Resources getResources() {
2440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mResources;
2450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getOpPackageName() {
2490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
2500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public ContentResolver getContentResolver() {
254ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            return mContentResolver;
2550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2585755ef622fec6f3c592467c685503826862a7536fionaxu        public void unregisterReceiver(BroadcastReceiver receiver) {
2595755ef622fec6f3c592467c685503826862a7536fionaxu        }
2605755ef622fec6f3c592467c685503826862a7536fionaxu
2615755ef622fec6f3c592467c685503826862a7536fionaxu        @Override
2620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
2639b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiver(receiver, filter, null, null);
2649b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
2659b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2669b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
2679b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
2689b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                String broadcastPermission, Handler scheduler) {
2699b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan            return registerReceiverAsUser(receiver, null, filter, broadcastPermission, scheduler);
2709b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        }
2719b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan
2729b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        @Override
2739b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle user,
2749b813aa455186511edd03bb738334a1acca7e7b3Amit Mahajan                IntentFilter filter, String broadcastPermission, Handler scheduler) {
27597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            Intent result = null;
27697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
27718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                for (int i = 0 ; i < filter.countActions() ; i++) {
27897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    mBroadcastReceiversByAction.put(filter.getAction(i), receiver);
27997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    if (result == null) {
28097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        result = mStickyBroadcastByAction.get(filter.getAction(i));
28197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    }
28297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
2830a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
28497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
28597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            return result;
2860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
2890a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent) {
290ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendBroadcast called for " + intent.getAction());
29197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
29297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                for (BroadcastReceiver broadcastReceiver :
29397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                        mBroadcastReceiversByAction.get(intent.getAction())) {
29497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                    broadcastReceiver.onReceive(mContext, intent);
29597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                }
296ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
2970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
2980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
2990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendBroadcast(Intent intent, String receiverPermission) {
301ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            logd("sendBroadcast called for " + intent.getAction());
302ceea0fa1248e326663ac56e5ba37b0633f8adaccAmit Mahajan            sendBroadcast(intent);
3030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
306e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission) {
307e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            logd("sendOrderedBroadcast called for " + intent.getAction());
308e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendBroadcast(intent);
309e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
310e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
311e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
312e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission,
313e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
314e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
315e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission);
316e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            if (resultReceiver != null) {
317e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                synchronized (mOrderedBroadcastReceivers) {
318e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
319e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                }
320e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            }
321e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
322e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
323e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
324e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, Bundle options,
325e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
326e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
327e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
328e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    initialCode, initialData, initialExtras);
329e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
330e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
331e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
332e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        public void sendOrderedBroadcast(Intent intent, String receiverPermission, int appOp,
333e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
334e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                String initialData, Bundle initialExtras) {
335e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak            sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler,
336e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak                    initialCode, initialData, initialExtras);
337e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        }
338e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak
339e1aeaee24464191130da0133981d47fb9e469960Pavel Zhamaitsiak        @Override
3402416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user) {
3412416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3422416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3432416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3442416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3452416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3462416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission) {
3472416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3482416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3492416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3502416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3512416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        public void sendBroadcastAsUser(Intent intent, UserHandle user,
3522416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan                                        String receiverPermission, int appOp) {
3532416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan            sendBroadcast(intent);
3542416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        }
3552416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan
3562416ed9dea025ad22c37d333ac1cbf4fae75c3abAmit Mahajan        @Override
3570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
3580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
3590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                int initialCode, String initialData, Bundle initialExtras) {
3603c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
3613c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
3623c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
36305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
36405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
36505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
3663c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
3670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
3700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
3710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
3720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
3733c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
3743c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            sendBroadcast(intent);
3753c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            if (resultReceiver != null) {
37605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
37705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
37805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
3793c7c2c2dfecfe11991f707a09ce79863e0ffdaa7Amit Mahajan            }
3800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
3810a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
3820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
383ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
384ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String receiverPermission, int appOp, Bundle options,
385ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                BroadcastReceiver resultReceiver, Handler scheduler, int initialCode,
386ec334adf4017ca172f44612d01456e671f922344Amit Mahajan                String initialData, Bundle initialExtras) {
387ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            logd("sendOrderedBroadcastAsUser called for " + intent.getAction());
388ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            sendBroadcast(intent);
389ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            if (resultReceiver != null) {
39005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                synchronized (mOrderedBroadcastReceivers) {
39105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.put(intent, resultReceiver);
39205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                }
393ec334adf4017ca172f44612d01456e671f922344Amit Mahajan            }
394ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        }
395ec334adf4017ca172f44612d01456e671f922344Amit Mahajan
396ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        @Override
39797ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcast(Intent intent) {
3986bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcast called for " + intent.getAction());
39997ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            synchronized (mBroadcastReceiversByAction) {
40097ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                sendBroadcast(intent);
40197ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan                mStickyBroadcastByAction.put(intent.getAction(), intent);
40297ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            }
40397ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        }
40497ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan
40597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        @Override
40697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan        public void sendStickyBroadcastAsUser(Intent intent, UserHandle ignored) {
4076bfc71d2b5340f6274b3e63926a7068e364fc9ffRobert Greenwalt            logd("sendStickyBroadcastAsUser called for " + intent.getAction());
40897ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            sendStickyBroadcast(intent);
409b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
410b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
411b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        @Override
4120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
4130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                throws PackageManager.NameNotFoundException {
4140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return this;
4150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public void enforceCallingOrSelfPermission(String permission, String message) {
41918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable.contains(permission)
42018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                    || mPermissionTable.contains(PERMISSION_ENABLE_ALL)) {
42118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                return;
42218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
42318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            logd("requested permission: " + permission + " got denied");
42418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            throw new SecurityException(permission + " denied: " + message);
4250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
428ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        public int checkCallingOrSelfPermission(String permission) {
429ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu            return PackageManager.PERMISSION_GRANTED;
430ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        }
431ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu
432ce000ddfbb615f873e9fc0a4c68f992b12d3f82ffionaxu        @Override
4330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public SharedPreferences getSharedPreferences(String name, int mode) {
4340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return mSharedPreferences;
4350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        @Override
4380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        public String getPackageName() {
4390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            return "com.android.internal.telephony";
4400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
4410e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
4420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, ComponentName> mComponentNamesByAction =
4440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
4450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, IInterface> mServiceByComponentName =
4460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, IInterface>();
4470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName =
4480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ComponentName, ServiceInfo>();
4490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<IInterface, ComponentName> mComponentNameByService =
4500a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<IInterface, ComponentName>();
4510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Map<ServiceConnection, IInterface> mServiceByServiceConnection =
4520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            new HashMap<ServiceConnection, IInterface>();
4530a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Multimap<String, BroadcastReceiver> mBroadcastReceiversByAction =
4540a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ArrayListMultimap.create();
45597ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan    private final HashMap<String, Intent> mStickyBroadcastByAction =
45697ef92758cd180f431f095e6bda6ea9f2676d933Amit Mahajan            new HashMap<String, Intent>();
45705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    private final Multimap<Intent, BroadcastReceiver> mOrderedBroadcastReceivers =
45805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            ArrayListMultimap.create();
45918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final HashSet<String> mPermissionTable = new HashSet<>();
46018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
46118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
4620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // The application context is the most important object this class provides to the system
4640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // under test.
4650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Context mContext = spy(new FakeContext());
4660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // We then create a spy on the application context allowing standard Mockito-style
4680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    // when(...) logic to be used to add specific little responses where needed.
4690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final Resources mResources = mock(Resources.class);
4710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final PackageManager mPackageManager = mock(PackageManager.class);
4720a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
4730a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
4740a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final NotificationManager mNotificationManager = mock(NotificationManager.class);
4750a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final UserManager mUserManager = mock(UserManager.class);
4760a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
4770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
47859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    private final AlarmManager mAlarmManager = mock(AlarmManager.class);
47927b650c406018355a88a41528db7859e232728a0Jack Yu    private final ConnectivityManager mConnectivityManager = mock(ConnectivityManager.class);
480f21d2289021a94fc74023e2b5987d236df354fe1fionaxu    private final UsageStatsManager mUsageStatManager = null;
481b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private final WifiManager mWifiManager = mock(WifiManager.class);
482153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
483ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final ContentProvider mContentProvider = spy(new FakeContentProvider());
484153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan
485153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan    private final Configuration mConfiguration = new Configuration();
48618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    private final SharedPreferences mSharedPreferences = PreferenceManager
48718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            .getDefaultSharedPreferences(TestApplication.getAppContext());
488ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private final MockContentResolver mContentResolver = new MockContentResolver();
4890e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    private final PersistableBundle mBundle = new PersistableBundle();
4900a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4910a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public ContextFixture() {
4920a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        MockitoAnnotations.initMocks(this);
4930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
4940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
4950a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
4960a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
4970a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
4980a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
4990a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5000a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5010a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
5020a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5030a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        doAnswer(new Answer<List<ResolveInfo>>() {
5040a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
5060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return doQueryIntentServices(
5070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Intent) invocation.getArguments()[0],
5080a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                        (Integer) invocation.getArguments()[1]);
5090a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt());
5110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5120e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        doReturn(mBundle).when(mCarrierConfigManager).getConfigForSubId(anyInt());
5134c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        //doReturn(mBundle).when(mCarrierConfigManager).getConfig(anyInt());
5144c31e4c0d2db31fe84081aa6f1e2bcc08b31f9d3fionaxu        doReturn(mBundle).when(mCarrierConfigManager).getConfig();
5150e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
516cbe5874f0032a93b81c842db992de850fba7ed2eAmit Mahajan        mConfiguration.locale = Locale.US;
51732b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan        doReturn(mConfiguration).when(mResources).getConfiguration();
51832b5fbb1a340fa16e2c37c276517ef10a4934500Amit Mahajan
519fd6ce6219b41f9735240b9d0665d27c32482abd1Amit Mahajan        mContentResolver.addProvider(Settings.AUTHORITY, mContentProvider);
52018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        mPermissionTable.add(PERMISSION_ENABLE_ALL);
5210a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5220a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5230a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Override
5240a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public Context getTestDouble() {
5250a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return mContext;
5260a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5270a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5280a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putResource(int id, final String value) {
5290a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getText(eq(id))).thenReturn(value);
5300a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id))).thenReturn(value);
5310a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
5320a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            @Override
5330a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            public String answer(InvocationOnMock invocation) {
5340a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                Object[] args = invocation.getArguments();
5350a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan                return String.format(value, Arrays.copyOfRange(args, 1, args.length));
5360a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            }
5370a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        });
5380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void putBooleanResource(int id, boolean value) {
5410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        when(mResources.getBoolean(eq(id))).thenReturn(value);
5420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5430a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
544b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    public void putStringArrayResource(int id, String[] values) {
545b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        doReturn(values).when(mResources).getStringArray(eq(id));
546b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    }
547b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
548655bae990bdd7e4584491def4d30692e6173779cfionaxu    public void putIntArrayResource(int id, int[] values) {
549655bae990bdd7e4584491def4d30692e6173779cfionaxu        doReturn(values).when(mResources).getIntArray(eq(id));
550655bae990bdd7e4584491def4d30692e6173779cfionaxu    }
551655bae990bdd7e4584491def4d30692e6173779cfionaxu
5520e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    public PersistableBundle getCarrierConfigBundle() {
5530e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu        return mBundle;
5540e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu    }
5550e664d8c9ff3a1f2ab03d2bef4268615335ea1a2Jack Yu
5560a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private void addService(String action, ComponentName name, IInterface service) {
5570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNamesByAction.put(action, name);
5580a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mServiceByComponentName.put(name, service);
5590a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        mComponentNameByService.put(service, name);
5600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5610a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
5620a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
5630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        List<ResolveInfo> result = new ArrayList<ResolveInfo>();
5640a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
5650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            ResolveInfo resolveInfo = new ResolveInfo();
5660a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
5670a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan            result.add(resolveInfo);
5680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        }
5690a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        return result;
5700a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
5710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
57205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    public void sendBroadcastToOrderedBroadcastReceivers() {
57305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        synchronized (mOrderedBroadcastReceivers) {
57405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // having a map separate from mOrderedBroadcastReceivers is helpful here as onReceive()
57505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // call within the loop may lead to sendOrderedBroadcast() which can add to
57605ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            // mOrderedBroadcastReceivers
57705ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            Collection<Map.Entry<Intent, BroadcastReceiver>> map =
57805ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                    mOrderedBroadcastReceivers.entries();
57905ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            for (Map.Entry<Intent, BroadcastReceiver> entry : map) {
58005ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                entry.getValue().onReceive(mContext, entry.getKey());
58105ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan                mOrderedBroadcastReceivers.remove(entry.getKey(), entry.getValue());
58205ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan            }
58305ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan        }
58405ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan    }
58505ce040e990b396a4273dc9c8efde364a2afb5bcAmit Mahajan
58618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void addCallingOrSelfPermission(String permission) {
58718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
58818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
58918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(PERMISSION_ENABLE_ALL);
59018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.add(permission);
59118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
59218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
59318ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
59418ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
59518ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    public void removeCallingOrSelfPermission(String permission) {
59618ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        synchronized (mPermissionTable) {
59718ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            if (mPermissionTable != null && permission != null) {
59818ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu                mPermissionTable.remove(permission);
59918ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu            }
60018ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu        }
60118ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu    }
60218ad8bf07feb9f6a9d187da236f3e56c055e941afionaxu
603ec334adf4017ca172f44612d01456e671f922344Amit Mahajan    private static void logd(String s) {
604ec334adf4017ca172f44612d01456e671f922344Amit Mahajan        Log.d(TAG, s);
6050a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
6060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan}
607