From cb9de2e5ac813f18e5b3fec8c17f71b1071ed9d7 Mon Sep 17 00:00:00 2001 From: Nathalie Le Clair Date: Wed, 23 Sep 2020 15:22:14 +0200 Subject: [PATCH 1/4] Replace mIsActiveSource by isActiveSource() Bug: 166760714 Test: atest HdmiCecLocalDevicePlaybackTest Change-Id: I3244ecb9bd1976d6cd258e777acab3a61ec229bc --- .../hdmi/HdmiCecLocalDevicePlayback.java | 21 ++-- .../server/hdmi/HdmiCecLocalDeviceSource.java | 36 ++++--- .../server/hdmi/HdmiControlService.java | 41 +++---- .../server/hdmi/ActiveSourceActionTest.java | 2 +- .../HdmiCecLocalDeviceAudioSystemTest.java | 90 +++++++++++++++- .../hdmi/HdmiCecLocalDevicePlaybackTest.java | 101 ++++++++++-------- .../hdmi/HdmiControlServiceBinderAPITest.java | 19 ++-- .../server/hdmi/HdmiControlServiceTest.java | 76 ------------- 8 files changed, 199 insertions(+), 187 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index f2f6dbe9bde5e..f8d852a4d1add 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -16,6 +16,7 @@ package com.android.server.hdmi; +import android.annotation.CallSuper; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.IHdmiControlCallback; @@ -170,7 +171,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { void onHotplug(int portId, boolean connected) { assertRunOnServiceThread(); mCecMessageCache.flushAll(); - // We'll not clear mIsActiveSource on the hotplug event to pass CETC 11.2.2-2 ~ 3. + // We'll not invalidate the active source on the hotplug event to pass CETC 11.2.2-2 ~ 3. if (!connected) { getWakeLock().release(); } @@ -183,13 +184,12 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { if (!mService.isControlEnabled()) { return; } - if (mIsActiveSource) { + if (isActiveSource()) { mService.sendCecCommand(HdmiCecMessageBuilder.buildInactiveSource( mAddress, mService.getPhysicalAddress())); } - boolean wasActiveSource = mIsActiveSource; + boolean wasActiveSource = isActiveSource(); // Invalidate the internal active source record when goes to standby - // This set will also update mIsActiveSource mService.setActiveSource(Constants.ADDR_INVALID, Constants.INVALID_PHYSICAL_ADDRESS, "HdmiCecLocalDevicePlayback#onStandby()"); if (initiatedByCec || !mAutoTvOff || !wasActiveSource) { @@ -234,12 +234,13 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { } @Override + @CallSuper @ServiceThreadOnly @VisibleForTesting - void setIsActiveSource(boolean on) { + protected void setActiveSource(int logicalAddress, int physicalAddress, String caller) { assertRunOnServiceThread(); - super.setIsActiveSource(on); - if (on) { + super.setActiveSource(logicalAddress, physicalAddress, caller); + if (isActiveSource()) { getWakeLock().acquire(); } else { getWakeLock().release(); @@ -296,7 +297,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { @Override protected void wakeUpIfActiveSource() { - if (!mIsActiveSource) { + if (!isActiveSource()) { return; } // Wake up the device if the power is in standby mode, or its screen is off - @@ -451,7 +452,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { @Override protected void dump(final IndentingPrintWriter pw) { super.dump(pw); - pw.println("mIsActiveSource: " + mIsActiveSource); + pw.println("isActiveSource(): " + isActiveSource()); pw.println("mAutoTvOff:" + mAutoTvOff); } @@ -472,7 +473,7 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { @Override public void acquire() { mWakeLock.acquire(); - HdmiLogger.debug("active source: %b. Wake lock acquired", mIsActiveSource); + HdmiLogger.debug("active source: %b. Wake lock acquired", isActiveSource()); } @Override diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index 4ff36c4b65db2..60e2bf152c374 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -16,6 +16,7 @@ package com.android.server.hdmi; +import android.annotation.CallSuper; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.IHdmiControlCallback; @@ -36,10 +37,6 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { private static final String TAG = "HdmiCecLocalDeviceSource"; - // Indicate if current device is Active Source or not - @VisibleForTesting - protected boolean mIsActiveSource = false; - // Device has cec switch functionality or not. // Default is false. protected boolean mIsSwitchDevice = HdmiProperties.is_switch().orElse(false); @@ -78,7 +75,7 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { if (mService.getPortInfo(portId).getType() == HdmiPortInfo.PORT_OUTPUT) { mCecMessageCache.flushAll(); } - // We'll not clear mIsActiveSource on the hotplug event to pass CETC 11.2.2-2 ~ 3. + // We'll not invalidate the active source on the hotplug event to pass CETC 11.2.2-2 ~ 3. if (connected) { mService.wakeUp(); } @@ -118,10 +115,21 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // Nothing to do. } + @Override + @CallSuper + @ServiceThreadOnly + void setActiveSource(int logicalAddress, int physicalAddress, String caller) { + boolean wasActiveSource = isActiveSource(); + super.setActiveSource(logicalAddress, physicalAddress, caller); + if (wasActiveSource && !isActiveSource()) { + onActiveSourceLost(); + } + } + @ServiceThreadOnly protected void setActiveSource(int physicalAddress, String caller) { assertRunOnServiceThread(); - // Invalidate the internal active source record. This will also update mIsActiveSource. + // Invalidate the internal active source record. ActiveSource activeSource = ActiveSource.of(Constants.ADDR_INVALID, physicalAddress); setActiveSource(activeSource, caller); } @@ -135,7 +143,6 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { if (!getActiveSource().equals(activeSource)) { setActiveSource(activeSource, "HdmiCecLocalDeviceSource#handleActiveSource()"); } - setIsActiveSource(physicalAddress == mService.getPhysicalAddress()); updateDevicePowerStatus(logicalAddress, HdmiControlManager.POWER_STATUS_ON); if (isRoutingControlFeatureEnabled()) { switchInputOnReceivingNewActivePath(physicalAddress); @@ -241,18 +248,15 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { physicalAddress, getDeviceInfo().getDeviceType(), message.getSource()); } + // Indicates if current device is the active source or not @ServiceThreadOnly - void setIsActiveSource(boolean on) { - assertRunOnServiceThread(); - boolean wasActiveSource = mIsActiveSource; - mIsActiveSource = on; - if (wasActiveSource && !mIsActiveSource) { - onActiveSourceLost(); - } + protected boolean isActiveSource() { + return getActiveSource().equals(getDeviceInfo().getLogicalAddress(), + getDeviceInfo().getPhysicalAddress()); } protected void wakeUpIfActiveSource() { - if (!mIsActiveSource) { + if (!isActiveSource()) { return; } // Wake up the device @@ -261,7 +265,7 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { } protected void maySendActiveSource(int dest) { - if (!mIsActiveSource) { + if (!isActiveSource()) { return; } addAndStartAction(new ActiveSourceAction(this, dest)); diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 44b6a63faea15..299884370d7a8 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -1596,7 +1596,7 @@ public class HdmiControlService extends SystemService { if (isPlaybackDevice()) { // if playback device itself is the active source, // return its own device info. - if (playback() != null && playback().mIsActiveSource) { + if (playback() != null && playback().isActiveSource()) { return playback().getDeviceInfo(); } // Otherwise get the active source and look for it from the device list @@ -3234,20 +3234,12 @@ public class HdmiControlService extends SystemService { mActiveSource.physicalAddress = physicalAddress; } // If the current device is a source device, check if the current Active Source matches - // the local device info. Set mIsActiveSource of the local device accordingly. + // the local device info. for (HdmiCecLocalDevice device : getAllLocalDevices()) { - // mIsActiveSource only exists in source device, ignore this setting if the current - // device is not an HdmiCecLocalDeviceSource. - if (!(device instanceof HdmiCecLocalDeviceSource)) { - device.addActiveSourceHistoryItem(new ActiveSource(logicalAddress, physicalAddress), - false, caller); - continue; - } boolean deviceIsActiveSource = logicalAddress == device.getDeviceInfo().getLogicalAddress() && physicalAddress == getPhysicalAddress(); - ((HdmiCecLocalDeviceSource) device).setIsActiveSource(deviceIsActiveSource); device.addActiveSourceHistoryItem(new ActiveSource(logicalAddress, physicalAddress), deviceIsActiveSource, caller); } @@ -3263,17 +3255,18 @@ public class HdmiControlService extends SystemService { // playback will claim active source. Otherwise audio system will. if (deviceType == HdmiDeviceInfo.DEVICE_PLAYBACK) { HdmiCecLocalDevicePlayback playback = playback(); - playback.setIsActiveSource(true); + playback.setActiveSource(playback.getDeviceInfo().getLogicalAddress(), physicalAddress, + "HdmiControlService#setAndBroadcastActiveSource"); playback.wakeUpIfActiveSource(); playback.maySendActiveSource(source); } if (deviceType == HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM) { HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem(); - if (playback() != null) { - audioSystem.setIsActiveSource(false); - } else { - audioSystem.setIsActiveSource(true); + if (playback() == null) { + audioSystem.setActiveSource(audioSystem.getDeviceInfo().getLogicalAddress(), + physicalAddress, + "HdmiControlService#setAndBroadcastActiveSource"); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(source); } @@ -3292,18 +3285,16 @@ public class HdmiControlService extends SystemService { HdmiCecLocalDevicePlayback playback = playback(); HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem(); if (playback != null) { - playback.setIsActiveSource(true); + playback.setActiveSource(playback.getDeviceInfo().getLogicalAddress(), physicalAddress, + "HdmiControlService#setAndBroadcastActiveSource"); playback.wakeUpIfActiveSource(); playback.maySendActiveSource(sourceAddress); - if (audioSystem != null) { - audioSystem.setIsActiveSource(false); - } - } else { - if (audioSystem != null) { - audioSystem.setIsActiveSource(true); - audioSystem.wakeUpIfActiveSource(); - audioSystem.maySendActiveSource(sourceAddress); - } + } else if (audioSystem != null) { + audioSystem.setActiveSource(audioSystem.getDeviceInfo().getLogicalAddress(), + physicalAddress, + "HdmiControlService#setAndBroadcastActiveSource"); + audioSystem.wakeUpIfActiveSource(); + audioSystem.maySendActiveSource(sourceAddress); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java index 870a27417cd23..01491f19366a7 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java @@ -160,7 +160,7 @@ public class ActiveSourceActionTest { assertThat(playbackDevice.getActiveSource().logicalAddress).isEqualTo( playbackDevice.mAddress); assertThat(playbackDevice.getActiveSource().physicalAddress).isEqualTo(mPhysicalAddress); - assertThat(playbackDevice.mIsActiveSource).isTrue(); + assertThat(playbackDevice.isActiveSource()).isTrue(); } @Test diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java index 953a03c2d9e38..6dd7fc7235312 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java @@ -30,10 +30,15 @@ import static com.android.server.hdmi.HdmiControlService.STANDBY_SCREEN_OFF; import static com.google.common.truth.Truth.assertThat; +import android.content.Context; import android.hardware.hdmi.HdmiDeviceInfo; import android.hardware.hdmi.HdmiPortInfo; import android.media.AudioManager; +import android.os.Handler; +import android.os.IPowerManager; +import android.os.IThermalService; import android.os.Looper; +import android.os.PowerManager; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; @@ -47,6 +52,8 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; @@ -81,8 +88,17 @@ public class HdmiCecLocalDeviceAudioSystemTest { private HdmiPortInfo[] mHdmiPortInfo; private boolean mWokenUp; + @Mock private IPowerManager mIPowerManagerMock; + @Mock private IThermalService mIThermalServiceMock; + @Before public void setUp() { + MockitoAnnotations.initMocks(this); + + Context context = InstrumentationRegistry.getTargetContext(); + mMyLooper = mTestLooper.getLooper(); + PowerManager powerManager = new PowerManager(context, mIPowerManagerMock, + mIThermalServiceMock, new Handler(mMyLooper)); mHdmiControlService = new HdmiControlService(InstrumentationRegistry.getTargetContext()) { @Override @@ -166,6 +182,11 @@ public class HdmiCecLocalDeviceAudioSystemTest { return defVal; } } + + @Override + PowerManager getPowerManager() { + return powerManager; + } }; mHdmiControlService.setHdmiCecVolumeControlEnabled(true); @@ -173,11 +194,6 @@ public class HdmiCecLocalDeviceAudioSystemTest { mMyLooper = mTestLooper.getLooper(); mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService); mHdmiCecLocalDevicePlayback = new HdmiCecLocalDevicePlayback(mHdmiControlService) { - @Override - void setIsActiveSource(boolean on) { - mIsActiveSource = on; - } - @Override protected int getPreferredAddress() { return ADDR_PLAYBACK_1; @@ -827,4 +843,68 @@ public class HdmiCecLocalDeviceAudioSystemTest { assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpected); } + + @Test + public void setActiveSource_localDevice_playback() { + mHdmiControlService.setActiveSource(mHdmiCecLocalDevicePlayback.mAddress, + SELF_PHYSICAL_ADDRESS, + "HdmiControlServiceTest"); + + assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( + mHdmiCecLocalDevicePlayback.mAddress); + assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo( + SELF_PHYSICAL_ADDRESS); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); + assertThat(mHdmiCecLocalDeviceAudioSystem.isActiveSource()).isFalse(); + } + + @Test + public void setActiveSource_localDevice_audio() { + mHdmiControlService.setActiveSource(mHdmiCecLocalDeviceAudioSystem.mAddress, + SELF_PHYSICAL_ADDRESS, + "HdmiControlServiceTest"); + + assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( + mHdmiCecLocalDeviceAudioSystem.mAddress); + assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo( + SELF_PHYSICAL_ADDRESS); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDeviceAudioSystem.isActiveSource()).isTrue(); + } + + @Test + public void setActiveSource_remoteDevice() { + mHdmiControlService.setActiveSource(Constants.ADDR_TV, 0x0000, "HdmiControlServiceTest"); + + assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( + Constants.ADDR_TV); + assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo(0x000); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDeviceAudioSystem.isActiveSource()).isFalse(); + } + + @Test + public void setActiveSource_nonCecDevice() { + mHdmiControlService.setActiveSource(Constants.ADDR_INVALID, 0x1234, + "HdmiControlServiceTest"); + + assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( + Constants.ADDR_INVALID); + assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo(0x1234); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDeviceAudioSystem.isActiveSource()).isFalse(); + } + + @Test + public void setActiveSource_unknown() { + mHdmiControlService.setActiveSource(Constants.ADDR_INVALID, + Constants.INVALID_PHYSICAL_ADDRESS, "HdmiControlServiceTest"); + + assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( + Constants.ADDR_INVALID); + assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo( + Constants.INVALID_PHYSICAL_ADDRESS); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDeviceAudioSystem.isActiveSource()).isFalse(); + } } 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 0c35797b38ea4..2eee22086d8dd 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -267,106 +267,114 @@ public class HdmiCecLocalDevicePlaybackTest { @Test public void handleRoutingChange_otherDevice_None() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.NONE; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + HdmiProperties.power_state_change_on_active_source_lost_values.NONE; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isFalse(); } @Test public void handleRoutingChange_otherDevice_StandbyNow() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isTrue(); } @Test public void handleRoutingChange_otherDevice_StandbyNow_InactiveSource() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(false); + HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isFalse(); } @Test public void handleRoutingChange_sameDevice_StandbyNow_ActiveSource() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mStandby).isFalse(); } @Test public void handleRoutingInformation_otherDevice_None() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.NONE; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + HdmiProperties.power_state_change_on_active_source_lost_values.NONE; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isFalse(); } @Test public void handleRoutingInformation_otherDevice_StandbyNow() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isTrue(); } @Test public void handleRoutingInformation_otherDevice_StandbyNow_InactiveSource() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(false); + HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isFalse(); } @Test public void handleRoutingInformation_sameDevice_StandbyNow_ActiveSource() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mStandby).isFalse(); } @@ -436,7 +444,8 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.mService.writeStringSetting( Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV); - mHdmiCecLocalDevicePlayback.setIsActiveSource(false); + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); @@ -455,7 +464,8 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.mService.writeStringSetting( Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST); - mHdmiCecLocalDevicePlayback.setIsActiveSource(false); + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); @@ -474,7 +484,8 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.mService.writeStringSetting( Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_NONE); - mHdmiCecLocalDevicePlayback.setIsActiveSource(false); + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); @@ -493,7 +504,8 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.mService.writeStringSetting( Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_TO_TV); - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); @@ -512,7 +524,8 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.mService.writeStringSetting( Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_BROADCAST); - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); @@ -531,7 +544,8 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.mService.writeStringSetting( Global.HDMI_CONTROL_SEND_STANDBY_ON_SLEEP, HdmiControlManager.SEND_STANDBY_ON_SLEEP_NONE); - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mHdmiCecLocalDevicePlayback.setAutoDeviceOff(true); mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF); mTestLooper.dispatchAll(); @@ -709,7 +723,7 @@ public class HdmiCecLocalDevicePlaybackTest { mPlaybackLogicalAddress, ADDR_TV); mTestLooper.dispatchAll(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mNativeWrapper.getResultMessages()).containsAllOf(pressed, released); } @@ -729,7 +743,7 @@ public class HdmiCecLocalDevicePlaybackTest { mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM); mTestLooper.dispatchAll(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); assertThat(mNativeWrapper.getResultMessages()).containsAllOf(pressed, released); } @@ -748,7 +762,7 @@ public class HdmiCecLocalDevicePlaybackTest { mPlaybackLogicalAddress, ADDR_TV); mTestLooper.dispatchAll(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mNativeWrapper.getResultMessages()).containsAllOf(pressed, released); } @@ -767,7 +781,7 @@ public class HdmiCecLocalDevicePlaybackTest { mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM); mTestLooper.dispatchAll(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mNativeWrapper.getResultMessages()).containsAllOf(pressed, released); } @@ -813,19 +827,20 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress()); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); } @Test public void handleSetStreamPath_otherDevice_None() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = - HdmiProperties.power_state_change_on_active_source_lost_values.NONE; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + HdmiProperties.power_state_change_on_active_source_lost_values.NONE; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isFalse(); } @@ -833,12 +848,13 @@ public class HdmiCecLocalDevicePlaybackTest { public void handleSetStreamPath_otherDevice_StandbyNow() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(true); + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isTrue(); } @@ -846,12 +862,13 @@ public class HdmiCecLocalDevicePlaybackTest { public void handleSetStreamPath_otherDevice_StandbyNow_InactiveSource() { mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = HdmiProperties.power_state_change_on_active_source_lost_values.STANDBY_NOW; - mHdmiCecLocalDevicePlayback.setIsActiveSource(false); + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); mStandby = false; HdmiCecMessage message = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); - assertThat(mHdmiCecLocalDevicePlayback.mIsActiveSource).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); assertThat(mStandby).isFalse(); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceBinderAPITest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceBinderAPITest.java index c6cf9b116a1df..e201c546bccaf 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceBinderAPITest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceBinderAPITest.java @@ -15,28 +15,28 @@ */ package com.android.server.hdmi; -import static android.os.SystemClock.sleep; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; + import static com.google.common.truth.Truth.assertThat; + import static junit.framework.Assert.assertEquals; import android.hardware.hdmi.HdmiControlManager; import android.hardware.hdmi.HdmiPortInfo; import android.hardware.hdmi.IHdmiControlCallback; import android.os.Looper; -import android.os.SystemProperties; import android.os.test.TestLooper; -import android.util.Slog; import androidx.test.InstrumentationRegistry; import androidx.test.filters.SmallTest; -import java.util.ArrayList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; +import java.util.ArrayList; + /** * Tests for {@link HdmiControlServiceBinderAPITest} class. */ @@ -137,11 +137,6 @@ public class HdmiControlServiceBinderAPITest { mMyLooper = mTestLooper.getLooper(); mPlaybackDevice = new HdmiCecLocalDevicePlayback(mHdmiControlService) { - @Override - void setIsActiveSource(boolean on) { - mIsActiveSource = on; - } - @Override protected void wakeUpIfActiveSource() {} @@ -186,13 +181,13 @@ public class HdmiControlServiceBinderAPITest { } }); assertEquals(mResult, -1); - assertThat(mPlaybackDevice.mIsActiveSource).isFalse(); + assertThat(mPlaybackDevice.isActiveSource()).isFalse(); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); assertThat(mHdmiControlService.isAddressAllocated()).isTrue(); assertEquals(mResult, HdmiControlManager.RESULT_SUCCESS); - assertThat(mPlaybackDevice.mIsActiveSource).isTrue(); + assertThat(mPlaybackDevice.isActiveSource()).isTrue(); } @Test @@ -207,6 +202,6 @@ public class HdmiControlServiceBinderAPITest { } }); assertEquals(mResult, HdmiControlManager.RESULT_SUCCESS); - assertThat(mPlaybackDevice.mIsActiveSource).isTrue(); + assertThat(mPlaybackDevice.isActiveSource()).isTrue(); } } diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java index 31cf59ee7bdee..88355beebcd33 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiControlServiceTest.java @@ -405,82 +405,6 @@ public class HdmiControlServiceTest { assertThat(callback2.mVolumeControlEnabled).isTrue(); } - @Test - public void setActiveSource_localDevice_playback() { - int physicalAddress = 0x1000; - mNativeWrapper.setPhysicalAddress(physicalAddress); - - mHdmiControlService.setActiveSource(mMyPlaybackDevice.mAddress, physicalAddress, - "HdmiControlServiceTest"); - - assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( - mMyPlaybackDevice.mAddress); - assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo( - physicalAddress); - assertThat(mMyPlaybackDevice.mIsActiveSource).isTrue(); - assertThat(mMyAudioSystemDevice.mIsActiveSource).isFalse(); - } - - @Test - public void setActiveSource_localDevice_audio() { - int physicalAddress = 0x1000; - mNativeWrapper.setPhysicalAddress(physicalAddress); - - mHdmiControlService.setActiveSource(mMyAudioSystemDevice.mAddress, physicalAddress, - "HdmiControlServiceTest"); - - assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( - mMyAudioSystemDevice.mAddress); - assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo( - physicalAddress); - assertThat(mMyPlaybackDevice.mIsActiveSource).isFalse(); - assertThat(mMyAudioSystemDevice.mIsActiveSource).isTrue(); - } - - @Test - public void setActiveSource_remoteDevice() { - int physicalAddress = 0x1000; - mNativeWrapper.setPhysicalAddress(physicalAddress); - - mHdmiControlService.setActiveSource(Constants.ADDR_TV, 0x0000, "HdmiControlServiceTest"); - - assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( - Constants.ADDR_TV); - assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo(0x000); - assertThat(mMyPlaybackDevice.mIsActiveSource).isFalse(); - assertThat(mMyAudioSystemDevice.mIsActiveSource).isFalse(); - } - - @Test - public void setActiveSource_nonCecDevice() { - int physicalAddress = 0x1000; - mNativeWrapper.setPhysicalAddress(physicalAddress); - - mHdmiControlService.setActiveSource(Constants.ADDR_INVALID, 0x1234, - "HdmiControlServiceTest"); - - assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( - Constants.ADDR_INVALID); - assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo(0x1234); - assertThat(mMyPlaybackDevice.mIsActiveSource).isFalse(); - assertThat(mMyAudioSystemDevice.mIsActiveSource).isFalse(); - } - - @Test - public void setActiveSource_unknown() { - int physicalAddress = 0x1000; - mNativeWrapper.setPhysicalAddress(physicalAddress); - - mHdmiControlService.setActiveSource(Constants.ADDR_INVALID, - Constants.INVALID_PHYSICAL_ADDRESS, "HdmiControlServiceTest"); - - assertThat(mHdmiControlService.getLocalActiveSource().logicalAddress).isEqualTo( - Constants.ADDR_INVALID); - assertThat(mHdmiControlService.getLocalActiveSource().physicalAddress).isEqualTo( - Constants.INVALID_PHYSICAL_ADDRESS); - assertThat(mMyPlaybackDevice.mIsActiveSource).isFalse(); - assertThat(mMyAudioSystemDevice.mIsActiveSource).isFalse(); - } private static class VolumeControlFeatureCallback extends IHdmiCecVolumeControlFeatureListener.Stub { From 78dfa03b6f1a4cba6d95c1e200edf136633c1c2b Mon Sep 17 00:00:00 2001 From: Nathalie Le Clair Date: Mon, 28 Sep 2020 12:12:48 +0200 Subject: [PATCH 2/4] Update Active Source on Routing Change and Set Stream Path messages This change handles the case of the input being switched to our physical address without us becoming the active source. Bug: 166760714 Test: atest HdmiCecLocalDevicePlaybackTest Change-Id: I4b2b78251759fce330bdb2bb72f384b3e1f6c475 --- .../hdmi/HdmiCecLocalDevicePlayback.java | 6 + .../server/hdmi/HdmiCecLocalDeviceSource.java | 13 ++- .../hdmi/HdmiCecLocalDevicePlaybackTest.java | 106 +++++++++++++++++- 3 files changed, 119 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index f8d852a4d1add..af782767cd206 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -405,6 +405,12 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { "HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation()"); return; } + if (!isActiveSource()) { + // If routing is changed to the device while Active Source, don't invalidate the + // Active Source + setActiveSource(physicalAddress, + "HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation()"); + } switch (mPlaybackDeviceActionOnRoutingControl) { case WAKE_UP_AND_SEND_ACTIVE_SOURCE: setAndBroadcastActiveSource(message, physicalAddress); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index 60e2bf152c374..a148d82373dde 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -167,8 +167,9 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // If the path is under the current device, should switch if (physicalAddress == mService.getPhysicalAddress() && mService.isPlaybackDevice()) { setAndBroadcastActiveSource(message, physicalAddress); - } - if (physicalAddress != mService.getPhysicalAddress()) { + } else if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) { + // Invalidate the active source if stream path is set to other physical address or + // our physical address while not active source setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleSetStreamPath()"); } switchInputOnReceivingNewActivePath(physicalAddress); @@ -180,7 +181,9 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { protected boolean handleRoutingChange(HdmiCecMessage message) { assertRunOnServiceThread(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams(), 2); - if (physicalAddress != mService.getPhysicalAddress()) { + if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) { + // Invalidate the active source if routing is changed to other physical address or + // our physical address while not active source setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleRoutingChange()"); } if (!isRoutingControlFeatureEnabled()) { @@ -202,7 +205,9 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { protected boolean handleRoutingInformation(HdmiCecMessage message) { assertRunOnServiceThread(); int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams()); - if (physicalAddress != mService.getPhysicalAddress()) { + if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) { + // Invalidate the active source if routing is changed to other physical address or + // our physical address while not active source setActiveSource(physicalAddress, "HdmiCecLocalDeviceSource#handleRoutingInformation()"); } if (!isRoutingControlFeatureEnabled()) { 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 2eee22086d8dd..323e6d77b740a 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDevicePlaybackTest.java @@ -17,6 +17,7 @@ package com.android.server.hdmi; import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM; import static com.android.server.hdmi.Constants.ADDR_BROADCAST; +import static com.android.server.hdmi.Constants.ADDR_INVALID; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; @@ -275,6 +276,48 @@ public class HdmiCecLocalDevicePlaybackTest { HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + 0x5000); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + ADDR_INVALID); + assertThat(mStandby).isFalse(); + } + + @Test + public void handleRoutingChange_sameDevice_None_ActiveSource() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + HdmiProperties.power_state_change_on_active_source_lost_values.NONE; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); + mStandby = false; + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + mPlaybackLogicalAddress); + assertThat(mStandby).isFalse(); + } + + @Test + public void handleRoutingChange_sameDevice_None_InactiveSource() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + HdmiProperties.power_state_change_on_active_source_lost_values.NONE; + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); + mStandby = false; + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message)).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + ADDR_INVALID); assertThat(mStandby).isFalse(); } @@ -328,10 +371,51 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); mStandby = false; - HdmiCecMessage message = - HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); + HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + 0x5000); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + ADDR_INVALID); + assertThat(mStandby).isFalse(); + } + + @Test + public void handleRoutingInformation_sameDevice_None_ActiveSource() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + HdmiProperties.power_state_change_on_active_source_lost_values.NONE; + mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress, + mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest"); + mStandby = false; + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + mPlaybackLogicalAddress); + assertThat(mStandby).isFalse(); + } + + @Test + public void handleRoutingInformation_sameDevice_None_InactiveSource() { + mHdmiCecLocalDevicePlayback.mPowerStateChangeOnActiveSourceLost = + HdmiProperties.power_state_change_on_active_source_lost_values.NONE; + mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000, + "HdmiCecLocalDevicePlaybackTest"); + mStandby = false; + HdmiCecMessage message = + HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message)).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + ADDR_INVALID); assertThat(mStandby).isFalse(); } @@ -569,6 +653,11 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mStandby).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + mPlaybackPhysicalAddress); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + mPlaybackLogicalAddress); } @Test @@ -580,6 +669,11 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mStandby).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + 0x0000); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + ADDR_TV); } @Test @@ -592,6 +686,7 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mStandby).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); } @Test @@ -603,6 +698,7 @@ public class HdmiCecLocalDevicePlaybackTest { assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message)).isTrue(); mTestLooper.dispatchAll(); assertThat(mStandby).isTrue(); + assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); } @Test @@ -825,6 +921,8 @@ public class HdmiCecLocalDevicePlaybackTest { mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath); mTestLooper.dispatchAll(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + mPlaybackPhysicalAddress); assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress()); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue(); @@ -841,6 +939,10 @@ public class HdmiCecLocalDevicePlaybackTest { HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000); assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message)).isTrue(); assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse(); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo( + 0x5000); + assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo( + ADDR_INVALID); assertThat(mStandby).isFalse(); } From 549a3edd8e7492240314b4647f753275243cc9a5 Mon Sep 17 00:00:00 2001 From: Nathalie Le Clair Date: Mon, 28 Sep 2020 12:30:56 +0200 Subject: [PATCH 3/4] Remove playback device handling from source device routing control Redundant since handleRoutingChange and handleRoutingInformation are overridden in HdmiCecLocalDevicePlayback. Bug: 153950818 Test: atest HdmiCecLocalDevicePlaybackTest Change-Id: Id09ab99c082546027e8d15f06ea42b2488b768b1 --- .../server/hdmi/HdmiCecLocalDeviceSource.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index a148d82373dde..329db98dfbf5b 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -190,12 +190,6 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return true; } - // if the current device is a pure playback device - if (!mIsSwitchDevice - && physicalAddress == mService.getPhysicalAddress() - && mService.isPlaybackDevice()) { - setAndBroadcastActiveSource(message, physicalAddress); - } handleRoutingChangeAndInformation(physicalAddress, message); return true; } @@ -214,12 +208,6 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { mService.maySendFeatureAbortCommand(message, Constants.ABORT_REFUSED); return true; } - // if the current device is a pure playback device - if (!mIsSwitchDevice - && physicalAddress == mService.getPhysicalAddress() - && mService.isPlaybackDevice()) { - setAndBroadcastActiveSource(message, physicalAddress); - } handleRoutingChangeAndInformation(physicalAddress, message); return true; } From 2a5278ad2286d3e4fa5178f83196924d91e6757c Mon Sep 17 00:00:00 2001 From: Nathalie Le Clair Date: Mon, 28 Sep 2020 18:57:39 +0200 Subject: [PATCH 4/4] Pass caller information through setAndBroadcastActiveSource Bug: 166760714 Test: make Change-Id: If53863a35962ea30e341aefbe9abfe0ad163e049 --- .../server/hdmi/HdmiCecLocalDeviceAudioSystem.java | 6 ++++-- .../server/hdmi/HdmiCecLocalDevicePlayback.java | 6 ++++-- .../server/hdmi/HdmiCecLocalDeviceSource.java | 8 +++++--- .../android/server/hdmi/HdmiControlService.java | 14 ++++++-------- .../android/server/hdmi/OneTouchPlayAction.java | 2 +- .../hdmi/SystemAudioInitiationActionFromAvr.java | 3 ++- .../SystemAudioInitiationActionFromAvrTest.java | 2 +- 7 files changed, 23 insertions(+), 18 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index 68473c1830ae4..29bdd6cb40c31 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -379,7 +379,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { assertRunOnServiceThread(); if (reason == mService.INITIATED_BY_ENABLE_CEC) { mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(), - getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST); + getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST, + "HdmiCecLocalDeviceAudioSystem#onAddressAllocated()"); } mService.sendCecCommand( HdmiCecMessageBuilder.buildReportPhysicalAddressCommand( @@ -1324,7 +1325,8 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDeviceSource { if (getRoutingPort() == Constants.CEC_SWITCH_HOME && mService.isPlaybackDevice()) { routeToInputFromPortId(Constants.CEC_SWITCH_HOME); mService.setAndBroadcastActiveSourceFromOneDeviceType( - message.getSource(), mService.getPhysicalAddress()); + message.getSource(), mService.getPhysicalAddress(), + "HdmiCecLocalDeviceAudioSystem#handleRoutingChangeAndInformationForSwitch()"); return; } diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java index af782767cd206..00c9122f39d19 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java @@ -102,7 +102,8 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { assertRunOnServiceThread(); if (reason == mService.INITIATED_BY_ENABLE_CEC) { mService.setAndBroadcastActiveSource(mService.getPhysicalAddress(), - getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST); + getDeviceInfo().getDeviceType(), Constants.ADDR_BROADCAST, + "HdmiCecLocalDevicePlayback#onAddressAllocated()"); } mService.sendCecCommand(HdmiCecMessageBuilder.buildReportPhysicalAddressCommand( mAddress, mService.getPhysicalAddress(), mDeviceType)); @@ -413,7 +414,8 @@ public class HdmiCecLocalDevicePlayback extends HdmiCecLocalDeviceSource { } switch (mPlaybackDeviceActionOnRoutingControl) { case WAKE_UP_AND_SEND_ACTIVE_SOURCE: - setAndBroadcastActiveSource(message, physicalAddress); + setAndBroadcastActiveSource(message, physicalAddress, + "HdmiCecLocalDevicePlayback#handleRoutingChangeAndInformation()"); break; case WAKE_UP_ONLY: mService.wakeUp(); diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java index 329db98dfbf5b..4325f797416e6 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java @@ -166,7 +166,8 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // If current device is the target path, set to Active Source. // If the path is under the current device, should switch if (physicalAddress == mService.getPhysicalAddress() && mService.isPlaybackDevice()) { - setAndBroadcastActiveSource(message, physicalAddress); + setAndBroadcastActiveSource(message, physicalAddress, + "HdmiCecLocalDeviceSource#handleSetStreamPath()"); } else if (physicalAddress != mService.getPhysicalAddress() || !isActiveSource()) { // Invalidate the active source if stream path is set to other physical address or // our physical address while not active source @@ -236,9 +237,10 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { // since service can decide who will be the active source when the device supports // multiple device types in this method. // This method should only be called when the device can be the active source. - protected void setAndBroadcastActiveSource(HdmiCecMessage message, int physicalAddress) { + protected void setAndBroadcastActiveSource(HdmiCecMessage message, int physicalAddress, + String caller) { mService.setAndBroadcastActiveSource( - physicalAddress, getDeviceInfo().getDeviceType(), message.getSource()); + physicalAddress, getDeviceInfo().getDeviceType(), message.getSource(), caller); } // Indicates if current device is the active source or not diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 299884370d7a8..eaa00434b16f7 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -3250,13 +3250,13 @@ public class HdmiControlService extends SystemService { // For example, when receiving broadcast messages, all the device types will call this // method but only one of them will be the Active Source. protected void setAndBroadcastActiveSource( - int physicalAddress, int deviceType, int source) { + int physicalAddress, int deviceType, int source, String caller) { // If the device has both playback and audio system logical addresses, // playback will claim active source. Otherwise audio system will. if (deviceType == HdmiDeviceInfo.DEVICE_PLAYBACK) { HdmiCecLocalDevicePlayback playback = playback(); playback.setActiveSource(playback.getDeviceInfo().getLogicalAddress(), physicalAddress, - "HdmiControlService#setAndBroadcastActiveSource"); + caller); playback.wakeUpIfActiveSource(); playback.maySendActiveSource(source); } @@ -3265,8 +3265,7 @@ public class HdmiControlService extends SystemService { HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem(); if (playback() == null) { audioSystem.setActiveSource(audioSystem.getDeviceInfo().getLogicalAddress(), - physicalAddress, - "HdmiControlService#setAndBroadcastActiveSource"); + physicalAddress, caller); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(source); } @@ -3279,20 +3278,19 @@ public class HdmiControlService extends SystemService { // and this method updates Active Source in all the device types sharing the same // Physical Address. protected void setAndBroadcastActiveSourceFromOneDeviceType( - int sourceAddress, int physicalAddress) { + int sourceAddress, int physicalAddress, String caller) { // If the device has both playback and audio system logical addresses, // playback will claim active source. Otherwise audio system will. HdmiCecLocalDevicePlayback playback = playback(); HdmiCecLocalDeviceAudioSystem audioSystem = audioSystem(); if (playback != null) { playback.setActiveSource(playback.getDeviceInfo().getLogicalAddress(), physicalAddress, - "HdmiControlService#setAndBroadcastActiveSource"); + caller); playback.wakeUpIfActiveSource(); playback.maySendActiveSource(sourceAddress); } else if (audioSystem != null) { audioSystem.setActiveSource(audioSystem.getDeviceInfo().getLogicalAddress(), - physicalAddress, - "HdmiControlService#setAndBroadcastActiveSource"); + physicalAddress, caller); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(sourceAddress); } diff --git a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java index 4962af176f18a..e78a86c21453c 100644 --- a/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java +++ b/services/core/java/com/android/server/hdmi/OneTouchPlayAction.java @@ -85,7 +85,7 @@ final class OneTouchPlayAction extends HdmiCecFeatureAction { // Because only source device can create this action, it's safe to cast. HdmiCecLocalDeviceSource source = source(); source.mService.setAndBroadcastActiveSourceFromOneDeviceType( - mTargetAddress, getSourcePath()); + mTargetAddress, getSourcePath(), "OneTouchPlayAction#broadcastActiveSource()"); // When OneTouchPlay is called, client side should be responsible to send out the intent // of which internal source, for example YouTube, it would like to switch to. // Here we only update the active port and the active source records in the local diff --git a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java index 0907e5d03c782..acafda6619f3c 100644 --- a/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java +++ b/services/core/java/com/android/server/hdmi/SystemAudioInitiationActionFromAvr.java @@ -119,7 +119,8 @@ public class SystemAudioInitiationActionFromAvr extends HdmiCecFeatureAction { // claim Active Source and start to query TV system audio mode support. if (audioSystem().mService.isPlaybackDevice()) { audioSystem().mService.setAndBroadcastActiveSourceFromOneDeviceType( - Constants.ADDR_BROADCAST, getSourcePath()); + Constants.ADDR_BROADCAST, getSourcePath(), + "SystemAudioInitiationActionFromAvr#handleActiveSourceTimeout()"); mState = STATE_WAITING_FOR_TV_SUPPORT; queryTvSystemAudioModeSupport(); } else { diff --git a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java index c7342426c80c5..6be28d9a13beb 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/SystemAudioInitiationActionFromAvrTest.java @@ -150,7 +150,7 @@ public class SystemAudioInitiationActionFromAvrTest { @Override public void setAndBroadcastActiveSourceFromOneDeviceType( - int sourceAddress, int physicalAddress) { + int sourceAddress, int physicalAddress, String caller) { mBroadcastActiveSource = true; }