diff --git a/vector/src/main/java/im/vector/riotredesign/core/extensions/LiveData.kt b/vector/src/main/java/im/vector/riotredesign/core/extensions/LiveData.kt index 91e926c4..2bd40162 100644 --- a/vector/src/main/java/im/vector/riotredesign/core/extensions/LiveData.kt +++ b/vector/src/main/java/im/vector/riotredesign/core/extensions/LiveData.kt @@ -19,8 +19,9 @@ package im.vector.riotredesign.core.extensions import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.LiveData import androidx.lifecycle.Observer -import im.vector.riotredesign.core.utils.LiveEvent +import im.vector.riotredesign.core.utils.Debouncer import im.vector.riotredesign.core.utils.EventObserver +import im.vector.riotredesign.core.utils.LiveEvent inline fun LiveData.observeK(owner: LifecycleOwner, crossinline observer: (T?) -> Unit) { this.observe(owner, Observer { observer(it) }) @@ -32,4 +33,14 @@ inline fun LiveData.observeNotNull(owner: LifecycleOwner, crossinline obs inline fun LiveData>.observeEvent(owner: LifecycleOwner, crossinline observer: (T) -> Unit) { this.observe(owner, EventObserver { it.run(observer) }) -} \ No newline at end of file +} + +inline fun LiveData>.observeEventDebounced(owner: LifecycleOwner, minimumInterval: Long, crossinline observer: (T) -> Unit) { + val debouncer = Debouncer(minimumInterval) + + this.observe(owner, EventObserver { + if (debouncer.canHandle()) { + it.run(observer) + } + }) +} diff --git a/vector/src/main/java/im/vector/riotredesign/core/utils/Debouncer.kt b/vector/src/main/java/im/vector/riotredesign/core/utils/Debouncer.kt new file mode 100644 index 00000000..da8532ff --- /dev/null +++ b/vector/src/main/java/im/vector/riotredesign/core/utils/Debouncer.kt @@ -0,0 +1,35 @@ +/* + * Copyright 2019 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 im.vector.riotredesign.core.utils + + +/** + * Simple Debouncer + */ +class Debouncer(private val minimumInterval: Long = 800) { + private var lastDate = 0L + + fun canHandle(): Boolean { + val now = System.currentTimeMillis() + if (now > lastDate + minimumInterval) { + lastDate = now + return true + } + + // Too soon + return false + } +} \ No newline at end of file diff --git a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt index 957a0d0a..6453d04c 100644 --- a/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt +++ b/vector/src/main/java/im/vector/riotredesign/features/home/room/list/RoomListFragment.kt @@ -29,7 +29,7 @@ import im.vector.matrix.android.api.session.room.model.Membership import im.vector.matrix.android.api.session.room.model.RoomSummary import im.vector.riotredesign.R import im.vector.riotredesign.core.epoxy.LayoutManagerStateRestorer -import im.vector.riotredesign.core.extensions.observeEvent +import im.vector.riotredesign.core.extensions.observeEventDebounced import im.vector.riotredesign.core.platform.OnBackPressed import im.vector.riotredesign.core.platform.StateView import im.vector.riotredesign.core.platform.VectorBaseFragment @@ -71,7 +71,7 @@ class RoomListFragment : VectorBaseFragment(), RoomSummaryController.Callback, O setupCreateRoomButton() setupRecyclerView() roomListViewModel.subscribe { renderState(it) } - roomListViewModel.openRoomLiveData.observeEvent(this) { + roomListViewModel.openRoomLiveData.observeEventDebounced(this, 800L) { navigator.openRoom(requireActivity(), it) }