Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5133d8e0 authored by Thomas Stuart's avatar Thomas Stuart
Browse files

remap transactional capabilities

Prev, transactional call capabilities were not being remapped to
Connection capabilities which led to confusing logs and could mislead
InCallService listeners.

Now, transactional call capabilities are remapped to Connection
capabilities

Flag: com.android.server.telecom.flags.remap_transactional_capabilities
Fixes: 366063695
Test: 1 new unit test + manual
Change-Id: I80352d562d55b7f7a5dd971f46dc04c729be2091
parent 7c417153
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -37,3 +37,14 @@ flag {
      purpose: PURPOSE_BUGFIX
    }
}

# OWNER=tjstuart TARGET=25Q1
flag {
  name: "remap_transactional_capabilities"
  namespace: "telecom"
  description: "Transactional call capabilities need to be remapped to Connection capabilities"
  bug: "366063695"
  metadata {
      purpose: PURPOSE_BUGFIX
    }
}
 No newline at end of file
+19 −0
Original line number Diff line number Diff line
@@ -2290,6 +2290,25 @@ public class Call implements CreateConnectionResponse, EventManager.Loggable,
        setConnectionCapabilities(connectionCapabilities, false /* forceUpdate */);
    }

    public void setTransactionalCapabilities(Bundle extras) {
        if (!mFlags.remapTransactionalCapabilities()) {
            setConnectionCapabilities(
                    extras.getInt(CallAttributes.CALL_CAPABILITIES_KEY,
                            CallAttributes.SUPPORTS_SET_INACTIVE), true);
            return;
        }
        int connectionCapabilitesBitmap = 0;
        int transactionalCapabilitiesBitmap = extras.getInt(
                CallAttributes.CALL_CAPABILITIES_KEY,
                CallAttributes.SUPPORTS_SET_INACTIVE);
        if ((transactionalCapabilitiesBitmap & CallAttributes.SUPPORTS_SET_INACTIVE)
                == CallAttributes.SUPPORTS_SET_INACTIVE) {
            connectionCapabilitesBitmap = connectionCapabilitesBitmap | Connection.CAPABILITY_HOLD
                    | Connection.CAPABILITY_SUPPORT_HOLD;
        }
        setConnectionCapabilities(connectionCapabilitesBitmap, true);
    }

    void setConnectionCapabilities(int connectionCapabilities, boolean forceUpdate) {
        Log.v(this, "setConnectionCapabilities: %s", Connection.capabilitiesToString(
                connectionCapabilities));
+2 −6
Original line number Diff line number Diff line
@@ -1563,9 +1563,7 @@ public class CallsManager extends Call.ListenerBase
        if (extras.containsKey(TelecomManager.TRANSACTION_CALL_ID_KEY)) {
            call.setIsTransactionalCall(true);
            call.setCallingPackageIdentity(extras);
            call.setConnectionCapabilities(
                    extras.getInt(CallAttributes.CALL_CAPABILITIES_KEY,
                            CallAttributes.SUPPORTS_SET_INACTIVE), true);
            call.setTransactionalCapabilities(extras);
            call.setTargetPhoneAccount(phoneAccountHandle);
            if (extras.containsKey(CallAttributes.DISPLAY_NAME_KEY)) {
                CharSequence displayName = extras.getCharSequence(CallAttributes.DISPLAY_NAME_KEY);
@@ -1917,9 +1915,7 @@ public class CallsManager extends Call.ListenerBase
            if (extras.containsKey(TelecomManager.TRANSACTION_CALL_ID_KEY)) {
                call.setIsTransactionalCall(true);
                call.setCallingPackageIdentity(extras);
                call.setConnectionCapabilities(
                        extras.getInt(CallAttributes.CALL_CAPABILITIES_KEY,
                                CallAttributes.SUPPORTS_SET_INACTIVE), true);
                call.setTransactionalCapabilities(extras);
                if (extras.containsKey(CallAttributes.DISPLAY_NAME_KEY)) {
                    CharSequence displayName = extras.getCharSequence(
                            CallAttributes.DISPLAY_NAME_KEY);
+26 −0
Original line number Diff line number Diff line
@@ -152,6 +152,32 @@ public class CallTest extends TelecomTestCase {
        assertTrue(call.hasGoneActiveBefore());
    }

    /**
     * Verify that transactional calls remap the [CallAttributes#CallCapability]s to
     * Connection capabilities.
     */
    @Test
    @SmallTest
    public void testTransactionalCallCapabilityRemapping() {
        // ensure when the flag is disabled, the old behavior is unchanged
        Bundle disabledFlagExtras = new Bundle();
        Call call = createCall("1", Call.CALL_DIRECTION_INCOMING);
        disabledFlagExtras.putInt(CallAttributes.CALL_CAPABILITIES_KEY,
                Connection.CAPABILITY_MERGE_CONFERENCE);
        when(mFeatureFlags.remapTransactionalCapabilities()).thenReturn(false);
        call.setTransactionalCapabilities(disabledFlagExtras);
        assertTrue(call.can(Connection.CAPABILITY_MERGE_CONFERENCE));
        // enable the bug fix flag and ensure the transactional capabilities are remapped
        Bundle enabledFlagExtras = new Bundle();
        Call call2 = createCall("2", Call.CALL_DIRECTION_INCOMING);
        enabledFlagExtras.putInt(CallAttributes.CALL_CAPABILITIES_KEY,
                CallAttributes.SUPPORTS_SET_INACTIVE);
        when(mFeatureFlags.remapTransactionalCapabilities()).thenReturn(true);
        call2.setTransactionalCapabilities(enabledFlagExtras);
        assertTrue(call2.can(Connection.CAPABILITY_HOLD));
        assertTrue(call2.can(Connection.CAPABILITY_SUPPORT_HOLD));
    }

    /**
     * Verify Call#setVideoState will only upgrade to video if the PhoneAccount supports video
     * state capabilities