CallLogManagerTest.java revision 98e6bdc795585b0d332a7eb86245926c8d80609a
1/*
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
19
20import android.content.ComponentName;
21import android.content.ContentProvider;
22import android.content.ContentValues;
23import android.content.Context;
24import android.content.IContentProvider;
25import android.content.pm.UserInfo;
26import android.net.Uri;
27import android.os.UserHandle;
28import android.os.UserManager;
29import android.provider.CallLog;
30import android.provider.CallLog.Calls;
31import android.telecom.DisconnectCause;
32import android.telecom.PhoneAccount;
33import android.telecom.PhoneAccountHandle;
34import android.telecom.VideoProfile;
35
36import com.android.server.telecom.Call;
37import com.android.server.telecom.CallLogManager;
38import com.android.server.telecom.CallState;
39import com.android.server.telecom.PhoneAccountRegistrar;
40import com.android.server.telecom.TelephonyUtil;
41
42import static org.mockito.Matchers.any;
43import static org.mockito.Matchers.eq;
44import static org.mockito.Mockito.mock;
45import static org.mockito.Mockito.timeout;
46import static org.mockito.Mockito.verify;
47import static org.mockito.Mockito.when;
48
49import org.mockito.ArgumentCaptor;
50import org.mockito.Mock;
51
52import java.util.Arrays;
53
54public class CallLogManagerTest extends TelecomTestCase {
55
56    private CallLogManager mCallLogManager;
57    private IContentProvider mContentProvider;
58    private PhoneAccountHandle mDefaultAccountHandle;
59    private PhoneAccountHandle mOtherUserAccountHandle;
60    private PhoneAccountHandle mManagedProfileAccountHandle;
61
62    private static final Uri TEL_PHONEHANDLE = Uri.parse("tel:5555551234");
63
64    private static final PhoneAccountHandle EMERGENCY_ACCT_HANDLE = TelephonyUtil
65            .getDefaultEmergencyPhoneAccount()
66            .getAccountHandle();
67
68    private static final int NO_VIDEO_STATE = VideoProfile.STATE_AUDIO_ONLY;
69    private static final int BIDIRECTIONAL_VIDEO_STATE = VideoProfile.STATE_BIDIRECTIONAL;
70    private static final String POST_DIAL_STRING = ";12345";
71    private static final String TEST_PHONE_ACCOUNT_ID= "testPhoneAccountId";
72
73    private static final int TEST_TIMEOUT_MILLIS = 100;
74    private static final int CURRENT_USER_ID = 0;
75    private static final int OTHER_USER_ID = 10;
76    private static final int MANAGED_USER_ID = 11;
77
78    @Mock
79    PhoneAccountRegistrar mMockPhoneAccountRegistrar;
80
81
82    @Override
83    public void setUp() throws Exception {
84        super.setUp();
85        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
86        mCallLogManager = new CallLogManager(mContext, mMockPhoneAccountRegistrar);
87        mContentProvider = mContext.getContentResolver().acquireProvider("test");
88        mDefaultAccountHandle = new PhoneAccountHandle(
89                new ComponentName("com.android.server.telecom.tests", "CallLogManagerTest"),
90                TEST_PHONE_ACCOUNT_ID,
91                UserHandle.of(CURRENT_USER_ID)
92        );
93
94        mOtherUserAccountHandle = new PhoneAccountHandle(
95                new ComponentName("com.android.server.telecom.tests", "CallLogManagerTest"),
96                TEST_PHONE_ACCOUNT_ID,
97                UserHandle.of(OTHER_USER_ID)
98        );
99
100        mManagedProfileAccountHandle = new PhoneAccountHandle(
101                new ComponentName("com.android.server.telecom.tests", "CallLogManagerTest"),
102                TEST_PHONE_ACCOUNT_ID,
103                UserHandle.of(MANAGED_USER_ID)
104        );
105
106        UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
107        UserInfo userInfo = new UserInfo(CURRENT_USER_ID, "test", 0);
108        UserInfo otherUserInfo = new UserInfo(OTHER_USER_ID, "test2", 0);
109        UserInfo managedProfileUserInfo = new UserInfo(OTHER_USER_ID, "test3",
110                UserInfo.FLAG_MANAGED_PROFILE);
111
112        when(userManager.isUserRunning(any(UserHandle.class))).thenReturn(true);
113        when(userManager.hasUserRestriction(any(String.class), any(UserHandle.class)))
114                .thenReturn(false);
115        when(userManager.getUsers(any(Boolean.class)))
116                .thenReturn(Arrays.asList(userInfo, otherUserInfo, managedProfileUserInfo));
117        when(userManager.getUserInfo(eq(CURRENT_USER_ID))).thenReturn(userInfo);
118        when(userManager.getUserInfo(eq(OTHER_USER_ID))).thenReturn(otherUserInfo);
119        when(userManager.getUserInfo(eq(MANAGED_USER_ID))).thenReturn(managedProfileUserInfo);
120    }
121
122    public void testDontLogCancelledCall() {
123        Call fakeCall = makeFakeCall(
124                DisconnectCause.CANCELED,
125                false, // isConference
126                false, // isIncoming
127                1L, // creationTimeMillis
128                1000L, // ageMillis
129                TEL_PHONEHANDLE, // callHandle
130                mDefaultAccountHandle, // phoneAccountHandle
131                NO_VIDEO_STATE, // callVideoState
132                POST_DIAL_STRING, // postDialDigits,
133                UserHandle.of(CURRENT_USER_ID)
134        );
135        mCallLogManager.onCallStateChanged(fakeCall, CallState.DIALING, CallState.DISCONNECTED);
136        verifyNoInsertion();
137        mCallLogManager.onCallStateChanged(fakeCall, CallState.DIALING, CallState.ABORTED);
138        verifyNoInsertion();
139    }
140
141    public void testDontLogChoosingAccountCall() {
142        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
143                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
144        Call fakeCall = makeFakeCall(
145                DisconnectCause.OTHER, // disconnectCauseCode
146                false, // isConference
147                false, // isIncoming
148                1L, // creationTimeMillis
149                1000L, // ageMillis
150                TEL_PHONEHANDLE, // callHandle
151                mDefaultAccountHandle, // phoneAccountHandle
152                NO_VIDEO_STATE, // callVideoState
153                POST_DIAL_STRING, // postDialDigits
154                UserHandle.of(CURRENT_USER_ID)
155        );
156        mCallLogManager.onCallStateChanged(fakeCall, CallState.SELECT_PHONE_ACCOUNT,
157                CallState.DISCONNECTED);
158        verifyNoInsertion();
159    }
160
161    public void testDontLogCallsFromEmergencyAccount() {
162        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
163                .thenReturn(makeFakePhoneAccount(EMERGENCY_ACCT_HANDLE, 0));
164        mComponentContextFixture.putBooleanResource(R.bool.allow_emergency_numbers_in_call_log,
165                false);
166        Call fakeCall = makeFakeCall(
167                DisconnectCause.OTHER, // disconnectCauseCode
168                false, // isConference
169                false, // isIncoming
170                1L, // creationTimeMillis
171                1000L, // ageMillis
172                TEL_PHONEHANDLE, // callHandle
173                EMERGENCY_ACCT_HANDLE, // phoneAccountHandle
174                NO_VIDEO_STATE, // callVideoState
175                POST_DIAL_STRING, // postDialDigits,
176                UserHandle.of(CURRENT_USER_ID)
177        );
178        mCallLogManager.onCallStateChanged(fakeCall, CallState.ACTIVE, CallState.DISCONNECTED);
179        verifyNoInsertion();
180    }
181
182    public void testLogCallDirectionOutgoing() {
183        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
184                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
185        Call fakeOutgoingCall = makeFakeCall(
186                DisconnectCause.OTHER, // disconnectCauseCode
187                false, // isConference
188                false, // isIncoming
189                1L, // creationTimeMillis
190                1000L, // ageMillis
191                TEL_PHONEHANDLE, // callHandle
192                mDefaultAccountHandle, // phoneAccountHandle
193                NO_VIDEO_STATE, // callVideoState
194                POST_DIAL_STRING, // postDialDigits
195                UserHandle.of(CURRENT_USER_ID)
196        );
197        mCallLogManager.onCallStateChanged(fakeOutgoingCall, CallState.ACTIVE,
198                CallState.DISCONNECTED);
199        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
200        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
201                Integer.valueOf(CallLog.Calls.OUTGOING_TYPE));
202    }
203
204    public void testLogCallDirectionIncoming() {
205        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
206                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
207        Call fakeIncomingCall = makeFakeCall(
208                DisconnectCause.OTHER, // disconnectCauseCode
209                false, // isConference
210                true, // isIncoming
211                1L, // creationTimeMillis
212                1000L, // ageMillis
213                TEL_PHONEHANDLE, // callHandle
214                mDefaultAccountHandle, // phoneAccountHandle
215                NO_VIDEO_STATE, // callVideoState
216                POST_DIAL_STRING, // postDialDigits
217                null
218        );
219        mCallLogManager.onCallStateChanged(fakeIncomingCall, CallState.ACTIVE,
220                CallState.DISCONNECTED);
221        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
222        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
223                Integer.valueOf(CallLog.Calls.INCOMING_TYPE));
224    }
225
226    public void testLogCallDirectionMissed() {
227        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
228                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
229        Call fakeMissedCall = makeFakeCall(
230                DisconnectCause.MISSED, // disconnectCauseCode
231                false, // isConference
232                true, // isIncoming
233                1L, // creationTimeMillis
234                1000L, // ageMillis
235                TEL_PHONEHANDLE, // callHandle
236                mDefaultAccountHandle, // phoneAccountHandle
237                NO_VIDEO_STATE, // callVideoState
238                POST_DIAL_STRING, // postDialDigits
239                null
240        );
241
242        mCallLogManager.onCallStateChanged(fakeMissedCall, CallState.ACTIVE,
243                CallState.DISCONNECTED);
244        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
245        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
246                Integer.valueOf(CallLog.Calls.MISSED_TYPE));
247    }
248
249    public void testCreationTimeAndAge() {
250        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
251                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
252        long currentTime = System.currentTimeMillis();
253        long duration = 1000L;
254        Call fakeCall = makeFakeCall(
255                DisconnectCause.OTHER, // disconnectCauseCode
256                false, // isConference
257                false, // isIncoming
258                currentTime, // creationTimeMillis
259                duration, // ageMillis
260                TEL_PHONEHANDLE, // callHandle
261                mDefaultAccountHandle, // phoneAccountHandle
262                NO_VIDEO_STATE, // callVideoState
263                POST_DIAL_STRING, // postDialDigits
264                UserHandle.of(CURRENT_USER_ID)
265        );
266        mCallLogManager.onCallStateChanged(fakeCall, CallState.ACTIVE, CallState.DISCONNECTED);
267        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
268        assertEquals(insertedValues.getAsLong(CallLog.Calls.DATE),
269                Long.valueOf(currentTime));
270        assertEquals(insertedValues.getAsLong(CallLog.Calls.DURATION),
271                Long.valueOf(duration / 1000));
272    }
273
274    public void testLogPhoneAccountId() {
275        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
276                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
277        Call fakeCall = makeFakeCall(
278                DisconnectCause.OTHER, // disconnectCauseCode
279                false, // isConference
280                true, // isIncoming
281                1L, // creationTimeMillis
282                1000L, // ageMillis
283                TEL_PHONEHANDLE, // callHandle
284                mDefaultAccountHandle, // phoneAccountHandle
285                NO_VIDEO_STATE, // callVideoState
286                POST_DIAL_STRING, // postDialDigits
287                UserHandle.of(CURRENT_USER_ID)
288        );
289        mCallLogManager.onCallStateChanged(fakeCall, CallState.ACTIVE, CallState.DISCONNECTED);
290        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
291        assertEquals(insertedValues.getAsString(CallLog.Calls.PHONE_ACCOUNT_ID),
292                TEST_PHONE_ACCOUNT_ID);
293    }
294
295    public void testLogCorrectPhoneNumber() {
296        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
297                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
298        Call fakeCall = makeFakeCall(
299                DisconnectCause.OTHER, // disconnectCauseCode
300                false, // isConference
301                true, // isIncoming
302                1L, // creationTimeMillis
303                1000L, // ageMillis
304                TEL_PHONEHANDLE, // callHandle
305                mDefaultAccountHandle, // phoneAccountHandle
306                NO_VIDEO_STATE, // callVideoState
307                POST_DIAL_STRING, // postDialDigits
308                UserHandle.of(CURRENT_USER_ID)
309        );
310        mCallLogManager.onCallStateChanged(fakeCall, CallState.ACTIVE, CallState.DISCONNECTED);
311        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
312        assertEquals(insertedValues.getAsString(CallLog.Calls.NUMBER),
313                TEL_PHONEHANDLE.getSchemeSpecificPart());
314        assertEquals(insertedValues.getAsString(CallLog.Calls.POST_DIAL_DIGITS), POST_DIAL_STRING);
315    }
316
317    public void testLogCallVideoFeatures() {
318        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
319                .thenReturn(makeFakePhoneAccount(mDefaultAccountHandle, CURRENT_USER_ID));
320        Call fakeVideoCall = makeFakeCall(
321                DisconnectCause.OTHER, // disconnectCauseCode
322                false, // isConference
323                true, // isIncoming
324                1L, // creationTimeMillis
325                1000L, // ageMillis
326                TEL_PHONEHANDLE, // callHandle
327                mDefaultAccountHandle, // phoneAccountHandle
328                BIDIRECTIONAL_VIDEO_STATE, // callVideoState
329                POST_DIAL_STRING, // postDialDigits
330                UserHandle.of(CURRENT_USER_ID)
331        );
332        mCallLogManager.onCallStateChanged(fakeVideoCall, CallState.ACTIVE, CallState.DISCONNECTED);
333        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
334        assertTrue((insertedValues.getAsInteger(CallLog.Calls.FEATURES)
335                & CallLog.Calls.FEATURES_VIDEO) == CallLog.Calls.FEATURES_VIDEO);
336    }
337
338    public void testLogCallDirectionOutgoingWithMultiUserCapability() {
339        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
340                .thenReturn(makeFakePhoneAccount(mOtherUserAccountHandle,
341                        PhoneAccount.CAPABILITY_MULTI_USER));
342        Call fakeOutgoingCall = makeFakeCall(
343                DisconnectCause.OTHER, // disconnectCauseCode
344                false, // isConference
345                false, // isIncoming
346                1L, // creationTimeMillis
347                1000L, // ageMillis
348                TEL_PHONEHANDLE, // callHandle
349                mDefaultAccountHandle, // phoneAccountHandle
350                NO_VIDEO_STATE, // callVideoState
351                POST_DIAL_STRING, // postDialDigits
352                UserHandle.of(CURRENT_USER_ID)
353        );
354        mCallLogManager.onCallStateChanged(fakeOutgoingCall, CallState.ACTIVE,
355                CallState.DISCONNECTED);
356
357        // Outgoing call placed through a phone account with multi user capability is inserted to
358        // all users except managed profile.
359        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
360        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
361                Integer.valueOf(CallLog.Calls.OUTGOING_TYPE));
362        insertedValues = verifyInsertionWithCapture(OTHER_USER_ID);
363        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
364                Integer.valueOf(CallLog.Calls.OUTGOING_TYPE));
365        verifyNoInsertionInUser(MANAGED_USER_ID);
366    }
367
368    public void testLogCallDirectionIncomingWithMultiUserCapability() {
369        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
370                .thenReturn(makeFakePhoneAccount(mOtherUserAccountHandle,
371                        PhoneAccount.CAPABILITY_MULTI_USER));
372        Call fakeIncomingCall = makeFakeCall(
373                DisconnectCause.OTHER, // disconnectCauseCode
374                false, // isConference
375                true, // isIncoming
376                1L, // creationTimeMillis
377                1000L, // ageMillis
378                TEL_PHONEHANDLE, // callHandle
379                mDefaultAccountHandle, // phoneAccountHandle
380                NO_VIDEO_STATE, // callVideoState
381                POST_DIAL_STRING, // postDialDigits
382                null
383        );
384        mCallLogManager.onCallStateChanged(fakeIncomingCall, CallState.ACTIVE,
385                CallState.DISCONNECTED);
386
387        // Incoming call using a phone account with multi user capability is inserted to all users
388        // except managed profile.
389        ContentValues insertedValues = verifyInsertionWithCapture(CURRENT_USER_ID);
390        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
391                Integer.valueOf(CallLog.Calls.INCOMING_TYPE));
392        insertedValues = verifyInsertionWithCapture(OTHER_USER_ID);
393        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
394                Integer.valueOf(CallLog.Calls.INCOMING_TYPE));
395        verifyNoInsertionInUser(MANAGED_USER_ID);
396    }
397
398
399    public void testLogCallDirectionOutgoingWithMultiUserCapabilityFromManagedProfile() {
400        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
401                .thenReturn(makeFakePhoneAccount(mManagedProfileAccountHandle,
402                        PhoneAccount.CAPABILITY_MULTI_USER));
403        Call fakeOutgoingCall = makeFakeCall(
404                DisconnectCause.OTHER, // disconnectCauseCode
405                false, // isConference
406                false, // isIncoming
407                1L, // creationTimeMillis
408                1000L, // ageMillis
409                TEL_PHONEHANDLE, // callHandle
410                mManagedProfileAccountHandle, // phoneAccountHandle
411                NO_VIDEO_STATE, // callVideoState
412                POST_DIAL_STRING, // postDialDigits
413                UserHandle.of(MANAGED_USER_ID)
414        );
415        mCallLogManager.onCallStateChanged(fakeOutgoingCall, CallState.ACTIVE,
416                CallState.DISCONNECTED);
417
418        // Outgoing call placed through work dialer should be inserted to managed profile only.
419        verifyNoInsertionInUser(CURRENT_USER_ID);
420        verifyNoInsertionInUser(OTHER_USER_ID);
421        ContentValues insertedValues = verifyInsertionWithCapture(MANAGED_USER_ID);
422        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
423                Integer.valueOf(CallLog.Calls.OUTGOING_TYPE));
424    }
425
426    public void testLogCallDirectionOutgoingFromManagedProfile() {
427        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
428                .thenReturn(makeFakePhoneAccount(mManagedProfileAccountHandle, 0));
429        Call fakeOutgoingCall = makeFakeCall(
430                DisconnectCause.OTHER, // disconnectCauseCode
431                false, // isConference
432                false, // isIncoming
433                1L, // creationTimeMillis
434                1000L, // ageMillis
435                TEL_PHONEHANDLE, // callHandle
436                mManagedProfileAccountHandle, // phoneAccountHandle
437                NO_VIDEO_STATE, // callVideoState
438                POST_DIAL_STRING, // postDialDigits
439                UserHandle.of(MANAGED_USER_ID)
440        );
441        mCallLogManager.onCallStateChanged(fakeOutgoingCall, CallState.ACTIVE,
442                CallState.DISCONNECTED);
443
444        // Outgoing call using phone account in managed profile should be inserted to managed
445        // profile only.
446        verifyNoInsertionInUser(CURRENT_USER_ID);
447        verifyNoInsertionInUser(OTHER_USER_ID);
448        ContentValues insertedValues = verifyInsertionWithCapture(MANAGED_USER_ID);
449        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
450                Integer.valueOf(CallLog.Calls.OUTGOING_TYPE));
451    }
452
453    public void testLogCallDirectionIngoingFromManagedProfile() {
454        when(mMockPhoneAccountRegistrar.getPhoneAccountUnchecked(any(PhoneAccountHandle.class)))
455                .thenReturn(makeFakePhoneAccount(mManagedProfileAccountHandle, 0));
456        Call fakeOutgoingCall = makeFakeCall(
457                DisconnectCause.OTHER, // disconnectCauseCode
458                false, // isConference
459                true, // isIncoming
460                1L, // creationTimeMillis
461                1000L, // ageMillis
462                TEL_PHONEHANDLE, // callHandle
463                mManagedProfileAccountHandle, // phoneAccountHandle
464                NO_VIDEO_STATE, // callVideoState
465                POST_DIAL_STRING, // postDialDigits
466                null
467        );
468        mCallLogManager.onCallStateChanged(fakeOutgoingCall, CallState.ACTIVE,
469                CallState.DISCONNECTED);
470
471        // Incoming call using phone account in managed profile should be inserted to managed
472        // profile only.
473        verifyNoInsertionInUser(CURRENT_USER_ID);
474        verifyNoInsertionInUser(OTHER_USER_ID);
475        ContentValues insertedValues = verifyInsertionWithCapture(MANAGED_USER_ID);
476        assertEquals(insertedValues.getAsInteger(CallLog.Calls.TYPE),
477                Integer.valueOf(Calls.INCOMING_TYPE));
478    }
479
480
481    private void verifyNoInsertion() {
482        try {
483            verify(mContentProvider, timeout(TEST_TIMEOUT_MILLIS).never()).insert(any(String.class),
484                    any(Uri.class), any(ContentValues.class));
485        } catch (android.os.RemoteException e) {
486            fail("Remote exception occurred during test execution");
487        }
488    }
489
490
491    private void verifyNoInsertionInUser(int userId) {
492        try {
493            Uri uri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI, userId);
494            verify(mContentProvider, timeout(TEST_TIMEOUT_MILLIS).never()).insert(any(String.class),
495                    eq(uri), any(ContentValues.class));
496        } catch (android.os.RemoteException e) {
497            fail("Remote exception occurred during test execution");
498        }
499    }
500
501    private ContentValues verifyInsertionWithCapture(int userId) {
502        ArgumentCaptor<ContentValues> captor = ArgumentCaptor.forClass(ContentValues.class);
503        try {
504            Uri uri = ContentProvider.maybeAddUserId(CallLog.Calls.CONTENT_URI, userId);
505            verify(mContentProvider, timeout(TEST_TIMEOUT_MILLIS)).insert(any(String.class),
506                    eq(uri), captor.capture());
507        } catch (android.os.RemoteException e) {
508            fail("Remote exception occurred during test execution");
509        }
510
511        return captor.getValue();
512    }
513
514
515    private Call makeFakeCall(int disconnectCauseCode, boolean isConference, boolean isIncoming,
516            long creationTimeMillis, long ageMillis, Uri callHandle,
517            PhoneAccountHandle phoneAccountHandle, int callVideoState,
518            String postDialDigits, UserHandle initiatingUser) {
519        Call fakeCall = mock(Call.class);
520        when(fakeCall.getDisconnectCause()).thenReturn(
521                new DisconnectCause(disconnectCauseCode));
522        when(fakeCall.isConference()).thenReturn(isConference);
523        when(fakeCall.isIncoming()).thenReturn(isIncoming);
524        when(fakeCall.getCreationTimeMillis()).thenReturn(creationTimeMillis);
525        when(fakeCall.getAgeMillis()).thenReturn(ageMillis);
526        when(fakeCall.getOriginalHandle()).thenReturn(callHandle);
527        when(fakeCall.getTargetPhoneAccount()).thenReturn(phoneAccountHandle);
528        when(fakeCall.getVideoStateHistory()).thenReturn(callVideoState);
529        when(fakeCall.getPostDialDigits()).thenReturn(postDialDigits);
530        when(fakeCall.getInitiatingUser()).thenReturn(initiatingUser);
531        return fakeCall;
532    }
533
534    private PhoneAccount makeFakePhoneAccount(PhoneAccountHandle phoneAccountHandle,
535            int capabilities) {
536        return PhoneAccount.builder(phoneAccountHandle, "testing")
537                .setCapabilities(capabilities).build();
538    }
539}
540