// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "remoting/client/jni/android_keymap.h"

#include "base/logging.h"

namespace {

// These must be defined in the same order as the Android keycodes in
// <android/keycodes.h> and
// "ui/events/keycodes/keyboard_code_conversion_android.cc" . Some of these
// mappings assume a US keyboard layout for now.
const uint32 usb_keycodes[] = {
  0,         // UNKNOWN
  0,         // SOFT_LEFT
  0,         // SOFT_RIGHT
  0,         // HOME
  0,         // BACK
  0,         // CALL
  0,         // ENDCALL

  0x070027,  // 0
  0x07001e,  // 1
  0x07001f,  // 2
  0x070020,  // 3
  0x070021,  // 4
  0x070022,  // 5
  0x070023,  // 6
  0x070024,  // 7
  0x070025,  // 8
  0x070026,  // 9

  0,         // STAR
  0,         // POUND
  0x070052,  // DPAD_UP
  0x070051,  // DPAD_DOWN
  0x070050,  // DPAD_LEFT
  0x07004f,  // DPAD_RIGHT
  0,         // DPAD_CENTER
  0,         // VOLUME_UP
  0,         // VOLUME_DOWN
  0,         // POWER
  0,         // CAMERA
  0,         // CLEAR

  0x070004,  // A
  0x070005,  // B
  0x070006,  // C
  0x070007,  // D
  0x070008,  // E
  0x070009,  // F
  0x07000a,  // G
  0x07000b,  // H
  0x07000c,  // I
  0x07000d,  // J
  0x07000e,  // K
  0x07000f,  // L
  0x070010,  // M
  0x070011,  // N
  0x070012,  // O
  0x070013,  // P
  0x070014,  // Q
  0x070015,  // R
  0x070016,  // S
  0x070017,  // T
  0x070018,  // U
  0x070019,  // V
  0x07001a,  // W
  0x07001b,  // X
  0x07001c,  // Y
  0x07001d,  // Z

  0x070036,  // COMMA
  0x070037,  // PERIOD

  0x0700e2,  // ALT_LEFT
  0x0700e6,  // ALT_RIGHT
  0x0700e1,  // SHIFT_LEFT
  0x0700e5,  // SHIFT_RIGHT

  0x07002b,  // TAB
  0x07002c,  // SPACE

  0,         // SYM
  0,         // EXPLORER
  0,         // ENVELOPE

  0x070028,  // ENTER
  0x07002a,  // DEL (backspace)

  0x070035,  // GRAVE (backtick)
  0x07002d,  // MINUS
  0x07002e,  // EQUALS
  0x07002f,  // LEFT_BRACKET
  0x070030,  // RIGHT_BRACKET
  0x070031,  // BACKSLASH
  0x070033,  // SEMICOLON
  0x070034,  // APOSTROPHE
  0x070038,  // SLASH

  0,         // AT
  0,         // NUM
  0,         // HEADSETHOOK
  0,         // FOCUS
  0,         // PLUS
  0,         // MENU
  0,         // NOTIFICATION
  0,         // SEARCH
  0,         // MEDIA_PLAY_PAUSE
  0,         // MEDIA_STOP
  0,         // MEDIA_NEXT
  0,         // MEDIA_PREVIOUS
  0,         // MEDIA_REWIND
  0,         // MEDIA_FAST_FORWARD
  0,         // MUTE

  0x07004b,  // PAGE_UP
  0x07004e,  // PAGE_DOWN

  0,         // PICTSYMBOLS
  0,         // SWITCH_CHARSET
  0,         // BUTTON_A
  0,         // BUTTON_B
  0,         // BUTTON_C
  0,         // BUTTON_X
  0,         // BUTTON_Y
  0,         // BUTTON_Z
  0,         // BUTTON_L1
  0,         // BUTTON_R1
  0,         // BUTTON_L2
  0,         // BUTTON_R2
  0,         // BUTTON_THUMBL
  0,         // BUTTON_THUMBR
  0,         // BUTTON_START
  0,         // BUTTON_SELECT
  0,         // BUTTON_MODE

  0x070029,  // ESCAPE
  0x07004c,  // FORWARD_DEL

  0x0700e0,  // CTRL_LEFT
  0x0700e4,  // CTRL_RIGHT
  0,         // CAPS_LOCK
  0,         // SCROLL_LOCK
  0x0700e3,  // META_LEFT
  0x0700e7,  // META_RIGHT
  0,         // FUNCTION

  0x070046,  // SYSRQ (printscreen)
  0x070048,  // BREAK (pause)
  0x07004a,  // MOVE_HOME (home)
  0x07004d,  // MOVE_END (end)
  0x070049,  // INSERT

  0,         // FORWARD
  0,         // MEDIA_PLAY
  0,         // MEDIA_PAUSE
  0,         // MEDIA_CLOSE
  0,         // MEDIA_EJECT
  0,         // MEDIA_RECORD

  0x07003a,  // F1
  0x07003b,  // F2
  0x07003c,  // F3
  0x07003d,  // F4
  0x07003e,  // F5
  0x07003f,  // F6
  0x070040,  // F7
  0x070041,  // F8
  0x070042,  // F9
  0x070043,  // F10
  0x070044,  // F11
  0x070045,  // F12

  0,         // NUM_LOCK

  0x070062,  // NUMPAD_0
  0x070059,  // NUMPAD_1
  0x07005a,  // NUMPAD_2
  0x07005b,  // NUMPAD_3
  0x07005c,  // NUMPAD_4
  0x07005d,  // NUMPAD_5
  0x07005e,  // NUMPAD_6
  0x07005f,  // NUMPAD_7
  0x070060,  // NUMPAD_8
  0x070061,  // NUMPAD_9

  0x070054,  // NUMPAD_DIVIDE
  0x070055,  // NUMPAD_MULTIPLY
  0x070056,  // NUMPAD_SUBTRACT
  0x070057,  // NUMPAD_ADD
  0x070063,  // NUMPAD_DOT
  0x070085,  // NUMPAD_COMMA
  0x070058,  // NUMPAD_ENTER
  0x070067,  // NUMPAD_EQUALS
  0x0700b6,  // NUMPAD_LEFT_PAREN
  0x0700b7,  // NUMPAD_RIGHT_PAREN
};

}  // namespace

namespace remoting {

uint32 AndroidKeycodeToUsbKeycode(size_t android) {
  if (android >= sizeof (usb_keycodes) / sizeof (uint32)) {
    LOG(WARNING) << "Attempted to decode out-of-range Android keycode";
    return 0;
  }

  return usb_keycodes[android];
}

}  // namespace remoting
