18de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad/*
28de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * Copyright (C) 2015 The Android Open Source Project
38de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad *
48de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * Licensed under the Apache License, Version 2.0 (the "License");
58de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * you may not use this file except in compliance with the License.
68de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * You may obtain a copy of the License at
78de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad *
88de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad *      http://www.apache.org/licenses/LICENSE-2.0
98de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad *
108de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * Unless required by applicable law or agreed to in writing, software
118de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * distributed under the License is distributed on an "AS IS" BASIS,
128de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * See the License for the specific language governing permissions and
148de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * limitations under the License.
158de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad */
168de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
172c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerpackage com.android.server.telecom.tests;
188de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
198de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport com.google.common.collect.ArrayListMultimap;
208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport com.google.common.collect.Multimap;
218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
228de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport com.android.internal.telecom.IConnectionService;
238de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport com.android.internal.telecom.IInCallService;
248de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport org.mockito.MockitoAnnotations;
268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport org.mockito.invocation.InvocationOnMock;
278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport org.mockito.stubbing.Answer;
288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
29aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.app.AppOpsManager;
30aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.app.NotificationManager;
31b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awadimport android.app.StatusBarManager;
328de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.BroadcastReceiver;
338de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.ComponentName;
348de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.ContentResolver;
358de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.Context;
368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.IContentProvider;
378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.Intent;
388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.IntentFilter;
398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.ServiceConnection;
40d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebingerimport android.content.pm.ApplicationInfo;
418de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.pm.PackageManager;
428de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.pm.ResolveInfo;
438de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.pm.ServiceInfo;
448de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.res.Configuration;
458de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.res.Resources;
46c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebingerimport android.location.Country;
47c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebingerimport android.location.CountryDetector;
488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.media.AudioManager;
49aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.os.Bundle;
50aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.os.Handler;
518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.os.IInterface;
528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.os.UserHandle;
53aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.os.UserManager;
542c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport android.telecom.CallAudioState;
558de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.telecom.ConnectionService;
56a3eccfee788c3ac3c831a443b085b141b39bb63dBrad Ebingerimport android.telecom.Log;
578de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.telecom.InCallService;
588de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.telecom.PhoneAccount;
591d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liuimport android.telecom.TelecomManager;
601d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liuimport android.telephony.CarrierConfigManager;
610a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awadimport android.telephony.SubscriptionManager;
628de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.telephony.TelephonyManager;
638de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.test.mock.MockContext;
648de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
658de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.io.File;
668de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.io.IOException;
678de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.ArrayList;
68a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liuimport java.util.Arrays;
698de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.HashMap;
708de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.List;
718de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.Locale;
728de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.Map;
738de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
74aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport static org.mockito.Matchers.anyString;
758de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.any;
768de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.anyInt;
778de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.doAnswer;
78a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liuimport static org.mockito.Mockito.doReturn;
798de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.eq;
80aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport static org.mockito.Mockito.mock;
81aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport static org.mockito.Mockito.spy;
828de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.when;
838de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
848de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad/**
858de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * Controls a test {@link Context} as would be provided by the Android framework to an
868de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * {@code Activity}, {@code Service} or other system-instantiated component.
878de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad *
888de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * The {@link Context} created by this object is "hollow" but its {@code applicationContext}
898de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * property points to an application context implementing all the nontrivial functionality.
908de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad */
91aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadpublic class ComponentContextFixture implements TestFixture<Context> {
928de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
93b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    public class FakeApplicationContext extends MockContext {
948de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
958de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public PackageManager getPackageManager() {
968de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return mPackageManager;
978de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
988de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
998de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
100f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public String getPackageName() {
101f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger            return "com.android.server.telecom.tests";
102f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
103f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
104f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
105f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public String getPackageResourcePath() {
106f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger            return "/tmp/i/dont/know";
107f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
108f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
109f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
110f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public Context getApplicationContext() {
111f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger            return mApplicationContextSpy;
112f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
113f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
114f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
1158de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public File getFilesDir() {
1168de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            try {
1178de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                return File.createTempFile("temp", "temp").getParentFile();
1188de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            } catch (IOException e) {
1198de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException(e);
1208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1228de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1238de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1248de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public boolean bindServiceAsUser(
1258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                Intent serviceIntent,
1268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                ServiceConnection connection,
1278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                int flags,
1288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                UserHandle userHandle) {
1298de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO: Implement "as user" functionality
1308de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return bindService(serviceIntent, connection, flags);
1318de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1328de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1338de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1348de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public boolean bindService(
1358de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                Intent serviceIntent,
1368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                ServiceConnection connection,
1378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                int flags) {
1388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            if (mServiceByServiceConnection.containsKey(connection)) {
1398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException("ServiceConnection already bound: " + connection);
1408de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1418de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IInterface service = mServiceByComponentName.get(serviceIntent.getComponent());
1428de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            if (service == null) {
1438de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException("ServiceConnection not found: "
1448de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        + serviceIntent.getComponent());
1458de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1468de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            mServiceByServiceConnection.put(connection, service);
1478de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder());
1488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return true;
1498de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1508de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public void unbindService(
1538de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                ServiceConnection connection) {
1548de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IInterface service = mServiceByServiceConnection.remove(connection);
1558de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            if (service == null) {
1568de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException("ServiceConnection not found: " + connection);
1578de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1588de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            connection.onServiceDisconnected(mComponentNameByService.get(service));
1598de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1608de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1618de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1628de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Object getSystemService(String name) {
1638de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            switch (name) {
1648de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                case Context.AUDIO_SERVICE:
1658de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return mAudioManager;
1668de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                case Context.TELEPHONY_SERVICE:
1678de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return mTelephonyManager;
168aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                case Context.APP_OPS_SERVICE:
169aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return mAppOpsManager;
170aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                case Context.NOTIFICATION_SERVICE:
171aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return mNotificationManager;
172b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad                case Context.STATUS_BAR_SERVICE:
173b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad                    return mStatusBarManager;
174aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                case Context.USER_SERVICE:
175aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return mUserManager;
1760a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
1770a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                    return mSubscriptionManager;
1781d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                case Context.TELECOM_SERVICE:
1791d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                    return mTelecomManager;
1801d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                case Context.CARRIER_CONFIG_SERVICE:
1811d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                    return mCarrierConfigManager;
182c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebinger                case Context.COUNTRY_DETECTOR:
183c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebinger                    return mCountryDetector;
1848de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                default:
1858de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return null;
1868de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1878de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1888de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1898de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
190c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu        public String getSystemServiceName(Class<?> svcClass) {
191c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu            if (svcClass == UserManager.class) {
192c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu                return Context.USER_SERVICE;
193c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu            }
194c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu            throw new UnsupportedOperationException();
195c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu        }
196c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu
197c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu        @Override
198aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        public int getUserId() {
199aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            return 0;
200aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
201aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
202aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        @Override
2038de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Resources getResources() {
2048de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return mResources;
2058de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2068de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2078de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
2088de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public String getOpPackageName() {
2098fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu            return "com.android.server.telecom.tests";
2108de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2118de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2128de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
213d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        public ApplicationInfo getApplicationInfo() {
214d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger            return mTestApplicationInfo;
215d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        }
216d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger
217d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        @Override
2188de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public ContentResolver getContentResolver() {
219aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            return new ContentResolver(mApplicationContextSpy) {
2208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                protected IContentProvider acquireProvider(Context c, String name) {
222aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    Log.i(this, "acquireProvider %s", name);
223c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    return getOrCreateProvider(name);
2248de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                public boolean releaseProvider(IContentProvider icp) {
228aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return true;
2298de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2308de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2318de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2328de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                protected IContentProvider acquireUnstableProvider(Context c, String name) {
233aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    Log.i(this, "acquireUnstableProvider %s", name);
234c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    return getOrCreateProvider(name);
235c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                }
236c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry
237c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                private IContentProvider getOrCreateProvider(String name) {
238c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    if (!mIContentProviderByUri.containsKey(name)) {
239c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                        mIContentProviderByUri.put(name, mock(IContentProvider.class));
240c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    }
241c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    return mIContentProviderByUri.get(name);
2428de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2438de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2448de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2458de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                public boolean releaseUnstableProvider(IContentProvider icp) {
2468de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return false;
2478de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2498de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2508de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                public void unstableProviderDied(IContentProvider icp) {
2518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            };
2538de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2548de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2558de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
2568de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
2578de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO -- this is called by WiredHeadsetManager!!!
2588de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return null;
2598de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2608de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2618de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
262a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
263a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                String broadcastPermission, Handler scheduler) {
264a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            return null;
265a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        }
266a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu
267a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        @Override
2689156bae91bb0a5c0af9c5ae8f848f1f009e5ba0cHall Liu        public Intent registerReceiverAsUser(BroadcastReceiver receiver, UserHandle handle,
2699156bae91bb0a5c0af9c5ae8f848f1f009e5ba0cHall Liu                IntentFilter filter, String broadcastPermission, Handler scheduler) {
2709156bae91bb0a5c0af9c5ae8f848f1f009e5ba0cHall Liu            return null;
2719156bae91bb0a5c0af9c5ae8f848f1f009e5ba0cHall Liu        }
2729156bae91bb0a5c0af9c5ae8f848f1f009e5ba0cHall Liu
2739156bae91bb0a5c0af9c5ae8f848f1f009e5ba0cHall Liu        @Override
2748de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public void sendBroadcast(Intent intent) {
2758de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO -- need to ensure this is captured
2768de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2778de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2788de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
2798de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public void sendBroadcast(Intent intent, String receiverPermission) {
2808de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO -- need to ensure this is captured
2818de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
282aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
283aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        @Override
284f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public void sendBroadcastAsUser(Intent intent, UserHandle userHandle) {
285ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // TODO -- need to ensure this is captured
286f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
287f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
288f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
289aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
290aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
291aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                int initialCode, String initialData, Bundle initialExtras) {
292aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            // TODO -- need to ensure this is captured
293aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
294aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
295aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        @Override
2960a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
2970a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
2980a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
2990a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad        }
3000a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad
3010a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad        @Override
302aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
303aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                throws PackageManager.NameNotFoundException {
304aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            return this;
305aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
3065385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger
3075385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        @Override
308ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public int checkCallingOrSelfPermission(String permission) {
309ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            return PackageManager.PERMISSION_GRANTED;
310ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
311ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
312ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
3135385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        public void enforceCallingOrSelfPermission(String permission, String message) {
3145385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger            // Don't bother enforcing anything in mock.
3155385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        }
316ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
317220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu        @Override
318a0a43d51041c9efbe04f7c65236c9e90c3e79346Tyler Gunn        public void enforcePermission(
319a0a43d51041c9efbe04f7c65236c9e90c3e79346Tyler Gunn                String permission, int pid, int uid, String message) {
320a0a43d51041c9efbe04f7c65236c9e90c3e79346Tyler Gunn            // By default, don't enforce anything in mock.
321a0a43d51041c9efbe04f7c65236c9e90c3e79346Tyler Gunn        }
322a0a43d51041c9efbe04f7c65236c9e90c3e79346Tyler Gunn
323a0a43d51041c9efbe04f7c65236c9e90c3e79346Tyler Gunn        @Override
324220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu        public void startActivityAsUser(Intent intent, UserHandle userHandle) {
325220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu            // For capturing
326220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu        }
327220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu    }
3288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
329b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    public class FakeAudioManager extends AudioManager {
330b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
331b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        private boolean mMute = false;
332b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        private boolean mSpeakerphoneOn = false;
333d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        private int mAudioStreamValue = 1;
334b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        private int mMode = AudioManager.MODE_NORMAL;
335d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
336b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
337b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public FakeAudioManager(Context context) {
338b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            super(context);
339b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
340b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
341b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
342b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public void setMicrophoneMute(boolean value) {
343b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            mMute = value;
344b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
345b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
346b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
347b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public boolean isMicrophoneMute() {
348b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mMute;
349b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
350b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
351b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
352b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public void setSpeakerphoneOn(boolean value) {
353b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            mSpeakerphoneOn = value;
354b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
355b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
356b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
357b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public boolean isSpeakerphoneOn() {
358b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mSpeakerphoneOn;
359b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
360b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
361b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
362b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public void setMode(int mode) {
363b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            mMode = mode;
364b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
365b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
366b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
367b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public int getMode() {
368b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mMode;
369b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
370d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
371d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
372d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public void setRingerModeInternal(int ringerMode) {
373d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            mRingerMode = ringerMode;
374d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
375d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
376d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
377d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public int getRingerModeInternal() {
378d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            return mRingerMode;
379d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
380d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
381d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
382d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public void setStreamVolume(int streamTypeUnused, int index, int flagsUnused){
383d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            mAudioStreamValue = index;
384d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
385d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
386d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
387d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public int getStreamVolume(int streamValueUnused) {
388d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            return mAudioStreamValue;
389d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
390b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    }
391b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
3928de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Multimap<String, ComponentName> mComponentNamesByAction =
3938de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ArrayListMultimap.create();
3948de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<ComponentName, IInterface> mServiceByComponentName = new HashMap<>();
3958de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = new HashMap<>();
3968de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<IInterface, ComponentName> mComponentNameByService = new HashMap<>();
3978de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = new HashMap<>();
3988de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
3998de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Context mContext = new MockContext() {
4008de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
4018de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Context getApplicationContext() {
4028de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return mApplicationContextSpy;
4038de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
404b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
405b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
406b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public Resources getResources() {
407b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mResources;
408b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
4098de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    };
4108de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4118de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // The application context is the most important object this class provides to the system
4128de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // under test.
413b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final Context mApplicationContext = new FakeApplicationContext();
4148de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4158de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // We then create a spy on the application context allowing standard Mockito-style
4168de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // when(...) logic to be used to add specific little responses where needed.
4178de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
418b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final Resources mResources = mock(Resources.class);
419aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final Context mApplicationContextSpy = spy(mApplicationContext);
420aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final PackageManager mPackageManager = mock(PackageManager.class);
421b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final AudioManager mAudioManager = spy(new FakeAudioManager(mContext));
422aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
423aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
424aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final NotificationManager mNotificationManager = mock(NotificationManager.class);
425aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final UserManager mUserManager = mock(UserManager.class);
426b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final StatusBarManager mStatusBarManager = mock(StatusBarManager.class);
4270a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
4281d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
429c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebinger    private final CountryDetector mCountryDetector = mock(CountryDetector.class);
430c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry    private final Map<String, IContentProvider> mIContentProviderByUri = new HashMap<>();
4318de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Configuration mResourceConfiguration = new Configuration();
432d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger    private final ApplicationInfo mTestApplicationInfo = new ApplicationInfo();
4338de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4341d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    private TelecomManager mTelecomManager = null;
4351d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu
436aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public ComponentContextFixture() {
4378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        MockitoAnnotations.initMocks(this);
4388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mResources.getConfiguration()).thenReturn(mResourceConfiguration);
4398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mResourceConfiguration.setLocale(Locale.TAIWAN);
4408de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4418de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        // TODO: Move into actual tests
4428de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mAudioManager.isWiredHeadsetOn()).thenReturn(false);
4438de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4448de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        doAnswer(new Answer<List<ResolveInfo>>() {
4458de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            @Override
4468de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
4478de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                return doQueryIntentServices(
4488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Intent) invocation.getArguments()[0],
4498de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Integer) invocation.getArguments()[1]);
4508de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
4518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
4528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4538de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        doAnswer(new Answer<List<ResolveInfo>>() {
4548de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            @Override
4558de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
4568de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                return doQueryIntentServices(
4578de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Intent) invocation.getArguments()[0],
4588de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Integer) invocation.getArguments()[1]);
4598de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
4608de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt());
4618de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4628de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mTelephonyManager.getSubIdForPhoneAccount((PhoneAccount) any())).thenReturn(1);
463aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
4645385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        when(mTelephonyManager.getNetworkOperatorName()).thenReturn("label1");
4655385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger
466aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        doAnswer(new Answer<Void>(){
467aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            @Override
468aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            public Void answer(InvocationOnMock invocation) throws Throwable {
469aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                return null;
470aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            }
471aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }).when(mAppOpsManager).checkPackage(anyInt(), anyString());
472aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
473aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        when(mNotificationManager.matchesCallFilter(any(Bundle.class))).thenReturn(true);
474aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
475aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        when(mUserManager.getSerialNumberForUser(any(UserHandle.class))).thenReturn(-1L);
476a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu
477a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        doReturn(null).when(mApplicationContextSpy).registerReceiver(any(BroadcastReceiver.class),
478a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                any(IntentFilter.class));
4798de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
4808de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4818de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    @Override
4828de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public Context getTestDouble() {
4838de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        return mContext;
4848de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
4858de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4868de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public void addConnectionService(
4878de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ComponentName componentName,
4888de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IConnectionService service)
4898de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            throws Exception {
4908de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        addService(ConnectionService.SERVICE_INTERFACE, componentName, service);
4918de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        ServiceInfo serviceInfo = new ServiceInfo();
4928de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.permission = android.Manifest.permission.BIND_CONNECTION_SERVICE;
4938de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.packageName = componentName.getPackageName();
4948de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.name = componentName.getClassName();
4958de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mServiceInfoByComponentName.put(componentName, serviceInfo);
4968de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
4978de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4988de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public void addInCallService(
4998de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ComponentName componentName,
5008de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IInCallService service)
5018de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            throws Exception {
5028de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        addService(InCallService.SERVICE_INTERFACE, componentName, service);
5038de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        ServiceInfo serviceInfo = new ServiceInfo();
5048de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.permission = android.Manifest.permission.BIND_INCALL_SERVICE;
5058de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.packageName = componentName.getPackageName();
5068de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.name = componentName.getClassName();
5078de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mServiceInfoByComponentName.put(componentName, serviceInfo);
5088de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
5098de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
510a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu    public void putResource(int id, final String value) {
511a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        when(mResources.getText(eq(id))).thenReturn(value);
5128de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mResources.getString(eq(id))).thenReturn(value);
513a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
514a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            @Override
515a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            public String answer(InvocationOnMock invocation) {
516a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                Object[] args = invocation.getArguments();
517a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                return String.format(value, Arrays.copyOfRange(args, 1, args.length));
518a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            }
519a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        });
5208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
5218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
522ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu    public void putBooleanResource(int id, boolean value) {
523ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu        when(mResources.getBoolean(eq(id))).thenReturn(value);
524ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu    }
525ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu
5261d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    public void setTelecomManager(TelecomManager telecomManager) {
5271d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu        mTelecomManager = telecomManager;
5281d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    }
5291d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu
5308de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private void addService(String action, ComponentName name, IInterface service) {
5318de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mComponentNamesByAction.put(action, name);
5328de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mServiceByComponentName.put(name, service);
5338de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mComponentNameByService.put(service, name);
5348de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
5358de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
5368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
5378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        List<ResolveInfo> result = new ArrayList<>();
5388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
5398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ResolveInfo resolveInfo = new ResolveInfo();
5408de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
5416e8f3d70ac7397afb4cb5ab276d1cd385c92dd21Brad Ebinger            resolveInfo.serviceInfo.metaData = new Bundle();
5426e8f3d70ac7397afb4cb5ab276d1cd385c92dd21Brad Ebinger            resolveInfo.serviceInfo.metaData.putBoolean(
5436e8f3d70ac7397afb4cb5ab276d1cd385c92dd21Brad Ebinger                    TelecomManager.METADATA_INCLUDE_EXTERNAL_CALLS, true);
5448de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            result.add(resolveInfo);
5458de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
5468de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        return result;
5478de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
5488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad}
549