From a590204c685e6cb3dea4ca486bf43b83588200ae Mon Sep 17 00:00:00 2001 From: Ryan Meredith Date: Wed, 24 Jun 2020 21:00:13 -0400 Subject: [PATCH] Android: Wii Overlay Controller Overhaul --- .../dolphinemu/dolphinemu/NativeLibrary.java | 2 + .../activities/EmulationActivity.java | 99 +++++++++++--- .../ui/SettingsActivityPresenter.java | 123 +++++++++++++++++- .../ui/SettingsFragmentPresenter.java | 12 ++ .../features/settings/utils/SettingsFile.java | 3 + .../dolphinemu/overlay/InputOverlay.java | 57 +++++++- .../app/src/main/res/values/arrays.xml | 2 +- .../app/src/main/res/values/strings.xml | 6 +- Source/Android/jni/MainAndroid.cpp | 27 ++++ Source/Core/Core/ConfigManager.cpp | 11 ++ Source/Core/Core/ConfigManager.h | 2 + 11 files changed, 314 insertions(+), 30 deletions(-) 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 3751385be862..1c70b6879379 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 @@ -367,6 +367,8 @@ public static native String GetConfig(String configFile, String Section, String public static native void ReloadConfig(); + public static native void SetOverlaySIDevice(int SIDevice0); + /** * Initializes the native parts of the app. * diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java index bd5747189600..dea72fb1a97a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/activities/EmulationActivity.java @@ -420,19 +420,17 @@ public void onBackPressed() protected void onActivityResult(int requestCode, int resultCode, Intent result) { super.onActivityResult(requestCode, resultCode, result); - switch (requestCode) + if (requestCode == REQUEST_CHANGE_DISC) { - case REQUEST_CHANGE_DISC: - // If the user picked a file, as opposed to just backing out. - if (resultCode == MainActivity.RESULT_OK) + // If the user picked a file, as opposed to just backing out. + if (resultCode == MainActivity.RESULT_OK) + { + String newDiscPath = FileBrowserHelper.getSelectedPath(result); + if (!TextUtils.isEmpty(newDiscPath)) { - String newDiscPath = FileBrowserHelper.getSelectedPath(result); - if (!TextUtils.isEmpty(newDiscPath)) - { - NativeLibrary.ChangeDisc(newDiscPath); - } + NativeLibrary.ChangeDisc(newDiscPath); } - break; + } } } @@ -891,6 +889,7 @@ public void onStopTrackingTouch(SeekBar seekBar) private void chooseController() { + final Handler handler = new Handler(); final SharedPreferences.Editor editor = mPreferences.edit(); AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.DolphinDialogBase); builder.setTitle(R.string.emulation_choose_controller); @@ -899,11 +898,20 @@ private void chooseController() (dialog, indexSelected) -> { editor.putInt("wiiController", indexSelected); - NativeLibrary.SetConfig("WiimoteNew.ini", "Wiimote1", "Extension", + + handleWiiOverlayDisablesControllersSetting(indexSelected, false); + + NativeLibrary.SetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", + SettingsFile.KEY_WIIMOTE_PLAYER_1, SettingsFile.KEY_WIIMOTE_EXTENSION, getResources().getStringArray(R.array.controllersValues)[indexSelected]); - NativeLibrary.SetConfig("WiimoteNew.ini", "Wiimote1", - "Options/Sideways Wiimote", indexSelected == 2 ? "True" : "False"); - NativeLibrary.ReloadWiimoteConfig(); + NativeLibrary.SetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", + SettingsFile.KEY_WIIMOTE_PLAYER_1, SettingsFile.KEY_WIIMOTE_ORIENTATION, + indexSelected == InputOverlay.OVERLAY_WIIMOTE_SIDEWAYS ? "True" : "False"); + + // Delay needed to avoid registering overlay Wii Remote as Player 2 in Super Smash + // Bros. Brawl's character selection screen when switching controllers with + // "Disable Unselected Wii Overlay Controllers" enabled. + handler.postDelayed(NativeLibrary::ReloadWiimoteConfig, 500); }); builder.setPositiveButton(getString(R.string.ok), (dialogInterface, i) -> { @@ -915,6 +923,63 @@ private void chooseController() alertDialog.show(); } + public static void handleWiiOverlayDisablesControllersSetting(int selection, boolean IsFirstRun) + { + if (NativeLibrary + .GetConfig(SettingsFile.FILE_NAME_DOLPHIN + ".ini", Settings.SECTION_INI_ANDROID, + SettingsFile.KEY_WII_OVERLAY_DISABLES_CONTROLLERS, "False") + .equals("True")) + { + // TODO: Add real controllers to Wii Input overlay so they can be changed by this setting. + if (!NativeLibrary + .GetConfig(SettingsFile.FILE_NAME_DOLPHIN + ".ini", Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCPAD_PLAYER_1, InputOverlay.EMULATED_GAMECUBE_CONTROLLER) + .equals(InputOverlay.GAMECUBE_ADAPTER)) + { + NativeLibrary + .SetConfig(SettingsFile.FILE_NAME_DOLPHIN + ".ini", Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCPAD_PLAYER_1, + selection == InputOverlay.OVERLAY_GAMECUBE ? + InputOverlay.EMULATED_GAMECUBE_CONTROLLER : + InputOverlay.DISABLED_GAMECUBE_CONTROLLER); + + NativeLibrary.SetOverlaySIDevice(selection == InputOverlay.OVERLAY_GAMECUBE ? + Integer.parseInt(InputOverlay.EMULATED_GAMECUBE_CONTROLLER) : + Integer.parseInt(InputOverlay.DISABLED_GAMECUBE_CONTROLLER)); + } + + if (!NativeLibrary + .GetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", SettingsFile.KEY_WIIMOTE_PLAYER_1, + SettingsFile.KEY_WIIMOTE_TYPE, "1").equals("2")) + { + NativeLibrary.SetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", + SettingsFile.KEY_WIIMOTE_PLAYER_1, SettingsFile.KEY_WIIMOTE_TYPE, + selection == InputOverlay.OVERLAY_GAMECUBE ? "0" : "1"); + } + } + // The following code is unnecessary on first run. + else if (!IsFirstRun) + { + if (selection == InputOverlay.OVERLAY_GAMECUBE) + { + NativeLibrary + .SetConfig(SettingsFile.FILE_NAME_DOLPHIN + ".ini", + Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCPAD_PLAYER_1, + InputOverlay.EMULATED_GAMECUBE_CONTROLLER); + + NativeLibrary + .SetOverlaySIDevice( + Integer.parseInt(InputOverlay.EMULATED_GAMECUBE_CONTROLLER)); + } + else + { + NativeLibrary.SetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", + SettingsFile.KEY_WIIMOTE_PLAYER_1, SettingsFile.KEY_WIIMOTE_TYPE, "1"); + } + } + } + private void showMotionControlsOptions() { final SharedPreferences.Editor editor = mPreferences.edit(); @@ -974,7 +1039,7 @@ private void chooseOrientation() private void setIRSensitivity() { - int ir_pitch = Integer.valueOf( + int ir_pitch = Integer.parseInt( mPreferences.getString(SettingsFile.KEY_WIIBIND_IR_PITCH + mSelectedGameId, "15")); LayoutInflater inflater = LayoutInflater.from(this); @@ -1007,7 +1072,7 @@ private void setIRSensitivity() } }); - int ir_yaw = Integer.valueOf( + int ir_yaw = Integer.parseInt( mPreferences.getString(SettingsFile.KEY_WIIBIND_IR_YAW + mSelectedGameId, "15")); TextView text_slider_value_yaw = (TextView) view.findViewById(R.id.text_ir_yaw); @@ -1038,7 +1103,7 @@ private void setIRSensitivity() }); - int ir_vertical_offset = Integer.valueOf( + int ir_vertical_offset = Integer.parseInt( mPreferences.getString(SettingsFile.KEY_WIIBIND_IR_VERTICAL_OFFSET + mSelectedGameId, "10")); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java index a66391d8bb8d..ce7e05edc0f1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsActivityPresenter.java @@ -2,11 +2,16 @@ import android.content.Context; import android.content.IntentFilter; +import android.content.SharedPreferences; import android.os.Bundle; +import android.preference.PreferenceManager; import android.text.TextUtils; +import org.dolphinemu.dolphinemu.NativeLibrary; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.settings.model.Settings; +import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile; +import org.dolphinemu.dolphinemu.overlay.InputOverlay; import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; import org.dolphinemu.dolphinemu.utils.DirectoryInitialization.DirectoryInitializationState; import org.dolphinemu.dolphinemu.utils.DirectoryStateReceiver; @@ -17,6 +22,14 @@ public final class SettingsActivityPresenter { + public static final int WIIMOTE_PLAYER_1_DISABLED = 0; + public static final int WIIMOTE_PLAYER_1_EMULATED = 1; + public static final int WIIMOTE_PLAYER_1_REAL = 2; + + public static final int WIIMOTE_PLAYER_1_EXT_NONE = 0; + public static final int WIIMOTE_PLAYER_1_EXT_NUNCHUK = 1; + public static final int WIIMOTE_PLAYER_1_EXT_CLASSIC = 2; + private static final String KEY_SHOULD_SAVE = "should_save"; private SettingsActivityView mView; @@ -172,11 +185,10 @@ public void onBackPressed() public boolean handleOptionsItem(int itemId) { - switch (itemId) + if (itemId == R.id.menu_save_exit) { - case R.id.menu_save_exit: - mView.finish(); - return true; + mView.finish(); + return true; } return false; @@ -204,6 +216,22 @@ public boolean shouldSave() public void onGcPadSettingChanged(MenuTag key, int value) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + final SharedPreferences.Editor editor = preferences.edit(); + + if (key == MenuTag.GCPAD_1) // Player 1 + { + if (value == 6) // Emulated GC Controller + { + editor.putInt("wiiController", InputOverlay.OVERLAY_GAMECUBE); + } + else + { + editor.putInt("wiiController", InputOverlay.OVERLAY_NONE); + } + editor.commit(); + } + if (value != 0) // Not disabled { Bundle bundle = new Bundle(); @@ -214,6 +242,29 @@ public void onGcPadSettingChanged(MenuTag key, int value) public void onWiimoteSettingChanged(MenuTag menuTag, int value) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + final SharedPreferences.Editor editor = preferences.edit(); + + String extension = NativeLibrary + .GetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", SettingsFile.KEY_WIIMOTE_PLAYER_1, + SettingsFile.KEY_WIIMOTE_EXTENSION, "None"); + + if (menuTag == MenuTag.WIIMOTE_1) // Player 1 + { + switch (value) + { + case WIIMOTE_PLAYER_1_DISABLED: + case WIIMOTE_PLAYER_1_REAL: + editor.putInt("wiiController", InputOverlay.OVERLAY_NONE); + editor.commit(); + break; + + case WIIMOTE_PLAYER_1_EMULATED: + wiiOverlayDetermineExtension(context, extension); + break; + } + } + switch (value) { case 1: @@ -228,6 +279,38 @@ public void onWiimoteSettingChanged(MenuTag menuTag, int value) public void onExtensionSettingChanged(MenuTag menuTag, int value) { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + final SharedPreferences.Editor editor = preferences.edit(); + + if (menuTag == MenuTag.WIIMOTE_EXTENSION_1) // Player 1 + { + switch (value) + { + case WIIMOTE_PLAYER_1_EXT_NONE: + if (NativeLibrary + .GetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", + SettingsFile.KEY_WIIMOTE_PLAYER_1, + SettingsFile.KEY_WIIMOTE_ORIENTATION, "False").equals("False")) + { + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE); + } + else + { + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE_SIDEWAYS); + } + break; + + case WIIMOTE_PLAYER_1_EXT_NUNCHUK: + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE_NUNCHUK); + break; + + case WIIMOTE_PLAYER_1_EXT_CLASSIC: + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE_CLASSIC); + break; + } + editor.commit(); + } + if (value != 0) // None { Bundle bundle = new Bundle(); @@ -236,6 +319,38 @@ public void onExtensionSettingChanged(MenuTag menuTag, int value) } } + public static void wiiOverlayDetermineExtension(Context context, String extension) + { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); + final SharedPreferences.Editor editor = preferences.edit(); + + switch (extension) + { + case "None": + if (NativeLibrary.GetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", + SettingsFile.KEY_WIIMOTE_PLAYER_1, SettingsFile.KEY_WIIMOTE_ORIENTATION, + "False") + .equals("False")) + { + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE); + } + else + { + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE_SIDEWAYS); + } + break; + + case "Nunchuk": + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE_NUNCHUK); + break; + + case "Classic": + editor.putInt("wiiController", InputOverlay.OVERLAY_WIIMOTE_CLASSIC); + break; + } + editor.commit(); + } + public void onFileConfirmed(String file) { SettingsAdapter.onFilePickerConfirmation(file); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java index 235ab281153c..7d4417a6e1df 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/settings/ui/SettingsFragmentPresenter.java @@ -28,6 +28,7 @@ import org.dolphinemu.dolphinemu.utils.DirectoryInitialization; import org.dolphinemu.dolphinemu.utils.EGLHelper; import org.dolphinemu.dolphinemu.utils.Log; +import org.dolphinemu.dolphinemu.utils.TvUtil; import java.io.File; import java.util.ArrayList; @@ -389,12 +390,16 @@ private void addWiiSettings(ArrayList sl) Setting wiiSDWrites = null; Setting continuousScan = null; Setting wiimoteSpeaker = null; + Setting wiiOverlayDisablesControllers = null; SettingSection coreSection = mSettings.getSection(Settings.SECTION_INI_CORE); + SettingSection androidSection = mSettings.getSection(Settings.SECTION_INI_ANDROID); wiiSDCard = coreSection.getSetting(SettingsFile.KEY_WII_SD_CARD); wiiSDWrites = coreSection.getSetting(SettingsFile.KEY_WII_SD_CARD_ALLOW_WRITES); continuousScan = coreSection.getSetting(SettingsFile.KEY_WIIMOTE_SCAN); wiimoteSpeaker = coreSection.getSetting(SettingsFile.KEY_WIIMOTE_SPEAKER); + wiiOverlayDisablesControllers = + androidSection.getSetting(SettingsFile.KEY_WII_OVERLAY_DISABLES_CONTROLLERS); sl.add(new CheckBoxSetting(SettingsFile.KEY_WII_SD_CARD, Settings.SECTION_INI_CORE, R.string.insert_sd_card, R.string.insert_sd_card_description, true, wiiSDCard)); @@ -405,6 +410,13 @@ private void addWiiSettings(ArrayList sl) continuousScan)); sl.add(new CheckBoxSetting(SettingsFile.KEY_WIIMOTE_SPEAKER, Settings.SECTION_INI_CORE, R.string.wiimote_speaker, R.string.wiimote_speaker_description, true, wiimoteSpeaker)); + if (!TvUtil.isLeanback(mView.getActivity().getApplicationContext())) + { + sl.add(new CheckBoxSetting(SettingsFile.KEY_WII_OVERLAY_DISABLES_CONTROLLERS, + Settings.SECTION_INI_ANDROID, R.string.wii_overlay_disables_controllers, + R.string.wii_overlay_disables_controllers_description, false, + wiiOverlayDisablesControllers)); + } } private void addAdvancedSettings(ArrayList sl) 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 befac5732185..f13353d4e23f 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 @@ -41,6 +41,7 @@ public final class SettingsFile public static final String KEY_DSP_ENGINE = "DSPEngine"; public static final String KEY_LAST_PLATFORM_TAB = "LastPlatformTab"; + public static final String KEY_WII_OVERLAY_DISABLES_CONTROLLERS = "WiiOverlayDisablesControllers"; public static final String KEY_CPU_CORE = "CPUCore"; public static final String KEY_DUAL_CORE = "CPUThread"; @@ -151,6 +152,8 @@ public final class SettingsFile public static final String KEY_WIIMOTE_TYPE = "Source"; public static final String KEY_WIIMOTE_EXTENSION = "Extension"; + public static final String KEY_WIIMOTE_ORIENTATION = "Options/Sideways Wiimote"; + public static final String KEY_WIIMOTE_PLAYER_1 = "Wiimote1"; // Controller keys for game specific settings public static final String KEY_WIIMOTE_G_TYPE = "WiimoteSource"; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java index 10530afbb49d..dfa51e592cdf 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java @@ -32,6 +32,7 @@ import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.activities.EmulationActivity; import org.dolphinemu.dolphinemu.features.settings.model.Settings; +import org.dolphinemu.dolphinemu.features.settings.ui.SettingsActivityPresenter; import org.dolphinemu.dolphinemu.features.settings.utils.SettingsFile; import java.util.ArrayList; @@ -51,9 +52,9 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener public static final int OVERLAY_WIIMOTE_CLASSIC = 4; public static final int OVERLAY_NONE = 5; - private static final String DISABLED_GAMECUBE_CONTROLLER = "0"; - private static final String EMULATED_GAMECUBE_CONTROLLER = "6"; - private static final String GAMECUBE_ADAPTER = "12"; + public static final String DISABLED_GAMECUBE_CONTROLLER = "0"; + public static final String EMULATED_GAMECUBE_CONTROLLER = "6"; + public static final String GAMECUBE_ADAPTER = "12"; private final Set overlayButtons = new HashSet<>(); private final Set overlayDpads = new HashSet<>(); @@ -689,6 +690,9 @@ private void addClassicOverlayControls(String orientation) public void refreshControls() { + SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); + final SharedPreferences.Editor editor = preferences.edit(); + // Remove all the overlay buttons from the HashSet. overlayButtons.removeAll(overlayButtons); overlayDpads.removeAll(overlayDpads); @@ -698,19 +702,28 @@ public void refreshControls() getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT ? "-Portrait" : ""; + String Wiimote1Source = NativeLibrary + .GetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", SettingsFile.KEY_WIIMOTE_PLAYER_1, + SettingsFile.KEY_WIIMOTE_TYPE, "1"); + + String Wiimote1Extension = NativeLibrary.GetConfig(SettingsFile.FILE_NAME_WIIMOTE + ".ini", + SettingsFile.KEY_WIIMOTE_PLAYER_1, SettingsFile.KEY_WIIMOTE_EXTENSION, "None"); + + String SIDevice0 = NativeLibrary + .GetConfig(SettingsFile.FILE_NAME_DOLPHIN + ".ini", Settings.SECTION_INI_CORE, + SettingsFile.KEY_GCPAD_PLAYER_1, EMULATED_GAMECUBE_CONTROLLER); + if (mPreferences.getBoolean("showInputOverlay", true)) { // Add all the enabled overlay items back to the HashSet. if (EmulationActivity.isGameCubeGame()) { - switch (NativeLibrary - .GetConfig(SettingsFile.FILE_NAME_DOLPHIN + ".ini", Settings.SECTION_INI_CORE, - SettingsFile.KEY_GCPAD_PLAYER_1, EMULATED_GAMECUBE_CONTROLLER)) + switch (SIDevice0) { case DISABLED_GAMECUBE_CONTROLLER: if (mIsFirstRun) { - Toast.makeText(getContext(), R.string.disabled_gc_overlay_notice, Toast.LENGTH_SHORT) + Toast.makeText(getContext(), R.string.overlay_controller_disabled, Toast.LENGTH_SHORT) .show(); } break; @@ -725,6 +738,31 @@ public void refreshControls() } else { + if (mIsFirstRun) + { + // If user has disabled Player 1's GC or Wii controller, switch to the other if emulated. + if (mPreferences.getInt("wiiController", 3) == OVERLAY_NONE) + { + if (Wiimote1Source.equals("0") && SIDevice0.equals("6")) + { + editor.putInt("wiiController", InputOverlay.OVERLAY_GAMECUBE); + editor.commit(); + } + + if (Wiimote1Source.equals("1") && SIDevice0.equals("0")) + { + SettingsActivityPresenter + .wiiOverlayDetermineExtension(getContext(), Wiimote1Extension); + } + } + EmulationActivity + .handleWiiOverlayDisablesControllersSetting( + mPreferences.getInt("wiiController", 3), + true); + + NativeLibrary.ReloadWiimoteConfig(); + } + switch (mPreferences.getInt("wiiController", 3)) { case OVERLAY_GAMECUBE: @@ -746,6 +784,11 @@ public void refreshControls() break; case OVERLAY_NONE: + if (mIsFirstRun && Wiimote1Source.equals("0") && SIDevice0.equals("0")) + { + Toast.makeText(getContext(), R.string.overlay_controller_disabled, Toast.LENGTH_SHORT) + .show(); + } break; } } diff --git a/Source/Android/app/src/main/res/values/arrays.xml b/Source/Android/app/src/main/res/values/arrays.xml index 7aa538e46e3a..76e6cc6e071b 100644 --- a/Source/Android/app/src/main/res/values/arrays.xml +++ b/Source/Android/app/src/main/res/values/arrays.xml @@ -273,7 +273,7 @@ GameCube Controller - Wii Remote + Vertical Wii Remote Horizontal Wii Remote Wii Remote + Nunchuk Classic Controller diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index b99d45f88fa7..ce0c9c869aac 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -378,11 +378,15 @@ Select This Directory + + Disable Unselected Wii Overlay Controllers + Disable emulated GameCube controller when using emulated Wii Remote and vice versa. Inconvenient if switching between GameCube and Wii games. + Total Pitch Total Yaw Vertical Offset Disc %1$d - GameCube Controller 1 is set to \"None\" + Controller 1 is disabled diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index 469d719869a2..dca543e31132 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -29,6 +29,8 @@ #include "Common/Version.h" #include "Common/WindowSystemInfo.h" +#include +#include #include "Core/Analytics.h" #include "Core/Boot/Boot.h" #include "Core/BootManager.h" @@ -604,6 +606,31 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReloadConfig SConfig::GetInstance().LoadSettings(); } +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_SetOverlaySIDevice( + JNIEnv* env, jobject obj, jint gcController) +{ + SerialInterface::SIDevices SIDevice; + + SConfig::GetInstance().LoadSIDevice0Setting(); + + switch (gcController) + { + case 6: + SIDevice = SerialInterface::SIDEVICE_GC_CONTROLLER; + break; + + case 12: + SIDevice = SerialInterface::SIDEVICE_WIIU_ADAPTER; + break; + + default: + SIDevice = SerialInterface::SIDEVICE_NONE; + break; + } + + SerialInterface::ChangeDevice(SIDevice, 0); +} + JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_Initialize(JNIEnv* env, jobject obj) { diff --git a/Source/Core/Core/ConfigManager.cpp b/Source/Core/Core/ConfigManager.cpp index c85d8a296c91..1d7719cf817e 100644 --- a/Source/Core/Core/ConfigManager.cpp +++ b/Source/Core/Core/ConfigManager.cpp @@ -639,6 +639,17 @@ void SConfig::LoadJitDebugSettings(IniFile& ini) section->Get("JitRegisterCacheOff", &bJITRegisterCacheOff, false); } +void SConfig::LoadSIDevice0Setting() +{ + Config::Load(); + IniFile ini; + ini.Load(File::GetUserPath(F_DOLPHINCONFIG_IDX)); + IniFile::Section* core = ini.GetOrCreateSection("Core"); + + core->Get("SIDevice0", &m_SIDevice[0], + 0 ? SerialInterface::SIDEVICE_NONE : SerialInterface::SIDEVICE_GC_CONTROLLER); +} + void SConfig::ResetRunningGameMetadata() { SetRunningGameMetadata("00000000", "", 0, 0, DiscIO::Region::Unknown); diff --git a/Source/Core/Core/ConfigManager.h b/Source/Core/Core/ConfigManager.h index c5e1c2ccca6f..a5a02619cbaf 100644 --- a/Source/Core/Core/ConfigManager.h +++ b/Source/Core/Core/ConfigManager.h @@ -331,6 +331,8 @@ struct SConfig static void Init(); static void Shutdown(); + void LoadSIDevice0Setting(); + private: SConfig(); ~SConfig();