diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java index aa2d6b46b7906..d8914b389191b 100755 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java @@ -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) { diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java index bc06e790ff4a7..5342486f930b4 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -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); + } }