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

Commit d4a3a5ce authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Update handling of Remote Control Passthrough messages

Never respond <Feature Abort>[Unrecognized Opcode] in cases where <User
Control Pressed> or <User Control Released> cannot be handled.

Bug: 180103617
Test: atest com.android.server.hdmi
Change-Id: I12c7de639ac31a9ae381c3706f64b53e3e92d71c
parent e3cad328
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -654,7 +654,9 @@ abstract class HdmiCecLocalDevice {
                    FOLLOWER_SAFETY_TIMEOUT);
            return true;
        }
        return false;

        mService.maySendFeatureAbortCommand(message, Constants.ABORT_INVALID_OPERAND);
        return true;
    }

    @ServiceThreadOnly
@@ -666,9 +668,8 @@ abstract class HdmiCecLocalDevice {
            final long upTime = SystemClock.uptimeMillis();
            injectKeyEvent(upTime, KeyEvent.ACTION_UP, mLastKeycode, 0);
            mLastKeycode = HdmiCecKeycode.UNSUPPORTED_KEYCODE;
            return true;
        }
        return false;
        return true;
    }

    static void injectKeyEvent(long time, int action, int keycode, int repeat) {
+29 −0
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

@SmallTest
@Presubmit
@@ -1601,4 +1602,32 @@ public class HdmiCecLocalDevicePlaybackTest {
                ABORT_UNRECOGNIZED_OPCODE);
        assertThat(mNativeWrapper.getResultMessages()).contains(featureAbort);
    }

    @Test
    public void shouldHandleUserControlPressedAndReleased() {
        HdmiCecMessage userControlPressed = HdmiCecMessageBuilder.buildUserControlPressed(
                ADDR_TV, mPlaybackLogicalAddress,
                HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
        HdmiCecMessage userControlReleased = HdmiCecMessageBuilder.buildUserControlReleased(
                ADDR_TV, mPlaybackLogicalAddress);

        mNativeWrapper.onCecMessage(userControlPressed);
        mTestLooper.dispatchAll();

        // Move past the follower safety timeout
        mTestLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(2));
        mTestLooper.dispatchAll();

        mNativeWrapper.onCecMessage(userControlReleased);
        mTestLooper.dispatchAll();

        HdmiCecMessage featureAbortPressed = HdmiCecMessageBuilder.buildFeatureAbortCommand(
                mPlaybackLogicalAddress, ADDR_TV, Constants.MESSAGE_USER_CONTROL_PRESSED,
                ABORT_UNRECOGNIZED_OPCODE);
        HdmiCecMessage featureAbortReleased = HdmiCecMessageBuilder.buildFeatureAbortCommand(
                mPlaybackLogicalAddress, ADDR_TV, Constants.MESSAGE_USER_CONTROL_RELEASED,
                ABORT_UNRECOGNIZED_OPCODE);
        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(featureAbortPressed);
        assertThat(mNativeWrapper.getResultMessages()).doesNotContain(featureAbortReleased);
    }
}