Browse Source

Ensure that setting change is taken at least 300ms to avoid dialog flickering (#1647)

pull/3022/head
Benoit Marty 3 months ago committed by Benoit Marty
parent
commit
c98863a70e
  1. 5
      features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt
  2. 30
      libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/Suspend.kt

5
features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/notificationsettings/RoomNotificationSettingsPresenter.kt

@ -32,6 +32,7 @@ import io.element.android.libraries.architecture.AsyncAction @@ -32,6 +32,7 @@ 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.runCatchingUpdatingState
import io.element.android.libraries.core.coroutine.suspendWithMinimumDuration
import io.element.android.libraries.matrix.api.notificationsettings.NotificationSettingsService
import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
@ -171,7 +172,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( @@ -171,7 +172,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor(
pendingDefaultState: MutableState<Boolean?>,
action: MutableState<AsyncAction<Unit>>
) = launch {
suspend {
suspendWithMinimumDuration {
pendingModeState.value = mode
pendingDefaultState.value = false
val result = notificationSettingsService.setRoomNotificationMode(room.roomId, mode)
@ -187,7 +188,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor( @@ -187,7 +188,7 @@ class RoomNotificationSettingsPresenter @AssistedInject constructor(
action: MutableState<AsyncAction<Unit>>,
pendingDefaultState: MutableState<Boolean?>
) = launch {
suspend {
suspendWithMinimumDuration {
pendingDefaultState.value = true
val result = notificationSettingsService.restoreDefaultRoomNotificationMode(room.roomId)
if (result.isFailure) {

30
libraries/core/src/main/kotlin/io/element/android/libraries/core/coroutine/Suspend.kt

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
/*
* Copyright (c) 2024 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.element.android.libraries.core.coroutine
import kotlinx.coroutines.delay
import kotlin.system.measureTimeMillis
fun suspendWithMinimumDuration(
minimumDurationMillis: Long = 500,
block: suspend () -> Unit
) = suspend {
val duration = measureTimeMillis {
block()
}
delay(minimumDurationMillis - duration)
}
Loading…
Cancel
Save