diff options
| author | zackhow <zackhow@gmail.com> | 2018-09-02 16:55:22 -0400 |
|---|---|---|
| committer | zackhow <zackhow@gmail.com> | 2018-09-07 08:54:03 -0400 |
| commit | 126ff8dc5f513b01c750cd15e19f9c1e7acf06db (patch) | |
| tree | bb5d1be0d899750aa840f1e3ccd82a294f9c7843 /Source/Android | |
| parent | 3405c7d420cb909e00a3140ab2e31b911afe176c (diff) | |
Android: Add rumble for phone
This currently only supports using the internal vibrate on a phone for rumble.
Diffstat (limited to 'Source/Android')
10 files changed, 80 insertions, 1 deletions
diff --git a/Source/Android/app/src/main/AndroidManifest.xml b/Source/Android/app/src/main/AndroidManifest.xml index 975a493860..147b658ad3 100644 --- a/Source/Android/app/src/main/AndroidManifest.xml +++ b/Source/Android/app/src/main/AndroidManifest.xml @@ -18,6 +18,7 @@ <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="com.android.providers.tv.permission.READ_EPG_DATA"/> <uses-permission android:name="com.android.providers.tv.permission.WRITE_EPG_DATA"/> + <uses-permission android:name="android.permission.VIBRATE" /> <application android:name=".DolphinApplication" diff --git a/Source/Android/app/src/main/assets/GCPadNew.ini b/Source/Android/app/src/main/assets/GCPadNew.ini index 4adea29b8c..e6993dda62 100644 --- a/Source/Android/app/src/main/assets/GCPadNew.ini +++ b/Source/Android/app/src/main/assets/GCPadNew.ini @@ -25,6 +25,7 @@ Triggers/R = `Axis 21` Triggers/L-Analog = `Axis 20` Triggers/R-Analog = `Axis 21` Triggers/Threshold = 90,000000 +Rumble/Motor = `Rumble 700` [GCPad2] Device = Android/1/Touchscreen Buttons/A = `Button 0` @@ -52,6 +53,7 @@ Triggers/R = `Axis 21` Triggers/L-Analog = `Axis 20` Triggers/R-Analog = `Axis 21` Triggers/Threshold = 90,000000 +Rumble/Motor = `Rumble 700` [GCPad3] Device = Android/2/Touchscreen Buttons/A = `Button 0` @@ -79,6 +81,7 @@ Triggers/R = `Axis 21` Triggers/L-Analog = `Axis 20` Triggers/R-Analog = `Axis 21` Triggers/Threshold = 90,000000 +Rumble/Motor = `Rumble 700` [GCPad4] Device = Android/3/Touchscreen Buttons/A = `Button 0` @@ -106,3 +109,4 @@ Triggers/R = `Axis 21` Triggers/L-Analog = `Axis 20` Triggers/R-Analog = `Axis 21` Triggers/Threshold = 90,000000 +Rumble/Motor = `Rumble 700` diff --git a/Source/Android/app/src/main/assets/WiimoteNew.ini b/Source/Android/app/src/main/assets/WiimoteNew.ini index 205733d90c..e8efbaf794 100644 --- a/Source/Android/app/src/main/assets/WiimoteNew.ini +++ b/Source/Android/app/src/main/assets/WiimoteNew.ini @@ -133,6 +133,7 @@ Turntable/Effect/Dial = `Axis 621` Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Right = `Axis 624` Source = 1 +Rumble/Motor = `Rumble 700` [Wiimote2] Device = Android/5/Touchscreen Buttons/A = `Button 100` @@ -268,6 +269,7 @@ Turntable/Effect/Dial = `Axis 621` Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Right = `Axis 624` Source = 0 +Rumble/Motor = `Rumble 700` [Wiimote3] Device = Android/6/Touchscreen Buttons/A = `Button 100` @@ -403,6 +405,7 @@ Turntable/Effect/Dial = `Axis 621` Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Right = `Axis 624` Source = 0 +Rumble/Motor = `Rumble 700` [Wiimote4] Device = Android/7/Touchscreen Buttons/A = `Button 100` @@ -538,3 +541,4 @@ Turntable/Effect/Dial = `Axis 621` Turntable/Crossfade/Left = `Axis 623` Turntable/Crossfade/Right = `Axis 624` Source = 0 +Rumble/Motor = `Rumble 700` 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 55c8182f88..acfac1e0f4 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 @@ -7,6 +7,11 @@ package org.dolphinemu.dolphinemu; import android.app.AlertDialog; +import android.content.Context; +import android.os.Build; +import android.os.VibrationEffect; +import android.os.Vibrator; +import android.preference.PreferenceManager; import android.view.Surface; import org.dolphinemu.dolphinemu.activities.EmulationActivity; @@ -225,6 +230,39 @@ public final class NativeLibrary */ public static native void onGamePadMoveEvent(String Device, int Axis, float Value); + /** + * Rumble sent from native. Currently only supports phone rumble. + * + * @param padID Ignored for now. Future use would be to pass rumble to a connected controller + * @param state Ignored for now since phone rumble can't just be 'turned' on/off + */ + public static void rumble(int padID, double state) + { + final EmulationActivity emulationActivity = sEmulationActivity.get(); + if (emulationActivity == null) + { + Log.warning("[NativeLibrary] EmulationActivity is null"); + return; + } + + if (PreferenceManager.getDefaultSharedPreferences(emulationActivity) + .getBoolean("phoneRumble", true)) + { + Vibrator vibrator = (Vibrator) emulationActivity.getSystemService(Context.VIBRATOR_SERVICE); + if (vibrator != null && vibrator.hasVibrator()) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) + { + vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE)); + } + else + { + vibrator.vibrate(100); + } + } + } + } + public static native String GetUserSetting(String gameID, String Section, String Key); public static native void SetUserSetting(String gameID, String Section, String Key, String Value); 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 221d3ee399..7eb8430935 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 @@ -124,6 +124,7 @@ public final class EmulationActivity extends AppCompatActivity 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; + public static final int MENU_ACTION_RUMBLE = 25; private static SparseIntArray buttonsActionsMap = new SparseIntArray(); @@ -163,6 +164,7 @@ public final class EmulationActivity extends AppCompatActivity 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); + buttonsActionsMap.append(R.id.menu_emulation_rumble, EmulationActivity.MENU_ACTION_RUMBLE); } public static void launch(FragmentActivity activity, GameFile gameFile, int position, @@ -473,6 +475,8 @@ public final class EmulationActivity extends AppCompatActivity // Populate the checkbox value for joystick center on touch menu.findItem(R.id.menu_emulation_joystick_rel_center) .setChecked(mPreferences.getBoolean("joystickRelCenter", true)); + menu.findItem(R.id.menu_emulation_rumble) + .setChecked(mPreferences.getBoolean("phoneRumble", true)); return true; } @@ -504,7 +508,11 @@ public final class EmulationActivity extends AppCompatActivity case MENU_ACTION_JOYSTICK_REL_CENTER: item.setChecked(!item.isChecked()); toggleJoystickRelCenter(item.isChecked()); - return; + break; + case MENU_ACTION_RUMBLE: + item.setChecked(!item.isChecked()); + toggleRumble(item.isChecked()); + break; } } @@ -636,6 +644,13 @@ public final class EmulationActivity extends AppCompatActivity editor.commit(); } + private void toggleRumble(boolean state) + { + final SharedPreferences.Editor editor = mPreferences.edit(); + editor.putBoolean("phoneRumble", state); + editor.apply(); + } + private void editControlsPlacement() { 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 bbb418018c..0a9ccfd25d 100644 --- a/Source/Android/app/src/main/res/menu/menu_emulation.xml +++ b/Source/Android/app/src/main/res/menu/menu_emulation.xml @@ -98,6 +98,10 @@ android:id="@+id/menu_emulation_joystick_rel_center" android:checkable="true" android:title="@string/emulation_control_joystick_rel_center"/> + <item + android:id="@+id/menu_emulation_rumble" + android:checkable="true" + android:title="@string/emulation_control_rumble"/> </menu> </item> 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 87c61eefc0..f0cbc6024a 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 @@ -98,11 +98,16 @@ android:id="@+id/menu_emulation_joystick_rel_center" android:checkable="true" android:title="@string/emulation_control_joystick_rel_center"/> + <item + android:id="@+id/menu_emulation_rumble" + android:checkable="true" + android:title="@string/emulation_control_rumble"/> </group> <item android:id="@+id/menu_emulation_choose_controller" android:title="@string/emulation_choose_controller"/> + </menu> </item> diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 52627892cb..c1bf44b837 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -271,6 +271,7 @@ <string name="emulation_toggle_all">Toggle All</string> <string name="emulation_control_scale">Adjust Scale</string> <string name="emulation_control_joystick_rel_center">Relative Stick Center</string> + <string name="emulation_control_rumble">Rumble</string> <string name="emulation_choose_controller">Choose Controller</string> <string name="emulation_controller_changed">You may have to reload the game after changing extensions.</string> <string name="emulation_touch_button_help">To change the button layout, open the menu -> Configure Controls -> Edit Layout</string> diff --git a/Source/Android/jni/ButtonManager.cpp b/Source/Android/jni/ButtonManager.cpp index 6f6b812494..8490561c0f 100644 --- a/Source/Android/jni/ButtonManager.cpp +++ b/Source/Android/jni/ButtonManager.cpp @@ -52,6 +52,8 @@ std::vector<std::string> configStrings = { "TurntableEuphoria", "TurntableLeftTLeft", "TurntableLeftTRight", "TurntableRightTLeft", "TurntableRightTRight", "TurntableUp", "TurntableDown", "TurntableLeft", "TurntableRight", "TurntableEffDial", "TurntableCrossLeft", "TurntableCrossRight", + // Rumble + "Rumble", }; std::vector<ButtonType> configTypes = { // GC @@ -95,6 +97,8 @@ std::vector<ButtonType> configTypes = { TURNTABLE_TABLE_RIGHT_RIGHT, TURNTABLE_STICK_UP, TURNTABLE_STICK_DOWN, TURNTABLE_STICK_LEFT, TURNTABLE_STICK_RIGHT, TURNTABLE_EFFECT_DIAL, TURNTABLE_CROSSFADE_LEFT, TURNTABLE_CROSSFADE_RIGHT, + // Rumble + RUMBLE, }; static void AddBind(const std::string& dev, sBind* bind) @@ -462,4 +466,5 @@ float InputDevice::AxisValue(int padID, ButtonType axis) else return _buttons[binding->second->_buttontype] == BUTTON_PRESSED ? 1.0f : 0.0f; } + } diff --git a/Source/Android/jni/ButtonManager.h b/Source/Android/jni/ButtonManager.h index c65d8180f0..b9744f516c 100644 --- a/Source/Android/jni/ButtonManager.h +++ b/Source/Android/jni/ButtonManager.h @@ -176,6 +176,8 @@ enum ButtonType TURNTABLE_CROSSFADE = 622, // To Be Used on Java Side TURNTABLE_CROSSFADE_LEFT = 623, TURNTABLE_CROSSFADE_RIGHT = 624, + // Rumble + RUMBLE = 700, }; enum ButtonState { |
