From 1458678dbc6471574b4f67273282ecc2965f3974 Mon Sep 17 00:00:00 2001
From: twinaphex <autechre1024@hotmail.com>
Date: Mon, 13 May 2013 10:21:06 +0200
Subject: [PATCH] (Android) Add preliminary Ouya controller support

---
 android/native/jni/input_android.c    | 21 +++++++++++++++++++++
 android/native/jni/input_autodetect.c |  2 ++
 driver.h                              |  1 +
 3 files changed, 24 insertions(+)

diff --git a/android/native/jni/input_android.c b/android/native/jni/input_android.c
index 4a189f9255..1fa2f8d5fa 100644
--- a/android/native/jni/input_android.c
+++ b/android/native/jni/input_android.c
@@ -1088,6 +1088,27 @@ static void android_input_set_keybinds(void *data, unsigned device,
             keycode_lut[AKEYCODE_BUTTON_L1] |=  ((RETRO_DEVICE_ID_JOYPAD_L+1)      << shift);
             keycode_lut[AKEYCODE_BUTTON_R1] |=  ((RETRO_DEVICE_ID_JOYPAD_R+1)      << shift);
             break;
+         case DEVICE_OUYA:
+            g_settings.input.device[port] = device;
+            strlcpy(g_settings.input.device_names[port], "OUYA",
+                  sizeof(g_settings.input.device_names[port]));
+
+            keycode_lut[AKEYCODE_DPAD_UP] |=  ((RETRO_DEVICE_ID_JOYPAD_UP+1)      << shift);
+            keycode_lut[AKEYCODE_DPAD_DOWN] |=  ((RETRO_DEVICE_ID_JOYPAD_DOWN+1)      << shift);
+            keycode_lut[AKEYCODE_DPAD_LEFT] |=  ((RETRO_DEVICE_ID_JOYPAD_LEFT+1)      << shift);
+            keycode_lut[AKEYCODE_DPAD_RIGHT] |=  ((RETRO_DEVICE_ID_JOYPAD_RIGHT+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_X] |=  ((RETRO_DEVICE_ID_JOYPAD_Y+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_Y] |=  ((RETRO_DEVICE_ID_JOYPAD_X+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_A] |=  ((RETRO_DEVICE_ID_JOYPAD_B+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_B] |=  ((RETRO_DEVICE_ID_JOYPAD_A+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_L1] |=  ((RETRO_DEVICE_ID_JOYPAD_L+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_R1] |=  ((RETRO_DEVICE_ID_JOYPAD_R+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_L2] |=  ((RETRO_DEVICE_ID_JOYPAD_L2+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_R2] |=  ((RETRO_DEVICE_ID_JOYPAD_R2+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_THUMBL] |=  ((RETRO_DEVICE_ID_JOYPAD_L3+1)      << shift);
+            keycode_lut[AKEYCODE_BUTTON_THUMBR] |=  ((RETRO_DEVICE_ID_JOYPAD_R3+1)      << shift);
+            keycode_lut[AKEYCODE_MENU] |=  ((RETRO_DEVICE_ID_JOYPAD_START+1)      << shift);
+            break;
          case DEVICE_XPERIA_PLAY:
             g_settings.input.device[port] = device;
             strlcpy(g_settings.input.device_names[port], "Xperia Play",
diff --git a/android/native/jni/input_autodetect.c b/android/native/jni/input_autodetect.c
index c68a6e5c80..723a3df5fd 100644
--- a/android/native/jni/input_autodetect.c
+++ b/android/native/jni/input_autodetect.c
@@ -153,6 +153,8 @@ void input_autodetect_setup (void *data, char *msg, size_t sizeof_msg, unsigned
          device = DEVICE_MOGA;
       else if (strstr(name_buf, "Sony Navigation Controller"))
          device = DEVICE_PSMOVE_NAVI;
+      else if (strstr(name_buf, "OUYA Game Controller"))
+         device = DEVICE_OUYA;
       else if (strstr(name_buf, "adc joystick"))
          device = DEVICE_JXD_S7300B;
       else if (strstr(name_buf, "idroid:con"))
diff --git a/driver.h b/driver.h
index be4355bf04..998323bbda 100644
--- a/driver.h
+++ b/driver.h
@@ -261,6 +261,7 @@ enum input_devices
    DEVICE_SEGA_VIRTUA_STICK_HIGH_GRADE,
    DEVICE_CCPCREATIONS_WIIUSE_IME,
    DEVICE_KEYBOARD_RETROPAD,
+   DEVICE_OUYA,
 #elif defined(GEKKO)
    DEVICE_GAMECUBE = 0,
 #ifdef HW_RVL