summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystem.java32
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecLocalDeviceAudioSystemTest.java122
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 <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();
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<HdmiCecLocalDevice> allocatingDevices,
+ @VisibleForTesting
+ protected void allocateLogicalAddress(final ArrayList<HdmiCecLocalDevice> 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<HdmiCecLocalDevice> 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));
+ }
}