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