Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +16 −1 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.media.AudioDeviceInfo; import android.media.AudioProfile; import android.media.tv.TvInputInfo; import android.media.tv.TvInputManager.TvInputCallback; import android.os.Handler; import android.util.Slog; import android.util.SparseBooleanArray; Loading Loading @@ -97,9 +98,15 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { private boolean mSystemAudioMute = false; // If true, do not do routing control/send active source for internal source. // Set to true when the device was woken up by <Text/Image View On>. // Set to true for a short duration when the device is woken up by <Text/Image View On>. private boolean mSkipRoutingControl; // Handler for posting a runnable to set `mSkipRoutingControl` to false after a delay private final Handler mSkipRoutingControlHandler; // Runnable that sets `mSkipRoutingControl` to false private final Runnable mResetSkipRoutingControlRunnable = () -> mSkipRoutingControl = false; // Message buffer used to buffer selected messages to process later. <Active Source> // from a source device, for instance, needs to be buffered if the device is not // discovered yet. The buffered commands are taken out and when they are ready to Loading Loading @@ -162,6 +169,7 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL) == HdmiControlManager.SYSTEM_AUDIO_CONTROL_ENABLED; mStandbyHandler = new HdmiCecStandbyModeHandler(service, this); mSkipRoutingControlHandler = new Handler(service.getServiceLooper()); } @Override Loading @@ -184,7 +192,14 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mService.getHdmiCecNetwork().addCecSwitch( mService.getHdmiCecNetwork().getPhysicalAddress()); // TV is a CEC switch too. mTvInputs.clear(); mSkipRoutingControl = (reason == HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE); mSkipRoutingControlHandler.removeCallbacks(mResetSkipRoutingControlRunnable); if (mSkipRoutingControl) { mSkipRoutingControlHandler.postDelayed(mResetSkipRoutingControlRunnable, HdmiConfig.TIMEOUT_MS); } launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC && reason != HdmiControlService.INITIATED_BY_BOOT_UP); resetSelectRequestBuffer(); Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.server.hdmi.Constants.ADDR_RECORDER_1; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -1807,4 +1808,35 @@ public class HdmiCecLocalDeviceTvTest { // TV should only send <Give Osd Name> once assertEquals(1, Collections.frequency(mNativeWrapper.getResultMessages(), giveOsdName)); } @Test public void initiateCecByWakeupMessage_selectInternalSourceAfterDelay_broadcastsActiveSource() { HdmiCecMessage activeSourceFromTv = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_WAKE_UP_MESSAGE); mTestLooper.dispatchAll(); mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS); mTestLooper.dispatchAll(); mHdmiCecLocalDeviceTv.deviceSelect(ADDR_TV, new TestCallback()); mTestLooper.dispatchAll(); assertThat(mNativeWrapper.getResultMessages()).contains(activeSourceFromTv); } @Test public void initiateCecByWakeupMessage_selectInternalSource_doesNotBroadcastActiveSource() { HdmiCecMessage activeSourceFromTv = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_WAKE_UP_MESSAGE); mTestLooper.dispatchAll(); mHdmiCecLocalDeviceTv.deviceSelect(ADDR_TV, new TestCallback()); mTestLooper.dispatchAll(); assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSourceFromTv); } } Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java +16 −1 Original line number Diff line number Diff line Loading @@ -47,6 +47,7 @@ import android.media.AudioDeviceInfo; import android.media.AudioProfile; import android.media.tv.TvInputInfo; import android.media.tv.TvInputManager.TvInputCallback; import android.os.Handler; import android.util.Slog; import android.util.SparseBooleanArray; Loading Loading @@ -97,9 +98,15 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { private boolean mSystemAudioMute = false; // If true, do not do routing control/send active source for internal source. // Set to true when the device was woken up by <Text/Image View On>. // Set to true for a short duration when the device is woken up by <Text/Image View On>. private boolean mSkipRoutingControl; // Handler for posting a runnable to set `mSkipRoutingControl` to false after a delay private final Handler mSkipRoutingControlHandler; // Runnable that sets `mSkipRoutingControl` to false private final Runnable mResetSkipRoutingControlRunnable = () -> mSkipRoutingControl = false; // Message buffer used to buffer selected messages to process later. <Active Source> // from a source device, for instance, needs to be buffered if the device is not // discovered yet. The buffered commands are taken out and when they are ready to Loading Loading @@ -162,6 +169,7 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { HdmiControlManager.CEC_SETTING_NAME_SYSTEM_AUDIO_CONTROL) == HdmiControlManager.SYSTEM_AUDIO_CONTROL_ENABLED; mStandbyHandler = new HdmiCecStandbyModeHandler(service, this); mSkipRoutingControlHandler = new Handler(service.getServiceLooper()); } @Override Loading @@ -184,7 +192,14 @@ public final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice { mService.getHdmiCecNetwork().addCecSwitch( mService.getHdmiCecNetwork().getPhysicalAddress()); // TV is a CEC switch too. mTvInputs.clear(); mSkipRoutingControl = (reason == HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE); mSkipRoutingControlHandler.removeCallbacks(mResetSkipRoutingControlRunnable); if (mSkipRoutingControl) { mSkipRoutingControlHandler.postDelayed(mResetSkipRoutingControlRunnable, HdmiConfig.TIMEOUT_MS); } launchRoutingControl(reason != HdmiControlService.INITIATED_BY_ENABLE_CEC && reason != HdmiControlService.INITIATED_BY_BOOT_UP); resetSelectRequestBuffer(); Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceTvTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static com.android.server.hdmi.Constants.ADDR_RECORDER_1; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE; import static com.google.common.truth.Truth.assertThat; Loading Loading @@ -1807,4 +1808,35 @@ public class HdmiCecLocalDeviceTvTest { // TV should only send <Give Osd Name> once assertEquals(1, Collections.frequency(mNativeWrapper.getResultMessages(), giveOsdName)); } @Test public void initiateCecByWakeupMessage_selectInternalSourceAfterDelay_broadcastsActiveSource() { HdmiCecMessage activeSourceFromTv = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_WAKE_UP_MESSAGE); mTestLooper.dispatchAll(); mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS); mTestLooper.dispatchAll(); mHdmiCecLocalDeviceTv.deviceSelect(ADDR_TV, new TestCallback()); mTestLooper.dispatchAll(); assertThat(mNativeWrapper.getResultMessages()).contains(activeSourceFromTv); } @Test public void initiateCecByWakeupMessage_selectInternalSource_doesNotBroadcastActiveSource() { HdmiCecMessage activeSourceFromTv = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_WAKE_UP_MESSAGE); mTestLooper.dispatchAll(); mHdmiCecLocalDeviceTv.deviceSelect(ADDR_TV, new TestCallback()); mTestLooper.dispatchAll(); assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSourceFromTv); } }