mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 14:19:46 -06:00
ControllerInterface/Android: Implement rumble
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user