Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +42 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,13 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { // TODO(amyjojo): adding system constants for input ports to TIF mapping. private int mLocalActivePath = 0; // Determines what action should be taken upon receiving Routing Control messages. @VisibleForTesting protected HdmiProperties.playback_device_action_on_routing_control_values mPlaybackDeviceActionOnRoutingControl = HdmiProperties .playback_device_action_on_routing_control() .orElse(HdmiProperties.playback_device_action_on_routing_control_values.NONE); HdmiCecLocalDevicePlayback(HdmiControlService service) { super(service, HdmiDeviceInfo.DEVICE_PLAYBACK); Loading Loading @@ -322,6 +329,41 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { return true; } @Override @ServiceThreadOnly protected boolean handleRoutingChange(HdmiCecMessage message) { assertRunOnServiceThread(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2); handleRoutingChangeAndInformation(physicalAddress, message); return true; } @Override @ServiceThreadOnly protected boolean handleRoutingInformation(HdmiCecMessage message) { assertRunOnServiceThread(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); handleRoutingChangeAndInformation(physicalAddress, message); return true; } @Override protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { if (physicalAddress != mService.getPhysicalAddress()) { return; // Do nothing. } switch (mPlaybackDeviceActionOnRoutingControl) { case WAKE_UP_AND_SEND_ACTIVE_SOURCE: setAndBroadcastActiveSource(message, physicalAddress); break; case WAKE_UP_ONLY: mService.wakeUp(); break; case NONE: break; } } @Override protected int findKeyReceiverAddress() { return Constants.ADDR_TV; Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +2 −1 Original line number Diff line number Diff line Loading @@ -196,7 +196,8 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // do nothing } // Source device with Switch functionality should implement this method. // Only source devices that react to routing control messages should implement // this method (e.g. a TV with built in switch). // TODO(): decide which type will handle the routing when multi device type is supported protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { // do nothing Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +132 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.server.hdmi; import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; Loading @@ -28,6 +29,7 @@ import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; import android.sysprop.HdmiProperties; import android.view.KeyEvent; import androidx.test.InstrumentationRegistry; Loading Loading @@ -121,6 +123,136 @@ public class HdmiCecLocalDevicePlaybackTest { mNativeWrapper.clearResultMessages(); } @Test public void handleRoutingChange_None() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.NONE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingInformation_None() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.NONE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingChange_WakeUpOnly() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.WAKE_UP_ONLY; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingInformation_WakeUpOnly() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.WAKE_UP_ONLY; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingChange_WakeUpAndSendActiveSource() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties .playback_device_action_on_routing_control_values .WAKE_UP_AND_SEND_ACTIVE_SOURCE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); } @Test public void handleRoutingInformation_WakeUpAndSendActiveSource() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties .playback_device_action_on_routing_control_values .WAKE_UP_AND_SEND_ACTIVE_SOURCE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); } // Playback device does not handle routing control related feature right now @Ignore("b/120845532") @Test Loading Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +42 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,13 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { // TODO(amyjojo): adding system constants for input ports to TIF mapping. private int mLocalActivePath = 0; // Determines what action should be taken upon receiving Routing Control messages. @VisibleForTesting protected HdmiProperties.playback_device_action_on_routing_control_values mPlaybackDeviceActionOnRoutingControl = HdmiProperties .playback_device_action_on_routing_control() .orElse(HdmiProperties.playback_device_action_on_routing_control_values.NONE); HdmiCecLocalDevicePlayback(HdmiControlService service) { super(service, HdmiDeviceInfo.DEVICE_PLAYBACK); Loading Loading @@ -322,6 +329,41 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { return true; } @Override @ServiceThreadOnly protected boolean handleRoutingChange(HdmiCecMessage message) { assertRunOnServiceThread(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2); handleRoutingChangeAndInformation(physicalAddress, message); return true; } @Override @ServiceThreadOnly protected boolean handleRoutingInformation(HdmiCecMessage message) { assertRunOnServiceThread(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); handleRoutingChangeAndInformation(physicalAddress, message); return true; } @Override protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { if (physicalAddress != mService.getPhysicalAddress()) { return; // Do nothing. } switch (mPlaybackDeviceActionOnRoutingControl) { case WAKE_UP_AND_SEND_ACTIVE_SOURCE: setAndBroadcastActiveSource(message, physicalAddress); break; case WAKE_UP_ONLY: mService.wakeUp(); break; case NONE: break; } } @Override protected int findKeyReceiverAddress() { return Constants.ADDR_TV; Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +2 −1 Original line number Diff line number Diff line Loading @@ -196,7 +196,8 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // do nothing } // Source device with Switch functionality should implement this method. // Only source devices that react to routing control messages should implement // this method (e.g. a TV with built in switch). // TODO(): decide which type will handle the routing when multi device type is supported protected void handleRoutingChangeAndInformation(int physicalAddress, HdmiCecMessage message) { // do nothing Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +132 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ package com.android.server.hdmi; import static com.android.server.hdmi.Constants.ADDR_PLAYBACK_1; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; Loading @@ -28,6 +29,7 @@ import android.os.Looper; import android.os.PowerManager; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; import android.sysprop.HdmiProperties; import android.view.KeyEvent; import androidx.test.InstrumentationRegistry; Loading Loading @@ -121,6 +123,136 @@ public class HdmiCecLocalDevicePlaybackTest { mNativeWrapper.clearResultMessages(); } @Test public void handleRoutingChange_None() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.NONE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingInformation_None() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.NONE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isFalse(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingChange_WakeUpOnly() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.WAKE_UP_ONLY; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingInformation_WakeUpOnly() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties.playback_device_action_on_routing_control_values.WAKE_UP_ONLY; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse(); } @Test public void handleRoutingChange_WakeUpAndSendActiveSource() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties .playback_device_action_on_routing_control_values .WAKE_UP_AND_SEND_ACTIVE_SOURCE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); } @Test public void handleRoutingInformation_WakeUpAndSendActiveSource() { mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl = HdmiProperties .playback_device_action_on_routing_control_values .WAKE_UP_AND_SEND_ACTIVE_SOURCE; mWokenUp = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress); HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildActiveSource(ADDR_PLAYBACK_1, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mWokenUp).isTrue(); assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage); } // Playback device does not handle routing control related feature right now @Ignore("b/120845532") @Test Loading