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 6574d22199..585506f419 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 @@ -397,6 +397,8 @@ public final class NativeLibrary */ public static native void RefreshWiimotes(); + public static native void ReloadWiimoteConfig(); + private static boolean alertResult = false; public static boolean displayAlertMsg(final String caption, final String text, 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 f5309869d5..012b11de7c 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 @@ -74,12 +74,14 @@ public final class EmulationActivity extends AppCompatActivity private boolean activityRecreated; private String mSelectedTitle; + private String mSelectedGameId; private int mPlatform; private String[] mPaths; private boolean backPressedOnce = false; public static final String EXTRA_SELECTED_GAMES = "SelectedGames"; public static final String EXTRA_SELECTED_TITLE = "SelectedTitle"; + public static final String EXTRA_SELECTED_GAMEID = "SelectedGameId"; public static final String EXTRA_PLATFORM = "Platform"; @Retention(SOURCE) @@ -91,7 +93,7 @@ public final class EmulationActivity extends AppCompatActivity MENU_ACTION_SAVE_SLOT6, MENU_ACTION_LOAD_SLOT1, MENU_ACTION_LOAD_SLOT2, MENU_ACTION_LOAD_SLOT3, MENU_ACTION_LOAD_SLOT4, MENU_ACTION_LOAD_SLOT5, MENU_ACTION_LOAD_SLOT6, MENU_ACTION_EXIT, MENU_ACTION_CHANGE_DISC, - MENU_ACTION_RESET_OVERLAY}) + MENU_ACTION_RESET_OVERLAY, MENU_SET_IR_SENSITIVITY}) public @interface MenuAction { } @@ -123,6 +125,7 @@ public final class EmulationActivity extends AppCompatActivity public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 24; public static final int MENU_ACTION_RUMBLE = 25; public static final int MENU_ACTION_RESET_OVERLAY = 26; + public static final int MENU_SET_IR_SENSITIVITY = 27; private static SparseIntArray buttonsActionsMap = new SparseIntArray(); @@ -165,6 +168,8 @@ public final class EmulationActivity extends AppCompatActivity buttonsActionsMap.append(R.id.menu_emulation_rumble, EmulationActivity.MENU_ACTION_RUMBLE); buttonsActionsMap .append(R.id.menu_emulation_reset_overlay, EmulationActivity.MENU_ACTION_RESET_OVERLAY); + buttonsActionsMap.append(R.id.menu_emulation_set_ir_sensitivity, + EmulationActivity.MENU_SET_IR_SENSITIVITY); } private static String[] scanForSecondDisc(GameFile gameFile) @@ -182,6 +187,7 @@ public final class EmulationActivity extends AppCompatActivity launcher.putExtra(EXTRA_SELECTED_GAMES, scanForSecondDisc(gameFile)); launcher.putExtra(EXTRA_SELECTED_TITLE, gameFile.getTitle()); + launcher.putExtra(EXTRA_SELECTED_GAMEID, gameFile.getGameId()); launcher.putExtra(EXTRA_PLATFORM, gameFile.getPlatform()); activity.startActivityForResult(launcher, MainPresenter.REQUEST_EMULATE_GAME); } @@ -201,6 +207,7 @@ public final class EmulationActivity extends AppCompatActivity Intent gameToEmulate = getIntent(); mPaths = gameToEmulate.getStringArrayExtra(EXTRA_SELECTED_GAMES); mSelectedTitle = gameToEmulate.getStringExtra(EXTRA_SELECTED_TITLE); + mSelectedGameId = gameToEmulate.getStringExtra(EXTRA_SELECTED_GAMEID); mPlatform = gameToEmulate.getIntExtra(EXTRA_PLATFORM, 0); activityRecreated = false; } @@ -294,6 +301,7 @@ public final class EmulationActivity extends AppCompatActivity } outState.putStringArray(EXTRA_SELECTED_GAMES, mPaths); outState.putString(EXTRA_SELECTED_TITLE, mSelectedTitle); + outState.putString(EXTRA_SELECTED_GAMEID, mSelectedGameId); outState.putInt(EXTRA_PLATFORM, mPlatform); super.onSaveInstanceState(outState); } @@ -302,6 +310,7 @@ public final class EmulationActivity extends AppCompatActivity { mPaths = savedInstanceState.getStringArray(EXTRA_SELECTED_GAMES); mSelectedTitle = savedInstanceState.getString(EXTRA_SELECTED_TITLE); + mSelectedGameId = savedInstanceState.getString(EXTRA_SELECTED_GAMEID); mPlatform = savedInstanceState.getInt(EXTRA_PLATFORM); } @@ -578,6 +587,10 @@ public final class EmulationActivity extends AppCompatActivity FileBrowserHelper.openFilePicker(this, REQUEST_CHANGE_DISC); return; + case MENU_SET_IR_SENSITIVITY: + setIRSensitivity(); + return; + case MENU_ACTION_EXIT: // ATV menu is built using a fragment, this will pop that fragment before emulation ends. if (TvUtil.isLeanback(getApplicationContext())) @@ -785,6 +798,132 @@ public final class EmulationActivity extends AppCompatActivity } + private void setIRSensitivity() + { + int irHeight = Integer.valueOf( + mPreferences.getString(SettingsFile.KEY_WIIBIND_IR_HEIGHT + mSelectedGameId, "50")); + + LayoutInflater inflater = LayoutInflater.from(this); + View view = inflater.inflate(R.layout.dialog_ir_sensitivity, null); + + TextView mTextSliderValueHeight = (TextView) view.findViewById(R.id.text_ir_height); + TextView units = (TextView) view.findViewById(R.id.text_ir_height_units); + SeekBar seekbarHeight = view.findViewById(R.id.seekbar_height); + + mTextSliderValueHeight.setText(String.valueOf(irHeight)); + units.setText(getString(R.string.height)); + seekbarHeight.setMax(100); + seekbarHeight.setProgress(irHeight); + seekbarHeight.setKeyProgressIncrement(5); + seekbarHeight.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() + { + @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) + { + mTextSliderValueHeight.setText(String.valueOf(progress)); + } + + @Override public void onStartTrackingTouch(SeekBar seekBar) + { + // Do nothing + } + + @Override public void onStopTrackingTouch(SeekBar seekBar) + { + // Do nothing + } + }); + + int irWidth = Integer.valueOf( + mPreferences.getString(SettingsFile.KEY_WIIBIND_IR_WIDTH + mSelectedGameId, "50")); + + TextView mTextSliderValueWidth = (TextView) view.findViewById(R.id.text_ir_width); + TextView unitsWidth = (TextView) view.findViewById(R.id.text_ir_width_units); + SeekBar seekbarWidth = view.findViewById(R.id.seekbar_width); + + mTextSliderValueWidth.setText(String.valueOf(irWidth)); + unitsWidth.setText(getString(R.string.width)); + seekbarWidth.setMax(100); + seekbarWidth.setProgress(irWidth); + seekbarWidth.setKeyProgressIncrement(5); + seekbarWidth.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() + { + @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) + { + mTextSliderValueWidth.setText(String.valueOf(progress)); + } + + @Override public void onStartTrackingTouch(SeekBar seekBar) + { + // Do nothing + } + + @Override public void onStopTrackingTouch(SeekBar seekBar) + { + // Do nothing + } + }); + + + int irCenter = Integer.valueOf( + mPreferences.getString(SettingsFile.KEY_WIIBIND_IR_CENTER + mSelectedGameId, "50")); + + TextView mTextSliderValueCenter = (TextView) view.findViewById(R.id.text_ir_center); + TextView unitsCenter = (TextView) view.findViewById(R.id.text_ir_center_units); + SeekBar seekbarCenter = view.findViewById(R.id.seekbar_center); + + mTextSliderValueCenter.setText(String.valueOf(irCenter)); + unitsCenter.setText(getString(R.string.center)); + seekbarCenter.setMax(100); + seekbarCenter.setProgress(irCenter); + seekbarCenter.setKeyProgressIncrement(5); + seekbarCenter.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() + { + @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) + { + mTextSliderValueCenter.setText(String.valueOf(progress)); + } + + @Override public void onStartTrackingTouch(SeekBar seekBar) + { + // Do nothing + } + + @Override public void onStopTrackingTouch(SeekBar seekBar) + { + // Do nothing + } + }); + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.emulation_ir_sensitivity)); + builder.setView(view); + builder.setPositiveButton(R.string.ok, (dialogInterface, i) -> + { + SettingsFile.saveSingleCustomSetting(mSelectedGameId, Settings.SECTION_CONTROLS, + SettingsFile.KEY_WIIBIND_IR_HEIGHT, mTextSliderValueHeight.getText().toString()); + SettingsFile.saveSingleCustomSetting(mSelectedGameId, Settings.SECTION_CONTROLS, + SettingsFile.KEY_WIIBIND_IR_WIDTH, mTextSliderValueWidth.getText().toString()); + SettingsFile.saveSingleCustomSetting(mSelectedGameId, Settings.SECTION_CONTROLS, + SettingsFile.KEY_WIIBIND_IR_CENTER, mTextSliderValueCenter.getText().toString()); + + NativeLibrary.ReloadWiimoteConfig(); + + SharedPreferences.Editor editor = mPreferences.edit(); + editor.putString(SettingsFile.KEY_WIIBIND_IR_HEIGHT + mSelectedGameId, + mTextSliderValueHeight.getText().toString()); + editor.putString(SettingsFile.KEY_WIIBIND_IR_WIDTH + mSelectedGameId, + mTextSliderValueWidth.getText().toString()); + editor.putString(SettingsFile.KEY_WIIBIND_IR_CENTER + mSelectedGameId, + mTextSliderValueCenter.getText().toString()); + editor.apply(); + }); + builder.setNegativeButton(R.string.cancel, (dialogInterface, i) -> + { + // Do nothing + }); + builder.show(); + } + private void resetOverlay() { new AlertDialog.Builder(this) 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 0dd027cd80..df51a38e04 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 @@ -151,6 +151,9 @@ public final class SettingsFile public static final String KEY_WIIBIND_IR_FORWARD = "IRForward_"; public static final String KEY_WIIBIND_IR_BACKWARD = "IRBackward_"; public static final String KEY_WIIBIND_IR_HIDE = "IRHide_"; + public static final String KEY_WIIBIND_IR_HEIGHT = "IRHeight"; + public static final String KEY_WIIBIND_IR_WIDTH = "IRWidth"; + public static final String KEY_WIIBIND_IR_CENTER = "IRCenter"; public static final String KEY_WIIBIND_SWING_UP = "SwingUp_"; public static final String KEY_WIIBIND_SWING_DOWN = "SwingDown_"; public static final String KEY_WIIBIND_SWING_LEFT = "SwingLeft_"; diff --git a/Source/Android/app/src/main/res/layout/dialog_ir_sensitivity.xml b/Source/Android/app/src/main/res/layout/dialog_ir_sensitivity.xml new file mode 100644 index 0000000000..8f60d318e2 --- /dev/null +++ b/Source/Android/app/src/main/res/layout/dialog_ir_sensitivity.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Android/app/src/main/res/menu/menu_emulation_wii.xml b/Source/Android/app/src/main/res/menu/menu_emulation_wii.xml index 5a26d61814..8a5a729783 100644 --- a/Source/Android/app/src/main/res/menu/menu_emulation_wii.xml +++ b/Source/Android/app/src/main/res/menu/menu_emulation_wii.xml @@ -113,6 +113,11 @@ android:id="@+id/menu_emulation_choose_controller" android:title="@string/emulation_choose_controller"/> + + diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 8c2c821aaf..a33db04ac8 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -298,6 +298,7 @@ You may have to reload the game after changing extensions. Swipe down from the top of the screen to access the menu. Reset Overlay + IR Sensitivity Enable Vibration @@ -322,4 +323,10 @@ Favorites Select This Directory + + + Height + Width + Center + diff --git a/Source/Android/jni/MainAndroid.cpp b/Source/Android/jni/MainAndroid.cpp index c606345abe..8fe7c4942f 100644 --- a/Source/Android/jni/MainAndroid.cpp +++ b/Source/Android/jni/MainAndroid.cpp @@ -571,6 +571,12 @@ JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_RefreshWiimo WiimoteReal::Refresh(); } +JNIEXPORT void JNICALL Java_org_dolphinemu_dolphinemu_NativeLibrary_ReloadWiimoteConfig(JNIEnv* env, + jobject obj) +{ + Wiimote::LoadConfig(); +} + static void Run(const std::vector& paths, bool first_open, std::optional savestate_path = {}, bool delete_savestate = false) {