diff --git a/Source/Android/app/src/main/assets/WiimoteProfile.ini b/Source/Android/app/src/main/assets/WiimoteProfile.ini new file mode 100644 index 0000000000..6c036c1a37 --- /dev/null +++ b/Source/Android/app/src/main/assets/WiimoteProfile.ini @@ -0,0 +1,135 @@ +[Profile] +Device = Android/4/Touchscreen +Buttons/A = `Button 100` +Buttons/B = `Button 101` +Buttons/- = `Button 102` +Buttons/+ = `Button 103` +Buttons/Home = `Button 104` +Buttons/1 = `Button 105` +Buttons/2 = `Button 106` +D-Pad/Up = `Button 107` +D-Pad/Down = `Button 108` +D-Pad/Left = `Button 109` +D-Pad/Right = `Button 110` +IR/Up = `Axis 112` +IR/Down = `Axis 113` +IR/Left = `Axis 114` +IR/Right = `Axis 115` +IR/Forward = `Axis 116` +IR/Backward = `Axis 117` +IR/Hide = `Button 118` +Swing/Up = `Axis 120` +Swing/Down = `Axis 121` +Swing/Left = `Axis 122` +Swing/Right = `Axis 123` +Swing/Forward = `Axis 124` +Swing/Backward = `Axis 125` +Tilt/Forward = `Axis 127` +Tilt/Backward = `Axis 128` +Tilt/Left = `Axis 129` +Tilt/Right = `Axis 130` +Tilt/Modifier = `Button 131` +Tilt/Modifier/Range = 50,000000 +Shake/X = `Button 132` +Shake/Y = `Button 133` +Shake/Z = `Button 134` +Extension = Nunchuk +Nunchuk/Buttons/C = `Button 200` +Nunchuk/Buttons/Z = `Button 201` +Nunchuk/Stick/Up = `Axis 203` +Nunchuk/Stick/Down = `Axis 204` +Nunchuk/Stick/Left = `Axis 205` +Nunchuk/Stick/Right = `Axis 206` +Nunchuk/Stick/Radius = 100,000000 +Nunchuk/Swing/Up = `Axis 208` +Nunchuk/Swing/Down = `Axis 209` +Nunchuk/Swing/Left = `Axis 210` +Nunchuk/Swing/Right = `Axis 211` +Nunchuk/Swing/Forward = `Axis 212` +Nunchuk/Swing/Backward = `Axis 213` +Nunchuk/Tilt/Forward = `Axis 215` +Nunchuk/Tilt/Backward = `Axis 216` +Nunchuk/Tilt/Left = `Axis 217` +Nunchuk/Tilt/Right = `Axis 218` +Nunchuk/Tilt/Modifier = `Button 219` +Nunchuk/Tilt/Modifier/Range = 50,000000 +Nunchuk/Shake/X = `Button 220` +Nunchuk/Shake/Y = `Button 221` +Nunchuk/Shake/Z = `Button 222` +Classic/Buttons/A = `Button 300` +Classic/Buttons/B = `Button 301` +Classic/Buttons/X = `Button 302` +Classic/Buttons/Y = `Button 303` +Classic/Buttons/- = `Button 304` +Classic/Buttons/+ = `Button 305` +Classic/Buttons/Home = `Button 306` +Classic/Buttons/ZL = `Button 307` +Classic/Buttons/ZR = `Button 308` +Classic/D-Pad/Up = `Button 309` +Classic/D-Pad/Down = `Button 310` +Classic/D-Pad/Left = `Button 311` +Classic/D-Pad/Right = `Button 312` +Classic/Left Stick/Up = `Axis 314` +Classic/Left Stick/Down = `Axis 315` +Classic/Left Stick/Left = `Axis 316` +Classic/Left Stick/Right = `Axis 317` +Classic/Left Stick/Radius = 100,000000 +Classic/Right Stick/Up = `Axis 319` +Classic/Right Stick/Down = `Axis 320` +Classic/Right Stick/Left = `Axis 321` +Classic/Right Stick/Right = `Axis 322` +Classic/Right Stick/Radius = 100,000000 +Classic/Triggers/L = `Axis 323` +Classic/Triggers/R = `Axis 324` +Classic/Triggers/Threshold = 90,000000 +Guitar/Buttons/- = `Button 400` +Guitar/Buttons/+ = `Button 401` +Guitar/Frets/Green = `Button 402` +Guitar/Frets/Red = `Button 403` +Guitar/Frets/Yellow = `Button 404` +Guitar/Frets/Blue = `Button 405` +Guitar/Frets/Orange = `Button 406` +Guitar/Strum/Up = `Button 407` +Guitar/Strum/Down = `Button 408` +Guitar/Stick/Up = `Axis 410` +Guitar/Stick/Down = `Axis 411` +Guitar/Stick/Left = `Axis 412` +Guitar/Stick/Right = `Axis 413` +Guitar/Stick/Radius = 100,000000 +Guitar/Whammy/Bar = `Axis = 414` +Drums/Buttons/- = `Button 500` +Drums/Buttons/+ = `Button 501` +Drums/Pads/Red = `Button 502` +Drums/Pads/Yellow = `Button 503` +Drums/Pads/Blue = `Button 504` +Drums/Pads/Green = `Button 505` +Drums/Pads/Orange = `Button 506` +Drums/Pads/Bass = `Button 507` +Drums/Stick/Up = `Axis 509` +Drums/Stick/Down = `Axis 510` +Drums/Stick/Left = `Axis 511` +Drums/Stick/Right = `Axis 512` +Drums/Stick/Radius = 100,000000 +Turntable/Buttons/Green Left = `Button 600` +Turntable/Buttons/Red Left = `Button 601` +Turntable/Buttons/Blue Left = `Button 602` +Turntable/Buttons/Green Right = `Button 603` +Turntable/Buttons/Red Right = `Button 604` +Turntable/Buttons/Blue Right = `Button 605` +Turntable/Buttons/- = `Button 606` +Turntable/Buttons/+ = `Button 607` +Turntable/Buttons/Home = `Button 608` +Turntable/Buttons/Euphoria = `Button 609` +Turntable/Table Left/Left = `Axis 611` +Turntable/Table Left/Right = `Axis 612` +Turntable/Table Right/Left = `Axis 614` +Turntable/Table Right/Right = `Axis 615` +Turntable/Stick/Up = `Axis 617` +Turntable/Stick/Down = `Axis 618` +Turntable/Stick/Left = `Axis 619` +Turntable/Stick/Right = `Axis 620` +Turntable/Stick/Radius = 100,000000 +Turntable/Effect/Dial = `Axis 621` +Turntable/Crossfade/Left = `Axis 623` +Turntable/Crossfade/Right = `Axis 624` +Rumble/Motor = `Rumble 700` \ No newline at end of file diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java index 3536a17776..425a749d75 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/NativeLibrary.java @@ -244,10 +244,17 @@ public final class NativeLibrary Rumble.checkRumble(padID, state); } + public static native void LoadGameIniFile(String gameId); + + public static native void SaveGameIniFile(String gameId); + public static native String GetUserSetting(String gameID, String Section, String Key); public static native void SetUserSetting(String gameID, String Section, String Key, String Value); + public static native void SetProfileSetting(String profile, String Section, String Key, + String Value); + public static native void InitGameIni(String gameID); /** diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java index 67b6b77e7a..52312b29f9 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameAdapter.java @@ -12,10 +12,12 @@ import android.widget.Toast; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.activities.EmulationActivity; +import org.dolphinemu.dolphinemu.dialogs.GameSettingsDialog; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity; import org.dolphinemu.dolphinemu.model.GameFile; import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; +import org.dolphinemu.dolphinemu.ui.platform.Platform; import org.dolphinemu.dolphinemu.utils.PicassoUtils; import org.dolphinemu.dolphinemu.viewholders.GameViewHolder; @@ -147,49 +149,10 @@ public final class GameAdapter extends RecyclerView.Adapter impl return true; } - AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setTitle("Game Settings") - .setItems(R.array.gameSettingsMenus, new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int which) - { - switch (which) - { - case 0: - SettingsActivity.launch(activity, MenuTag.CONFIG, gameId); - break; - case 1: - SettingsActivity.launch(activity, MenuTag.GRAPHICS, gameId); - break; - case 2: - String path = - DirectoryInitialization.getUserDirectory() + "/GameSettings/" + - gameId + ".ini"; - File gameSettingsFile = new File(path); - if (gameSettingsFile.exists()) - { - if (gameSettingsFile.delete()) - { - Toast.makeText(view.getContext(), "Cleared settings for " + gameId, - Toast.LENGTH_SHORT).show(); - } - else - { - Toast.makeText(view.getContext(), "Unable to clear settings for " + gameId, - Toast.LENGTH_SHORT).show(); - } - } - else - { - Toast.makeText(view.getContext(), "No game settings to delete", - Toast.LENGTH_SHORT).show(); - } - break; - } - } - }); - - builder.show(); + GameSettingsDialog fragment = + GameSettingsDialog.newInstance(gameId, holder.gameFile.getPlatform()); + ((FragmentActivity) view.getContext()).getSupportFragmentManager().beginTransaction() + .add(fragment, GameSettingsDialog.TAG).commit(); return true; } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java index 2cf23080b1..8047a438e8 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/adapters/GameRowPresenter.java @@ -14,6 +14,7 @@ import android.widget.ImageView; import android.widget.Toast; import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.dialogs.GameSettingsDialog; import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity; import org.dolphinemu.dolphinemu.model.GameFile; @@ -80,73 +81,30 @@ public final class GameRowPresenter extends Presenter Context context = holder.cardParent.getContext(); Drawable background = ContextCompat.getDrawable(context, backgroundId); holder.cardParent.setInfoAreaBackground(background); - holder.cardParent.setOnLongClickListener(new View.OnLongClickListener() + holder.cardParent.setOnLongClickListener((view) -> { - @Override - public boolean onLongClick(View view) + FragmentActivity activity = (FragmentActivity) view.getContext(); + String gameId = gameFile.getGameId(); + + if (gameId.isEmpty()) { - FragmentActivity activity = (FragmentActivity) view.getContext(); - String gameId = gameFile.getGameId(); - - if (gameId.isEmpty()) - { - AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setTitle("Game Settings"); - builder.setMessage("Files without game IDs don't support game-specific settings."); - - builder.show(); - return true; - } - AlertDialog.Builder builder = new AlertDialog.Builder(activity); - builder.setTitle("Game Settings") - .setItems(R.array.gameSettingsMenus, new DialogInterface.OnClickListener() - { - public void onClick(DialogInterface dialog, int which) - { - switch (which) - { - case 0: - SettingsActivity.launch(activity, MenuTag.CONFIG, gameId); - break; - case 1: - SettingsActivity.launch(activity, MenuTag.GRAPHICS, gameId); - break; - case 2: - String path = DirectoryInitialization.getUserDirectory() + - "/GameSettings/" + gameId + ".ini"; - File gameSettingsFile = new File(path); - if (gameSettingsFile.exists()) - { - if (gameSettingsFile.delete()) - { - Toast.makeText(view.getContext(), "Cleared settings for " + gameId, - Toast.LENGTH_SHORT).show(); - } - else - { - Toast.makeText(view.getContext(), - "Unable to clear settings for " + gameId, Toast.LENGTH_SHORT) - .show(); - } - } - else - { - Toast.makeText(view.getContext(), "No game settings to delete", - Toast.LENGTH_SHORT).show(); - } - break; - } - } - }); + builder.setTitle("Game Settings"); + builder.setMessage("Files without game IDs don't support game-specific settings."); builder.show(); return true; } + + GameSettingsDialog fragment = + GameSettingsDialog.newInstance(gameId, holder.gameFile.getPlatform()); + ((FragmentActivity) view.getContext()).getSupportFragmentManager().beginTransaction() + .add(fragment, GameSettingsDialog.TAG).commit(); + + return true; }); } - @Override public void onUnbindViewHolder(ViewHolder viewHolder) { diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameSettingsDialog.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameSettingsDialog.java new file mode 100644 index 0000000000..5639897d62 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/dialogs/GameSettingsDialog.java @@ -0,0 +1,98 @@ +package org.dolphinemu.dolphinemu.dialogs; + +import android.app.AlertDialog; +import android.app.Dialog; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.widget.Toast; + +import org.dolphinemu.dolphinemu.R; +import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag; +import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivity; +import org.dolphinemu.dolphinemu.ui.platform.Platform; +import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; + +import java.io.File; + +public class GameSettingsDialog extends DialogFragment +{ + public static final String TAG = "GameSettingsDialog"; + public static final String ARG_GAMEID = "game_id"; + public static final String ARG_PLATFORM = "platform"; + + public static GameSettingsDialog newInstance(String gameId, int platform) + { + GameSettingsDialog fragment = new GameSettingsDialog(); + + Bundle arguments = new Bundle(); + arguments.putString(ARG_GAMEID, gameId); + arguments.putInt(ARG_PLATFORM, platform); + fragment.setArguments(arguments); + + return fragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) + { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); + + String gameId = getArguments().getString(ARG_GAMEID); + int platform = getArguments().getInt(ARG_PLATFORM); + + builder.setTitle(getActivity().getString(R.string.preferences_game_settings)) + .setItems(platform == Platform.GAMECUBE.toInt() ? + R.array.gameSettingsMenusGC : + R.array.gameSettingsMenusWii, (dialog, which) -> + { + switch (which) + { + case 0: + SettingsActivity.launch(getContext(), MenuTag.CONFIG, gameId); + break; + case 1: + SettingsActivity.launch(getContext(), MenuTag.GRAPHICS, gameId); + break; + case 2: + SettingsActivity.launch(getContext(), MenuTag.GCPAD_TYPE, gameId); + break; + case 3: + // Clear option for GC, Wii controls for else + if (platform == Platform.GAMECUBE.toInt()) + clearGameSettings(gameId); + else + SettingsActivity.launch(getActivity(), MenuTag.WIIMOTE, gameId); + break; + case 4: + clearGameSettings(gameId); + break; + } + }); + return builder.create(); + } + + + private void clearGameSettings(String gameId) + { + String path = + DirectoryInitialization.getUserDirectory() + "/GameSettings/" + gameId + ".ini"; + File gameSettingsFile = new File(path); + if (gameSettingsFile.exists()) + { + if (gameSettingsFile.delete()) + { + Toast.makeText(getContext(), "Cleared settings for " + gameId, Toast.LENGTH_SHORT) + .show(); + } + else + { + Toast.makeText(getContext(), "Unable to clear settings for " + gameId, + Toast.LENGTH_SHORT).show(); + } + } + else + { + Toast.makeText(getContext(), "No game settings to delete", Toast.LENGTH_SHORT).show(); + } + } +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java index d945512069..0f3ff9d717 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/Settings.java @@ -26,6 +26,8 @@ public class Settings public static final String SECTION_WIIMOTE = "Wiimote"; public static final String SECTION_BINDINGS = "Android"; + public static final String SECTION_CONTROLS = "Controls"; + public static final String SECTION_PROFILE = "Profile"; public static final String SECTION_ANALYTICS = "Analytics"; @@ -134,6 +136,11 @@ public class Settings mergeSections(SettingsFile.readCustomGameSettings(gameId, view)); } + public void loadWiimoteProfile(String gameId, String padId) + { + mergeSections(SettingsFile.readWiimoteProfile(gameId, padId)); + } + private void mergeSections(HashMap updatedSections) { for (Map.Entry entry : updatedSections.entrySet()) @@ -182,6 +189,5 @@ public class Settings view.showToastMessage("Saved settings for " + gameId); SettingsFile.saveCustomGameSettings(gameId, sections); } - } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java index e3850cb447..0c6a3bc314 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/InputBindingSetting.java @@ -11,9 +11,13 @@ import org.dolphinemu.dolphinemu.features.settings.model.StringSetting; public class InputBindingSetting extends SettingsItem { - public InputBindingSetting(String key, String section, int titleId, Setting setting) + private String gameId; + + public InputBindingSetting(String key, String section, int titleId, Setting setting, + String gameId) { super(key, section, setting, titleId, 0); + this.gameId = gameId; } public String getValue() @@ -98,4 +102,9 @@ public class InputBindingSetting extends SettingsItem { return TYPE_INPUT_BINDING; } + + public String getGameId() + { + return gameId; + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java index 8dde9825d5..175d444d5f 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/RumbleBindingSetting.java @@ -15,9 +15,10 @@ import org.dolphinemu.dolphinemu.utils.Rumble; public class RumbleBindingSetting extends InputBindingSetting { - public RumbleBindingSetting(String key, String section, int titleId, Setting setting) + public RumbleBindingSetting(String key, String section, int titleId, Setting setting, + String gameId) { - super(key, section, titleId, setting); + super(key, section, titleId, setting, gameId); } @Override diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java index e3c798521f..48df22fc45 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/model/view/SettingsItem.java @@ -1,7 +1,7 @@ package org.dolphinemu.dolphinemu.features.settings.model.view; -import org.dolphinemu.dolphinemu.features.settings.model.Setting; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; +import org.dolphinemu.dolphinemu.features.settings.model.Setting; /** * ViewModel abstraction for an Item in the RecyclerView powering SettingsFragments. @@ -39,6 +39,7 @@ public abstract class SettingsItem * @param nameId Resource ID for a text string to be displayed as this setting's name. * @param descriptionId Resource ID for a text string to be displayed as this setting's description. */ + public SettingsItem(String key, String section, Setting setting, int nameId, int descriptionId) { mKey = key; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java index a2392caefc..7d903ddd0a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsAdapter.java @@ -292,7 +292,14 @@ public final class SettingsAdapter extends RecyclerView.Adapter sl, int wiimoteNumber, @@ -911,58 +954,58 @@ public final class SettingsFragmentPresenter sl.add(new HeaderSetting(null, null, R.string.generic_buttons, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_C + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.nunchuk_button_c, bindC)); + Settings.SECTION_BINDINGS, R.string.nunchuk_button_c, bindC, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_Z + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_z, bindZ)); + Settings.SECTION_BINDINGS, R.string.button_z, bindZ, mGameID)); sl.add(new HeaderSetting(null, null, R.string.generic_stick, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindDown, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindRight, mGameID)); sl.add(new HeaderSetting(null, null, R.string.wiimote_swing, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindSwingUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindSwingUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindSwingDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindSwingDown, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindSwingLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindSwingLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindSwingRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindSwingRight, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_FORWARD + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_forward, bindSwingForward)); + Settings.SECTION_BINDINGS, R.string.generic_forward, bindSwingForward, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_NUNCHUK_SWING_BACKWARD + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_backward, bindSwingBackward)); + Settings.SECTION_BINDINGS, R.string.generic_backward, bindSwingBackward, mGameID)); sl.add(new HeaderSetting(null, null, R.string.wiimote_tilt, 0)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_FORWARD + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_forward, bindTiltForward)); + Settings.SECTION_BINDINGS, R.string.generic_forward, bindTiltForward, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_BACKWARD + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_backward, bindTiltBackward)); + Settings.SECTION_BINDINGS, R.string.generic_backward, bindTiltBackward, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindTiltLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindTiltLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindTiltRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindTiltRight, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_NUNCHUK_TILT_MODIFIER + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.tilt_modifier, bindTiltModifier)); + Settings.SECTION_BINDINGS, R.string.tilt_modifier, bindTiltModifier, mGameID)); sl.add(new HeaderSetting(null, null, R.string.wiimote_shake, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_SHAKE_X + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.shake_x, bindShakeX)); + Settings.SECTION_BINDINGS, R.string.shake_x, bindShakeX, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_SHAKE_Y + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.shake_y, bindShakeY)); + Settings.SECTION_BINDINGS, R.string.shake_y, bindShakeY, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_NUNCHUK_SHAKE_Z + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.shake_z, bindShakeZ)); + Settings.SECTION_BINDINGS, R.string.shake_z, bindShakeZ, mGameID)); break; case 2: // Classic Setting bindA = @@ -1014,59 +1057,59 @@ public final class SettingsFragmentPresenter sl.add(new HeaderSetting(null, null, R.string.generic_buttons, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_A + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_a, bindA)); + Settings.SECTION_BINDINGS, R.string.button_a, bindA, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_B + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_b, bindB)); + Settings.SECTION_BINDINGS, R.string.button_b, bindB, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_X + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_x, bindX)); + Settings.SECTION_BINDINGS, R.string.button_x, bindX, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_Y + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_y, bindY)); + Settings.SECTION_BINDINGS, R.string.button_y, bindY, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_ZL + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.classic_button_zl, bindZL)); + Settings.SECTION_BINDINGS, R.string.classic_button_zl, bindZL, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_ZR + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.classic_button_zr, bindZR)); + Settings.SECTION_BINDINGS, R.string.classic_button_zr, bindZR, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_MINUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_minus, bindMinus)); + Settings.SECTION_BINDINGS, R.string.button_minus, bindMinus, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_PLUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_plus, bindPlus)); + Settings.SECTION_BINDINGS, R.string.button_plus, bindPlus, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_HOME + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_home, bindHome)); + Settings.SECTION_BINDINGS, R.string.button_home, bindHome, mGameID)); sl.add(new HeaderSetting(null, null, R.string.classic_leftstick, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindLeftUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindLeftUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindLeftDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindLeftDown, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindLeftLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindLeftLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_LEFT_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindLeftRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindLeftRight, mGameID)); sl.add(new HeaderSetting(null, null, R.string.classic_rightstick, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindRightUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindRightUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindRightDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindRightDown, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindRightLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindRightLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_RIGHT_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindRightRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindRightRight, mGameID)); sl.add(new HeaderSetting(null, null, R.string.controller_trig, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_TRIGGER_L + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.trigger_left, bindR)); + Settings.SECTION_BINDINGS, R.string.trigger_left, bindR, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_TRIGGER_R + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.trigger_right, bindL)); + Settings.SECTION_BINDINGS, R.string.trigger_right, bindL, mGameID)); sl.add(new HeaderSetting(null, null, R.string.controller_dpad, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindDpadUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindDpadUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindDpadDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindDpadDown, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindDpadLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindDpadLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_CLASSIC_DPAD_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindDpadRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindDpadRight, mGameID)); break; case 3: // Guitar Setting bindFretGreen = bindingsSection @@ -1100,41 +1143,41 @@ public final class SettingsFragmentPresenter sl.add(new HeaderSetting(null, null, R.string.guitar_frets, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_FRET_GREEN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_green, bindFretGreen)); + Settings.SECTION_BINDINGS, R.string.generic_green, bindFretGreen, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_FRET_RED + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_red, bindFretRed)); + Settings.SECTION_BINDINGS, R.string.generic_red, bindFretRed, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_FRET_YELLOW + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_yellow, bindFretYellow)); + Settings.SECTION_BINDINGS, R.string.generic_yellow, bindFretYellow, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_FRET_BLUE + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_blue, bindFretBlue)); + Settings.SECTION_BINDINGS, R.string.generic_blue, bindFretBlue, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_FRET_ORANGE + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_orange, bindFretOrange)); + Settings.SECTION_BINDINGS, R.string.generic_orange, bindFretOrange, mGameID)); sl.add(new HeaderSetting(null, null, R.string.guitar_strum, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_STRUM_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindStrumUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindStrumUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_STRUM_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindStrumDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindStrumDown, mGameID)); sl.add(new HeaderSetting(null, null, R.string.generic_buttons, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_MINUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_minus, bindGuitarMinus)); + Settings.SECTION_BINDINGS, R.string.button_minus, bindGuitarMinus, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_PLUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_plus, bindGuitarPlus)); + Settings.SECTION_BINDINGS, R.string.button_plus, bindGuitarPlus, mGameID)); sl.add(new HeaderSetting(null, null, R.string.generic_stick, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_STICK_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindGuitarUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindGuitarUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_STICK_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindGuitarDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindGuitarDown, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_STICK_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindGuitarLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindGuitarLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_STICK_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindGuitarRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindGuitarRight, mGameID)); sl.add(new HeaderSetting(null, null, R.string.guitar_whammy, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_GUITAR_WHAMMY_BAR + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindWhammyBar)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindWhammyBar, mGameID)); break; case 4: // Drums Setting bindPadRed = @@ -1164,33 +1207,33 @@ public final class SettingsFragmentPresenter sl.add(new HeaderSetting(null, null, R.string.drums_pads, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_PAD_RED + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_red, bindPadRed)); + Settings.SECTION_BINDINGS, R.string.generic_red, bindPadRed, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_PAD_YELLOW + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_yellow, bindPadYellow)); + Settings.SECTION_BINDINGS, R.string.generic_yellow, bindPadYellow, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_PAD_BLUE + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_blue, bindPadBlue)); + Settings.SECTION_BINDINGS, R.string.generic_blue, bindPadBlue, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_PAD_GREEN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_green, bindPadGreen)); + Settings.SECTION_BINDINGS, R.string.generic_green, bindPadGreen, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_PAD_ORANGE + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_orange, bindPadOrange)); + Settings.SECTION_BINDINGS, R.string.generic_orange, bindPadOrange, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_PAD_BASS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.drums_pad_bass, bindPadBass)); + Settings.SECTION_BINDINGS, R.string.drums_pad_bass, bindPadBass, mGameID)); sl.add(new HeaderSetting(null, null, R.string.generic_stick, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_STICK_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindDrumsUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindDrumsUp, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_STICK_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindDrumsDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindDrumsDown, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_STICK_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindDrumsLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindDrumsLeft, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_STICK_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindDrumsRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindDrumsRight, mGameID)); sl.add(new HeaderSetting(null, null, R.string.generic_buttons, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_MINUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_minus, bindDrumsMinus)); + Settings.SECTION_BINDINGS, R.string.button_minus, bindDrumsMinus, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_DRUMS_PLUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_plus, bindDrumsPlus)); + Settings.SECTION_BINDINGS, R.string.button_plus, bindDrumsPlus, mGameID)); break; case 5: // Turntable Setting bindGreenLeft = bindingsSection @@ -1237,66 +1280,76 @@ public final class SettingsFragmentPresenter sl.add(new HeaderSetting(null, null, R.string.generic_buttons, 0)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_GREEN_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_button_green_left, bindGreenLeft)); + Settings.SECTION_BINDINGS, R.string.turntable_button_green_left, bindGreenLeft, + mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_RED_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_button_red_left, bindRedLeft)); + Settings.SECTION_BINDINGS, R.string.turntable_button_red_left, bindRedLeft, + mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_BLUE_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_button_blue_left, bindBlueLeft)); + Settings.SECTION_BINDINGS, R.string.turntable_button_blue_left, bindBlueLeft, + mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_GREEN_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_button_green_right, bindGreenRight)); + Settings.SECTION_BINDINGS, R.string.turntable_button_green_right, bindGreenRight, + mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_RED_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_button_red_right, bindRedRight)); + Settings.SECTION_BINDINGS, R.string.turntable_button_red_right, bindRedRight, + mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_BLUE_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_button_blue_right, bindBlueRight)); + Settings.SECTION_BINDINGS, R.string.turntable_button_blue_right, bindBlueRight, + mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_MINUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_minus, bindTurntableMinus)); + Settings.SECTION_BINDINGS, R.string.button_minus, bindTurntableMinus, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_PLUS + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.button_plus, bindTurntablePlus)); + Settings.SECTION_BINDINGS, R.string.button_plus, bindTurntablePlus, mGameID)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_EUPHORIA + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_button_euphoria, bindEuphoria)); + Settings.SECTION_BINDINGS, R.string.turntable_button_euphoria, bindEuphoria, + mGameID)); sl.add(new HeaderSetting(null, null, R.string.turntable_table_left, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_LEFT_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindTurntableLeftLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindTurntableLeftLeft, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_LEFT_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindTurntableLeftRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindTurntableLeftRight, + mGameID)); sl.add(new HeaderSetting(null, null, R.string.turntable_table_right, 0)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_RIGHT_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindTurntableRightLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindTurntableRightLeft, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_RIGHT_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindTurntableRightRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindTurntableRightRight, + mGameID)); sl.add(new HeaderSetting(null, null, R.string.generic_stick, 0)); sl.add(new InputBindingSetting(SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_UP + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_up, bindTurntableUp)); + Settings.SECTION_BINDINGS, R.string.generic_up, bindTurntableUp, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_DOWN + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_down, bindTurntableDown)); + Settings.SECTION_BINDINGS, R.string.generic_down, bindTurntableDown, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindTurntableLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindTurntableLeft, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_STICK_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindTurntableRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindTurntableRight, mGameID)); sl.add(new HeaderSetting(null, null, R.string.turntable_effect, 0)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_EFFECT_DIAL + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.turntable_effect_dial, bindEffectDial)); + Settings.SECTION_BINDINGS, R.string.turntable_effect_dial, bindEffectDial, + mGameID)); sl.add(new HeaderSetting(null, null, R.string.turntable_crossfade, 0)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_CROSSFADE_LEFT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_left, bindCrossfadeLeft)); + Settings.SECTION_BINDINGS, R.string.generic_left, bindCrossfadeLeft, mGameID)); sl.add(new InputBindingSetting( SettingsFile.KEY_WIIBIND_TURNTABLE_CROSSFADE_RIGHT + wiimoteNumber, - Settings.SECTION_BINDINGS, R.string.generic_right, bindCrossfadeRight)); + Settings.SECTION_BINDINGS, R.string.generic_right, bindCrossfadeRight, mGameID)); break; } } @@ -1358,9 +1411,19 @@ public final class SettingsFragmentPresenter try { - String extension = - ((StringSetting) mSettings.getSection(Settings.SECTION_WIIMOTE + wiimoteNumber) - .getSetting(SettingsFile.KEY_WIIMOTE_EXTENSION)).getValue(); + String extension; + if (mGameID.equals("")) // Main settings + { + extension = + ((StringSetting) mSettings.getSection(Settings.SECTION_WIIMOTE + wiimoteNumber) + .getSetting(SettingsFile.KEY_WIIMOTE_EXTENSION)).getValue(); + } + else // Game settings + { + extension = ((StringSetting) mSettings.getSection(Settings.SECTION_PROFILE) + .getSetting(SettingsFile.KEY_WIIMOTE_EXTENSION)).getValue(); + } + if (extension.equals("None")) { extensionValue = 0; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java index 0b585b2e50..d2afd88731 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/viewholder/InputBindingSettingViewHolder.java @@ -41,8 +41,9 @@ public final class InputBindingSettingViewHolder extends SettingViewHolder mItem = (InputBindingSetting) item; - mTextSettingName.setText(item.getNameId()); - mTextSettingDescription.setText(sharedPreferences.getString(mItem.getKey(), "")); + mTextSettingName.setText(mItem.getNameId()); + mTextSettingDescription + .setText(sharedPreferences.getString(mItem.getKey() + mItem.getGameId(), "")); } @Override diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java index 0ccf700b0e..79315dbe90 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/utils/SettingsFile.java @@ -90,6 +90,7 @@ public final class SettingsFile public static final String KEY_WAIT_FOR_SHADERS = "WaitForShadersBeforeStarting"; public static final String KEY_GCPAD_TYPE = "SIDevice"; + public static final String KEY_GCPAD_G_TYPE = "PadType"; public static final String KEY_GCBIND_A = "InputA_"; public static final String KEY_GCBIND_B = "InputB_"; @@ -120,6 +121,10 @@ public final class SettingsFile public static final String KEY_WIIMOTE_TYPE = "Source"; public static final String KEY_WIIMOTE_EXTENSION = "Extension"; + // Controller keys for game specific settings + public static final String KEY_WIIMOTE_G_TYPE = "WiimoteSource"; + public static final String KEY_WIIMOTE_PROFILE = "WiimoteProfile"; + public static final String KEY_WIIBIND_A = "WiimoteA_"; public static final String KEY_WIIBIND_B = "WiimoteB_"; public static final String KEY_WIIBIND_1 = "Wiimote1_"; @@ -370,6 +375,12 @@ public final class SettingsFile return readFile(getGenericGameSettingsForAllRegions(gameId), true, view); } + public static HashMap readWiimoteProfile(final String gameId, + final String padId) + { + String profile = gameId + "_Wii" + padId; + return readFile(getWiiProfile(profile, padId), true, null); + } /** * Saves a Settings HashMap to a given .ini file on disk. If unsuccessful, outputs an error @@ -432,16 +443,88 @@ public final class SettingsFile HashMap settings = section.getSettings(); Set sortedKeySet = new TreeSet<>(settings.keySet()); + // Profile options(wii extension) are not saved, only used to properly display values + if (sectionKey.contains(Settings.SECTION_PROFILE)) + { + continue; + } + else + { + NativeLibrary.LoadGameIniFile(gameId); + } for (String settingKey : sortedKeySet) { Setting setting = settings.get(settingKey); - NativeLibrary - .SetUserSetting(gameId, mapSectionNameFromIni(section.getName()), setting.getKey(), - setting.getValueAsString()); + // Special case. Extension gets saved into a controller profile + if (settingKey.contains(SettingsFile.KEY_WIIMOTE_EXTENSION)) + { + String padId = + setting.getKey() + .substring(setting.getKey().length() - 1, setting.getKey().length()); + + saveCustomWiimoteSetting(gameId, KEY_WIIMOTE_EXTENSION, setting.getValueAsString(), + padId); + } + else + { + NativeLibrary.SetUserSetting(gameId, mapSectionNameFromIni(section.getName()), + setting.getKey(), setting.getValueAsString()); + } } + NativeLibrary.SaveGameIniFile(gameId); } } + public static void saveSingleCustomSetting(final String gameId, final String section, + final String key, + final String value) + { + NativeLibrary.LoadGameIniFile(gameId); + NativeLibrary.SetUserSetting(gameId, section, + key, value); + NativeLibrary.SaveGameIniFile(gameId); + } + + /** + * Saves the wiimote setting in a profile and enables that profile. + * + * @param gameId + * @param key + * @param value + * @param padId + */ + public static void saveCustomWiimoteSetting(final String gameId, final String key, + final String value, + final String padId) + { + String profile = gameId + "_Wii" + padId; + + String wiiConfigPath = + DirectoryInitialization.getUserDirectory() + "/Config/Profiles/Wiimote/" + + profile + ".ini"; + File wiiProfile = new File(wiiConfigPath); + // If it doesn't exist, create it + if (!wiiProfile.exists()) + { + String defautlWiiProfilePath = + DirectoryInitialization.getUserDirectory() + + "/Config/Profiles/Wiimote/WiimoteProfile.ini"; + DirectoryInitialization.copyFile(defautlWiiProfilePath, wiiConfigPath); + + NativeLibrary.SetProfileSetting(profile, Settings.SECTION_PROFILE, "Device", + "Android/" + (Integer.valueOf(padId) + 4) + "/Touchscreen"); + } + + NativeLibrary.SetProfileSetting(profile, Settings.SECTION_PROFILE, key, + value); + + // Enable the profile + NativeLibrary.LoadGameIniFile(gameId); + NativeLibrary.SetUserSetting(gameId, Settings.SECTION_CONTROLS, + KEY_WIIMOTE_PROFILE + (Integer.valueOf(padId) + 1), profile); + NativeLibrary.SaveGameIniFile(gameId); + } + private static String mapSectionNameFromIni(String generalSectionName) { if (sectionsMap.getForward(generalSectionName) != null) @@ -487,10 +570,20 @@ public final class SettingsFile private static File getCustomGameSettingsFile(String gameId) { + return new File( DirectoryInitialization.getUserDirectory() + "/GameSettings/" + gameId + ".ini"); } + private static File getWiiProfile(String profile, String padId) + { + String wiiConfigPath = + DirectoryInitialization.getUserDirectory() + "/Config/Profiles/Wiimote/" + + profile + ".ini"; + + return new File(wiiConfigPath); + } + private static SettingSection sectionFromLine(String line, boolean isCustomGame) { String sectionName = line.substring(1, line.length() - 1); @@ -626,4 +719,10 @@ public final class SettingsFile { return setting.getKey() + " = " + setting.getValueAsString(); } + + private static String customWiimoteExtSettingAsString(Setting setting) + { + return setting.getKey().substring(0, setting.getKey().length() - 1) + " = " + + setting.getValueAsString(); + } } diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java index b0132c215f..c8b54b36f0 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java @@ -16,6 +16,7 @@ import android.support.v4.content.LocalBroadcastManager; import org.dolphinemu.dolphinemu.NativeLibrary; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -139,8 +140,14 @@ public final class DirectoryInitialization // // TODO: Redo the Android controller system so that we don't have to extract these INIs. String configDirectory = NativeLibrary.GetUserDirectory() + File.separator + "Config"; + String profileDirectory = + NativeLibrary.GetUserDirectory() + File.separator + "Config/Profiles/Wiimote/"; + createWiimoteProfileDirectory(profileDirectory); + copyAsset("GCPadNew.ini", new File(configDirectory, "GCPadNew.ini"), true, context); copyAsset("WiimoteNew.ini", new File(configDirectory, "WiimoteNew.ini"), false, context); + copyAsset("WiimoteProfile.ini", new File(profileDirectory, "WiimoteProfile.ini"), true, + context); } private static void deleteDirectoryRecursively(File file) @@ -247,6 +254,20 @@ public final class DirectoryInitialization } } + public static void copyFile(String from, String to) + { + try + { + InputStream in = new FileInputStream(from); + OutputStream out = new FileOutputStream(to); + copyFile(in, out); + } + catch (IOException e) + { + + } + } + private static void copyFile(InputStream in, OutputStream out) throws IOException { byte[] buffer = new byte[1024]; @@ -258,6 +279,15 @@ public final class DirectoryInitialization } } + private static void createWiimoteProfileDirectory(String directory) + { + File wiiPath = new File(directory); + if (!wiiPath.isDirectory()) + { + wiiPath.mkdirs(); + } + } + private static native void CreateUserDirectories(); private static native void SetSysDirectory(String path); diff --git a/Source/Android/app/src/main/res/values/arrays.xml b/Source/Android/app/src/main/res/values/arrays.xml index 21a5c4f7b3..403e27b2b1 100644 --- a/Source/Android/app/src/main/res/values/arrays.xml +++ b/Source/Android/app/src/main/res/values/arrays.xml @@ -306,9 +306,17 @@ Right Stick - + Core Settings GFX Settings + GameCube Controller Settings + Clear Game Settings + + + Core Settings + GFX Settings + GameCube Controller Settings + Wii Controller Settings Clear Game Settings diff --git a/Source/Android/jni/ButtonManager.cpp b/Source/Android/jni/ButtonManager.cpp index 637b23b3da..251c754968 100644 --- a/Source/Android/jni/ButtonManager.cpp +++ b/Source/Android/jni/ButtonManager.cpp @@ -335,7 +335,7 @@ static void AddBind(const std::string& dev, sBind* bind) m_controllers[dev]->AddBind(bind); } -void Init() +void Init(const std::string& gameId) { // Initialize our touchScreenKey buttons for (int a = 0; a < 8; ++a) @@ -592,6 +592,40 @@ void Init() new sBind(padID, configTypes[a], type, bindnum, modifier == '-' ? -1.0f : 1.0f)); } } + + ini.Load(File::GetUserPath(D_GAMESETTINGS_IDX) + std::string(gameId + ".ini")); + for (u32 a = 0; a < configStrings.size(); ++a) + { + for (int padID = 0; padID < 8; ++padID) + { + std::ostringstream config; + config << configStrings[a] << "_" << padID; + BindType type; + int bindnum; + char dev[128]; + bool hasbind = false; + char modifier = '+'; + std::string value; + ini.GetOrCreateSection("Android")->Get(config.str(), &value, "None"); + if (value == "None") + continue; + if (std::string::npos != value.find("Axis")) + { + hasbind = true; + type = BIND_AXIS; + sscanf(value.c_str(), "Device '%127[^\']'-Axis %d%c", dev, &bindnum, &modifier); + } + else if (std::string::npos != value.find("Button")) + { + hasbind = true; + type = BIND_BUTTON; + sscanf(value.c_str(), "Device '%127[^\']'-Button %d", dev, &bindnum); + } + if (hasbind) + AddBind(std::string(dev), + new sBind(padID, configTypes[a], type, bindnum, modifier == '-' ? -1.0f : 1.0f)); + } + } } bool GetButtonPressed(int padID, ButtonType button) diff --git a/Source/Android/jni/ButtonManager.h b/Source/Android/jni/ButtonManager.h index b9744f516c..82f64e6d4d 100644 --- a/Source/Android/jni/ButtonManager.h +++ b/Source/Android/jni/ButtonManager.h @@ -250,7 +250,7 @@ public: float AxisValue(int padID, ButtonType axis); }; -void Init(); +void Init(const std::string&); bool GetButtonPressed(int padID, ButtonType button); float GetAxisValue(int padID, ButtonType axis); bool GamepadEvent(const std::string& dev, int button, int action); diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index 34e2b06c5e..f4692af117 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -3,6 +3,7 @@ // Refer to the license.txt file included. #include +#include #include #include #include @@ -60,6 +61,7 @@ namespace static constexpr char DOLPHIN_TAG[] = "DolphinEmuNative"; ANativeWindow* s_surf; +IniFile s_ini; // The Core only supports using a single Host thread. // If multiple threads want to call host functions then they need to queue @@ -250,8 +252,10 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfiling jboolean enable); JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_WriteProfileResults(JNIEnv* env, jobject obj); + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Z( JNIEnv* env, jobject obj, jstring jFile, jboolean jfirstOpen); + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Run__Ljava_lang_String_2Ljava_lang_String_2Z( JNIEnv* env, jobject obj, jstring jFile, jstring jSavestate, jboolean jDeleteSavestate); @@ -358,16 +362,50 @@ JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetUserSe return ToJString(env, value.c_str()); } +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_LoadGameIniFile(JNIEnv* env, + jobject obj, + jstring jGameID) +{ + std::string gameid = GetJString(env, jGameID); + s_ini.Load(File::GetUserPath(D_GAMESETTINGS_IDX) + gameid + ".ini"); +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SaveGameIniFile(JNIEnv* env, + jobject obj, + jstring jGameID) +{ + std::string gameid = GetJString(env, jGameID); + s_ini.Save(File::GetUserPath(D_GAMESETTINGS_IDX) + gameid + ".ini"); +} + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetUserSetting( JNIEnv* env, jobject obj, jstring jGameID, jstring jSection, jstring jKey, jstring jValue) { - IniFile ini; std::string gameid = GetJString(env, jGameID); std::string section = GetJString(env, jSection); std::string key = GetJString(env, jKey); std::string val = GetJString(env, jValue); - ini.Load(File::GetUserPath(D_GAMESETTINGS_IDX) + gameid + ".ini"); + if (val != "-1") + { + s_ini.GetOrCreateSection(section)->Set(key, val); + } + else + { + s_ini.GetOrCreateSection(section)->Delete(key); + } +} + +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetProfileSetting( + JNIEnv* env, jobject obj, jstring jProfile, jstring jSection, jstring jKey, jstring jValue) +{ + IniFile ini; + std::string profile = GetJString(env, jProfile); + std::string section = GetJString(env, jSection); + std::string key = GetJString(env, jKey); + std::string val = GetJString(env, jValue); + + ini.Load(File::GetUserPath(D_CONFIG_IDX) + "Profiles/Wiimote/" + profile + ".ini"); if (val != "-1") { @@ -378,7 +416,7 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetUserSetti ini.GetOrCreateSection(section)->Delete(key); } - ini.Save(File::GetUserPath(D_GAMESETTINGS_IDX) + gameid + ".ini"); + ini.Save(File::GetUserPath(D_CONFIG_IDX) + "Profiles/Wiimote/" + profile + ".ini"); } JNIEXPORT jstring JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_GetConfig( @@ -539,7 +577,6 @@ static void Run(const std::string& path, bool first_open, __android_log_print(ANDROID_LOG_INFO, DOLPHIN_TAG, "Running : %s", path.c_str()); // Install our callbacks - OSD::AddCallback(OSD::CallbackType::Initialization, ButtonManager::Init); OSD::AddCallback(OSD::CallbackType::Shutdown, ButtonManager::Shutdown); RegisterMsgAlertHandler(&MsgAlert); @@ -563,6 +600,7 @@ static void Run(const std::string& path, bool first_open, WindowSystemInfo wsi(WindowSystemType::Android, nullptr, s_surf); if (BootManager::BootCore(std::move(boot), wsi)) { + ButtonManager::Init(SConfig::GetInstance().GetGameID()); static constexpr int TIMEOUT = 10000; static constexpr int WAIT_STEP = 25; int time_waited = 0;