1220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu/* 2220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * Copyright (C) 2015 The Android Open Source Project 3220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * 4220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * Licensed under the Apache License, Version 2.0 (the "License"); 5220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * you may not use this file except in compliance with the License. 6220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * You may obtain a copy of the License at 7220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * 8220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * http://www.apache.org/licenses/LICENSE-2.0 9220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * 10220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * Unless required by applicable law or agreed to in writing, software 11220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * distributed under the License is distributed on an "AS IS" BASIS, 12220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * See the License for the specific language governing permissions and 14220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu * limitations under the License 15220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu */ 16220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 17220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liupackage com.android.server.telecom.tests; 18220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 19220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.Manifest; 20220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.app.Activity; 21220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.app.AppOpsManager; 22220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.content.BroadcastReceiver; 23220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.content.ComponentName; 24220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.content.Context; 25220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.content.Intent; 26220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.net.Uri; 27220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.os.Bundle; 28220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.os.Handler; 29220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.os.UserHandle; 30220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.telecom.GatewayInfo; 31220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.telecom.TelecomManager; 32220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.telecom.VideoProfile; 33220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport android.telephony.DisconnectCause; 3484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liuimport android.test.suitebuilder.annotation.SmallTest; 35220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 36220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport com.android.server.telecom.Call; 37220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport com.android.server.telecom.CallsManager; 38220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport com.android.server.telecom.NewOutgoingCallIntentBroadcaster; 39220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport com.android.server.telecom.PhoneNumberUtilsAdapter; 40220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport com.android.server.telecom.PhoneNumberUtilsAdapterImpl; 41c9cf54407720d32fdb1b69e0254657a6061b9f56Hall Liuimport com.android.server.telecom.TelecomSystem; 42220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 43220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport org.mockito.ArgumentCaptor; 44220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport org.mockito.Mock; 45220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 46d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebingerimport static org.mockito.ArgumentMatchers.nullable; 47220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Matchers.any; 48220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Matchers.anyBoolean; 49220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Matchers.anyInt; 50220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Matchers.anyString; 51220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Matchers.eq; 52220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Matchers.isNotNull; 53220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Matchers.isNull; 54220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Mockito.doReturn; 55220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Mockito.never; 56220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Mockito.spy; 57220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liuimport static org.mockito.Mockito.verify; 58508b280a3e2090fcc49fe5953047d4122ce9ecbeHall Liuimport static org.mockito.Mockito.when; 59220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 60220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liupublic class NewOutgoingCallIntentBroadcasterTest extends TelecomTestCase { 61220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private static class ReceiverIntentPair { 62220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public BroadcastReceiver receiver; 63220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public Intent intent; 64220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 65220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public ReceiverIntentPair(BroadcastReceiver receiver, Intent intent) { 66220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu this.receiver = receiver; 67220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu this.intent = intent; 68220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 69220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 70220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 71220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu @Mock private CallsManager mCallsManager; 72220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu @Mock private Call mCall; 73220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 74220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private PhoneNumberUtilsAdapter mPhoneNumberUtilsAdapterSpy; 75220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 76220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu @Override 77220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void setUp() throws Exception { 78220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu super.setUp(); 79220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu mContext = mComponentContextFixture.getTestDouble().getApplicationContext(); 80220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu mPhoneNumberUtilsAdapterSpy = spy(new PhoneNumberUtilsAdapterImpl()); 81508b280a3e2090fcc49fe5953047d4122ce9ecbeHall Liu when(mCall.getInitiatingUser()).thenReturn(UserHandle.CURRENT); 82c9cf54407720d32fdb1b69e0254657a6061b9f56Hall Liu when(mCallsManager.getLock()).thenReturn(new TelecomSystem.SyncRoot() { }); 83220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 84220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 8584b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 86220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testNullHandle() { 87220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = new Intent(Intent.ACTION_CALL, null); 88220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, true); 89220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(DisconnectCause.INVALID_NUMBER, result); 90220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoBroadcastSent(); 91220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoCallPlaced(); 92220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 93220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 9484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 95220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testVoicemailCall() { 96220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu String voicemailNumber = "voicemail:18005551234"; 97220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(voicemailNumber)); 98220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, true); 99220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 100220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, true); 101220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 102220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(DisconnectCause.NOT_DISCONNECTED, result); 103220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mCallsManager).placeOutgoingCall(eq(mCall), eq(Uri.parse(voicemailNumber)), 104d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger nullable(GatewayInfo.class), eq(true), eq(VideoProfile.STATE_AUDIO_ONLY)); 105220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 106220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 10784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 108220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testVoicemailCallWithBadAction() { 109220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu badCallActionHelper(Uri.parse("voicemail:18005551234"), DisconnectCause.OUTGOING_CANCELED); 110220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 111220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 11284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 113220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testTelCallWithBadCallAction() { 114220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu badCallActionHelper(Uri.parse("tel:6505551234"), DisconnectCause.INVALID_NUMBER); 115220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 116220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 11784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 118220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testSipCallWithBadCallAction() { 119220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu badCallActionHelper(Uri.parse("sip:testuser@testsite.com"), DisconnectCause.INVALID_NUMBER); 120220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 121220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 122220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private void badCallActionHelper(Uri handle, int expectedCode) { 123220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = new Intent(Intent.ACTION_ALARM_CHANGED, handle); 124220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 125220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, true); 126220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 127220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(expectedCode, result); 128220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoBroadcastSent(); 129220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoCallPlaced(); 130220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 131220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 13284b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 133e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal public void testAlreadyDisconnectedCall() { 134e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal Uri handle = Uri.parse("tel:6505551234"); 135e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal doReturn(true).when(mCall).isDisconnected(); 136e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal Intent callIntent = buildIntent(handle, Intent.ACTION_CALL, null); 137e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal ReceiverIntentPair result = regularCallTestHelper(callIntent, null); 138e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal 139e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal result.receiver.setResultData( 140e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal result.intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 141e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal 142e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal result.receiver.onReceive(mContext, result.intent); 143e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal verifyNoCallPlaced(); 144e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal } 145e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal 146e6143f57856972ba21b5c6fb711c93ac2e477cc7Sanket Agarwal @SmallTest 147220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testNoNumberSupplied() { 148220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:"); 149220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = new Intent(Intent.ACTION_CALL, handle); 150220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 151220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, true); 152220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 153220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(DisconnectCause.NO_PHONE_NUMBER_SUPPLIED, result); 154220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoBroadcastSent(); 155220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoCallPlaced(); 156220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 157220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 15884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 159220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testEmergencyCallWithNonDefaultDialer() { 160220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551911"); 161220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu doReturn(true).when(mPhoneNumberUtilsAdapterSpy).isPotentialLocalEmergencyNumber( 162220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(Context.class), eq(handle.getSchemeSpecificPart())); 163220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = new Intent(Intent.ACTION_CALL, handle); 164220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 165220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu String ui_package_string = "sample_string_1"; 166220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu String dialer_default_class_string = "sample_string_2"; 167220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu mComponentContextFixture.putResource(R.string.ui_default_package, ui_package_string); 168220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu mComponentContextFixture.putResource(R.string.dialer_default_class, 169220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu dialer_default_class_string); 170220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 171220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, false); 172220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 173220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(DisconnectCause.OUTGOING_CANCELED, result); 174220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoBroadcastSent(); 175220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoCallPlaced(); 176220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 177220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ArgumentCaptor<Intent> dialerIntentCaptor = ArgumentCaptor.forClass(Intent.class); 178220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mContext).startActivityAsUser(dialerIntentCaptor.capture(), any(UserHandle.class)); 179220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent dialerIntent = dialerIntentCaptor.getValue(); 180220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(new ComponentName(ui_package_string, dialer_default_class_string), 181220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu dialerIntent.getComponent()); 182220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(Intent.ACTION_DIAL, dialerIntent.getAction()); 183220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(handle, dialerIntent.getData()); 184220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(Intent.FLAG_ACTIVITY_NEW_TASK, dialerIntent.getFlags()); 185220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 186220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 18784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 188220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testActionCallEmergencyCall() { 189220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551911"); 190220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = buildIntent(handle, Intent.ACTION_CALL, null); 191220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu emergencyCallTestHelper(intent, null); 192220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 193220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 19484b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 195220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testActionEmergencyWithEmergencyNumber() { 196220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551911"); 197220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = buildIntent(handle, Intent.ACTION_CALL_EMERGENCY, null); 198220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu emergencyCallTestHelper(intent, null); 199220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 200220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 20184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 202220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testActionPrivCallWithEmergencyNumber() { 203220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551911"); 204220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = buildIntent(handle, Intent.ACTION_CALL_PRIVILEGED, null); 205220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu emergencyCallTestHelper(intent, null); 206220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 207220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 20884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 209220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testEmergencyCallWithGatewayExtras() { 210220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551911"); 211220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Bundle gatewayExtras = new Bundle(); 212220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu gatewayExtras.putString(NewOutgoingCallIntentBroadcaster.EXTRA_GATEWAY_PROVIDER_PACKAGE, 213220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu "sample1"); 214220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu gatewayExtras.putString(NewOutgoingCallIntentBroadcaster.EXTRA_GATEWAY_URI, "sample2"); 215220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 216220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = buildIntent(handle, Intent.ACTION_CALL, gatewayExtras); 217220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu emergencyCallTestHelper(intent, gatewayExtras); 218220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 219220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 22084b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 221220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testActionEmergencyWithNonEmergencyNumber() { 222220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551911"); 223220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu doReturn(false).when(mPhoneNumberUtilsAdapterSpy).isPotentialLocalEmergencyNumber( 224220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(Context.class), eq(handle.getSchemeSpecificPart())); 225220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent intent = new Intent(Intent.ACTION_CALL_EMERGENCY, handle); 226220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, true); 227220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 228220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(DisconnectCause.OUTGOING_CANCELED, result); 229220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoCallPlaced(); 230220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoBroadcastSent(); 231220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 232220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 233220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private void emergencyCallTestHelper(Intent intent, Bundle expectedAdditionalExtras) { 234220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = intent.getData(); 235220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int videoState = VideoProfile.STATE_BIDIRECTIONAL; 236220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu boolean isSpeakerphoneOn = true; 237220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu doReturn(true).when(mPhoneNumberUtilsAdapterSpy).isPotentialLocalEmergencyNumber( 238220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(Context.class), eq(handle.getSchemeSpecificPart())); 239220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, isSpeakerphoneOn); 240220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, videoState); 241220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, true); 242220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 243220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(DisconnectCause.NOT_DISCONNECTED, result); 244220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mCallsManager).placeOutgoingCall(eq(mCall), eq(handle), isNull(GatewayInfo.class), 245220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(isSpeakerphoneOn), eq(videoState)); 246220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 247220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Bundle expectedExtras = createNumberExtras(handle.getSchemeSpecificPart()); 248220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu if (expectedAdditionalExtras != null) { 249220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu expectedExtras.putAll(expectedAdditionalExtras); 250220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 251220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu BroadcastReceiver receiver = verifyBroadcastSent(handle.getSchemeSpecificPart(), 252220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu expectedExtras).receiver; 253220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertNull(receiver); 254220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 255220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 25684b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 257220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testUnmodifiedRegularCall() { 258220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551234"); 259220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent callIntent = buildIntent(handle, Intent.ACTION_CALL, null); 260220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ReceiverIntentPair result = regularCallTestHelper(callIntent, null); 261220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 262220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.setResultData( 263220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 264220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 265220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.onReceive(mContext, result.intent); 266220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 267220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mCallsManager).placeOutgoingCall(eq(mCall), eq(handle), isNull(GatewayInfo.class), 268220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(true), eq(VideoProfile.STATE_BIDIRECTIONAL)); 269220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 270220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 27184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 272220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testUnmodifiedSipCall() { 273220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("sip:test@test.com"); 274220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent callIntent = buildIntent(handle, Intent.ACTION_CALL, null); 275220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ReceiverIntentPair result = regularCallTestHelper(callIntent, null); 276220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 277220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.setResultData( 278220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 279220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 280220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.onReceive(mContext, result.intent); 281220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 282220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri encHandle = Uri.fromParts(handle.getScheme(), 283220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu handle.getSchemeSpecificPart(), null); 284220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mCallsManager).placeOutgoingCall(eq(mCall), eq(encHandle), isNull(GatewayInfo.class), 285220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(true), eq(VideoProfile.STATE_BIDIRECTIONAL)); 286220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 287220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 28884b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 289220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testCallWithGatewayInfo() { 290220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551234"); 291220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent callIntent = buildIntent(handle, Intent.ACTION_CALL, null); 292220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 293220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu callIntent.putExtra(NewOutgoingCallIntentBroadcaster 294220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu .EXTRA_GATEWAY_PROVIDER_PACKAGE, "sample1"); 295220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu callIntent.putExtra(NewOutgoingCallIntentBroadcaster.EXTRA_GATEWAY_URI, "sample2"); 296220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ReceiverIntentPair result = regularCallTestHelper(callIntent, callIntent.getExtras()); 297220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 298220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.setResultData( 299220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER)); 300220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 301220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.onReceive(mContext, result.intent); 302220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 303220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mCallsManager).placeOutgoingCall(eq(mCall), eq(handle), 304220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu isNotNull(GatewayInfo.class), eq(true), eq(VideoProfile.STATE_BIDIRECTIONAL)); 305220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 306220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 30784b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 308220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testCallNumberModifiedToNull() { 309220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551234"); 310220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent callIntent = buildIntent(handle, Intent.ACTION_CALL, null); 311220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ReceiverIntentPair result = regularCallTestHelper(callIntent, null); 312220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 313220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.setResultData(null); 314220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 315220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.onReceive(mContext, result.intent); 316220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verifyNoCallPlaced(); 31763e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu ArgumentCaptor<Long> timeoutCaptor = ArgumentCaptor.forClass(Long.class); 31863e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu verify(mCall).disconnect(timeoutCaptor.capture()); 31963e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu assertTrue(timeoutCaptor.getValue() > 0); 32063e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu } 32163e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu 32263e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu @SmallTest 32363e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu public void testCallNumberModifiedToNullWithLongCustomTimeout() { 32463e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu Uri handle = Uri.parse("tel:6505551234"); 32563e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu Intent callIntent = buildIntent(handle, Intent.ACTION_CALL, null); 32663e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu ReceiverIntentPair result = regularCallTestHelper(callIntent, null); 32763e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu 32863e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu long customTimeout = 100000000; 32963e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu Bundle bundle = new Bundle(); 33063e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu bundle.putLong(TelecomManager.EXTRA_NEW_OUTGOING_CALL_CANCEL_TIMEOUT, customTimeout); 33163e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu result.receiver.setResultData(null); 33263e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu result.receiver.setResultExtras(bundle); 33363e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu 33463e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu result.receiver.onReceive(mContext, result.intent); 33563e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu verifyNoCallPlaced(); 33663e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu ArgumentCaptor<Long> timeoutCaptor = ArgumentCaptor.forClass(Long.class); 33763e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu verify(mCall).disconnect(timeoutCaptor.capture()); 33863e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu assertTrue(timeoutCaptor.getValue() < customTimeout); 339220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 340220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 34184b6c878ba75be8d4fee99af8da31a55ab50b99cHall Liu @SmallTest 342220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu public void testCallModifiedToEmergency() { 343220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = Uri.parse("tel:6505551234"); 344220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent callIntent = buildIntent(handle, Intent.ACTION_CALL, null); 345220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ReceiverIntentPair result = regularCallTestHelper(callIntent, null); 346220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 347220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu String newEmergencyNumber = "1234567890"; 348220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.setResultData(newEmergencyNumber); 349220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 350220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu doReturn(true).when(mPhoneNumberUtilsAdapterSpy).isPotentialLocalEmergencyNumber( 351220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(Context.class), eq(newEmergencyNumber)); 352220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu result.receiver.onReceive(mContext, result.intent); 35363e690cba4c50577c6dcfc98ca1d7e5f1b1fc3c4Hall Liu verify(mCall).disconnect(eq(0L)); 354220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 355220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 356220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private ReceiverIntentPair regularCallTestHelper(Intent intent, 357220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Bundle expectedAdditionalExtras) { 358220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Uri handle = intent.getData(); 359220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int videoState = VideoProfile.STATE_BIDIRECTIONAL; 360220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu boolean isSpeakerphoneOn = true; 361220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_SPEAKERPHONE, isSpeakerphoneOn); 362220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu intent.putExtra(TelecomManager.EXTRA_START_CALL_WITH_VIDEO_STATE, videoState); 363220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 364220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu int result = processIntent(intent, true); 365220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 366220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(DisconnectCause.NOT_DISCONNECTED, result); 367220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Bundle expectedExtras = createNumberExtras(handle.getSchemeSpecificPart()); 368220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu if (expectedAdditionalExtras != null) { 369220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu expectedExtras.putAll(expectedAdditionalExtras); 370220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 371220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return verifyBroadcastSent(handle.getSchemeSpecificPart(), expectedExtras); 372220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 373220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 374220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private Intent buildIntent(Uri handle, String action, Bundle extras) { 375220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent i = new Intent(action, handle); 376220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu if (extras != null) { 377220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu i.putExtras(extras); 378220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 379220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return i; 380220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 381220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 382220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private int processIntent(Intent intent, 383220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu boolean isDefaultPhoneApp) { 384220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu NewOutgoingCallIntentBroadcaster b = new NewOutgoingCallIntentBroadcaster( 385220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu mContext, mCallsManager, mCall, intent, mPhoneNumberUtilsAdapterSpy, 386220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu isDefaultPhoneApp); 387220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return b.processIntent(); 388220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 389220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 390220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private ReceiverIntentPair verifyBroadcastSent(String number, Bundle expectedExtras) { 391220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); 392220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ArgumentCaptor<BroadcastReceiver> receiverCaptor = 393220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu ArgumentCaptor.forClass(BroadcastReceiver.class); 394220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 395220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mContext).sendOrderedBroadcastAsUser( 396220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu intentCaptor.capture(), 397220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(UserHandle.CURRENT), 398220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(Manifest.permission.PROCESS_OUTGOING_CALLS), 399220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(AppOpsManager.OP_PROCESS_OUTGOING_CALLS), 400220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu receiverCaptor.capture(), 401220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu isNull(Handler.class), 402220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(Activity.RESULT_OK), 403220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu eq(number), 404220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu isNull(Bundle.class)); 405220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 406220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Intent capturedIntent = intentCaptor.getValue(); 407220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertEquals(Intent.ACTION_NEW_OUTGOING_CALL, capturedIntent.getAction()); 40868d17c62b6bbd608cdd6668be5488836e7393909Brad Ebinger assertEquals(Intent.FLAG_RECEIVER_FOREGROUND | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND, 40968d17c62b6bbd608cdd6668be5488836e7393909Brad Ebinger capturedIntent.getFlags()); 410220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu assertTrue(areBundlesEqual(expectedExtras, capturedIntent.getExtras())); 411220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 412220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu BroadcastReceiver receiver = receiverCaptor.getValue(); 413220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu if (receiver != null) { 414220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu receiver.setPendingResult( 415220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu new BroadcastReceiver.PendingResult(0, "", null, 0, true, false, null, 0, 0)); 416220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 417220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 418220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return new ReceiverIntentPair(receiver, capturedIntent); 419220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 420220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 421220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private Bundle createNumberExtras(String number) { 422220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu Bundle b = new Bundle(); 423220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu b.putString(Intent.EXTRA_PHONE_NUMBER, number); 424220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return b; 425220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 426220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 427220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private void verifyNoCallPlaced() { 428220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mCallsManager, never()).placeOutgoingCall(any(Call.class), any(Uri.class), 429220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(GatewayInfo.class), anyBoolean(), anyInt()); 430220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 431220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 432220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private void verifyNoBroadcastSent() { 433220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu verify(mContext, never()).sendOrderedBroadcastAsUser( 434220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(Intent.class), 435220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(UserHandle.class), 436220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu anyString(), 437220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu anyInt(), 438220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(BroadcastReceiver.class), 439220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(Handler.class), 440220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu anyInt(), 441220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu anyString(), 442220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu any(Bundle.class)); 443220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 444220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 445220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu private static boolean areBundlesEqual(Bundle b1, Bundle b2) { 446220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu for (String key1 : b1.keySet()) { 447220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu if (!b1.get(key1).equals(b2.get(key1))) { 448220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return false; 449220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 450220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 451220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu 452220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu for (String key2 : b2.keySet()) { 453220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu if (!b2.get(key2).equals(b1.get(key2))) { 454220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return false; 455220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 456220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 457220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu return true; 458220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu } 459220b419bb5d1b4d1df08415c8e52cb7f0decbf7cHall Liu} 460