Add tests, mocks and lint
This commit is contained in:
parent
7d95feadc1
commit
ccd684ea40
24 changed files with 523 additions and 96 deletions
|
|
@ -41,7 +41,6 @@ import io.element.android.libraries.architecture.BackstackNode
|
|||
import io.element.android.libraries.architecture.animation.rememberDefaultTransitionHandler
|
||||
import io.element.android.libraries.architecture.createNode
|
||||
import io.element.android.libraries.di.SessionScope
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import kotlinx.parcelize.Parcelize
|
||||
|
||||
@ContributesNode(SessionScope::class)
|
||||
|
|
|
|||
|
|
@ -16,16 +16,12 @@
|
|||
|
||||
package io.element.android.features.preferences.impl.notifications
|
||||
|
||||
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||
|
||||
sealed interface NotificationSettingsEvents {
|
||||
|
||||
data object RefreshSystemNotificationsEnabled : NotificationSettingsEvents
|
||||
data class SetNotificationsEnabled(val enabled: Boolean) : NotificationSettingsEvents
|
||||
data class SetAtRoomNotificationsEnabled(val enabled: Boolean) : NotificationSettingsEvents
|
||||
data class SetCallNotificationsEnabled(val enabled: Boolean) : NotificationSettingsEvents
|
||||
data class SetDefaultGroupNotificationMode(val mode: RoomNotificationMode) : NotificationSettingsEvents
|
||||
data class SetDefaultOneToOneNotificationMode(val mode: RoomNotificationMode) : NotificationSettingsEvents
|
||||
data object FixConfigurationMismatch : NotificationSettingsEvents
|
||||
data object ClearConfigurationMismatchError : NotificationSettingsEvents
|
||||
}
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ import dagger.assisted.Assisted
|
|||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.anvilannotations.ContributesNode
|
||||
import io.element.android.libraries.di.SessionScope
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
|
||||
@ContributesNode(SessionScope::class)
|
||||
class NotificationSettingsNode @AssistedInject constructor(
|
||||
|
|
|
|||
|
|
@ -56,8 +56,8 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
.getNotificationEnabledForDevice()
|
||||
.collectAsState(initial = false)
|
||||
|
||||
val matrixSettings: MutableState<NotificationSettingsState.MatrixNotificationSettings> = remember {
|
||||
mutableStateOf(NotificationSettingsState.MatrixNotificationSettings.Uninitialized)
|
||||
val matrixSettings: MutableState<NotificationSettingsState.MatrixSettings> = remember {
|
||||
mutableStateOf(NotificationSettingsState.MatrixSettings.Uninitialized)
|
||||
}
|
||||
|
||||
LaunchedEffect(Unit) {
|
||||
|
|
@ -69,18 +69,20 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
when (event) {
|
||||
is NotificationSettingsEvents.SetAtRoomNotificationsEnabled -> localCoroutineScope.setAtRoomNotificationsEnabled(event.enabled)
|
||||
is NotificationSettingsEvents.SetCallNotificationsEnabled -> localCoroutineScope.setCallNotificationsEnabled(event.enabled)
|
||||
is NotificationSettingsEvents.SetDefaultGroupNotificationMode -> localCoroutineScope.setDefaultGroupNotificationMode(event.mode)
|
||||
is NotificationSettingsEvents.SetDefaultOneToOneNotificationMode -> localCoroutineScope.setDefaultOneToOneNotificationMode(event.mode)
|
||||
is NotificationSettingsEvents.SetNotificationsEnabled -> localCoroutineScope.setNotificationsEnabled(userPushStore, event.enabled)
|
||||
NotificationSettingsEvents.ClearConfigurationMismatchError -> matrixSettings.value = NotificationSettingsState.MatrixNotificationSettings.InvalidNotificationSettingsState(fixFailed = false)
|
||||
NotificationSettingsEvents.ClearConfigurationMismatchError -> {
|
||||
matrixSettings.value = NotificationSettingsState.MatrixSettings.Invalid(fixFailed = false)
|
||||
}
|
||||
NotificationSettingsEvents.FixConfigurationMismatch -> localCoroutineScope.fixConfigurationMismatch(matrixSettings)
|
||||
NotificationSettingsEvents.RefreshSystemNotificationsEnabled -> systemNotificationsEnabled.value = systemNotificationsEnabledProvider.notificationsEnabled()
|
||||
NotificationSettingsEvents.RefreshSystemNotificationsEnabled -> {
|
||||
systemNotificationsEnabled.value = systemNotificationsEnabledProvider.notificationsEnabled()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NotificationSettingsState(
|
||||
matrixNotificationSettings = matrixSettings.value,
|
||||
appNotificationSettings = NotificationSettingsState.AppNotificationSettings(
|
||||
matrixSettings = matrixSettings.value,
|
||||
appSettings = NotificationSettingsState.AppSettings(
|
||||
systemNotificationsEnabled = systemNotificationsEnabled.value,
|
||||
appNotificationsEnabled = appNotificationsEnabled.value
|
||||
),
|
||||
|
|
@ -89,7 +91,7 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
}
|
||||
|
||||
@OptIn(FlowPreview::class)
|
||||
private fun CoroutineScope.observeNotificationSettings(target: MutableState<NotificationSettingsState.MatrixNotificationSettings>) {
|
||||
private fun CoroutineScope.observeNotificationSettings(target: MutableState<NotificationSettingsState.MatrixSettings>) {
|
||||
notificationSettingsService.notificationSettingsChangeFlow
|
||||
.debounce(0.5.seconds)
|
||||
.onEach {
|
||||
|
|
@ -98,7 +100,7 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
.launchIn(this)
|
||||
}
|
||||
|
||||
private fun CoroutineScope.fetchSettings(target: MutableState<NotificationSettingsState.MatrixNotificationSettings>) = launch {
|
||||
private fun CoroutineScope.fetchSettings(target: MutableState<NotificationSettingsState.MatrixSettings>) = launch {
|
||||
val groupDefaultMode = notificationSettingsService.getDefaultRoomNotificationMode(isEncrypted = false, isOneToOne = false).getOrThrow()
|
||||
val encryptedGroupDefaultMode = notificationSettingsService.getDefaultRoomNotificationMode(isEncrypted = true, isOneToOne = false).getOrThrow()
|
||||
|
||||
|
|
@ -106,14 +108,14 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
val encryptedOneToOneDefaultMode = notificationSettingsService.getDefaultRoomNotificationMode(isEncrypted = true, isOneToOne = true).getOrThrow()
|
||||
|
||||
if(groupDefaultMode != encryptedGroupDefaultMode || oneToOneDefaultMode != encryptedOneToOneDefaultMode) {
|
||||
target.value = NotificationSettingsState.MatrixNotificationSettings.InvalidNotificationSettingsState(fixFailed = false)
|
||||
target.value = NotificationSettingsState.MatrixSettings.Invalid(fixFailed = false)
|
||||
return@launch
|
||||
}
|
||||
|
||||
val callNotificationsEnabled = notificationSettingsService.isCallEnabled().getOrThrow()
|
||||
val atRoomNotificationsEnabled = notificationSettingsService.isRoomMentionEnabled().getOrThrow()
|
||||
|
||||
target.value = NotificationSettingsState.MatrixNotificationSettings.ValidNotificationSettingsState(
|
||||
target.value = NotificationSettingsState.MatrixSettings.Valid(
|
||||
atRoomNotificationsEnabled = atRoomNotificationsEnabled,
|
||||
callNotificationsEnabled = callNotificationsEnabled,
|
||||
defaultGroupNotificationMode = encryptedGroupDefaultMode,
|
||||
|
|
@ -121,7 +123,7 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
)
|
||||
}
|
||||
|
||||
private fun CoroutineScope.fixConfigurationMismatch(target: MutableState<NotificationSettingsState.MatrixNotificationSettings>) = launch {
|
||||
private fun CoroutineScope.fixConfigurationMismatch(target: MutableState<NotificationSettingsState.MatrixSettings>) = launch {
|
||||
runCatching {
|
||||
val groupDefaultMode = notificationSettingsService.getDefaultRoomNotificationMode(isEncrypted = false, isOneToOne = false).getOrThrow()
|
||||
val encryptedGroupDefaultMode = notificationSettingsService.getDefaultRoomNotificationMode(isEncrypted = true, isOneToOne = false).getOrThrow()
|
||||
|
|
@ -147,7 +149,7 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
}.fold(
|
||||
onSuccess = {},
|
||||
onFailure = {
|
||||
target.value = NotificationSettingsState.MatrixNotificationSettings.InvalidNotificationSettingsState(fixFailed = true)
|
||||
target.value = NotificationSettingsState.MatrixSettings.Invalid(fixFailed = true)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
|
@ -160,27 +162,7 @@ class NotificationSettingsPresenter @Inject constructor(
|
|||
notificationSettingsService.setCallEnabled(enabled)
|
||||
}
|
||||
|
||||
private fun CoroutineScope.setDefaultGroupNotificationMode(mode: RoomNotificationMode) = launch {
|
||||
notificationSettingsService.setDefaultRoomNotificationMode(false, mode, false)
|
||||
notificationSettingsService.setDefaultRoomNotificationMode(true, mode, false)
|
||||
}
|
||||
|
||||
private fun CoroutineScope.setDefaultOneToOneNotificationMode(mode: RoomNotificationMode) = launch {
|
||||
notificationSettingsService.setDefaultRoomNotificationMode(false, mode, true)
|
||||
notificationSettingsService.setDefaultRoomNotificationMode(true, mode, true)
|
||||
}
|
||||
|
||||
private fun CoroutineScope.setNotificationsEnabled(userPushStore: UserPushStore, enabled: Boolean) = launch {
|
||||
userPushStore.setNotificationEnabledForDevice(enabled)
|
||||
}
|
||||
|
||||
private fun CoroutineScope.getDefaultRoomNotificationMode(isOneToOne: Boolean, defaultRoomNotificationMode: MutableState<RoomNotificationMode?>) = launch {
|
||||
val encryptedMode = notificationSettingsService.getDefaultRoomNotificationMode(true, isOneToOne).getOrThrow()
|
||||
val unencryptedMode = notificationSettingsService.getDefaultRoomNotificationMode(false, isOneToOne).getOrThrow()
|
||||
if (encryptedMode == unencryptedMode) {
|
||||
defaultRoomNotificationMode.value
|
||||
} else {
|
||||
defaultRoomNotificationMode.value = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,25 +21,25 @@ import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
|||
|
||||
@Immutable
|
||||
data class NotificationSettingsState(
|
||||
val matrixNotificationSettings: MatrixNotificationSettings,
|
||||
val appNotificationSettings: AppNotificationSettings,
|
||||
val matrixSettings: MatrixSettings,
|
||||
val appSettings: AppSettings,
|
||||
val eventSink: (NotificationSettingsEvents) -> Unit,
|
||||
) {
|
||||
sealed interface MatrixNotificationSettings {
|
||||
data object Uninitialized : MatrixNotificationSettings
|
||||
data class ValidNotificationSettingsState(
|
||||
sealed interface MatrixSettings {
|
||||
data object Uninitialized : MatrixSettings
|
||||
data class Valid(
|
||||
val atRoomNotificationsEnabled: Boolean,
|
||||
val callNotificationsEnabled: Boolean,
|
||||
val defaultGroupNotificationMode: RoomNotificationMode?,
|
||||
val defaultOneToOneNotificationMode: RoomNotificationMode?,
|
||||
) : MatrixNotificationSettings
|
||||
) : MatrixSettings
|
||||
|
||||
data class InvalidNotificationSettingsState(
|
||||
data class Invalid(
|
||||
val fixFailed: Boolean
|
||||
) : MatrixNotificationSettings
|
||||
) : MatrixSettings
|
||||
}
|
||||
|
||||
data class AppNotificationSettings(
|
||||
data class AppSettings(
|
||||
val systemNotificationsEnabled: Boolean,
|
||||
val appNotificationsEnabled: Boolean,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -27,13 +27,13 @@ open class NotificationSettingsStateProvider : PreviewParameterProvider<Notifica
|
|||
}
|
||||
|
||||
fun aNotificationSettingsState() = NotificationSettingsState(
|
||||
matrixNotificationSettings = NotificationSettingsState.MatrixNotificationSettings.ValidNotificationSettingsState(
|
||||
matrixSettings = NotificationSettingsState.MatrixSettings.Valid(
|
||||
atRoomNotificationsEnabled = true,
|
||||
callNotificationsEnabled = true,
|
||||
defaultGroupNotificationMode = RoomNotificationMode.MENTIONS_AND_KEYWORDS_ONLY,
|
||||
defaultOneToOneNotificationMode = RoomNotificationMode.ALL_MESSAGES,
|
||||
),
|
||||
appNotificationSettings = NotificationSettingsState.AppNotificationSettings(
|
||||
appSettings = NotificationSettingsState.AppSettings(
|
||||
systemNotificationsEnabled = false,
|
||||
appNotificationsEnabled = true,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -74,23 +74,21 @@ fun NotificationSettingsView(
|
|||
title = stringResource(id = CommonStrings.screen_notification_settings_title)
|
||||
) {
|
||||
|
||||
when (state.matrixNotificationSettings) {
|
||||
is NotificationSettingsState.MatrixNotificationSettings.InvalidNotificationSettingsState -> InvalidNotificationSettingsView(
|
||||
showError = state.matrixNotificationSettings.fixFailed,
|
||||
when (state.matrixSettings) {
|
||||
is NotificationSettingsState.MatrixSettings.Invalid -> InvalidNotificationSettingsView(
|
||||
showError = state.matrixSettings.fixFailed,
|
||||
onContinueClicked = { state.eventSink(NotificationSettingsEvents.FixConfigurationMismatch) },
|
||||
onDismissError = { state.eventSink(NotificationSettingsEvents.ClearConfigurationMismatchError) },
|
||||
modifier = modifier,
|
||||
)
|
||||
NotificationSettingsState.MatrixNotificationSettings.Uninitialized -> return@PreferenceView
|
||||
is NotificationSettingsState.MatrixNotificationSettings.ValidNotificationSettingsState -> NotificationSettingsContentView(
|
||||
matrixSettings = state.matrixNotificationSettings,
|
||||
systemSettings = state.appNotificationSettings,
|
||||
NotificationSettingsState.MatrixSettings.Uninitialized -> return@PreferenceView
|
||||
is NotificationSettingsState.MatrixSettings.Valid -> NotificationSettingsContentView(
|
||||
matrixSettings = state.matrixSettings,
|
||||
systemSettings = state.appSettings,
|
||||
onNotificationsEnabledChanged = { state.eventSink(NotificationSettingsEvents.SetNotificationsEnabled(it))},
|
||||
onGroupChatsClicked = { onOpenEditDefault(false) },
|
||||
onDirectChatsClicked = { onOpenEditDefault(true) },
|
||||
onMentionNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetAtRoomNotificationsEnabled(it)) },
|
||||
onCallsNotificationsChanged = { state.eventSink(NotificationSettingsEvents.SetCallNotificationsEnabled(it)) },
|
||||
modifier = modifier,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
@ -98,8 +96,8 @@ fun NotificationSettingsView(
|
|||
|
||||
@Composable
|
||||
private fun NotificationSettingsContentView(
|
||||
matrixSettings: NotificationSettingsState.MatrixNotificationSettings.ValidNotificationSettingsState,
|
||||
systemSettings: NotificationSettingsState.AppNotificationSettings,
|
||||
matrixSettings: NotificationSettingsState.MatrixSettings.Valid,
|
||||
systemSettings: NotificationSettingsState.AppSettings,
|
||||
onNotificationsEnabledChanged: (Boolean) -> Unit,
|
||||
onGroupChatsClicked: () -> Unit,
|
||||
onDirectChatsClicked: () -> Unit,
|
||||
|
|
@ -252,16 +250,16 @@ private fun ContentToPreview(state: NotificationSettingsState) {
|
|||
|
||||
@Preview
|
||||
@Composable
|
||||
internal fun InvalidNotificationSettingsViewightPreview(@PreviewParameter(NotificationSettingsStateProvider::class) state: NotificationSettingsState) =
|
||||
ElementPreviewLight { InvalidNotificationSettingsContentToPreview(state) }
|
||||
internal fun InvalidNotificationSettingsViewightPreview() =
|
||||
ElementPreviewLight { InvalidNotificationSettingsContentToPreview() }
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
internal fun InvalidNotificationSettingsViewDarkPreview(@PreviewParameter(NotificationSettingsStateProvider::class) state: NotificationSettingsState) =
|
||||
ElementPreviewDark { InvalidNotificationSettingsContentToPreview(state) }
|
||||
internal fun InvalidNotificationSettingsViewDarkPreview() =
|
||||
ElementPreviewDark { InvalidNotificationSettingsContentToPreview() }
|
||||
|
||||
@Composable
|
||||
private fun InvalidNotificationSettingsContentToPreview(state: NotificationSettingsState) {
|
||||
private fun InvalidNotificationSettingsContentToPreview() {
|
||||
InvalidNotificationSettingsView(
|
||||
showError = false,
|
||||
onContinueClicked = {},
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@ import dagger.assisted.Assisted
|
|||
import dagger.assisted.AssistedFactory
|
||||
import dagger.assisted.AssistedInject
|
||||
import io.element.android.libraries.architecture.Presenter
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
|
||||
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ fun EditDefaultNotificationSettingView(
|
|||
PreferenceCategory(title = stringResource(id = categoryTitle)) {
|
||||
|
||||
if (state.mode != null) {
|
||||
Column(modifier = modifier.selectableGroup()) {
|
||||
Column(modifier = Modifier.selectableGroup()) {
|
||||
validModes.forEach { item ->
|
||||
DefaultNotificationSettingOption(
|
||||
mode = item,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue