Loading src/com/android/server/telecom/CallScreeningServiceHelper.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.os.Binder; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -123,8 +122,10 @@ public class CallScreeningServiceHelper { Log.continueSession(mLoggingSession, "CSSH.oSC"); Log.continueSession(mLoggingSession, "CSSH.oSC"); try { try { try { try { // Note: for outgoing calls, never include the restricted extras. screeningService.screenCall(new CallScreeningAdapter(), screeningService.screenCall(new CallScreeningAdapter(), mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall)); mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall, false /* areRestrictedExtrasIncluded */)); } catch (RemoteException e) { } catch (RemoteException e) { Log.w(CallScreeningServiceHelper.this, Log.w(CallScreeningServiceHelper.this, "Cancelling call id due to remote exception"); "Cancelling call id due to remote exception"); Loading src/com/android/server/telecom/ParcelableCallUtils.java +54 −5 Original line number Original line Diff line number Diff line Loading @@ -52,6 +52,17 @@ public class ParcelableCallUtils { EXTRA_KEYS_TO_SANITIZE.add(android.telecom.Connection.EXTRA_SIP_INVITE); EXTRA_KEYS_TO_SANITIZE.add(android.telecom.Connection.EXTRA_SIP_INVITE); } } /** * A list of extra keys which should be added to {@link ParcelableCall} when it is being * generated for the purpose of sending to a CallScreeningService which has access to these * restricted keys. */ private static List<String> RESTRICTED_CALL_SCREENING_EXTRA_KEYS; static { RESTRICTED_CALL_SCREENING_EXTRA_KEYS = new ArrayList<>(); RESTRICTED_CALL_SCREENING_EXTRA_KEYS.add(android.telecom.Connection.EXTRA_SIP_INVITE); } public static class Converter { public static class Converter { public ParcelableCall toParcelableCall(Call call, boolean includeVideoProvider, public ParcelableCall toParcelableCall(Call call, boolean includeVideoProvider, PhoneAccountRegistrar phoneAccountRegistrar) { PhoneAccountRegistrar phoneAccountRegistrar) { Loading @@ -59,8 +70,10 @@ public class ParcelableCallUtils { call, includeVideoProvider, phoneAccountRegistrar, false, false, false); call, includeVideoProvider, phoneAccountRegistrar, false, false, false); } } public ParcelableCall toParcelableCallForScreening(Call call) { public ParcelableCall toParcelableCallForScreening(Call call, return ParcelableCallUtils.toParcelableCallForScreening(call); boolean areRestrictedExtrasIncluded) { return ParcelableCallUtils.toParcelableCallForScreening(call, areRestrictedExtrasIncluded); } } } } Loading Loading @@ -256,10 +269,17 @@ public class ParcelableCallUtils { * <li>Handle (phone number) presentation</li> * <li>Handle (phone number) presentation</li> * </ul> * </ul> * All other fields are nulled or set to 0 values. * All other fields are nulled or set to 0 values. * Where the call screening service is part of the system dialer, the * {@link Connection#EXTRA_SIP_INVITE} header information is also sent to the call screening * service (since the system dialer has access to this anyways). * @param call The telecom call to send to a call screening service. * @param call The telecom call to send to a call screening service. * @param areRestrictedExtrasIncluded {@code true} if the set of restricted extras defined in * {@link #RESTRICTED_CALL_SCREENING_EXTRA_KEYS} are to * be included in the parceled call, {@code false} otherwise. * @return Minimal {@link ParcelableCall} to send to the call screening service. * @return Minimal {@link ParcelableCall} to send to the call screening service. */ */ public static ParcelableCall toParcelableCallForScreening(Call call) { public static ParcelableCall toParcelableCallForScreening(Call call, boolean areRestrictedExtrasIncluded) { Uri handle = call.getHandlePresentation() == TelecomManager.PRESENTATION_ALLOWED ? Uri handle = call.getHandlePresentation() == TelecomManager.PRESENTATION_ALLOWED ? call.getHandle() : null; call.getHandle() : null; int callDirection; int callDirection; Loading @@ -270,6 +290,13 @@ public class ParcelableCallUtils { } else { } else { callDirection = DIRECTION_OUTGOING; callDirection = DIRECTION_OUTGOING; } } Bundle callExtras; if (areRestrictedExtrasIncluded) { callExtras = sanitizeRestrictedCallExtras(call.getExtras()); } else { callExtras = new Bundle(); } return new ParcelableCall( return new ParcelableCall( call.getId(), call.getId(), getParcelableState(call, false /* supportsExternalCalls */), getParcelableState(call, false /* supportsExternalCalls */), Loading @@ -295,7 +322,7 @@ public class ParcelableCallUtils { 0, /* videoState */ 0, /* videoState */ Collections.emptyList(), /* conferenceableCallIds */ Collections.emptyList(), /* conferenceableCallIds */ null, /* intentExtras */ null, /* intentExtras */ null, /* callExtras */ callExtras, /* callExtras */ call.getCreationTimeMillis(), call.getCreationTimeMillis(), callDirection); callDirection); } } Loading @@ -303,7 +330,7 @@ public class ParcelableCallUtils { /** /** * Sanitize the extras bundle passed in, removing keys which should not be sent to non-system * Sanitize the extras bundle passed in, removing keys which should not be sent to non-system * dialer apps. * dialer apps. * @param extras Extras bundle to sanitize. * @param oldExtras Extras bundle to sanitize. * @return The sanitized extras bundle. * @return The sanitized extras bundle. */ */ private static Bundle sanitizeExtras(Bundle oldExtras) { private static Bundle sanitizeExtras(Bundle oldExtras) { Loading @@ -326,6 +353,28 @@ public class ParcelableCallUtils { return extras; return extras; } } /** * Sanitize the extras bundle passed in, removing keys which should not be sent to call * screening services which have access to the restricted extras. * @param oldExtras Extras bundle to sanitize. * @return The sanitized extras bundle. */ private static Bundle sanitizeRestrictedCallExtras(Bundle oldExtras) { if (oldExtras == null) { return new Bundle(); } Bundle extras = new Bundle(oldExtras); Iterator<String> toCheck = extras.keySet().iterator(); while (toCheck.hasNext()) { String extraKey = toCheck.next(); if (TextUtils.isEmpty(extraKey) || !RESTRICTED_CALL_SCREENING_EXTRA_KEYS.contains(extraKey)) { toCheck.remove(); } } return extras; } private static int getParcelableState(Call call, boolean supportsExternalCalls) { private static int getParcelableState(Call call, boolean supportsExternalCalls) { int state = CallState.NEW; int state = CallState.NEW; switch (call.getState()) { switch (call.getState()) { Loading src/com/android/server/telecom/callfiltering/CallScreeningServiceController.java +13 −3 Original line number Original line Diff line number Diff line Loading @@ -160,7 +160,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi bindDefaultDialerAndUserChosenService(); bindDefaultDialerAndUserChosenService(); } else { } else { createCallScreeningServiceFilter().startCallScreeningFilter(mCall, this, createCallScreeningServiceFilter().startCallScreeningFilter(mCall, this, carrierPackageName, mAppLabelProxy.getAppLabel(carrierPackageName)); carrierPackageName, mAppLabelProxy.getAppLabel(carrierPackageName), CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_CARRIER); } } // Carrier filtering timed out // Carrier filtering timed out Loading @@ -178,12 +179,16 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi private void bindDefaultDialerAndUserChosenService() { private void bindDefaultDialerAndUserChosenService() { if (mIsCarrierFinished) { if (mIsCarrierFinished) { String dialerPackageName = getDefaultDialerPackageName(); String dialerPackageName = getDefaultDialerPackageName(); String systemDialerPackageName = getSystemDialerPackageName(); if (TextUtils.isEmpty(dialerPackageName)) { if (TextUtils.isEmpty(dialerPackageName)) { mIsDefaultDialerFinished = true; mIsDefaultDialerFinished = true; } else { } else { int dialerType = dialerPackageName.equals(systemDialerPackageName) ? CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_SYSTEM_DIALER : CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_DEFAULT_DIALER; createCallScreeningServiceFilter().startCallScreeningFilter(mCall, createCallScreeningServiceFilter().startCallScreeningFilter(mCall, CallScreeningServiceController.this, dialerPackageName, CallScreeningServiceController.this, dialerPackageName, mAppLabelProxy.getAppLabel(dialerPackageName)); mAppLabelProxy.getAppLabel(dialerPackageName), dialerType); } } String userChosenPackageName = getUserChosenPackageName(); String userChosenPackageName = getUserChosenPackageName(); Loading @@ -192,7 +197,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi } else { } else { createCallScreeningServiceFilter().startCallScreeningFilter(mCall, createCallScreeningServiceFilter().startCallScreeningFilter(mCall, CallScreeningServiceController.this, userChosenPackageName, CallScreeningServiceController.this, userChosenPackageName, mAppLabelProxy.getAppLabel(userChosenPackageName)); mAppLabelProxy.getAppLabel(userChosenPackageName), CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); } } if (mIsDefaultDialerFinished && mIsUserChosenFinished) { if (mIsDefaultDialerFinished && mIsUserChosenFinished) { Loading Loading @@ -257,6 +263,10 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi return TelecomManager.from(mContext).getDefaultDialerPackage(); return TelecomManager.from(mContext).getDefaultDialerPackage(); } } private String getSystemDialerPackageName() { return TelecomManager.from(mContext).getSystemDialerPackage(); } private String getUserChosenPackageName() { private String getUserChosenPackageName() { return mCallsManager.getRoleManagerAdapter().getDefaultCallScreeningApp(); return mCallsManager.getRoleManagerAdapter().getDefaultCallScreeningApp(); } } Loading src/com/android/server/telecom/callfiltering/CallScreeningServiceFilter.java +18 −11 Original line number Original line Diff line number Diff line Loading @@ -16,12 +16,9 @@ package com.android.server.telecom.callfiltering; package com.android.server.telecom.callfiltering; import android.Manifest; import android.content.ComponentName; import android.content.ComponentName; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.ServiceConnection; import android.content.pm.ResolveInfo; import android.os.Binder; import android.os.Binder; import android.os.IBinder; import android.os.IBinder; import android.os.PersistableBundle; import android.os.PersistableBundle; Loading @@ -29,9 +26,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.UserHandle; import android.provider.CallLog; import android.provider.CallLog; import android.provider.Settings; import android.provider.Settings; import android.telecom.CallScreeningService; import android.telecom.Log; import android.telecom.Log; import android.telecom.ParcelableCall; import android.telecom.TelecomManager; import android.telecom.TelecomManager; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.text.TextUtils; import android.text.TextUtils; Loading @@ -47,14 +42,17 @@ import com.android.server.telecom.PhoneAccountRegistrar; import com.android.server.telecom.TelecomServiceImpl.SettingsSecureAdapter; import com.android.server.telecom.TelecomServiceImpl.SettingsSecureAdapter; import com.android.server.telecom.TelecomSystem; import com.android.server.telecom.TelecomSystem; import java.util.List; /** /** * Binds to {@link ICallScreeningService} to allow call blocking. A single instance of this class * Binds to {@link ICallScreeningService} to allow call blocking. A single instance of this class * handles a single call. * handles a single call. */ */ public class CallScreeningServiceFilter { public class CallScreeningServiceFilter { public static final int CALL_SCREENING_FILTER_TYPE_USER_SELECTED = 1; public static final int CALL_SCREENING_FILTER_TYPE_DEFAULT_DIALER = 2; public static final int CALL_SCREENING_FILTER_TYPE_SYSTEM_DIALER = 3; public static final int CALL_SCREENING_FILTER_TYPE_CARRIER = 4; public interface CallScreeningFilterResultCallback { public interface CallScreeningFilterResultCallback { void onCallScreeningFilterComplete(Call call, CallFilteringResult result, String void onCallScreeningFilterComplete(Call call, CallFilteringResult result, String packageName); packageName); Loading Loading @@ -194,6 +192,7 @@ public class CallScreeningServiceFilter { private String mPackageName; private String mPackageName; private CharSequence mAppName; private CharSequence mAppName; private boolean mHasFinished = false; private boolean mHasFinished = false; private int mCallScreeningServiceType; private CallFilteringResult mResult = new CallFilteringResult( private CallFilteringResult mResult = new CallFilteringResult( true, // shouldAllowCall true, // shouldAllowCall Loading @@ -219,7 +218,8 @@ public class CallScreeningServiceFilter { public void startCallScreeningFilter(Call call, public void startCallScreeningFilter(Call call, CallScreeningFilterResultCallback callback, CallScreeningFilterResultCallback callback, String packageName, String packageName, CharSequence appName) { CharSequence appName, int callScreeningServiceType) { if (mHasFinished) { if (mHasFinished) { Log.w(this, "Attempting to reuse CallScreeningServiceFilter. Ignoring."); Log.w(this, "Attempting to reuse CallScreeningServiceFilter. Ignoring."); return; return; Loading @@ -229,6 +229,7 @@ public class CallScreeningServiceFilter { mCallback = callback; mCallback = callback; mPackageName = packageName; mPackageName = packageName; mAppName = appName; mAppName = appName; mCallScreeningServiceType = callScreeningServiceType; mConnection = new CallScreeningServiceConnection(); mConnection = new CallScreeningServiceConnection(); if (!CallScreeningServiceHelper.bindCallScreeningService(mContext, if (!CallScreeningServiceHelper.bindCallScreeningService(mContext, Loading Loading @@ -262,9 +263,15 @@ public class CallScreeningServiceFilter { private void onServiceBound(ICallScreeningService service) { private void onServiceBound(ICallScreeningService service) { mService = service; mService = service; try { try { boolean isSystemDialer = mCallScreeningServiceType == CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_SYSTEM_DIALER; // Important: Only send a minimal subset of the call to the screening service. // Important: Only send a minimal subset of the call to the screening service. // We will send some of the call extras to the call screening service which the system // dialer implements. mService.screenCall(new CallScreeningAdapter(), mService.screenCall(new CallScreeningAdapter(), mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall)); mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall, isSystemDialer)); } catch (RemoteException e) { } catch (RemoteException e) { Log.e(this, e, "Failed to set the call screening adapter."); Log.e(this, e, "Failed to set the call screening adapter."); finishCallScreening(); finishCallScreening(); Loading tests/src/com/android/server/telecom/tests/CallScreeningServiceFilterTest.java +22 −12 Original line number Original line Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo; import android.graphics.drawable.Icon; import android.os.IBinder; import android.os.IBinder; import android.os.PersistableBundle; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -166,7 +165,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @SmallTest @SmallTest @Test @Test public void testNoPackageName() { public void testNoPackageName() { mFilter.startCallScreeningFilter(mCall, mCallback, null, null); mFilter.startCallScreeningFilter(mCall, mCallback, null, null, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(null)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(null)); } } Loading @@ -175,7 +175,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { public void testNoResolveEntries() { public void testNoResolveEntries() { when(mPackageManager.queryIntentServicesAsUser(nullable(Intent.class), anyInt(), anyInt())) when(mPackageManager.queryIntentServicesAsUser(nullable(Intent.class), anyInt(), anyInt())) .thenReturn(Collections.emptyList()); .thenReturn(Collections.emptyList()); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -183,7 +184,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @Test @Test public void testBadResolveEntry() { public void testBadResolveEntry() { mResolveInfo.serviceInfo = null; mResolveInfo.serviceInfo = null; mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -191,7 +193,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @Test @Test public void testPermissionlessFilterService() { public void testPermissionlessFilterService() { mResolveInfo.serviceInfo.permission = null; mResolveInfo.serviceInfo.permission = null; mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -200,7 +203,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { public void testContextFailToBind() { public void testContextFailToBind() { when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class), when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class), anyInt(), eq(UserHandle.CURRENT))).thenReturn(false); anyInt(), eq(UserHandle.CURRENT))).thenReturn(false); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -209,7 +213,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { public void testExceptionInScreeningService() throws Exception { public void testExceptionInScreeningService() throws Exception { doThrow(new RemoteException()).when(mCallScreeningService).screenCall( doThrow(new RemoteException()).when(mCallScreeningService).screenCall( nullable(ICallScreeningAdapter.class), nullable(ParcelableCall.class)); nullable(ICallScreeningAdapter.class), nullable(ParcelableCall.class)); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); Loading @@ -218,7 +223,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @SmallTest @SmallTest @Test @Test public void testAllowCall() throws Exception { public void testAllowCall() throws Exception { mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading @@ -229,7 +235,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @SmallTest @SmallTest @Test @Test public void testSilenceCall() throws Exception { public void testSilenceCall() throws Exception { mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading @@ -249,7 +256,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { mFilter.startCallScreeningFilter(mCall, mCallback, mFilter.startCallScreeningFilter(mCall, mCallback, CARRIER_DEFINED_CALL_SCREENING.getPackageName(), CARRIER_DEFINED_CALL_SCREENING.getPackageName(), CARRIER_DEFINED_CALL_SCREENING_APP_NAME); CARRIER_DEFINED_CALL_SCREENING_APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_CARRIER); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading Loading @@ -281,7 +289,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { mFilter.startCallScreeningFilter(mCall, mCallback, mFilter.startCallScreeningFilter(mCall, mCallback, DEFAULT_DIALER_CALL_SCREENING.getPackageName(), DEFAULT_DIALER_CALL_SCREENING.getPackageName(), DEFAULT_DIALER_APP_NAME); DEFAULT_DIALER_APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_DEFAULT_DIALER); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading Loading @@ -313,7 +322,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { mFilter.startCallScreeningFilter(mCall, mCallback, mFilter.startCallScreeningFilter(mCall, mCallback, USER_CHOSEN_CALL_SCREENING.getPackageName(), USER_CHOSEN_CALL_SCREENING.getPackageName(), USER_CHOSEN_CALL_SCREENING_APP_NAME); USER_CHOSEN_CALL_SCREENING_APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading Loading
src/com/android/server/telecom/CallScreeningServiceHelper.java +3 −2 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.content.Intent; import android.content.ServiceConnection; import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.os.Binder; import android.os.Handler; import android.os.Handler; import android.os.IBinder; import android.os.IBinder; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -123,8 +122,10 @@ public class CallScreeningServiceHelper { Log.continueSession(mLoggingSession, "CSSH.oSC"); Log.continueSession(mLoggingSession, "CSSH.oSC"); try { try { try { try { // Note: for outgoing calls, never include the restricted extras. screeningService.screenCall(new CallScreeningAdapter(), screeningService.screenCall(new CallScreeningAdapter(), mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall)); mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall, false /* areRestrictedExtrasIncluded */)); } catch (RemoteException e) { } catch (RemoteException e) { Log.w(CallScreeningServiceHelper.this, Log.w(CallScreeningServiceHelper.this, "Cancelling call id due to remote exception"); "Cancelling call id due to remote exception"); Loading
src/com/android/server/telecom/ParcelableCallUtils.java +54 −5 Original line number Original line Diff line number Diff line Loading @@ -52,6 +52,17 @@ public class ParcelableCallUtils { EXTRA_KEYS_TO_SANITIZE.add(android.telecom.Connection.EXTRA_SIP_INVITE); EXTRA_KEYS_TO_SANITIZE.add(android.telecom.Connection.EXTRA_SIP_INVITE); } } /** * A list of extra keys which should be added to {@link ParcelableCall} when it is being * generated for the purpose of sending to a CallScreeningService which has access to these * restricted keys. */ private static List<String> RESTRICTED_CALL_SCREENING_EXTRA_KEYS; static { RESTRICTED_CALL_SCREENING_EXTRA_KEYS = new ArrayList<>(); RESTRICTED_CALL_SCREENING_EXTRA_KEYS.add(android.telecom.Connection.EXTRA_SIP_INVITE); } public static class Converter { public static class Converter { public ParcelableCall toParcelableCall(Call call, boolean includeVideoProvider, public ParcelableCall toParcelableCall(Call call, boolean includeVideoProvider, PhoneAccountRegistrar phoneAccountRegistrar) { PhoneAccountRegistrar phoneAccountRegistrar) { Loading @@ -59,8 +70,10 @@ public class ParcelableCallUtils { call, includeVideoProvider, phoneAccountRegistrar, false, false, false); call, includeVideoProvider, phoneAccountRegistrar, false, false, false); } } public ParcelableCall toParcelableCallForScreening(Call call) { public ParcelableCall toParcelableCallForScreening(Call call, return ParcelableCallUtils.toParcelableCallForScreening(call); boolean areRestrictedExtrasIncluded) { return ParcelableCallUtils.toParcelableCallForScreening(call, areRestrictedExtrasIncluded); } } } } Loading Loading @@ -256,10 +269,17 @@ public class ParcelableCallUtils { * <li>Handle (phone number) presentation</li> * <li>Handle (phone number) presentation</li> * </ul> * </ul> * All other fields are nulled or set to 0 values. * All other fields are nulled or set to 0 values. * Where the call screening service is part of the system dialer, the * {@link Connection#EXTRA_SIP_INVITE} header information is also sent to the call screening * service (since the system dialer has access to this anyways). * @param call The telecom call to send to a call screening service. * @param call The telecom call to send to a call screening service. * @param areRestrictedExtrasIncluded {@code true} if the set of restricted extras defined in * {@link #RESTRICTED_CALL_SCREENING_EXTRA_KEYS} are to * be included in the parceled call, {@code false} otherwise. * @return Minimal {@link ParcelableCall} to send to the call screening service. * @return Minimal {@link ParcelableCall} to send to the call screening service. */ */ public static ParcelableCall toParcelableCallForScreening(Call call) { public static ParcelableCall toParcelableCallForScreening(Call call, boolean areRestrictedExtrasIncluded) { Uri handle = call.getHandlePresentation() == TelecomManager.PRESENTATION_ALLOWED ? Uri handle = call.getHandlePresentation() == TelecomManager.PRESENTATION_ALLOWED ? call.getHandle() : null; call.getHandle() : null; int callDirection; int callDirection; Loading @@ -270,6 +290,13 @@ public class ParcelableCallUtils { } else { } else { callDirection = DIRECTION_OUTGOING; callDirection = DIRECTION_OUTGOING; } } Bundle callExtras; if (areRestrictedExtrasIncluded) { callExtras = sanitizeRestrictedCallExtras(call.getExtras()); } else { callExtras = new Bundle(); } return new ParcelableCall( return new ParcelableCall( call.getId(), call.getId(), getParcelableState(call, false /* supportsExternalCalls */), getParcelableState(call, false /* supportsExternalCalls */), Loading @@ -295,7 +322,7 @@ public class ParcelableCallUtils { 0, /* videoState */ 0, /* videoState */ Collections.emptyList(), /* conferenceableCallIds */ Collections.emptyList(), /* conferenceableCallIds */ null, /* intentExtras */ null, /* intentExtras */ null, /* callExtras */ callExtras, /* callExtras */ call.getCreationTimeMillis(), call.getCreationTimeMillis(), callDirection); callDirection); } } Loading @@ -303,7 +330,7 @@ public class ParcelableCallUtils { /** /** * Sanitize the extras bundle passed in, removing keys which should not be sent to non-system * Sanitize the extras bundle passed in, removing keys which should not be sent to non-system * dialer apps. * dialer apps. * @param extras Extras bundle to sanitize. * @param oldExtras Extras bundle to sanitize. * @return The sanitized extras bundle. * @return The sanitized extras bundle. */ */ private static Bundle sanitizeExtras(Bundle oldExtras) { private static Bundle sanitizeExtras(Bundle oldExtras) { Loading @@ -326,6 +353,28 @@ public class ParcelableCallUtils { return extras; return extras; } } /** * Sanitize the extras bundle passed in, removing keys which should not be sent to call * screening services which have access to the restricted extras. * @param oldExtras Extras bundle to sanitize. * @return The sanitized extras bundle. */ private static Bundle sanitizeRestrictedCallExtras(Bundle oldExtras) { if (oldExtras == null) { return new Bundle(); } Bundle extras = new Bundle(oldExtras); Iterator<String> toCheck = extras.keySet().iterator(); while (toCheck.hasNext()) { String extraKey = toCheck.next(); if (TextUtils.isEmpty(extraKey) || !RESTRICTED_CALL_SCREENING_EXTRA_KEYS.contains(extraKey)) { toCheck.remove(); } } return extras; } private static int getParcelableState(Call call, boolean supportsExternalCalls) { private static int getParcelableState(Call call, boolean supportsExternalCalls) { int state = CallState.NEW; int state = CallState.NEW; switch (call.getState()) { switch (call.getState()) { Loading
src/com/android/server/telecom/callfiltering/CallScreeningServiceController.java +13 −3 Original line number Original line Diff line number Diff line Loading @@ -160,7 +160,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi bindDefaultDialerAndUserChosenService(); bindDefaultDialerAndUserChosenService(); } else { } else { createCallScreeningServiceFilter().startCallScreeningFilter(mCall, this, createCallScreeningServiceFilter().startCallScreeningFilter(mCall, this, carrierPackageName, mAppLabelProxy.getAppLabel(carrierPackageName)); carrierPackageName, mAppLabelProxy.getAppLabel(carrierPackageName), CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_CARRIER); } } // Carrier filtering timed out // Carrier filtering timed out Loading @@ -178,12 +179,16 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi private void bindDefaultDialerAndUserChosenService() { private void bindDefaultDialerAndUserChosenService() { if (mIsCarrierFinished) { if (mIsCarrierFinished) { String dialerPackageName = getDefaultDialerPackageName(); String dialerPackageName = getDefaultDialerPackageName(); String systemDialerPackageName = getSystemDialerPackageName(); if (TextUtils.isEmpty(dialerPackageName)) { if (TextUtils.isEmpty(dialerPackageName)) { mIsDefaultDialerFinished = true; mIsDefaultDialerFinished = true; } else { } else { int dialerType = dialerPackageName.equals(systemDialerPackageName) ? CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_SYSTEM_DIALER : CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_DEFAULT_DIALER; createCallScreeningServiceFilter().startCallScreeningFilter(mCall, createCallScreeningServiceFilter().startCallScreeningFilter(mCall, CallScreeningServiceController.this, dialerPackageName, CallScreeningServiceController.this, dialerPackageName, mAppLabelProxy.getAppLabel(dialerPackageName)); mAppLabelProxy.getAppLabel(dialerPackageName), dialerType); } } String userChosenPackageName = getUserChosenPackageName(); String userChosenPackageName = getUserChosenPackageName(); Loading @@ -192,7 +197,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi } else { } else { createCallScreeningServiceFilter().startCallScreeningFilter(mCall, createCallScreeningServiceFilter().startCallScreeningFilter(mCall, CallScreeningServiceController.this, userChosenPackageName, CallScreeningServiceController.this, userChosenPackageName, mAppLabelProxy.getAppLabel(userChosenPackageName)); mAppLabelProxy.getAppLabel(userChosenPackageName), CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); } } if (mIsDefaultDialerFinished && mIsUserChosenFinished) { if (mIsDefaultDialerFinished && mIsUserChosenFinished) { Loading Loading @@ -257,6 +263,10 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi return TelecomManager.from(mContext).getDefaultDialerPackage(); return TelecomManager.from(mContext).getDefaultDialerPackage(); } } private String getSystemDialerPackageName() { return TelecomManager.from(mContext).getSystemDialerPackage(); } private String getUserChosenPackageName() { private String getUserChosenPackageName() { return mCallsManager.getRoleManagerAdapter().getDefaultCallScreeningApp(); return mCallsManager.getRoleManagerAdapter().getDefaultCallScreeningApp(); } } Loading
src/com/android/server/telecom/callfiltering/CallScreeningServiceFilter.java +18 −11 Original line number Original line Diff line number Diff line Loading @@ -16,12 +16,9 @@ package com.android.server.telecom.callfiltering; package com.android.server.telecom.callfiltering; import android.Manifest; import android.content.ComponentName; import android.content.ComponentName; import android.content.Context; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.content.ServiceConnection; import android.content.pm.ResolveInfo; import android.os.Binder; import android.os.Binder; import android.os.IBinder; import android.os.IBinder; import android.os.PersistableBundle; import android.os.PersistableBundle; Loading @@ -29,9 +26,7 @@ import android.os.RemoteException; import android.os.UserHandle; import android.os.UserHandle; import android.provider.CallLog; import android.provider.CallLog; import android.provider.Settings; import android.provider.Settings; import android.telecom.CallScreeningService; import android.telecom.Log; import android.telecom.Log; import android.telecom.ParcelableCall; import android.telecom.TelecomManager; import android.telecom.TelecomManager; import android.telephony.CarrierConfigManager; import android.telephony.CarrierConfigManager; import android.text.TextUtils; import android.text.TextUtils; Loading @@ -47,14 +42,17 @@ import com.android.server.telecom.PhoneAccountRegistrar; import com.android.server.telecom.TelecomServiceImpl.SettingsSecureAdapter; import com.android.server.telecom.TelecomServiceImpl.SettingsSecureAdapter; import com.android.server.telecom.TelecomSystem; import com.android.server.telecom.TelecomSystem; import java.util.List; /** /** * Binds to {@link ICallScreeningService} to allow call blocking. A single instance of this class * Binds to {@link ICallScreeningService} to allow call blocking. A single instance of this class * handles a single call. * handles a single call. */ */ public class CallScreeningServiceFilter { public class CallScreeningServiceFilter { public static final int CALL_SCREENING_FILTER_TYPE_USER_SELECTED = 1; public static final int CALL_SCREENING_FILTER_TYPE_DEFAULT_DIALER = 2; public static final int CALL_SCREENING_FILTER_TYPE_SYSTEM_DIALER = 3; public static final int CALL_SCREENING_FILTER_TYPE_CARRIER = 4; public interface CallScreeningFilterResultCallback { public interface CallScreeningFilterResultCallback { void onCallScreeningFilterComplete(Call call, CallFilteringResult result, String void onCallScreeningFilterComplete(Call call, CallFilteringResult result, String packageName); packageName); Loading Loading @@ -194,6 +192,7 @@ public class CallScreeningServiceFilter { private String mPackageName; private String mPackageName; private CharSequence mAppName; private CharSequence mAppName; private boolean mHasFinished = false; private boolean mHasFinished = false; private int mCallScreeningServiceType; private CallFilteringResult mResult = new CallFilteringResult( private CallFilteringResult mResult = new CallFilteringResult( true, // shouldAllowCall true, // shouldAllowCall Loading @@ -219,7 +218,8 @@ public class CallScreeningServiceFilter { public void startCallScreeningFilter(Call call, public void startCallScreeningFilter(Call call, CallScreeningFilterResultCallback callback, CallScreeningFilterResultCallback callback, String packageName, String packageName, CharSequence appName) { CharSequence appName, int callScreeningServiceType) { if (mHasFinished) { if (mHasFinished) { Log.w(this, "Attempting to reuse CallScreeningServiceFilter. Ignoring."); Log.w(this, "Attempting to reuse CallScreeningServiceFilter. Ignoring."); return; return; Loading @@ -229,6 +229,7 @@ public class CallScreeningServiceFilter { mCallback = callback; mCallback = callback; mPackageName = packageName; mPackageName = packageName; mAppName = appName; mAppName = appName; mCallScreeningServiceType = callScreeningServiceType; mConnection = new CallScreeningServiceConnection(); mConnection = new CallScreeningServiceConnection(); if (!CallScreeningServiceHelper.bindCallScreeningService(mContext, if (!CallScreeningServiceHelper.bindCallScreeningService(mContext, Loading Loading @@ -262,9 +263,15 @@ public class CallScreeningServiceFilter { private void onServiceBound(ICallScreeningService service) { private void onServiceBound(ICallScreeningService service) { mService = service; mService = service; try { try { boolean isSystemDialer = mCallScreeningServiceType == CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_SYSTEM_DIALER; // Important: Only send a minimal subset of the call to the screening service. // Important: Only send a minimal subset of the call to the screening service. // We will send some of the call extras to the call screening service which the system // dialer implements. mService.screenCall(new CallScreeningAdapter(), mService.screenCall(new CallScreeningAdapter(), mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall)); mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall, isSystemDialer)); } catch (RemoteException e) { } catch (RemoteException e) { Log.e(this, e, "Failed to set the call screening adapter."); Log.e(this, e, "Failed to set the call screening adapter."); finishCallScreening(); finishCallScreening(); Loading
tests/src/com/android/server/telecom/tests/CallScreeningServiceFilterTest.java +22 −12 Original line number Original line Diff line number Diff line Loading @@ -25,7 +25,6 @@ import android.content.ServiceConnection; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.pm.ServiceInfo; import android.graphics.drawable.Icon; import android.os.IBinder; import android.os.IBinder; import android.os.PersistableBundle; import android.os.PersistableBundle; import android.os.RemoteException; import android.os.RemoteException; Loading Loading @@ -166,7 +165,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @SmallTest @SmallTest @Test @Test public void testNoPackageName() { public void testNoPackageName() { mFilter.startCallScreeningFilter(mCall, mCallback, null, null); mFilter.startCallScreeningFilter(mCall, mCallback, null, null, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(null)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(null)); } } Loading @@ -175,7 +175,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { public void testNoResolveEntries() { public void testNoResolveEntries() { when(mPackageManager.queryIntentServicesAsUser(nullable(Intent.class), anyInt(), anyInt())) when(mPackageManager.queryIntentServicesAsUser(nullable(Intent.class), anyInt(), anyInt())) .thenReturn(Collections.emptyList()); .thenReturn(Collections.emptyList()); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -183,7 +184,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @Test @Test public void testBadResolveEntry() { public void testBadResolveEntry() { mResolveInfo.serviceInfo = null; mResolveInfo.serviceInfo = null; mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -191,7 +193,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @Test @Test public void testPermissionlessFilterService() { public void testPermissionlessFilterService() { mResolveInfo.serviceInfo.permission = null; mResolveInfo.serviceInfo.permission = null; mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -200,7 +203,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { public void testContextFailToBind() { public void testContextFailToBind() { when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class), when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class), anyInt(), eq(UserHandle.CURRENT))).thenReturn(false); anyInt(), eq(UserHandle.CURRENT))).thenReturn(false); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); } } Loading @@ -209,7 +213,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { public void testExceptionInScreeningService() throws Exception { public void testExceptionInScreeningService() throws Exception { doThrow(new RemoteException()).when(mCallScreeningService).screenCall( doThrow(new RemoteException()).when(mCallScreeningService).screenCall( nullable(ICallScreeningAdapter.class), nullable(ParcelableCall.class)); nullable(ICallScreeningAdapter.class), nullable(ParcelableCall.class)); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME)); Loading @@ -218,7 +223,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @SmallTest @SmallTest @Test @Test public void testAllowCall() throws Exception { public void testAllowCall() throws Exception { mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading @@ -229,7 +235,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { @SmallTest @SmallTest @Test @Test public void testSilenceCall() throws Exception { public void testSilenceCall() throws Exception { mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME); mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading @@ -249,7 +256,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { mFilter.startCallScreeningFilter(mCall, mCallback, mFilter.startCallScreeningFilter(mCall, mCallback, CARRIER_DEFINED_CALL_SCREENING.getPackageName(), CARRIER_DEFINED_CALL_SCREENING.getPackageName(), CARRIER_DEFINED_CALL_SCREENING_APP_NAME); CARRIER_DEFINED_CALL_SCREENING_APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_CARRIER); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading Loading @@ -281,7 +289,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { mFilter.startCallScreeningFilter(mCall, mCallback, mFilter.startCallScreeningFilter(mCall, mCallback, DEFAULT_DIALER_CALL_SCREENING.getPackageName(), DEFAULT_DIALER_CALL_SCREENING.getPackageName(), DEFAULT_DIALER_APP_NAME); DEFAULT_DIALER_APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_DEFAULT_DIALER); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading Loading @@ -313,7 +322,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase { mFilter.startCallScreeningFilter(mCall, mCallback, mFilter.startCallScreeningFilter(mCall, mCallback, USER_CHOSEN_CALL_SCREENING.getPackageName(), USER_CHOSEN_CALL_SCREENING.getPackageName(), USER_CHOSEN_CALL_SCREENING_APP_NAME); USER_CHOSEN_CALL_SCREENING_APP_NAME, CallScreeningServiceFilter.CALL_SCREENING_FILTER_TYPE_USER_SELECTED); ServiceConnection serviceConnection = verifyBindingIntent(); ServiceConnection serviceConnection = verifyBindingIntent(); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); ICallScreeningAdapter csAdapter = getCallScreeningAdapter(); Loading