blob: 543fa5727f19fa9f40b0be5d6053d810917b4e98 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.hdmi;
import static com.android.server.SystemService.PHASE_SYSTEM_SERVICES_READY;
import static com.android.server.hdmi.Constants.ABORT_UNRECOGNIZED_OPCODE;
import static com.android.server.hdmi.Constants.ADDR_AUDIO_SYSTEM;
import static com.android.server.hdmi.Constants.ADDR_BROADCAST;
import static com.android.server.hdmi.Constants.ADDR_INVALID;
import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.HdmiControlService.INITIATED_BY_ENABLE_CEC;
import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.hardware.hdmi.HdmiControlManager;
import android.hardware.hdmi.HdmiDeviceInfo;
import android.hardware.hdmi.HdmiPortInfo;
import android.hardware.hdmi.IHdmiControlCallback;
import android.hardware.tv.cec.V1_0.SendMessageResult;
import android.os.Looper;
import android.os.RemoteException;
import android.os.test.TestLooper;
import android.platform.test.annotations.Presubmit;
import android.sysprop.HdmiProperties;
import android.view.KeyEvent;
import androidx.test.InstrumentationRegistry;
import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.mockito.MockitoAnnotations;
import java.util.ArrayList;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
@SmallTest
@Presubmit
@RunWith(JUnit4.class)
/** Tests for {@link HdmiCecLocalDevicePlayback} class. */
public class HdmiCecLocalDevicePlaybackTest {
private static final int TIMEOUT_MS = HdmiConfig.TIMEOUT_MS + 1;
private static final int HOTPLUG_INTERVAL =
HotplugDetectionAction.POLLING_INTERVAL_MS_FOR_PLAYBACK;
private static final int PORT_1 = 1;
private static final HdmiDeviceInfo INFO_TV = HdmiDeviceInfo.cecDeviceBuilder()
.setLogicalAddress(ADDR_TV)
.setPhysicalAddress(0x0000)
.setPortId(PORT_1)
.setDeviceType(HdmiDeviceInfo.DEVICE_TV)
.setVendorId(0x1234)
.setDisplayName("TV")
.setDevicePowerStatus(HdmiControlManager.POWER_STATUS_ON)
.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_1_4_B)
.build();
private HdmiControlService mHdmiControlService;
private HdmiCecController mHdmiCecController;
private HdmiCecLocalDevicePlayback mHdmiCecLocalDevicePlayback;
private FakeNativeWrapper mNativeWrapper;
private Looper mMyLooper;
private TestLooper mTestLooper = new TestLooper();
private FakePowerManagerWrapper mPowerManager;
private ArrayList<HdmiCecLocalDevice> mLocalDevices = new ArrayList<>();
private int mPlaybackPhysicalAddress;
private int mPlaybackLogicalAddress;
private boolean mWokenUp;
private boolean mActiveMediaSessionsPaused;
private FakePowerManagerInternalWrapper mPowerManagerInternal =
new FakePowerManagerInternalWrapper();
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
Context context = InstrumentationRegistry.getTargetContext();
mMyLooper = mTestLooper.getLooper();
FakeAudioFramework audioFramework = new FakeAudioFramework();
mHdmiControlService =
new HdmiControlService(InstrumentationRegistry.getTargetContext(),
Collections.singletonList(HdmiDeviceInfo.DEVICE_PLAYBACK),
audioFramework.getAudioManager(),
audioFramework.getAudioDeviceVolumeManager()) {
@Override
void wakeUp() {
mWokenUp = true;
super.wakeUp();
}
@Override
void pauseActiveMediaSessions() {
mActiveMediaSessionsPaused = true;
}
@Override
boolean isCecControlEnabled() {
return true;
}
@Override
boolean isPlaybackDevice() {
return true;
}
@Override
protected void writeStringSystemProperty(String key, String value) {
// do nothing
}
@Override
boolean canGoToStandby() {
return true;
}
};
mHdmiControlService.setHdmiCecConfig(new FakeHdmiCecConfig(context));
mHdmiControlService.setDeviceConfig(new FakeDeviceConfigWrapper());
mHdmiControlService.setIoLooper(mMyLooper);
mNativeWrapper = new FakeNativeWrapper();
mHdmiCecController = HdmiCecController.createWithNativeWrapper(
mHdmiControlService, mNativeWrapper, mHdmiControlService.getAtomWriter());
mHdmiControlService.setCecController(mHdmiCecController);
mHdmiControlService.setHdmiMhlController(HdmiMhlControllerStub.create(mHdmiControlService));
HdmiPortInfo[] hdmiPortInfos = new HdmiPortInfo[1];
hdmiPortInfos[0] =
new HdmiPortInfo.Builder(1, HdmiPortInfo.PORT_OUTPUT, 0x0000)
.setCecSupported(true)
.setMhlSupported(false)
.setArcSupported(false)
.build();
mNativeWrapper.setPortInfo(hdmiPortInfos);
mNativeWrapper.setPortConnectionStatus(1, true);
mHdmiControlService.initService();
mHdmiControlService.onBootPhase(PHASE_SYSTEM_SERVICES_READY);
mPowerManager = new FakePowerManagerWrapper(context);
mHdmiControlService.setPowerManager(mPowerManager);
mHdmiControlService.setPowerManagerInternal(mPowerManagerInternal);
mPlaybackPhysicalAddress = 0x2000;
mNativeWrapper.setPhysicalAddress(mPlaybackPhysicalAddress);
mTestLooper.dispatchAll();
mHdmiCecLocalDevicePlayback = mHdmiControlService.playback();
mLocalDevices.add(mHdmiCecLocalDevicePlayback);
mPlaybackLogicalAddress = mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress();
mHdmiControlService.getHdmiCecNetwork().addCecDevice(INFO_TV);
mNativeWrapper.clearResultMessages();
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties.playback_device_action_on_routing_control_values.NONE;
mHdmiControlService.setPowerStatus(HdmiControlManager.POWER_STATUS_ON);
}
@Test
public void handleRoutingChange_None() {
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties.playback_device_action_on_routing_control_values.NONE;
mPowerManager.setInteractive(false);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isFalse();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
}
@Test
public void handleRoutingInformation_None() {
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties.playback_device_action_on_routing_control_values.NONE;
mPowerManager.setInteractive(false);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isFalse();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
}
@Test
public void handleRoutingChange_WakeUpOnly() {
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties.playback_device_action_on_routing_control_values.WAKE_UP_ONLY;
mPowerManager.setInteractive(false);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
}
@Test
public void handleRoutingInformation_WakeUpOnly() {
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties.playback_device_action_on_routing_control_values.WAKE_UP_ONLY;
mPowerManager.setInteractive(false);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mNativeWrapper.getResultMessages().contains(expectedMessage)).isFalse();
}
@Test
public void handleRoutingChange_WakeUpAndSendActiveSource() {
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties
.playback_device_action_on_routing_control_values
.WAKE_UP_AND_SEND_ACTIVE_SOURCE;
mPowerManager.setInteractive(false);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
@Test
public void handleRoutingInformation_WakeUpAndSendActiveSource() {
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties
.playback_device_action_on_routing_control_values
.WAKE_UP_AND_SEND_ACTIVE_SOURCE;
mPowerManager.setInteractive(false);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress);
HdmiCecMessage expectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
@Test
public void handleRoutingChange_otherDevice_None() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
0x5000);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
ADDR_INVALID);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingChange_sameDevice_None_ActiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
mPlaybackLogicalAddress);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingChange_sameDevice_None_InactiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
ADDR_INVALID);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingChange_otherDevice_StandbyNow() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void handleRoutingChange_toSwitchInActivePath_noStandby() {
int newPlaybackPhysicalAddress = 0x2100;
int switchPhysicalAddress = 0x2000;
mNativeWrapper.setPhysicalAddress(newPlaybackPhysicalAddress);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
newPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mTestLooper.dispatchAll();
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, newPlaybackPhysicalAddress,
switchPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingChange_toTv_StandbyNow() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mTestLooper.dispatchAll();
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, mPlaybackPhysicalAddress,
Constants.TV_PHYSICAL_ADDRESS);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void handleRoutingChange_otherDevice_StandbyNow_InactiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingChange_sameDevice_StandbyNow_ActiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingChange(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingChange_otherDevice_ActiveSource_mediaSessionsPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
0x5000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isTrue();
}
@Test
public void handleRoutingChange_otherDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
0x5000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleRoutingChange_sameDevice_ActiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleRoutingChange_sameDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleRoutingInformation_otherDevice_None() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
0x5000);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
ADDR_INVALID);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingInformation_sameDevice_None_ActiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
mPlaybackLogicalAddress);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingInformation_sameDevice_None_InactiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
ADDR_INVALID);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingInformation_otherDevice_StandbyNow() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void handleRoutingInformation_otherDevice_StandbyNow_InactiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingInformation_sameDevice_StandbyNow_ActiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleRoutingInformation(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleRoutingInformation_otherDevice_ActiveSource_mediaSessionsPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isTrue();
}
@Test
public void handleRoutingInformation_otherDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, 0x5000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleRoutingInformation_sameDevice_ActiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleRoutingInformation_sameDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildRoutingInformation(ADDR_TV, mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleSetStreamPath() {
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x2100);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
}
@Test
public void handleSetSystemAudioModeOn_audioSystemBroadcast() {
mHdmiControlService.setSystemAudioActivated(false);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isFalse();
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetSystemAudioMode(
Constants.ADDR_AUDIO_SYSTEM, Constants.ADDR_BROADCAST, true);
assertThat(mHdmiCecLocalDevicePlayback.handleSetSystemAudioMode(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue();
}
@Test
public void handleSetSystemAudioModeOff_audioSystemToPlayback() {
mHdmiCecLocalDevicePlayback.mService.setSystemAudioActivated(true);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue();
// This direct message to Playback device is invalid.
// Test should ignore it and still keep the system audio mode on.
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetSystemAudioMode(
Constants.ADDR_AUDIO_SYSTEM,
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
false);
assertThat(mHdmiCecLocalDevicePlayback.handleSetSystemAudioMode(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue();
}
@Test
public void handleSystemAudioModeStatusOn_DirectlyToLocalDeviceFromAudioSystem() {
mHdmiControlService.setSystemAudioActivated(false);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isFalse();
HdmiCecMessage message =
HdmiCecMessageBuilder.buildReportSystemAudioMode(
Constants.ADDR_AUDIO_SYSTEM,
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
true);
assertThat(mHdmiCecLocalDevicePlayback.handleSystemAudioModeStatus(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.mService.isSystemAudioActivated()).isTrue();
}
@Test
public void doNotWakeUpOnHotPlug_PlugIn() {
mPowerManager.setInteractive(false);
mHdmiCecLocalDevicePlayback.onHotplug(0, true);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void doNotWakeUpOnHotPlug_PlugOut() {
mPowerManager.setInteractive(false);
mHdmiCecLocalDevicePlayback.onHotplug(0, false);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void handleOnStandby_ScreenOff_NotActiveSource_ToTv() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(inactiveSource);
}
@Test
public void handleOnStandby_ScreenOff_NotActiveSource_ToTvAndAudioSystem() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(inactiveSource);
}
@Test
public void handleOnStandby_ScreenOff_NotActiveSource_Broadcast() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(inactiveSource);
}
@Test
public void handleOnStandby_ScreenOff_NotActiveSource_None() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(inactiveSource);
}
@Test
public void handleOnStandby_ScreenOff_ActiveSource_ToTv() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(inactiveSource);
}
@Test
public void handleOnStandby_ScreenOff_ActiveSource_ToTvAndAudioSystem() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(inactiveSource);
}
@Test
public void handleOnStandby_ScreenOff_ActiveSource_Broadcast() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(inactiveSource);
}
@Test
public void handleOnStandby_ScreenOff_ActiveSource_None() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(false, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageToAudioSystem =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_AUDIO_SYSTEM);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToAudioSystem);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).contains(inactiveSource);
}
@Test
public void handleOnStandby_CecMessageReceived() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.onStandby(true, HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageToTv =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
HdmiCecMessage inactiveSource = HdmiCecMessageBuilder.buildInactiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageToTv);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(standbyMessageBroadcast);
assertThat(mNativeWrapper.getResultMessages()).contains(inactiveSource);
}
@Test
public void handleOnInitializeCecComplete_ByEnableCec() {
mHdmiCecLocalDevicePlayback.onInitializeCecComplete(
mHdmiControlService.INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
HdmiCecMessage textViewOn =
HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(textViewOn);
}
@Test
public void handleOnInitializeCecComplete_ByBootUp() {
mHdmiCecLocalDevicePlayback.onInitializeCecComplete(
mHdmiControlService.INITIATED_BY_BOOT_UP);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
HdmiCecMessage textViewOn =
HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(textViewOn);
}
@Test
public void handleOnInitializeCecComplete_ByScreenOn_PowerControlModeTv() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV);
mHdmiCecLocalDevicePlayback.onInitializeCecComplete(
mHdmiControlService.INITIATED_BY_SCREEN_ON);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
HdmiCecMessage textViewOn =
HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn);
}
@Test
public void handleOnInitializeCecComplete_ByScreenOn_PowerControlModeNone() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_NONE);
mHdmiCecLocalDevicePlayback.onInitializeCecComplete(
mHdmiControlService.INITIATED_BY_SCREEN_ON);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
HdmiCecMessage textViewOn =
HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(textViewOn);
}
@Test
public void handleOnInitializeCecComplete_ByWakeUpMessage() {
mHdmiCecLocalDevicePlayback.onInitializeCecComplete(
mHdmiControlService.INITIATED_BY_WAKE_UP_MESSAGE);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
HdmiCecMessage textViewOn =
HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(textViewOn);
}
@Test
public void handleOnInitializeCecComplete_ByHotplug() {
mHdmiCecLocalDevicePlayback.onInitializeCecComplete(
mHdmiControlService.INITIATED_BY_HOTPLUG);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
HdmiCecMessage textViewOn =
HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(textViewOn);
}
@Test
public void handleActiveSource_ActiveSource_None() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mPowerManager.setInteractive(true);
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
mPlaybackLogicalAddress);
}
@Test
public void handleActiveSource_notActiveSource_None() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mPowerManager.setInteractive(true);
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
0x0000);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
ADDR_TV);
}
@Test
public void handleActiveSource_ActiveSource_StandbyNow() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mPowerManager.setInteractive(true);
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
}
@Test
public void handleActiveSource_notActiveSource_StandbyNow() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mPowerManager.setInteractive(true);
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
}
@Test
public void handleActiveSource_otherDevice_ActiveSource_mediaSessionsPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isTrue();
}
@Test
public void handleActiveSource_otherDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleActiveSource_sameDevice_ActiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleActiveSource_sameDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message = HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void losingActiveSource_standbyNow_verifyStandbyMessageIsSentOnNextStandby() {
// As described in b/161097846.
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
mPowerManager.setInteractive(true);
// 1. DUT is <AS>.
HdmiCecMessage message1 =
HdmiCecMessageBuilder.buildActiveSource(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message1))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mPowerManager.isInteractive()).isTrue();
// 2. DUT loses <AS> and goes to sleep.
HdmiCecMessage message2 = HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
assertThat(mHdmiCecLocalDevicePlayback.handleActiveSource(message2))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isFalse();
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
// 3. DUT becomes <AS> again.
HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath);
// The ActiveSourceAction created from the message above is deferred until the device wakes
// up.
mHdmiControlService.onWakeUp(HdmiControlService.WAKE_UP_SCREEN_ON);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
// 4. DUT turned off.
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
mTestLooper.dispatchAll();
HdmiCecMessage standbyMessageBroadcast =
HdmiCecMessageBuilder.buildStandby(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_BROADCAST);
assertThat(mNativeWrapper.getResultMessages()).contains(standbyMessageBroadcast);
}
@Test
public void sendVolumeKeyEvent_up_volumeEnabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, false);
mTestLooper.dispatchAll();
HdmiCecMessage keyPressed =
HdmiCecMessageBuilder.buildUserControlPressed(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage keyReleased =
HdmiCecMessageBuilder.buildUserControlReleased(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).contains(keyPressed);
assertThat(mNativeWrapper.getResultMessages()).contains(keyReleased);
}
@Test
public void sendVolumeKeyEvent_down_volumeEnabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_DOWN, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_DOWN, false);
mTestLooper.dispatchAll();
HdmiCecMessage keyPressed =
HdmiCecMessageBuilder.buildUserControlPressed(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_DOWN);
HdmiCecMessage keyReleased =
HdmiCecMessageBuilder.buildUserControlReleased(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).contains(keyPressed);
assertThat(mNativeWrapper.getResultMessages()).contains(keyReleased);
}
@Test
public void sendVolumeKeyEvent_mute_volumeEnabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_MUTE, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_MUTE, false);
mTestLooper.dispatchAll();
HdmiCecMessage keyPressed =
HdmiCecMessageBuilder.buildUserControlPressed(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_MUTE);
HdmiCecMessage keyReleased =
HdmiCecMessageBuilder.buildUserControlReleased(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).contains(keyPressed);
assertThat(mNativeWrapper.getResultMessages()).contains(keyReleased);
}
@Test
public void sendVolumeKeyEvent_up_volumeDisabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, false);
mTestLooper.dispatchAll();
HdmiCecMessage keyPressed =
HdmiCecMessageBuilder.buildUserControlPressed(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage keyReleased =
HdmiCecMessageBuilder.buildUserControlReleased(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyPressed);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyReleased);
}
@Test
public void sendVolumeKeyEvent_down_volumeDisabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_DOWN, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_DOWN, false);
mTestLooper.dispatchAll();
HdmiCecMessage keyPressed =
HdmiCecMessageBuilder.buildUserControlPressed(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage keyReleased =
HdmiCecMessageBuilder.buildUserControlReleased(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyPressed);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyReleased);
}
@Test
public void sendVolumeKeyEvent_mute_volumeDisabled() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_DISABLED);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_MUTE, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_MUTE, false);
mTestLooper.dispatchAll();
HdmiCecMessage keyPressed =
HdmiCecMessageBuilder.buildUserControlPressed(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage keyReleased =
HdmiCecMessageBuilder.buildUserControlReleased(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(), ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyPressed);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyReleased);
}
@Test
public void sendVolumeKeyEvent_toTv_activeSource() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiControlService.setSystemAudioActivated(false);
mHdmiControlService.setActiveSource(mPlaybackLogicalAddress, mPlaybackPhysicalAddress,
"HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, false);
HdmiCecMessage pressed = HdmiCecMessageBuilder.buildUserControlPressed(
mPlaybackLogicalAddress, ADDR_TV, HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage released = HdmiCecMessageBuilder.buildUserControlReleased(
mPlaybackLogicalAddress, ADDR_TV);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mNativeWrapper.getResultMessages()).containsAtLeast(pressed, released);
}
@Test
public void sendVolumeKeyEvent_toAudio_activeSource() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiControlService.setSystemAudioActivated(true);
mHdmiControlService.setActiveSource(mPlaybackLogicalAddress, mPlaybackPhysicalAddress,
"HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, false);
HdmiCecMessage pressed = HdmiCecMessageBuilder.buildUserControlPressed(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM, HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage released = HdmiCecMessageBuilder.buildUserControlReleased(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
assertThat(mNativeWrapper.getResultMessages()).containsAtLeast(pressed, released);
}
@Test
public void sendVolumeKeyEvent_toTv_inactiveSource() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiControlService.setSystemAudioActivated(false);
mHdmiControlService.setActiveSource(ADDR_TV, 0x0000, "HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, false);
HdmiCecMessage pressed = HdmiCecMessageBuilder.buildUserControlPressed(
mPlaybackLogicalAddress, ADDR_TV, HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage released = HdmiCecMessageBuilder.buildUserControlReleased(
mPlaybackLogicalAddress, ADDR_TV);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mNativeWrapper.getResultMessages()).containsAtLeast(pressed, released);
}
@Test
public void sendVolumeKeyEvent_toAudio_inactiveSource() {
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiControlService.setSystemAudioActivated(true);
mHdmiControlService.setActiveSource(ADDR_TV, 0x0000, "HdmiCecLocalDevicePlaybackTest");
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, false);
HdmiCecMessage pressed = HdmiCecMessageBuilder.buildUserControlPressed(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM, HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage released = HdmiCecMessageBuilder.buildUserControlReleased(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mNativeWrapper.getResultMessages()).containsAtLeast(pressed, released);
}
@Test
public void sendVolumeKeyEvent_toLocalDevice_discardMessage() {
HdmiCecLocalDeviceAudioSystem audioSystem =
new HdmiCecLocalDeviceAudioSystem(mHdmiControlService);
audioSystem.init();
mLocalDevices.add(audioSystem);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll();
mHdmiControlService.setHdmiCecVolumeControlEnabledInternal(
HdmiControlManager.VOLUME_CONTROL_ENABLED);
mHdmiControlService.setSystemAudioActivated(true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, true);
mHdmiCecLocalDevicePlayback.sendVolumeKeyEvent(KeyEvent.KEYCODE_VOLUME_UP, false);
HdmiCecMessage keyPressed = HdmiCecMessageBuilder.buildUserControlPressed(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM, HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage keyReleased = HdmiCecMessageBuilder.buildUserControlReleased(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM);
mTestLooper.dispatchAll();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyPressed);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(keyReleased);
}
@Test
public void handleSetStreamPath_broadcastsActiveSource() {
HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource =
HdmiCecMessageBuilder.buildActiveSource(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
}
@Test
public void handleSetStreamPath_afterHotplug_broadcastsActiveSource() {
mNativeWrapper.onHotplugEvent(1, false);
mNativeWrapper.onHotplugEvent(1, true);
mTestLooper.dispatchAll();
HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath);
mTestLooper.dispatchAll();
HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
}
@Test
public void handleSetStreamPath_afterHotplug_hasCorrectActiveSource() {
mNativeWrapper.onHotplugEvent(1, false);
mNativeWrapper.onHotplugEvent(1, true);
HdmiCecMessage setStreamPath = HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(setStreamPath);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress());
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isTrue();
}
@Test
public void handleSetStreamPath_Dreaming() throws RemoteException {
mPowerManager.setInteractive(true);
mWokenUp = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV,
mPlaybackPhysicalAddress);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mWokenUp).isTrue();
}
@Test
public void handleSetStreamPath_otherDevice_None() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_NONE);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().physicalAddress).isEqualTo(
0x5000);
assertThat(mHdmiCecLocalDevicePlayback.getActiveSource().logicalAddress).isEqualTo(
ADDR_INVALID);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleSetStreamPath_otherDevice_StandbyNow() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void handleSetStreamPath_otherDevice_StandbyNow_InactiveSource() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST,
HdmiControlManager.POWER_STATE_CHANGE_ON_ACTIVE_SOURCE_LOST_STANDBY_NOW);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mPowerManager.setInteractive(true);
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
assertThat(mHdmiCecLocalDevicePlayback.handleSetStreamPath(message))
.isEqualTo(Constants.HANDLED);
assertThat(mHdmiCecLocalDevicePlayback.isActiveSource()).isFalse();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void handleSetStreamPath_otherDevice_ActiveSource_mediaSessionsPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isTrue();
}
@Test
public void handleSetStreamPath_otherDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x5000);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleSetStreamPath_sameDevice_ActiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress, "HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void handleSetStreamPath_sameDevice_InactiveSource_mediaSessionsNotPaused() {
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
mActiveMediaSessionsPaused = false;
HdmiCecMessage message =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, mPlaybackPhysicalAddress);
mHdmiCecLocalDevicePlayback.dispatchMessage(message);
mTestLooper.dispatchAll();
assertThat(mActiveMediaSessionsPaused).isFalse();
}
@Test
public void oneTouchPlay_PowerControlModeToTv() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV);
mHdmiControlService.oneTouchPlay(new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
}
});
mTestLooper.dispatchAll();
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
HdmiCecMessage systemAudioModeRequest = HdmiCecMessageBuilder.buildSystemAudioModeRequest(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM, mPlaybackPhysicalAddress, true);
assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(systemAudioModeRequest);
}
@Test
public void oneTouchPlay_PowerControlModeToTvAndAudioSystem() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV_AND_AUDIO_SYSTEM);
mHdmiControlService.oneTouchPlay(new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
}
});
mTestLooper.dispatchAll();
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
HdmiCecMessage systemAudioModeRequest = HdmiCecMessageBuilder.buildSystemAudioModeRequest(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM, mPlaybackPhysicalAddress, true);
assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mNativeWrapper.getResultMessages()).contains(systemAudioModeRequest);
}
@Test
public void oneTouchPlay_PowerControlModeBroadcast() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
mHdmiControlService.oneTouchPlay(new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
}
});
mTestLooper.dispatchAll();
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
HdmiCecMessage systemAudioModeRequest = HdmiCecMessageBuilder.buildSystemAudioModeRequest(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM, mPlaybackPhysicalAddress, true);
assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mNativeWrapper.getResultMessages()).contains(systemAudioModeRequest);
}
@Test
public void oneTouchPlay_PowerControlModeNone() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_NONE);
mHdmiControlService.oneTouchPlay(new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
}
});
mTestLooper.dispatchAll();
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
HdmiCecMessage systemAudioModeRequest = HdmiCecMessageBuilder.buildSystemAudioModeRequest(
mPlaybackLogicalAddress, ADDR_AUDIO_SYSTEM, mPlaybackPhysicalAddress, true);
assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(systemAudioModeRequest);
}
@Test
public void onAddressAllocated_invokesDeviceDiscovery() {
mNativeWrapper.setPollAddressResponse(Constants.ADDR_PLAYBACK_2, SendMessageResult.SUCCESS);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll();
// Check for <Give Physical Address> being sent to available device (ADDR_PLAYBACK_2).
// This message is sent as part of the DeviceDiscoveryAction to available devices.
HdmiCecMessage givePhysicalAddress = HdmiCecMessageBuilder.buildGivePhysicalAddress(
Constants.ADDR_PLAYBACK_1,
Constants.ADDR_PLAYBACK_2);
assertThat(mNativeWrapper.getResultMessages()).contains(givePhysicalAddress);
}
@Test
public void wakeUp_hotPlugIn_invokesDeviceDiscoveryOnce() {
mNativeWrapper.setPollAddressResponse(Constants.ADDR_PLAYBACK_2, SendMessageResult.SUCCESS);
mHdmiControlService.onWakeUp(HdmiControlService.WAKE_UP_SCREEN_ON);
mTestLooper.dispatchAll();
mNativeWrapper.onHotplugEvent(1, true);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActions(DeviceDiscoveryAction.class)).hasSize(1);
}
@Test
public void hotplugDetectionAction_addDevice() {
int otherPlaybackLogicalAddress = mPlaybackLogicalAddress == Constants.ADDR_PLAYBACK_2
? Constants.ADDR_PLAYBACK_1 : Constants.ADDR_PLAYBACK_2;
mNativeWrapper.setPollAddressResponse(otherPlaybackLogicalAddress,
SendMessageResult.NACK);
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mTestLooper.dispatchAll();
mNativeWrapper.setPollAddressResponse(otherPlaybackLogicalAddress,
SendMessageResult.SUCCESS);
mTestLooper.moveTimeForward(HOTPLUG_INTERVAL);
mTestLooper.dispatchAll();
// Check for <Give Physical Address> being sent to the newly discovered device.
// This message is sent as part of the HotplugDetectionAction to available devices.
HdmiCecMessage givePhysicalAddress = HdmiCecMessageBuilder.buildGivePhysicalAddress(
mPlaybackLogicalAddress, otherPlaybackLogicalAddress);
assertThat(mNativeWrapper.getResultMessages()).contains(givePhysicalAddress);
}
@Test
public void hotplugDetectionAction_removeDevice() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
mHdmiControlService.getHdmiCecNetwork().clearDeviceList();
HdmiDeviceInfo infoPlayback = HdmiDeviceInfo.cecDeviceBuilder()
.setLogicalAddress(Constants.ADDR_PLAYBACK_2)
.setPhysicalAddress(0x1234)
.setPortId(PORT_1)
.setDeviceType(HdmiDeviceInfo.DEVICE_PLAYBACK)
.setVendorId(0x1234)
.setDisplayName("Playback 2")
.setDevicePowerStatus(HdmiControlManager.POWER_STATUS_ON)
.setCecVersion(HdmiControlManager.HDMI_CEC_VERSION_1_4_B)
.build();
mHdmiControlService.getHdmiCecNetwork().addCecDevice(infoPlayback);
// This logical address (ADDR_PLAYBACK_2) won't acknowledge the poll message sent by the
// HotplugDetectionAction so it shall be removed.
mNativeWrapper.setPollAddressResponse(Constants.ADDR_PLAYBACK_2, SendMessageResult.NACK);
mTestLooper.moveTimeForward(HOTPLUG_INTERVAL);
mTestLooper.dispatchAll();
assertThat(mHdmiControlService.getHdmiCecNetwork().getDeviceInfoList(false)).isEmpty();
}
@Test
public void getActiveSource_noActiveSource() {
mHdmiControlService.setActiveSource(Constants.ADDR_UNREGISTERED,
Constants.INVALID_PHYSICAL_ADDRESS, "HdmiControlServiceTest");
assertThat(mHdmiControlService.getActiveSource()).isNull();
}
@Test
public void getActiveSource_localPlaybackIsActiveSource() {
mHdmiControlService.setActiveSource(
mHdmiCecLocalDevicePlayback.getDeviceInfo().getLogicalAddress(),
mHdmiControlService.getPhysicalAddress(),
"HdmiControlServiceTest");
assertThat(mHdmiControlService.getActiveSource()).isEqualTo(
mHdmiCecLocalDevicePlayback.getDeviceInfo());
}
@Test
public void getActiveSource_deviceInNetworkIsActiveSource() {
HdmiDeviceInfo externalDevice = HdmiDeviceInfo.cecDeviceBuilder()
.setLogicalAddress(Constants.ADDR_PLAYBACK_3)
.setPhysicalAddress(0x3000)
.setPortId(0)
.setDeviceType(Constants.ADDR_PLAYBACK_1)
.setVendorId(0)
.setDisplayName("Test Device")
.build();
mHdmiControlService.getHdmiCecNetwork().addCecDevice(externalDevice);
mTestLooper.dispatchAll();
mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(),
externalDevice.getPhysicalAddress(), "HdmiControlServiceTest");
assertThat(mHdmiControlService.getActiveSource()).isEqualTo(externalDevice);
}
@Test
public void getActiveSource_unknownDeviceIsActiveSource() {
HdmiDeviceInfo externalDevice = HdmiDeviceInfo.cecDeviceBuilder()
.setLogicalAddress(Constants.ADDR_PLAYBACK_3)
.setPhysicalAddress(0x3000)
.setPortId(0)
.setDeviceType(Constants.ADDR_PLAYBACK_1)
.setVendorId(0)
.setDisplayName("Test Device")
.build();
mHdmiControlService.setActiveSource(externalDevice.getLogicalAddress(),
externalDevice.getPhysicalAddress(), "HdmiControlServiceTest");
assertThat(mHdmiControlService.getActiveSource().getPhysicalAddress()).isEqualTo(
externalDevice.getPhysicalAddress());
}
@Test
public void queryDisplayStatus() {
mTestLooper.moveTimeForward(TIMEOUT_MS);
mHdmiControlService.queryDisplayStatus(new IHdmiControlCallback.Stub() {
@Override
public void onComplete(int result) {
}
});
mTestLooper.dispatchAll();
HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildGiveDevicePowerStatus(
mPlaybackLogicalAddress, Constants.ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
}
@Test
public void toggleAndFollowTvPower_ToTv_TvStatusOn() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV);
mPowerManager.setInteractive(true);
mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildStandby(
mPlaybackLogicalAddress, ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void toggleAndFollowTvPower_Broadcast_TvStatusOn() {
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_BROADCAST);
mPowerManager.setInteractive(true);
mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
HdmiCecMessage expectedMessage = HdmiCecMessageBuilder.buildStandby(
mPlaybackLogicalAddress, ADDR_BROADCAST);
assertThat(mNativeWrapper.getResultMessages()).contains(expectedMessage);
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void toggleAndFollowTvPower_TvStatusStandby() {
mPowerManager.setInteractive(true);
mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_STANDBY);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
HdmiCecMessage textViewOn = HdmiCecMessageBuilder.buildTextViewOn(mPlaybackLogicalAddress,
ADDR_TV);
HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource(
mPlaybackLogicalAddress, mPlaybackPhysicalAddress);
assertThat(mNativeWrapper.getResultMessages()).contains(textViewOn);
assertThat(mNativeWrapper.getResultMessages()).contains(activeSource);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void toggleAndFollowTvPower_TvStatusUnknown() {
mPowerManager.setInteractive(true);
mHdmiControlService.toggleAndFollowTvPower();
HdmiCecMessage tvPowerStatus = HdmiCecMessageBuilder.buildReportPowerStatus(ADDR_TV,
mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_UNKNOWN);
assertThat(mHdmiCecLocalDevicePlayback.dispatchMessage(tvPowerStatus))
.isEqualTo(Constants.HANDLED);
mTestLooper.dispatchAll();
HdmiCecMessage userControlPressed = HdmiCecMessageBuilder.buildUserControlPressed(
mPlaybackLogicalAddress, Constants.ADDR_TV,
HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION);
HdmiCecMessage userControlReleased = HdmiCecMessageBuilder.buildUserControlReleased(
mPlaybackLogicalAddress, Constants.ADDR_TV);
assertThat(mNativeWrapper.getResultMessages()).contains(userControlPressed);
assertThat(mNativeWrapper.getResultMessages()).contains(userControlReleased);
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void toggleAndFollowTvPower_isInteractive() throws RemoteException {
mPowerManager.setInteractive(true);
mActiveMediaSessionsPaused = false;
mWokenUp = false;
mHdmiControlService.toggleAndFollowTvPower();
assertThat(mActiveMediaSessionsPaused).isTrue();
assertThat(mPowerManager.isInteractive()).isTrue();
assertThat(mWokenUp).isFalse();
}
@Test
public void toggleAndFollowTvPower_isNotInteractive() throws RemoteException {
mPowerManager.setInteractive(false);
mActiveMediaSessionsPaused = false;
mHdmiControlService.toggleAndFollowTvPower();
assertThat(mActiveMediaSessionsPaused).isFalse();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void shouldHandleTvPowerKey_CecDisabled() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
mNativeWrapper.onCecMessage(reportPowerStatusMessage);
mTestLooper.dispatchAll();
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
HdmiControlManager.HDMI_CEC_CONTROL_DISABLED);
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
}
@Test
public void shouldHandleTvPowerKey_PowerControlModeNone() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
mNativeWrapper.onCecMessage(reportPowerStatusMessage);
mTestLooper.dispatchAll();
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_NONE);
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
}
@Test
public void shouldHandleTvPowerKey_CecNotAvailable() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
// TV doesn't report its power status
mTestLooper.moveTimeForward(TIMEOUT_MS);
mTestLooper.dispatchAll();
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isFalse();
}
@Test
public void shouldHandleTvPowerKey_CecEnabled_PowerControlModeTv() {
mHdmiControlService.allocateLogicalAddress(mLocalDevices, INITIATED_BY_ENABLE_CEC);
HdmiCecMessage reportPowerStatusMessage = HdmiCecMessageBuilder.buildReportPowerStatus(
Constants.ADDR_TV, mPlaybackLogicalAddress, HdmiControlManager.POWER_STATUS_ON);
mNativeWrapper.onCecMessage(reportPowerStatusMessage);
mTestLooper.dispatchAll();
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setIntValue(
HdmiControlManager.CEC_SETTING_NAME_HDMI_CEC_ENABLED,
HdmiControlManager.HDMI_CEC_CONTROL_ENABLED);
mHdmiCecLocalDevicePlayback.mService.getHdmiCecConfig().setStringValue(
HdmiControlManager.CEC_SETTING_NAME_POWER_CONTROL_MODE,
HdmiControlManager.POWER_CONTROL_MODE_TV);
assertThat(mHdmiControlService.shouldHandleTvPowerKey()).isTrue();
}
@Test
public void getRcFeatures() {
ArrayList<Integer> features = new ArrayList<>(mHdmiCecLocalDevicePlayback.getRcFeatures());
assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_ROOT_MENU)).isTrue();
assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_SETUP_MENU)).isTrue();
assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_CONTENTS_MENU)).isFalse();
assertThat(features.contains(Constants.RC_PROFILE_SOURCE_HANDLES_TOP_MENU)).isFalse();
assertThat(features.contains(
Constants.RC_PROFILE_SOURCE_HANDLES_MEDIA_CONTEXT_SENSITIVE_MENU)).isFalse();
}
@Test
public void doesNotSupportRecordTvScreen() {
HdmiCecMessage recordTvScreen = HdmiCecMessage.build(ADDR_TV, mPlaybackLogicalAddress,
Constants.MESSAGE_RECORD_TV_SCREEN, HdmiCecMessage.EMPTY_PARAM);
mNativeWrapper.onCecMessage(recordTvScreen);
mTestLooper.dispatchAll();
HdmiCecMessage featureAbort = HdmiCecMessageBuilder.buildFeatureAbortCommand(
mPlaybackLogicalAddress, ADDR_TV, Constants.MESSAGE_RECORD_TV_SCREEN,
ABORT_UNRECOGNIZED_OPCODE);
assertThat(mNativeWrapper.getResultMessages()).contains(featureAbort);
}
@Test
public void shouldHandleUserControlPressedAndReleased() {
HdmiCecMessage userControlPressed = HdmiCecMessageBuilder.buildUserControlPressed(
ADDR_TV, mPlaybackLogicalAddress,
HdmiCecKeycode.CEC_KEYCODE_VOLUME_UP);
HdmiCecMessage userControlReleased = HdmiCecMessageBuilder.buildUserControlReleased(
ADDR_TV, mPlaybackLogicalAddress);
mNativeWrapper.onCecMessage(userControlPressed);
mTestLooper.dispatchAll();
// Move past the follower safety timeout
mTestLooper.moveTimeForward(TimeUnit.SECONDS.toMillis(2));
mTestLooper.dispatchAll();
mNativeWrapper.onCecMessage(userControlReleased);
mTestLooper.dispatchAll();
HdmiCecMessage featureAbortPressed = HdmiCecMessageBuilder.buildFeatureAbortCommand(
mPlaybackLogicalAddress, ADDR_TV, Constants.MESSAGE_USER_CONTROL_PRESSED,
ABORT_UNRECOGNIZED_OPCODE);
HdmiCecMessage featureAbortReleased = HdmiCecMessageBuilder.buildFeatureAbortCommand(
mPlaybackLogicalAddress, ADDR_TV, Constants.MESSAGE_USER_CONTROL_RELEASED,
ABORT_UNRECOGNIZED_OPCODE);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(featureAbortPressed);
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(featureAbortReleased);
}
@Test
public void onHotplugInAfterHotplugOut_noStandbyAfterDelay() {
mPowerManager.setInteractive(true);
mNativeWrapper.onHotplugEvent(1, false);
mTestLooper.dispatchAll();
mTestLooper.moveTimeForward(
HdmiCecLocalDevicePlayback.STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS / 2);
mNativeWrapper.onHotplugEvent(1, true);
mTestLooper.dispatchAll();
mPowerManagerInternal.setIdleDuration(
HdmiCecLocalDevicePlayback.STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS);
mTestLooper.moveTimeForward(HdmiCecLocalDevicePlayback.STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
}
@Test
public void onHotplugOut_standbyAfterDelay_onlyAfterDeviceIdle() {
mPowerManager.setInteractive(true);
mNativeWrapper.onHotplugEvent(1, false);
mTestLooper.dispatchAll();
mPowerManagerInternal.setIdleDuration(0);
mTestLooper.moveTimeForward(HdmiCecLocalDevicePlayback.STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isTrue();
mPowerManagerInternal.setIdleDuration(
HdmiCecLocalDevicePlayback.STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS);
mTestLooper.moveTimeForward(HdmiCecLocalDevicePlayback.STANDBY_AFTER_HOTPLUG_OUT_DELAY_MS);
mTestLooper.dispatchAll();
assertThat(mPowerManager.isInteractive()).isFalse();
}
@Test
public void onHotplugClearsDevices() {
mHdmiControlService.getHdmiCecNetwork().clearDeviceList();
assertThat(mHdmiControlService.getHdmiCecNetwork().getDeviceInfoList(false))
.isEmpty();
// Add a device to the network and assert that this device is included in the list of
// devices.
HdmiDeviceInfo infoPlayback = HdmiDeviceInfo.cecDeviceBuilder()
.setLogicalAddress(Constants.ADDR_PLAYBACK_3)
.setPhysicalAddress(0x1000)
.setPortId(PORT_1)
.setDeviceType(HdmiDeviceInfo.DEVICE_PLAYBACK)
.setVendorId(0x1000)
.setDisplayName("Playback 3")
.build();
mHdmiControlService.getHdmiCecNetwork().addCecDevice(infoPlayback);
mTestLooper.dispatchAll();
assertThat(mHdmiControlService.getHdmiCecNetwork().getDeviceInfoList(false))
.hasSize(1);
// HAL detects a hotplug out. Assert that this device gets removed from the list of devices.
mHdmiControlService.onHotplug(PORT_1, false);
mTestLooper.dispatchAll();
assertThat(mHdmiControlService.getHdmiCecNetwork().getDeviceInfoList(false))
.isEmpty();
}
@Test
public void handleRoutingChange_addressNotAllocated_removeActiveSourceAction() {
long allocationDelay = TimeUnit.SECONDS.toMillis(60);
mHdmiCecLocalDevicePlayback.mPlaybackDeviceActionOnRoutingControl =
HdmiProperties
.playback_device_action_on_routing_control_values
.WAKE_UP_AND_SEND_ACTIVE_SOURCE;
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
HdmiCecMessage routingChangeToPlayback =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, 0x0000,
mPlaybackPhysicalAddress);
HdmiCecMessage routingChangeToTv =
HdmiCecMessageBuilder.buildRoutingChange(ADDR_TV, mPlaybackPhysicalAddress,
0x0000);
HdmiCecMessage unexpectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
// 1. DUT goes to sleep.
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
// Delay allocate logical address in order to trigger message buffering.
mHdmiCecController.setLogicalAddressAllocationDelay(allocationDelay);
mNativeWrapper.onCecMessage(routingChangeToPlayback);
mTestLooper.dispatchAll();
// 2. DUT wakes up and defer ActiveSourceAction.
mHdmiControlService.onWakeUp(HdmiControlService.WAKE_UP_SCREEN_ON);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isNotEmpty();
// 3. DUT buffers <Routing Change> message to TV.
mNativeWrapper.onCecMessage(routingChangeToTv);
mTestLooper.dispatchAll();
// 4. Allocation is finished and the ActiveSourceAction is removed from the queue.
// No <Active Source> message is sent by the DUT.
mTestLooper.moveTimeForward(allocationDelay);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isEmpty();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpectedMessage);
}
@Test
public void handleSetStreamPath_addressNotAllocated_removeActiveSourceAction() {
long allocationDelay = TimeUnit.SECONDS.toMillis(60);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
HdmiCecMessage setStreamPathToPlayback =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, mPlaybackPhysicalAddress);
HdmiCecMessage setStreamPathToTv =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, 0x0000);
HdmiCecMessage unexpectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
// 1. DUT goes to sleep.
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
// Delay allocate logical address in order to trigger message buffering.
mHdmiCecController.setLogicalAddressAllocationDelay(allocationDelay);
mNativeWrapper.onCecMessage(setStreamPathToPlayback);
mTestLooper.dispatchAll();
// 2. DUT wakes up and defer ActiveSourceAction.
mHdmiControlService.onWakeUp(HdmiControlService.WAKE_UP_SCREEN_ON);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isNotEmpty();
// 3. DUT buffers <Set Stream Path> message to TV.
mNativeWrapper.onCecMessage(setStreamPathToTv);
mTestLooper.dispatchAll();
// 4. Allocation is finished and the ActiveSourceAction is removed from the queue.
// No <Active Source> message is sent by the DUT.
mTestLooper.moveTimeForward(allocationDelay);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isEmpty();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpectedMessage);
}
@Test
public void handleActiveSource_addressNotAllocated_removeActiveSourceAction() {
long allocationDelay = TimeUnit.SECONDS.toMillis(60);
mHdmiCecLocalDevicePlayback.setActiveSource(ADDR_TV, 0x0000,
"HdmiCecLocalDevicePlaybackTest");
HdmiCecMessage setStreamPathToPlayback =
HdmiCecMessageBuilder.buildSetStreamPath(ADDR_TV, mPlaybackPhysicalAddress);
HdmiCecMessage activeSourceFromTv =
HdmiCecMessageBuilder.buildActiveSource(ADDR_TV, 0x0000);
HdmiCecMessage unexpectedMessage =
HdmiCecMessageBuilder.buildActiveSource(mPlaybackLogicalAddress,
mPlaybackPhysicalAddress);
// 1. DUT goes to sleep.
mHdmiControlService.onStandby(HdmiControlService.STANDBY_SCREEN_OFF);
// Delay allocate logical address in order to trigger message buffering.
mHdmiCecController.setLogicalAddressAllocationDelay(allocationDelay);
mNativeWrapper.onCecMessage(setStreamPathToPlayback);
mTestLooper.dispatchAll();
// 2. DUT wakes up and defer ActiveSourceAction.
mHdmiControlService.onWakeUp(HdmiControlService.WAKE_UP_SCREEN_ON);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isNotEmpty();
// 3. DUT buffers <Active Source> message from TV.
mNativeWrapper.onCecMessage(activeSourceFromTv);
mTestLooper.dispatchAll();
// 4. Allocation is finished and the ActiveSourceAction is removed from the queue.
// No <Active Source> message is sent by the DUT.
mTestLooper.moveTimeForward(allocationDelay);
mTestLooper.dispatchAll();
assertThat(mHdmiCecLocalDevicePlayback.getActions(ActiveSourceAction.class)).isEmpty();
assertThat(mNativeWrapper.getResultMessages()).doesNotContain(unexpectedMessage);
}
}