Change type of NotificationSettingsState.currentPushDistributor from AsyncAction to AsyncData

This commit is contained in:
Benoit Marty 2024-05-28 14:18:00 +02:00
parent 144895d5b4
commit 306b779ca5
5 changed files with 20 additions and 16 deletions

View file

@ -27,6 +27,7 @@ import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.architecture.Presenter
import io.element.android.libraries.architecture.runCatchingUpdatingState import io.element.android.libraries.architecture.runCatchingUpdatingState
import io.element.android.libraries.matrix.api.MatrixClient import io.element.android.libraries.matrix.api.MatrixClient
@ -90,16 +91,16 @@ class NotificationSettingsPresenter @Inject constructor(
distributors.map { it.second.name }.toImmutableList() distributors.map { it.second.name }.toImmutableList()
} }
var currentDistributorName by remember { mutableStateOf<AsyncAction<String>>(AsyncAction.Uninitialized) } var currentDistributorName by remember { mutableStateOf<AsyncData<String>>(AsyncData.Uninitialized) }
var refreshPushProvider by remember { mutableIntStateOf(0) } var refreshPushProvider by remember { mutableIntStateOf(0) }
LaunchedEffect(refreshPushProvider) { LaunchedEffect(refreshPushProvider) {
val p = pushService.getCurrentPushProvider() val p = pushService.getCurrentPushProvider()
val name = p?.getCurrentDistributor(matrixClient)?.name val name = p?.getCurrentDistributor(matrixClient)?.name
currentDistributorName = if (name != null) { currentDistributorName = if (name != null) {
AsyncAction.Success(name) AsyncData.Success(name)
} else { } else {
AsyncAction.Failure(Exception("Failed to get current push provider")) AsyncData.Failure(Exception("Failed to get current push provider"))
} }
} }
@ -112,7 +113,7 @@ class NotificationSettingsPresenter @Inject constructor(
data ?: return@launch data ?: return@launch
// No op if the value is the same. // No op if the value is the same.
if (data.second.name == currentDistributorName.dataOrNull()) return@launch if (data.second.name == currentDistributorName.dataOrNull()) return@launch
currentDistributorName = AsyncAction.Loading currentDistributorName = AsyncData.Loading(currentDistributorName.dataOrNull())
data.let { (pushProvider, distributor) -> data.let { (pushProvider, distributor) ->
pushService.registerWith( pushService.registerWith(
matrixClient = matrixClient, matrixClient = matrixClient,
@ -124,7 +125,7 @@ class NotificationSettingsPresenter @Inject constructor(
refreshPushProvider++ refreshPushProvider++
}, },
{ {
currentDistributorName = AsyncAction.Failure(it) currentDistributorName = AsyncData.Failure(it)
} }
) )
} }

View file

@ -18,6 +18,7 @@ package io.element.android.features.preferences.impl.notifications
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableList
@ -26,7 +27,7 @@ data class NotificationSettingsState(
val matrixSettings: MatrixSettings, val matrixSettings: MatrixSettings,
val appSettings: AppSettings, val appSettings: AppSettings,
val changeNotificationSettingAction: AsyncAction<Unit>, val changeNotificationSettingAction: AsyncAction<Unit>,
val currentPushDistributor: AsyncAction<String>, val currentPushDistributor: AsyncData<String>,
val availablePushDistributors: ImmutableList<String>, val availablePushDistributors: ImmutableList<String>,
val showChangePushProviderDialog: Boolean, val showChangePushProviderDialog: Boolean,
val eventSink: (NotificationSettingsEvents) -> Unit, val eventSink: (NotificationSettingsEvents) -> Unit,

View file

@ -18,6 +18,7 @@ package io.element.android.features.preferences.impl.notifications
import androidx.compose.ui.tooling.preview.PreviewParameterProvider import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.matrix.api.room.RoomNotificationMode import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentListOf
import kotlinx.collections.immutable.toImmutableList import kotlinx.collections.immutable.toImmutableList
@ -35,8 +36,8 @@ open class NotificationSettingsStateProvider : PreviewParameterProvider<Notifica
), ),
aValidNotificationSettingsState(availablePushDistributors = listOf("Firebase")), aValidNotificationSettingsState(availablePushDistributors = listOf("Firebase")),
aValidNotificationSettingsState(showChangePushProviderDialog = true), aValidNotificationSettingsState(showChangePushProviderDialog = true),
aValidNotificationSettingsState(currentPushDistributor = AsyncAction.Loading), aValidNotificationSettingsState(currentPushDistributor = AsyncData.Loading()),
aValidNotificationSettingsState(currentPushDistributor = AsyncAction.Failure(Exception("Failed to change distributor"))), aValidNotificationSettingsState(currentPushDistributor = AsyncData.Failure(Exception("Failed to change distributor"))),
aInvalidNotificationSettingsState(), aInvalidNotificationSettingsState(),
aInvalidNotificationSettingsState(fixFailed = true), aInvalidNotificationSettingsState(fixFailed = true),
) )
@ -49,7 +50,7 @@ fun aValidNotificationSettingsState(
inviteForMeNotificationsEnabled: Boolean = true, inviteForMeNotificationsEnabled: Boolean = true,
systemNotificationsEnabled: Boolean = true, systemNotificationsEnabled: Boolean = true,
appNotificationEnabled: Boolean = true, appNotificationEnabled: Boolean = true,
currentPushDistributor: AsyncAction<String> = AsyncAction.Success("Firebase"), currentPushDistributor: AsyncData<String> = AsyncData.Success("Firebase"),
availablePushDistributors: List<String> = listOf("Firebase", "ntfy"), availablePushDistributors: List<String> = listOf("Firebase", "ntfy"),
showChangePushProviderDialog: Boolean = false, showChangePushProviderDialog: Boolean = false,
eventSink: (NotificationSettingsEvents) -> Unit = {}, eventSink: (NotificationSettingsEvents) -> Unit = {},
@ -84,7 +85,7 @@ fun aInvalidNotificationSettingsState(
appNotificationsEnabled = true, appNotificationsEnabled = true,
), ),
changeNotificationSettingAction = AsyncAction.Uninitialized, changeNotificationSettingAction = AsyncAction.Uninitialized,
currentPushDistributor = AsyncAction.Uninitialized, currentPushDistributor = AsyncData.Uninitialized,
availablePushDistributors = persistentListOf(), availablePushDistributors = persistentListOf(),
showChangePushProviderDialog = false, showChangePushProviderDialog = false,
eventSink = eventSink, eventSink = eventSink,

View file

@ -28,7 +28,7 @@ import androidx.lifecycle.Lifecycle
import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.preferences.impl.R import io.element.android.features.preferences.impl.R
import io.element.android.libraries.androidutils.system.startNotificationSettingsIntent import io.element.android.libraries.androidutils.system.startNotificationSettingsIntent
import io.element.android.libraries.architecture.AsyncAction import io.element.android.libraries.architecture.AsyncData
import io.element.android.libraries.designsystem.atomic.molecules.DialogLikeBannerMolecule import io.element.android.libraries.designsystem.atomic.molecules.DialogLikeBannerMolecule
import io.element.android.libraries.designsystem.components.async.AsyncActionView import io.element.android.libraries.designsystem.components.async.AsyncActionView
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
@ -188,9 +188,8 @@ private fun NotificationSettingsContentView(
Text(text = stringResource(id = R.string.screen_advanced_settings_push_provider_android)) Text(text = stringResource(id = R.string.screen_advanced_settings_push_provider_android))
}, },
trailingContent = when (state.currentPushDistributor) { trailingContent = when (state.currentPushDistributor) {
AsyncAction.Uninitialized, AsyncData.Uninitialized,
AsyncAction.Confirming, is AsyncData.Loading -> ListItemContent.Custom {
AsyncAction.Loading -> ListItemContent.Custom {
CircularProgressIndicator( CircularProgressIndicator(
modifier = Modifier modifier = Modifier
.progressSemantics() .progressSemantics()
@ -198,10 +197,10 @@ private fun NotificationSettingsContentView(
strokeWidth = 2.dp strokeWidth = 2.dp
) )
} }
is AsyncAction.Failure -> ListItemContent.Text( is AsyncData.Failure -> ListItemContent.Text(
stringResource(id = CommonStrings.common_error) stringResource(id = CommonStrings.common_error)
) )
is AsyncAction.Success -> ListItemContent.Text( is AsyncData.Success -> ListItemContent.Text(
state.currentPushDistributor.dataOrNull() ?: "" state.currentPushDistributor.dataOrNull() ?: ""
) )
}, },

View file

@ -91,6 +91,8 @@ sealed interface AsyncData<out T> {
fun isSuccess(): Boolean = this is Success<T> fun isSuccess(): Boolean = this is Success<T>
fun isUninitialized(): Boolean = this == Uninitialized fun isUninitialized(): Boolean = this == Uninitialized
fun isReady() = isSuccess() || isFailure()
} }
suspend inline fun <T> MutableState<AsyncData<T>>.runCatchingUpdatingState( suspend inline fun <T> MutableState<AsyncData<T>>.runCatchingUpdatingState(