From 82ec3c929c4ef4ccaca5e587808bbfc9ed5f6098 Mon Sep 17 00:00:00 2001 From: Greg Wicks Date: Fri, 29 Jun 2018 16:09:59 -0400 Subject: [PATCH] Android: Make touch joystick re centering configurable --- .../activities/EmulationActivity.java | 34 ++++++++++++++++++- .../dolphinemu/overlay/InputOverlay.java | 2 +- .../overlay/InputOverlayDrawableJoystick.java | 13 +++++-- .../app/src/main/res/menu/menu_emulation.xml | 7 +++- .../src/main/res/menu/menu_emulation_wii.xml | 9 ++++- .../app/src/main/res/values/strings.xml | 1 + 6 files changed, 60 insertions(+), 6 deletions(-) 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 4a02cfc89c..8ecb545298 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 @@ -120,6 +120,7 @@ public final class EmulationActivity extends AppCompatActivity public static final int MENU_ACTION_LOAD_SLOT6 = 21; public static final int MENU_ACTION_EXIT = 22; public static final int MENU_ACTION_CHANGE_DISC = 23; + public static final int MENU_ACTION_JOYSTICK_REL_CENTER = 24; private static SparseIntArray buttonsActionsMap = new SparseIntArray(); @@ -147,6 +148,7 @@ public final class EmulationActivity extends AppCompatActivity buttonsActionsMap.append(R.id.menu_emulation_load_5, EmulationActivity.MENU_ACTION_LOAD_SLOT5); buttonsActionsMap.append(R.id.menu_change_disc, EmulationActivity.MENU_ACTION_CHANGE_DISC); buttonsActionsMap.append(R.id.menu_exit, EmulationActivity.MENU_ACTION_EXIT); + buttonsActionsMap.append(R.id.menu_emulation_joystick_rel_center, EmulationActivity.MENU_ACTION_JOYSTICK_REL_CENTER); } public static void launch(FragmentActivity activity, GameFile gameFile, int position, View sharedView) @@ -431,6 +433,10 @@ public final class EmulationActivity extends AppCompatActivity { getMenuInflater().inflate(R.menu.menu_emulation_wii, menu); } + + // Populate the checkbox value for joystick center on touch + menu.findItem(R.id.menu_emulation_joystick_rel_center).setChecked(mPreferences.getBoolean("joystickRelCenter", true)); + return true; } @@ -441,11 +447,30 @@ public final class EmulationActivity extends AppCompatActivity int action = buttonsActionsMap.get(item.getItemId(), -1); if (action >= 0) { - handleMenuAction(action); + if (item.isCheckable()) + { + // Need to pass a reference to the item to set the checkbox state, since it is not done automatically + handleCheckableMenuAction(action, item); + } + else + { + handleMenuAction(action); + } } return true; } + public void handleCheckableMenuAction(@MenuAction int menuAction, MenuItem item) + { + switch (menuAction) + { + case MENU_ACTION_JOYSTICK_REL_CENTER: + item.setChecked(!item.isChecked()); + toggleJoystickRelCenter(item.isChecked()); + return; + } + } + public void handleMenuAction(@MenuAction int menuAction) { switch (menuAction) @@ -565,6 +590,13 @@ public final class EmulationActivity extends AppCompatActivity } } + private void toggleJoystickRelCenter(boolean state) + { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("joystickRelCenter", state); + editor.commit(); + } + private void editControlsPlacement() { 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 1957ff7f67..d3726bf88f 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 @@ -829,7 +829,7 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener final InputOverlayDrawableJoystick overlayDrawable = new InputOverlayDrawableJoystick(res, bitmapOuter, bitmapInnerDefault, bitmapInnerPressed, - outerRect, innerRect, joystick); + outerRect, innerRect, joystick, sPrefs); // Need to set the image's position overlayDrawable.setPosition(drawableX, drawableY); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java index 1c94b44135..8083b0d2ee 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlayDrawableJoystick.java @@ -6,6 +6,8 @@ package org.dolphinemu.dolphinemu.overlay; +import android.content.Context; +import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; @@ -19,6 +21,8 @@ import android.view.MotionEvent; */ public final class InputOverlayDrawableJoystick { + private SharedPreferences mPreferences; + private final int[] axisIDs = {0, 0, 0, 0}; private final float[] axises = {0f, 0f}; private int trackId = -1; @@ -48,7 +52,7 @@ public final class InputOverlayDrawableJoystick */ public InputOverlayDrawableJoystick(Resources res, Bitmap bitmapOuter, Bitmap bitmapInnerDefault, Bitmap bitmapInnerPressed, - Rect rectOuter, Rect rectInner, int joystick) + Rect rectOuter, Rect rectInner, int joystick, SharedPreferences prefsHandle) { axisIDs[0] = joystick + 1; axisIDs[1] = joystick + 2; @@ -56,6 +60,7 @@ public final class InputOverlayDrawableJoystick axisIDs[3] = joystick + 4; mJoystickType = joystick; + mPreferences = prefsHandle; mOuterBitmap = new BitmapDrawable(res, bitmapOuter); mDefaultStateInnerBitmap = new BitmapDrawable(res, bitmapInnerDefault); mPressedStateInnerBitmap = new BitmapDrawable(res, bitmapInnerPressed); @@ -92,6 +97,7 @@ public final class InputOverlayDrawableJoystick public void TrackEvent(MotionEvent event) { + boolean reCenter = mPreferences.getBoolean("joystickRelCenter", true); int pointerIndex = event.getActionIndex(); switch(event.getAction() & MotionEvent.ACTION_MASK) @@ -103,7 +109,10 @@ public final class InputOverlayDrawableJoystick mPressedState = true; mOuterBitmap.setAlpha(0); mBoundsBoxBitmap.setAlpha(255); - getVirtBounds().offset((int)event.getX(pointerIndex) - getVirtBounds().centerX(), (int)event.getY(pointerIndex) - getVirtBounds().centerY()); + if (reCenter) + { + getVirtBounds().offset((int)event.getX(pointerIndex) - getVirtBounds().centerX(), (int)event.getY(pointerIndex) - getVirtBounds().centerY()); + } mBoundsBoxBitmap.setBounds(getVirtBounds()); trackId = event.getPointerId(pointerIndex); } diff --git a/Source/Android/app/src/main/res/menu/menu_emulation.xml b/Source/Android/app/src/main/res/menu/menu_emulation.xml index 2dacda4668..5f4c1272b1 100644 --- a/Source/Android/app/src/main/res/menu/menu_emulation.xml +++ b/Source/Android/app/src/main/res/menu/menu_emulation.xml @@ -93,6 +93,11 @@ + + @@ -101,4 +106,4 @@ app:showAsAction="never" android:title="@string/emulation_change_disc"/> - \ 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 3b8f66acf2..87c61eefc0 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 @@ -93,10 +93,17 @@ android:id="@+id/menu_emulation_adjust_scale" android:title="@string/emulation_control_scale"/> + + + + - \ No newline at end of file + diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index c3f97ae4de..a02823e383 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -246,6 +246,7 @@ Toggle Controls Toggle All Adjust Scale + Relative Stick Center Choose Controller You may have to reload the game after changing extensions.