From 4e7ff1a35294e0ca8c6e7ca935ad3ca0133104f8 Mon Sep 17 00:00:00 2001 From: Amy Date: Thu, 7 Jun 2018 16:24:31 -0700 Subject: [PATCH] Add partial request arc init/terminate handlers and tests Test: atest com.android.server.hdmi Change-Id: I92ee4598ccb2e6c88863ab0ba3dc3ba682ccd0e2 (cherry picked from commit 5dc9609a08c43ca4134b1eccaea2f23a1681bd61) --- .../server/hdmi/HdmiCecLocalDeviceAudioSystem.java | 32 ++++++ .../android/server/hdmi/HdmiControlService.java | 16 ++- .../hdmi/HdmiCecLocalDeviceAudioSystemTest.java | 122 ++++++++++++++++++++- 3 files changed, 162 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java index 655166ee1a4b..e97de8ffef9f 100644 --- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java +++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java @@ -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 ["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 ["Unrecongnized opcode"] + + return true; + } + private void reportAudioStatus(HdmiCecMessage message) { assertRunOnServiceThread(); diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index 8a146397fa3e..846adcca2d5a 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -407,8 +407,9 @@ public class HdmiControlService extends SystemService { Slog.i(TAG, "Device does not support HDMI-CEC."); return; } - - mMhlController = HdmiMhlControllerStub.create(this); + if (mMhlController == null) { + mMhlController = HdmiMhlControllerStub.create(this); + } if (!mMhlController.isReady()) { Slog.i(TAG, "Device does not support MHL-control."); } @@ -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) { @@ -598,7 +604,8 @@ public class HdmiControlService extends SystemService { } @ServiceThreadOnly - private void allocateLogicalAddress(final ArrayList allocatingDevices, + @VisibleForTesting + protected void allocateLogicalAddress(final ArrayList allocatingDevices, final int initiatedBy) { assertRunOnServiceThread(); mCecController.clearLogicalAddress(); @@ -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; 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 865050fd6082..1de1176ed664 100644 --- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java +++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java @@ -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; @@ -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 mLocalDevices = new ArrayList<>(); private int mMusicVolume; private int mMusicMaxVolume; private boolean mMusicMute; @@ -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 @@ -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); @@ -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); @@ -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)); + } } -- 2.11.0