Merge "Bind to non-ui incall services for self-mgd calls"

This commit is contained in:
Chen Chen 2021-01-11 19:00:46 +00:00 committed by Gerrit Code Review
commit 83ade72360
2 changed files with 53 additions and 5 deletions

View File

@ -1393,11 +1393,12 @@ public class InCallController extends CallsManagerListenerBase {
mInCallServiceConnection.chooseInitialInCallService(shouldUseCarModeUI());
// Actually try binding to the UI InCallService. If the response
// Actually try binding to the UI InCallService.
if (mInCallServiceConnection.connect(call) ==
InCallServiceConnection.CONNECTION_SUCCEEDED) {
InCallServiceConnection.CONNECTION_SUCCEEDED || call.isSelfManaged()) {
// Only connect to the non-ui InCallServices if we actually connected to the main UI
// one.
// one, or if the call is self-managed (in which case we'd still want to keep Wear, BT,
// etc. informed.
connectToNonUiInCallServices(call);
mBindingFuture = new CompletableFuture<Boolean>().completeOnTimeout(false,
mTimeoutsAdapter.getCallRemoveUnbindInCallServicesDelay(

View File

@ -876,6 +876,36 @@ public class InCallControllerTests extends TelecomTestCase {
verifyBinding(bindIntentCaptor, 1, APPOP_NONUI_PKG, APPOP_NONUI_CLASS);
}
/**
* Ensures that the {@link InCallController} will bind to a non-ui service even if no ui service
* is bound if the call is self managed.
*/
@MediumTest
@Test
public void testBindToService_NonUiSelfManaged() throws Exception {
setupMocks(false /* isExternalCall */, true);
setupMockPackageManager(false /* default */, true/* nonui */, true /* appop_nonui */,
true /* system */, false /* external calls */, false /* self mgd in default */,
false /* self mgd in car*/, true /* self managed in nonui */);
// we should bind to only the non ui app.
mInCallController.bindToServices(mMockCall);
// Bind InCallServices
ArgumentCaptor<Intent> bindIntentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mMockContext, times(1)).bindServiceAsUser(
bindIntentCaptor.capture(),
any(ServiceConnection.class),
eq(Context.BIND_AUTO_CREATE | Context.BIND_FOREGROUND_SERVICE
| Context.BIND_ALLOW_BACKGROUND_ACTIVITY_STARTS),
eq(UserHandle.CURRENT));
// Verify bind
assertEquals(1, bindIntentCaptor.getAllValues().size());
// Should have bound to the third party non ui app.
verifyBinding(bindIntentCaptor, 0, NONUI_PKG, NONUI_CLASS);
}
@MediumTest
@Test
@ -1238,7 +1268,7 @@ public class InCallControllerTests extends TelecomTestCase {
}};
}
private ResolveInfo getNonUiResolveinfo() {
private ResolveInfo getNonUiResolveinfo(boolean supportsSelfManaged) {
return new ResolveInfo() {{
serviceInfo = new ServiceInfo();
serviceInfo.packageName = NONUI_PKG;
@ -1247,6 +1277,11 @@ public class InCallControllerTests extends TelecomTestCase {
serviceInfo.applicationInfo.uid = NONUI_UID;
serviceInfo.enabled = true;
serviceInfo.permission = Manifest.permission.BIND_INCALL_SERVICE;
serviceInfo.metaData = new Bundle();
if (supportsSelfManaged) {
serviceInfo.metaData.putBoolean(
TelecomManager.METADATA_INCLUDE_SELF_MANAGED_CALLS, true);
}
}};
}
@ -1282,6 +1317,18 @@ public class InCallControllerTests extends TelecomTestCase {
final boolean useSystemDialer, final boolean includeExternalCalls,
final boolean includeSelfManagedCallsInDefaultDialer,
final boolean includeSelfManagedCallsInCarModeDialer) {
setupMockPackageManager(useDefaultDialer, useNonUiInCalls/* nonui */,
useAppOpNonUiInCalls/* appop_nonui */,
useSystemDialer, includeExternalCalls, includeSelfManagedCallsInDefaultDialer,
includeSelfManagedCallsInCarModeDialer, false);
}
private void setupMockPackageManager(final boolean useDefaultDialer,
final boolean useNonUiInCalls, final boolean useAppOpNonUiInCalls,
final boolean useSystemDialer, final boolean includeExternalCalls,
final boolean includeSelfManagedCallsInDefaultDialer,
final boolean includeSelfManagedCallsInCarModeDialer,
final boolean includeSelfManagedCallsInNonUi) {
doAnswer(new Answer() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
@ -1319,7 +1366,7 @@ public class InCallControllerTests extends TelecomTestCase {
} else {
// InCallController uses a blank package name when querying for non-ui incalls
if (useNonUiInCalls) {
resolveInfo.add(getNonUiResolveinfo());
resolveInfo.add(getNonUiResolveinfo(includeSelfManagedCallsInNonUi));
}
// InCallController uses a blank package name when querying for App Op non-ui incalls
if (useAppOpNonUiInCalls) {