Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 803e388b authored by cketti's avatar cketti
Browse files

Extract logic to convert system vibration pattern into `NotificationVibrationDecoder`

parent e316fda8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -114,4 +114,5 @@ val coreNotificationModule = module {
        )
    }
    factory { NotificationLightDecoder() }
    factory { NotificationVibrationDecoder() }
}
+26 −0
Original line number Diff line number Diff line
package com.fsck.k9.notification

import com.fsck.k9.NotificationVibration
import com.fsck.k9.VibratePattern

/**
 * Converts the vibration values read from a `NotificationChannel` into [NotificationVibration].
 */
class NotificationVibrationDecoder {
    fun decode(isVibrationEnabled: Boolean, systemPattern: List<Long>?): NotificationVibration {
        if (systemPattern == null || systemPattern.size < 2 || systemPattern.size % 2 != 0) {
            return NotificationVibration.DEFAULT
        }

        val systemPatternArray = systemPattern.toLongArray()
        val repeatCount = systemPattern.size / 2
        val pattern = VibratePattern.values()
            .firstOrNull { vibratePattern ->
                val testPattern = NotificationVibration.getSystemPattern(vibratePattern, repeatCount)

                testPattern.contentEquals(systemPatternArray)
            } ?: VibratePattern.Default

        return NotificationVibration(isVibrationEnabled, pattern, repeatCount)
    }
}
+9 −2
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.fsck.k9.mailstore.RemoteFolder
import com.fsck.k9.notification.NotificationChannelManager
import com.fsck.k9.notification.NotificationChannelManager.ChannelType
import com.fsck.k9.notification.NotificationLightDecoder
import com.fsck.k9.notification.NotificationVibrationDecoder
import com.fsck.k9.ui.R
import com.fsck.k9.ui.endtoend.AutocryptKeyTransferActivity
import com.fsck.k9.ui.settings.onClick
@@ -52,6 +53,7 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), ConfirmationDialogFr
    private val accountRemover: BackgroundAccountRemover by inject()
    private val notificationChannelManager: NotificationChannelManager by inject()
    private val notificationLightDecoder: NotificationLightDecoder by inject()
    private val notificationVibrationDecoder: NotificationVibrationDecoder by inject()

    private val vibrator by lazy { requireContext().getSystemService<Vibrator>() }
    private lateinit var dataStore: AccountSettingsDataStore
@@ -267,9 +269,14 @@ class AccountSettingsFragment : PreferenceFragmentCompat(), ConfirmationDialogFr
        }

        notificationVibrationPreference?.let { preference ->
            preference.setVibrationFromSystem(
            val notificationVibration = notificationVibrationDecoder.decode(
                isVibrationEnabled = notificationConfiguration.isVibrationEnabled,
                combinedPattern = notificationConfiguration.vibrationPattern
                systemPattern = notificationConfiguration.vibrationPattern
            )
            preference.setVibration(
                isVibrationEnabled = notificationVibration.isEnabled,
                vibratePattern = notificationVibration.pattern,
                vibrationTimes = notificationVibration.repeatCount
            )
            preference.isEnabled = true
        }
+0 −23
Original line number Diff line number Diff line
@@ -5,7 +5,6 @@ import android.content.Context
import android.util.AttributeSet
import androidx.core.content.res.TypedArrayUtils
import androidx.preference.ListPreference
import com.fsck.k9.NotificationVibration
import com.fsck.k9.VibratePattern
import com.fsck.k9.ui.R
import com.takisoft.preferencex.PreferenceFragmentCompat
@@ -61,28 +60,6 @@ constructor(
        updateSummary()
    }

    fun setVibrationFromSystem(isVibrationEnabled: Boolean, combinedPattern: List<Long>?) {
        if (combinedPattern == null || combinedPattern.size < 2 || combinedPattern.size % 2 != 0) {
            setVibration(isVibrationEnabled, DEFAULT_VIBRATE_PATTERN, DEFAULT_VIBRATION_TIMES)
            return
        }

        val combinedPatternArray = combinedPattern.toLongArray()
        val vibrationTimes = combinedPattern.size / 2
        val vibrationPattern = entryValues.asSequence()
            .map { entryValue ->
                val serializedVibratePattern = entryValue.toString().toInt()
                VibratePattern.deserialize(serializedVibratePattern)
            }
            .firstOrNull { vibratePattern ->
                val testPattern = NotificationVibration.getSystemPattern(vibratePattern, vibrationTimes)

                testPattern.contentEquals(combinedPatternArray)
            } ?: DEFAULT_VIBRATE_PATTERN

        setVibration(isVibrationEnabled, vibrationPattern, vibrationTimes)
    }

    private fun updateSummary() {
        summary = if (isVibrationEnabled) {
            val index = entryValues.indexOf(vibratePattern.serialize().toString())