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