From e3bcc2f7c9210641b50a9e922b50cf9b6d18283e Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 29 Jul 2020 14:22:55 -0500 Subject: [PATCH] Configurable throttle period --- .../org/tasks/notifications/NotificationManager.kt | 2 +- .../main/java/org/tasks/notifications/Throttle.kt | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/tasks/notifications/NotificationManager.kt b/app/src/main/java/org/tasks/notifications/NotificationManager.kt index 031fbc231..daed9d68f 100644 --- a/app/src/main/java/org/tasks/notifications/NotificationManager.kt +++ b/app/src/main/java/org/tasks/notifications/NotificationManager.kt @@ -44,7 +44,7 @@ class NotificationManager @Inject constructor( private val reminderService: ReminderService) { private val notificationManagerCompat = NotificationManagerCompat.from(context) private val colorProvider = ColorProvider(context, preferences) - private val throttle = Throttle(NOTIFICATIONS_PER_SECOND) + private val throttle = Throttle(NOTIFICATIONS_PER_SECOND, tag = "NOTIFY") private val queue = NotificationLimiter(MAX_NOTIFICATIONS) @SuppressLint("CheckResult") diff --git a/app/src/main/java/org/tasks/notifications/Throttle.kt b/app/src/main/java/org/tasks/notifications/Throttle.kt index 34837e0a2..77aed5ca2 100644 --- a/app/src/main/java/org/tasks/notifications/Throttle.kt +++ b/app/src/main/java/org/tasks/notifications/Throttle.kt @@ -1,22 +1,26 @@ package org.tasks.notifications import kotlinx.coroutines.delay -import org.tasks.time.DateTimeUtils +import org.tasks.time.DateTimeUtils.currentTimeMillis +import timber.log.Timber internal class Throttle constructor( - ratePerSecond: Int, + ratePerPeriod: Int, + private val periodMillis: Long = 1000, + private val tag: String = "", private val sleeper: suspend (Long) -> Unit = { delay(it) }) { - private val throttle: LongArray = LongArray(ratePerSecond) + private val throttle: LongArray = LongArray(ratePerPeriod) private var oldest = 0 @Synchronized suspend fun run(runnable: suspend () -> Unit) { - val sleep = throttle[oldest] - (DateTimeUtils.currentTimeMillis() - 1000) + val sleep = throttle[oldest] - (currentTimeMillis() - periodMillis) if (sleep > 0) { + Timber.d("$tag: Throttled for ${sleep}ms") sleeper.invoke(sleep) } runnable.invoke() - throttle[oldest] = DateTimeUtils.currentTimeMillis() + throttle[oldest] = currentTimeMillis() oldest = (oldest + 1) % throttle.size } } \ No newline at end of file