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:
parent
310362192f
commit
5a2f6feb21
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
||||
)));
|
||||
}
|
||||
|
|
|
@ -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()));
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
Loading…
Reference in New Issue