Skip to content

Commit

Permalink
Ensure that setting change is taken at least 300ms to avoid dialog fl…
Browse files Browse the repository at this point in the history
…ickering (#1647)
  • Loading branch information
bmarty committed Jun 12, 2024
1 parent aef6f14 commit c98863a
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
}

0 comments on commit c98863a

Please sign in to comment.