Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +11 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading @@ -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) { Loading Loading @@ -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(); Loading Loading @@ -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 - Loading Loading @@ -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); } Loading @@ -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 Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +20 −16 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading Loading @@ -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(); } Loading Loading @@ -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); } Loading @@ -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); Loading Loading @@ -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 Loading @@ -261,7 +265,7 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { } protected void maySendActiveSource(int dest) { if (!mIsActiveSource) { if (!isActiveSource()) { return; } addAndStartAction(new ActiveSourceAction(this, dest)); Loading services/core/java/com/android/server/hdmi/HdmiControlService.java +16 −25 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); } Loading @@ -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); } Loading @@ -3292,20 +3285,18 @@ 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); } else if (audioSystem != null) { audioSystem.setActiveSource(audioSystem.getDeviceInfo().getLogicalAddress(), physicalAddress, "HdmiControlService#setAndBroadcastActiveSource"); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(sourceAddress); } } } @ServiceThreadOnly void setLastInputForMhl(int portId) { Loading services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +85 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -166,6 +182,11 @@ public class HdmiCecLocalDeviceAudioSystemTest { return defVal; } } @Override PowerManager getPowerManager() { return powerManager; } }; mHdmiControlService.setHdmiCecVolumeControlEnabled(true); Loading @@ -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; Loading Loading @@ -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(); } } Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDevicePlayback.java +11 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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(); } Loading @@ -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) { Loading Loading @@ -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(); Loading Loading @@ -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 - Loading Loading @@ -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); } Loading @@ -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 Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceSource.java +20 −16 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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); Loading Loading @@ -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(); } Loading Loading @@ -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); } Loading @@ -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); Loading Loading @@ -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 Loading @@ -261,7 +265,7 @@ abstract class HdmiCecLocalDeviceSource extends HdmiCecLocalDevice { } protected void maySendActiveSource(int dest) { if (!mIsActiveSource) { if (!isActiveSource()) { return; } addAndStartAction(new ActiveSourceAction(this, dest)); Loading
services/core/java/com/android/server/hdmi/HdmiControlService.java +16 −25 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); } Loading @@ -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); } Loading @@ -3292,20 +3285,18 @@ 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); } else if (audioSystem != null) { audioSystem.setActiveSource(audioSystem.getDeviceInfo().getLogicalAddress(), physicalAddress, "HdmiControlService#setAndBroadcastActiveSource"); audioSystem.wakeUpIfActiveSource(); audioSystem.maySendActiveSource(sourceAddress); } } } @ServiceThreadOnly void setLastInputForMhl(int portId) { Loading
services/tests/servicestests/src/com/android/server/hdmi/ActiveSourceActionTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +85 −5 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -166,6 +182,11 @@ public class HdmiCecLocalDeviceAudioSystemTest { return defVal; } } @Override PowerManager getPowerManager() { return powerManager; } }; mHdmiControlService.setHdmiCecVolumeControlEnabled(true); Loading @@ -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; Loading Loading @@ -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(); } }