summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2022-09-18 19:14:15 +0200
committerJosJuice <josjuice@gmail.com>2023-03-03 22:28:23 +0100
commit8e33458f4832daedf04a626d07c4541ad17ee675 (patch)
tree61988bc5ef262b28fee20c975905bbf83f4fa112 /Source/Android/app/src/main/java
parent065481d9899e6debc94bdbbb812512757f8eac62 (diff)
ControllerInterface/Android: Implement rumble
Diffstat (limited to 'Source/Android/app/src/main/java')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/ControllerInterface.java51
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManager.java20
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerCompat.java35
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerPassthrough.java33
4 files changed, 139 insertions, 0 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/ControllerInterface.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/ControllerInterface.java
index 2b6e1d62ee..0d6a078b4e 100644
--- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/ControllerInterface.java
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/ControllerInterface.java
@@ -4,11 +4,18 @@ package org.dolphinemu.dolphinemu.features.input.model;
import android.content.Context;
import android.hardware.input.InputManager;
+import android.os.Build;
import android.os.Handler;
+import android.os.VibrationEffect;
+import android.os.Vibrator;
+import android.os.VibratorManager;
+import android.view.InputDevice;
import android.view.KeyEvent;
import android.view.MotionEvent;
import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import org.dolphinemu.dolphinemu.DolphinApplication;
import org.dolphinemu.dolphinemu.utils.LooperThread;
@@ -119,4 +126,48 @@ public final class ControllerInterface
mInputDeviceListener = null;
}
}
+
+ @Keep @NonNull
+ private static DolphinVibratorManager getVibratorManager(InputDevice device)
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
+ {
+ return new DolphinVibratorManagerPassthrough(device.getVibratorManager());
+ }
+ else
+ {
+ return new DolphinVibratorManagerCompat(device.getVibrator());
+ }
+ }
+
+ @Keep @NonNull
+ private static DolphinVibratorManager getSystemVibratorManager()
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
+ {
+ VibratorManager vibratorManager = (VibratorManager)
+ DolphinApplication.getAppContext().getSystemService(Context.VIBRATOR_MANAGER_SERVICE);
+
+ if (vibratorManager != null)
+ return new DolphinVibratorManagerPassthrough(vibratorManager);
+ }
+
+ Vibrator vibrator = (Vibrator)
+ DolphinApplication.getAppContext().getSystemService(Context.VIBRATOR_SERVICE);
+
+ return new DolphinVibratorManagerCompat(vibrator);
+ }
+
+ @Keep
+ private static void vibrate(@NonNull Vibrator vibrator)
+ {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
+ {
+ vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
+ }
+ else
+ {
+ vibrator.vibrate(100);
+ }
+ }
}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManager.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManager.java
new file mode 100644
index 0000000000..abc04d969d
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManager.java
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package org.dolphinemu.dolphinemu.features.input.model;
+
+import android.os.Vibrator;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+
+/**
+ * A wrapper around {@link android.os.VibratorManager}, for backwards compatibility.
+ */
+public interface DolphinVibratorManager
+{
+ @Keep @NonNull
+ Vibrator getVibrator(int vibratorId);
+
+ @Keep @NonNull
+ int[] getVibratorIds();
+}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerCompat.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerCompat.java
new file mode 100644
index 0000000000..40c4fa95d1
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerCompat.java
@@ -0,0 +1,35 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package org.dolphinemu.dolphinemu.features.input.model;
+
+import android.os.Vibrator;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+public final class DolphinVibratorManagerCompat implements DolphinVibratorManager
+{
+ private final Vibrator mVibrator;
+ private final int[] mIds;
+
+ public DolphinVibratorManagerCompat(@Nullable Vibrator vibrator)
+ {
+ mVibrator = vibrator;
+ mIds = vibrator != null && vibrator.hasVibrator() ? new int[]{0} : new int[]{};
+ }
+
+ @Override @NonNull
+ public Vibrator getVibrator(int vibratorId)
+ {
+ if (vibratorId > mIds.length)
+ throw new IndexOutOfBoundsException();
+
+ return mVibrator;
+ }
+
+ @Override @NonNull
+ public int[] getVibratorIds()
+ {
+ return mIds;
+ }
+}
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerPassthrough.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerPassthrough.java
new file mode 100644
index 0000000000..2ca747f54f
--- /dev/null
+++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/input/model/DolphinVibratorManagerPassthrough.java
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+package org.dolphinemu.dolphinemu.features.input.model;
+
+import android.os.Build;
+import android.os.Vibrator;
+import android.os.VibratorManager;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+@RequiresApi(api = Build.VERSION_CODES.S)
+public final class DolphinVibratorManagerPassthrough implements DolphinVibratorManager
+{
+ private final VibratorManager mVibratorManager;
+
+ public DolphinVibratorManagerPassthrough(@NonNull VibratorManager vibratorManager)
+ {
+ mVibratorManager = vibratorManager;
+ }
+
+ @Override @NonNull
+ public Vibrator getVibrator(int vibratorId)
+ {
+ return mVibratorManager.getVibrator(vibratorId);
+ }
+
+ @Override @NonNull
+ public int[] getVibratorIds()
+ {
+ return mVibratorManager.getVibratorIds();
+ }
+}