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;
242c93c50e5be7d85b78c4af15aaa10e44f0bcdf3eBrad Ebingerimport com.android.server.telecom.Log;
258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport org.mockito.MockitoAnnotations;
278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport org.mockito.invocation.InvocationOnMock;
288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport org.mockito.stubbing.Answer;
298de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
30aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.app.AppOpsManager;
31aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport android.app.NotificationManager;
32b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awadimport android.app.StatusBarManager;
338de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.BroadcastReceiver;
348de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.ComponentName;
358de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.ContentResolver;
368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.Context;
378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.IContentProvider;
388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.Intent;
398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.IntentFilter;
408de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.content.ServiceConnection;
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;
568de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.telecom.InCallService;
578de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.telecom.PhoneAccount;
581d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liuimport android.telecom.TelecomManager;
591d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liuimport android.telephony.CarrierConfigManager;
600a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awadimport android.telephony.SubscriptionManager;
618de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.telephony.TelephonyManager;
628de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport android.test.mock.MockContext;
638de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
648de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.io.File;
658de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.io.IOException;
668de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.ArrayList;
67a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liuimport java.util.Arrays;
688de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.HashMap;
698de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.List;
708de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.Locale;
718de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport java.util.Map;
728de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
73aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport static org.mockito.Matchers.anyString;
748de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.any;
758de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.anyInt;
768de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.doAnswer;
77a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liuimport static org.mockito.Mockito.doReturn;
788de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.eq;
79aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport static org.mockito.Mockito.mock;
80aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadimport static org.mockito.Mockito.spy;
818de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awadimport static org.mockito.Mockito.when;
828de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
838de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad/**
848de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * Controls a test {@link Context} as would be provided by the Android framework to an
858de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * {@code Activity}, {@code Service} or other system-instantiated component.
868de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad *
878de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * The {@link Context} created by this object is "hollow" but its {@code applicationContext}
888de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad * property points to an application context implementing all the nontrivial functionality.
898de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad */
90aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awadpublic class ComponentContextFixture implements TestFixture<Context> {
918de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
92b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    public class FakeApplicationContext extends MockContext {
938de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
948de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public PackageManager getPackageManager() {
958de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return mPackageManager;
968de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
978de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
988de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
99f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public String getPackageName() {
100f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger            return "com.android.server.telecom.tests";
101f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
102f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
103f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
104f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public String getPackageResourcePath() {
105f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger            return "/tmp/i/dont/know";
106f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
107f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
108f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
109f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public Context getApplicationContext() {
110f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger            return mApplicationContextSpy;
111f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
112f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
113f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
1148de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public File getFilesDir() {
1158de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            try {
1168de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                return File.createTempFile("temp", "temp").getParentFile();
1178de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            } catch (IOException e) {
1188de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException(e);
1198de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1228de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1238de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public boolean bindServiceAsUser(
1248de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                Intent serviceIntent,
1258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                ServiceConnection connection,
1268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                int flags,
1278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                UserHandle userHandle) {
1288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO: Implement "as user" functionality
1298de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return bindService(serviceIntent, connection, flags);
1308de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1318de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1328de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1338de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public boolean bindService(
1348de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                Intent serviceIntent,
1358de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                ServiceConnection connection,
1368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                int flags) {
1378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            if (mServiceByServiceConnection.containsKey(connection)) {
1388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException("ServiceConnection already bound: " + connection);
1398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1408de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IInterface service = mServiceByComponentName.get(serviceIntent.getComponent());
1418de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            if (service == null) {
1428de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException("ServiceConnection not found: "
1438de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        + serviceIntent.getComponent());
1448de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1458de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            mServiceByServiceConnection.put(connection, service);
1468de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            connection.onServiceConnected(serviceIntent.getComponent(), service.asBinder());
1478de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return true;
1488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1498de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1508de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public void unbindService(
1528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                ServiceConnection connection) {
1538de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IInterface service = mServiceByServiceConnection.remove(connection);
1548de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            if (service == null) {
1558de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                throw new RuntimeException("ServiceConnection not found: " + connection);
1568de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1578de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            connection.onServiceDisconnected(mComponentNameByService.get(service));
1588de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1598de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1608de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
1618de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Object getSystemService(String name) {
1628de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            switch (name) {
1638de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                case Context.AUDIO_SERVICE:
1648de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return mAudioManager;
1658de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                case Context.TELEPHONY_SERVICE:
1668de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return mTelephonyManager;
167aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                case Context.APP_OPS_SERVICE:
168aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return mAppOpsManager;
169aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                case Context.NOTIFICATION_SERVICE:
170aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return mNotificationManager;
171b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad                case Context.STATUS_BAR_SERVICE:
172b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad                    return mStatusBarManager;
173aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                case Context.USER_SERVICE:
174aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return mUserManager;
1750a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                case Context.TELEPHONY_SUBSCRIPTION_SERVICE:
1760a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                    return mSubscriptionManager;
1771d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                case Context.TELECOM_SERVICE:
1781d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                    return mTelecomManager;
1791d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                case Context.CARRIER_CONFIG_SERVICE:
1801d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu                    return mCarrierConfigManager;
181c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebinger                case Context.COUNTRY_DETECTOR:
182c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebinger                    return mCountryDetector;
1838de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                default:
1848de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return null;
1858de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
1868de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
1878de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
1888de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
189c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu        public String getSystemServiceName(Class<?> svcClass) {
190c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu            if (svcClass == UserManager.class) {
191c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu                return Context.USER_SERVICE;
192c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu            }
193c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu            throw new UnsupportedOperationException();
194c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu        }
195c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu
196c9bb95616469ae02cc43a57ea827b45261d49e26Hall Liu        @Override
197aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        public int getUserId() {
198aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            return 0;
199aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
200aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
201aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        @Override
2028de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Resources getResources() {
2038de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return mResources;
2048de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2058de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2068de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
2078de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public String getOpPackageName() {
2088fb1fb72b084a0497a3c3c3037ce5667bde14482Hall Liu            return "com.android.server.telecom.tests";
2098de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2108de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2118de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
2128de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public ContentResolver getContentResolver() {
213aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            return new ContentResolver(mApplicationContextSpy) {
2148de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2158de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                protected IContentProvider acquireProvider(Context c, String name) {
216aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    Log.i(this, "acquireProvider %s", name);
217c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    return getOrCreateProvider(name);
2188de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2198de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                public boolean releaseProvider(IContentProvider icp) {
222aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    return true;
2238de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2248de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                protected IContentProvider acquireUnstableProvider(Context c, String name) {
227aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                    Log.i(this, "acquireUnstableProvider %s", name);
228c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    return getOrCreateProvider(name);
229c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                }
230c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry
231c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                private IContentProvider getOrCreateProvider(String name) {
232c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    if (!mIContentProviderByUri.containsKey(name)) {
233c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                        mIContentProviderByUri.put(name, mock(IContentProvider.class));
234c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    }
235c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry                    return mIContentProviderByUri.get(name);
2368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                public boolean releaseUnstableProvider(IContentProvider icp) {
2408de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                    return false;
2418de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2428de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2438de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                @Override
2448de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                public void unstableProviderDied(IContentProvider icp) {
2458de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                }
2468de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            };
2478de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2488de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2498de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
2508de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
2518de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO -- this is called by WiredHeadsetManager!!!
2528de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return null;
2538de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2548de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2558de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
256a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
257a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                String broadcastPermission, Handler scheduler) {
258a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            return null;
259a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        }
260a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu
261a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        @Override
2628de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public void sendBroadcast(Intent intent) {
2638de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO -- need to ensure this is captured
2648de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
2658de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
2668de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
2678de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public void sendBroadcast(Intent intent, String receiverPermission) {
2688de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            // TODO -- need to ensure this is captured
2698de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
270aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
271aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        @Override
272f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        public void sendBroadcastAsUser(Intent intent, UserHandle userHandle) {
273ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            // TODO -- need to ensure this is captured
274f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        }
275f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger
276f4745b6a7d110d6a9d23fe6c385dc1e3d7c6c2f4Brad Ebinger        @Override
277aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
278aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                String receiverPermission, BroadcastReceiver resultReceiver, Handler scheduler,
279aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                int initialCode, String initialData, Bundle initialExtras) {
280aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            // TODO -- need to ensure this is captured
281aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
282aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
283aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        @Override
2840a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad        public void sendOrderedBroadcastAsUser(Intent intent, UserHandle user,
2850a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                String receiverPermission, int appOp, BroadcastReceiver resultReceiver,
2860a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad                Handler scheduler, int initialCode, String initialData, Bundle initialExtras) {
2870a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad        }
2880a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad
2890a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad        @Override
290aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        public Context createPackageContextAsUser(String packageName, int flags, UserHandle user)
291aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                throws PackageManager.NameNotFoundException {
292aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            return this;
293aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }
2945385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger
2955385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        @Override
296ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        public int checkCallingOrSelfPermission(String permission) {
297ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu            return PackageManager.PERMISSION_GRANTED;
298ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        }
299ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
300ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu        @Override
3015385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        public void enforceCallingOrSelfPermission(String permission, String message) {
3025385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger            // Don't bother enforcing anything in mock.
3035385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        }
304ecda55454f4993003e71e09a63d20f94a216cc47Hall Liu
305220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu        @Override
306220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu        public void startActivityAsUser(Intent intent, UserHandle userHandle) {
307220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu            // For capturing
308220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu        }
309220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu    }
3108de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
311b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    public class FakeAudioManager extends AudioManager {
312b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
313b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        private boolean mMute = false;
314b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        private boolean mSpeakerphoneOn = false;
315d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        private int mAudioStreamValue = 1;
316b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        private int mMode = AudioManager.MODE_NORMAL;
317d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        private int mRingerMode = AudioManager.RINGER_MODE_NORMAL;
318b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
319b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public FakeAudioManager(Context context) {
320b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            super(context);
321b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
322b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
323b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
324b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public void setMicrophoneMute(boolean value) {
325b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            mMute = value;
326b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
327b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
328b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
329b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public boolean isMicrophoneMute() {
330b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mMute;
331b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
332b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
333b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
334b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public void setSpeakerphoneOn(boolean value) {
335b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            mSpeakerphoneOn = value;
336b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
337b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
338b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
339b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public boolean isSpeakerphoneOn() {
340b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mSpeakerphoneOn;
341b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
342b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
343b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
344b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public void setMode(int mode) {
345b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            mMode = mode;
346b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
347b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
348b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
349b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public int getMode() {
350b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mMode;
351b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
352d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
353d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
354d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public void setRingerModeInternal(int ringerMode) {
355d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            mRingerMode = ringerMode;
356d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
357d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
358d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
359d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public int getRingerModeInternal() {
360d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            return mRingerMode;
361d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
362d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
363d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
364d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public void setStreamVolume(int streamTypeUnused, int index, int flagsUnused){
365d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            mAudioStreamValue = index;
366d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
367d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger
368d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        @Override
369d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        public int getStreamVolume(int streamValueUnused) {
370d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger            return mAudioStreamValue;
371d931a017a0abea32ad4485a91402b5f62b9ddb0eBrad Ebinger        }
372b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    }
373b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
3748de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Multimap<String, ComponentName> mComponentNamesByAction =
3758de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ArrayListMultimap.create();
3768de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<ComponentName, IInterface> mServiceByComponentName = new HashMap<>();
3778de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<ComponentName, ServiceInfo> mServiceInfoByComponentName = new HashMap<>();
3788de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<IInterface, ComponentName> mComponentNameByService = new HashMap<>();
3798de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Map<ServiceConnection, IInterface> mServiceByServiceConnection = new HashMap<>();
3808de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
3818de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Context mContext = new MockContext() {
3828de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        @Override
3838de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        public Context getApplicationContext() {
3848de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            return mApplicationContextSpy;
3858de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
386b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad
387b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        @Override
388b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        public Resources getResources() {
389b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad            return mResources;
390b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad        }
3918de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    };
3928de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
3938de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // The application context is the most important object this class provides to the system
3948de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // under test.
395b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final Context mApplicationContext = new FakeApplicationContext();
3968de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
3978de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // We then create a spy on the application context allowing standard Mockito-style
3988de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    // when(...) logic to be used to add specific little responses where needed.
3998de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
400b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final Resources mResources = mock(Resources.class);
401aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final Context mApplicationContextSpy = spy(mApplicationContext);
402aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final PackageManager mPackageManager = mock(PackageManager.class);
403b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final AudioManager mAudioManager = spy(new FakeAudioManager(mContext));
404aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final TelephonyManager mTelephonyManager = mock(TelephonyManager.class);
405aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final AppOpsManager mAppOpsManager = mock(AppOpsManager.class);
406aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final NotificationManager mNotificationManager = mock(NotificationManager.class);
407aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    private final UserManager mUserManager = mock(UserManager.class);
408b60f00673149da9a96d9369f4e1c4458e9a9cf53Ihab Awad    private final StatusBarManager mStatusBarManager = mock(StatusBarManager.class);
4090a4b95fc7731943fdd1a9b295daae45eb46b28d0Ihab Awad    private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class);
4101d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class);
411c6ab2cca08ff427174b790a0ed34ebb19b1ce9cdBrad Ebinger    private final CountryDetector mCountryDetector = mock(CountryDetector.class);
412c6e42ef0465fe01b35bb3aa94fbcbc081e3b45edAbhijith Shastry    private final Map<String, IContentProvider> mIContentProviderByUri = new HashMap<>();
4138de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private final Configuration mResourceConfiguration = new Configuration();
4148de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4151d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    private TelecomManager mTelecomManager = null;
4161d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu
417aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad    public ComponentContextFixture() {
4188de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        MockitoAnnotations.initMocks(this);
4198de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mResources.getConfiguration()).thenReturn(mResourceConfiguration);
4208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mResourceConfiguration.setLocale(Locale.TAIWAN);
4218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4228de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        // TODO: Move into actual tests
4238de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mAudioManager.isWiredHeadsetOn()).thenReturn(false);
4248de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        doAnswer(new Answer<List<ResolveInfo>>() {
4268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            @Override
4278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
4288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                return doQueryIntentServices(
4298de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Intent) invocation.getArguments()[0],
4308de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Integer) invocation.getArguments()[1]);
4318de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
4328de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }).when(mPackageManager).queryIntentServices((Intent) any(), anyInt());
4338de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4348de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        doAnswer(new Answer<List<ResolveInfo>>() {
4358de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            @Override
4368de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            public List<ResolveInfo> answer(InvocationOnMock invocation) throws Throwable {
4378de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                return doQueryIntentServices(
4388de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Intent) invocation.getArguments()[0],
4398de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad                        (Integer) invocation.getArguments()[1]);
4408de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            }
4418de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }).when(mPackageManager).queryIntentServicesAsUser((Intent) any(), anyInt(), anyInt());
4428de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4438de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mTelephonyManager.getSubIdForPhoneAccount((PhoneAccount) any())).thenReturn(1);
444aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
4455385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger        when(mTelephonyManager.getNetworkOperatorName()).thenReturn("label1");
4465385513ae43b4d5896245bf076a83b27dbf32a25Brad Ebinger
447aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        doAnswer(new Answer<Void>(){
448aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            @Override
449aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            public Void answer(InvocationOnMock invocation) throws Throwable {
450aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad                return null;
451aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad            }
452aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        }).when(mAppOpsManager).checkPackage(anyInt(), anyString());
453aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
454aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        when(mNotificationManager.matchesCallFilter(any(Bundle.class))).thenReturn(true);
455aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad
456aa383cca668afd8578a6e007c3ea360768dc52f6Ihab Awad        when(mUserManager.getSerialNumberForUser(any(UserHandle.class))).thenReturn(-1L);
457a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu
458a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        doReturn(null).when(mApplicationContextSpy).registerReceiver(any(BroadcastReceiver.class),
459a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                any(IntentFilter.class));
4608de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
4618de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4628de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    @Override
4638de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public Context getTestDouble() {
4648de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        return mContext;
4658de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
4668de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4678de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public void addConnectionService(
4688de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ComponentName componentName,
4698de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IConnectionService service)
4708de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            throws Exception {
4718de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        addService(ConnectionService.SERVICE_INTERFACE, componentName, service);
4728de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        ServiceInfo serviceInfo = new ServiceInfo();
4738de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.permission = android.Manifest.permission.BIND_CONNECTION_SERVICE;
4748de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.packageName = componentName.getPackageName();
4758de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.name = componentName.getClassName();
4768de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mServiceInfoByComponentName.put(componentName, serviceInfo);
4778de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
4788de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
4798de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    public void addInCallService(
4808de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ComponentName componentName,
4818de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            IInCallService service)
4828de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            throws Exception {
4838de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        addService(InCallService.SERVICE_INTERFACE, componentName, service);
4848de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        ServiceInfo serviceInfo = new ServiceInfo();
4858de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.permission = android.Manifest.permission.BIND_INCALL_SERVICE;
4868de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.packageName = componentName.getPackageName();
4878de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        serviceInfo.name = componentName.getClassName();
4888de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mServiceInfoByComponentName.put(componentName, serviceInfo);
4898de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
4908de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
491a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu    public void putResource(int id, final String value) {
492a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        when(mResources.getText(eq(id))).thenReturn(value);
4938de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        when(mResources.getString(eq(id))).thenReturn(value);
494a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        when(mResources.getString(eq(id), any())).thenAnswer(new Answer<String>() {
495a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            @Override
496a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            public String answer(InvocationOnMock invocation) {
497a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                Object[] args = invocation.getArguments();
498a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu                return String.format(value, Arrays.copyOfRange(args, 1, args.length));
499a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu            }
500a33c44b34eaed1ec2dd5c87e00e2c0865971b7d1Hall Liu        });
5018de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
5028de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
503ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu    public void putBooleanResource(int id, boolean value) {
504ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu        when(mResources.getBoolean(eq(id))).thenReturn(value);
505ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu    }
506ada0301a8190568d90adba04bd1f555b7894a0e1Hall Liu
5071d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    public void setTelecomManager(TelecomManager telecomManager) {
5081d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu        mTelecomManager = telecomManager;
5091d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu    }
5101d903ddbf915a4aef4925a0e90042e76151c97a9Hall Liu
5118de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private void addService(String action, ComponentName name, IInterface service) {
5128de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mComponentNamesByAction.put(action, name);
5138de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mServiceByComponentName.put(name, service);
5148de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        mComponentNameByService.put(service, name);
5158de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
5168de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad
5178de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    private List<ResolveInfo> doQueryIntentServices(Intent intent, int flags) {
5188de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        List<ResolveInfo> result = new ArrayList<>();
5198de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        for (ComponentName componentName : mComponentNamesByAction.get(intent.getAction())) {
5208de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            ResolveInfo resolveInfo = new ResolveInfo();
5218de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            resolveInfo.serviceInfo = mServiceInfoByComponentName.get(componentName);
5226e8f3d70ac7397afb4cb5ab276d1cd385c92dd21Brad Ebinger            resolveInfo.serviceInfo.metaData = new Bundle();
5236e8f3d70ac7397afb4cb5ab276d1cd385c92dd21Brad Ebinger            resolveInfo.serviceInfo.metaData.putBoolean(
5246e8f3d70ac7397afb4cb5ab276d1cd385c92dd21Brad Ebinger                    TelecomManager.METADATA_INCLUDE_EXTERNAL_CALLS, true);
5258de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad            result.add(resolveInfo);
5268de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        }
5278de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad        return result;
5288de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad    }
5298de76915ea2772faeb41705aaaeb65f5b3478ac4Ihab Awad}
530