blob: c12bae148a3bff9e429a6a421aa4038cc6db00c8 [file] [log] [blame]
/*
* Copyright (C) 2019 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 android.hdmicec.cts;
import com.android.tradefed.device.ITestDevice;
import java.util.HashMap;
/** Helper class with methods to test the remote control passthrough functionality */
public final class RemoteControlPassthrough {
/** The package name of the APK. */
private static final String PACKAGE = "android.hdmicec.app";
/** The class name of the main activity in the APK. */
private static final String CLASS = "HdmiCecKeyEventCapture";
/** The command to launch the main activity. */
private static final String START_COMMAND =
String.format(
"am start -W -a android.intent.action.MAIN -n %s/%s.%s",
PACKAGE, PACKAGE, CLASS);
/** The command to clear the main activity. */
private static final String CLEAR_COMMAND = String.format("pm clear %s", PACKAGE);
private static final HashMap<Integer, String> mUserControlPressKeys_20 =
createUserControlPressKeys_20();
/**
* Tests that the device responds correctly to a {@code <USER_CONTROL_PRESSED>} message followed
* immediately by a {@code <USER_CONTROL_RELEASED>} message.
*/
public static void checkUserControlPressAndRelease(
HdmiCecClientWrapper hdmiCecClient,
ITestDevice device,
LogicalAddress sourceDevice,
LogicalAddress dutLogicalAddress)
throws Exception {
// Clear activity
device.executeShellCommand(CLEAR_COMMAND);
// Clear logcat.
device.executeAdbCommand("logcat", "-c");
// Start the APK and wait for it to complete.
device.executeShellCommand(START_COMMAND);
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_UP, false);
LogHelper.assertLog(device, CLASS, "Short press KEYCODE_DPAD_UP");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_DOWN, false);
LogHelper.assertLog(device, CLASS, "Short press KEYCODE_DPAD_DOWN");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_LEFT, false);
LogHelper.assertLog(device, CLASS, "Short press KEYCODE_DPAD_LEFT");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_RIGHT, false);
LogHelper.assertLog(device, CLASS, "Short press KEYCODE_DPAD_RIGHT");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_SELECT, false);
LogHelper.assertLog(
device, CLASS, "Short press KEYCODE_DPAD_CENTER", "Short press KEYCODE_ENTER");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_BACK, false);
LogHelper.assertLog(device, CLASS, "Short press KEYCODE_BACK");
}
/**
* Tests that the device responds correctly to a {@code <USER_CONTROL_PRESSED>} message for
* press and hold operations.
*/
public static void checkUserControlPressAndHold(
HdmiCecClientWrapper hdmiCecClient,
ITestDevice device,
LogicalAddress sourceDevice,
LogicalAddress dutLogicalAddress)
throws Exception {
// Clear activity
device.executeShellCommand(CLEAR_COMMAND);
// Clear logcat.
device.executeAdbCommand("logcat", "-c");
// Start the APK and wait for it to complete.
device.executeShellCommand(START_COMMAND);
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_UP, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_UP");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_DOWN, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_DOWN");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_LEFT, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_LEFT");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_RIGHT, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_RIGHT");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_SELECT, true);
LogHelper.assertLog(
device, CLASS, "Long press KEYCODE_DPAD_CENTER", "Long press KEYCODE_ENTER");
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_BACK, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_BACK");
}
/**
* Tests that the device responds correctly to a {@code <User Control Pressed>} message for
* press and hold operations when no {@code <User Control Released>} is sent.
*/
public static void checkUserControlPressAndHoldWithNoRelease(
HdmiCecClientWrapper hdmiCecClient,
ITestDevice device,
LogicalAddress sourceDevice,
LogicalAddress dutLogicalAddress)
throws Exception {
// Clear activity
device.executeShellCommand(CLEAR_COMMAND);
// Clear logcat.
device.executeAdbCommand("logcat", "-c");
// Start the APK and wait for it to complete.
device.executeShellCommand(START_COMMAND);
hdmiCecClient.sendUserControlPress(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_UP, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_UP");
hdmiCecClient.sendUserControlPress(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_DOWN, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_DOWN");
hdmiCecClient.sendUserControlPress(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_LEFT, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_LEFT");
hdmiCecClient.sendUserControlPress(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_RIGHT, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_RIGHT");
hdmiCecClient.sendUserControlPress(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_SELECT, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_CENTER");
hdmiCecClient.sendUserControlPress(
sourceDevice, dutLogicalAddress, HdmiCecConstants.CEC_KEYCODE_BACK, true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_BACK");
}
/**
* Tests that the device responds correctly to a {@code <User Control Pressed> [firstKeycode]}
* press and hold operation when interrupted by a {@code <User Control Pressed> [secondKeycode]}
* before a {@code <User Control Released> [firstKeycode]} is sent.
*/
public static void checkUserControlInterruptedPressAndHoldWithNoRelease(
HdmiCecClientWrapper hdmiCecClient,
ITestDevice device,
LogicalAddress sourceDevice,
LogicalAddress dutLogicalAddress)
throws Exception {
// Clear activity
device.executeShellCommand(CLEAR_COMMAND);
// Clear logcat.
device.executeAdbCommand("logcat", "-c");
// Start the APK and wait for it to complete.
device.executeShellCommand(START_COMMAND);
hdmiCecClient.sendUserControlInterruptedPressAndHold(
sourceDevice,
dutLogicalAddress,
HdmiCecConstants.CEC_KEYCODE_UP,
HdmiCecConstants.CEC_KEYCODE_BACK,
true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_UP");
hdmiCecClient.sendUserControlInterruptedPressAndHold(
sourceDevice,
dutLogicalAddress,
HdmiCecConstants.CEC_KEYCODE_DOWN,
HdmiCecConstants.CEC_KEYCODE_UP,
true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_DOWN");
hdmiCecClient.sendUserControlInterruptedPressAndHold(
sourceDevice,
dutLogicalAddress,
HdmiCecConstants.CEC_KEYCODE_LEFT,
HdmiCecConstants.CEC_KEYCODE_DOWN,
true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_LEFT");
hdmiCecClient.sendUserControlInterruptedPressAndHold(
sourceDevice,
dutLogicalAddress,
HdmiCecConstants.CEC_KEYCODE_RIGHT,
HdmiCecConstants.CEC_KEYCODE_LEFT,
true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_RIGHT");
hdmiCecClient.sendUserControlInterruptedPressAndHold(
sourceDevice,
dutLogicalAddress,
HdmiCecConstants.CEC_KEYCODE_SELECT,
HdmiCecConstants.CEC_KEYCODE_RIGHT,
true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_DPAD_CENTER");
hdmiCecClient.sendUserControlInterruptedPressAndHold(
sourceDevice,
dutLogicalAddress,
HdmiCecConstants.CEC_KEYCODE_BACK,
HdmiCecConstants.CEC_KEYCODE_SELECT,
true);
LogHelper.assertLog(device, CLASS, "Long press KEYCODE_BACK");
}
/**
* Tests that the device responds correctly to a {@code <User Control Pressed> [keyCode]} press
* and release operation when it has an additional parameter following the keyCode.
*/
public static void checkUserControlPressAndReleaseWithAdditionalParams(
HdmiCecClientWrapper hdmiCecClient,
ITestDevice device,
LogicalAddress sourceDevice,
LogicalAddress dutLogicalAddress)
throws Exception {
// Clear activity
device.executeShellCommand(CLEAR_COMMAND);
// Clear logcat.
device.executeAdbCommand("logcat", "-c");
// Start the APK and wait for it to complete.
device.executeShellCommand(START_COMMAND);
hdmiCecClient.sendUserControlPressAndReleaseWithAdditionalParams(
sourceDevice,
dutLogicalAddress,
HdmiCecConstants.CEC_KEYCODE_UP,
HdmiCecConstants.CEC_KEYCODE_DOWN);
LogHelper.assertLog(device, CLASS, "Short press KEYCODE_DPAD_UP");
}
/**
* Tests that the device that support cec version 2.0 responds correctly to a
* {@code <USER_CONTROL_PRESSED>} message followed immediately by a
* {@code <USER_CONTROL_RELEASED>} message.
*/
public static void checkUserControlPressAndRelease_20(
HdmiCecClientWrapper hdmiCecClient,
ITestDevice device,
LogicalAddress sourceDevice,
LogicalAddress dutLogicalAddress)
throws Exception {
// Clear activity
device.executeShellCommand(CLEAR_COMMAND);
// Clear logcat.
device.executeAdbCommand("logcat", "-c");
// Start the APK and wait for it to complete.
device.executeShellCommand(START_COMMAND);
for (Integer userControlPressKey : mUserControlPressKeys_20.keySet()) {
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, userControlPressKey, false);
LogHelper.assertLog(
device,
CLASS,
"Short press KEYCODE_" + mUserControlPressKeys_20.get(userControlPressKey));
}
}
private static HashMap<Integer, String> createUserControlPressKeys_20() {
HashMap<Integer, String> userControlPressKeys = new HashMap<Integer, String>();
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_UP,"DPAD_UP");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_DOWN,"DPAD_DOWN");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_LEFT,"DPAD_LEFT");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_RIGHT,"DPAD_RIGHT");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_ROOT_MENU,"MENU");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_SETUP_MENU,"SETTINGS");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_CONTENTS_MENU,"TV_CONTENTS_MENU");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_BACK,"BACK");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_MEDIA_TOP_MENU,"MEDIA_TOP_MENU");
userControlPressKeys.put(
HdmiCecConstants.CEC_KEYCODE_MEDIA_CONTEXT_SENSITIVE_MENU,"TV_MEDIA_CONTEXT_MENU");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBER_0_OR_NUMBER_10,"0");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_1,"1");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_2,"2");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_3,"3");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_4,"4");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_5,"5");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_6,"6");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_7,"7");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_8,"8");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_NUMBERS_9,"9");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_CHANNEL_UP,"CHANNEL_UP");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_CHANNEL_DOWN,"CHANNEL_DOWN");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_PREVIOUS_CHANNEL,"LAST_CHANNEL");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_DISPLAY_INFORMATION,"INFO");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_PLAY,"MEDIA_PLAY");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_STOP,"MEDIA_STOP");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_PAUSE,"MEDIA_PAUSE");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_RECORD,"MEDIA_RECORD");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_REWIND,"MEDIA_REWIND");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_FAST_FORWARD,"MEDIA_FAST_FORWARD");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_EJECT,"MEDIA_EJECT");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_FORWARD,"MEDIA_NEXT");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_BACKWARD,"MEDIA_PREVIOUS");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_F1_BLUE,"PROG_BLUE");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_F2_RED,"PROG_RED");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_F3_GREEN,"PROG_GREEN");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_F4_YELLOW,"PROG_YELLOW");
userControlPressKeys.put(HdmiCecConstants.CEC_KEYCODE_DATA,"TV_DATA_SERVICE");
return userControlPressKeys;
}
public static void checkUserControlPressAndRelease(
HdmiCecClientWrapper hdmiCecClient,
ITestDevice device,
LogicalAddress sourceDevice,
LogicalAddress dutLogicalAddress,
int cecKeycode,
String androidKeycode)
throws Exception {
// Clear activity
device.executeShellCommand(CLEAR_COMMAND);
// Clear logcat.
device.executeAdbCommand("logcat", "-c");
// Start the APK and wait for it to complete.
device.executeShellCommand(START_COMMAND);
hdmiCecClient.sendUserControlPressAndRelease(
sourceDevice, dutLogicalAddress, cecKeycode, false);
LogHelper.assertLog(device, CLASS, "Short press KEYCODE_" + androidKeycode);
}
}