165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang/* 265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * Copyright (C) 2014 The Android Open Source Project 365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * 465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * Licensed under the Apache License, Version 2.0 (the "License"); 565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * you may not use this file except in compliance with the License. 665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * You may obtain a copy of the License at 765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * 865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * http://www.apache.org/licenses/LICENSE-2.0 965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * 1065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * Unless required by applicable law or agreed to in writing, software 1165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * distributed under the License is distributed on an "AS IS" BASIS, 1265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * See the License for the specific language governing permissions and 1465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * limitations under the License. 1565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang */ 1665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 1765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jangpackage com.android.server.hdmi; 1865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 1965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jangimport android.view.KeyEvent; 2065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 2173483b6bc9046cbb7a54748c31ee724358a631efJungshik Jangimport libcore.util.EmptyArray; 2273483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang 2373483b6bc9046cbb7a54748c31ee724358a631efJungshik Jangimport java.util.Arrays; 2473483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang 2565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang/** 2665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * Helper class to translate android keycode to hdmi cec keycode and vice versa. 2765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang */ 284612a6e1116f1196e6aa64b5a6e3757ea48f94acJungshik Jangfinal class HdmiCecKeycode { 2965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UNSUPPORTED_KEYCODE = -1; 3065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int NO_PARAM = -1; 3165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 3265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // ========================================================================= 3365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // Hdmi CEC keycodes 3465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SELECT = 0x00; 3565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_UP = 0x01; 3665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_DOWN = 0x02; 3765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_LEFT = 0x03; 3865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_RIGHT = 0x04; 3965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_RIGHT_UP = 0x05; 4065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_RIGHT_DOWN = 0x06; 4165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_LEFT_UP = 0x07; 4265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_LEFT_DOWN = 0x08; 4365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_ROOT_MENU = 0x09; 4465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SETUP_MENU = 0x0A; 4565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_CONTENTS_MENU = 0x0B; 4665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_FAVORITE_MENU = 0x0C; 4765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_EXIT = 0x0D; 4865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED = 0x0E - 0x0F 4965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_MEDIA_TOP_MENU = 0x10; 5065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_MEDIA_CONTEXT_SENSITIVE_MENU = 0x11; 5165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED = 0x12 – 0x1C 5265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBER_ENTRY_MODE = 0x1D; 5365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBER_11 = 0x1E; 5465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBER_12 = 0x1F; 5565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBER_0_OR_NUMBER_10 = 0x20; 5665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_1 = 0x21; 5765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_2 = 0x22; 5865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_3 = 0x23; 5965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_4 = 0x24; 6065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_5 = 0x25; 6165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_6 = 0x26; 6265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_7 = 0x27; 6365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_8 = 0x28; 6465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NUMBERS_9 = 0x29; 6565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_DOT = 0x2A; 6665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_ENTER = 0x2B; 6765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_CLEAR = 0x2C; 6865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED = 0x2D - 0x2E 6965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_NEXT_FAVORITE = 0x2F; 7065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_CHANNEL_UP = 0x30; 7165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_CHANNEL_DOWN = 0x31; 7265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PREVIOUS_CHANNEL = 0x32; 7365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SOUND_SELECT = 0x33; 7465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_INPUT_SELECT = 0x34; 7565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_DISPLAY_INFORMATION = 0x35; 7665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_HELP = 0x36; 7765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PAGE_UP = 0x37; 7865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PAGE_DOWN = 0x38; 7965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED = 0x39 - 0x3F 8065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_POWER = 0x40; 8165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_VOLUME_UP = 0x41; 8265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_VOLUME_DOWN = 0x42; 8365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_MUTE = 0x43; 8465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PLAY = 0x44; 8565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_STOP = 0x45; 8665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PAUSE = 0x46; 8765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_RECORD = 0x47; 8865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_REWIND = 0x48; 8965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_FAST_FORWARD = 0x49; 9065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_EJECT = 0x4A; 9165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_FORWARD = 0x4B; 9265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_BACKWARD = 0x4C; 9365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_STOP_RECORD = 0x4D; 9465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PAUSE_RECORD = 0x4E; 9565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_RESERVED = 0x4F; 9665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_ANGLE = 0x50; 9765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SUB_PICTURE = 0x51; 9865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_VIDEO_ON_DEMAND = 0x52; 9965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_ELECTRONIC_PROGRAM_GUIDE = 0x53; 10065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_TIMER_PROGRAMMING = 0x54; 10165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_INITIAL_CONFIGURATION = 0x55; 10265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SELECT_BROADCAST_TYPE = 0x56; 10365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SELECT_SOUND_PRESENTATION = 0x57; 10465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED = 0x58-0x5F 10565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PLAY_FUNCTION = 0x60; 10665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PAUSE_PLAY_FUNCTION = 0x61; 10765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_RECORD_FUNCTION = 0x62; 10865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_PAUSE_RECORD_FUNCTION = 0x63; 10965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_STOP_FUNCTION = 0x64; 11065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_MUTE_FUNCTION = 0x65; 11165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_RESTORE_VOLUME_FUNCTION = 0x66; 11265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_TUNE_FUNCTION = 0x67; 11365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SELECT_MEDIA_FUNCTION = 0x68; 11465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SELECT_AV_INPUT_FUNCTION = 0x69; 11565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_SELECT_AUDIO_INPUT_FUNCTION = 0x6A; 11665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_POWER_TOGGLE_FUNCTION = 0x6B; 11765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_POWER_OFF_FUNCTION = 0x6C; 11865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_POWER_ON_FUNCTION = 0x6D; 11965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED = 0x6E-0x70 12065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_F1_BLUE = 0x71; 12165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_F2_RED = 0x72; 12265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_F3_GREEN = 0x73; 12365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_F4_YELLOW = 0x74; 12465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_F5 = 0x75; 12565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int CEC_KEYCODE_DATA = 0x76; 12665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED = 0x77-0xFF 12765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 12865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // ========================================================================= 12965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // UI Broadcast Type 13065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_TOGGLE_ALL = 0x00; 13165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_TOGGLE_ANALOGUE_DIGITAL = 0x01; 13265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_ANALOGUE = 0x10; 13365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_ANALOGUE_TERRESTRIAL = 0x20; 13465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_ANALOGUE_CABLE = 0x30; 13565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_ANALOGUE_SATELLITE = 0x40; 13665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_DIGITAL = 0x50; 13765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_DIGITAL_TERRESTRIAL = 0x60; 13865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_DIGITAL_CABLE = 0x70; 13965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_DIGITAL_SATELLITE = 0x80; 14065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_DIGITAL_COMMNICATIONS_SATELLITE = 0x90; 14165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_DIGITAL_COMMNICATIONS_SATELLITE_2 = 0x91; 14265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_BROADCAST_IP = 0xA0; 14365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 14465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // ========================================================================= 14565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // UI Sound Presentation Control 14665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_SOUND_MIX_DUAL_MONO = 0x20; 14765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_SOUND_MIX_KARAOKE = 0x30; 14865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_SELECT_AUDIO_DOWN_MIX = 0x80; 14965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_SELECT_AUDIO_AUTO_REVERBERATION = 0x90; 15065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_SELECT_AUDIO_AUTO_EQUALIZER = 0xA0; 15165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_BASS_STEP_PLUS = 0xB1; 15265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_BASS_NEUTRAL = 0xB2; 15365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_BASS_STEP_MINUS = 0xB3; 15465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_TREBLE_STEP_PLUS = 0xC1; 15565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_TREBLE_NEUTRAL = 0xC2; 15665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang public static final int UI_SOUND_PRESENTATION_TREBLE_STEP_MINUS = 0xC3; 15765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 158cd3445cc8b7a1a08f34bf955c6d2357a5d5481c3Jungshik Jang private HdmiCecKeycode() { 15965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 16065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 16165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang /** 1625691b2f2297b29dc83a7f83f77da517035b11cceJungshik Jang * A mapping between Android and CEC keycode. 163fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * <p> 164fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * Normal implementation of this looks like 16565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * 16665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * <pre> 167fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * new KeycodeEntry(KeyEvent.KEYCODE_DPAD_CENTER, CEC_KEYCODE_SELECT); 16865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * </pre> 169fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * <p> 170fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * However, some keys in CEC requires additional parameter. In order to use parameterized cec 171fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * key, add unique android keycode (existing or custom) corresponding to a pair of cec keycode 172fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * and and its param. 173fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * 17465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * <pre> 175fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * new KeycodeEntry(CUSTOME_ANDORID_KEY_1, CEC_KEYCODE_SELECT_BROADCAST_TYPE, 176fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * UI_BROADCAST_TOGGLE_ALL); 177fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * new KeycodeEntry(CUSTOME_ANDORID_KEY_2, CEC_KEYCODE_SELECT_BROADCAST_TYPE, 178fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * UI_BROADCAST_ANALOGUE); 17965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * </pre> 18065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang */ 18165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang private static class KeycodeEntry { 18265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang private final int mAndroidKeycode; 183250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang private final boolean mIsRepeatable; 18473483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang private final byte[] mCecKeycodeAndParams; 18565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 18673483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang private KeycodeEntry(int androidKeycode, int cecKeycode, boolean isRepeatable, 18773483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang byte[] cecParams) { 188250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang mAndroidKeycode = androidKeycode; 189250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang mIsRepeatable = isRepeatable; 19073483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang mCecKeycodeAndParams = new byte[cecParams.length + 1]; 19173483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang System.arraycopy(cecParams, 0, mCecKeycodeAndParams, 1, cecParams.length); 19273483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang mCecKeycodeAndParams[0] = (byte) (cecKeycode & 0xFF); 19373483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang } 19473483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang 19573483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang private KeycodeEntry(int androidKeycode, int cecKeycode, boolean isRepeatable) { 19673483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang this(androidKeycode, cecKeycode, isRepeatable, EmptyArray.BYTE); 19773483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang } 19873483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang 19973483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang private KeycodeEntry(int androidKeycode, int cecKeycode, byte[] cecParams) { 20073483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang this(androidKeycode, cecKeycode, true, cecParams); 20165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 20265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 20365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang private KeycodeEntry(int androidKeycode, int cecKeycode) { 20473483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang this(androidKeycode, cecKeycode, true, EmptyArray.BYTE); 20565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 20665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 20773483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang private byte[] toCecKeycodeAndParamIfMatched(int androidKeycode) { 20865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang if (mAndroidKeycode == androidKeycode) { 20973483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang return mCecKeycodeAndParams; 21065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } else { 21173483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang return null; 21265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 21365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 21465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 21573483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang private int toAndroidKeycodeIfMatched(byte[] cecKeycodeAndParams) { 21673483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang if (Arrays.equals(mCecKeycodeAndParams, cecKeycodeAndParams)) { 21765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang return mAndroidKeycode; 21865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } else { 21965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang return UNSUPPORTED_KEYCODE; 22065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 22165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 222250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang 223250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang private Boolean isRepeatableIfMatched(int androidKeycode) { 224250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang if (mAndroidKeycode == androidKeycode) { 225250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang return mIsRepeatable; 226250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang } else { 227250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang return null; 228250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang } 229250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang } 23065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 23165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 232fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang private static byte[] intToSingleByteArray(int value) { 233fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang return new byte[] { 234fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang (byte) (value & 0xFF) }; 235fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang } 236fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang 23765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // Keycode entry container for all mappings. 23865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // Note that order of entry is the same as above cec keycode definition. 23965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang private static final KeycodeEntry[] KEYCODE_ENTRIES = new KeycodeEntry[] { 24065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_DPAD_CENTER, CEC_KEYCODE_SELECT), 24165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_DPAD_UP, CEC_KEYCODE_UP), 24265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_DPAD_DOWN, CEC_KEYCODE_DOWN), 24365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_DPAD_LEFT, CEC_KEYCODE_LEFT), 24465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_DPAD_RIGHT, CEC_KEYCODE_RIGHT), 24565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_RIGHT_UP 246250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RIGHT_UP), 24765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_RIGHT_DOWN 248250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RIGHT_DOWN), 24965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_LEFT_UP 250250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_LEFT_UP), 25165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_LEFT_DOWN 252250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_LEFT_DOWN), 253fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_HOME, CEC_KEYCODE_ROOT_MENU), 254fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_SETTINGS, CEC_KEYCODE_SETUP_MENU), 255d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_CONTENTS_MENU, CEC_KEYCODE_CONTENTS_MENU, false), 25665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_FAVORITE_MENU 257250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_FAVORITE_MENU), 258fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // Note that both BACK and ESCAPE are mapped to EXIT of CEC keycode. 259fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // This would be problematic when translates CEC keycode to Android keycode. 260fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // In current implementation, we pick BACK as mapping of EXIT key. 261fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // If you'd like to map CEC EXIT to Android EXIT key, change order of 262fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // the following two definition. 26365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_BACK, CEC_KEYCODE_EXIT), 264fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_ESCAPE, CEC_KEYCODE_EXIT), 26565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED 26665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_TOP_MENU, CEC_KEYCODE_MEDIA_TOP_MENU), 267fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_MEDIA_CONTEXT_MENU, 268fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang CEC_KEYCODE_MEDIA_CONTEXT_SENSITIVE_MENU), 26965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED 27065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_NUMBER_ENTRY_MODE 271fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_NUMBER_ENTRY, CEC_KEYCODE_NUMBER_ENTRY_MODE), 27265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_11, CEC_KEYCODE_NUMBER_11), 27365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_12, CEC_KEYCODE_NUMBER_12), 27465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_0, CEC_KEYCODE_NUMBER_0_OR_NUMBER_10), 27565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_1, CEC_KEYCODE_NUMBERS_1), 27665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_2, CEC_KEYCODE_NUMBERS_2), 27765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_3, CEC_KEYCODE_NUMBERS_3), 27865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_4, CEC_KEYCODE_NUMBERS_4), 27965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_5, CEC_KEYCODE_NUMBERS_5), 28065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_6, CEC_KEYCODE_NUMBERS_6), 28165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_7, CEC_KEYCODE_NUMBERS_7), 28265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_8, CEC_KEYCODE_NUMBERS_8), 28365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_9, CEC_KEYCODE_NUMBERS_9), 28465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_PERIOD, CEC_KEYCODE_DOT), 28565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_NUMPAD_ENTER, CEC_KEYCODE_ENTER), 28665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_CLEAR, CEC_KEYCODE_CLEAR), 28765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED 28865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_NEXT_FAVORITE 289250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_NEXT_FAVORITE), 290d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_CHANNEL_UP, CEC_KEYCODE_CHANNEL_UP), 291d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_CHANNEL_DOWN, CEC_KEYCODE_CHANNEL_DOWN), 29265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_LAST_CHANNEL, CEC_KEYCODE_PREVIOUS_CHANNEL), 29365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_SOUND_SELECT 294250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SOUND_SELECT), 29565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_INPUT, CEC_KEYCODE_INPUT_SELECT), 29665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_INFO, CEC_KEYCODE_DISPLAY_INFORMATION), 29765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_HELP 298250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_HELP), 29965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_PAGE_UP, CEC_KEYCODE_PAGE_UP), 30065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_PAGE_DOWN, CEC_KEYCODE_PAGE_DOWN), 30165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED 302250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_POWER, CEC_KEYCODE_POWER, false), 30365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_VOLUME_UP, CEC_KEYCODE_VOLUME_UP), 30465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_VOLUME_DOWN, CEC_KEYCODE_VOLUME_DOWN), 305250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_VOLUME_MUTE, CEC_KEYCODE_MUTE, false), 30665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_PLAY, CEC_KEYCODE_PLAY), 30765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_STOP, CEC_KEYCODE_STOP), 308fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // Note that we map both MEDIA_PAUSE and MEDIA_PLAY_PAUSE to CEC PAUSE key. 309fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // When it translates CEC PAUSE key, it picks Android MEDIA_PAUSE key as a mapping of 310fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // it. If you'd like to choose MEDIA_PLAY_PAUSE, please change order of the following 311fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang // two lines. 31265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_PAUSE, CEC_KEYCODE_PAUSE), 313fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, CEC_KEYCODE_PAUSE), 31465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_RECORD, CEC_KEYCODE_RECORD), 31565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_REWIND, CEC_KEYCODE_REWIND), 31665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, CEC_KEYCODE_FAST_FORWARD), 31765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_EJECT, CEC_KEYCODE_EJECT), 31865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_NEXT, CEC_KEYCODE_FORWARD), 31965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_MEDIA_PREVIOUS, CEC_KEYCODE_BACKWARD), 32065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_STOP_RECORD 321250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_STOP_RECORD), 32265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_PAUSE_RECORD 323250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PAUSE_RECORD), 32465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_RESERVED 325250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RESERVED), 32665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_ANGLE 327250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_ANGLE), 328fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_CAPTIONS, CEC_KEYCODE_SUB_PICTURE), 32965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_VIDEO_ON_DEMAND 330250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_VIDEO_ON_DEMAND), 33165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_GUIDE, CEC_KEYCODE_ELECTRONIC_PROGRAM_GUIDE), 332fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_TIMER_PROGRAMMING, CEC_KEYCODE_TIMER_PROGRAMMING), 33365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_INITIAL_CONFIGURATION 334250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_INITIAL_CONFIGURATION), 33565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_SELECT_BROADCAST_TYPE 336250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_BROADCAST_TYPE), 337fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_TERRESTRIAL_ANALOG, 338fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang CEC_KEYCODE_SELECT_BROADCAST_TYPE, true, 339fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang intToSingleByteArray(UI_BROADCAST_ANALOGUE)), 340fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_TERRESTRIAL_DIGITAL, 341fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang CEC_KEYCODE_SELECT_BROADCAST_TYPE, true, 342fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang intToSingleByteArray(UI_BROADCAST_DIGITAL_TERRESTRIAL)), 343fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_SATELLITE_BS, 344fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang CEC_KEYCODE_SELECT_BROADCAST_TYPE, true, 345fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang intToSingleByteArray(UI_BROADCAST_DIGITAL_SATELLITE)), 346fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_SATELLITE_CS, 347fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang CEC_KEYCODE_SELECT_BROADCAST_TYPE, true, 348fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang intToSingleByteArray(UI_BROADCAST_DIGITAL_COMMNICATIONS_SATELLITE)), 349fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_NETWORK, 350fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang CEC_KEYCODE_SELECT_BROADCAST_TYPE, true, 351fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang intToSingleByteArray(UI_BROADCAST_TOGGLE_ANALOGUE_DIGITAL)), 35265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_SELECT_SOUND_PRESENTATION 353250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_SOUND_PRESENTATION), 35465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED 35565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // The following deterministic key definitions do not need key mapping 35665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // since they are supposed to be generated programmatically only. 35765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_PLAY_FUNCTION 358d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PLAY_FUNCTION, false), 35965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_PAUSE_PLAY_FUNCTION 360d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PAUSE_PLAY_FUNCTION, false), 36165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_RECORD_FUNCTION 362d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RECORD_FUNCTION, false), 36365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_PAUSE_RECORD_FUNCTION 364d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_PAUSE_RECORD_FUNCTION, false), 36565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_STOP_FUNCTION 366d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_STOP_FUNCTION, false), 36765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_MUTE_FUNCTION 368250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_MUTE_FUNCTION, false), 36965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_RESTORE_VOLUME_FUNCTION 370250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_RESTORE_VOLUME_FUNCTION, false), 37165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_TUNE_FUNCTION 372d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_TUNE_FUNCTION, false), 37365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_SELECT_MEDIA_FUNCTION 374d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_MEDIA_FUNCTION, false), 37565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_SELECT_AV_INPUT_FUNCTION 376d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_AV_INPUT_FUNCTION, false), 37765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_SELECT_AUDIO_INPUT_FUNCTION 378d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_SELECT_AUDIO_INPUT_FUNCTION, false), 37965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_POWER_TOGGLE_FUNCTION 380d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_POWER_TOGGLE_FUNCTION, false), 38165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_POWER_OFF_FUNCTION 382d825aac652e8c1e85e5cd56bf3e3d74cb92d88afJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_POWER_OFF_FUNCTION, false), 38365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // No Android keycode defined for CEC_KEYCODE_POWER_ON_FUNCTION 384250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang new KeycodeEntry(UNSUPPORTED_KEYCODE, CEC_KEYCODE_POWER_ON_FUNCTION, false), 38565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED 38665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_PROG_BLUE, CEC_KEYCODE_F1_BLUE), 38765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_PROG_RED, CEC_KEYCODE_F2_RED), 38865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_PROG_GREEN, CEC_KEYCODE_F3_GREEN), 38965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_PROG_YELLOW, CEC_KEYCODE_F4_YELLOW), 39065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_F5, CEC_KEYCODE_F5), 39165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang new KeycodeEntry(KeyEvent.KEYCODE_TV_DATA_SERVICE, CEC_KEYCODE_DATA), 39265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // RESERVED 39365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang // Add a new key mapping here if new keycode is introduced. 39465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang }; 39565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 39665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang /** 39773483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang * Translate Android keycode to Hdmi Cec keycode and params. 39865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * 39965c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * @param keycode Android keycode. For details, refer {@link KeyEvent} 40073483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang * @return byte array of CEC keycode and params if matched. Otherwise, return null. 40165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang */ 40273483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang static byte[] androidKeyToCecKey(int keycode) { 40365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang for (int i = 0; i < KEYCODE_ENTRIES.length; ++i) { 40473483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang byte[] cecKeycodeAndParams = KEYCODE_ENTRIES[i].toCecKeycodeAndParamIfMatched(keycode); 40573483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang if (cecKeycodeAndParams != null) { 40673483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang return cecKeycodeAndParams; 40765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 40865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 40973483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang return null; 41065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 41165c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang 41265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang /** 41373483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang * Translate Hdmi CEC keycode with params to Android keycode. 41465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang * 41573483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang * @param cecKeycodeAndParams CEC keycode and params 416fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * @return cec keycode corresponding to the given android keycode. If finds no matched keycode, 417fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang * return {@link #UNSUPPORTED_KEYCODE} 41865c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang */ 41973483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang static int cecKeycodeAndParamsToAndroidKey(byte[] cecKeycodeAndParams) { 42065c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang for (int i = 0; i < KEYCODE_ENTRIES.length; ++i) { 42173483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang int androidKey = KEYCODE_ENTRIES[i].toAndroidKeycodeIfMatched(cecKeycodeAndParams); 42265c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang if (androidKey != UNSUPPORTED_KEYCODE) { 42365c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang return androidKey; 42465c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 42565c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 42665c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang return UNSUPPORTED_KEYCODE; 42765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang } 428250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang 429250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang /** 430250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang * Whether the given {@code androidKeycode} is repeatable key or not. 431250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang * 432250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang * @param androidKeycode keycode of android 433250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang * @return false if the given {@code androidKeycode} is not supported key code 434250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang */ 435250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang static boolean isRepeatableKey(int androidKeycode) { 436250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang for (int i = 0; i < KEYCODE_ENTRIES.length; ++i) { 437250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang Boolean isRepeatable = KEYCODE_ENTRIES[i].isRepeatableIfMatched(androidKeycode); 438250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang if (isRepeatable != null) { 439250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang return isRepeatable; 440250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang } 441250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang } 442250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang return false; 443250cda56d2fdd75a269843be1f5f2776b2eaed1dJungshik Jang } 444b64c2ba05bf64bb8015444fdcd706fa3238cb96cDongil Seo 445b64c2ba05bf64bb8015444fdcd706fa3238cb96cDongil Seo /** 446b64c2ba05bf64bb8015444fdcd706fa3238cb96cDongil Seo * Returns {@code true} if given Android keycode is supported, otherwise {@code false}. 447b64c2ba05bf64bb8015444fdcd706fa3238cb96cDongil Seo */ 448b64c2ba05bf64bb8015444fdcd706fa3238cb96cDongil Seo static boolean isSupportedKeycode(int androidKeycode) { 44973483b6bc9046cbb7a54748c31ee724358a631efJungshik Jang return HdmiCecKeycode.androidKeyToCecKey(androidKeycode) != null; 450fe279619db8a094781510f5c9ac2ff96ed186420Jungshik Jang } 4510ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim 4520ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim /** 4530ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim * Returns CEC keycode to control audio mute status. 4540ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim * 4550ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim * @param muting {@code true} if audio is being muted 4560ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim */ 4570ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim public static int getMuteKey(boolean muting) { 4580ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim // CEC_KEYCODE_MUTE_FUNCTION, CEC_KEYCODE_RESTORE_VOLUME_FUNCTION are deterministic 4590ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim // commands that ensures the status changes to what we want, while CEC_KEYCODE_MUTE 4600ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim // simply toggles the status. 4610ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim // The former is a better choice in this regard, but there are compatibility issues 4620ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim // observed - many audio receivers don't recognize the commands. We fall back on 4630ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim // CEC_KEYCODE_MUTE for now. 4640ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim // return muting ? CEC_KEYCODE_MUTE_FUNCTION : CEC_KEYCODE_RESTORE_VOLUME_FUNCTION; 4650ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim return CEC_KEYCODE_MUTE; 4660ab377917c4b2d4f754a03311f9b438a3ad37b82Jinsuk Kim } 46765c64c31abaeca044fd997df6f0787dddc611a68Jungshik Jang} 468