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