CallScreeningService behavior changes and improvements.

1. When sending information about a call to the CallScreeningService,
using a new parceling method which passes the bare minimum amount of info
about a call necessary to screen the call.
2. Fix bug where the app name was being logged as the package name for
screened calls.  Adding an AppLabelProxy in the
CallScreeningServiceController to perform lookup of the app name for
logging purposes.
3. Change lookup of user-defined call screening app to make use of the
role manager proxy instead.

Bug: 63966743
Test: Created call screening service test app.
Test: Manually tested operation of user selected CS app using test app and
test override commands.

Merged-In: I51c816f36ad1e5dcd229271c608982113f97b751
Change-Id: I51c816f36ad1e5dcd229271c608982113f97b751
This commit is contained in:
Tyler Gunn 2018-11-30 14:26:13 -08:00
parent 310362192f
commit 5a2f6feb21
12 changed files with 304 additions and 57 deletions

View File

@ -23,6 +23,8 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
import android.media.AudioManager;
import android.media.AudioSystem;
@ -607,7 +609,21 @@ public class CallsManager extends Call.ListenerBase
mCallerInfoLookupHelper, null));
filters.add(new CallScreeningServiceController(mContext, this, mPhoneAccountRegistrar,
new ParcelableCallUtils.Converter(), mLock,
new TelecomServiceImpl.SettingsSecureAdapterImpl(), mCallerInfoLookupHelper));
new TelecomServiceImpl.SettingsSecureAdapterImpl(), mCallerInfoLookupHelper,
new CallScreeningServiceController.AppLabelProxy() {
@Override
public String getAppLabel(String packageName) {
PackageManager pm = mContext.getPackageManager();
try {
ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
return (String) pm.getApplicationLabel(info);
} catch (PackageManager.NameNotFoundException nnfe) {
Log.w(this, "Could not determine package name.");
}
return null;
}
}));
new IncomingCallFilter(mContext, this, incomingCall, mLock,
mTimeoutsAdapter, filters).performFiltering();
}

View File

@ -18,11 +18,13 @@ package com.android.server.telecom;
import android.net.Uri;
import android.telecom.Connection;
import android.telecom.DisconnectCause;
import android.telecom.ParcelableCall;
import android.telecom.ParcelableRttCall;
import android.telecom.TelecomManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
@ -37,6 +39,10 @@ public class ParcelableCallUtils {
return ParcelableCallUtils.toParcelableCall(
call, includeVideoProvider, phoneAccountRegistrar, false, false);
}
public ParcelableCall toParcelableCallForScreening(Call call) {
return ParcelableCallUtils.toParcelableCallForScreening(call);
}
}
/**
@ -191,6 +197,53 @@ public class ParcelableCallUtils {
call.getCreationTimeMillis());
}
/**
* Creates a ParcelableCall with the bare minimum properties required for a
* {@link android.telecom.CallScreeningService}. We ONLY expose the following:
* <ul>
* <li>Call Id (not exposed to public, but needed to associated calls)</li>
* <li>Call state</li>
* <li>Creation time</li>
* <li>Connection time</li>
* <li>Handle (phone number)</li>
* <li>Handle (phone number) presentation</li>
* </ul>
* All other fields are nulled or set to 0 values.
* @param call The telecom call to send to a call screening service.
* @return Minimal {@link ParcelableCall} to send to the call screening service.
*/
public static ParcelableCall toParcelableCallForScreening(Call call) {
Uri handle = call.getHandlePresentation() == TelecomManager.PRESENTATION_ALLOWED ?
call.getHandle() : null;
return new ParcelableCall(
call.getId(),
getParcelableState(call, false /* supportsExternalCalls */),
new DisconnectCause(DisconnectCause.UNKNOWN),
null, /* cannedSmsResponses */
0, /* capabilities */
0, /* properties */
0, /* supportedAudioRoutes */
call.getConnectTimeMillis(),
handle,
call.getHandlePresentation(),
null, /* callerDisplayName */
0 /* callerDisplayNamePresentation */,
null, /* gatewayInfo */
null, /* targetPhoneAccount */
false, /* includeVideoProvider */
null, /* videoProvider */
false, /* includeRttCall */
null, /* rttCall */
null, /* parentCallId */
null, /* childCallIds */
null, /* statusHints */
0, /* videoState */
Collections.emptyList(), /* conferenceableCallIds */
null, /* intentExtras */
null, /* callExtras */
call.getCreationTimeMillis());
}
private static int getParcelableState(Call call, boolean supportsExternalCalls) {
int state = CallState.NEW;
switch (call.getState()) {

View File

@ -196,7 +196,8 @@ public class TelecomSystem {
IncomingCallNotifier incomingCallNotifier,
InCallTonePlayer.ToneGeneratorFactory toneGeneratorFactory,
CallAudioRouteStateMachine.Factory callAudioRouteStateMachineFactory,
ClockProxy clockProxy) {
ClockProxy clockProxy,
RoleManagerAdapter roleManagerAdapter) {
mContext = context.getApplicationContext();
LogUtils.initLogging(mContext);
DefaultDialerManagerAdapter defaultDialerAdapter =
@ -261,8 +262,6 @@ public class TelecomSystem {
}
};
RoleManagerAdapter roleManagerAdapter = new RoleManagerAdapterImpl();
mCallsManager = new CallsManager(
mContext,
mLock,

View File

@ -18,6 +18,7 @@ package com.android.server.telecom.callfiltering;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
@ -50,6 +51,14 @@ import com.android.server.telecom.TelecomSystem;
public class CallScreeningServiceController implements IncomingCallFilter.CallFilter,
CallScreeningServiceFilter.CallScreeningFilterResultCallback {
/**
* Abstracts away dependency on the {@link PackageManager} required to fetch the label for an
* app.
*/
public interface AppLabelProxy {
String getAppLabel(String packageName);
}
private final Context mContext;
private final CallsManager mCallsManager;
private final PhoneAccountRegistrar mPhoneAccountRegistrar;
@ -57,6 +66,7 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
private final TelecomSystem.SyncRoot mTelecomLock;
private final TelecomServiceImpl.SettingsSecureAdapter mSettingsSecureAdapter;
private final CallerInfoLookupHelper mCallerInfoLookupHelper;
private final AppLabelProxy mAppLabelProxy;
private final int CARRIER_CALL_FILTERING_TIMED_OUT = 2000; // 2 seconds
private final int CALL_FILTERING_TIMED_OUT = 4500; // 4.5 seconds
@ -85,7 +95,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
ParcelableCallUtils.Converter parcelableCallUtilsConverter,
TelecomSystem.SyncRoot lock,
TelecomServiceImpl.SettingsSecureAdapter settingsSecureAdapter,
CallerInfoLookupHelper callerInfoLookupHelper) {
CallerInfoLookupHelper callerInfoLookupHelper,
AppLabelProxy appLabelProxy) {
mContext = context;
mCallsManager = callsManager;
mPhoneAccountRegistrar = phoneAccountRegistrar;
@ -93,6 +104,7 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
mTelecomLock = lock;
mSettingsSecureAdapter = settingsSecureAdapter;
mCallerInfoLookupHelper = callerInfoLookupHelper;
mAppLabelProxy = appLabelProxy;
}
@Override
@ -119,8 +131,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
}
@Override
public void onCallScreeningFilterComplete(Call call, CallFilteringResult result, String
packageName) {
public void onCallScreeningFilterComplete(Call call, CallFilteringResult result,
String packageName) {
synchronized (mTelecomLock) {
mResult = result.combine(mResult);
if (!TextUtils.isEmpty(packageName) && packageName.equals(getCarrierPackageName())) {
@ -154,7 +166,7 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
bindDefaultDialerAndUserChosenService();
} else {
createCallScreeningServiceFilter().startCallScreeningFilter(mCall, this,
carrierPackageName);
carrierPackageName, mAppLabelProxy.getAppLabel(carrierPackageName));
}
// Carrier filtering timed out
@ -176,7 +188,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
mIsDefaultDialerFinished = true;
} else {
createCallScreeningServiceFilter().startCallScreeningFilter(mCall,
CallScreeningServiceController.this, dialerPackageName);
CallScreeningServiceController.this, dialerPackageName,
mAppLabelProxy.getAppLabel(dialerPackageName));
}
String userChosenPackageName = getUserChosenPackageName();
@ -184,7 +197,8 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
mIsUserChosenFinished = true;
} else {
createCallScreeningServiceFilter().startCallScreeningFilter(mCall,
CallScreeningServiceController.this, userChosenPackageName);
CallScreeningServiceController.this, userChosenPackageName,
mAppLabelProxy.getAppLabel(userChosenPackageName));
}
if (mIsDefaultDialerFinished && mIsUserChosenFinished) {
@ -250,15 +264,6 @@ public class CallScreeningServiceController implements IncomingCallFilter.CallFi
}
private String getUserChosenPackageName() {
ComponentName componentName = null;
String defaultCallScreeningApplication = mSettingsSecureAdapter.getStringForUser(mContext
.getContentResolver(), Settings.Secure.CALL_SCREENING_DEFAULT_COMPONENT,
UserHandle.USER_CURRENT);
if (!TextUtils.isEmpty(defaultCallScreeningApplication)) {
componentName = ComponentName.unflattenFromString(defaultCallScreeningApplication);
}
return componentName != null ? componentName.getPackageName() : null;
return mCallsManager.getRoleManagerAdapter().getDefaultCallScreeningApp();
}
}

View File

@ -31,6 +31,7 @@ import android.provider.CallLog;
import android.provider.Settings;
import android.telecom.CallScreeningService;
import android.telecom.Log;
import android.telecom.ParcelableCall;
import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.text.TextUtils;
@ -136,7 +137,7 @@ public class CallScreeningServiceFilter {
isServiceRequestingLogging, //shouldAddToCallLog
shouldShowNotification, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE, //callBlockReason
componentName.getPackageName(), //callScreeningAppName
mAppName, //callScreeningAppName
componentName.flattenToString() //callScreeningComponentName
);
} else {
@ -152,7 +153,6 @@ public class CallScreeningServiceFilter {
}
private final Context mContext;
private final PhoneAccountRegistrar mPhoneAccountRegistrar;
private final CallsManager mCallsManager;
private final ParcelableCallUtils.Converter mParcelableCallUtilsConverter;
private final TelecomSystem.SyncRoot mTelecomLock;
@ -163,6 +163,7 @@ public class CallScreeningServiceFilter {
private ICallScreeningService mService;
private ServiceConnection mConnection;
private String mPackageName;
private String mAppName;
private boolean mHasFinished = false;
private CallFilteringResult mResult = new CallFilteringResult(
@ -180,7 +181,6 @@ public class CallScreeningServiceFilter {
TelecomSystem.SyncRoot lock,
SettingsSecureAdapter settingsSecureAdapter) {
mContext = context;
mPhoneAccountRegistrar = phoneAccountRegistrar;
mCallsManager = callsManager;
mParcelableCallUtilsConverter = parcelableCallUtilsConverter;
mTelecomLock = lock;
@ -189,7 +189,8 @@ public class CallScreeningServiceFilter {
public void startCallScreeningFilter(Call call,
CallScreeningFilterResultCallback callback,
String packageName) {
String packageName,
String appName) {
if (mHasFinished) {
Log.w(this, "Attempting to reuse CallScreeningServiceFilter. Ignoring.");
return;
@ -198,6 +199,7 @@ public class CallScreeningServiceFilter {
mCall = call;
mCallback = callback;
mPackageName = packageName;
mAppName = appName;
if (!bindService()) {
Log.i(this, "Could not bind to call screening service");
finishCallScreening();
@ -268,11 +270,9 @@ public class CallScreeningServiceFilter {
private void onServiceBound(ICallScreeningService service) {
mService = service;
try {
// Important: Only send a minimal subset of the call to the screening service.
mService.screenCall(new CallScreeningAdapter(),
mParcelableCallUtilsConverter.toParcelableCall(
mCall,
false, /* includeVideoProvider */
mPhoneAccountRegistrar));
mParcelableCallUtilsConverter.toParcelableCallForScreening(mCall));
} catch (RemoteException e) {
Log.e(this, e, "Failed to set the call screening adapter.");
finishCallScreening();

View File

@ -50,6 +50,8 @@ import com.android.server.telecom.ProximitySensorManagerFactory;
import com.android.server.telecom.InCallWakeLockController;
import com.android.server.telecom.ProximitySensorManager;
import com.android.server.telecom.R;
import com.android.server.telecom.RoleManagerAdapter;
import com.android.server.telecom.RoleManagerAdapterImpl;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.TelecomWakeLock;
import com.android.server.telecom.Timeouts;
@ -185,7 +187,8 @@ public class TelecomService extends Service implements TelecomSystem.Component {
public long elapsedRealtime() {
return SystemClock.elapsedRealtime();
}
}));
},
new RoleManagerAdapterImpl()));
}
if (BluetoothAdapter.getDefaultAdapter() != null) {
context.startService(new Intent(context, BluetoothPhoneService.class));

View File

@ -238,5 +238,19 @@
<receiver android:exported="false"
android:process="com.android.server.telecom.testapps.SelfMangingCallingApp"
android:name="com.android.server.telecom.testapps.SelfManagedCallNotificationReceiver" />
<service
android:name=".TestCallScreeningService"
android:permission="android.permission.BIND_SCREENING_SERVICE">
<intent-filter>
<action android:name="android.telecom.CallScreeningService"/>
</intent-filter>
</service>
<activity android:name=".CallScreeningActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:excludeFromRecents="true"
android:launchMode="singleInstance">
</activity>
</application>
</manifest>

View File

@ -0,0 +1,55 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.server.telecom.testapps;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.telecom.CallScreeningService;
import android.view.WindowManager;
public class CallScreeningActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle("Test Call Screening")
.setMessage("Allow the call?")
.setNegativeButton("Block", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (TestCallScreeningService.getInstance() != null) {
TestCallScreeningService.getInstance().blockCall();
}
finish();
}
})
.setPositiveButton("Allow", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (TestCallScreeningService.getInstance() != null) {
TestCallScreeningService.getInstance().allowCall();
}
finish();
}
}).create();
alertDialog.show();
}
}

View File

@ -0,0 +1,68 @@
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License
*/
package com.android.server.telecom.testapps;
import android.content.Intent;
import android.telecom.Call;
import android.telecom.CallScreeningService;
import android.telecom.Log;
public class TestCallScreeningService extends CallScreeningService {
private Call.Details mDetails;
private static TestCallScreeningService sTestCallScreeningService;
public static TestCallScreeningService getInstance() {
return sTestCallScreeningService;
}
/**
* Handles request from the system to screen an incoming call.
* @param callDetails Information about a new incoming call, see {@link Call.Details}.
*/
@Override
public void onScreenCall(Call.Details callDetails) {
Log.i(this, "onScreenCall: received call %s", callDetails);
sTestCallScreeningService = this;
mDetails = callDetails;
Intent errorIntent = new Intent(this, CallScreeningActivity.class);
errorIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(errorIntent);
}
public void blockCall() {
CallScreeningService.CallResponse
response = new CallScreeningService.CallResponse.Builder()
.setDisallowCall(true)
.setRejectCall(true)
.setSkipCallLog(false)
.setSkipNotification(true)
.build();
respondToCall(mDetails, response);
}
public void allowCall() {
CallScreeningService.CallResponse
response = new CallScreeningService.CallResponse.Builder()
.setDisallowCall(false)
.setRejectCall(false)
.setSkipCallLog(false)
.setSkipNotification(false)
.build();
respondToCall(mDetails, response);
}
}

View File

@ -39,6 +39,7 @@ import com.android.server.telecom.CallerInfoLookupHelper;
import com.android.server.telecom.CallsManager;
import com.android.server.telecom.ParcelableCallUtils;
import com.android.server.telecom.PhoneAccountRegistrar;
import com.android.server.telecom.RoleManagerAdapter;
import com.android.server.telecom.TelecomServiceImpl;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.callfiltering.CallFilterResultCallback;
@ -71,6 +72,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
@Mock Call mCall;
@Mock private CallFilterResultCallback mCallback;
@Mock CallsManager mCallsManager;
@Mock RoleManagerAdapter mRoleManagerAdapter;
@Mock CarrierConfigManager mCarrierConfigManager;
@Mock private TelecomManager mTelecomManager;
@Mock PackageManager mPackageManager;
@ -78,6 +80,14 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
@Mock PhoneAccountRegistrar mPhoneAccountRegistrar;
@Mock private CallerInfoLookupHelper mCallerInfoLookupHelper;
CallScreeningServiceController.AppLabelProxy mAppLabelProxy =
new CallScreeningServiceController.AppLabelProxy() {
@Override
public String getAppLabel(String packageName) {
return APP_NAME;
}
};
private ResolveInfo mResolveInfo;
private TelecomServiceImpl.SettingsSecureAdapter mSettingsSecureAdapter =
spy(new CallScreeningServiceFilterTest.SettingsSecureAdapterFake());
@ -88,6 +98,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
private static final String DEFAULT_DIALER_PACKAGE = "com.android.dialer";
private static final String PKG_NAME = "com.android.services.telecom.tests";
private static final String CLS_NAME = "CallScreeningService";
private static final String APP_NAME = "Screeny McScreenface";
private static final ComponentName CARRIER_DEFINED_CALL_SCREENING = new ComponentName(
"com.android.carrier", "com.android.carrier.callscreeningserviceimpl");
private static final ComponentName DEFAULT_DIALER_CALL_SCREENING = new ComponentName(
@ -120,6 +131,10 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
@Before
public void setUp() throws Exception {
super.setUp();
when(mRoleManagerAdapter.getCallCompanionApps()).thenReturn(Collections.emptyList());
when(mRoleManagerAdapter.getDefaultCallScreeningApp()).thenReturn(null);
when(mRoleManagerAdapter.getCarModeDialerApp()).thenReturn(null);
when(mCallsManager.getRoleManagerAdapter()).thenReturn(mRoleManagerAdapter);
when(mCallsManager.getCurrentUserHandle()).thenReturn(UserHandle.CURRENT);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mCall.getId()).thenReturn(CALL_ID);
@ -147,10 +162,12 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
@SmallTest
@Test
public void testAllAllowCall() {
when(mRoleManagerAdapter.getDefaultCallScreeningApp()).thenReturn(
USER_CHOSEN_CALL_SCREENING.getPackageName());
CallScreeningServiceController controller = new CallScreeningServiceController(mContext,
mCallsManager,
mPhoneAccountRegistrar, mParcelableCallUtilsConverter, mLock,
mSettingsSecureAdapter, mCallerInfoLookupHelper);
mCallsManager, mPhoneAccountRegistrar,
mParcelableCallUtilsConverter, mLock,
mSettingsSecureAdapter, mCallerInfoLookupHelper, mAppLabelProxy);
controller.startFilterLookup(mCall, mCallback);
@ -181,7 +198,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
CallScreeningServiceController controller = new CallScreeningServiceController(mContext,
mCallsManager,
mPhoneAccountRegistrar, mParcelableCallUtilsConverter, mLock,
mSettingsSecureAdapter, mCallerInfoLookupHelper);
mSettingsSecureAdapter, mCallerInfoLookupHelper, mAppLabelProxy);
controller.startFilterLookup(mCall, mCallback);
@ -207,7 +224,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
CallScreeningServiceController controller = new CallScreeningServiceController(mContext,
mCallsManager,
mPhoneAccountRegistrar, mParcelableCallUtilsConverter, mLock,
mSettingsSecureAdapter, mCallerInfoLookupHelper);
mSettingsSecureAdapter, mCallerInfoLookupHelper, mAppLabelProxy);
controller.startFilterLookup(mCall, mCallback);
@ -217,7 +234,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
false, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE,
CARRIER_DEFINED_CALL_SCREENING.getPackageName(),
APP_NAME,
CARRIER_DEFINED_CALL_SCREENING.flattenToString()
), CARRIER_DEFINED_CALL_SCREENING.getPackageName());
@ -232,7 +249,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
false, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE, //callBlockReason
CARRIER_DEFINED_CALL_SCREENING.getPackageName(), //callScreeningAppName
APP_NAME, //callScreeningAppName
CARRIER_DEFINED_CALL_SCREENING.flattenToString() //callScreeningComponentName
)));
}
@ -240,10 +257,12 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
@SmallTest
@Test
public void testDefaultDialerRejectCall() {
when(mRoleManagerAdapter.getDefaultCallScreeningApp()).thenReturn(
USER_CHOSEN_CALL_SCREENING.getPackageName());
CallScreeningServiceController controller = new CallScreeningServiceController(mContext,
mCallsManager,
mPhoneAccountRegistrar, mParcelableCallUtilsConverter, mLock,
mSettingsSecureAdapter, mCallerInfoLookupHelper);
mSettingsSecureAdapter, mCallerInfoLookupHelper, mAppLabelProxy);
controller.startFilterLookup(mCall, mCallback);
@ -261,7 +280,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
false, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE,
DEFAULT_DIALER_CALL_SCREENING.getPackageName(),
APP_NAME,
DEFAULT_DIALER_CALL_SCREENING.flattenToString()
), DEFAULT_DIALER_CALL_SCREENING.getPackageName());
@ -276,7 +295,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
false, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE, //callBlockReason
DEFAULT_DIALER_CALL_SCREENING.getPackageName(), //callScreeningAppName
APP_NAME, //callScreeningAppName
DEFAULT_DIALER_CALL_SCREENING.flattenToString() //callScreeningComponentName
)));
}
@ -284,10 +303,12 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
@SmallTest
@Test
public void testUserChosenRejectCall() {
when(mRoleManagerAdapter.getDefaultCallScreeningApp()).thenReturn(
USER_CHOSEN_CALL_SCREENING.getPackageName());
CallScreeningServiceController controller = new CallScreeningServiceController(mContext,
mCallsManager,
mPhoneAccountRegistrar, mParcelableCallUtilsConverter, mLock,
mSettingsSecureAdapter, mCallerInfoLookupHelper);
mSettingsSecureAdapter, mCallerInfoLookupHelper, mAppLabelProxy);
controller.startFilterLookup(mCall, mCallback);
@ -307,7 +328,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
false, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE,
USER_CHOSEN_CALL_SCREENING.getPackageName(),
APP_NAME,
USER_CHOSEN_CALL_SCREENING.flattenToString()
), USER_CHOSEN_CALL_SCREENING.getPackageName());
@ -322,7 +343,7 @@ public class CallScreeningServiceControllerTest extends TelecomTestCase {
false, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE, //callBlockReason
USER_CHOSEN_CALL_SCREENING.getPackageName(), //callScreeningAppName
APP_NAME, //callScreeningAppName
USER_CHOSEN_CALL_SCREENING.flattenToString() //callScreeningComponentName
)));
}

View File

@ -88,17 +88,20 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
spy(new SettingsSecureAdapterFake());
private static final String PKG_NAME = "com.android.services.telecom.tests";
private static final String APP_NAME = "TeleTestApp";
private static final String CLS_NAME = "CallScreeningService";
private static final ComponentName COMPONENT_NAME = new ComponentName(PKG_NAME, CLS_NAME);
private static final String CALL_ID = "u89prgt9ps78y5";
private static final String DEFAULT_DIALER_PACKAGE = "com.android.dialer";
private static final ComponentName CARRIER_DEFINED_CALL_SCREENING = new ComponentName(
"com.android.carrier", "com.android.carrier.callscreeningserviceimpl");
private static final String CARRIER_DEFINED_CALL_SCREENING_APP_NAME = "GMob";
private static final ComponentName DEFAULT_DIALER_CALL_SCREENING = new ComponentName(
"com.android.dialer", "com.android.dialer.callscreeningserviceimpl");
private static final String DEFAULT_DIALER_APP_NAME = "Dialer";
private static final ComponentName USER_CHOSEN_CALL_SCREENING = new ComponentName(
"com.android.userchosen", "com.android.userchosen.callscreeningserviceimpl");
private static final String USER_CHOSEN_CALL_SCREENING_APP_NAME = "UserChosen";
private ResolveInfo mResolveInfo;
private static final CallFilteringResult PASS_RESULT = new CallFilteringResult(
@ -154,7 +157,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
@SmallTest
@Test
public void testNoPackageName() {
mFilter.startCallScreeningFilter(mCall, mCallback, null);
mFilter.startCallScreeningFilter(mCall, mCallback, null, null);
verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(null));
}
@ -163,7 +166,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
public void testNoResolveEntries() {
when(mPackageManager.queryIntentServicesAsUser(nullable(Intent.class), anyInt(), anyInt()))
.thenReturn(Collections.emptyList());
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME);
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME);
verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME));
}
@ -171,7 +174,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
@Test
public void testBadResolveEntry() {
mResolveInfo.serviceInfo = null;
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME);
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME);
verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME));
}
@ -179,7 +182,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
@Test
public void testPermissionlessFilterService() {
mResolveInfo.serviceInfo.permission = null;
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME);
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME);
verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME));
}
@ -188,7 +191,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
public void testContextFailToBind() {
when(mContext.bindServiceAsUser(nullable(Intent.class), nullable(ServiceConnection.class),
anyInt(), eq(UserHandle.CURRENT))).thenReturn(false);
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME);
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME);
verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME));
}
@ -197,7 +200,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
public void testExceptionInScreeningService() throws Exception {
doThrow(new RemoteException()).when(mCallScreeningService).screenCall(
nullable(ICallScreeningAdapter.class), nullable(ParcelableCall.class));
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME);
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME);
ServiceConnection serviceConnection = verifyBindingIntent();
serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
verify(mCallback).onCallScreeningFilterComplete(eq(mCall), eq(PASS_RESULT), eq(PKG_NAME));
@ -206,7 +209,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
@SmallTest
@Test
public void testAllowCall() throws Exception {
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME);
mFilter.startCallScreeningFilter(mCall, mCallback, PKG_NAME, APP_NAME);
ServiceConnection serviceConnection = verifyBindingIntent();
serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
ICallScreeningAdapter csAdapter = getCallScreeningAdapter();
@ -224,7 +227,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
when(mTelecomManager.getDefaultDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
mFilter.startCallScreeningFilter(mCall, mCallback,
CARRIER_DEFINED_CALL_SCREENING.getPackageName());
CARRIER_DEFINED_CALL_SCREENING.getPackageName(),
CARRIER_DEFINED_CALL_SCREENING_APP_NAME);
ServiceConnection serviceConnection = verifyBindingIntent();
serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
ICallScreeningAdapter csAdapter = getCallScreeningAdapter();
@ -240,7 +244,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
false, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE, //callBlockReason
CARRIER_DEFINED_CALL_SCREENING.getPackageName(), //callScreeningAppName
CARRIER_DEFINED_CALL_SCREENING_APP_NAME, //callScreeningAppName
CARRIER_DEFINED_CALL_SCREENING.flattenToString() //callScreeningComponentName
)), eq(CARRIER_DEFINED_CALL_SCREENING.getPackageName()));
}
@ -255,7 +259,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
when(mTelecomManager.getDefaultDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
mFilter.startCallScreeningFilter(mCall, mCallback,
DEFAULT_DIALER_CALL_SCREENING.getPackageName());
DEFAULT_DIALER_CALL_SCREENING.getPackageName(),
DEFAULT_DIALER_APP_NAME);
ServiceConnection serviceConnection = verifyBindingIntent();
serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
ICallScreeningAdapter csAdapter = getCallScreeningAdapter();
@ -271,7 +276,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
true, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE, //callBlockReason
DEFAULT_DIALER_CALL_SCREENING.getPackageName(), //callScreeningAppName
DEFAULT_DIALER_APP_NAME, //callScreeningAppName
DEFAULT_DIALER_CALL_SCREENING.flattenToString() //callScreeningComponentName
)), eq(DEFAULT_DIALER_CALL_SCREENING.getPackageName()));
}
@ -286,7 +291,8 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
when(mTelecomManager.getDefaultDialerPackage()).thenReturn(DEFAULT_DIALER_PACKAGE);
mFilter.startCallScreeningFilter(mCall, mCallback,
USER_CHOSEN_CALL_SCREENING.getPackageName());
USER_CHOSEN_CALL_SCREENING.getPackageName(),
USER_CHOSEN_CALL_SCREENING_APP_NAME);
ServiceConnection serviceConnection = verifyBindingIntent();
serviceConnection.onServiceConnected(COMPONENT_NAME, mBinder);
ICallScreeningAdapter csAdapter = getCallScreeningAdapter();
@ -302,7 +308,7 @@ public class CallScreeningServiceFilterTest extends TelecomTestCase {
true, // shouldAddToCallLog
true, // shouldShowNotification
CallLog.Calls.BLOCK_REASON_CALL_SCREENING_SERVICE, //callBlockReason
USER_CHOSEN_CALL_SCREENING.getPackageName(), //callScreeningAppName
USER_CHOSEN_CALL_SCREENING_APP_NAME, //callScreeningAppName
USER_CHOSEN_CALL_SCREENING.flattenToString() //callScreeningComponentName
)), eq(USER_CHOSEN_CALL_SCREENING.getPackageName()));
}

View File

@ -86,6 +86,7 @@ import com.android.server.telecom.PhoneNumberUtilsAdapter;
import com.android.server.telecom.PhoneNumberUtilsAdapterImpl;
import com.android.server.telecom.ProximitySensorManager;
import com.android.server.telecom.ProximitySensorManagerFactory;
import com.android.server.telecom.RoleManagerAdapter;
import com.android.server.telecom.StatusBarNotifier;
import com.android.server.telecom.TelecomSystem;
import com.android.server.telecom.Timeouts;
@ -104,6 +105,7 @@ import org.mockito.stubbing.Answer;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@ -213,6 +215,7 @@ public class TelecomSystemTest extends TelecomTestCase {
@Mock AsyncRingtonePlayer mAsyncRingtonePlayer;
@Mock IncomingCallNotifier mIncomingCallNotifier;
@Mock ClockProxy mClockProxy;
@Mock RoleManagerAdapter mRoleManagerAdapter;
final ComponentName mInCallServiceComponentNameX =
new ComponentName(
@ -434,6 +437,9 @@ public class TelecomSystemTest extends TelecomTestCase {
mClockProxy = mock(ClockProxy.class);
when(mClockProxy.currentTimeMillis()).thenReturn(TEST_CREATE_TIME);
when(mClockProxy.elapsedRealtime()).thenReturn(TEST_CREATE_ELAPSED_TIME);
when(mRoleManagerAdapter.getCallCompanionApps()).thenReturn(Collections.emptyList());
when(mRoleManagerAdapter.getDefaultCallScreeningApp()).thenReturn(null);
when(mRoleManagerAdapter.getCarModeDialerApp()).thenReturn(null);
mTelecomSystem = new TelecomSystem(
mComponentContextFixture.getTestDouble(),
(context, phoneAccountRegistrar, defaultDialerCache) -> mMissedCallNotifier,
@ -469,7 +475,8 @@ public class TelecomSystemTest extends TelecomTestCase {
CallAudioRouteStateMachine.EARPIECE_FORCE_ENABLED);
}
},
mClockProxy);
mClockProxy,
mRoleManagerAdapter);
mComponentContextFixture.setTelecomManager(new TelecomManager(
mComponentContextFixture.getTestDouble(),