diff --git a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt index 0e0c9043e374f1249ce818aab7eaeb27757fd634..358b46ee5fb845b2e4d19de97627769e1e5e1d0a 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationBanner.kt @@ -18,17 +18,22 @@ package org.briarproject.briar.desktop.expiration +import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.material.Icon +import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.Surface import androidx.compose.material.Text import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Warning import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -52,23 +57,35 @@ fun main() = preview { } @Composable -fun ExpirationBanner(onExpired: () -> Unit) { +fun ColumnScope.ExpirationBanner(onExpired: () -> Unit) { var daysLeft by remember { mutableStateOf(0) } var expired by remember { mutableStateOf(false) } + + var hideTimestamp by remember { mutableStateOf(0L) } + + var showExpirationBanner by remember { mutableStateOf(value = true) } + LaunchedEffect(Unit) { periodicallyCheckIfExpired( reportDaysLeft = { daysLeft = it }, - onExpired = { expired = true; onExpired() }, + onExpiry = { expired = true; onExpired() }, + reportHideThreshold = { showExpirationBanner = hideTimestamp <= it } ) } - if (!expired) ExpirationBanner(daysLeft) + AnimatedVisibility(showExpirationBanner && !expired) { + ExpirationBanner(daysLeft) { + hideTimestamp = System.currentTimeMillis() + showExpirationBanner = false + } + } } @Composable fun ExpirationBanner( daysLeft: Int, + hide: () -> Unit, ) = Surface( color = MaterialTheme.colors.error, modifier = Modifier.fillMaxWidth() @@ -87,5 +104,11 @@ fun ExpirationBanner( text = text, style = MaterialTheme.typography.body2 ) + Spacer(Modifier.weight(1f)) + IconButton( + onClick = hide, + ) { + Icon(Icons.Filled.Close, i18n("hide"), Modifier.size(32.dp)) + } } } diff --git a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt index d9716edd921d51dcfb78bbf386f16f2490d77ce0..0694ada55d9374f40e36f1b766ca3db3fb09618b 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/expiration/ExpirationUtils.kt @@ -29,10 +29,12 @@ object ExpirationUtils { private val EXPIRE_AFTER = BuildData.GIT_TIME + 91.days.inWholeMilliseconds private val CHECK_INTERVAL = 1.hours.inWholeMilliseconds + private val HIDE_INTERVAL = 1.days.inWholeMilliseconds // for testing uncomment the following instead // private val EXPIRE_AFTER = Instant.now().toEpochMilli() + 10.seconds.inWholeMilliseconds // private val CHECK_INTERVAL = 1.seconds.inWholeMilliseconds + // private val HIDE_INTERVAL = 10.seconds.inWholeMilliseconds private fun getMillisLeft() = (EXPIRE_AFTER - Instant.now().toEpochMilli()).milliseconds @@ -40,15 +42,20 @@ object ExpirationUtils { private fun isExpired() = getMillisLeft() <= 0.milliseconds + private fun hideThreshold() = System.currentTimeMillis() - HIDE_INTERVAL + suspend fun periodicallyCheckIfExpired( reportDaysLeft: (Int) -> Unit, - onExpired: () -> Unit, + onExpiry: () -> Unit, + reportHideThreshold: (Long) -> Unit, ) { while (true) { + reportDaysLeft(getDaysLeft()) if (isExpired()) { - onExpired() - break - } else reportDaysLeft(getDaysLeft()) + onExpiry() + } + + reportHideThreshold(hideThreshold()) delay(CHECK_INTERVAL) } } diff --git a/src/main/resources/strings/BriarDesktop.properties b/src/main/resources/strings/BriarDesktop.properties index 08146b58a6bc82946b0fbd4f753a589454d73e08..8cc8b55bb99116e0fbc9d1b465a80290312d3379 100644 --- a/src/main/resources/strings/BriarDesktop.properties +++ b/src/main/resources/strings/BriarDesktop.properties @@ -170,6 +170,7 @@ error=Error warning=Warning unsupported_feature=Unfortunately, this feature is not yet supported by Briar Desktop. remove=Remove +hide=Hide # Compose text edit actions copy=Copy