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:
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user