mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2025-02-09 16:48:54 +01:00
Implement FirstThrottler, to gain 200 ms for first refresh
This commit is contained in:
parent
0693ce13e4
commit
af023669ba
@ -39,7 +39,7 @@ inline fun <T> LiveData<LiveEvent<T>>.observeEventFirstThrottle(owner: Lifecycle
|
||||
val firstThrottler = FirstThrottler(minimumInterval)
|
||||
|
||||
this.observe(owner, EventObserver {
|
||||
if (firstThrottler.canHandle()) {
|
||||
if (firstThrottler.canHandle() is FirstThrottler.CanHandlerResult.Yes) {
|
||||
it.run(observer)
|
||||
}
|
||||
})
|
||||
|
@ -24,14 +24,27 @@ import android.os.SystemClock
|
||||
class FirstThrottler(private val minimumInterval: Long = 800) {
|
||||
private var lastDate = 0L
|
||||
|
||||
fun canHandle(): Boolean {
|
||||
sealed class CanHandlerResult {
|
||||
object Yes : CanHandlerResult()
|
||||
data class No(val shouldWaitMillis: Long) : CanHandlerResult()
|
||||
|
||||
fun waitMillis(): Long {
|
||||
return when (this) {
|
||||
Yes -> 0
|
||||
is No -> shouldWaitMillis
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun canHandle(): CanHandlerResult {
|
||||
val now = SystemClock.elapsedRealtime()
|
||||
if (now > lastDate + minimumInterval) {
|
||||
val delaySinceLast = now - lastDate
|
||||
if (delaySinceLast > minimumInterval) {
|
||||
lastDate = now
|
||||
return true
|
||||
return CanHandlerResult.Yes
|
||||
}
|
||||
|
||||
// Too soon
|
||||
return false
|
||||
return CanHandlerResult.No(minimumInterval - delaySinceLast)
|
||||
}
|
||||
}
|
||||
|
@ -26,6 +26,7 @@ import im.vector.app.ActiveSessionDataSource
|
||||
import im.vector.app.BuildConfig
|
||||
import im.vector.app.R
|
||||
import im.vector.app.core.resources.StringProvider
|
||||
import im.vector.app.core.utils.FirstThrottler
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
import me.gujun.android.span.span
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
@ -194,10 +195,14 @@ class NotificationDrawerManager @Inject constructor(private val context: Context
|
||||
notificationUtils.cancelNotificationMessage(roomId, ROOM_INVITATION_NOTIFICATION_ID)
|
||||
}
|
||||
|
||||
private var firstThrottler = FirstThrottler(200)
|
||||
|
||||
fun refreshNotificationDrawer() {
|
||||
// Implement last throttler
|
||||
Timber.v("refreshNotificationDrawer()")
|
||||
val canHandle = firstThrottler.canHandle()
|
||||
Timber.v("refreshNotificationDrawer(), delay: ${canHandle.waitMillis()} ms")
|
||||
backgroundHandler.removeCallbacksAndMessages(null)
|
||||
|
||||
backgroundHandler.postDelayed(
|
||||
{
|
||||
try {
|
||||
@ -206,7 +211,8 @@ class NotificationDrawerManager @Inject constructor(private val context: Context
|
||||
// It can happen if for instance session has been destroyed. It's a bit ugly to try catch like this, but it's safer
|
||||
Timber.w(throwable, "refreshNotificationDrawerBg failure")
|
||||
}
|
||||
}, 200)
|
||||
},
|
||||
canHandle.waitMillis())
|
||||
}
|
||||
|
||||
@WorkerThread
|
||||
|
@ -101,7 +101,7 @@ class VectorSettingsHelpAboutFragment @Inject constructor(
|
||||
// third party notice
|
||||
findPreference<VectorPreference>(VectorPreferences.SETTINGS_THIRD_PARTY_NOTICES_PREFERENCE_KEY)!!
|
||||
.onPreferenceClickListener = Preference.OnPreferenceClickListener {
|
||||
if (firstThrottler.canHandle()) {
|
||||
if (firstThrottler.canHandle() is FirstThrottler.CanHandlerResult.Yes) {
|
||||
activity?.displayInWebView(VectorSettingsUrls.THIRD_PARTY_LICENSES)
|
||||
}
|
||||
false
|
||||
|
Loading…
x
Reference in New Issue
Block a user