blob: cbca5e175d1ec52a3e81abdf2b17a6bad43ff66d [file] [log] [blame]
Hall Liuecda5542015-12-04 11:31:31 -08001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.telecom.tests;
18
19import static android.Manifest.permission.CALL_PHONE;
Tyler Gunnb652dad2018-03-27 18:49:49 +000020import static android.Manifest.permission.CALL_PRIVILEGED;
Hall Liuecda5542015-12-04 11:31:31 -080021import static android.Manifest.permission.MODIFY_PHONE_STATE;
22import static android.Manifest.permission.READ_PHONE_STATE;
23import static android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE;
24
Hall Liu7c928322016-12-06 18:15:39 -080025import android.app.ActivityManager;
Hall Liuecda5542015-12-04 11:31:31 -080026import android.app.AppOpsManager;
27import android.content.ComponentName;
28import android.content.Context;
29import android.content.Intent;
30import android.content.pm.ApplicationInfo;
31import android.content.pm.PackageManager;
32import android.net.Uri;
33import android.os.Binder;
34import android.os.Bundle;
35import android.os.RemoteException;
36import android.os.UserHandle;
37import android.os.UserManager;
38import android.telecom.PhoneAccount;
39import android.telecom.PhoneAccountHandle;
40import android.telecom.TelecomManager;
Hall Liu0a6dd302015-12-16 15:06:49 -080041import android.telecom.VideoProfile;
42import android.telephony.TelephonyManager;
Hall Liu84b6c872016-02-03 12:19:00 -080043import android.test.suitebuilder.annotation.SmallTest;
Hall Liuecda5542015-12-04 11:31:31 -080044
45import com.android.internal.telecom.ITelecomService;
Hall Liu0a6dd302015-12-16 15:06:49 -080046import com.android.server.telecom.Call;
Hall Liuecda5542015-12-04 11:31:31 -080047import com.android.server.telecom.CallIntentProcessor;
Hall Liu0a6dd302015-12-16 15:06:49 -080048import com.android.server.telecom.CallState;
Hall Liuecda5542015-12-04 11:31:31 -080049import com.android.server.telecom.CallsManager;
Hall Liu7c928322016-12-06 18:15:39 -080050import com.android.server.telecom.DefaultDialerCache;
Hall Liuecda5542015-12-04 11:31:31 -080051import com.android.server.telecom.PhoneAccountRegistrar;
52import com.android.server.telecom.TelecomServiceImpl;
53import com.android.server.telecom.TelecomSystem;
54import com.android.server.telecom.components.UserCallIntentProcessor;
55import com.android.server.telecom.components.UserCallIntentProcessorFactory;
56
Hall Liu74bb6352017-12-27 18:23:28 -080057import org.junit.Before;
58import org.junit.Test;
59import org.junit.runner.RunWith;
60import org.junit.runners.JUnit4;
Hall Liuecda5542015-12-04 11:31:31 -080061import org.mockito.ArgumentCaptor;
Philip P. Moltmann3168f6a2017-11-22 15:55:59 -080062import org.mockito.ArgumentMatcher;
Hall Liuecda5542015-12-04 11:31:31 -080063import org.mockito.Mock;
64
65import java.util.ArrayList;
66import java.util.Collection;
67import java.util.List;
68
69import static android.Manifest.permission.REGISTER_SIM_SUBSCRIPTION;
70import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
Hall Liu74bb6352017-12-27 18:23:28 -080071import static org.junit.Assert.assertEquals;
72import static org.junit.Assert.assertFalse;
73import static org.junit.Assert.assertNull;
74import static org.junit.Assert.assertTrue;
75import static org.junit.Assert.fail;
Brad Ebingerd0fe76e2017-03-20 13:17:15 -070076import static org.mockito.ArgumentMatchers.nullable;
Hall Liuecda5542015-12-04 11:31:31 -080077import static org.mockito.Matchers.any;
78import static org.mockito.Matchers.anyBoolean;
79import static org.mockito.Matchers.anyInt;
80import static org.mockito.Matchers.anyString;
81import static org.mockito.Matchers.argThat;
82import static org.mockito.Matchers.eq;
Hall Liu0a6dd302015-12-16 15:06:49 -080083import static org.mockito.Matchers.isNull;
Hall Liuecda5542015-12-04 11:31:31 -080084import static org.mockito.Mockito.doNothing;
85import static org.mockito.Mockito.doReturn;
86import static org.mockito.Mockito.doThrow;
Hall Liu0a6dd302015-12-16 15:06:49 -080087import static org.mockito.Mockito.mock;
Hall Liuecda5542015-12-04 11:31:31 -080088import static org.mockito.Mockito.never;
89import static org.mockito.Mockito.spy;
90import static org.mockito.Mockito.verify;
91import static org.mockito.Mockito.when;
92
Hall Liu74bb6352017-12-27 18:23:28 -080093@RunWith(JUnit4.class)
Hall Liuecda5542015-12-04 11:31:31 -080094public class TelecomServiceImplTest extends TelecomTestCase {
Tyler Gunnb652dad2018-03-27 18:49:49 +000095
96 public static final String TEST_PACKAGE = "com.test";
97
Hall Liuecda5542015-12-04 11:31:31 -080098 public static class CallIntentProcessAdapterFake implements CallIntentProcessor.Adapter {
99 @Override
100 public void processOutgoingCallIntent(Context context, CallsManager callsManager,
101 Intent intent) {
102
103 }
104
105 @Override
106 public void processIncomingCallIntent(CallsManager callsManager, Intent intent) {
107
108 }
109
110 @Override
111 public void processUnknownCallIntent(CallsManager callsManager, Intent intent) {
112
113 }
114 }
115
Hall Liu0a6dd302015-12-16 15:06:49 -0800116 public static class SubscriptionManagerAdapterFake
117 implements TelecomServiceImpl.SubscriptionManagerAdapter {
118 @Override
119 public int getDefaultVoiceSubId() {
120 return 0;
121 }
122 }
123
Philip P. Moltmann3168f6a2017-11-22 15:55:59 -0800124 private static class AnyStringIn implements ArgumentMatcher<String> {
Hall Liuecda5542015-12-04 11:31:31 -0800125 private Collection<String> mStrings;
126 public AnyStringIn(Collection<String> strings) {
127 this.mStrings = strings;
128 }
129
130 @Override
Philip P. Moltmann3168f6a2017-11-22 15:55:59 -0800131 public boolean matches(String string) {
Hall Liuecda5542015-12-04 11:31:31 -0800132 return mStrings.contains(string);
133 }
134 }
135
136 private ITelecomService.Stub mTSIBinder;
137 private AppOpsManager mAppOpsManager;
138 private UserManager mUserManager;
139
140 @Mock private CallsManager mFakeCallsManager;
141 @Mock private PhoneAccountRegistrar mFakePhoneAccountRegistrar;
142 @Mock private TelecomManager mTelecomManager;
143 private CallIntentProcessor.Adapter mCallIntentProcessorAdapter =
144 spy(new CallIntentProcessAdapterFake());
Hall Liu7c928322016-12-06 18:15:39 -0800145 @Mock private DefaultDialerCache mDefaultDialerCache;
Hall Liu0a6dd302015-12-16 15:06:49 -0800146 private TelecomServiceImpl.SubscriptionManagerAdapter mSubscriptionManagerAdapter =
147 spy(new SubscriptionManagerAdapterFake());
Hall Liuecda5542015-12-04 11:31:31 -0800148 @Mock private UserCallIntentProcessor mUserCallIntentProcessor;
149
150 private final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
151
152 private static final String DEFAULT_DIALER_PACKAGE = "com.google.android.dialer";
153 private static final UserHandle USER_HANDLE_16 = new UserHandle(16);
154 private static final UserHandle USER_HANDLE_17 = new UserHandle(17);
155 private static final PhoneAccountHandle TEL_PA_HANDLE_16 = new PhoneAccountHandle(
156 new ComponentName("test", "telComponentName"), "0", USER_HANDLE_16);
157 private static final PhoneAccountHandle SIP_PA_HANDLE_17 = new PhoneAccountHandle(
158 new ComponentName("test", "sipComponentName"), "1", USER_HANDLE_17);
159 private static final PhoneAccountHandle TEL_PA_HANDLE_CURRENT = new PhoneAccountHandle(
160 new ComponentName("test", "telComponentName"), "2", Binder.getCallingUserHandle());
161 private static final PhoneAccountHandle SIP_PA_HANDLE_CURRENT = new PhoneAccountHandle(
162 new ComponentName("test", "sipComponentName"), "3", Binder.getCallingUserHandle());
163
164 @Override
Hall Liu74bb6352017-12-27 18:23:28 -0800165 @Before
Hall Liuecda5542015-12-04 11:31:31 -0800166 public void setUp() throws Exception {
167 super.setUp();
168 mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
169 mComponentContextFixture.putBooleanResource(
170 com.android.internal.R.bool.config_voice_capable, true);
171
172 doReturn(mContext).when(mContext).getApplicationContext();
173 doNothing().when(mContext).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class),
174 anyString());
175 TelecomServiceImpl telecomServiceImpl = new TelecomServiceImpl(
176 mContext,
177 mFakeCallsManager,
178 mFakePhoneAccountRegistrar,
179 mCallIntentProcessorAdapter,
180 new UserCallIntentProcessorFactory() {
181 @Override
182 public UserCallIntentProcessor create(Context context, UserHandle userHandle) {
183 return mUserCallIntentProcessor;
184 }
185 },
Hall Liu7c928322016-12-06 18:15:39 -0800186 mDefaultDialerCache,
Hall Liu0a6dd302015-12-16 15:06:49 -0800187 mSubscriptionManagerAdapter,
Hall Liuecda5542015-12-04 11:31:31 -0800188 mLock);
189 mTSIBinder = telecomServiceImpl.getBinder();
190 mComponentContextFixture.setTelecomManager(mTelecomManager);
191 when(mTelecomManager.getDefaultDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
192 when(mTelecomManager.getSystemDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
193
194 mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
195 mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
196
Hall Liu7c928322016-12-06 18:15:39 -0800197 when(mDefaultDialerCache.getDefaultDialerApplication(anyInt()))
198 .thenReturn(DEFAULT_DIALER_PACKAGE);
199 when(mDefaultDialerCache.isDefaultOrSystemDialer(eq(DEFAULT_DIALER_PACKAGE), anyInt()))
200 .thenReturn(true);
Hall Liuecda5542015-12-04 11:31:31 -0800201 }
202
Hall Liu84b6c872016-02-03 12:19:00 -0800203 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800204 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800205 public void testGetDefaultOutgoingPhoneAccount() throws RemoteException {
206 when(mFakePhoneAccountRegistrar
207 .getOutgoingPhoneAccountForScheme(eq("tel"), any(UserHandle.class)))
208 .thenReturn(TEL_PA_HANDLE_16);
209 when(mFakePhoneAccountRegistrar
210 .getOutgoingPhoneAccountForScheme(eq("sip"), any(UserHandle.class)))
211 .thenReturn(SIP_PA_HANDLE_17);
212 makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
213
214 PhoneAccountHandle returnedHandleTel
215 = mTSIBinder.getDefaultOutgoingPhoneAccount("tel", DEFAULT_DIALER_PACKAGE);
216 assertEquals(TEL_PA_HANDLE_16, returnedHandleTel);
217
218 PhoneAccountHandle returnedHandleSip
219 = mTSIBinder.getDefaultOutgoingPhoneAccount("sip", DEFAULT_DIALER_PACKAGE);
220 assertEquals(SIP_PA_HANDLE_17, returnedHandleSip);
221 }
222
Hall Liu84b6c872016-02-03 12:19:00 -0800223 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800224 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800225 public void testGetDefaultOutgoingPhoneAccountFailure() throws RemoteException {
226 // make sure that the list of user profiles doesn't include anything the PhoneAccountHandles
227 // are associated with
228
229 when(mFakePhoneAccountRegistrar
230 .getOutgoingPhoneAccountForScheme(eq("tel"), any(UserHandle.class)))
231 .thenReturn(TEL_PA_HANDLE_16);
232 when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(TEL_PA_HANDLE_16)).thenReturn(
233 makePhoneAccount(TEL_PA_HANDLE_16).build());
234 when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_READ_PHONE_STATE), anyInt(), anyString()))
235 .thenReturn(AppOpsManager.MODE_IGNORED);
236 doThrow(new SecurityException()).when(mContext)
237 .enforceCallingOrSelfPermission(eq(READ_PRIVILEGED_PHONE_STATE), anyString());
238
239 PhoneAccountHandle returnedHandleTel
240 = mTSIBinder.getDefaultOutgoingPhoneAccount("tel", "");
241 assertNull(returnedHandleTel);
242 }
243
Hall Liu84b6c872016-02-03 12:19:00 -0800244 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800245 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800246 public void testGetUserSelectedOutgoingPhoneAccount() throws RemoteException {
247 when(mFakePhoneAccountRegistrar.getUserSelectedOutgoingPhoneAccount(any(UserHandle.class)))
248 .thenReturn(TEL_PA_HANDLE_16);
249 when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(TEL_PA_HANDLE_16)).thenReturn(
250 makeMultiUserPhoneAccount(TEL_PA_HANDLE_16).build());
251
252 PhoneAccountHandle returnedHandle
253 = mTSIBinder.getUserSelectedOutgoingPhoneAccount();
254 assertEquals(TEL_PA_HANDLE_16, returnedHandle);
255 }
256
Hall Liu84b6c872016-02-03 12:19:00 -0800257 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800258 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800259 public void testSetUserSelectedOutgoingPhoneAccount() throws RemoteException {
260 mTSIBinder.setUserSelectedOutgoingPhoneAccount(TEL_PA_HANDLE_16);
261 verify(mFakePhoneAccountRegistrar)
262 .setUserSelectedOutgoingPhoneAccount(eq(TEL_PA_HANDLE_16), any(UserHandle.class));
263 }
264
Hall Liu84b6c872016-02-03 12:19:00 -0800265 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800266 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800267 public void testSetUserSelectedOutgoingPhoneAccountFailure() throws RemoteException {
268 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700269 anyString(), nullable(String.class));
Hall Liuecda5542015-12-04 11:31:31 -0800270 try {
271 mTSIBinder.setUserSelectedOutgoingPhoneAccount(TEL_PA_HANDLE_16);
272 } catch (SecurityException e) {
273 // desired result
274 }
275 verify(mFakePhoneAccountRegistrar, never())
276 .setUserSelectedOutgoingPhoneAccount(
277 any(PhoneAccountHandle.class), any(UserHandle.class));
278 }
279
Hall Liu84b6c872016-02-03 12:19:00 -0800280 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800281 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800282 public void testGetCallCapablePhoneAccounts() throws RemoteException {
283 List<PhoneAccountHandle> fullPHList = new ArrayList<PhoneAccountHandle>() {{
284 add(TEL_PA_HANDLE_16);
285 add(SIP_PA_HANDLE_17);
286 }};
287
288 List<PhoneAccountHandle> smallPHList = new ArrayList<PhoneAccountHandle>() {{
289 add(SIP_PA_HANDLE_17);
290 }};
291 // Returns all phone accounts when getCallCapablePhoneAccounts is called.
292 when(mFakePhoneAccountRegistrar
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700293 .getCallCapablePhoneAccounts(nullable(String.class), eq(true),
294 nullable(UserHandle.class))).thenReturn(fullPHList);
Hall Liuecda5542015-12-04 11:31:31 -0800295 // Returns only enabled phone accounts when getCallCapablePhoneAccounts is called.
296 when(mFakePhoneAccountRegistrar
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700297 .getCallCapablePhoneAccounts(nullable(String.class), eq(false),
298 nullable(UserHandle.class))).thenReturn(smallPHList);
Hall Liuecda5542015-12-04 11:31:31 -0800299 makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
300
301 assertEquals(fullPHList,
302 mTSIBinder.getCallCapablePhoneAccounts(true, DEFAULT_DIALER_PACKAGE));
303 assertEquals(smallPHList,
304 mTSIBinder.getCallCapablePhoneAccounts(false, DEFAULT_DIALER_PACKAGE));
305 }
306
Hall Liu84b6c872016-02-03 12:19:00 -0800307 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800308 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800309 public void testGetCallCapablePhoneAccountsFailure() throws RemoteException {
310 List<String> enforcedPermissions = new ArrayList<String>() {{
311 add(READ_PHONE_STATE);
312 add(READ_PRIVILEGED_PHONE_STATE);
313 }};
314 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
315 argThat(new AnyStringIn(enforcedPermissions)), anyString());
316
317 List<PhoneAccountHandle> result = null;
318 try {
319 result = mTSIBinder.getCallCapablePhoneAccounts(true, "");
320 } catch (SecurityException e) {
321 // intended behavior
322 }
323 assertNull(result);
324 verify(mFakePhoneAccountRegistrar, never())
325 .getCallCapablePhoneAccounts(anyString(), anyBoolean(), any(UserHandle.class));
326 }
327
Hall Liu84b6c872016-02-03 12:19:00 -0800328 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800329 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800330 public void testGetPhoneAccountsSupportingScheme() throws RemoteException {
331 List<PhoneAccountHandle> sipPHList = new ArrayList<PhoneAccountHandle>() {{
332 add(SIP_PA_HANDLE_17);
333 }};
334
335 List<PhoneAccountHandle> telPHList = new ArrayList<PhoneAccountHandle>() {{
336 add(TEL_PA_HANDLE_16);
337 }};
338 when(mFakePhoneAccountRegistrar
339 .getCallCapablePhoneAccounts(eq("tel"), anyBoolean(), any(UserHandle.class)))
340 .thenReturn(telPHList);
341 when(mFakePhoneAccountRegistrar
342 .getCallCapablePhoneAccounts(eq("sip"), anyBoolean(), any(UserHandle.class)))
343 .thenReturn(sipPHList);
344 makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
345
346 assertEquals(telPHList,
347 mTSIBinder.getPhoneAccountsSupportingScheme("tel", DEFAULT_DIALER_PACKAGE));
348 assertEquals(sipPHList,
349 mTSIBinder.getPhoneAccountsSupportingScheme("sip", DEFAULT_DIALER_PACKAGE));
350 }
351
Hall Liu84b6c872016-02-03 12:19:00 -0800352 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800353 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800354 public void testGetPhoneAccountsForPackage() throws RemoteException {
355 List<PhoneAccountHandle> phoneAccountHandleList = new ArrayList<PhoneAccountHandle>() {{
356 add(TEL_PA_HANDLE_16);
357 add(SIP_PA_HANDLE_17);
358 }};
359 when(mFakePhoneAccountRegistrar
360 .getPhoneAccountsForPackage(anyString(), any(UserHandle.class)))
361 .thenReturn(phoneAccountHandleList);
362 makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
363 assertEquals(phoneAccountHandleList,
364 mTSIBinder.getPhoneAccountsForPackage(
365 TEL_PA_HANDLE_16.getComponentName().getPackageName()));
366 }
367
Hall Liu84b6c872016-02-03 12:19:00 -0800368 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800369 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800370 public void testGetPhoneAccount() throws RemoteException {
371 makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_16, SIP_PA_HANDLE_17);
372 assertEquals(TEL_PA_HANDLE_16, mTSIBinder.getPhoneAccount(TEL_PA_HANDLE_16)
373 .getAccountHandle());
374 assertEquals(SIP_PA_HANDLE_17, mTSIBinder.getPhoneAccount(SIP_PA_HANDLE_17)
375 .getAccountHandle());
376 }
377
Hall Liu84b6c872016-02-03 12:19:00 -0800378 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800379 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800380 public void testGetAllPhoneAccounts() throws RemoteException {
381 List<PhoneAccount> phoneAccountList = new ArrayList<PhoneAccount>() {{
382 add(makePhoneAccount(TEL_PA_HANDLE_16).build());
383 add(makePhoneAccount(SIP_PA_HANDLE_17).build());
384 }};
385 when(mFakePhoneAccountRegistrar.getAllPhoneAccounts(any(UserHandle.class)))
386 .thenReturn(phoneAccountList);
387
388 assertEquals(2, mTSIBinder.getAllPhoneAccounts().size());
389 }
390
Hall Liu84b6c872016-02-03 12:19:00 -0800391 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800392 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800393 public void testRegisterPhoneAccount() throws RemoteException {
394 String packageNameToUse = "com.android.officialpackage";
395 PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
396 packageNameToUse, "cs"), "test", Binder.getCallingUserHandle());
397 PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
398 doReturn(PackageManager.PERMISSION_GRANTED)
399 .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
400
401 registerPhoneAccountTestHelper(phoneAccount, true);
402 }
403
Hall Liu84b6c872016-02-03 12:19:00 -0800404 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800405 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800406 public void testRegisterPhoneAccountWithoutModifyPermission() throws RemoteException {
407 // tests the case where the package does not have MODIFY_PHONE_STATE but is
408 // registering its own phone account as a third-party connection service
409 String packageNameToUse = "com.thirdparty.connectionservice";
410 PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
411 packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
412 PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
413
414 doReturn(PackageManager.PERMISSION_DENIED)
415 .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
416 PackageManager pm = mContext.getPackageManager();
417 when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(true);
418
419 registerPhoneAccountTestHelper(phoneAccount, true);
420 }
421
Hall Liu84b6c872016-02-03 12:19:00 -0800422 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800423 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800424 public void testRegisterPhoneAccountWithoutModifyPermissionFailure() throws RemoteException {
425 // tests the case where the third party package should not be allowed to register a phone
426 // account due to the lack of modify permission.
427 String packageNameToUse = "com.thirdparty.connectionservice";
428 PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
429 packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
430 PhoneAccount phoneAccount = makePhoneAccount(phHandle).build();
431
432 doReturn(PackageManager.PERMISSION_DENIED)
433 .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
434 PackageManager pm = mContext.getPackageManager();
435 when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(false);
436
437 registerPhoneAccountTestHelper(phoneAccount, false);
438 }
439
Hall Liu84b6c872016-02-03 12:19:00 -0800440 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800441 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800442 public void testRegisterPhoneAccountWithoutSimSubscriptionPermissionFailure()
443 throws RemoteException {
444 String packageNameToUse = "com.thirdparty.connectionservice";
445 PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
446 packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
447 PhoneAccount phoneAccount = makePhoneAccount(phHandle)
448 .setCapabilities(PhoneAccount.CAPABILITY_SIM_SUBSCRIPTION).build();
449
450 doReturn(PackageManager.PERMISSION_GRANTED)
451 .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
452 doThrow(new SecurityException())
453 .when(mContext)
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700454 .enforceCallingOrSelfPermission(eq(REGISTER_SIM_SUBSCRIPTION),
455 nullable(String.class));
Hall Liuecda5542015-12-04 11:31:31 -0800456
457 registerPhoneAccountTestHelper(phoneAccount, false);
458 }
459
Hall Liu84b6c872016-02-03 12:19:00 -0800460 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800461 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800462 public void testRegisterPhoneAccountWithoutMultiUserPermissionFailure()
463 throws Exception {
464 String packageNameToUse = "com.thirdparty.connectionservice";
465 PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
466 packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
467 PhoneAccount phoneAccount = makeMultiUserPhoneAccount(phHandle).build();
468
469 doReturn(PackageManager.PERMISSION_GRANTED)
470 .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
471
472 PackageManager packageManager = mContext.getPackageManager();
473 when(packageManager.getApplicationInfo(packageNameToUse, PackageManager.GET_META_DATA))
474 .thenReturn(new ApplicationInfo());
475
476 registerPhoneAccountTestHelper(phoneAccount, false);
477 }
478
479 private void registerPhoneAccountTestHelper(PhoneAccount testPhoneAccount,
480 boolean shouldSucceed) throws RemoteException {
481 ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
482 boolean didExceptionOccur = false;
483 try {
484 mTSIBinder.registerPhoneAccount(testPhoneAccount);
485 } catch (Exception e) {
486 didExceptionOccur = true;
487 }
488
489 if (shouldSucceed) {
490 assertFalse(didExceptionOccur);
491 verify(mFakePhoneAccountRegistrar).registerPhoneAccount(testPhoneAccount);
Hall Liuecda5542015-12-04 11:31:31 -0800492 } else {
493 assertTrue(didExceptionOccur);
494 verify(mFakePhoneAccountRegistrar, never())
495 .registerPhoneAccount(any(PhoneAccount.class));
Hall Liuecda5542015-12-04 11:31:31 -0800496 }
497 }
498
Hall Liu84b6c872016-02-03 12:19:00 -0800499 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800500 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800501 public void testUnregisterPhoneAccount() throws RemoteException {
502 String packageNameToUse = "com.android.officialpackage";
503 PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
504 packageNameToUse, "cs"), "test", Binder.getCallingUserHandle());
505
506 ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
507 doReturn(PackageManager.PERMISSION_GRANTED)
508 .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
509
510 mTSIBinder.unregisterPhoneAccount(phHandle);
511 verify(mFakePhoneAccountRegistrar).unregisterPhoneAccount(phHandle);
Hall Liuecda5542015-12-04 11:31:31 -0800512 }
513
Hall Liu84b6c872016-02-03 12:19:00 -0800514 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800515 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800516 public void testUnregisterPhoneAccountFailure() throws RemoteException {
517 String packageNameToUse = "com.thirdparty.connectionservice";
518 PhoneAccountHandle phHandle = new PhoneAccountHandle(new ComponentName(
519 packageNameToUse, "cs"), "asdf", Binder.getCallingUserHandle());
520
521 doReturn(PackageManager.PERMISSION_DENIED)
522 .when(mContext).checkCallingOrSelfPermission(MODIFY_PHONE_STATE);
523 PackageManager pm = mContext.getPackageManager();
524 when(pm.hasSystemFeature(PackageManager.FEATURE_CONNECTION_SERVICE)).thenReturn(false);
525
526 try {
527 mTSIBinder.unregisterPhoneAccount(phHandle);
528 } catch (UnsupportedOperationException e) {
529 // expected behavior
530 }
531 verify(mFakePhoneAccountRegistrar, never())
532 .unregisterPhoneAccount(any(PhoneAccountHandle.class));
533 verify(mContext, never())
534 .sendBroadcastAsUser(any(Intent.class), any(UserHandle.class), anyString());
535 }
536
Hall Liu84b6c872016-02-03 12:19:00 -0800537 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800538 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800539 public void testAddNewIncomingCall() throws Exception {
Brad Ebingerc34d4742016-02-23 16:58:48 -0800540 PhoneAccount phoneAccount = makePhoneAccount(TEL_PA_HANDLE_CURRENT).build();
541 phoneAccount.setIsEnabled(true);
542 doReturn(phoneAccount).when(mFakePhoneAccountRegistrar).getPhoneAccount(
543 eq(TEL_PA_HANDLE_CURRENT), any(UserHandle.class));
Hall Liuecda5542015-12-04 11:31:31 -0800544 doNothing().when(mAppOpsManager).checkPackage(anyInt(), anyString());
545 Bundle extras = createSampleExtras();
546
547 mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_CURRENT, extras);
548
549 addCallTestHelper(TelecomManager.ACTION_INCOMING_CALL,
550 CallIntentProcessor.KEY_IS_INCOMING_CALL, extras, false);
551 }
552
Hall Liu84b6c872016-02-03 12:19:00 -0800553 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800554 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800555 public void testAddNewIncomingCallFailure() throws Exception {
556 try {
557 mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_16, null);
558 } catch (SecurityException e) {
559 // expected
560 }
561
562 doThrow(new SecurityException()).when(mAppOpsManager).checkPackage(anyInt(), anyString());
563
564 try {
565 mTSIBinder.addNewIncomingCall(TEL_PA_HANDLE_CURRENT, null);
566 } catch (SecurityException e) {
567 // expected
568 }
569
570 // Verify that neither of these attempts got through
571 verify(mCallIntentProcessorAdapter, never())
572 .processIncomingCallIntent(any(CallsManager.class), any(Intent.class));
573 }
574
Hall Liu84b6c872016-02-03 12:19:00 -0800575 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800576 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800577 public void testAddNewUnknownCall() throws Exception {
Brad Ebingerc34d4742016-02-23 16:58:48 -0800578 PhoneAccount phoneAccount = makePhoneAccount(TEL_PA_HANDLE_CURRENT).build();
579 phoneAccount.setIsEnabled(true);
580 doReturn(phoneAccount).when(mFakePhoneAccountRegistrar).getPhoneAccount(
581 eq(TEL_PA_HANDLE_CURRENT), any(UserHandle.class));
Hall Liuecda5542015-12-04 11:31:31 -0800582 doNothing().when(mAppOpsManager).checkPackage(anyInt(), anyString());
583 Bundle extras = createSampleExtras();
584
585 mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_CURRENT, extras);
586
587 addCallTestHelper(TelecomManager.ACTION_NEW_UNKNOWN_CALL,
588 CallIntentProcessor.KEY_IS_UNKNOWN_CALL, extras, true);
589 }
590
Hall Liu84b6c872016-02-03 12:19:00 -0800591 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800592 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800593 public void testAddNewUnknownCallFailure() throws Exception {
594 try {
595 mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_16, null);
596 } catch (SecurityException e) {
597 // expected
598 }
599
600 doThrow(new SecurityException()).when(mAppOpsManager).checkPackage(anyInt(), anyString());
601
602 try {
603 mTSIBinder.addNewUnknownCall(TEL_PA_HANDLE_CURRENT, null);
604 } catch (SecurityException e) {
605 // expected
606 }
607
608 // Verify that neither of these attempts got through
609 verify(mCallIntentProcessorAdapter, never())
610 .processIncomingCallIntent(any(CallsManager.class), any(Intent.class));
611 }
612
613 private void addCallTestHelper(String expectedAction, String extraCallKey,
614 Bundle expectedExtras, boolean isUnknown) {
615 ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
616 if (isUnknown) {
617 verify(mCallIntentProcessorAdapter).processUnknownCallIntent(any(CallsManager.class),
618 intentCaptor.capture());
619 } else {
620 verify(mCallIntentProcessorAdapter).processIncomingCallIntent(any(CallsManager.class),
621 intentCaptor.capture());
622 }
623 Intent capturedIntent = intentCaptor.getValue();
624 assertEquals(expectedAction, capturedIntent.getAction());
625 Bundle intentExtras = capturedIntent.getExtras();
626 assertEquals(TEL_PA_HANDLE_CURRENT,
627 intentExtras.get(TelecomManager.EXTRA_PHONE_ACCOUNT_HANDLE));
628 assertTrue(intentExtras.getBoolean(extraCallKey));
629
630 if (isUnknown) {
631 for (String expectedKey : expectedExtras.keySet()) {
632 assertTrue(intentExtras.containsKey(expectedKey));
633 assertEquals(expectedExtras.get(expectedKey), intentExtras.get(expectedKey));
634 }
635 }
636 else {
637 assertTrue(areBundlesEqual(expectedExtras,
638 (Bundle) intentExtras.get(TelecomManager.EXTRA_INCOMING_CALL_EXTRAS)));
639 }
640 }
641
Hall Liu84b6c872016-02-03 12:19:00 -0800642 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800643 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800644 public void testPlaceCallWithNonEmergencyPermission() throws Exception {
645 Uri handle = Uri.parse("tel:6505551234");
646 Bundle extras = createSampleExtras();
647
648 when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
649 .thenReturn(AppOpsManager.MODE_ALLOWED);
650 doReturn(PackageManager.PERMISSION_GRANTED)
651 .when(mContext).checkCallingPermission(CALL_PHONE);
Tyler Gunnb652dad2018-03-27 18:49:49 +0000652 doReturn(PackageManager.PERMISSION_DENIED)
653 .when(mContext).checkCallingPermission(CALL_PRIVILEGED);
Hall Liuecda5542015-12-04 11:31:31 -0800654
655 mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
656 placeCallTestHelper(handle, extras, true);
657 }
658
Hall Liu84b6c872016-02-03 12:19:00 -0800659 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800660 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800661 public void testPlaceCallWithAppOpsOff() throws Exception {
662 Uri handle = Uri.parse("tel:6505551234");
663 Bundle extras = createSampleExtras();
664
665 when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
666 .thenReturn(AppOpsManager.MODE_IGNORED);
667 doReturn(PackageManager.PERMISSION_GRANTED)
668 .when(mContext).checkCallingPermission(CALL_PHONE);
Tyler Gunnb652dad2018-03-27 18:49:49 +0000669 doReturn(PackageManager.PERMISSION_DENIED)
670 .when(mContext).checkCallingPermission(CALL_PRIVILEGED);
Hall Liuecda5542015-12-04 11:31:31 -0800671
672 mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
673 placeCallTestHelper(handle, extras, false);
674 }
675
Hall Liu84b6c872016-02-03 12:19:00 -0800676 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800677 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800678 public void testPlaceCallWithNoCallingPermission() throws Exception {
679 Uri handle = Uri.parse("tel:6505551234");
680 Bundle extras = createSampleExtras();
681
682 when(mAppOpsManager.noteOp(eq(AppOpsManager.OP_CALL_PHONE), anyInt(), anyString()))
683 .thenReturn(AppOpsManager.MODE_ALLOWED);
684 doReturn(PackageManager.PERMISSION_DENIED)
685 .when(mContext).checkCallingPermission(CALL_PHONE);
Tyler Gunnb652dad2018-03-27 18:49:49 +0000686 doReturn(PackageManager.PERMISSION_DENIED)
687 .when(mContext).checkCallingPermission(CALL_PRIVILEGED);
Hall Liuecda5542015-12-04 11:31:31 -0800688
689 mTSIBinder.placeCall(handle, extras, DEFAULT_DIALER_PACKAGE);
690 placeCallTestHelper(handle, extras, false);
691 }
692
693 private void placeCallTestHelper(Uri expectedHandle, Bundle expectedExtras,
694 boolean shouldNonEmergencyBeAllowed) {
695 ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
696 verify(mUserCallIntentProcessor).processIntent(intentCaptor.capture(), anyString(),
Tyler Gunnb652dad2018-03-27 18:49:49 +0000697 eq(shouldNonEmergencyBeAllowed), eq(true));
Hall Liuecda5542015-12-04 11:31:31 -0800698 Intent capturedIntent = intentCaptor.getValue();
699 assertEquals(Intent.ACTION_CALL, capturedIntent.getAction());
700 assertEquals(expectedHandle, capturedIntent.getData());
701 assertTrue(areBundlesEqual(expectedExtras, capturedIntent.getExtras()));
702 }
703
Hall Liu84b6c872016-02-03 12:19:00 -0800704 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800705 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800706 public void testPlaceCallFailure() throws Exception {
707 Uri handle = Uri.parse("tel:6505551234");
708 Bundle extras = createSampleExtras();
709
710 doThrow(new SecurityException())
711 .when(mContext).enforceCallingOrSelfPermission(eq(CALL_PHONE), anyString());
712
713 try {
714 mTSIBinder.placeCall(handle, extras, "arbitrary_package_name");
715 } catch (SecurityException e) {
716 // expected
717 }
718
719 verify(mUserCallIntentProcessor, never())
Tyler Gunnb652dad2018-03-27 18:49:49 +0000720 .processIntent(any(Intent.class), anyString(), anyBoolean(), eq(true));
Hall Liuecda5542015-12-04 11:31:31 -0800721 }
722
Hall Liu84b6c872016-02-03 12:19:00 -0800723 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800724 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800725 public void testSetDefaultDialer() throws Exception {
726 String packageName = "sample.package";
Hall Liu7c928322016-12-06 18:15:39 -0800727 int currentUser = ActivityManager.getCurrentUser();
Hall Liuecda5542015-12-04 11:31:31 -0800728
Hall Liu7c928322016-12-06 18:15:39 -0800729 when(mDefaultDialerCache.setDefaultDialer(eq(packageName), eq(currentUser)))
730 .thenReturn(true);
Hall Liuecda5542015-12-04 11:31:31 -0800731
732 mTSIBinder.setDefaultDialer(packageName);
733
Hall Liu7c928322016-12-06 18:15:39 -0800734 verify(mDefaultDialerCache).setDefaultDialer(eq(packageName), eq(currentUser));
Hall Liuecda5542015-12-04 11:31:31 -0800735 ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
736 verify(mContext).sendBroadcastAsUser(intentCaptor.capture(), any(UserHandle.class));
737 Intent capturedIntent = intentCaptor.getValue();
738 assertEquals(TelecomManager.ACTION_DEFAULT_DIALER_CHANGED, capturedIntent.getAction());
739 String packageNameExtra = capturedIntent.getStringExtra(
740 TelecomManager.EXTRA_CHANGE_DEFAULT_DIALER_PACKAGE_NAME);
741 assertEquals(packageName, packageNameExtra);
742 }
743
Hall Liu84b6c872016-02-03 12:19:00 -0800744 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800745 @Test
Hall Liuecda5542015-12-04 11:31:31 -0800746 public void testSetDefaultDialerNoModifyPhoneStatePermission() throws Exception {
747 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700748 eq(MODIFY_PHONE_STATE), nullable(String.class));
Hall Liuecda5542015-12-04 11:31:31 -0800749 setDefaultDialerFailureTestHelper();
750 }
751
Hall Liu84b6c872016-02-03 12:19:00 -0800752 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800753 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800754 public void testSetDefaultDialerNoWriteSecureSettingsPermission() throws Exception {
Hall Liuecda5542015-12-04 11:31:31 -0800755 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700756 eq(WRITE_SECURE_SETTINGS), nullable(String.class));
Hall Liuecda5542015-12-04 11:31:31 -0800757 setDefaultDialerFailureTestHelper();
758 }
759
760 private void setDefaultDialerFailureTestHelper() throws Exception {
761 boolean exceptionThrown = false;
762 try {
763 mTSIBinder.setDefaultDialer(DEFAULT_DIALER_PACKAGE);
764 } catch (SecurityException e) {
765 exceptionThrown = true;
766 }
767 assertTrue(exceptionThrown);
Hall Liu7c928322016-12-06 18:15:39 -0800768 verify(mDefaultDialerCache, never()).setDefaultDialer(anyString(), anyInt());
Hall Liuecda5542015-12-04 11:31:31 -0800769 verify(mContext, never()).sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
770 }
771
Hall Liu84b6c872016-02-03 12:19:00 -0800772 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800773 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800774 public void testIsVoicemailNumber() throws Exception {
775 String vmNumber = "010";
776 makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_CURRENT);
777
778 doReturn(true).when(mFakePhoneAccountRegistrar).isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
779 vmNumber);
780 assertTrue(mTSIBinder.isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
781 vmNumber, DEFAULT_DIALER_PACKAGE));
782 }
783
Hall Liu84b6c872016-02-03 12:19:00 -0800784 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800785 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800786 public void testIsVoicemailNumberAccountNotVisibleFailure() throws Exception {
787 String vmNumber = "010";
788
789 doReturn(true).when(mFakePhoneAccountRegistrar).isVoiceMailNumber(TEL_PA_HANDLE_CURRENT,
790 vmNumber);
791
792 when(mFakePhoneAccountRegistrar.getPhoneAccount(TEL_PA_HANDLE_CURRENT,
793 Binder.getCallingUserHandle())).thenReturn(null);
794 assertFalse(mTSIBinder
795 .isVoiceMailNumber(TEL_PA_HANDLE_CURRENT, vmNumber, DEFAULT_DIALER_PACKAGE));
796 }
797
Hall Liu84b6c872016-02-03 12:19:00 -0800798 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800799 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800800 public void testGetVoicemailNumberWithNullAccountHandle() throws Exception {
801 when(mFakePhoneAccountRegistrar.getPhoneAccount(isNull(PhoneAccountHandle.class),
802 eq(Binder.getCallingUserHandle())))
803 .thenReturn(makePhoneAccount(TEL_PA_HANDLE_CURRENT).build());
804 int subId = 58374;
805 String vmNumber = "543";
806 doReturn(subId).when(mSubscriptionManagerAdapter).getDefaultVoiceSubId();
807
808 TelephonyManager mockTelephonyManager =
809 (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
810 when(mockTelephonyManager.getVoiceMailNumber(subId)).thenReturn(vmNumber);
811
812 assertEquals(vmNumber, mTSIBinder.getVoiceMailNumber(null, DEFAULT_DIALER_PACKAGE));
813 }
814
Hall Liu84b6c872016-02-03 12:19:00 -0800815 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800816 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800817 public void testGetVoicemailNumberWithNonNullAccountHandle() throws Exception {
818 when(mFakePhoneAccountRegistrar.getPhoneAccount(eq(TEL_PA_HANDLE_CURRENT),
819 eq(Binder.getCallingUserHandle())))
820 .thenReturn(makePhoneAccount(TEL_PA_HANDLE_CURRENT).build());
821 int subId = 58374;
822 String vmNumber = "543";
823
824 TelephonyManager mockTelephonyManager =
825 (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
826 when(mockTelephonyManager.getVoiceMailNumber(subId)).thenReturn(vmNumber);
827 when(mFakePhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(TEL_PA_HANDLE_CURRENT))
828 .thenReturn(subId);
829
830 assertEquals(vmNumber,
831 mTSIBinder.getVoiceMailNumber(TEL_PA_HANDLE_CURRENT, DEFAULT_DIALER_PACKAGE));
832 }
833
Hall Liu84b6c872016-02-03 12:19:00 -0800834 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800835 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800836 public void testGetLine1Number() throws Exception {
837 int subId = 58374;
838 String line1Number = "9482752023479";
839 makeAccountsVisibleToAllUsers(TEL_PA_HANDLE_CURRENT);
840 when(mFakePhoneAccountRegistrar.getSubscriptionIdForPhoneAccount(TEL_PA_HANDLE_CURRENT))
841 .thenReturn(subId);
842 TelephonyManager mockTelephonyManager =
843 (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
Shishir Agrawalce688742016-01-25 15:02:21 -0800844 when(mockTelephonyManager.getLine1Number(subId)).thenReturn(line1Number);
Hall Liu0a6dd302015-12-16 15:06:49 -0800845
846 assertEquals(line1Number,
847 mTSIBinder.getLine1Number(TEL_PA_HANDLE_CURRENT, DEFAULT_DIALER_PACKAGE));
848 }
849
Hall Liu84b6c872016-02-03 12:19:00 -0800850 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800851 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800852 public void testEndCallWithRingingForegroundCall() throws Exception {
853 Call call = mock(Call.class);
854 when(call.getState()).thenReturn(CallState.RINGING);
855 when(mFakeCallsManager.getForegroundCall()).thenReturn(call);
Tyler Gunnb652dad2018-03-27 18:49:49 +0000856 assertTrue(mTSIBinder.endCall(TEST_PACKAGE));
857 verify(call).reject(eq(false), isNull(), eq(TEST_PACKAGE));
Hall Liu0a6dd302015-12-16 15:06:49 -0800858 }
859
Hall Liu84b6c872016-02-03 12:19:00 -0800860 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800861 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800862 public void testEndCallWithNonRingingForegroundCall() throws Exception {
863 Call call = mock(Call.class);
864 when(call.getState()).thenReturn(CallState.ACTIVE);
865 when(mFakeCallsManager.getForegroundCall()).thenReturn(call);
Tyler Gunnb652dad2018-03-27 18:49:49 +0000866 assertTrue(mTSIBinder.endCall(TEST_PACKAGE));
867 verify(call).disconnect(eq(0L), eq(TEST_PACKAGE));
Hall Liu0a6dd302015-12-16 15:06:49 -0800868 }
869
Hall Liu84b6c872016-02-03 12:19:00 -0800870 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800871 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800872 public void testEndCallWithNoForegroundCall() throws Exception {
873 Call call = mock(Call.class);
874 when(call.getState()).thenReturn(CallState.ACTIVE);
Philip P. Moltmann3168f6a2017-11-22 15:55:59 -0800875 when(mFakeCallsManager.getFirstCallWithState(any()))
Hall Liu0a6dd302015-12-16 15:06:49 -0800876 .thenReturn(call);
Tyler Gunnb652dad2018-03-27 18:49:49 +0000877 assertTrue(mTSIBinder.endCall(TEST_PACKAGE));
878 verify(call).disconnect(eq(0L), eq(TEST_PACKAGE));
Hall Liu0a6dd302015-12-16 15:06:49 -0800879 }
880
Hall Liu84b6c872016-02-03 12:19:00 -0800881 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800882 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800883 public void testEndCallWithNoCalls() throws Exception {
Tyler Gunn587fc272018-02-07 16:07:29 -0800884 assertFalse(mTSIBinder.endCall(null));
Hall Liu0a6dd302015-12-16 15:06:49 -0800885 }
886
Hall Liu84b6c872016-02-03 12:19:00 -0800887 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800888 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800889 public void testAcceptRingingCall() throws Exception {
890 Call call = mock(Call.class);
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700891 when(mFakeCallsManager.getFirstCallWithState(anyInt())).thenReturn(call);
Hall Liu0a6dd302015-12-16 15:06:49 -0800892 // Not intended to be a real video state. Here to ensure that the call will be answered
893 // with whatever video state it's currently in.
894 int fakeVideoState = 29578215;
895 when(call.getVideoState()).thenReturn(fakeVideoState);
Eugene Suslaccba7202017-02-10 10:56:53 -0800896 mTSIBinder.acceptRingingCall("");
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700897 verify(call).answer(eq(fakeVideoState));
Hall Liu0a6dd302015-12-16 15:06:49 -0800898 }
899
Hall Liu84b6c872016-02-03 12:19:00 -0800900 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800901 @Test
Hall Liu0a6dd302015-12-16 15:06:49 -0800902 public void testAcceptRingingCallWithValidVideoState() throws Exception {
903 Call call = mock(Call.class);
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700904 when(mFakeCallsManager.getFirstCallWithState(anyInt())).thenReturn(call);
Hall Liu0a6dd302015-12-16 15:06:49 -0800905 // Not intended to be a real video state. Here to ensure that the call will be answered
906 // with the video state passed in to acceptRingingCallWithVideoState
907 int fakeVideoState = 29578215;
908 int realVideoState = VideoProfile.STATE_RX_ENABLED | VideoProfile.STATE_TX_ENABLED;
909 when(call.getVideoState()).thenReturn(fakeVideoState);
Eugene Suslaccba7202017-02-10 10:56:53 -0800910 mTSIBinder.acceptRingingCallWithVideoState("", realVideoState);
Hall Liu0a6dd302015-12-16 15:06:49 -0800911 verify(call).answer(realVideoState);
912 }
913
Tyler Gunnbaf105b2017-04-11 15:21:03 -0700914 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800915 @Test
Tyler Gunnbaf105b2017-04-11 15:21:03 -0700916 public void testIsInCall() throws Exception {
917 when(mFakeCallsManager.hasOngoingCalls()).thenReturn(true);
918 assertTrue(mTSIBinder.isInCall(DEFAULT_DIALER_PACKAGE));
919 }
920
921 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800922 @Test
Tyler Gunnbaf105b2017-04-11 15:21:03 -0700923 public void testNotIsInCall() throws Exception {
924 when(mFakeCallsManager.hasOngoingCalls()).thenReturn(false);
925 assertFalse(mTSIBinder.isInCall(DEFAULT_DIALER_PACKAGE));
926 }
927
928 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800929 @Test
Tyler Gunnbaf105b2017-04-11 15:21:03 -0700930 public void testIsInCallFail() throws Exception {
931 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
932 anyString(), any());
933 try {
934 mTSIBinder.isInCall("blah");
935 fail();
936 } catch (SecurityException e) {
937 // desired result
938 }
939 verify(mFakeCallsManager, never()).hasOngoingCalls();
940 }
941
942 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800943 @Test
Tyler Gunnbaf105b2017-04-11 15:21:03 -0700944 public void testIsInManagedCall() throws Exception {
945 when(mFakeCallsManager.hasOngoingManagedCalls()).thenReturn(true);
946 assertTrue(mTSIBinder.isInManagedCall(DEFAULT_DIALER_PACKAGE));
947 }
948
949 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800950 @Test
Tyler Gunnbaf105b2017-04-11 15:21:03 -0700951 public void testNotIsInManagedCall() throws Exception {
952 when(mFakeCallsManager.hasOngoingManagedCalls()).thenReturn(false);
953 assertFalse(mTSIBinder.isInManagedCall(DEFAULT_DIALER_PACKAGE));
954 }
955
956 @SmallTest
Hall Liu74bb6352017-12-27 18:23:28 -0800957 @Test
Tyler Gunnbaf105b2017-04-11 15:21:03 -0700958 public void testIsInManagedCallFail() throws Exception {
959 doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
960 anyString(), any());
961 try {
962 mTSIBinder.isInManagedCall("blah");
963 fail();
964 } catch (SecurityException e) {
965 // desired result
966 }
967 verify(mFakeCallsManager, never()).hasOngoingCalls();
968 }
969
Hall Liuecda5542015-12-04 11:31:31 -0800970 /**
971 * Register phone accounts for the supplied PhoneAccountHandles to make them
972 * visible to all users (via the isVisibleToCaller method in TelecomServiceImpl.
973 * @param handles the handles for which phone accounts should be created for.
974 */
975 private void makeAccountsVisibleToAllUsers(PhoneAccountHandle... handles) {
976 for (PhoneAccountHandle ph : handles) {
977 when(mFakePhoneAccountRegistrar.getPhoneAccountUnchecked(eq(ph))).thenReturn(
978 makeMultiUserPhoneAccount(ph).build());
979 when(mFakePhoneAccountRegistrar
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700980 .getPhoneAccount(eq(ph), nullable(UserHandle.class), anyBoolean()))
Hall Liuecda5542015-12-04 11:31:31 -0800981 .thenReturn(makeMultiUserPhoneAccount(ph).build());
Hall Liu0a6dd302015-12-16 15:06:49 -0800982 when(mFakePhoneAccountRegistrar
Brad Ebingerd0fe76e2017-03-20 13:17:15 -0700983 .getPhoneAccount(eq(ph), nullable(UserHandle.class)))
Hall Liu0a6dd302015-12-16 15:06:49 -0800984 .thenReturn(makeMultiUserPhoneAccount(ph).build());
Hall Liuecda5542015-12-04 11:31:31 -0800985 }
986 }
987
988 private PhoneAccount.Builder makeMultiUserPhoneAccount(PhoneAccountHandle paHandle) {
989 PhoneAccount.Builder paBuilder = makePhoneAccount(paHandle);
990 paBuilder.setCapabilities(PhoneAccount.CAPABILITY_MULTI_USER);
991 return paBuilder;
992 }
993
994 private PhoneAccount.Builder makePhoneAccount(PhoneAccountHandle paHandle) {
995 return new PhoneAccount.Builder(paHandle, "testLabel");
996 }
997
998 private Bundle createSampleExtras() {
999 Bundle extras = new Bundle();
1000 extras.putString("test_key", "test_value");
1001 return extras;
1002 }
1003
1004 private static boolean areBundlesEqual(Bundle b1, Bundle b2) {
1005 for (String key1 : b1.keySet()) {
1006 if (!b1.get(key1).equals(b2.get(key1))) {
1007 return false;
1008 }
1009 }
1010
1011 for (String key2 : b2.keySet()) {
1012 if (!b2.get(key2).equals(b1.get(key2))) {
1013 return false;
1014 }
1015 }
1016 return true;
1017 }
1018}