/* * Copyright (C) 2014 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 android.hardware.hdmi.HdmiDeviceInfo; import android.util.Slog; import android.util.SparseArray; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * Various utilities to handle HDMI CEC messages. */ final class HdmiUtils { private static final int[] ADDRESS_TO_TYPE = { HdmiDeviceInfo.DEVICE_TV, // ADDR_TV HdmiDeviceInfo.DEVICE_RECORDER, // ADDR_RECORDER_1 HdmiDeviceInfo.DEVICE_RECORDER, // ADDR_RECORDER_2 HdmiDeviceInfo.DEVICE_TUNER, // ADDR_TUNER_1 HdmiDeviceInfo.DEVICE_PLAYBACK, // ADDR_PLAYBACK_1 HdmiDeviceInfo.DEVICE_AUDIO_SYSTEM, // ADDR_AUDIO_SYSTEM HdmiDeviceInfo.DEVICE_TUNER, // ADDR_TUNER_2 HdmiDeviceInfo.DEVICE_TUNER, // ADDR_TUNER_3 HdmiDeviceInfo.DEVICE_PLAYBACK, // ADDR_PLAYBACK_2 HdmiDeviceInfo.DEVICE_RECORDER, // ADDR_RECORDER_3 HdmiDeviceInfo.DEVICE_TUNER, // ADDR_TUNER_4 HdmiDeviceInfo.DEVICE_PLAYBACK, // ADDR_PLAYBACK_3 HdmiDeviceInfo.DEVICE_RESERVED, HdmiDeviceInfo.DEVICE_RESERVED, HdmiDeviceInfo.DEVICE_TV, // ADDR_SPECIFIC_USE }; private static final String[] DEFAULT_NAMES = { "TV", "Recorder_1", "Recorder_2", "Tuner_1", "Playback_1", "AudioSystem", "Tuner_2", "Tuner_3", "Playback_2", "Recorder_3", "Tuner_4", "Playback_3", "Reserved_1", "Reserved_2", "Secondary_TV", }; private HdmiUtils() { /* cannot be instantiated */ } /** * Check if the given logical address is valid. A logical address is valid * if it is one allocated for an actual device which allows communication * with other logical devices. * * @param address logical address * @return true if the given address is valid */ static boolean isValidAddress(int address) { return (Constants.ADDR_TV <= address && address <= Constants.ADDR_SPECIFIC_USE); } /** * Return the device type for the given logical address. * * @param address logical address * @return device type for the given logical address; DEVICE_INACTIVE * if the address is not valid. */ static int getTypeFromAddress(int address) { if (isValidAddress(address)) { return ADDRESS_TO_TYPE[address]; } return HdmiDeviceInfo.DEVICE_INACTIVE; } /** * Return the default device name for a logical address. This is the name * by which the logical device is known to others until a name is * set explicitly using HdmiCecService.setOsdName. * * @param address logical address * @return default device name; empty string if the address is not valid */ static String getDefaultDeviceName(int address) { if (isValidAddress(address)) { return DEFAULT_NAMES[address]; } return ""; } /** * Verify if the given address is for the given device type. If not it will throw * {@link IllegalArgumentException}. * * @param logicalAddress the logical address to verify * @param deviceType the device type to check * @throw IllegalArgumentException */ static void verifyAddressType(int logicalAddress, int deviceType) { int actualDeviceType = getTypeFromAddress(logicalAddress); if (actualDeviceType != deviceType) { throw new IllegalArgumentException("Device type missmatch:[Expected:" + deviceType + ", Actual:" + actualDeviceType); } } /** * Check if the given CEC message come from the given address. * * @param cmd the CEC message to check * @param expectedAddress the expected source address of the given message * @param tag the tag of caller module (for log message) * @return true if the CEC message comes from the given address */ static boolean checkCommandSource(HdmiCecMessage cmd, int expectedAddress, String tag) { int src = cmd.getSource(); if (src != expectedAddress) { Slog.w(tag, "Invalid source [Expected:" + expectedAddress + ", Actual:" + src + "]"); return false; } return true; } /** * Parse the parameter block of CEC message as [System Audio Status]. * * @param cmd the CEC message to parse * @return true if the given parameter has [ON] value */ static boolean parseCommandParamSystemAudioStatus(HdmiCecMessage cmd) { return cmd.getParams()[0] == Constants.SYSTEM_AUDIO_STATUS_ON; } /** * Convert integer array to list of {@link Integer}. * *
The result is immutable.
*
* @param is integer array
* @return {@link List} instance containing the elements in the given array
*/
static List