Public class OuyaController decompiled

I am looking into how OUYA SDK (software development kit) filters out and maps OUYA controller buttons.
EDIT: 18.08.2025
There is remapping happening in Ouya framework apk also File name is button_remap.json from Ouya framework apk

So far I have used:
docs/unity.md at master · ouya/docs · GitHub

from there I have pinpoint file in:

Unity_OuyaSDK_Core_ODK_2_1_0_3\Assets\Plugins\Android\libs\ouya-sdk.jar

Viewing Contents of a JAR File
We’ll also see several GUI tools for viewing more detailed contents of a JAR file — for example, the Java source code.
Viewing Contents of a JAR File | Baeldung
I used Luyten exe program on Windows 11 Pro 64bit and extracted class:

Takeaway here is that OUYA buttons are hard coded integers of Android key events.
There is huge issue with using 3rd Party controllers with Ouya console. So far I have
learned Linux HID Descriptor maps on Linux kernel level any and generic gamepad buttons and axes. Then there is Android OS that use keylayout files to translate linux key codes to Android OS key events (Linux key codes are as BTN_ and integer like 100 while Android key events are BUTTON_ and in hexadecimal like 0x13c format.

In below code are java library class hard coded or fixed button numbers. If you use OUYA_SDK in Unity 3D program and build your Android apk file and run it on OUYA console or any Andorid based OS there is high chance that all Linux HID Descriptor and Android OS keylayout file button integers get checked against these hardcoded values to interpret any physical controller (gamepad) physical button presses. Because X-Box 360 inputs differ from these hard coded ones in class Andorid apk’s build with OuyaSDK never register “custom” 3rd Party controllers correctly even when you set everything correct in Andoroid keylayout files and somewhat look what Linux HID Descriptor maps generic gamepads. They are all interconnected but very broken on OUYA console.

package tv.ouya.console.api;

import android.net.*;
import tv.ouya.console.internal.hardware.controllerdata.*;
import android.util.*;
import tv.ouya.console.internal.hardware.*;
import android.graphics.drawable.*;
import android.content.res.*;
import tv.ouya.console.internal.a.*;
import java.io.*;
import android.view.*;
import android.content.*;
import android.graphics.*;
import android.os.*;

public class OuyaController
{
    public static final int BUTTON_O = 96;
    public static final int BUTTON_U = 99;
    public static final int BUTTON_Y = 100;
    public static final int BUTTON_A = 97;
    public static final int BUTTON_L1 = 102;
    @Deprecated
    public static final int BUTTON_L2 = 104;
    public static final int BUTTON_R1 = 103;
    @Deprecated
    public static final int BUTTON_R2 = 105;
    public static final int BUTTON_MENU = 82;
    public static final int BUTTON_HOME = 3;
    public static final int AXIS_LS_X = 0;
    public static final int AXIS_LS_Y = 1;
    public static final int AXIS_RS_X = 11;
    public static final int AXIS_RS_Y = 14;
    public static final int AXIS_L2 = 17;
    public static final int AXIS_R2 = 18;
    public static final int BUTTON_DPAD = 23;
    public static final int BUTTON_DPAD_UP = 19;
    public static final int BUTTON_DPAD_RIGHT = 22;
    public static final int BUTTON_DPAD_DOWN = 20;
    public static final int BUTTON_DPAD_LEFT = 21;
    public static final int BUTTON_R3 = 107;
    public static final int BUTTON_L3 = 106;
    private static int[] b;
    public static final int MAX_CONTROLLERS = 4;
    public static final float STICK_DEADZONE = 0.25f;
    private static final Uri c;
    private static Context d;
    private static ControllerServiceContentHelper e;
    private static Bundle f;
    private static SparseArray<ButtonData> g;
    static final OuyaController[] a;
    private int h;
    private InputDevice i;
    private String j;
    private SparseArray<Float> k;
    private SparseBooleanArray l;
    private SparseIntArray m;
    
    public static boolean isInitialized() {
        return OuyaController.d != null;
    }
    
    public static void init(final Context context) {
        if (OuyaController.d != null) {
            return;
        }
        OuyaController.d = context.getApplicationContext();
        OuyaController.e = new ControllerServiceContentHelper(OuyaController.d);
        a();
        final a a = new a();
        final IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("tv.ouya.controller.added");
        intentFilter.addAction("tv.ouya.controller.removed");
        OuyaController.d.registerReceiver((BroadcastReceiver)a, intentFilter);
    }
    
    static void a() {
        if (OuyaController.d != null) {
            for (int i = 0; i < 4; ++i) {
                final int b = b(i);
                if (b != -1) {
                    a(b);
                }
            }
        }
    }
    
    public static ButtonData getButtonData(final int ouyaButton) {
        if (!OuyaFacade.getInstance().isInitialized()) {
            Log.w("OuyaController", "OuyaFacade has not been initialized yet.  getButtonData() is not guaranteed to succeed.");
        }
        if (OuyaController.g != null) {
            final ButtonData buttonData = (ButtonData)OuyaController.g.get(ouyaButton);
            if (buttonData != null) {
                return buttonData;
            }
        }
        if (OuyaController.f == null) {
            OuyaController.f = a(OuyaController.d);
            if (OuyaController.f == null) {
                Log.e("OuyaController", "No data returned for ButtonData");
                return null;
            }
        }
        final String value = String.valueOf(ouyaButton);
        final ButtonData buttonData2 = new ButtonData(a(OuyaController.f, value), OuyaController.f.getString(value + "_name"));
        if (OuyaController.g == null) {
            OuyaController.g = (SparseArray<ButtonData>)new SparseArray();
        }
        OuyaController.g.put(ouyaButton, (Object)buttonData2);
        return buttonData2;
    }
    
    private static Bundle a(final Context context) {
        final ContentResolver contentResolver = context.getContentResolver();
        if (OuyaFacade.isOuyaFrameworkInstalled(context)) {
            try {
                return contentResolver.call(OuyaController.c, "get_button_images", (String)null, (Bundle)null);
            }
            catch (IllegalArgumentException ex) {
                Log.e("OuyaController", "Error querying button remapping");
                return null;
            }
        }
        return ControllerInfo.getButtonImagesForDevice();
    }
    
    private static Drawable a(final Bundle bundle, final String s) {
        Drawable drawable = null;
        try {
            final Object value = bundle.get(s);
            if (value instanceof AssetFileDescriptor) {
                drawable = Drawable.createFromStream((InputStream)((AssetFileDescriptor)value).createInputStream(), s);
            }
            else if (value instanceof Integer) {
                final InputStream b = tv.ouya.console.internal.a.a.b((int)value);
                try {
                    drawable = Drawable.createFromStream(b, s);
                }
                finally {
                    b.close();
                }
            }
        }
        catch (IOException ex) {
            Log.e("OuyaController", "IOException: " + ex.getMessage());
        }
        return drawable;
    }
    
    public static OuyaController getControllerByDeviceId(final int deviceId) {
        for (final OuyaController ouyaController : OuyaController.a) {
            if (ouyaController != null && ouyaController.getDeviceId() == deviceId) {
                return ouyaController;
            }
        }
        return null;
    }
    
    public static int getPlayerNumByDeviceId(final int deviceId) {
        final OuyaController a = a(deviceId);
        if (a == null) {
            return -1;
        }
        return a.getPlayerNum();
    }
    
    public static OuyaController getControllerByPlayer(final int playerNum) {
        if (playerNum >= 0 && playerNum < 4) {
            return OuyaController.a[playerNum];
        }
        return null;
    }
    
    public static boolean onGenericMotionEvent(final MotionEvent event) {
        if ((event.getSource() & 0x10) == 0x0) {
            return false;
        }
        if (event.getAction() != 2) {
            return false;
        }
        final OuyaController a = a(event.getDeviceId());
        if (a == null) {
            return false;
        }
        for (final int n : OuyaController.b) {
            final Float n2 = (Float)a.k.get(n);
            final float axisValue = event.getAxisValue(n);
            if (n2 == null || n2 != axisValue) {
                a.k.put(n, (Object)axisValue);
            }
        }
        return true;
    }
    
    public static boolean onKeyDown(final int keyCode, final KeyEvent event) {
        return a(keyCode, event);
    }
    
    public static boolean onKeyUp(final int keyCode, final KeyEvent event) {
        return a(keyCode, event);
    }
    
    private static boolean a(final int n, final KeyEvent keyEvent) {
        final OuyaController a = a(keyEvent.getDeviceId());
        if (a == null) {
            return false;
        }
        boolean b = false;
        switch (keyEvent.getAction()) {
            case 0:
            case 2: {
                b = true;
                break;
            }
            case 1: {
                b = false;
                break;
            }
        }
        final int keyCode = keyEvent.getKeyCode();
        if (a.l.indexOfKey(keyCode) < 0 || a.l.get(keyCode) != b) {
            a.m.put(keyCode, (b ? 1 : 2) | a.m.get(keyCode, 0));
        }
        a.l.put(keyCode, b);
        return true;
    }
    
    public static void startOfFrame() {
        for (final OuyaController ouyaController : OuyaController.a) {
            if (ouyaController != null) {
                ouyaController.b();
            }
        }
    }
    
    private void b() {
        if (this.m.size() > 0) {
            this.m.clear();
        }
    }
    
    public static void showCursor(final boolean showCursor) {
        OuyaController.d.sendBroadcast(new Intent(showCursor ? "tv.ouya.controller.action.SHOW_CURSOR" : "tv.ouya.controller.action.HIDE_CURSOR"));
    }
    
    public static void setCursorBitmap(final Bitmap bitmap, final float hotSpotX, final float hotSpotY) {
        final Intent intent = new Intent("tv.ouya.controller.action.SET_CURSOR_BITMAP");
        if (bitmap != null) {
            intent.putExtra("CURSOR_BITMAP", (Parcelable)bitmap);
            intent.putExtra("HOTSPOT_X", hotSpotX);
            intent.putExtra("HOTSPOT_Y", hotSpotY);
        }
        OuyaController.d.sendBroadcast(intent);
    }
    
    public boolean buttonChangedThisFrame(final int ouyaButton) {
        return this.m.indexOfKey(ouyaButton) >= 0;
    }
    
    public boolean buttonPressedThisFrame(final int ouyaButton) {
        return this.buttonChangedThisFrame(ouyaButton) && (this.m.get(ouyaButton) & 0x1) != 0x0;
    }
    
    public boolean buttonReleasedThisFrame(final int ouyaButton) {
        return this.buttonChangedThisFrame(ouyaButton) && (this.m.get(ouyaButton) & 0x2) != 0x0;
    }
    
    public InputDevice getDevice() {
        return this.i;
    }
    
    public String getDeviceName() {
        return this.j;
    }
    
    public int getDeviceId() {
        return this.h;
    }
    
    public float getAxisValue(final int ouyaAxis) {
        if (this.k.indexOfKey(ouyaAxis) >= 0) {
            return (float)this.k.get(ouyaAxis);
        }
        return 0.0f;
    }
    
    public boolean getButton(final int ouyaButton) {
        return this.l.indexOfKey(ouyaButton) >= 0 && this.l.get(ouyaButton);
    }
    
    public int getPlayerNum() {
        for (int i = 0; i < 4; ++i) {
            if (OuyaController.a[i] == this) {
                return i;
            }
        }
        return -1;
    }
    
    private static OuyaController a(final int n) {
        final OuyaController controllerByDeviceId = getControllerByDeviceId(n);
        if (controllerByDeviceId != null) {
            return controllerByDeviceId;
        }
        final int c = c(n);
        if (c < 0 || c >= 4) {
            return null;
        }
        if (OuyaController.a[c] != null) {
            Log.e("OuyaController", "Controller for player " + c + " already found, but doesn't match device id " + "(expected " + n + " got " + OuyaController.a[c].getDeviceId() + ")");
            return OuyaController.a[c];
        }
        if (n < 0) {
            Log.e("OuyaController", "Adding device with invalid id!  Player " + c + " device id " + n);
        }
        return OuyaController.a[c] = new OuyaController(n);
    }
    
    private static int b(final int playerId) {
        return OuyaController.e.getDeviceIdForPlayer(playerId);
    }
    
    private static int c(final int inputDeviceId) {
        if (OuyaController.d == null) {
            return -1;
        }
        return OuyaController.e.getPlayerIdByInputDevice(inputDeviceId);
    }
    
    private static String d(final int deviceId) {
        if (OuyaController.d == null) {
            return null;
        }
        String bluetoothName = null;
        final ControllerServiceContentHelper.BluetoothInfoByAddress bluetoothInfoByInputDevice = OuyaController.e.getBluetoothInfoByInputDevice(deviceId);
        if (bluetoothInfoByInputDevice != null) {
            bluetoothName = bluetoothInfoByInputDevice.bluetoothName;
        }
        return bluetoothName;
    }
    
    OuyaController(final int deviceId) {
        this.h = deviceId;
        this.i = InputDevice.getDevice(deviceId);
        this.k = (SparseArray<Float>)new SparseArray();
        this.l = new SparseBooleanArray();
        this.m = new SparseIntArray();
        this.j = d(deviceId);
        if ((this.j == null || this.j.isEmpty()) && this.i != null) {
            this.j = this.i.getName();
        }
    }
    
    static {
        OuyaController.b = new int[] { 0, 1, 11, 14, 17, 18 };
        c = Uri.parse("content://tv.ouya.controllerdata/");
        OuyaController.f = null;
        OuyaController.g = null;
        a = new OuyaController[4];
    }
    
    private static class a extends BroadcastReceiver
    {
        public void onReceive(final Context context, final Intent intent) {
            if (intent.getAction().equals("tv.ouya.controller.added")) {
                final int intExtra = intent.getIntExtra("DEVICE_ID", -1);
                final int intExtra2 = intent.getIntExtra("PLAYER_NUM", -1);
                if (intExtra2 < 0 || intExtra2 >= 4) {
                    return;
                }
                if (OuyaController.a[intExtra2] != null) {
                    Log.e("OuyaController", "Controller already exists for player " + intExtra2 + " (new device id " + intExtra + ", prev device id " + OuyaController.a[intExtra2].getDeviceId() + ")");
                }
                if (intExtra < 0) {
                    Log.e("OuyaController", "Adding device with invalid id!  Player " + intExtra2 + " device id " + intExtra);
                }
                OuyaController.a[intExtra2] = new OuyaController(intExtra);
            }
            else if (intent.getAction().equals("tv.ouya.controller.removed")) {
                final int intExtra3 = intent.getIntExtra("DEVICE_ID", -1);
                for (int i = 0; i < 4; ++i) {
                    final OuyaController ouyaController = OuyaController.a[i];
                    if (ouyaController != null && ouyaController.getDeviceId() == intExtra3) {
                        OuyaController.a[i] = null;
                        break;
                    }
                }
            }
        }
    }
    
    public static class ButtonData implements Cloneable
    {
        public Drawable buttonDrawable;
        public String buttonName;
        
        ButtonData(final Drawable buttonDrawable, final String buttonName) {
            this.buttonDrawable = buttonDrawable;
            this.buttonName = buttonName;
        }
        
        public ButtonData clone() {
            return new ButtonData((this.buttonDrawable == null) ? null : this.buttonDrawable.getConstantState().newDrawable(), this.buttonName);
        }
    }
}

Newer version shows how updated version of this Java class is being used. Note hardcoded axis values:

I am interested how exactly deep inside Android OS axis info is got Microsoft Copilot answer:
To retrieve the current value of a gamepad axis in Android, you can use the getAxisValue() method from the MotionEvent class. This method allows you to determine the position of a joystick or other analog input on a game controller.

Here’s an example of how to use it:

Copy code

@Override
public boolean onGenericMotionEvent(MotionEvent event) {
    // Check if the event is from a game controller
    if ((event.getSource() & InputDevice.SOURCE_JOYSTICK) == InputDevice.SOURCE_JOYSTICK &&
        event.getAction() == MotionEvent.ACTION_MOVE) {

        // Get the X and Y axis values for the left joystick
        float xAxis = event.getAxisValue(MotionEvent.AXIS_X);
        float yAxis = event.getAxisValue(MotionEvent.AXIS_Y);

        // Process the axis values (e.g., move a character or camera)
        handleJoystickInput(xAxis, yAxis);
        return true;
    }
    return super.onGenericMotionEvent(event);
}

private void handleJoystickInput(float x, float y) {
    // Example: Log the joystick values
    Log.d("JoystickInput", "X: " + x + ", Y: " + y);
}

Key Points:

  1. Source Check: Ensure the event source is a joystick (InputDevice.SOURCE_JOYSTICK).
  2. Axis Constants: Use predefined constants like MotionEvent.AXIS_X, MotionEvent.AXIS_Y, etc., to specify which axis value to retrieve.
  3. Action Check: Handle only MotionEvent.ACTION_MOVE to process axis changes.

This approach works for Android API level 12 (Android 3.1) and above. You can also explore other axes like AXIS_Z, AXIS_RZ, or triggers (AXIS_LTRIGGER, AXIS_RTRIGGER) depending on your game controller’s capabilities.

My fonding again, Android OS axis development info (There is mentioned AXIS_Z as a second / right joystick real value):
https://developer.android.com/reference/android/view/MotionEvent#AXIS_Z

On Android OS Axis constant: Z axis of a motion event.

  • For a joystick, reports the absolute Z position of the joystick. The value is normalized to a range from -1.0 (high) to 1.0 (low). On game pads with two analog joysticks, this axis is often reinterpreted to report the absolute X position of the second joystick instead.

Android OS axis_RZ (R stands for right side)
Axis constant: RZ Rotation axis of a motion event.

  • For a joystick, reports the absolute rotation angle about the RZ axis. The value is normalized to a range from -1.0 (counter-clockwise) to 1.0 (clockwise).On game pads with two analog joysticks, this axis is often reinterpreted to report the absolute Y position of the second joystick instead.
    MotionEvent  |  API reference  |  Android Developers

https://developer.android.com/reference/android/view/MotionEvent#device-types
On Android OS:
Some common joystick axes are AXIS_X , AXIS_Y ,AXIS_HAT_X , AXIS_HAT_Y , AXIS_Z and AXIS_RZ .

This tutorial creates a virtual controller using OUYA-Everywhere input.

Unity docs -

This is OuyaController class in tv.ouya.console apk. It is ProGuard obfuscated against editing: class name is l (lower case L) and path would be tv.ouya.console.api.l. You can see some familiar constants as hard coded axis values and error messages:

private static int[] b = {0, 1, 11, 14, 17, 18};

and

                Log.e("OuyaController", "Error querying button remapping");

this is JAVA pseudo code with errors because ProGuard does it job well.
If we can find all hard coded Ouya controller constants and change them for 3rd party controllers I think it is possible to make working many new controllers for Ouya, it would be like RetroArch controller input detection.

package tv.ouya.console.api;

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
import java.io.FileInputStream;
import java.io.IOException;

public class l {

    /* renamed from: a  reason: collision with root package name */
    static final l[] f396a = new l[4];
    private static int[] b = {0, 1, 11, 14, 17, 18};
    private static final Uri c = Uri.parse("content://tv.ouya.controllerdata/");
    private static Context d;
    private static Bundle e = null;
    private static SparseArray f = null;
    private int g;
    private InputDevice h;
    private String i;
    private SparseArray j = new SparseArray();
    private SparseBooleanArray k = new SparseBooleanArray();
    private SparseIntArray l = new SparseIntArray();

    public static void a(Context context) {
        if (d == null) {
            d = context.getApplicationContext();
            for (int i2 = 0; i2 < 4; i2++) {
                int f2 = f(i2);
                if (f2 != -1) {
                    e(f2);
                }
            }
            m mVar = new m();
            IntentFilter intentFilter = new IntentFilter();
            intentFilter.addAction("tv.ouya.controller.added");
            intentFilter.addAction("tv.ouya.controller.removed");
            d.registerReceiver(mVar, intentFilter);
        }
    }

    public static n a(int i2) {
        Drawable drawable;
        FileInputStream fileInputStream;
        n nVar;
        if (f != null && (nVar = (n) f.get(i2)) != null) {
            return nVar;
        }
        if (e == null) {
            try {
                e = d.getContentResolver().call(c, "get_button_images", (String) null, (Bundle) null);
            } catch (IllegalArgumentException e2) {
                Log.e("OuyaController", "Error querying button remapping");
                return null;
            }
        }
        String valueOf = String.valueOf(i2);
        try {
            AssetFileDescriptor assetFileDescriptor = (AssetFileDescriptor) e.get(valueOf);
            if (assetFileDescriptor != null) {
                fileInputStream = assetFileDescriptor.createInputStream();
            } else {
                fileInputStream = null;
            }
            drawable = Drawable.createFromStream(fileInputStream, valueOf);
        } catch (IOException e3) {
            Log.e("OuyaController", "IOException: " + e3.getMessage());
            drawable = null;
        }
        n nVar2 = new n(drawable, e.getString(valueOf + "_name"));
        if (f == null) {
            f = new SparseArray();
        }
        f.put(i2, nVar2);
        return nVar2;
    }

    public static l b(int i2) {
        for (l lVar : f396a) {
            if (lVar != null && lVar.c() == i2) {
                return lVar;
            }
        }
        return null;
    }

    public static int c(int i2) {
        l e2 = e(i2);
        if (e2 == null) {
            return -1;
        }
        return e2.d();
    }

    public static l d(int i2) {
        if (i2 < 0 || i2 >= 4) {
            return null;
        }
        return f396a[i2];
    }

    public static boolean a(MotionEvent motionEvent) {
        l e2;
        if ((motionEvent.getSource() & 16) == 0 || motionEvent.getAction() != 2 || (e2 = e(motionEvent.getDeviceId())) == null) {
            return false;
        }
        for (int i2 : b) {
            Float f2 = (Float) e2.j.get(i2);
            float axisValue = motionEvent.getAxisValue(i2);
            if (f2 == null || f2.floatValue() != axisValue) {
                e2.j.put(i2, Float.valueOf(axisValue));
            }
        }
        return true;
    }

    public static boolean a(int i2, KeyEvent keyEvent) {
        return c(i2, keyEvent);
    }

    public static boolean b(int i2, KeyEvent keyEvent) {
        return c(i2, keyEvent);
    }

    private static boolean c(int i2, KeyEvent keyEvent) {
        boolean z;
        l e2 = e(keyEvent.getDeviceId());
        if (e2 == null) {
            return false;
        }
        switch (keyEvent.getAction()) {
            case 0:
            case 2:
                z = true;
                break;
            case 1:
                z = false;
                break;
            default:
                z = false;
                break;
        }
        int keyCode = keyEvent.getKeyCode();
        if (e2.k.indexOfKey(keyCode) < 0 || e2.k.get(keyCode) != z) {
            e2.l.put(keyCode, e2.l.get(keyCode, 0) | (z ? 1 : 2));
        }
        e2.k.put(keyCode, z);
        return true;
    }

    public static void a(boolean z) {
        d.sendBroadcast(new Intent(z ? "tv.ouya.controller.action.SHOW_CURSOR" : "tv.ouya.controller.action.HIDE_CURSOR"));
    }

    public static void a(Bitmap bitmap, float f2, float f3) {
        Intent intent = new Intent("tv.ouya.controller.action.SET_CURSOR_BITMAP");
        if (bitmap != null) {
            intent.putExtra("CURSOR_BITMAP", bitmap);
            intent.putExtra("HOTSPOT_X", f2);
            intent.putExtra("HOTSPOT_Y", f3);
        }
        d.sendBroadcast(intent);
    }

    public InputDevice a() {
        return this.h;
    }

    public String b() {
        return this.i;
    }

    public int c() {
        return this.g;
    }

    public int d() {
        for (int i2 = 0; i2 < 4; i2++) {
            if (f396a[i2] == this) {
                return i2;
            }
        }
        return -1;
    }

    private static l e(int i2) {
        l b2 = b(i2);
        if (b2 != null) {
            return b2;
        }
        int g2 = g(i2);
        if (g2 < 0 || g2 >= 4) {
            return null;
        }
        if (f396a[g2] != null) {
            Log.e("OuyaController", "Controller for player " + g2 + " already found, but doesn't match device id " + "(expected " + i2 + " got " + f396a[g2].c() + ")");
            return f396a[g2];
        }
        if (i2 < 0) {
            Log.e("OuyaController", "Adding device with invalid id!  Player " + g2 + " device id " + i2);
        }
        f396a[g2] = new l(i2);
        return f396a[g2];
    }

    private static int f(int i2) {
        Cursor query = d.getContentResolver().query(c, new String[]{"input_device_id"}, "player_num = ?", new String[]{String.valueOf(i2)}, (String) null);
        if (query != null) {
            try {
                if (query.moveToNext()) {
                    int i3 = query.getInt(0);
                }
            } finally {
                if (query != null) {
                    query.close();
                }
            }
        }
        if (query != null) {
            query.close();
        }
        return -1;
    }

    private static int g(int i2) {
        if (d == null) {
            return -1;
        }
        Cursor query = d.getContentResolver().query(c, new String[]{"player_num"}, "input_device_id = ?", new String[]{String.valueOf(i2)}, (String) null);
        if (query != null) {
            try {
                if (query.moveToNext()) {
                    int i3 = query.getInt(0);
                }
            } finally {
                if (query != null) {
                    query.close();
                }
            }
        }
        if (query != null) {
            query.close();
        }
        return -1;
    }

    /* JADX WARNING: Removed duplicated region for block: B:12:0x0038 A[SYNTHETIC, Splitter:B:12:0x0038] */
    /* JADX WARNING: Removed duplicated region for block: B:28:? A[RETURN, SYNTHETIC] */
    /* Code decompiled incorrectly, please refer to instructions dump. */
    private static java.lang.String h(int r8) {
        /*
            r6 = 0
            android.content.Context r0 = d
            if (r0 != 0) goto L_0x0007
            r0 = r6
        L_0x0006:
            return r0
        L_0x0007:
            android.content.Context r0 = d     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            android.content.ContentResolver r0 = r0.getContentResolver()     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            android.net.Uri r1 = c     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            r2 = 1
            java.lang.String[] r2 = new java.lang.String[r2]     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            r3 = 0
            java.lang.String r4 = "bt_name"
            r2[r3] = r4     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            java.lang.String r3 = "input_device_id = ?"
            r4 = 1
            java.lang.String[] r4 = new java.lang.String[r4]     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            r5 = 0
            java.lang.String r7 = java.lang.String.valueOf(r8)     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            r4[r5] = r7     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            r5 = 0
            android.database.Cursor r1 = r0.query(r1, r2, r3, r4, r5)     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
            if (r1 == 0) goto L_0x006a
            boolean r0 = r1.moveToNext()     // Catch:{ all -> 0x003e }
            if (r0 == 0) goto L_0x006a
            r0 = 0
            java.lang.String r6 = r1.getString(r0)     // Catch:{ all -> 0x003e }
            r0 = r6
        L_0x0036:
            if (r1 == 0) goto L_0x0006
            r1.close()     // Catch:{ SQLiteException -> 0x003c, Exception -> 0x0068 }
            goto L_0x0006
        L_0x003c:
            r1 = move-exception
            goto L_0x0006
        L_0x003e:
            r0 = move-exception
            if (r1 == 0) goto L_0x0044
            r1.close()     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
        L_0x0044:
            throw r0     // Catch:{ SQLiteException -> 0x0045, Exception -> 0x0048 }
        L_0x0045:
            r0 = move-exception
            r0 = r6
            goto L_0x0006
        L_0x0048:
            r0 = move-exception
            r1 = r0
            r0 = r6
        L_0x004b:
            java.lang.String r2 = "OuyaController"
            java.lang.StringBuilder r3 = new java.lang.StringBuilder
            r3.<init>()
            java.lang.String r4 = "Exception: "
            java.lang.StringBuilder r3 = r3.append(r4)
            java.lang.String r1 = r1.getMessage()
            java.lang.StringBuilder r1 = r3.append(r1)
            java.lang.String r1 = r1.toString()
            android.util.Log.d(r2, r1)
            goto L_0x0006
        L_0x0068:
            r1 = move-exception
            goto L_0x004b
        L_0x006a:
            r0 = r6
            goto L_0x0036
        */
        throw new UnsupportedOperationException("Method not decompiled: tv.ouya.console.api.l.h(int):java.lang.String");
    }

    l(int i2) {
        this.g = i2;
        this.h = InputDevice.getDevice(i2);
        this.i = h(i2);
        if ((this.i == null || this.i.isEmpty()) && this.h != null) {
            this.i = this.h.getName();
        }
    }
}

Same thing as smali (that java virtual machine reads directly and is valid, means without errors):
here you can see Ouya controller axis1 00, 01 and axis2 03, 04 and LT RT axis 02, 05

    .line 150
    nop

    :array_0
    .array-data 4
        0x0
        0x1
        0xb
        0xe
        0x11
        0x12
    .end array-data
.end method
.class public Ltv/ouya/console/api/l;
.super Ljava/lang/Object;
.source "SourceFile"


# static fields
.field static final a:[Ltv/ouya/console/api/l;

.field private static b:[I

.field private static final c:Landroid/net/Uri;

.field private static d:Landroid/content/Context;

.field private static e:Landroid/os/Bundle;

.field private static f:Landroid/util/SparseArray;


# instance fields
.field private g:I

.field private h:Landroid/view/InputDevice;

.field private i:Ljava/lang/String;

.field private j:Landroid/util/SparseArray;

.field private k:Landroid/util/SparseBooleanArray;

.field private l:Landroid/util/SparseIntArray;


# direct methods
.method static constructor <clinit>()V
    .locals 2

    .prologue
    const/4 v1, 0x0

    .line 150
    const/4 v0, 0x6

    new-array v0, v0, [I

    fill-array-data v0, :array_0

    sput-object v0, Ltv/ouya/console/api/l;->b:[I

    .line 168
    const-string v0, "content://tv.ouya.controllerdata/"

    invoke-static {v0}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;

    move-result-object v0

    sput-object v0, Ltv/ouya/console/api/l;->c:Landroid/net/Uri;

    .line 246
    sput-object v1, Ltv/ouya/console/api/l;->e:Landroid/os/Bundle;

    .line 247
    sput-object v1, Ltv/ouya/console/api/l;->f:Landroid/util/SparseArray;

    .line 523
    const/4 v0, 0x4

    new-array v0, v0, [Ltv/ouya/console/api/l;

    sput-object v0, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    return-void

    .line 150
    nop

    :array_0
    .array-data 4
        0x0
        0x1
        0xb
        0xe
        0x11
        0x12
    .end array-data
.end method

.method constructor <init>(I)V
    .locals 1

    .prologue
    .line 635
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 636
    iput p1, p0, Ltv/ouya/console/api/l;->g:I

    .line 637
    invoke-static {p1}, Landroid/view/InputDevice;->getDevice(I)Landroid/view/InputDevice;

    move-result-object v0

    iput-object v0, p0, Ltv/ouya/console/api/l;->h:Landroid/view/InputDevice;

    .line 638
    new-instance v0, Landroid/util/SparseArray;

    invoke-direct {v0}, Landroid/util/SparseArray;-><init>()V

    iput-object v0, p0, Ltv/ouya/console/api/l;->j:Landroid/util/SparseArray;

    .line 639
    new-instance v0, Landroid/util/SparseBooleanArray;

    invoke-direct {v0}, Landroid/util/SparseBooleanArray;-><init>()V

    iput-object v0, p0, Ltv/ouya/console/api/l;->k:Landroid/util/SparseBooleanArray;

    .line 640
    new-instance v0, Landroid/util/SparseIntArray;

    invoke-direct {v0}, Landroid/util/SparseIntArray;-><init>()V

    iput-object v0, p0, Ltv/ouya/console/api/l;->l:Landroid/util/SparseIntArray;

    .line 642
    invoke-static {p1}, Ltv/ouya/console/api/l;->h(I)Ljava/lang/String;

    move-result-object v0

    iput-object v0, p0, Ltv/ouya/console/api/l;->i:Ljava/lang/String;

    .line 643
    iget-object v0, p0, Ltv/ouya/console/api/l;->i:Ljava/lang/String;

    if-eqz v0, :cond_0

    iget-object v0, p0, Ltv/ouya/console/api/l;->i:Ljava/lang/String;

    invoke-virtual {v0}, Ljava/lang/String;->isEmpty()Z

    move-result v0

    if-eqz v0, :cond_1

    .line 644
    :cond_0
    iget-object v0, p0, Ltv/ouya/console/api/l;->h:Landroid/view/InputDevice;

    if-eqz v0, :cond_1

    .line 645
    iget-object v0, p0, Ltv/ouya/console/api/l;->h:Landroid/view/InputDevice;

    invoke-virtual {v0}, Landroid/view/InputDevice;->getName()Ljava/lang/String;

    move-result-object v0

    iput-object v0, p0, Ltv/ouya/console/api/l;->i:Ljava/lang/String;

    .line 648
    :cond_1
    return-void
.end method

.method public static a(I)Ltv/ouya/console/api/n;
    .locals 6

    .prologue
    const/4 v1, 0x0

    .line 258
    sget-object v0, Ltv/ouya/console/api/l;->f:Landroid/util/SparseArray;

    if-eqz v0, :cond_0

    .line 259
    sget-object v0, Ltv/ouya/console/api/l;->f:Landroid/util/SparseArray;

    invoke-virtual {v0, p0}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ltv/ouya/console/api/n;

    .line 260
    if-eqz v0, :cond_0

    .line 293
    :goto_0
    return-object v0

    .line 265
    :cond_0
    sget-object v0, Ltv/ouya/console/api/l;->e:Landroid/os/Bundle;

    if-nez v0, :cond_1

    .line 266
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    invoke-virtual {v0}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;

    move-result-object v0

    .line 268
    :try_start_0
    sget-object v2, Ltv/ouya/console/api/l;->c:Landroid/net/Uri;

    const-string v3, "get_button_images"

    const/4 v4, 0x0

    const/4 v5, 0x0

    invoke-virtual {v0, v2, v3, v4, v5}, Landroid/content/ContentResolver;->call(Landroid/net/Uri;Ljava/lang/String;Ljava/lang/String;Landroid/os/Bundle;)Landroid/os/Bundle;

    move-result-object v0

    sput-object v0, Ltv/ouya/console/api/l;->e:Landroid/os/Bundle;
    :try_end_0
    .catch Ljava/lang/IllegalArgumentException; {:try_start_0 .. :try_end_0} :catch_0

    .line 275
    :cond_1
    invoke-static {p0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;

    move-result-object v2

    .line 278
    :try_start_1
    sget-object v0, Ltv/ouya/console/api/l;->e:Landroid/os/Bundle;

    invoke-virtual {v0, v2}, Landroid/os/Bundle;->get(Ljava/lang/String;)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Landroid/content/res/AssetFileDescriptor;

    .line 279
    if-eqz v0, :cond_3

    invoke-virtual {v0}, Landroid/content/res/AssetFileDescriptor;->createInputStream()Ljava/io/FileInputStream;

    move-result-object v0

    .line 280
    :goto_1
    invoke-static {v0, v2}, Landroid/graphics/drawable/Drawable;->createFromStream(Ljava/io/InputStream;Ljava/lang/String;)Landroid/graphics/drawable/Drawable;
    :try_end_1
    .catch Ljava/io/IOException; {:try_start_1 .. :try_end_1} :catch_1

    move-result-object v0

    .line 284
    :goto_2
    sget-object v1, Ltv/ouya/console/api/l;->e:Landroid/os/Bundle;

    new-instance v3, Ljava/lang/StringBuilder;

    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V

    invoke-virtual {v3, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    const-string v3, "_name"

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-virtual {v1, v2}, Landroid/os/Bundle;->getString(Ljava/lang/String;)Ljava/lang/String;

    move-result-object v2

    .line 286
    new-instance v1, Ltv/ouya/console/api/n;

    invoke-direct {v1, v0, v2}, Ltv/ouya/console/api/n;-><init>(Landroid/graphics/drawable/Drawable;Ljava/lang/String;)V

    .line 288
    sget-object v0, Ltv/ouya/console/api/l;->f:Landroid/util/SparseArray;

    if-nez v0, :cond_2

    .line 289
    new-instance v0, Landroid/util/SparseArray;

    invoke-direct {v0}, Landroid/util/SparseArray;-><init>()V

    sput-object v0, Ltv/ouya/console/api/l;->f:Landroid/util/SparseArray;

    .line 291
    :cond_2
    sget-object v0, Ltv/ouya/console/api/l;->f:Landroid/util/SparseArray;

    invoke-virtual {v0, p0, v1}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V

    move-object v0, v1

    .line 293
    goto :goto_0

    .line 269
    :catch_0
    move-exception v0

    .line 270
    const-string v0, "OuyaController"

    const-string v2, "Error querying button remapping"

    invoke-static {v0, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

    move-object v0, v1

    .line 271
    goto :goto_0

    :cond_3
    move-object v0, v1

    .line 279
    goto :goto_1

    .line 281
    :catch_1
    move-exception v0

    .line 282
    const-string v3, "OuyaController"

    new-instance v4, Ljava/lang/StringBuilder;

    invoke-direct {v4}, Ljava/lang/StringBuilder;-><init>()V

    const-string v5, "IOException: "

    invoke-virtual {v4, v5}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v4

    invoke-virtual {v0}, Ljava/io/IOException;->getMessage()Ljava/lang/String;

    move-result-object v0

    invoke-virtual {v4, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v0

    invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v0

    invoke-static {v3, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

    move-object v0, v1

    goto :goto_2
.end method

.method public static a(Landroid/content/Context;)V
    .locals 3

    .prologue
    .line 172
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    if-eqz v0, :cond_0

    .line 226
    :goto_0
    return-void

    .line 177
    :cond_0
    invoke-virtual {p0}, Landroid/content/Context;->getApplicationContext()Landroid/content/Context;

    move-result-object v0

    sput-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    .line 179
    const/4 v0, 0x0

    :goto_1
    const/4 v1, 0x4

    if-ge v0, v1, :cond_2

    .line 180
    invoke-static {v0}, Ltv/ouya/console/api/l;->f(I)I

    move-result v1

    .line 181
    const/4 v2, -0x1

    if-eq v1, v2, :cond_1

    .line 182
    invoke-static {v1}, Ltv/ouya/console/api/l;->e(I)Ltv/ouya/console/api/l;

    .line 179
    :cond_1
    add-int/lit8 v0, v0, 0x1

    goto :goto_1

    .line 186
    :cond_2
    new-instance v0, Ltv/ouya/console/api/m;

    invoke-direct {v0}, Ltv/ouya/console/api/m;-><init>()V

    .line 222
    new-instance v1, Landroid/content/IntentFilter;

    invoke-direct {v1}, Landroid/content/IntentFilter;-><init>()V

    .line 223
    const-string v2, "tv.ouya.controller.added"

    invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V

    .line 224
    const-string v2, "tv.ouya.controller.removed"

    invoke-virtual {v1, v2}, Landroid/content/IntentFilter;->addAction(Ljava/lang/String;)V

    .line 225
    sget-object v2, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    invoke-virtual {v2, v0, v1}, Landroid/content/Context;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent;

    goto :goto_0
.end method

.method public static a(Landroid/graphics/Bitmap;FF)V
    .locals 2

    .prologue
    .line 433
    const-string v0, "tv.ouya.controller.action.SET_CURSOR_BITMAP"

    .line 434
    const-string v0, "CURSOR_BITMAP"

    .line 435
    const-string v0, "HOTSPOT_X"

    .line 436
    const-string v0, "HOTSPOT_Y"

    .line 437
    new-instance v0, Landroid/content/Intent;

    const-string v1, "tv.ouya.controller.action.SET_CURSOR_BITMAP"

    invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

    .line 438
    if-eqz p0, :cond_0

    .line 439
    const-string v1, "CURSOR_BITMAP"

    invoke-virtual {v0, v1, p0}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Landroid/os/Parcelable;)Landroid/content/Intent;

    .line 440
    const-string v1, "HOTSPOT_X"

    invoke-virtual {v0, v1, p1}, Landroid/content/Intent;->putExtra(Ljava/lang/String;F)Landroid/content/Intent;

    .line 441
    const-string v1, "HOTSPOT_Y"

    invoke-virtual {v0, v1, p2}, Landroid/content/Intent;->putExtra(Ljava/lang/String;F)Landroid/content/Intent;

    .line 443
    :cond_0
    sget-object v1, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    invoke-virtual {v1, v0}, Landroid/content/Context;->sendBroadcast(Landroid/content/Intent;)V

    .line 444
    return-void
.end method

.method public static a(Z)V
    .locals 2

    .prologue
    .line 420
    const-string v0, "tv.ouya.controller.action.HIDE_CURSOR"

    .line 421
    const-string v0, "tv.ouya.controller.action.SHOW_CURSOR"

    .line 422
    new-instance v1, Landroid/content/Intent;

    if-eqz p0, :cond_0

    const-string v0, "tv.ouya.controller.action.SHOW_CURSOR"

    :goto_0
    invoke-direct {v1, v0}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

    .line 423
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    invoke-virtual {v0, v1}, Landroid/content/Context;->sendBroadcast(Landroid/content/Intent;)V

    .line 424
    return-void

    .line 422
    :cond_0
    const-string v0, "tv.ouya.controller.action.HIDE_CURSOR"

    goto :goto_0
.end method

.method public static a(ILandroid/view/KeyEvent;)Z
    .locals 1

    .prologue
    .line 363
    invoke-static {p0, p1}, Ltv/ouya/console/api/l;->c(ILandroid/view/KeyEvent;)Z

    move-result v0

    return v0
.end method

.method public static a(Landroid/view/MotionEvent;)Z
    .locals 7

    .prologue
    const/4 v0, 0x0

    .line 335
    invoke-virtual {p0}, Landroid/view/MotionEvent;->getSource()I

    move-result v1

    and-int/lit8 v1, v1, 0x10

    if-nez v1, :cond_1

    .line 357
    :cond_0
    :goto_0
    return v0

    .line 339
    :cond_1
    invoke-virtual {p0}, Landroid/view/MotionEvent;->getAction()I

    move-result v1

    const/4 v2, 0x2

    if-ne v1, v2, :cond_0

    .line 343
    invoke-virtual {p0}, Landroid/view/MotionEvent;->getDeviceId()I

    move-result v1

    invoke-static {v1}, Ltv/ouya/console/api/l;->e(I)Ltv/ouya/console/api/l;

    move-result-object v2

    .line 344
    if-eqz v2, :cond_0

    .line 349
    sget-object v3, Ltv/ouya/console/api/l;->b:[I

    array-length v4, v3

    move v1, v0

    :goto_1
    if-ge v1, v4, :cond_4

    aget v5, v3, v1

    .line 350
    iget-object v0, v2, Ltv/ouya/console/api/l;->j:Landroid/util/SparseArray;

    invoke-virtual {v0, v5}, Landroid/util/SparseArray;->get(I)Ljava/lang/Object;

    move-result-object v0

    check-cast v0, Ljava/lang/Float;

    .line 351
    invoke-virtual {p0, v5}, Landroid/view/MotionEvent;->getAxisValue(I)F

    move-result v6

    .line 352
    if-eqz v0, :cond_2

    invoke-virtual {v0}, Ljava/lang/Float;->floatValue()F

    move-result v0

    cmpl-float v0, v0, v6

    if-eqz v0, :cond_3

    .line 353
    :cond_2
    iget-object v0, v2, Ltv/ouya/console/api/l;->j:Landroid/util/SparseArray;

    invoke-static {v6}, Ljava/lang/Float;->valueOf(F)Ljava/lang/Float;

    move-result-object v6

    invoke-virtual {v0, v5, v6}, Landroid/util/SparseArray;->put(ILjava/lang/Object;)V

    .line 349
    :cond_3
    add-int/lit8 v0, v1, 0x1

    move v1, v0

    goto :goto_1

    .line 357
    :cond_4
    const/4 v0, 0x1

    goto :goto_0
.end method

.method public static b(I)Ltv/ouya/console/api/l;
    .locals 5

    .prologue
    .line 300
    sget-object v2, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    array-length v3, v2

    const/4 v0, 0x0

    move v1, v0

    :goto_0
    if-ge v1, v3, :cond_1

    aget-object v0, v2, v1

    .line 301
    if-eqz v0, :cond_0

    invoke-virtual {v0}, Ltv/ouya/console/api/l;->c()I

    move-result v4

    if-ne v4, p0, :cond_0

    .line 305
    :goto_1
    return-object v0

    .line 300
    :cond_0
    add-int/lit8 v0, v1, 0x1

    move v1, v0

    goto :goto_0

    .line 305
    :cond_1
    const/4 v0, 0x0

    goto :goto_1
.end method

.method public static b(ILandroid/view/KeyEvent;)Z
    .locals 1

    .prologue
    .line 369
    invoke-static {p0, p1}, Ltv/ouya/console/api/l;->c(ILandroid/view/KeyEvent;)Z

    move-result v0

    return v0
.end method

.method public static c(I)I
    .locals 1

    .prologue
    .line 313
    invoke-static {p0}, Ltv/ouya/console/api/l;->e(I)Ltv/ouya/console/api/l;

    move-result-object v0

    .line 315
    if-nez v0, :cond_0

    .line 316
    const/4 v0, -0x1

    .line 318
    :goto_0
    return v0

    :cond_0
    invoke-virtual {v0}, Ltv/ouya/console/api/l;->d()I

    move-result v0

    goto :goto_0
.end method

.method private static c(ILandroid/view/KeyEvent;)Z
    .locals 7

    .prologue
    const/4 v1, 0x1

    const/4 v2, 0x0

    .line 372
    invoke-virtual {p1}, Landroid/view/KeyEvent;->getDeviceId()I

    move-result v0

    invoke-static {v0}, Ltv/ouya/console/api/l;->e(I)Ltv/ouya/console/api/l;

    move-result-object v4

    .line 373
    if-nez v4, :cond_0

    .line 394
    :goto_0
    return v2

    .line 377
    :cond_0
    invoke-virtual {p1}, Landroid/view/KeyEvent;->getAction()I

    move-result v0

    packed-switch v0, :pswitch_data_0

    move v0, v2

    .line 387
    :goto_1
    invoke-virtual {p1}, Landroid/view/KeyEvent;->getKeyCode()I

    move-result v5

    .line 388
    iget-object v3, v4, Ltv/ouya/console/api/l;->k:Landroid/util/SparseBooleanArray;

    invoke-virtual {v3, v5}, Landroid/util/SparseBooleanArray;->indexOfKey(I)I

    move-result v3

    if-ltz v3, :cond_1

    iget-object v3, v4, Ltv/ouya/console/api/l;->k:Landroid/util/SparseBooleanArray;

    invoke-virtual {v3, v5}, Landroid/util/SparseBooleanArray;->get(I)Z

    move-result v3

    if-eq v3, v0, :cond_2

    .line 389
    :cond_1
    if-eqz v0, :cond_3

    move v3, v1

    .line 390
    :goto_2
    iget-object v6, v4, Ltv/ouya/console/api/l;->l:Landroid/util/SparseIntArray;

    invoke-virtual {v6, v5, v2}, Landroid/util/SparseIntArray;->get(II)I

    move-result v2

    or-int/2addr v2, v3

    .line 391
    iget-object v3, v4, Ltv/ouya/console/api/l;->l:Landroid/util/SparseIntArray;

    invoke-virtual {v3, v5, v2}, Landroid/util/SparseIntArray;->put(II)V

    .line 393
    :cond_2
    iget-object v2, v4, Ltv/ouya/console/api/l;->k:Landroid/util/SparseBooleanArray;

    invoke-virtual {v2, v5, v0}, Landroid/util/SparseBooleanArray;->put(IZ)V

    move v2, v1

    .line 394
    goto :goto_0

    :pswitch_0
    move v0, v1

    .line 381
    goto :goto_1

    :pswitch_1
    move v0, v2

    .line 383
    goto :goto_1

    .line 389
    :cond_3
    const/4 v3, 0x2

    goto :goto_2

    .line 377
    nop

    :pswitch_data_0
    .packed-switch 0x0
        :pswitch_0
        :pswitch_1
        :pswitch_0
    .end packed-switch
.end method

.method public static d(I)Ltv/ouya/console/api/l;
    .locals 1

    .prologue
    .line 325
    if-ltz p0, :cond_0

    const/4 v0, 0x4

    if-ge p0, v0, :cond_0

    .line 326
    sget-object v0, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    aget-object v0, v0, p0

    .line 328
    :goto_0
    return-object v0

    :cond_0
    const/4 v0, 0x0

    goto :goto_0
.end method

.method private static e(I)Ltv/ouya/console/api/l;
    .locals 4

    .prologue
    .line 526
    invoke-static {p0}, Ltv/ouya/console/api/l;->b(I)Ltv/ouya/console/api/l;

    move-result-object v0

    .line 527
    if-eqz v0, :cond_0

    .line 548
    :goto_0
    return-object v0

    .line 531
    :cond_0
    invoke-static {p0}, Ltv/ouya/console/api/l;->g(I)I

    move-result v0

    .line 532
    if-ltz v0, :cond_1

    const/4 v1, 0x4

    if-lt v0, v1, :cond_2

    .line 533
    :cond_1
    const/4 v0, 0x0

    goto :goto_0

    .line 536
    :cond_2
    sget-object v1, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    aget-object v1, v1, v0

    if-eqz v1, :cond_3

    .line 537
    const-string v1, "OuyaController"

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v3, "Controller for player "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    const-string v3, " already found, but doesn\'t match device id "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    const-string v3, "(expected "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    const-string v3, " got "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    sget-object v3, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    aget-object v3, v3, v0

    invoke-virtual {v3}, Ltv/ouya/console/api/l;->c()I

    move-result v3

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    const-string v3, ")"

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-static {v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

    .line 540
    sget-object v1, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    aget-object v0, v1, v0

    goto :goto_0

    .line 542
    :cond_3
    if-gez p0, :cond_4

    .line 543
    const-string v1, "OuyaController"

    new-instance v2, Ljava/lang/StringBuilder;

    invoke-direct {v2}, Ljava/lang/StringBuilder;-><init>()V

    const-string v3, "Adding device with invalid id!  Player "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2, v0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    const-string v3, " device id "

    invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2, p0}, Ljava/lang/StringBuilder;->append(I)Ljava/lang/StringBuilder;

    move-result-object v2

    invoke-virtual {v2}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v2

    invoke-static {v1, v2}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;)I

    .line 547
    :cond_4
    sget-object v1, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    new-instance v2, Ltv/ouya/console/api/l;

    invoke-direct {v2, p0}, Ltv/ouya/console/api/l;-><init>(I)V

    aput-object v2, v1, v0

    .line 548
    sget-object v1, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    aget-object v0, v1, v0

    goto/16 :goto_0
.end method

.method private static f(I)I
    .locals 7

    .prologue
    const/4 v4, 0x1

    const/4 v6, 0x0

    .line 552
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    invoke-virtual {v0}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;

    move-result-object v0

    sget-object v1, Ltv/ouya/console/api/l;->c:Landroid/net/Uri;

    new-array v2, v4, [Ljava/lang/String;

    const-string v3, "input_device_id"

    aput-object v3, v2, v6

    const-string v3, "player_num = ?"

    new-array v4, v4, [Ljava/lang/String;

    invoke-static {p0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;

    move-result-object v5

    aput-object v5, v4, v6

    const/4 v5, 0x0

    invoke-virtual/range {v0 .. v5}, Landroid/content/ContentResolver;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;

    move-result-object v1

    .line 559
    if-eqz v1, :cond_1

    :try_start_0
    invoke-interface {v1}, Landroid/database/Cursor;->moveToNext()Z

    move-result v0

    if-eqz v0, :cond_1

    .line 560
    const/4 v0, 0x0

    invoke-interface {v1, v0}, Landroid/database/Cursor;->getInt(I)I
    :try_end_0
    .catchall {:try_start_0 .. :try_end_0} :catchall_0

    move-result v0

    .line 564
    if-eqz v1, :cond_0

    .line 565
    invoke-interface {v1}, Landroid/database/Cursor;->close()V

    .line 568
    :cond_0
    :goto_0
    return v0

    .line 564
    :cond_1
    if-eqz v1, :cond_2

    .line 565
    invoke-interface {v1}, Landroid/database/Cursor;->close()V

    .line 568
    :cond_2
    const/4 v0, -0x1

    goto :goto_0

    .line 564
    :catchall_0
    move-exception v0

    if-eqz v1, :cond_3

    .line 565
    invoke-interface {v1}, Landroid/database/Cursor;->close()V

    :cond_3
    throw v0
.end method

.method private static g(I)I
    .locals 8

    .prologue
    const/4 v4, 0x1

    const/4 v6, -0x1

    const/4 v7, 0x0

    .line 572
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    if-nez v0, :cond_1

    move v0, v6

    .line 591
    :cond_0
    :goto_0
    return v0

    .line 575
    :cond_1
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    invoke-virtual {v0}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;

    move-result-object v0

    sget-object v1, Ltv/ouya/console/api/l;->c:Landroid/net/Uri;

    new-array v2, v4, [Ljava/lang/String;

    const-string v3, "player_num"

    aput-object v3, v2, v7

    const-string v3, "input_device_id = ?"

    new-array v4, v4, [Ljava/lang/String;

    invoke-static {p0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;

    move-result-object v5

    aput-object v5, v4, v7

    const/4 v5, 0x0

    invoke-virtual/range {v0 .. v5}, Landroid/content/ContentResolver;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;

    move-result-object v1

    .line 582
    if-eqz v1, :cond_2

    :try_start_0
    invoke-interface {v1}, Landroid/database/Cursor;->moveToNext()Z

    move-result v0

    if-eqz v0, :cond_2

    .line 583
    const/4 v0, 0x0

    invoke-interface {v1, v0}, Landroid/database/Cursor;->getInt(I)I
    :try_end_0
    .catchall {:try_start_0 .. :try_end_0} :catchall_0

    move-result v0

    .line 587
    if-eqz v1, :cond_0

    .line 588
    invoke-interface {v1}, Landroid/database/Cursor;->close()V

    goto :goto_0

    .line 587
    :cond_2
    if-eqz v1, :cond_3

    .line 588
    invoke-interface {v1}, Landroid/database/Cursor;->close()V

    :cond_3
    move v0, v6

    .line 591
    goto :goto_0

    .line 587
    :catchall_0
    move-exception v0

    if-eqz v1, :cond_4

    .line 588
    invoke-interface {v1}, Landroid/database/Cursor;->close()V

    :cond_4
    throw v0
.end method

.method private static h(I)Ljava/lang/String;
    .locals 8

    .prologue
    const/4 v6, 0x0

    .line 595
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    if-nez v0, :cond_1

    move-object v0, v6

    .line 620
    :cond_0
    :goto_0
    return-object v0

    .line 600
    :cond_1
    :try_start_0
    sget-object v0, Ltv/ouya/console/api/l;->d:Landroid/content/Context;

    invoke-virtual {v0}, Landroid/content/Context;->getContentResolver()Landroid/content/ContentResolver;

    move-result-object v0

    sget-object v1, Ltv/ouya/console/api/l;->c:Landroid/net/Uri;

    const/4 v2, 0x1

    new-array v2, v2, [Ljava/lang/String;

    const/4 v3, 0x0

    const-string v4, "bt_name"

    aput-object v4, v2, v3

    const-string v3, "input_device_id = ?"

    const/4 v4, 0x1

    new-array v4, v4, [Ljava/lang/String;

    const/4 v5, 0x0

    invoke-static {p0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;

    move-result-object v7

    aput-object v7, v4, v5

    const/4 v5, 0x0

    invoke-virtual/range {v0 .. v5}, Landroid/content/ContentResolver;->query(Landroid/net/Uri;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;
    :try_end_0
    .catch Landroid/database/sqlite/SQLiteException; {:try_start_0 .. :try_end_0} :catch_1
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_2

    move-result-object v1

    .line 607
    if-eqz v1, :cond_3

    :try_start_1
    invoke-interface {v1}, Landroid/database/Cursor;->moveToNext()Z

    move-result v0

    if-eqz v0, :cond_3

    .line 608
    const/4 v0, 0x0

    invoke-interface {v1, v0}, Landroid/database/Cursor;->getString(I)Ljava/lang/String;
    :try_end_1
    .catchall {:try_start_1 .. :try_end_1} :catchall_0

    move-result-object v6

    move-object v0, v6

    .line 611
    :goto_1
    if-eqz v1, :cond_0

    .line 612
    :try_start_2
    invoke-interface {v1}, Landroid/database/Cursor;->close()V
    :try_end_2
    .catch Landroid/database/sqlite/SQLiteException; {:try_start_2 .. :try_end_2} :catch_0
    .catch Ljava/lang/Exception; {:try_start_2 .. :try_end_2} :catch_3

    goto :goto_0

    .line 615
    :catch_0
    move-exception v1

    goto :goto_0

    .line 611
    :catchall_0
    move-exception v0

    if-eqz v1, :cond_2

    .line 612
    :try_start_3
    invoke-interface {v1}, Landroid/database/Cursor;->close()V

    :cond_2
    throw v0
    :try_end_3
    .catch Landroid/database/sqlite/SQLiteException; {:try_start_3 .. :try_end_3} :catch_1
    .catch Ljava/lang/Exception; {:try_start_3 .. :try_end_3} :catch_2

    .line 615
    :catch_1
    move-exception v0

    move-object v0, v6

    goto :goto_0

    .line 617
    :catch_2
    move-exception v0

    move-object v1, v0

    move-object v0, v6

    .line 618
    :goto_2
    const-string v2, "OuyaController"

    new-instance v3, Ljava/lang/StringBuilder;

    invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V

    const-string v4, "Exception: "

    invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v3

    invoke-virtual {v1}, Ljava/lang/Exception;->getMessage()Ljava/lang/String;

    move-result-object v1

    invoke-virtual {v3, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

    move-result-object v1

    invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

    move-result-object v1

    invoke-static {v2, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

    goto :goto_0

    .line 617
    :catch_3
    move-exception v1

    goto :goto_2

    :cond_3
    move-object v0, v6

    goto :goto_1
.end method


# virtual methods
.method public a()Landroid/view/InputDevice;
    .locals 1

    .prologue
    .line 469
    iget-object v0, p0, Ltv/ouya/console/api/l;->h:Landroid/view/InputDevice;

    return-object v0
.end method

.method public b()Ljava/lang/String;
    .locals 1

    .prologue
    .line 476
    iget-object v0, p0, Ltv/ouya/console/api/l;->i:Ljava/lang/String;

    return-object v0
.end method

.method public c()I
    .locals 1

    .prologue
    .line 483
    iget v0, p0, Ltv/ouya/console/api/l;->g:I

    return v0
.end method

.method public d()I
    .locals 2

    .prologue
    .line 512
    const/4 v0, 0x0

    :goto_0
    const/4 v1, 0x4

    if-ge v0, v1, :cond_1

    .line 513
    sget-object v1, Ltv/ouya/console/api/l;->a:[Ltv/ouya/console/api/l;

    aget-object v1, v1, v0

    if-ne v1, p0, :cond_0

    .line 517
    :goto_1
    return v0

    .line 512
    :cond_0
    add-int/lit8 v0, v0, 0x1

    goto :goto_0

    .line 517
    :cond_1
    const/4 v0, -0x1

    goto :goto_1
.end method