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