Add partial request arc init/terminate handlers and tests

Test: atest com.android.server.hdmi
Change-Id: I92ee4598ccb2e6c88863ab0ba3dc3ba682ccd0e2
(cherry picked from commit 5dc9609a08c43ca4134b1eccaea2f23a1681bd61)
This commit is contained in:
Amy
2018-06-07 16:24:31 -07:00
committed by Amy Zhang
parent 8b06946b22
commit 4e7ff1a352
3 changed files with 162 additions and 8 deletions

View File

@@ -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();

View File

@@ -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;

View File

@@ -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));
}
}