16d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu/*
26d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * Copyright (C) 2016 The Android Open Source Project
36d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu *
46d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * Licensed under the Apache License, Version 2.0 (the "License");
56d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * you may not use this file except in compliance with the License.
66d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * You may obtain a copy of the License at
76d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu *
86d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu *      http://www.apache.org/licenses/LICENSE-2.0
96d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu *
106d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * Unless required by applicable law or agreed to in writing, software
116d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * distributed under the License is distributed on an "AS IS" BASIS,
126d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * See the License for the specific language governing permissions and
146d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu * limitations under the License
156d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu */
166d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
176d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liupackage com.android.server.telecom.tests;
186d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.Manifest;
196d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.content.ComponentName;
206d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.content.Context;
216d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.content.Intent;
226d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.content.ServiceConnection;
236d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.content.pm.PackageManager;
246d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.content.pm.ResolveInfo;
256d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.content.pm.ServiceInfo;
266d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.os.IBinder;
276d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.os.RemoteException;
286d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.os.UserHandle;
296d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.telecom.CallScreeningService;
306d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.telecom.ParcelableCall;
316d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport android.test.suitebuilder.annotation.SmallTest;
326d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
336d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.internal.telecom.ICallScreeningAdapter;
346d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.internal.telecom.ICallScreeningService;
356d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.Call;
366d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.CallsManager;
377c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liuimport com.android.server.telecom.DefaultDialerCache;
386d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.ParcelableCallUtils;
396d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.PhoneAccountRegistrar;
406d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.TelecomServiceImpl;
416d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.callfiltering.CallFilterResultCallback;
426d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.callfiltering.CallFilteringResult;
436d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.callfiltering.CallScreeningServiceFilter;
446d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport com.android.server.telecom.TelecomSystem;
456d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
466d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport org.mockito.ArgumentCaptor;
476d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport org.mockito.Mock;
486d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
496d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport java.util.Collections;
506d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
51d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebingerimport static org.mockito.ArgumentMatchers.nullable;
526d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Matchers.any;
536d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Matchers.anyBoolean;
546d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Matchers.anyInt;
556d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Matchers.anyString;
566d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Matchers.eq;
576d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Mockito.doReturn;
586d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Mockito.doThrow;
596d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Mockito.mock;
606d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Mockito.verify;
616d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liuimport static org.mockito.Mockito.when;
626d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
636d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liupublic class CallScreeningServiceFilterTest extends TelecomTestCase {
646d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock Context mContext;
656d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock CallsManager mCallsManager;
666d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock PhoneAccountRegistrar mPhoneAccountRegistrar;
677c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu    @Mock DefaultDialerCache mDefaultDialerCache;
687c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu    @Mock ParcelableCallUtils.Converter mParcelableCallUtilsConverter;
696d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
706d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
716d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock Call mCall;
726d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock CallFilterResultCallback mCallback;
736d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
746d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock PackageManager mPackageManager;
756d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock IBinder mBinder;
766d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Mock ICallScreeningService mCallScreeningService;
776d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
786d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private static final String PKG_NAME = "com.android.services.telecom.tests";
796d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private static final String CLS_NAME = "CallScreeningService";
806d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private static final ComponentName COMPONENT_NAME = new ComponentName(PKG_NAME, CLS_NAME);
816d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private static final String CALL_ID = "u89prgt9ps78y5";
826d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
836d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private ResolveInfo mResolveInfo;
846d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
856d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private static final CallFilteringResult PASS_RESULT = new CallFilteringResult(
866d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            true, // shouldAllowCall
876d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            false, // shouldReject
886d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            true, // shouldAddToCallLog
896d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            true // shouldShowNotification
906d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    );
916d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
926d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private CallScreeningServiceFilter mFilter;
936d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @Override
946d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void setUp() throws Exception {
956d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        super.setUp();
966d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        when(mCallsManager.getCurrentUserHandle()).thenReturn(UserHandle.CURRENT);
976d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        when(mContext.getPackageManager()).thenReturn(mPackageManager);
986d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        when(mCall.getId()).thenReturn(CALL_ID);
996d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu//        when(mBinder.queryLocalInterface(anyString())).thenReturn(mCallScreeningService);
1006d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        doReturn(mCallScreeningService).when(mBinder).queryLocalInterface(anyString());
1016d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1026d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mResolveInfo =  new ResolveInfo() {{
1036d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            serviceInfo = new ServiceInfo();
1046d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            serviceInfo.packageName = PKG_NAME;
1056d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            serviceInfo.name = CLS_NAME;
1066d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu            serviceInfo.permission = Manifest.permission.BIND_SCREENING_SERVICE;
1076d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        }};
1086d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1096d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter = new CallScreeningServiceFilter(mContext, mCallsManager, mPhoneAccountRegistrar,
1107c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                mDefaultDialerCache, mParcelableCallUtilsConverter, mLock);
1116d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1127c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        when(mDefaultDialerCache.getDefaultDialerApplication(eq(UserHandle.USER_CURRENT)))
1137c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                .thenReturn(PKG_NAME);
114d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        when(mPackageManager.queryIntentServicesAsUser(nullable(Intent.class), anyInt(), anyInt()))
1156d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                .thenReturn(Collections.singletonList(mResolveInfo));
1166d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        when(mParcelableCallUtilsConverter.toParcelableCall(
1176d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                eq(mCall), anyBoolean(), eq(mPhoneAccountRegistrar))).thenReturn(null);
118d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class),
1196d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                anyInt(), eq(UserHandle.CURRENT))).thenReturn(true);
1206d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1216d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1226d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1236d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testNoDefaultDialer() {
1247c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu        when(mDefaultDialerCache.getDefaultDialerApplication(eq(UserHandle.USER_CURRENT)))
1257c9283261ad4fdbc5ebbb74257671388f9c758c7Hall Liu                .thenReturn(null);
1266d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1276d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
1286d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1296d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1306d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1316d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testNoResolveEntries() {
132d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        when(mPackageManager.queryIntentServicesAsUser(nullable(Intent.class), anyInt(), anyInt()))
1336d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                .thenReturn(Collections.emptyList());
1346d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1356d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
1366d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1376d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1386d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1396d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testBadResolveEntry() {
1406d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mResolveInfo.serviceInfo = null;
1416d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1426d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
1436d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1446d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1456d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1466d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testPermissionlessFilterService() {
1476d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mResolveInfo.serviceInfo.permission = null;
1486d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1496d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
1506d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1516d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1526d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1536d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testContextFailToBind() {
154d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class),
1556d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                anyInt(), eq(UserHandle.CURRENT))).thenReturn(false);
1566d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1576d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
1586d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1596d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1606d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1616d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testExceptionInScreeningService() throws Exception {
1626d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        doThrow(new RemoteException()).when(mCallScreeningService).screenCall(
163d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger                nullable(ICallScreeningAdapter.class), nullable(ParcelableCall.class));
1646d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1656d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ServiceConnection serviceConnection = verifyBindingIntent();
1666d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
1676d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
1686d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1696d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1706d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1716d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testAllowCall() throws Exception {
1726d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1736d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ServiceConnection serviceConnection = verifyBindingIntent();
1746d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
1756d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ICallScreeningAdapter csAdapter = getCallScreeningAdapter();
1766d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        csAdapter.allowCall(CALL_ID);
1776d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(PASS_RESULT));
1786d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1796d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1806d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    @SmallTest
1816d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    public void testDisallowCall() throws Exception {
1826d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        mFilter.startFilterLookup(mCall, mCallback);
1836d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ServiceConnection serviceConnection = verifyBindingIntent();
1846d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
1856d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ICallScreeningAdapter csAdapter = getCallScreeningAdapter();
1866d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        csAdapter.disallowCall(CALL_ID,
1876d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                true, // shouldReject
1886d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                false, // shouldAddToCallLog
1896d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                true // shouldShowNotification
1906d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        );
1916d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mCallback).onCallFilteringComplete(eq(mCall), eq(new CallFilteringResult(
1926d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                false, // shouldAllowCall
1936d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                true, // shouldReject
1946d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                false, // shouldAddToCallLog
1956d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                true // shouldShowNotification
1966d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        )));
1976d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
1986d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
1996d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private ServiceConnection verifyBindingIntent() {
2006d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
2016d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ArgumentCaptor<ServiceConnection> serviceCaptor =
2026d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                ArgumentCaptor.forClass(ServiceConnection.class);
2036d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        verify(mContext).bindServiceAsUser(intentCaptor.capture(), serviceCaptor.capture(),
2046d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE),
2056d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                eq(UserHandle.CURRENT));
2066d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
2076d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        Intent capturedIntent = intentCaptor.getValue();
2086d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        assertEquals(CallScreeningService.SERVICE_INTERFACE, capturedIntent.getAction());
2096d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        assertEquals(PKG_NAME, capturedIntent.getPackage());
2106d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        assertEquals(COMPONENT_NAME, capturedIntent.getComponent());
2116d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
2126d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        return serviceCaptor.getValue();
2136d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
2146d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu
2156d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    private ICallScreeningAdapter getCallScreeningAdapter() throws Exception {
2166d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        ArgumentCaptor<ICallScreeningAdapter> captor =
2176d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu                ArgumentCaptor.forClass(ICallScreeningAdapter.class);
218d0fe76e8e74ac515cacc492fa2c783cf2247ac05Brad Ebinger        verify(mCallScreeningService).screenCall(captor.capture(), nullable(ParcelableCall.class));
2196d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu        return captor.getValue();
2206d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu    }
2216d4b66df3d918e3f17263ff40ca3ba0ec5a46719Hall Liu}
222