Updated on 2026-08-14
This commit is contained in:
parent
ac8436460c
commit
459db3d0df
17 changed files with 263 additions and 102 deletions
|
|
@ -1,36 +0,0 @@
|
|||
package com.tangem.tap.common.haptic
|
||||
|
||||
import android.os.Build
|
||||
import android.os.VibrationEffect
|
||||
import android.os.Vibrator
|
||||
import com.tangem.core.ui.haptic.HapticManager
|
||||
|
||||
class DefaultHapticManager(private val vibrator: Vibrator) : HapticManager {
|
||||
|
||||
override fun vibrateShort() {
|
||||
vibrate(VIBRATION_SHORT_DURATION)
|
||||
}
|
||||
|
||||
override fun vibrateMeduim() {
|
||||
vibrate(VIBRATION_MEDIUM_LOW_DURATION)
|
||||
}
|
||||
|
||||
override fun vibrateLong() {
|
||||
vibrate(VIBRATION_MEDIUM_DURATION)
|
||||
}
|
||||
|
||||
private fun vibrate(durationMs: Long) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
vibrator.vibrate(VibrationEffect.createOneShot(durationMs, VibrationEffect.DEFAULT_AMPLITUDE))
|
||||
} else {
|
||||
vibrator.vibrate(durationMs)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val VIBRATION_SHORT_DURATION = 50L
|
||||
const val VIBRATION_MEDIUM_LOW_DURATION = 75L
|
||||
const val VIBRATION_MEDIUM_DURATION = 100L
|
||||
const val VIBRATION_LONG_DURATION = 200L
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
package com.tangem.tap.common.haptic
|
||||
|
||||
import android.os.Build
|
||||
import android.os.VibrationEffect
|
||||
import android.os.Vibrator
|
||||
import androidx.annotation.ChecksSdkIntAtLeast
|
||||
import com.tangem.core.ui.haptic.TangemHapticEffect
|
||||
import com.tangem.core.ui.haptic.VibratorHapticManager
|
||||
|
||||
internal class DefaultVibratorHapticManager(
|
||||
private val vibrator: Vibrator,
|
||||
) : VibratorHapticManager {
|
||||
|
||||
private val isHapticEnabled = deviceSupportsVibrationEffects()
|
||||
|
||||
@ChecksSdkIntAtLeast(api = Build.VERSION_CODES.Q)
|
||||
private fun deviceSupportsVibrationEffects(): Boolean = when {
|
||||
!vibrator.hasVibrator() -> false
|
||||
|
||||
Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ->
|
||||
vibrator.areAllEffectsSupported(
|
||||
TangemHapticEffect.OneTime.DoubleClick.code,
|
||||
TangemHapticEffect.OneTime.HeavyClick.code,
|
||||
TangemHapticEffect.OneTime.Tick.code,
|
||||
TangemHapticEffect.OneTime.Click.code,
|
||||
) == Vibrator.VIBRATION_EFFECT_SUPPORT_YES
|
||||
|
||||
Build.VERSION.SDK_INT == Build.VERSION_CODES.Q -> true
|
||||
|
||||
else -> false
|
||||
}
|
||||
|
||||
override fun performOneTime(effect: TangemHapticEffect.OneTime) {
|
||||
if (!isHapticEnabled) return
|
||||
|
||||
vibrator.vibrate(VibrationEffect.createPredefined(effect.code))
|
||||
}
|
||||
}
|
||||
|
|
@ -4,9 +4,9 @@ import android.content.Context
|
|||
import android.os.Build
|
||||
import android.os.Vibrator
|
||||
import android.os.VibratorManager
|
||||
import com.tangem.tap.common.haptic.DefaultHapticManager
|
||||
import com.tangem.core.ui.haptic.HapticManager
|
||||
import com.tangem.core.ui.haptic.MockHapticManager
|
||||
import com.tangem.tap.common.haptic.DefaultVibratorHapticManager
|
||||
import com.tangem.core.ui.haptic.TangemHapticEffect
|
||||
import com.tangem.core.ui.haptic.VibratorHapticManager
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
|
|
@ -20,7 +20,7 @@ class HapticModule {
|
|||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideHapticManager(@ApplicationContext context: Context): HapticManager {
|
||||
fun provideHapticManager(@ApplicationContext context: Context): VibratorHapticManager {
|
||||
val vibrator = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
|
||||
val vibratorManager = context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
|
||||
vibratorManager.defaultVibrator
|
||||
|
|
@ -29,9 +29,12 @@ class HapticModule {
|
|||
}
|
||||
|
||||
return if (vibrator.hasVibrator()) {
|
||||
DefaultHapticManager(vibrator = vibrator)
|
||||
DefaultVibratorHapticManager(vibrator = vibrator)
|
||||
} else {
|
||||
MockHapticManager
|
||||
// mock
|
||||
object : VibratorHapticManager {
|
||||
override fun performOneTime(effect: TangemHapticEffect.OneTime) = Unit
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -2,7 +2,7 @@ package com.tangem.tap.di
|
|||
|
||||
import androidx.compose.material3.SnackbarHostState
|
||||
import com.tangem.core.ui.UiDependencies
|
||||
import com.tangem.core.ui.haptic.HapticManager
|
||||
import com.tangem.core.ui.haptic.VibratorHapticManager
|
||||
import com.tangem.core.ui.message.EventMessageHandler
|
||||
import com.tangem.core.ui.theme.AppThemeModeHolder
|
||||
import dagger.Module
|
||||
|
|
@ -17,9 +17,12 @@ internal object UiDependenciesModule {
|
|||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideUiDependencies(hapticManager: HapticManager, appThemeModeHolder: AppThemeModeHolder): UiDependencies {
|
||||
fun provideUiDependencies(
|
||||
vibratorHapticManager: VibratorHapticManager,
|
||||
appThemeModeHolder: AppThemeModeHolder,
|
||||
): UiDependencies {
|
||||
return object : UiDependencies {
|
||||
override val hapticManager = hapticManager
|
||||
override val vibratorHapticManager = vibratorHapticManager
|
||||
override val appThemeModeHolder = appThemeModeHolder
|
||||
override val globalSnackbarHostState: SnackbarHostState = SnackbarHostState()
|
||||
override val eventMessageHandler: EventMessageHandler = EventMessageHandler()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue