From 5ad26263f93c9b6f20bbfd5c4ffaa902b1248f35 Mon Sep 17 00:00:00 2001 From: TwistedUmbrella Date: Sat, 25 Jan 2014 08:27:55 -0500 Subject: [PATCH] Allow the custom controller config to override any other map By using the compatibility mode switch, the custom key and identifier assigned to a specific controller should be the first items used to create the key mappings. At worst, this will provide basic button and dpad support if no other detection is possible for the specific controller device. --- .../com/reicast/emulator/GL2JNIActivity.java | 198 +++++++++--------- .../reicast/emulator/InputModFragment.java | 8 +- 2 files changed, 106 insertions(+), 100 deletions(-) diff --git a/shell/android/src/com/reicast/emulator/GL2JNIActivity.java b/shell/android/src/com/reicast/emulator/GL2JNIActivity.java index c2e1866eb..41120d0ff 100644 --- a/shell/android/src/com/reicast/emulator/GL2JNIActivity.java +++ b/shell/android/src/com/reicast/emulator/GL2JNIActivity.java @@ -214,110 +214,105 @@ public class GL2JNIActivity extends Activity { for (int i = 0; i < joys.length; i++) { Integer playerNum = deviceDescriptor_PlayerNum .get(deviceId_deviceDescriptor.get(joys[i])); - - String[] players = getResources().getStringArray(R.array.controllers); - String id = players[i].substring( - players[i].lastIndexOf(" "), players[i].length()); - boolean compat = prefs.getBoolean("controller_compat" + id, false); - if (playerNum != null && !compat) { - if (prefs.getBoolean("modified_key_layout" + id, false)) { - map[playerNum] = setModifiedKeys(playerNum); - - custom[playerNum] = true; - - globalLS_X[playerNum] = previousLS_X[playerNum] = 0.0f; - globalLS_Y[playerNum] = previousLS_Y[playerNum] = 0.0f; - } else if (InputDevice.getDevice(joys[i]).getName() - .equals("Sony PLAYSTATION(R)3 Controller")) { - map[playerNum] = new int[] { - OuyaController.BUTTON_O, key_CONT_A, - OuyaController.BUTTON_A, key_CONT_B, - OuyaController.BUTTON_U, key_CONT_X, - OuyaController.BUTTON_Y, key_CONT_Y, - + if (playerNum != null) { + String[] players = getResources().getStringArray(R.array.controllers); + String id = "_" + players[playerNum].substring( + players[playerNum].lastIndexOf(" ") + 1, players[playerNum].length()); + boolean compat = prefs.getBoolean("controller_compat" + id, false); + if (!compat) { + if (prefs.getBoolean("modified_key_layout" + id, false)) { + map[playerNum] = setModifiedKeys(playerNum); - OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, - OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, - OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, - OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, + custom[playerNum] = true; - OuyaController.BUTTON_MENU, key_CONT_START, - OuyaController.BUTTON_R1, key_CONT_START + globalLS_X[playerNum] = previousLS_X[playerNum] = 0.0f; + globalLS_Y[playerNum] = previousLS_Y[playerNum] = 0.0f; + } else if (InputDevice.getDevice(joys[i]).getName() + .equals("Sony PLAYSTATION(R)3 Controller")) { + map[playerNum] = new int[] { + OuyaController.BUTTON_O, key_CONT_A, + OuyaController.BUTTON_A, key_CONT_B, + OuyaController.BUTTON_U, key_CONT_X, + OuyaController.BUTTON_Y, key_CONT_Y, - }; - } else if (InputDevice.getDevice(joys[i]).getName() - .equals("Microsoft X-Box 360 pad")) { - map[playerNum] = new int[] { - OuyaController.BUTTON_O, key_CONT_A, - OuyaController.BUTTON_A, key_CONT_B, - OuyaController.BUTTON_U, key_CONT_X, - OuyaController.BUTTON_Y, key_CONT_Y, - OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, - OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, - OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, - OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, + OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, + OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, + OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, + OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, - OuyaController.BUTTON_MENU, key_CONT_START, - OuyaController.BUTTON_R1, key_CONT_START - }; + OuyaController.BUTTON_MENU, key_CONT_START, + OuyaController.BUTTON_R1, key_CONT_START - xbox[playerNum] = true; + }; + } else if (InputDevice.getDevice(joys[i]).getName() + .equals("Microsoft X-Box 360 pad")) { + map[playerNum] = new int[] { + OuyaController.BUTTON_O, key_CONT_A, + OuyaController.BUTTON_A, key_CONT_B, + OuyaController.BUTTON_U, key_CONT_X, + OuyaController.BUTTON_Y, key_CONT_Y, - globalLS_X[playerNum] = previousLS_X[playerNum] = 0.0f; - globalLS_Y[playerNum] = previousLS_Y[playerNum] = 0.0f; - } else if (InputDevice.getDevice(joys[i]).getName() - .contains("NVIDIA Corporation NVIDIA Controller")) { - map[playerNum] = new int[] { - OuyaController.BUTTON_O, key_CONT_A, - OuyaController.BUTTON_A, key_CONT_B, - OuyaController.BUTTON_U, key_CONT_X, - OuyaController.BUTTON_Y, key_CONT_Y, + OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, + OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, + OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, + OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, - OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, - OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, - OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, - OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, + OuyaController.BUTTON_MENU, key_CONT_START, + OuyaController.BUTTON_R1, key_CONT_START + }; - OuyaController.BUTTON_MENU, key_CONT_START, - OuyaController.BUTTON_R1, key_CONT_START - }; - nVidia[playerNum] = true; + xbox[playerNum] = true; - globalLS_X[playerNum] = previousLS_X[playerNum] = 0.0f; - globalLS_Y[playerNum] = previousLS_Y[playerNum] = 0.0f; - } else if (!moga.isActive[playerNum]) { // Ouya controller - map[playerNum] = new int[] { - OuyaController.BUTTON_O, key_CONT_A, - OuyaController.BUTTON_A, key_CONT_B, - OuyaController.BUTTON_U, key_CONT_X, - OuyaController.BUTTON_Y, key_CONT_Y, + globalLS_X[playerNum] = previousLS_X[playerNum] = 0.0f; + globalLS_Y[playerNum] = previousLS_Y[playerNum] = 0.0f; + } else if (InputDevice.getDevice(joys[i]).getName() + .contains("NVIDIA Corporation NVIDIA Controller")) { + map[playerNum] = new int[] { + OuyaController.BUTTON_O, key_CONT_A, + OuyaController.BUTTON_A, key_CONT_B, + OuyaController.BUTTON_U, key_CONT_X, + OuyaController.BUTTON_Y, key_CONT_Y, - OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, - OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, - OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, - OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, + OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, + OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, + OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, + OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, - OuyaController.BUTTON_MENU, key_CONT_START, - OuyaController.BUTTON_R1, key_CONT_START - }; + OuyaController.BUTTON_MENU, key_CONT_START, + OuyaController.BUTTON_R1, key_CONT_START + }; + nVidia[playerNum] = true; + + globalLS_X[playerNum] = previousLS_X[playerNum] = 0.0f; + globalLS_Y[playerNum] = previousLS_Y[playerNum] = 0.0f; + } else if (!moga.isActive[playerNum]) { // Ouya controller + map[playerNum] = new int[] { + OuyaController.BUTTON_O, key_CONT_A, + OuyaController.BUTTON_A, key_CONT_B, + OuyaController.BUTTON_U, key_CONT_X, + OuyaController.BUTTON_Y, key_CONT_Y, + + OuyaController.BUTTON_DPAD_UP, key_CONT_DPAD_UP, + OuyaController.BUTTON_DPAD_DOWN, key_CONT_DPAD_DOWN, + OuyaController.BUTTON_DPAD_LEFT, key_CONT_DPAD_LEFT, + OuyaController.BUTTON_DPAD_RIGHT, key_CONT_DPAD_RIGHT, + + OuyaController.BUTTON_MENU, key_CONT_START, + OuyaController.BUTTON_R1, key_CONT_START + }; + } + } else { + getCompatibilityMap(playerNum, id); } - } else { - runCompatibilityCheck(i, id); } - } - + if (joys.length == 0) { + runCompatibilityMode(); + } } else { - for (int i = 0; i < 4; i++) { - String[] players = getResources().getStringArray(R.array.controllers); - String id = players[i].substring( - players[i].lastIndexOf(" "), players[i].length()); - if (prefs.getBoolean("controller_compat" + id, false)) { - runCompatibilityCheck(i, id); - } - } + runCompatibilityMode(); } // When viewing a resource, pass its URI to the native code for opening @@ -332,8 +327,19 @@ public class GL2JNIActivity extends Activity { Toast.makeText(getApplicationContext(), "Press the back button for a menu", Toast.LENGTH_SHORT).show(); } + + private void runCompatibilityMode() { + for (int n = 0; n < 4; n++) { + String[] players = getResources().getStringArray(R.array.controllers); + String id = "_" + players[n].substring( + players[n].lastIndexOf(" ") + 1, players[n].length()); + if (prefs.getBoolean("controller_compat" + id, false)) { + getCompatibilityMap(n, id); + } + } + } - private void runCompatibilityCheck(int playerNum, String id) { + private void getCompatibilityMap(int playerNum, String id) { name[playerNum] = prefs.getInt("controller" + id, -1); if (name[playerNum] != -1) { map[playerNum] = setModifiedKeys(playerNum); @@ -346,8 +352,8 @@ public class GL2JNIActivity extends Activity { private int[] setModifiedKeys(int player) { String[] players = getResources().getStringArray(R.array.controllers); - String id = players[player].substring( - players[player].lastIndexOf(" "), players[player].length()); + String id = "_" + players[player].substring( + players[player].lastIndexOf(" ") + 1, players[player].length()); return new int[] { prefs.getInt("a_button" + id, OuyaController.BUTTON_O), key_CONT_A, prefs.getInt("b_button" + id, OuyaController.BUTTON_A), key_CONT_B, @@ -491,12 +497,12 @@ public class GL2JNIActivity extends Activity { } public boolean onKeyUp(int keyCode, KeyEvent event) { - Integer playerNum = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + Integer playerNum = Arrays.asList(name).indexOf(event.getDeviceId()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD && playerNum == -1) { playerNum = deviceDescriptor_PlayerNum .get(deviceId_deviceDescriptor.get(event.getDeviceId())); } else { - playerNum = Arrays.asList(name).indexOf(event.getDeviceId()); + playerNum = 0; } return handle_key(playerNum, keyCode, false) @@ -504,12 +510,12 @@ public class GL2JNIActivity extends Activity { } public boolean onKeyDown(int keyCode, KeyEvent event) { - Integer playerNum = 0; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { + Integer playerNum = Arrays.asList(name).indexOf(event.getDeviceId()); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD && playerNum == -1) { playerNum = deviceDescriptor_PlayerNum .get(deviceId_deviceDescriptor.get(event.getDeviceId())); } else { - playerNum = Arrays.asList(name).indexOf(event.getDeviceId()); + playerNum = 0; } if (handle_key(playerNum, keyCode, true)) { diff --git a/shell/android/src/com/reicast/emulator/InputModFragment.java b/shell/android/src/com/reicast/emulator/InputModFragment.java index 3777de3ab..952d34fe9 100644 --- a/shell/android/src/com/reicast/emulator/InputModFragment.java +++ b/shell/android/src/com/reicast/emulator/InputModFragment.java @@ -76,12 +76,12 @@ public class InputModFragment extends Fragment { public void onItemSelected(AdapterView parent, View view, int pos, long id) { String selection = parent.getItemAtPosition(pos).toString(); - player = selection.substring(selection.lastIndexOf(" "), + player = "_" + selection.substring(selection.lastIndexOf(" ") + 1, selection.length()); } public void onNothingSelected(AdapterView arg0) { - + //player = "A"; } }); @@ -394,9 +394,9 @@ public class InputModFragment extends Fragment { builder.setOnKeyListener(new Dialog.OnKeyListener() { public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - dialog.dismiss(); mPrefs.edit() - .putInt("controller" + player, event.getDeviceId()); + .putInt("controller" + player, event.getDeviceId()).commit(); + dialog.dismiss(); return true; } });