Merge changes Ifebc283a,I146fd248 into tm-dev

* changes:
  Don't send <Report ARC Initiated> until ARC is enabled
  Return early if audio system doesn't support SAD feature
This commit is contained in:
Yan Han
2022-05-13 15:20:36 +00:00
committed by Android (Google) Code Review
7 changed files with 166 additions and 132 deletions

View File

@@ -810,35 +810,24 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
} }
} }
/**
* Change ARC status into the given {@code enabled} status.
*
* @return {@code true} if ARC was in "Enabled" status
*/
@ServiceThreadOnly @ServiceThreadOnly
boolean setArcStatus(boolean enabled) { void enableArc(List<byte[]> supportedSads) {
assertRunOnServiceThread(); assertRunOnServiceThread();
HdmiLogger.debug("Set Arc Status[old:%b new:true]", mArcEstablished);
HdmiLogger.debug("Set Arc Status[old:%b new:%b]", mArcEstablished, enabled); enableAudioReturnChannel(true);
boolean oldStatus = mArcEstablished; notifyArcStatusToAudioService(true, supportedSads);
if (enabled) { mArcEstablished = true;
RequestSadAction action = new RequestSadAction( }
this, Constants.ADDR_AUDIO_SYSTEM,
new RequestSadAction.RequestSadCallback() { @ServiceThreadOnly
@Override void disableArc() {
public void onRequestSadDone(List<byte[]> supportedSads) { assertRunOnServiceThread();
enableAudioReturnChannel(enabled); HdmiLogger.debug("Set Arc Status[old:%b new:false]", mArcEstablished);
notifyArcStatusToAudioService(enabled, supportedSads);
mArcEstablished = enabled; enableAudioReturnChannel(false);
} notifyArcStatusToAudioService(false, new ArrayList<>());
}); mArcEstablished = false;
addAndStartAction(action);
} else {
enableAudioReturnChannel(enabled);
notifyArcStatusToAudioService(enabled, new ArrayList<>());
mArcEstablished = enabled;
}
return oldStatus;
} }
/** /**
@@ -1066,7 +1055,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
protected int handleTerminateArc(HdmiCecMessage message) { protected int handleTerminateArc(HdmiCecMessage message) {
assertRunOnServiceThread(); assertRunOnServiceThread();
if (mService .isPowerStandbyOrTransient()) { if (mService .isPowerStandbyOrTransient()) {
setArcStatus(false); disableArc();
return Constants.HANDLED; return Constants.HANDLED;
} }
// Do not check ARC configuration since the AVR might have been already removed. // Do not check ARC configuration since the AVR might have been already removed.
@@ -1353,7 +1342,7 @@ final class HdmiCecLocalDeviceTv extends HdmiCecLocalDevice {
if (avr == null) { if (avr == null) {
return; return;
} }
setArcStatus(false); disableArc();
// Seq #44. // Seq #44.
removeAllRunningArcAction(); removeAllRunningArcAction();

View File

@@ -63,7 +63,7 @@ abstract class RequestArcAction extends HdmiCecFeatureAction {
finish(); finish();
return true; return true;
} else if (originalOpcode == Constants.MESSAGE_REQUEST_ARC_INITIATION) { } else if (originalOpcode == Constants.MESSAGE_REQUEST_ARC_INITIATION) {
tv().setArcStatus(false); tv().disableArc();
finish(); finish();
return true; return true;
} }

View File

@@ -48,7 +48,7 @@ final class RequestArcInitiationAction extends RequestArcAction {
public void onSendCompleted(int error) { public void onSendCompleted(int error) {
if (error != SendMessageResult.SUCCESS) { if (error != SendMessageResult.SUCCESS) {
// Turn off ARC status if <Request ARC Initiation> fails. // Turn off ARC status if <Request ARC Initiation> fails.
tv().setArcStatus(false); tv().disableArc();
finish(); finish();
} }
} }

View File

@@ -181,13 +181,20 @@ final class RequestSadAction extends HdmiCecFeatureAction {
return true; return true;
} }
if (cmd.getOpcode() == Constants.MESSAGE_FEATURE_ABORT if (cmd.getOpcode() == Constants.MESSAGE_FEATURE_ABORT
&& (cmd.getParams()[0] & 0xFF) == Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR && (cmd.getParams()[0] & 0xFF)
&& (cmd.getParams()[1] & 0xFF) == Constants.ABORT_INVALID_OPERAND) { == Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR) {
// Queried SADs are not supported if ((cmd.getParams()[1] & 0xFF) == Constants.ABORT_UNRECOGNIZED_OPCODE) {
mQueriedSadCount += MAX_SAD_PER_REQUEST; // SAD feature is not supported
mTimeoutRetry = 0; wrapUpAndFinish();
querySad(); return true;
return true; }
if ((cmd.getParams()[1] & 0xFF) == Constants.ABORT_INVALID_OPERAND) {
// Queried SADs are not supported
mQueriedSadCount += MAX_SAD_PER_REQUEST;
mTimeoutRetry = 0;
querySad();
return true;
}
} }
return false; return false;
} }
@@ -211,9 +218,9 @@ final class RequestSadAction extends HdmiCecFeatureAction {
querySad(); querySad();
return; return;
} }
mQueriedSadCount += MAX_SAD_PER_REQUEST; // Don't query any other SADs if one of the SAD queries ran into the maximum amount of
mTimeoutRetry = 0; // retries.
querySad(); wrapUpAndFinish();
} }
} }

View File

@@ -20,6 +20,8 @@ import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.tv.cec.V1_0.SendMessageResult; import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.util.Slog; import android.util.Slog;
import java.util.List;
/** /**
* Feature action that handles enabling/disabling of ARC transmission channel. * Feature action that handles enabling/disabling of ARC transmission channel.
* Once TV gets &lt;Initiate ARC&gt;, TV sends &lt;Report ARC Initiated&gt; to AV Receiver. * Once TV gets &lt;Initiate ARC&gt;, TV sends &lt;Report ARC Initiated&gt; to AV Receiver.
@@ -55,21 +57,31 @@ final class SetArcTransmissionStateAction extends HdmiCecFeatureAction {
boolean start() { boolean start() {
// Seq #37. // Seq #37.
if (mEnabled) { if (mEnabled) {
// Enable ARC status immediately before sending <Report Arc Initiated>. // Request SADs before enabling ARC
// If AVR responds with <Feature Abort>, disable ARC status again. RequestSadAction action = new RequestSadAction(
// This is different from spec that says that turns ARC status to localDevice(), Constants.ADDR_AUDIO_SYSTEM,
// "Enabled" if <Report ARC Initiated> is acknowledged and no new RequestSadAction.RequestSadCallback() {
// <Feature Abort> is received. @Override
// But implemented this way to save the time having to wait for public void onRequestSadDone(List<byte[]> supportedSads) {
// <Feature Abort>. // Enable ARC status immediately before sending <Report Arc Initiated>.
setArcStatus(true); // If AVR responds with <Feature Abort>, disable ARC status again.
// If succeeds to send <Report ARC Initiated>, wait general timeout // This is different from spec that says that turns ARC status to
// to check whether there is no <Feature Abort> for <Report ARC Initiated>. // "Enabled" if <Report ARC Initiated> is acknowledged and no
mState = STATE_WAITING_TIMEOUT; // <Feature Abort> is received.
addTimer(mState, HdmiConfig.TIMEOUT_MS); // But implemented this way to save the time having to wait for
sendReportArcInitiated(); // <Feature Abort>.
Slog.i(TAG, "Enabling ARC");
tv().enableArc(supportedSads);
// If succeeds to send <Report ARC Initiated>, wait general timeout to
// check whether there is no <Feature Abort> for <Report ARC Initiated>.
mState = STATE_WAITING_TIMEOUT;
addTimer(mState, HdmiConfig.TIMEOUT_MS);
sendReportArcInitiated();
}
});
addAndStartAction(action);
} else { } else {
setArcStatus(false); disableArc();
finish(); finish();
} }
return true; return true;
@@ -92,7 +104,7 @@ final class SetArcTransmissionStateAction extends HdmiCecFeatureAction {
case SendMessageResult.NACK: case SendMessageResult.NACK:
// If <Report ARC Initiated> is negatively ack'ed, disable ARC and // If <Report ARC Initiated> is negatively ack'ed, disable ARC and
// send <Report ARC Terminated> directly. // send <Report ARC Terminated> directly.
setArcStatus(false); disableArc();
HdmiLogger.debug("Failed to send <Report Arc Initiated>."); HdmiLogger.debug("Failed to send <Report Arc Initiated>.");
finish(); finish();
break; break;
@@ -101,16 +113,12 @@ final class SetArcTransmissionStateAction extends HdmiCecFeatureAction {
}); });
} }
private void setArcStatus(boolean enabled) { private void disableArc() {
tv().setArcStatus(enabled); Slog.i(TAG, "Disabling ARC");
Slog.i(TAG, "Change arc status to " + enabled);
// If enabled before and set to "disabled" and send <Report Arc Terminated> to tv().disableArc();
// av reciever. sendCommand(HdmiCecMessageBuilder.buildReportArcTerminated(getSourceAddress(),
if (!enabled) { mAvrAddress));
sendCommand(HdmiCecMessageBuilder.buildReportArcTerminated(getSourceAddress(),
mAvrAddress));
}
} }
@Override @Override
@@ -124,7 +132,7 @@ final class SetArcTransmissionStateAction extends HdmiCecFeatureAction {
int originalOpcode = cmd.getParams()[0] & 0xFF; int originalOpcode = cmd.getParams()[0] & 0xFF;
if (originalOpcode == Constants.MESSAGE_REPORT_ARC_INITIATED) { if (originalOpcode == Constants.MESSAGE_REPORT_ARC_INITIATED) {
HdmiLogger.debug("Feature aborted for <Report Arc Initiated>"); HdmiLogger.debug("Feature aborted for <Report Arc Initiated>");
setArcStatus(false); disableArc();
finish(); finish();
return true; return true;
} }

View File

@@ -560,8 +560,19 @@ public class HdmiCecLocalDeviceTvTest {
HdmiCecMessage reportArcInitiated = HdmiCecMessageBuilder.buildReportArcInitiated( HdmiCecMessage reportArcInitiated = HdmiCecMessageBuilder.buildReportArcInitiated(
ADDR_TV, ADDR_TV,
ADDR_AUDIO_SYSTEM); ADDR_AUDIO_SYSTEM);
assertThat(mNativeWrapper.getResultMessages()).contains(reportArcInitiated); // <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); 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);
} }
@Test @Test

View File

@@ -139,11 +139,12 @@ public class RequestSadActionTest {
} }
@Test @Test
public void noResponse_queryAgain_emptyResult() { public void noResponse_queryAgainOnce_emptyResult() {
RequestSadAction action = new RequestSadAction(mHdmiCecLocalDeviceTv, ADDR_AUDIO_SYSTEM, RequestSadAction action = new RequestSadAction(mHdmiCecLocalDeviceTv, ADDR_AUDIO_SYSTEM,
mCallback); mCallback);
action.start(); action.start();
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mSupportedSads).isNull();
HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
@@ -153,45 +154,90 @@ public class RequestSadActionTest {
mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected1); assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mSupportedSads).isNotNull();
assertThat(mSupportedSads.size()).isEqualTo(0);
HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
mNativeWrapper.clearResultMessages(); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected2);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected3);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected4);
assertThat(mSupportedSads.size()).isEqualTo(0);
}
@Test
public void unrecognizedOpcode_dontQueryAgain_emptyResult() {
RequestSadAction action = new RequestSadAction(mHdmiCecLocalDeviceTv, ADDR_AUDIO_SYSTEM,
mCallback);
action.start();
mTestLooper.dispatchAll();
assertThat(mSupportedSads).isNull();
HdmiCecMessage unrecognizedOpcode = HdmiCecMessageBuilder.buildFeatureAbortCommand(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress,
Constants.MESSAGE_REQUEST_SHORT_AUDIO_DESCRIPTOR,
Constants.ABORT_UNRECOGNIZED_OPCODE);
HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_1.stream().mapToInt(i -> i).toArray());
assertThat(mNativeWrapper.getResultMessages()).contains(expected1);
action.processCommand(unrecognizedOpcode);
mTestLooper.dispatchAll();
assertThat(mSupportedSads).isNotNull();
assertThat(mSupportedSads.size()).isEqualTo(0);
HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected2);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected3);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected4);
assertThat(mSupportedSads.size()).isEqualTo(0); assertThat(mSupportedSads.size()).isEqualTo(0);
} }
@@ -455,11 +501,12 @@ public class RequestSadActionTest {
} }
@Test @Test
public void invalidMessageLength_queryAgain() { public void invalidMessageLength_queryAgainOnce() {
RequestSadAction action = new RequestSadAction(mHdmiCecLocalDeviceTv, ADDR_AUDIO_SYSTEM, RequestSadAction action = new RequestSadAction(mHdmiCecLocalDeviceTv, ADDR_AUDIO_SYSTEM,
mCallback); mCallback);
action.start(); action.start();
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mSupportedSads).isNull();
HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected1 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
@@ -482,63 +529,35 @@ public class RequestSadActionTest {
mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mSupportedSads).isNotNull();
assertThat(mSupportedSads.size()).isEqualTo(0);
HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected2 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray()); CODECS_TO_QUERY_2.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_2 = new byte[]{
0x05, 0x18, 0x4A,
0x06, 0x64, 0x5A,
0x07,
0x08, 0x20, 0x0A};
HdmiCecMessage response2 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_2);
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
mNativeWrapper.clearResultMessages();
action.processCommand(response2);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected2);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected3 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray()); CODECS_TO_QUERY_3.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_3 = new byte[0];
HdmiCecMessage response3 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor(
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_3);
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
mNativeWrapper.clearResultMessages();
action.processCommand(response3);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected3);
mNativeWrapper.clearResultMessages();
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor( HdmiCecMessage expected4 = HdmiCecMessageBuilder.buildRequestShortAudioDescriptor(
mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, Constants.ADDR_AUDIO_SYSTEM,
CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray()); CODECS_TO_QUERY_4.stream().mapToInt(i -> i).toArray());
byte[] sadsToRespond_4 = new byte[]{
0x0D, 0x18, 0x4A, mTestLooper.moveTimeForward(TIMEOUT_MS);
0x0E, 0x64, 0x5A, mTestLooper.dispatchAll();
0x0F, 0x4B}; mTestLooper.moveTimeForward(TIMEOUT_MS);
HdmiCecMessage response4 = HdmiCecMessageBuilder.buildReportShortAudioDescriptor( mTestLooper.dispatchAll();
Constants.ADDR_AUDIO_SYSTEM, mTvLogicalAddress, sadsToRespond_4); mTestLooper.moveTimeForward(TIMEOUT_MS);
assertThat(mNativeWrapper.getResultMessages()).contains(expected4); mTestLooper.dispatchAll();
mNativeWrapper.clearResultMessages(); mTestLooper.moveTimeForward(TIMEOUT_MS);
action.processCommand(response4);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).contains(expected4);
mTestLooper.moveTimeForward(TIMEOUT_MS); mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll(); mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected2);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected3);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(expected4);
assertThat(mSupportedSads.size()).isEqualTo(0); assertThat(mSupportedSads.size()).isEqualTo(0);
} }