Merge changes I4f262f42,I312edbca into udc-dev

* changes:
  Unit tests for SAM during transitions from and to eARC
  Make naming in Java consistent.
This commit is contained in:
Nathalie Le Clair
2023-02-21 09:32:28 +00:00
committed by Android (Google) Code Review
5 changed files with 159 additions and 70 deletions

View File

@@ -35,40 +35,40 @@ final class HdmiEarcController {
private final HdmiControlService mService; private final HdmiControlService mService;
private EArcNativeWrapper mEArcNativeWrapperImpl; private EarcNativeWrapper mEarcNativeWrapperImpl;
protected interface EArcNativeWrapper { protected interface EarcNativeWrapper {
boolean nativeInit(); boolean nativeInit();
void nativeSetEArcEnabled(boolean enabled); void nativeSetEarcEnabled(boolean enabled);
boolean nativeIsEArcEnabled(); boolean nativeIsEarcEnabled();
void nativeSetCallback(EarcAidlCallback callback); void nativeSetCallback(EarcAidlCallback callback);
byte nativeGetState(int portId); byte nativeGetState(int portId);
byte[] nativeGetLastReportedAudioCapabilities(int portId); byte[] nativeGetLastReportedAudioCapabilities(int portId);
} }
private static final class EArcNativeWrapperImpl implements EArcNativeWrapper, private static final class EarcNativeWrapperImpl implements EarcNativeWrapper,
IBinder.DeathRecipient { IBinder.DeathRecipient {
private IEArc mEArc; private IEArc mEarc;
private EarcAidlCallback mEArcCallback; private EarcAidlCallback mEarcCallback;
@Override @Override
public void binderDied() { public void binderDied() {
mEArc.asBinder().unlinkToDeath(this, 0); mEarc.asBinder().unlinkToDeath(this, 0);
connectToHal(); connectToHal();
if (mEArcCallback != null) { if (mEarcCallback != null) {
nativeSetCallback(mEArcCallback); nativeSetCallback(mEarcCallback);
} }
} }
boolean connectToHal() { boolean connectToHal() {
mEArc = mEarc =
IEArc.Stub.asInterface( IEArc.Stub.asInterface(
ServiceManager.getService(IEArc.DESCRIPTOR + "/default")); ServiceManager.getService(IEArc.DESCRIPTOR + "/default"));
if (mEArc == null) { if (mEarc == null) {
return false; return false;
} }
try { try {
mEArc.asBinder().linkToDeath(this, 0); mEarc.asBinder().linkToDeath(this, 0);
} catch (RemoteException e) { } catch (RemoteException e) {
HdmiLogger.error("Couldn't link callback object: ", e); HdmiLogger.error("Couldn't link callback object: ", e);
} }
@@ -81,9 +81,9 @@ final class HdmiEarcController {
} }
@Override @Override
public void nativeSetEArcEnabled(boolean enabled) { public void nativeSetEarcEnabled(boolean enabled) {
try { try {
mEArc.setEArcEnabled(enabled); mEarc.setEArcEnabled(enabled);
} catch (ServiceSpecificException sse) { } catch (ServiceSpecificException sse) {
HdmiLogger.error( HdmiLogger.error(
"Could not set eARC enabled to " + enabled + ". Error: ", sse.errorCode); "Could not set eARC enabled to " + enabled + ". Error: ", sse.errorCode);
@@ -93,9 +93,9 @@ final class HdmiEarcController {
} }
@Override @Override
public boolean nativeIsEArcEnabled() { public boolean nativeIsEarcEnabled() {
try { try {
return mEArc.isEArcEnabled(); return mEarc.isEArcEnabled();
} catch (RemoteException re) { } catch (RemoteException re) {
HdmiLogger.error("Could not read if eARC is enabled. Exception: ", re); HdmiLogger.error("Could not read if eARC is enabled. Exception: ", re);
return false; return false;
@@ -104,9 +104,9 @@ final class HdmiEarcController {
@Override @Override
public void nativeSetCallback(EarcAidlCallback callback) { public void nativeSetCallback(EarcAidlCallback callback) {
mEArcCallback = callback; mEarcCallback = callback;
try { try {
mEArc.setCallback(callback); mEarc.setCallback(callback);
} catch (RemoteException re) { } catch (RemoteException re) {
HdmiLogger.error("Could not set callback. Exception: ", re); HdmiLogger.error("Could not set callback. Exception: ", re);
} }
@@ -115,7 +115,7 @@ final class HdmiEarcController {
@Override @Override
public byte nativeGetState(int portId) { public byte nativeGetState(int portId) {
try { try {
return mEArc.getState(portId); return mEarc.getState(portId);
} catch (RemoteException re) { } catch (RemoteException re) {
HdmiLogger.error("Could not get eARC state. Exception: ", re); HdmiLogger.error("Could not get eARC state. Exception: ", re);
return -1; return -1;
@@ -125,7 +125,7 @@ final class HdmiEarcController {
@Override @Override
public byte[] nativeGetLastReportedAudioCapabilities(int portId) { public byte[] nativeGetLastReportedAudioCapabilities(int portId) {
try { try {
return mEArc.getLastReportedAudioCapabilities(portId); return mEarc.getLastReportedAudioCapabilities(portId);
} catch (RemoteException re) { } catch (RemoteException re) {
HdmiLogger.error( HdmiLogger.error(
"Could not read last reported audio capabilities. Exception: ", re); "Could not read last reported audio capabilities. Exception: ", re);
@@ -135,9 +135,9 @@ final class HdmiEarcController {
} }
// Private constructor. Use HdmiEarcController.create(). // Private constructor. Use HdmiEarcController.create().
private HdmiEarcController(HdmiControlService service, EArcNativeWrapper nativeWrapper) { private HdmiEarcController(HdmiControlService service, EarcNativeWrapper nativeWrapper) {
mService = service; mService = service;
mEArcNativeWrapperImpl = nativeWrapper; mEarcNativeWrapperImpl = nativeWrapper;
} }
/** /**
@@ -151,14 +151,14 @@ final class HdmiEarcController {
* returns {@code null}. * returns {@code null}.
*/ */
static HdmiEarcController create(HdmiControlService service) { static HdmiEarcController create(HdmiControlService service) {
return createWithNativeWrapper(service, new EArcNativeWrapperImpl()); return createWithNativeWrapper(service, new EarcNativeWrapperImpl());
} }
/** /**
* A factory method with injection of native methods for testing. * A factory method with injection of native methods for testing.
*/ */
static HdmiEarcController createWithNativeWrapper(HdmiControlService service, static HdmiEarcController createWithNativeWrapper(HdmiControlService service,
EArcNativeWrapper nativeWrapper) { EarcNativeWrapper nativeWrapper) {
HdmiEarcController controller = new HdmiEarcController(service, nativeWrapper); HdmiEarcController controller = new HdmiEarcController(service, nativeWrapper);
if (!controller.init(nativeWrapper)) { if (!controller.init(nativeWrapper)) {
HdmiLogger.warning("Could not connect to eARC AIDL HAL."); HdmiLogger.warning("Could not connect to eARC AIDL HAL.");
@@ -167,10 +167,10 @@ final class HdmiEarcController {
return controller; return controller;
} }
private boolean init(EArcNativeWrapper nativeWrapper) { private boolean init(EarcNativeWrapper nativeWrapper) {
if (nativeWrapper.nativeInit()) { if (nativeWrapper.nativeInit()) {
mControlHandler = new Handler(mService.getServiceLooper()); mControlHandler = new Handler(mService.getServiceLooper());
mEArcNativeWrapperImpl.nativeSetCallback(new EarcAidlCallback()); mEarcNativeWrapperImpl.nativeSetCallback(new EarcAidlCallback());
return true; return true;
} }
return false; return false;
@@ -194,7 +194,7 @@ final class HdmiEarcController {
@HdmiAnnotations.ServiceThreadOnly @HdmiAnnotations.ServiceThreadOnly
void setEarcEnabled(boolean enabled) { void setEarcEnabled(boolean enabled) {
assertRunOnServiceThread(); assertRunOnServiceThread();
mEArcNativeWrapperImpl.nativeSetEArcEnabled(enabled); mEarcNativeWrapperImpl.nativeSetEarcEnabled(enabled);
} }
/** /**
@@ -205,7 +205,7 @@ final class HdmiEarcController {
@HdmiAnnotations.ServiceThreadOnly @HdmiAnnotations.ServiceThreadOnly
@Constants.EarcStatus @Constants.EarcStatus
int getState(int portId) { int getState(int portId) {
return mEArcNativeWrapperImpl.nativeGetState(portId); return mEarcNativeWrapperImpl.nativeGetState(portId);
} }
/** /**
@@ -215,7 +215,7 @@ final class HdmiEarcController {
*/ */
@HdmiAnnotations.ServiceThreadOnly @HdmiAnnotations.ServiceThreadOnly
byte[] getLastReportedCaps(int portId) { byte[] getLastReportedCaps(int portId) {
return mEArcNativeWrapperImpl.nativeGetLastReportedAudioCapabilities(portId); return mEarcNativeWrapperImpl.nativeGetLastReportedAudioCapabilities(portId);
} }
final class EarcAidlCallback extends IEArcCallback.Stub { final class EarcAidlCallback extends IEArcCallback.Stub {

View File

@@ -18,10 +18,10 @@ package com.android.server.hdmi;
import android.hardware.tv.hdmi.earc.IEArcStatus; import android.hardware.tv.hdmi.earc.IEArcStatus;
final class FakeEArcNativeWrapper implements HdmiEarcController.EArcNativeWrapper { final class FakeEarcNativeWrapper implements HdmiEarcController.EarcNativeWrapper {
private static final String TAG = "FakeEArcNativeWrapper"; private static final String TAG = "FakeEarcNativeWrapper";
private boolean mIsEArcEnabled = true; private boolean mIsEarcEnabled = true;
@Override @Override
public boolean nativeInit() { public boolean nativeInit() {
@@ -29,13 +29,13 @@ final class FakeEArcNativeWrapper implements HdmiEarcController.EArcNativeWrappe
} }
@Override @Override
public void nativeSetEArcEnabled(boolean enabled) { public void nativeSetEarcEnabled(boolean enabled) {
mIsEArcEnabled = enabled; mIsEarcEnabled = enabled;
} }
@Override @Override
public boolean nativeIsEArcEnabled() { public boolean nativeIsEarcEnabled() {
return mIsEArcEnabled; return mIsEarcEnabled;
} }
@Override @Override

View File

@@ -29,9 +29,11 @@ import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.eq; import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -91,7 +93,7 @@ public class HdmiCecLocalDeviceTvTest {
private HdmiCecLocalDeviceTv mHdmiCecLocalDeviceTv; private HdmiCecLocalDeviceTv mHdmiCecLocalDeviceTv;
private FakeNativeWrapper mNativeWrapper; private FakeNativeWrapper mNativeWrapper;
private HdmiEarcController mHdmiEarcController; private HdmiEarcController mHdmiEarcController;
private FakeEArcNativeWrapper mEArcNativeWrapper; private FakeEarcNativeWrapper mEarcNativeWrapper;
private FakePowerManagerWrapper mPowerManager; private FakePowerManagerWrapper mPowerManager;
private Looper mMyLooper; private Looper mMyLooper;
private TestLooper mTestLooper = new TestLooper(); private TestLooper mTestLooper = new TestLooper();
@@ -187,9 +189,9 @@ public class HdmiCecLocalDeviceTvTest {
mHdmiCecController = HdmiCecController.createWithNativeWrapper( mHdmiCecController = HdmiCecController.createWithNativeWrapper(
mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
mHdmiControlService.setCecController(mHdmiCecController); mHdmiControlService.setCecController(mHdmiCecController);
mEArcNativeWrapper = new FakeEArcNativeWrapper(); mEarcNativeWrapper = new FakeEarcNativeWrapper();
mHdmiEarcController = HdmiEarcController.createWithNativeWrapper( mHdmiEarcController = HdmiEarcController.createWithNativeWrapper(
mHdmiControlService, mEArcNativeWrapper); mHdmiControlService, mEarcNativeWrapper);
mHdmiControlService.setEarcController(mHdmiEarcController); mHdmiControlService.setEarcController(mHdmiEarcController);
mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
HdmiPortInfo[] hdmiPortInfos = new HdmiPortInfo[2]; HdmiPortInfo[] hdmiPortInfos = new HdmiPortInfo[2];
@@ -240,6 +242,61 @@ public class HdmiCecLocalDeviceTvTest {
} }
} }
private void initiateArcAndValidate() {
HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc(
ADDR_AUDIO_SYSTEM,
ADDR_TV);
mNativeWrapper.onCecMessage(initiateArc);
mTestLooper.dispatchAll();
HdmiCecMessage reportArcInitiated = HdmiCecMessageBuilder.buildReportArcInitiated(
ADDR_TV,
ADDR_AUDIO_SYSTEM);
// <Report ARC Initiated> should only be sent after SAD querying is done
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(reportArcInitiated);
// Finish querying SADs
assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(reportArcInitiated);
mNativeWrapper.clearResultMessages();
}
private void initateSamAndValidate() {
// Record that previous system audio mode is on.
mHdmiCecLocalDeviceTv.setSystemAudioControlFeatureEnabled(true);
HdmiCecFeatureAction action = new SystemAudioAutoInitiationAction(mHdmiCecLocalDeviceTv,
ADDR_AUDIO_SYSTEM);
mHdmiCecLocalDeviceTv.addAndStartAction(action);
mTestLooper.dispatchAll();
HdmiCecMessage giveSystemAudioModeStatus =
HdmiCecMessageBuilder.buildGiveSystemAudioModeStatus(
mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
assertThat(mNativeWrapper.getResultMessages()).contains(giveSystemAudioModeStatus);
HdmiCecMessage reportSystemAudioMode =
HdmiCecMessageBuilder.buildReportSystemAudioMode(
ADDR_AUDIO_SYSTEM,
mHdmiCecLocalDeviceTv.getDeviceInfo().getLogicalAddress(),
true);
mHdmiControlService.handleCecCommand(reportSystemAudioMode);
mTestLooper.dispatchAll();
assertThat(mHdmiControlService.isSystemAudioActivated()).isTrue();
}
@Test @Test
public void initialPowerStateIsStandby() { public void initialPowerStateIsStandby() {
assertThat(mHdmiCecLocalDeviceTv.getPowerStatus()).isEqualTo( assertThat(mHdmiCecLocalDeviceTv.getPowerStatus()).isEqualTo(
@@ -1531,30 +1588,7 @@ public class HdmiCecLocalDeviceTvTest {
mNativeWrapper.onCecMessage(reportPhysicalAddress); mNativeWrapper.onCecMessage(reportPhysicalAddress);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
HdmiCecMessage initiateArc = HdmiCecMessageBuilder.buildInitiateArc( initiateArcAndValidate();
ADDR_AUDIO_SYSTEM,
ADDR_TV);
mNativeWrapper.onCecMessage(initiateArc);
mTestLooper.dispatchAll();
HdmiCecMessage reportArcInitiated = HdmiCecMessageBuilder.buildReportArcInitiated(
ADDR_TV,
ADDR_AUDIO_SYSTEM);
// <Report ARC Initiated> should only be sent after SAD querying is done
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(reportArcInitiated);
// Finish querying SADs
assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(SAD_QUERY);
mTestLooper.moveTimeForward(HdmiConfig.TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(reportArcInitiated);
mNativeWrapper.clearResultMessages();
mHdmiControlService.setEarcEnabled(HdmiControlManager.EARC_FEATURE_ENABLED); mHdmiControlService.setEarcEnabled(HdmiControlManager.EARC_FEATURE_ENABLED);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
@@ -1565,4 +1599,59 @@ public class HdmiCecLocalDeviceTvTest {
assertThat(mNativeWrapper.getResultMessages()).contains(requestArcTermination); assertThat(mNativeWrapper.getResultMessages()).contains(requestArcTermination);
} }
@Test
public void fromArcToEarc_SamRemainsOn() {
initateSamAndValidate();
// Emulate Audio device on port 0x2000 (supports ARC and eARC)
mNativeWrapper.setPortConnectionStatus(2, true);
HdmiCecMessage reportPhysicalAddress =
HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
ADDR_AUDIO_SYSTEM, 0x2000, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
mNativeWrapper.onCecMessage(reportPhysicalAddress);
mTestLooper.dispatchAll();
initiateArcAndValidate();
assertThat(mHdmiControlService.isSystemAudioActivated()).isTrue();
mHdmiControlService.setEarcEnabled(HdmiControlManager.EARC_FEATURE_ENABLED);
mTestLooper.dispatchAll();
HdmiCecMessage requestArcTermination = HdmiCecMessageBuilder.buildRequestArcTermination(
ADDR_TV,
ADDR_AUDIO_SYSTEM);
assertThat(mNativeWrapper.getResultMessages()).contains(requestArcTermination);
assertThat(mHdmiControlService.isSystemAudioActivated()).isTrue();
}
@Test
public void disableEarc_SamRemainsOn() {
initateSamAndValidate();
// Emulate Audio device on port 0x2000 (supports ARC and eARC)
mNativeWrapper.setPortConnectionStatus(2, true);
HdmiCecMessage reportPhysicalAddress =
HdmiCecMessageBuilder.buildReportPhysicalAddressCommand(
ADDR_AUDIO_SYSTEM, 0x2000, HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM);
mNativeWrapper.onCecMessage(reportPhysicalAddress);
mTestLooper.dispatchAll();
mHdmiControlService.setEarcEnabled(HdmiControlManager.EARC_FEATURE_ENABLED);
mTestLooper.dispatchAll();
assertThat(mHdmiControlService.isSystemAudioActivated()).isTrue();
mHdmiControlService.initializeEarcLocalDevice(HdmiControlService.INITIATED_BY_BOOT_UP);
HdmiEarcLocalDevice mHdmiEarcLocalDeviceTx = mHdmiControlService.getEarcLocalDevice();
mHdmiEarcLocalDeviceTx.handleEarcStateChange(Constants.HDMI_EARC_STATUS_EARC_CONNECTED);
mTestLooper.moveTimeForward(HdmiEarcLocalDeviceTx.REPORT_CAPS_MAX_DELAY_MS + 1);
mTestLooper.dispatchAll();
verify(mAudioManager, times(1)).setWiredDeviceConnectionState(
any(), eq(1));
assertThat(mHdmiControlService.isSystemAudioActivated()).isTrue();
}
} }

View File

@@ -88,7 +88,7 @@ public class HdmiControlServiceTest {
private MockPlaybackDevice mPlaybackDeviceSpy; private MockPlaybackDevice mPlaybackDeviceSpy;
private FakeNativeWrapper mNativeWrapper; private FakeNativeWrapper mNativeWrapper;
private HdmiEarcController mHdmiEarcController; private HdmiEarcController mHdmiEarcController;
private FakeEArcNativeWrapper mEArcNativeWrapper; private FakeEarcNativeWrapper mEarcNativeWrapper;
private FakePowerManagerWrapper mPowerManager; private FakePowerManagerWrapper mPowerManager;
private Looper mMyLooper; private Looper mMyLooper;
private TestLooper mTestLooper = new TestLooper(); private TestLooper mTestLooper = new TestLooper();
@@ -128,9 +128,9 @@ public class HdmiControlServiceTest {
mHdmiCecController = HdmiCecController.createWithNativeWrapper( mHdmiCecController = HdmiCecController.createWithNativeWrapper(
mHdmiControlServiceSpy, mNativeWrapper, mHdmiControlServiceSpy.getAtomWriter()); mHdmiControlServiceSpy, mNativeWrapper, mHdmiControlServiceSpy.getAtomWriter());
mHdmiControlServiceSpy.setCecController(mHdmiCecController); mHdmiControlServiceSpy.setCecController(mHdmiCecController);
mEArcNativeWrapper = new FakeEArcNativeWrapper(); mEarcNativeWrapper = new FakeEarcNativeWrapper();
mHdmiEarcController = HdmiEarcController.createWithNativeWrapper( mHdmiEarcController = HdmiEarcController.createWithNativeWrapper(
mHdmiControlServiceSpy, mEArcNativeWrapper); mHdmiControlServiceSpy, mEarcNativeWrapper);
mHdmiControlServiceSpy.setEarcController(mHdmiEarcController); mHdmiControlServiceSpy.setEarcController(mHdmiEarcController);
mHdmiControlServiceSpy.setHdmiMhlController(HdmiMhlControllerStub.create( mHdmiControlServiceSpy.setHdmiMhlController(HdmiMhlControllerStub.create(
mHdmiControlServiceSpy)); mHdmiControlServiceSpy));

View File

@@ -69,7 +69,7 @@ public class HdmiEarcLocalDeviceTxTest {
private HdmiEarcLocalDevice mHdmiEarcLocalDeviceTx; private HdmiEarcLocalDevice mHdmiEarcLocalDeviceTx;
private FakeNativeWrapper mNativeWrapper; private FakeNativeWrapper mNativeWrapper;
private HdmiEarcController mHdmiEarcController; private HdmiEarcController mHdmiEarcController;
private FakeEArcNativeWrapper mEArcNativeWrapper; private FakeEarcNativeWrapper mEarcNativeWrapper;
private FakePowerManagerWrapper mPowerManager; private FakePowerManagerWrapper mPowerManager;
private byte[] mEarcCapabilities = new byte[]{ private byte[] mEarcCapabilities = new byte[]{
0x01, 0x01, 0x1a, 0x35, 0x0f, 0x7f, 0x07, 0x15, 0x07, 0x50, 0x3d, 0x1f, (byte) 0xc0, 0x01, 0x01, 0x1a, 0x35, 0x0f, 0x7f, 0x07, 0x15, 0x07, 0x50, 0x3d, 0x1f, (byte) 0xc0,
@@ -128,9 +128,9 @@ public class HdmiEarcLocalDeviceTxTest {
mHdmiCecController = HdmiCecController.createWithNativeWrapper( mHdmiCecController = HdmiCecController.createWithNativeWrapper(
mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter()); mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
mHdmiControlService.setCecController(mHdmiCecController); mHdmiControlService.setCecController(mHdmiCecController);
mEArcNativeWrapper = new FakeEArcNativeWrapper(); mEarcNativeWrapper = new FakeEarcNativeWrapper();
mHdmiEarcController = HdmiEarcController.createWithNativeWrapper( mHdmiEarcController = HdmiEarcController.createWithNativeWrapper(
mHdmiControlService, mEArcNativeWrapper); mHdmiControlService, mEarcNativeWrapper);
mHdmiControlService.setEarcController(mHdmiEarcController); mHdmiControlService.setEarcController(mHdmiEarcController);
mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService)); mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
mHdmiControlService.initService(); mHdmiControlService.initService();