suyu/src/android/app/src/main/java/dev/suyu/suyu_emu/features/input/SuyuVibrator.kt

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

78 lines
2.6 KiB
Kotlin
Raw Normal View History

// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
2024-03-12 03:30:43 +01:00
// SPDX-FileCopyrightText: 2024 suyu Emulator Project
2024-03-05 09:42:40 +01:00
// SPDX-License-Identifier: GPL-2.0-or-later
2024-04-01 02:08:49 +02:00
package dev.suyu.suyu_emu.features.input
2024-03-05 09:42:40 +01:00
import android.content.Context
import android.os.Build
import android.os.CombinedVibration
import android.os.VibrationEffect
import android.os.Vibrator
import android.os.VibratorManager
import android.view.InputDevice
import androidx.annotation.Keep
import androidx.annotation.RequiresApi
2024-04-01 02:08:49 +02:00
import dev.suyu.suyu_emu.SuyuApplication
2024-03-05 09:42:40 +01:00
@Keep
@Suppress("DEPRECATION")
2024-03-12 03:30:43 +01:00
interface SuyuVibrator {
2024-03-05 09:42:40 +01:00
fun supportsVibration(): Boolean
fun vibrate(intensity: Float)
companion object {
2024-03-12 03:30:43 +01:00
fun getControllerVibrator(device: InputDevice): SuyuVibrator =
2024-03-05 09:42:40 +01:00
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
2024-03-12 03:30:43 +01:00
SuyuVibratorManager(device.vibratorManager)
2024-03-05 09:42:40 +01:00
} else {
2024-03-12 03:30:43 +01:00
SuyuVibratorManagerCompat(device.vibrator)
2024-03-05 09:42:40 +01:00
}
2024-03-12 03:30:43 +01:00
fun getSystemVibrator(): SuyuVibrator =
2024-03-05 09:42:40 +01:00
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
2024-03-12 03:30:43 +01:00
val vibratorManager = SuyuApplication.appContext
2024-03-05 09:42:40 +01:00
.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
2024-03-12 03:30:43 +01:00
SuyuVibratorManager(vibratorManager)
2024-03-05 09:42:40 +01:00
} else {
2024-03-12 03:30:43 +01:00
val vibrator = SuyuApplication.appContext
2024-03-05 09:42:40 +01:00
.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
2024-03-12 03:30:43 +01:00
SuyuVibratorManagerCompat(vibrator)
2024-03-05 09:42:40 +01:00
}
fun getVibrationEffect(intensity: Float): VibrationEffect? {
if (intensity > 0f) {
return VibrationEffect.createOneShot(
50,
(255.0 * intensity).toInt().coerceIn(1, 255)
)
}
return null
}
}
}
@RequiresApi(Build.VERSION_CODES.S)
2024-03-12 03:30:43 +01:00
class SuyuVibratorManager(private val vibratorManager: VibratorManager) : SuyuVibrator {
2024-03-05 09:42:40 +01:00
override fun supportsVibration(): Boolean {
return vibratorManager.vibratorIds.isNotEmpty()
}
override fun vibrate(intensity: Float) {
2024-03-12 03:30:43 +01:00
val vibration = SuyuVibrator.getVibrationEffect(intensity) ?: return
2024-03-05 09:42:40 +01:00
vibratorManager.vibrate(CombinedVibration.createParallel(vibration))
}
}
2024-03-12 03:30:43 +01:00
class SuyuVibratorManagerCompat(private val vibrator: Vibrator) : SuyuVibrator {
2024-03-05 09:42:40 +01:00
override fun supportsVibration(): Boolean {
return vibrator.hasVibrator()
}
override fun vibrate(intensity: Float) {
2024-03-12 03:30:43 +01:00
val vibration = SuyuVibrator.getVibrationEffect(intensity) ?: return
2024-03-05 09:42:40 +01:00
vibrator.vibrate(vibration)
}
}