Add abstraction for Android's vibrator service

This commit is contained in:
cketti 2023-02-06 19:43:02 +01:00
parent e252532000
commit f91f3e268b
4 changed files with 39 additions and 15 deletions

View file

@ -3,6 +3,7 @@ package com.fsck.k9.ui.settings
import com.fsck.k9.helper.NamedThreadFactory
import com.fsck.k9.ui.settings.account.AccountSettingsDataStoreFactory
import com.fsck.k9.ui.settings.account.AccountSettingsViewModel
import com.fsck.k9.ui.settings.account.getSystemVibrator
import com.fsck.k9.ui.settings.export.SettingsExportViewModel
import com.fsck.k9.ui.settings.general.GeneralSettingsDataStore
import com.fsck.k9.ui.settings.general.GeneralSettingsViewModel
@ -33,6 +34,7 @@ val settingsUiModule = module {
notificationController = get()
)
}
factory { getSystemVibrator(context = get()) }
viewModel { SettingsExportViewModel(context = get(), preferences = get(), settingsExporter = get()) }
viewModel { SettingsImportViewModel(get(), get()) }

View file

@ -4,12 +4,10 @@ import android.annotation.SuppressLint
import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.os.Vibrator
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.widget.Toast
import androidx.core.content.getSystemService
import androidx.core.net.toUri
import androidx.preference.ListPreference
import androidx.preference.Preference
@ -53,8 +51,8 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), ConfirmationDialogFr
private val accountRemover: BackgroundAccountRemover by inject()
private val notificationChannelManager: NotificationChannelManager by inject()
private val notificationSettingsUpdater: NotificationSettingsUpdater by inject()
private val vibrator: Vibrator by inject()
private val vibrator by lazy { requireContext().getSystemService<Vibrator>() }
private lateinit var dataStore: AccountSettingsDataStore
private var notificationSoundPreference: NotificationSoundPreference? = null
@ -203,7 +201,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), ConfirmationDialogFr
}
private fun initializeNotifications(account: Account) {
if (vibrator?.hasVibrator() != true) {
if (!vibrator.hasVibrator) {
findPreference<Preference>(PREFERENCE_NOTIFICATION_VIBRATION)?.remove()
}

View file

@ -3,8 +3,6 @@ package com.fsck.k9.ui.settings.account
import android.app.Dialog
import android.os.Build
import android.os.Bundle
import android.os.VibrationEffect
import android.os.Vibrator
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
@ -14,16 +12,16 @@ import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.TextView
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.widget.SwitchCompat
import androidx.core.content.getSystemService
import androidx.preference.PreferenceDialogFragmentCompat
import com.fsck.k9.NotificationVibration
import com.fsck.k9.VibratePattern
import com.fsck.k9.ui.R
import com.fsck.k9.ui.getEnum
import com.fsck.k9.ui.putEnum
import org.koin.android.ext.android.inject
class VibrationDialogFragment : PreferenceDialogFragmentCompat() {
private val vibrator by lazy { requireContext().getSystemService<Vibrator>() ?: error("Vibrator service missing") }
private val vibrator: Vibrator by inject()
private val vibrationPreference: VibrationPreference
get() = preference as VibrationPreference
@ -83,13 +81,7 @@ class VibrationDialogFragment : PreferenceDialogFragmentCompat() {
val vibrationTimes = adapter.vibrationTimes
val vibrationPattern = NotificationVibration.getSystemPattern(vibratePattern, vibrationTimes)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val vibrationEffect = VibrationEffect.createWaveform(vibrationPattern, -1)
vibrator.vibrate(vibrationEffect)
} else {
@Suppress("DEPRECATION")
vibrator.vibrate(vibrationPattern, -1)
}
vibrator.vibrate(vibrationPattern)
}
private inner class VibrationPatternAdapter(

View file

@ -0,0 +1,32 @@
package com.fsck.k9.ui.settings.account
import android.content.Context
import android.os.Build
import android.os.VibrationEffect
import androidx.core.content.getSystemService
import android.os.Vibrator as VibratorService
interface Vibrator {
val hasVibrator: Boolean
fun vibrate(vibrationPattern: LongArray)
}
internal class AndroidVibrator(private val vibrator: VibratorService) : Vibrator {
override val hasVibrator: Boolean
get() = vibrator.hasVibrator()
override fun vibrate(vibrationPattern: LongArray) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val vibrationEffect = VibrationEffect.createWaveform(vibrationPattern, -1)
vibrator.vibrate(vibrationEffect)
} else {
@Suppress("DEPRECATION")
vibrator.vibrate(vibrationPattern, -1)
}
}
}
internal fun getSystemVibrator(context: Context): Vibrator {
val vibratorService = context.getSystemService<VibratorService>() ?: error("Vibrator service missing")
return AndroidVibrator(vibratorService)
}