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:
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 <Initiate ARC>, TV sends <Report ARC Initiated> to AV Receiver.
|
* Once TV gets <Initiate ARC>, TV sends <Report ARC Initiated> 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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user