Loading services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +32 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,38 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { return true; } @Override @ServiceThreadOnly protected boolean handleRequestArcInitiate(HdmiCecMessage message) { assertRunOnServiceThread(); // TODO(b/80296911): Check if ARC supported. // TODO(b/80296911): Check if port is ready to accept. // TODO(b/80296911): if both true, activate ARC functinality and mService.sendCecCommand(HdmiCecMessageBuilder .buildInitiateArc(mAddress, message.getSource())); // TODO(b/80296911): else, send <Feature Abort>["Unrecongnized opcode"] return true; } @Override @ServiceThreadOnly protected boolean handleRequestArcTermination(HdmiCecMessage message) { assertRunOnServiceThread(); // TODO(b/80297105): Check if ARC supported. // TODO(b/80297105): Check is currently in arc. // TODO(b/80297105): If both true, deactivate ARC functionality and mService.sendCecCommand(HdmiCecMessageBuilder .buildTerminateArc(mAddress, message.getSource())); // TODO(b/80297105): else, send <Feature Abort>["Unrecongnized opcode"] return true; } private void reportAudioStatus(HdmiCecMessage message) { assertRunOnServiceThread(); Loading services/core/java/com/android/server/hdmi/HdmiControlService.java +12 −4 Original line number Diff line number Diff line Loading @@ -407,8 +407,9 @@ public class HdmiControlService extends SystemService { Slog.i(TAG, "Device does not support HDMI-CEC."); return; } if (mMhlController == null) { mMhlController = HdmiMhlControllerStub.create(this); } if (!mMhlController.isReady()) { Slog.i(TAG, "Device does not support MHL-control."); } Loading Loading @@ -440,6 +441,11 @@ public class HdmiControlService extends SystemService { mCecController = cecController; } @VisibleForTesting void setHdmiMhlController(HdmiMhlControllerStub hdmiMhlController) { mMhlController = hdmiMhlController; } @Override public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { Loading Loading @@ -598,7 +604,8 @@ public class HdmiControlService extends SystemService { } @ServiceThreadOnly private void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices, @VisibleForTesting protected void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices, final int initiatedBy) { assertRunOnServiceThread(); mCecController.clearLogicalAddress(); Loading Loading @@ -665,7 +672,8 @@ public class HdmiControlService extends SystemService { // Initialize HDMI port information. Combine the information from CEC and MHL HAL and // keep them in one place. @ServiceThreadOnly private void initPortInfo() { @VisibleForTesting protected void initPortInfo() { assertRunOnServiceThread(); HdmiPortInfo[] cecPortInfo = null; Loading services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +118 −4 Original line number Diff line number Diff line Loading @@ -17,14 +17,19 @@ package com.android.server.hdmi; import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertEquals; import android.hardware.hdmi.HdmiPortInfo; import android.media.AudioManager; import android.os.Looper; import android.os.MessageQueue; import android.os.test.TestLooper; import android.support.test.filters.SmallTest; import junit.framework.Assert; import com.android.server.hdmi.HdmiCecController.NativeWrapper; import java.util.Arrays; import java.util.ArrayList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -37,10 +42,79 @@ import org.junit.runners.JUnit4; */ public class HdmiCecLocalDeviceAudioSystemTest { private static final class NativeWrapperImpl implements NativeWrapper { @Override public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) { return 1L; } @Override public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress, byte[] body) { return 1; } @Override public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) { return 0; } @Override public void nativeClearLogicalAddress(long controllerPtr) { } @Override public int nativeGetPhysicalAddress(long controllerPtr) { return 0; } @Override public int nativeGetVersion(long controllerPtr) { return 0; } @Override public int nativeGetVendorId(long controllerPtr) { return 0; } @Override public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) { HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[1]; hdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000,true, true, true); return hdmiPortInfo; } @Override public void nativeSetOption(long controllerPtr, int flag, boolean enabled) { } @Override public void nativeSetLanguage(long controllerPtr, String language) { } @Override public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) { } @Override public boolean nativeIsConnected(long controllerPtr, int port) { return false; } } private HdmiControlService mHdmiControlService; private HdmiCecController mHdmiCecController; private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem; private HdmiCecMessage mResultMessage; private Looper mMyLooper; private TestLooper mTestLooper = new TestLooper(); private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); private int mMusicVolume; private int mMusicMaxVolume; private boolean mMusicMute; Loading Loading @@ -88,7 +162,21 @@ public class HdmiCecLocalDeviceAudioSystemTest { mResultMessage = command; } }; mMyLooper = mTestLooper.getLooper(); mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService); mHdmiCecLocalDeviceAudioSystem.init(); mHdmiControlService.setIoLooper(mMyLooper); mHdmiCecController = HdmiCecController.createWithNativeWrapper( mHdmiControlService, new NativeWrapperImpl()); mHdmiControlService.setCecController(mHdmiCecController); mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); mHdmiControlService.initPortInfo(); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); } @Test Loading @@ -98,7 +186,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { mMusicMaxVolume = 20; int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume); HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus( ADDR_UNREGISTERED, ADDR_TV, scaledVolume, true); ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true); HdmiCecMessage message = HdmiCecMessageBuilder.buildGiveAudioStatus( ADDR_TV, ADDR_AUDIO_SYSTEM); Loading @@ -110,7 +198,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { @Test public void handleGiveSystemAudioModeStatus_off() { HdmiCecMessage expectMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_UNREGISTERED, ADDR_TV, false); .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); HdmiCecMessage message = HdmiCecMessageBuilder .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); Loading @@ -118,4 +206,30 @@ public class HdmiCecLocalDeviceAudioSystemTest { assertTrue(mResultMessage.equals(expectMessage)); } @Test public void handleRequestArcInitiate() { // TODO(b/80296911): Add tests when finishing handler impl. HdmiCecMessage expectMessage = HdmiCecMessageBuilder .buildInitiateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage message = HdmiCecMessageBuilder .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM); assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)); assertTrue(mResultMessage.equals(expectMessage)); } @Test public void handleRequestArcTermination() { // TODO(b/80297105): Add tests when finishing handler impl. HdmiCecMessage expectMessage = HdmiCecMessageBuilder .buildTerminateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage message = HdmiCecMessageBuilder .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM); assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)); assertTrue(mResultMessage.equals(expectMessage)); } } Loading
services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +32 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,38 @@ public class HdmiCecLocalDeviceAudioSystem extends HdmiCecLocalDevice { return true; } @Override @ServiceThreadOnly protected boolean handleRequestArcInitiate(HdmiCecMessage message) { assertRunOnServiceThread(); // TODO(b/80296911): Check if ARC supported. // TODO(b/80296911): Check if port is ready to accept. // TODO(b/80296911): if both true, activate ARC functinality and mService.sendCecCommand(HdmiCecMessageBuilder .buildInitiateArc(mAddress, message.getSource())); // TODO(b/80296911): else, send <Feature Abort>["Unrecongnized opcode"] return true; } @Override @ServiceThreadOnly protected boolean handleRequestArcTermination(HdmiCecMessage message) { assertRunOnServiceThread(); // TODO(b/80297105): Check if ARC supported. // TODO(b/80297105): Check is currently in arc. // TODO(b/80297105): If both true, deactivate ARC functionality and mService.sendCecCommand(HdmiCecMessageBuilder .buildTerminateArc(mAddress, message.getSource())); // TODO(b/80297105): else, send <Feature Abort>["Unrecongnized opcode"] return true; } private void reportAudioStatus(HdmiCecMessage message) { assertRunOnServiceThread(); Loading
services/core/java/com/android/server/hdmi/HdmiControlService.java +12 −4 Original line number Diff line number Diff line Loading @@ -407,8 +407,9 @@ public class HdmiControlService extends SystemService { Slog.i(TAG, "Device does not support HDMI-CEC."); return; } if (mMhlController == null) { mMhlController = HdmiMhlControllerStub.create(this); } if (!mMhlController.isReady()) { Slog.i(TAG, "Device does not support MHL-control."); } Loading Loading @@ -440,6 +441,11 @@ public class HdmiControlService extends SystemService { mCecController = cecController; } @VisibleForTesting void setHdmiMhlController(HdmiMhlControllerStub hdmiMhlController) { mMhlController = hdmiMhlController; } @Override public void onBootPhase(int phase) { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { Loading Loading @@ -598,7 +604,8 @@ public class HdmiControlService extends SystemService { } @ServiceThreadOnly private void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices, @VisibleForTesting protected void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> allocatingDevices, final int initiatedBy) { assertRunOnServiceThread(); mCecController.clearLogicalAddress(); Loading Loading @@ -665,7 +672,8 @@ public class HdmiControlService extends SystemService { // Initialize HDMI port information. Combine the information from CEC and MHL HAL and // keep them in one place. @ServiceThreadOnly private void initPortInfo() { @VisibleForTesting protected void initPortInfo() { assertRunOnServiceThread(); HdmiPortInfo[] cecPortInfo = null; Loading
services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +118 −4 Original line number Diff line number Diff line Loading @@ -17,14 +17,19 @@ package com.android.server.hdmi; import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM; import static com.android.server.hdmi.Constants.ADDR_TV; import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED; import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC; import static junit.framework.Assert.assertTrue; import static junit.framework.Assert.assertEquals; import android.hardware.hdmi.HdmiPortInfo; import android.media.AudioManager; import android.os.Looper; import android.os.MessageQueue; import android.os.test.TestLooper; import android.support.test.filters.SmallTest; import junit.framework.Assert; import com.android.server.hdmi.HdmiCecController.NativeWrapper; import java.util.Arrays; import java.util.ArrayList; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -37,10 +42,79 @@ import org.junit.runners.JUnit4; */ public class HdmiCecLocalDeviceAudioSystemTest { private static final class NativeWrapperImpl implements NativeWrapper { @Override public long nativeInit(HdmiCecController handler, MessageQueue messageQueue) { return 1L; } @Override public int nativeSendCecCommand(long controllerPtr, int srcAddress, int dstAddress, byte[] body) { return 1; } @Override public int nativeAddLogicalAddress(long controllerPtr, int logicalAddress) { return 0; } @Override public void nativeClearLogicalAddress(long controllerPtr) { } @Override public int nativeGetPhysicalAddress(long controllerPtr) { return 0; } @Override public int nativeGetVersion(long controllerPtr) { return 0; } @Override public int nativeGetVendorId(long controllerPtr) { return 0; } @Override public HdmiPortInfo[] nativeGetPortInfos(long controllerPtr) { HdmiPortInfo[] hdmiPortInfo = new HdmiPortInfo[1]; hdmiPortInfo[0] = new HdmiPortInfo(1, 1, 0x1000,true, true, true); return hdmiPortInfo; } @Override public void nativeSetOption(long controllerPtr, int flag, boolean enabled) { } @Override public void nativeSetLanguage(long controllerPtr, String language) { } @Override public void nativeEnableAudioReturnChannel(long controllerPtr, int port, boolean flag) { } @Override public boolean nativeIsConnected(long controllerPtr, int port) { return false; } } private HdmiControlService mHdmiControlService; private HdmiCecController mHdmiCecController; private HdmiCecLocalDeviceAudioSystem mHdmiCecLocalDeviceAudioSystem; private HdmiCecMessage mResultMessage; private Looper mMyLooper; private TestLooper mTestLooper = new TestLooper(); private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>(); private int mMusicVolume; private int mMusicMaxVolume; private boolean mMusicMute; Loading Loading @@ -88,7 +162,21 @@ public class HdmiCecLocalDeviceAudioSystemTest { mResultMessage = command; } }; mMyLooper = mTestLooper.getLooper(); mHdmiCecLocalDeviceAudioSystem = new HdmiCecLocalDeviceAudioSystem(mHdmiControlService); mHdmiCecLocalDeviceAudioSystem.init(); mHdmiControlService.setIoLooper(mMyLooper); mHdmiCecController = HdmiCecController.createWithNativeWrapper( mHdmiControlService, new NativeWrapperImpl()); mHdmiControlService.setCecController(mHdmiCecController); mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); mLocalDevices.add(mHdmiCecLocalDeviceAudioSystem); mHdmiControlService.initPortInfo(); mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC); mTestLooper.dispatchAll(); } @Test Loading @@ -98,7 +186,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { mMusicMaxVolume = 20; int scaledVolume = VolumeControlAction.scaleToCecVolume(10, mMusicMaxVolume); HdmiCecMessage expectMessage = HdmiCecMessageBuilder.buildReportAudioStatus( ADDR_UNREGISTERED, ADDR_TV, scaledVolume, true); ADDR_AUDIO_SYSTEM, ADDR_TV, scaledVolume, true); HdmiCecMessage message = HdmiCecMessageBuilder.buildGiveAudioStatus( ADDR_TV, ADDR_AUDIO_SYSTEM); Loading @@ -110,7 +198,7 @@ public class HdmiCecLocalDeviceAudioSystemTest { @Test public void handleGiveSystemAudioModeStatus_off() { HdmiCecMessage expectMessage = HdmiCecMessageBuilder .buildReportSystemAudioMode(ADDR_UNREGISTERED, ADDR_TV, false); .buildReportSystemAudioMode(ADDR_AUDIO_SYSTEM, ADDR_TV, false); HdmiCecMessage message = HdmiCecMessageBuilder .buildGiveSystemAudioModeStatus(ADDR_TV, ADDR_AUDIO_SYSTEM); Loading @@ -118,4 +206,30 @@ public class HdmiCecLocalDeviceAudioSystemTest { assertTrue(mResultMessage.equals(expectMessage)); } @Test public void handleRequestArcInitiate() { // TODO(b/80296911): Add tests when finishing handler impl. HdmiCecMessage expectMessage = HdmiCecMessageBuilder .buildInitiateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage message = HdmiCecMessageBuilder .buildRequestArcInitiation(ADDR_TV, ADDR_AUDIO_SYSTEM); assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcInitiate(message)); assertTrue(mResultMessage.equals(expectMessage)); } @Test public void handleRequestArcTermination() { // TODO(b/80297105): Add tests when finishing handler impl. HdmiCecMessage expectMessage = HdmiCecMessageBuilder .buildTerminateArc(ADDR_AUDIO_SYSTEM, ADDR_TV); HdmiCecMessage message = HdmiCecMessageBuilder .buildRequestArcTermination(ADDR_TV, ADDR_AUDIO_SYSTEM); assertTrue(mHdmiCecLocalDeviceAudioSystem.handleRequestArcTermination(message)); assertTrue(mResultMessage.equals(expectMessage)); } }