tawasuyu

sergio/humanoid

HTML 13TOML 10 Definiciones

⎇ b021d6829a602218866114f86e2350d80f0500e2 keyboard/src/main/java/com/rizoma/trazo/ime/Haptics.kt 40 líneas · 1.4 KB Historia crudo

Trazo: pulido v0.4 — háptica, palabra siguiente, emojis y ajustes b021d6829 · sergio ·

1package com.rizoma.trazo.ime
2
3import android.content.Context
4import android.os.Build
5import android.os.VibrationEffect
6import android.os.Vibrator
7import android.os.VibratorManager
8import com.rizoma.trazo.data.HapticLevel
9
10/**
11 * Retorno háptico del teclado. Usa el Vibrator del sistema con control de amplitud
12 * cuando el dispositivo lo soporta; si no, cae a la vibración por defecto. Todo es
13 * best-effort: sin vibrador o con cualquier fallo, simplemente no hace nada.
14 */
15class Haptics(context: Context) {
16
17    private val vibrator: Vibrator? = run {
18        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
19            val vm = context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as? VibratorManager
20            vm?.defaultVibrator
21        } else {
22            @Suppress("DEPRECATION")
23            context.getSystemService(Context.VIBRATOR_SERVICE) as? Vibrator
24        }
25    }
26
27    fun tap(level: HapticLevel) {
28        val v = vibrator ?: return
29        if (!v.hasVibrator()) return
30        val (ms, amp) = when (level) {
31            HapticLevel.SUAVE -> 8L to 70
32            HapticLevel.MEDIO -> 14L to 130
33            HapticLevel.FUERTE -> 22L to 210
34        }
35        runCatching {
36            val amplitude = if (v.hasAmplitudeControl()) amp else VibrationEffect.DEFAULT_AMPLITUDE
37            v.vibrate(VibrationEffect.createOneShot(ms, amplitude))
38        }
39    }
40}