HdmiCecKeycode.java revision 73483b6bc9046cbb7a54748c31ee724358a631ef
1cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn/* 2cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Copyright (C) 2014 The Android Open Source Project 3cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 4cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * you may not use this file except in compliance with the License. 6cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * You may obtain a copy of the License at 7cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 8cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 10cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * See the License for the specific language governing permissions and 14cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * limitations under the License. 15cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 16cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 17cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornpackage com.android.server.hdmi; 18cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 199f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountimport android.view.KeyEvent; 204500be62dea3895a98336122a2944cc4ab024bc5George Mount 21cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackbornimport libcore.util.EmptyArray; 22cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 233a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackbornimport java.util.Arrays; 244500be62dea3895a98336122a2944cc4ab024bc5George Mount 259f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount/** 26cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Helper class to translate android keycode to hdmi cec keycode and vice versa. 27cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 289f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mountfinal class HdmiCecKeycode { 294500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int UNSUPPORTED_KEYCODE = -1; 304500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int NO_PARAM = -1; 310f5ae57910484f1d873fdad90966b6244a633bd4George Mount 32cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // ========================================================================= 33cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Hdmi CEC keycodes 34cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SELECT = 0x00; 35cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_UP = 0x01; 369f4a046cbeb22a24d322a644323b41022ad9d15aGeorge Mount public static final int CEC_KEYCODE_DOWN = 0x02; 37cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_LEFT = 0x03; 38cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_RIGHT = 0x04; 39cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_RIGHT_UP = 0x05; 40cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_RIGHT_DOWN = 0x06; 41cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_LEFT_UP = 0x07; 42cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_LEFT_DOWN = 0x08; 43cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_ROOT_MENU = 0x09; 44cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SETUP_MENU = 0x0A; 45cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_CONTENTS_MENU = 0x0B; 46cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_FAVORITE_MENU = 0x0C; 47cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_EXIT = 0x0D; 484500be62dea3895a98336122a2944cc4ab024bc5George Mount // RESERVED = 0x0E - 0x0F 494500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int CEC_KEYCODE_MEDIA_TOP_MENU = 0x10; 50cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_MEDIA_CONTEXT_SENSITIVE_MENU = 0x11; 51cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // RESERVED = 0x12 – 0x1C 52cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBER_ENTRY_MODE = 0x1D; 53cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBER_11 = 0x1E; 54cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBER_12 = 0x1F; 55cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBER_0_OR_NUMBER_10 = 0x20; 56cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_1 = 0x21; 57cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_2 = 0x22; 58df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_3 = 0x23; 59cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_4 = 0x24; 60cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_5 = 0x25; 61cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_6 = 0x26; 62cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_7 = 0x27; 63cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_8 = 0x28; 64cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NUMBERS_9 = 0x29; 65cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_DOT = 0x2A; 66cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_ENTER = 0x2B; 67cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_CLEAR = 0x2C; 685506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn // RESERVED = 0x2D - 0x2E 69cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_NEXT_FAVORITE = 0x2F; 70cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_CHANNEL_UP = 0x30; 71df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn public static final int CEC_KEYCODE_CHANNEL_DOWN = 0x31; 72df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn public static final int CEC_KEYCODE_PREVIOUS_CHANNEL = 0x32; 73cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SOUND_SELECT = 0x33; 74cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_INPUT_SELECT = 0x34; 75cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_DISPLAY_INFORMATION = 0x35; 76cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_HELP = 0x36; 77cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_PAGE_UP = 0x37; 78cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_PAGE_DOWN = 0x38; 79cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // RESERVED = 0x39 - 0x3F 80cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_POWER = 0x40; 81cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_VOLUME_UP = 0x41; 82cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_VOLUME_DOWN = 0x42; 83cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_MUTE = 0x43; 84cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_PLAY = 0x44; 85cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_STOP = 0x45; 86cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_PAUSE = 0x46; 87cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_RECORD = 0x47; 88cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_REWIND = 0x48; 89cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_FAST_FORWARD = 0x49; 90cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_EJECT = 0x4A; 91cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_FORWARD = 0x4B; 924500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int CEC_KEYCODE_BACKWARD = 0x4C; 934500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int CEC_KEYCODE_STOP_RECORD = 0x4D; 94cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_PAUSE_RECORD = 0x4E; 95cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_RESERVED = 0x4F; 96cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_ANGLE = 0x50; 97cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SUB_PICTURE = 0x51; 98cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_VIDEO_ON_DEMAND = 0x52; 99cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_ELECTRONIC_PROGRAM_GUIDE = 0x53; 100cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_TIMER_PROGRAMMING = 0x54; 101cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_INITIAL_CONFIGURATION = 0x55; 102cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SELECT_BROADCAST_TYPE = 0x56; 103cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SELECT_SOUND_PRESENTATION = 0x57; 104cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // RESERVED = 0x58-0x5F 105cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_PLAY_FUNCTION = 0x60; 1064500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int CEC_KEYCODE_PAUSE_PLAY_FUNCTION = 0x61; 1074500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int CEC_KEYCODE_RECORD_FUNCTION = 0x62; 108cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_PAUSE_RECORD_FUNCTION = 0x63; 109cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_STOP_FUNCTION = 0x64; 110cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_MUTE_FUNCTION = 0x65; 111cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_RESTORE_VOLUME_FUNCTION = 0x66; 112cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_TUNE_FUNCTION = 0x67; 1133a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn public static final int CEC_KEYCODE_SELECT_MEDIA_FUNCTION = 0x68; 114cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SELECT_AV_INPUT_FUNCTION = 0x69; 115cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_SELECT_AUDIO_INPUT_FUNCTION = 0x6A; 116cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_POWER_TOGGLE_FUNCTION = 0x6B; 117cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int CEC_KEYCODE_POWER_OFF_FUNCTION = 0x6C; 1183a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn public static final int CEC_KEYCODE_POWER_ON_FUNCTION = 0x6D; 1195506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn // RESERVED = 0x6E-0x70 1205506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn public static final int CEC_KEYCODE_F1_BLUE = 0x71; 1215506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn public static final int CEC_KEYCODE_F2_RED = 0x72; 1225506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn public static final int CEC_KEYCODE_F3_GREEN = 0x73; 1235506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn public static final int CEC_KEYCODE_F4_YELLOW = 0x74; 1245506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn public static final int CEC_KEYCODE_F5 = 0x75; 1255506618c80a292ac275d8b0c1046b446c7f58836Dianne Hackborn public static final int CEC_KEYCODE_DATA = 0x76; 126cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // RESERVED = 0x77-0xFF 127cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 128df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn // ========================================================================= 129df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn // UI Broadcast Type 130cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_TOGGLE_ALL = 0x00; 131cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_TOGGLE_ANALOGUE_DIGITAL = 0x01; 132cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_ANALOGUE = 0x10; 133cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_ANALOGUE_TERRESTRIAL = 0x20; 134cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_ANALOGUE_CABLE = 0x30; 1353a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn public static final int UI_BROADCAST_ANALOGUE_SATELLITE = 0x40; 136cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_DIGITAL = 0x50; 137cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_DIGITAL_TERRESTRIAL = 0x60; 138cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_DIGITAL_CABLE = 0x70; 139cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_DIGITAL_SATELLITE = 0x80; 140cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_DIGITAL_COMMNICATIONS_SATELLITE = 0x90; 1413a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn public static final int UI_BROADCAST_DIGITAL_COMMNICATIONS_SATELLITE_2 = 0x91; 142cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_BROADCAST_IP = 0xA0; 143cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 144cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // ========================================================================= 145cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // UI Sound Presentation Control 146cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_SOUND_MIX_DUAL_MONO = 0x20; 147cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_SOUND_MIX_KARAOKE = 0x30; 148cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_SELECT_AUDIO_DOWN_MIX = 0x80; 149cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_SELECT_AUDIO_AUTO_REVERBERATION = 0x90; 150cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_SELECT_AUDIO_AUTO_EQUALIZER = 0xA0; 151cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_BASS_STEP_PLUS = 0xB1; 1524500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int UI_SOUND_PRESENTATION_BASS_NEUTRAL = 0xB2; 1534500be62dea3895a98336122a2944cc4ab024bc5George Mount public static final int UI_SOUND_PRESENTATION_BASS_STEP_MINUS = 0xB3; 154cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_TREBLE_STEP_PLUS = 0xC1; 155cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_TREBLE_NEUTRAL = 0xC2; 156cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn public static final int UI_SOUND_PRESENTATION_TREBLE_STEP_MINUS = 0xC3; 157cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 158cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private HdmiCecKeycode() { 159cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 160cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 161cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 162cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * A mapping between Android and CEC keycode. 163cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 164cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * <p>Normal implementation of this looks like 165cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * <pre> 166cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * new KeycodeEntry(KeyEvent.KEYCODE_DPAD_CENTER, CEC_KEYCODE_SELECT); 167cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * </pre> 168cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * <p>However, some keys in CEC requires additional parameter. 169cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * In order to use parameterized cec key, add unique android keycode (existing or custom) 170cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * corresponding to a pair of cec keycode and and its param. 171cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * <pre> 1724500be62dea3895a98336122a2944cc4ab024bc5George Mount * new KeycodeEntry(CUSTOME_ANDORID_KEY_1, CEC_KEYCODE_SELECT_BROADCAST_TYPE, 1734500be62dea3895a98336122a2944cc4ab024bc5George Mount * UI_BROADCAST_TOGGLE_ALL); 174cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * new KeycodeEntry(CUSTOME_ANDORID_KEY_2, CEC_KEYCODE_SELECT_BROADCAST_TYPE, 175cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * UI_BROADCAST_ANALOGUE); 176cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * </pre> 177cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 178cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private static class KeycodeEntry { 179cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private final int mAndroidKeycode; 180cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private final boolean mIsRepeatable; 181cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private final byte[] mCecKeycodeAndParams; 182cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 183cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private KeycodeEntry(int androidKeycode, int cecKeycode, boolean isRepeatable, 184cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn byte[] cecParams) { 185cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mAndroidKeycode = androidKeycode; 186cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mIsRepeatable = isRepeatable; 187cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mCecKeycodeAndParams = new byte[cecParams.length + 1]; 188cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn System.arraycopy(cecParams, 0, mCecKeycodeAndParams, 1, cecParams.length); 189cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn mCecKeycodeAndParams[0] = (byte) (cecKeycode & 0xFF); 190cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 191cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 192cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private KeycodeEntry(int androidKeycode, int cecKeycode, boolean isRepeatable) { 1933a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn this(androidKeycode, cecKeycode, isRepeatable, EmptyArray.BYTE); 194cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 195cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 196cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private KeycodeEntry(int androidKeycode, int cecKeycode, byte[] cecParams) { 197cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn this(androidKeycode, cecKeycode, true, cecParams); 198cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 199cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 200cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private KeycodeEntry(int androidKeycode, int cecKeycode) { 201cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn this(androidKeycode, cecKeycode, true, EmptyArray.BYTE); 202cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 203eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn 204eedc67283a5a49dce86c625e54596dfdea9465a7Dianne Hackborn private byte[] toCecKeycodeAndParamIfMatched(int androidKeycode) { 205cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAndroidKeycode == androidKeycode) { 206cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mCecKeycodeAndParams; 207cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 208cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 209cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 210cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 211cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 212cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private int toAndroidKeycodeIfMatched(byte[] cecKeycodeAndParams) { 213df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn if (Arrays.equals(mCecKeycodeAndParams, cecKeycodeAndParams)) { 214df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn return mAndroidKeycode; 215cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } else { 216cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return UNSUPPORTED_KEYCODE; 217cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 218cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 219cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 220cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn private Boolean isRepeatableIfMatched(int androidKeycode) { 221cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (mAndroidKeycode == androidKeycode) { 222cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return mIsRepeatable; 223df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn } else { 224df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn return null; 225cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 226cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 227cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 228cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 229cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Keycode entry container for all mappings. 230cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Note that order of entry is the same as above cec keycode definition. 2313a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn private static final KeycodeEntry[] KEYCODE_ENTRIES = new KeycodeEntry[] { 232cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_DPAD_CENTER, CEC_KEYCODE_SELECT), 233cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_DPAD_UP, CEC_KEYCODE_UP), 234cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_DPAD_DOWN, CEC_KEYCODE_DOWN), 235cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_DPAD_LEFT, CEC_KEYCODE_LEFT), 236cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_DPAD_RIGHT, CEC_KEYCODE_RIGHT), 237cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_RIGHT_UP 2384500be62dea3895a98336122a2944cc4ab024bc5George Mount new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RIGHT_UP), 2394500be62dea3895a98336122a2944cc4ab024bc5George Mount // No Android keycode defined for CEC_KEYCODE_RIGHT_DOWN 2404500be62dea3895a98336122a2944cc4ab024bc5George Mount new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RIGHT_DOWN), 2413a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_LEFT_UP 2423a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_LEFT_UP), 2433a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_LEFT_DOWN 2443a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_LEFT_DOWN), 2453a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_HOME, CEC_KEYCODE_ROOT_MENU, false), 2463a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_SETTINGS, CEC_KEYCODE_SETUP_MENU, false), 2473a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MENU, CEC_KEYCODE_CONTENTS_MENU, false), 2483a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_FAVORITE_MENU 249df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_FAVORITE_MENU), 2503a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_BACK, CEC_KEYCODE_EXIT), 2513a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // RESERVED 2523a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_TOP_MENU, CEC_KEYCODE_MEDIA_TOP_MENU), 253cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_MEDIA_CONTEXT_SENSITIVE_MENU 2543a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_MEDIA_CONTEXT_SENSITIVE_MENU), 2553a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // RESERVED 2563a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_NUMBER_ENTRY_MODE 2573a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_NUMBER_ENTRY_MODE), 2583a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_11, CEC_KEYCODE_NUMBER_11), 2593a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_12, CEC_KEYCODE_NUMBER_12), 2603a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_0, CEC_KEYCODE_NUMBER_0_OR_NUMBER_10), 2613a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_1, CEC_KEYCODE_NUMBERS_1), 2623a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_2, CEC_KEYCODE_NUMBERS_2), 2633a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_3, CEC_KEYCODE_NUMBERS_3), 2643a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_4, CEC_KEYCODE_NUMBERS_4), 2653a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_5, CEC_KEYCODE_NUMBERS_5), 2663a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_6, CEC_KEYCODE_NUMBERS_6), 2673a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_7, CEC_KEYCODE_NUMBERS_7), 2683a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_8, CEC_KEYCODE_NUMBERS_8), 2693a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_9, CEC_KEYCODE_NUMBERS_9), 2703a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_PERIOD, CEC_KEYCODE_DOT), 2713a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_NUMPAD_ENTER, CEC_KEYCODE_ENTER), 2723a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_CLEAR, CEC_KEYCODE_CLEAR), 2733a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // RESERVED 2743a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_NEXT_FAVORITE 2753a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_NEXT_FAVORITE), 2763a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_CHANNEL_UP, CEC_KEYCODE_CHANNEL_UP), 2773a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_CHANNEL_DOWN, CEC_KEYCODE_CHANNEL_DOWN), 2783a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_LAST_CHANNEL, CEC_KEYCODE_PREVIOUS_CHANNEL), 2793a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_SOUND_SELECT 2803a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SOUND_SELECT), 2813a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_TV_INPUT, CEC_KEYCODE_INPUT_SELECT), 2823a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_INFO, CEC_KEYCODE_DISPLAY_INFORMATION), 2833a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_HELP 2843a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_HELP), 2853a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_PAGE_UP, CEC_KEYCODE_PAGE_UP), 2863a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_PAGE_DOWN, CEC_KEYCODE_PAGE_DOWN), 2873a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // RESERVED 2883a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_POWER, CEC_KEYCODE_POWER, false), 2893a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_VOLUME_UP, CEC_KEYCODE_VOLUME_UP), 2903a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_VOLUME_DOWN, CEC_KEYCODE_VOLUME_DOWN), 2913a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_VOLUME_MUTE, CEC_KEYCODE_MUTE, false), 2923a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_PLAY, CEC_KEYCODE_PLAY), 2933a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_STOP, CEC_KEYCODE_STOP), 2943a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_PAUSE, CEC_KEYCODE_PAUSE), 2953a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_RECORD, CEC_KEYCODE_RECORD), 2963a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_REWIND, CEC_KEYCODE_REWIND), 297cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, CEC_KEYCODE_FAST_FORWARD), 298cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_EJECT, CEC_KEYCODE_EJECT), 299cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_NEXT, CEC_KEYCODE_FORWARD), 300cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_PREVIOUS, CEC_KEYCODE_BACKWARD), 301cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_STOP_RECORD 302cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_STOP_RECORD), 303cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_PAUSE_RECORD 304cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PAUSE_RECORD), 3053a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_RESERVED 3063a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RESERVED), 3073a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_ANGLE 3083a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_ANGLE), 3093a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_SUB_PICTURE 3103a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SUB_PICTURE), 3113a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_VIDEO_ON_DEMAND 3123a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_VIDEO_ON_DEMAND), 3133a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_GUIDE, CEC_KEYCODE_ELECTRONIC_PROGRAM_GUIDE), 3143a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_TIMER_PROGRAMMING 3153a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_TIMER_PROGRAMMING), 316df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_INITIAL_CONFIGURATION 3173a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_INITIAL_CONFIGURATION), 3183a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_SELECT_BROADCAST_TYPE 3193a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_BROADCAST_TYPE), 3203a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_SELECT_SOUND_PRESENTATION 3213a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_SOUND_PRESENTATION), 3223a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // RESERVED 3233a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // The following deterministic key definitions do not need key mapping 3243a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // since they are supposed to be generated programmatically only. 3253a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_PLAY_FUNCTION 3263a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PLAY_FUNCTION), 3273a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_PAUSE_PLAY_FUNCTION 3283a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PAUSE_PLAY_FUNCTION), 3293a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_RECORD_FUNCTION 3303a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RECORD_FUNCTION), 3313a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_PAUSE_RECORD_FUNCTION 3323a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PAUSE_RECORD_FUNCTION), 333cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_STOP_FUNCTION 334cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_STOP_FUNCTION), 335cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_MUTE_FUNCTION 336cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_MUTE_FUNCTION, false), 337cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_RESTORE_VOLUME_FUNCTION 338cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RESTORE_VOLUME_FUNCTION, false), 339cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_TUNE_FUNCTION 3403a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_TUNE_FUNCTION), 3413a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_SELECT_MEDIA_FUNCTION 3423a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_MEDIA_FUNCTION), 3433a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn // No Android keycode defined for CEC_KEYCODE_SELECT_AV_INPUT_FUNCTION 344cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_AV_INPUT_FUNCTION), 345cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_SELECT_AUDIO_INPUT_FUNCTION 346cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_AUDIO_INPUT_FUNCTION), 347cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_POWER_TOGGLE_FUNCTION 348cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_POWER_TOGGLE_FUNCTION), 349cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_POWER_OFF_FUNCTION 3503a7571011a8f2c2e2685c4e3e7a6fa46673ee7eaDianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_POWER_OFF_FUNCTION), 351cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // No Android keycode defined for CEC_KEYCODE_POWER_ON_FUNCTION 352cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_POWER_ON_FUNCTION, false), 353cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // RESERVED 354cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_PROG_BLUE, CEC_KEYCODE_F1_BLUE), 355cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_PROG_RED, CEC_KEYCODE_F2_RED), 356cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_PROG_GREEN, CEC_KEYCODE_F3_GREEN), 357cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_PROG_YELLOW, CEC_KEYCODE_F4_YELLOW), 358cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_F5, CEC_KEYCODE_F5), 359cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn new KeycodeEntry(KeyEvent.KEYCODE_TV_DATA_SERVICE, CEC_KEYCODE_DATA), 360cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // RESERVED 361cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn // Add a new key mapping here if new keycode is introduced. 362cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn }; 363cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 364cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 365cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Translate Android keycode to Hdmi Cec keycode and params. 366cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 367cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param keycode Android keycode. For details, refer {@link KeyEvent} 368cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return byte array of CEC keycode and params if matched. Otherwise, return null. 369cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 370cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static byte[] androidKeyToCecKey(int keycode) { 371cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i = 0; i < KEYCODE_ENTRIES.length; ++i) { 372cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn byte[] cecKeycodeAndParams = KEYCODE_ENTRIES[i].toCecKeycodeAndParamIfMatched(keycode); 373cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (cecKeycodeAndParams != null) { 374cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return cecKeycodeAndParams; 375cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 376cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 377cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return null; 378cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 379cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 380cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 381cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Translate Hdmi CEC keycode with params to Android keycode. 382cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 383cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param cecKeycodeAndParams CEC keycode and params 384cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return cec keycode corresponding to the given android keycode. 385cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * If finds no matched keycode, return {@link #UNSUPPORTED_KEYCODE} 386cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 387cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static int cecKeycodeAndParamsToAndroidKey(byte[] cecKeycodeAndParams) { 388cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i = 0; i < KEYCODE_ENTRIES.length; ++i) { 389cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn int androidKey = KEYCODE_ENTRIES[i].toAndroidKeycodeIfMatched(cecKeycodeAndParams); 390cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (androidKey != UNSUPPORTED_KEYCODE) { 391cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return androidKey; 392cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 393cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 394cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return UNSUPPORTED_KEYCODE; 395df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn } 396df6f1393f73a488ba2661b28d3d88a5ac19c4ea2Dianne Hackborn 397cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 398cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Whether the given {@code androidKeycode} is repeatable key or not. 399cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * 400cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @param androidKeycode keycode of android 401cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * @return false if the given {@code androidKeycode} is not supported key code 402cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 403cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static boolean isRepeatableKey(int androidKeycode) { 404cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn for (int i = 0; i < KEYCODE_ENTRIES.length; ++i) { 405cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn Boolean isRepeatable = KEYCODE_ENTRIES[i].isRepeatableIfMatched(androidKeycode); 406cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn if (isRepeatable != null) { 407cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return isRepeatable; 408cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 409cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 410cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return false; 411cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 412cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn 413cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn /** 414cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn * Returns {@code true} if given Android keycode is supported, otherwise {@code false}. 415cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn */ 416cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn static boolean isSupportedKeycode(int androidKeycode) { 417cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn return HdmiCecKeycode.androidKeyToCecKey(androidKeycode) != null; 418cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn } 419cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn} 420cba2e2c881e8e16ea5025b564c94320174d65f01Dianne Hackborn