From 9df8009ae3fd02ce3622e227e16376d76afe6696 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 21:07:20 +0200 Subject: [PATCH 01/30] Implement the current spec for event match conditions This fixes that people randomly get pinged on every reply to a user names @roomba:server.tld. fixes #2541 Signed-off-by: Nicolas Werner --- .../session/pushrules/EventMatchCondition.kt | 31 ++++++++----------- .../session/pushrules/rest/PushCondition.kt | 2 +- .../pushrules/PushRulesConditionTest.kt | 19 ++++++++++-- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index 8875807b8a..4b11bfcdd7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -31,18 +31,14 @@ class EventMatchCondition( * The glob-style pattern to match against. Patterns with no special glob characters should * be treated as having asterisks prepended and appended when testing the condition. */ - val pattern: String, - /** - * true to match only words. In this case pattern will not be considered as a glob - */ - val wordsOnly: Boolean + val pattern: String ) : Condition { override fun isSatisfied(event: Event, conditionResolver: ConditionResolver): Boolean { return conditionResolver.resolveEventMatchCondition(event, this) } - override fun technicalDescription() = "'$key' matches '$pattern', words only '$wordsOnly'" + override fun technicalDescription() = "'$key' matches '$pattern'" fun isSatisfied(event: Event): Boolean { // TODO encrypted events? @@ -50,21 +46,20 @@ class EventMatchCondition( ?: return false val value = extractField(rawJson, key) ?: return false - // Patterns with no special glob characters should be treated as having asterisks prepended - // and appended when testing the condition. + // The match is performed case-insensitively, and must match the entire value of + // the event field given by `key` (though see below regarding `content.body`). The + // exact meaning of "case insensitive" is defined by the implementation of the + // homeserver. + // + // As a special case, if `key` is `content.body`, then `pattern` must instead + // match any substring of the value of the property which starts and ends at a + // word boundary. return try { - if (wordsOnly) { + if (key == 'content.body') { value.caseInsensitiveFind(pattern) } else { - val modPattern = if (pattern.hasSpecialGlobChar()) { - // Regex.containsMatchIn() is way faster without leading and trailing - // stars, that don't make any difference for the evaluation result - pattern.removePrefix("*").removeSuffix("*").simpleGlobToRegExp() - } else { - pattern.simpleGlobToRegExp() - } - val regex = Regex(modPattern, RegexOption.DOT_MATCHES_ALL) - regex.containsMatchIn(value) + val regex = Regex(pattern.simpleGlobToRegExp(), setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) + regex.matches(value) } } catch (e: Throwable) { // e.g PatternSyntaxException diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt index ec0936e4c8..c2b45619e5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt @@ -63,7 +63,7 @@ data class PushCondition( return when (Kind.fromString(kind)) { Kind.EventMatch -> { if (key != null && pattern != null) { - EventMatchCondition(key, pattern, rule.ruleId == RuleIds.RULE_ID_CONTAIN_USER_NAME) + EventMatchCondition(key, pattern) } else { Timber.e("Malformed Event match condition") null diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt index c4a3404e80..ef6230dbbc 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt @@ -67,7 +67,7 @@ class PushRulesConditionTest : MatrixTest { ) assert(condition.isSatisfied(simpleTextEvent)) - assert(!condition.isSatisfied(simpleRoomMemberEvent)) + assertFalse(condition.isSatisfied(simpleRoomMemberEvent)) } @Test @@ -98,7 +98,7 @@ class PushRulesConditionTest : MatrixTest { val condition = EventMatchCondition("content.body", "cake", false) assert(condition.isSatisfied(createSimpleTextEvent("How was the cake?"))) - assert(condition.isSatisfied(createSimpleTextEvent("Howwasthecake?"))) + assertFalse(condition.isSatisfied(createSimpleTextEvent("Howwasthecake?"))) } @Test @@ -124,6 +124,21 @@ class PushRulesConditionTest : MatrixTest { assert(condition.isSatisfied(createSimpleTextEvent("BEN"))) } + @Test + fun test_eventmatch_at_room_condition() { + val condition = EventMatchCondition("content.body", "@room", true) + + assertFalse(condition.isSatisfied(createSimpleTextEvent("@roomba"))) + assertFalse(condition.isSatisfied(createSimpleTextEvent("room benoit"))) + assertFalse(condition.isSatisfied(createSimpleTextEvent("abc@roomba"))) + + assert(condition.isSatisfied(createSimpleTextEvent("@room"))) + assert(condition.isSatisfied(createSimpleTextEvent("@room, ben"))) + assert(condition.isSatisfied(createSimpleTextEvent("@ROOM"))) + assert(condition.isSatisfied(createSimpleTextEvent("Use:@room"))) + assert(condition.isSatisfied(createSimpleTextEvent("Don't ping @room!"))) + } + @Test fun test_notice_condition() { val conditionEqual = EventMatchCondition("content.msgtype", "m.notice", false) From 48fc634825422e9eca5b4b839ff60d06148f2414 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 21:33:21 +0200 Subject: [PATCH 02/30] Add changelog and fix condition not matching globs on body Signed-off-by: Nicolas Werner --- changelog.d/6457.bugfix | 1 + .../android/sdk/api/session/pushrules/EventMatchCondition.kt | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 changelog.d/6457.bugfix diff --git a/changelog.d/6457.bugfix b/changelog.d/6457.bugfix new file mode 100644 index 0000000000..89ba075378 --- /dev/null +++ b/changelog.d/6457.bugfix @@ -0,0 +1 @@ +Fix that replies to @roomba would be highlighted as a room ping. Contributed by Nico. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index 4b11bfcdd7..fbedb0b2a0 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -56,7 +56,8 @@ class EventMatchCondition( // word boundary. return try { if (key == 'content.body') { - value.caseInsensitiveFind(pattern) + val regex = Regex("(\\W|^)"+pattern.simpleGlobToRegExp() + "(\\W|$)", setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) + regex.containsMatchIn(value) } else { val regex = Regex(pattern.simpleGlobToRegExp(), setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) regex.matches(value) From b24b1a188490115f767c48f61c79d4fe8ca40863 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 21:35:59 +0200 Subject: [PATCH 03/30] Add negative test for globs on body only matching full words Signed-off-by: Nicolas Werner --- .../android/sdk/api/session/pushrules/PushRulesConditionTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt index ef6230dbbc..7d64217843 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt @@ -106,6 +106,7 @@ class PushRulesConditionTest : MatrixTest { val condition = EventMatchCondition("content.body", "cake*lie", false) assert(condition.isSatisfied(createSimpleTextEvent("How was the cakeisalie?"))) + assertFalse(condition.isSatisfied(createSimpleTextEvent("How was the notcakeisalie?"))) } @Test From e980f6bb2f8bc1a54074c49754a2a014b7d44424 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 21:51:49 +0200 Subject: [PATCH 04/30] kotlin is not dart Signed-off-by: Nicolas Werner --- .../android/sdk/api/session/pushrules/EventMatchCondition.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index fbedb0b2a0..293ae6c043 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -55,8 +55,8 @@ class EventMatchCondition( // match any substring of the value of the property which starts and ends at a // word boundary. return try { - if (key == 'content.body') { - val regex = Regex("(\\W|^)"+pattern.simpleGlobToRegExp() + "(\\W|$)", setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) + if (key == "content.body") { + val regex = Regex("(\\W|^)" + pattern.simpleGlobToRegExp() + "(\\W|$)", setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) regex.containsMatchIn(value) } else { val regex = Regex(pattern.simpleGlobToRegExp(), setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) From 365ec8ef722f1efb769c3e79e6825ae812ff4e07 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 21:57:56 +0200 Subject: [PATCH 05/30] Remove unused imports Signed-off-by: Nicolas Werner --- .../android/sdk/api/session/pushrules/EventMatchCondition.kt | 2 -- .../android/sdk/api/session/pushrules/rest/PushCondition.kt | 1 - 2 files changed, 3 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index 293ae6c043..e5448322e6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -17,8 +17,6 @@ package org.matrix.android.sdk.api.session.pushrules import org.matrix.android.sdk.api.session.events.model.Event import org.matrix.android.sdk.internal.di.MoshiProvider -import org.matrix.android.sdk.internal.util.caseInsensitiveFind -import org.matrix.android.sdk.internal.util.hasSpecialGlobChar import org.matrix.android.sdk.internal.util.simpleGlobToRegExp import timber.log.Timber diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt index c2b45619e5..0e175b47b9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt @@ -22,7 +22,6 @@ import org.matrix.android.sdk.api.session.pushrules.ContainsDisplayNameCondition import org.matrix.android.sdk.api.session.pushrules.EventMatchCondition import org.matrix.android.sdk.api.session.pushrules.Kind import org.matrix.android.sdk.api.session.pushrules.RoomMemberCountCondition -import org.matrix.android.sdk.api.session.pushrules.RuleIds import org.matrix.android.sdk.api.session.pushrules.SenderNotificationPermissionCondition import timber.log.Timber From 144d6c99a6b46989419abe2443e125a356746c05 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 22:07:52 +0200 Subject: [PATCH 06/30] Fix rule parameter not needed anymore --- .../android/sdk/api/session/pushrules/rest/PushCondition.kt | 2 +- .../android/sdk/internal/session/pushrules/PushRuleFinder.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt index 0e175b47b9..1b53801d0b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/rest/PushCondition.kt @@ -58,7 +58,7 @@ data class PushCondition( val iz: String? = null ) { - fun asExecutableCondition(rule: PushRule): Condition? { + fun asExecutableCondition(): Condition? { return when (Kind.fromString(kind)) { Kind.EventMatch -> { if (key != null && pattern != null) { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/PushRuleFinder.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/PushRuleFinder.kt index b9d06a934d..15e803bb91 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/PushRuleFinder.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/pushrules/PushRuleFinder.kt @@ -28,7 +28,7 @@ internal class PushRuleFinder @Inject constructor( return rules.firstOrNull { rule -> // All conditions must hold true for an event in order to apply the action for the event. rule.enabled && rule.conditions?.all { - it.asExecutableCondition(rule)?.isSatisfied(event, conditionResolver) ?: false + it.asExecutableCondition()?.isSatisfied(event, conditionResolver) ?: false } ?: false } } From f4f9851edd88a618c3a44f187f7cde29e4dc7c3b Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 22:21:22 +0200 Subject: [PATCH 07/30] Remove rule param also in files outside of the sdk --- .../java/im/vector/app/features/settings/push/PushRuleItem.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt b/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt index 5a1dd055bd..57b2595590 100644 --- a/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt +++ b/vector/src/main/java/im/vector/app/features/settings/push/PushRuleItem.kt @@ -73,7 +73,7 @@ abstract class PushRuleItem : VectorEpoxyModel(R.layout.ite pushRule.conditions?.forEachIndexed { i, condition -> if (i > 0) description.append("\n") description.append( - condition.asExecutableCondition(pushRule)?.technicalDescription() + condition.asExecutableCondition()?.technicalDescription() ?: "UNSUPPORTED" ) } From bc20ad5cf1614bc2478e3287c04a7e269d771065 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 4 Jul 2022 22:53:24 +0200 Subject: [PATCH 08/30] Fix tests still passing the word match bool Signed-off-by: Nicolas Werner --- .../session/pushrules/PushRulesConditionTest.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt index 7d64217843..3ddf940241 100644 --- a/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt +++ b/matrix-sdk-android/src/test/java/org/matrix/android/sdk/api/session/pushrules/PushRulesConditionTest.kt @@ -49,7 +49,7 @@ class PushRulesConditionTest : MatrixTest { @Test fun test_eventmatch_type_condition() { - val condition = EventMatchCondition("type", "m.room.message", false) + val condition = EventMatchCondition("type", "m.room.message") val simpleTextEvent = createSimpleTextEvent("Yo wtf?") @@ -72,7 +72,7 @@ class PushRulesConditionTest : MatrixTest { @Test fun test_eventmatch_path_condition() { - val condition = EventMatchCondition("content.msgtype", "m.text", false) + val condition = EventMatchCondition("content.msgtype", "m.text") val simpleTextEvent = createSimpleTextEvent("Yo wtf?") @@ -89,13 +89,13 @@ class PushRulesConditionTest : MatrixTest { ).toContent(), originServerTs = 0 ).apply { - assert(EventMatchCondition("content.membership", "invite", false).isSatisfied(this)) + assert(EventMatchCondition("content.membership", "invite").isSatisfied(this)) } } @Test fun test_eventmatch_cake_condition() { - val condition = EventMatchCondition("content.body", "cake", false) + val condition = EventMatchCondition("content.body", "cake") assert(condition.isSatisfied(createSimpleTextEvent("How was the cake?"))) assertFalse(condition.isSatisfied(createSimpleTextEvent("Howwasthecake?"))) @@ -103,7 +103,7 @@ class PushRulesConditionTest : MatrixTest { @Test fun test_eventmatch_cakelie_condition() { - val condition = EventMatchCondition("content.body", "cake*lie", false) + val condition = EventMatchCondition("content.body", "cake*lie") assert(condition.isSatisfied(createSimpleTextEvent("How was the cakeisalie?"))) assertFalse(condition.isSatisfied(createSimpleTextEvent("How was the notcakeisalie?"))) @@ -111,7 +111,7 @@ class PushRulesConditionTest : MatrixTest { @Test fun test_eventmatch_words_only_condition() { - val condition = EventMatchCondition("content.body", "ben", true) + val condition = EventMatchCondition("content.body", "ben") assertFalse(condition.isSatisfied(createSimpleTextEvent("benoit"))) assertFalse(condition.isSatisfied(createSimpleTextEvent("Hello benoit"))) @@ -127,7 +127,7 @@ class PushRulesConditionTest : MatrixTest { @Test fun test_eventmatch_at_room_condition() { - val condition = EventMatchCondition("content.body", "@room", true) + val condition = EventMatchCondition("content.body", "@room") assertFalse(condition.isSatisfied(createSimpleTextEvent("@roomba"))) assertFalse(condition.isSatisfied(createSimpleTextEvent("room benoit"))) @@ -142,7 +142,7 @@ class PushRulesConditionTest : MatrixTest { @Test fun test_notice_condition() { - val conditionEqual = EventMatchCondition("content.msgtype", "m.notice", false) + val conditionEqual = EventMatchCondition("content.msgtype", "m.notice") Event( type = "m.room.message", From 4a383523e5d4d782ab8f8d8214f742c5c66919f8 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Thu, 21 Jul 2022 12:18:55 +0200 Subject: [PATCH 09/30] Bring back the body match optimization Signed-off-by: Nicolas Werner --- .../sdk/api/session/pushrules/EventMatchCondition.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt index e5448322e6..15d5cd3153 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/pushrules/EventMatchCondition.kt @@ -54,7 +54,14 @@ class EventMatchCondition( // word boundary. return try { if (key == "content.body") { - val regex = Regex("(\\W|^)" + pattern.simpleGlobToRegExp() + "(\\W|$)", setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) + val modPattern = if (pattern.startsWith("*") && pattern.endsWith("*")) { + // Regex.containsMatchIn() is way faster without leading and trailing + // stars, that don't make any difference for the evaluation result + pattern.removePrefix("*").removeSuffix("*").simpleGlobToRegExp() + } else { + "(\\W|^)" + pattern.simpleGlobToRegExp() + "(\\W|$)" + } + val regex = Regex(modPattern, setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) regex.containsMatchIn(value) } else { val regex = Regex(pattern.simpleGlobToRegExp(), setOf(RegexOption.DOT_MATCHES_ALL, RegexOption.IGNORE_CASE)) From b904548ba0a911d2253b8d317b48834947466e8a Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 31 Jan 2023 15:45:41 +0100 Subject: [PATCH 10/30] Cancel and start a new timer on pause & resume --- .../lib/core/utils/timer/CountUpTimer.kt | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt index c96b51a85d..77b94d45df 100644 --- a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt @@ -19,31 +19,29 @@ package im.vector.lib.core.utils.timer import im.vector.lib.core.utils.flow.tickerFlow import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.Job import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicLong @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class) class CountUpTimer(initialTime: Long = 0L, private val intervalInMs: Long = 1_000) { private val coroutineScope = CoroutineScope(Dispatchers.Main) - private val resumed: AtomicBoolean = AtomicBoolean(false) + private var counterJob: Job? = null private val clock: Clock = DefaultClock() private val lastTime: AtomicLong = AtomicLong() private val elapsedTime: AtomicLong = AtomicLong(initialTime) - init { - startCounter() - } - private fun startCounter() { - tickerFlow(coroutineScope, intervalInMs) - .filter { resumed.get() } + counterJob = tickerFlow( + scope = coroutineScope, + delayMillis = intervalInMs, + initialDelayMillis = intervalInMs - (elapsedTime() % intervalInMs) + ) .map { elapsedTime() } .onEach { tickListener?.onTick(it) } .launchIn(coroutineScope) @@ -52,7 +50,7 @@ class CountUpTimer(initialTime: Long = 0L, private val intervalInMs: Long = 1_00 var tickListener: TickListener? = null fun elapsedTime(): Long { - return if (resumed.get()) { + return if (counterJob?.isActive == true) { val now = clock.epochMillis() elapsedTime.addAndGet(now - lastTime.getAndSet(now)) } else { @@ -62,12 +60,12 @@ class CountUpTimer(initialTime: Long = 0L, private val intervalInMs: Long = 1_00 fun pause() { tickListener?.onTick(elapsedTime()) - resumed.set(false) + coroutineScope.cancel() } fun resume() { lastTime.set(clock.epochMillis()) - resumed.set(true) + startCounter() } fun stop() { From 757bd5ff32ca509c23707e757fad0eb512ec43ff Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 31 Jan 2023 16:08:30 +0100 Subject: [PATCH 11/30] Remove clock from core-utils module --- .../im/vector/lib/core/utils/timer/Clock.kt | 34 ------------------- tools/check/forbidden_strings_in_code.txt | 2 +- 2 files changed, 1 insertion(+), 35 deletions(-) delete mode 100644 library/core-utils/src/main/java/im/vector/lib/core/utils/timer/Clock.kt diff --git a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/Clock.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/Clock.kt deleted file mode 100644 index 47e2c6532a..0000000000 --- a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/Clock.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2023 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.lib.core.utils.timer - -interface Clock { - fun epochMillis(): Long -} - -class DefaultClock : Clock { - - /** - * Provides a UTC epoch in milliseconds - * - * This value is not guaranteed to be correct with reality - * as a User can override the system time and date to any values. - */ - override fun epochMillis(): Long { - return System.currentTimeMillis() - } -} diff --git a/tools/check/forbidden_strings_in_code.txt b/tools/check/forbidden_strings_in_code.txt index d12ace911b..b4d7ebae1f 100755 --- a/tools/check/forbidden_strings_in_code.txt +++ b/tools/check/forbidden_strings_in_code.txt @@ -176,7 +176,7 @@ PreferenceManager\.getDefaultSharedPreferences==2 R\.string\.template_ ### Use the Clock interface, or use `measureTimeMillis` -System\.currentTimeMillis\(\)===3 +System\.currentTimeMillis\(\)===2 ### Remove extra space between the name and the description \* @\w+ \w+ + From 9a31aa3b918e6709c22e4141d71fa5ad1b7fb207 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 31 Jan 2023 16:44:07 +0100 Subject: [PATCH 12/30] Move clock to core-utils module --- .../java/im/vector/lib/core/utils/timer}/Clock.kt | 8 +++----- .../im/vector/lib/core/utils/timer/CountUpTimer.kt | 7 +++++-- vector-app/build.gradle | 1 + .../im/vector/app/features/debug/DebugMenuActivity.kt | 2 +- .../im/vector/app/fdroid/BackgroundSyncStarter.kt | 2 +- .../app/fdroid/receiver/AlarmSyncBroadcastReceiver.kt | 2 +- .../im/vector/app/nightly/FirebaseNightlyProxy.kt | 2 +- .../java/im/vector/app/core/di/SingletonModule.kt | 11 ++++++----- .../im/vector/app/core/date/VectorDateFormatter.kt | 2 +- .../java/im/vector/app/core/di/SingletonEntryPoint.kt | 2 +- .../app/core/dialogs/GalleryOrCameraDialogHelper.kt | 2 +- .../dialogs/GalleryOrCameraDialogHelperFactory.kt | 2 +- .../app/core/services/VectorSyncAndroidService.kt | 4 ++-- .../features/analytics/DecryptionFailureTracker.kt | 2 +- .../attachments/preview/AttachmentsPreviewFragment.kt | 2 +- .../app/features/call/conference/JitsiService.kt | 2 +- .../call/webrtc/ScreenCaptureAndroidService.kt | 2 +- .../setup/KeysBackupSetupSharedViewModel.kt | 2 +- .../IncomingVerificationRequestHandler.kt | 2 +- .../home/SetUnverifiedSessionsAlertShownUseCase.kt | 2 +- .../home/ShouldShowUnverifiedSessionsAlertUseCase.kt | 2 +- .../home/UnknownDeviceDetectorSharedViewModel.kt | 2 +- .../features/home/room/detail/ChatEffectManager.kt | 2 +- .../room/detail/RoomMessageTouchHelperCallback.kt | 2 +- .../app/features/home/room/detail/TimelineFragment.kt | 2 +- .../room/detail/composer/MessageComposerViewModel.kt | 2 +- .../detail/composer/voice/VoiceMessageRecorderView.kt | 2 +- .../detail/composer/voice/VoiceRecorderFragment.kt | 2 +- .../home/room/detail/search/SearchResultController.kt | 2 +- .../room/detail/timeline/TimelineEventController.kt | 2 +- .../edithistory/ViewEditHistoryEpoxyController.kt | 2 +- .../detail/timeline/factory/MessageItemFactory.kt | 2 +- .../detail/timeline/item/VerificationRequestItem.kt | 2 +- .../live/map/LiveLocationBottomSheetController.kt | 2 +- .../location/live/map/LiveLocationUserItem.kt | 2 +- .../live/tracking/LiveLocationNotificationBuilder.kt | 2 +- .../media/domain/usecase/DownloadMediaUseCase.kt | 2 +- .../features/notifications/NotifiableEventResolver.kt | 2 +- .../notifications/NotificationBroadcastReceiver.kt | 2 +- .../app/features/notifications/NotificationUtils.kt | 2 +- .../im/vector/app/features/popup/PopupAlertManager.kt | 2 +- .../roomprofile/uploads/RoomUploadsFragment.kt | 2 +- .../vector/app/features/settings/VectorPreferences.kt | 2 +- .../v2/list/CheckIfSessionIsInactiveUseCase.kt | 2 +- .../features/settings/devtools/KeyRequestsFragment.kt | 2 +- .../test/java/im/vector/app/test/fakes/FakeClock.kt | 2 +- 46 files changed, 58 insertions(+), 55 deletions(-) rename {vector/src/main/java/im/vector/app/core/time => library/core-utils/src/main/java/im/vector/lib/core/utils/timer}/Clock.kt (85%) diff --git a/vector/src/main/java/im/vector/app/core/time/Clock.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/Clock.kt similarity index 85% rename from vector/src/main/java/im/vector/app/core/time/Clock.kt rename to library/core-utils/src/main/java/im/vector/lib/core/utils/timer/Clock.kt index b7b6e88f8d..47e2c6532a 100644 --- a/vector/src/main/java/im/vector/app/core/time/Clock.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/Clock.kt @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 New Vector Ltd + * Copyright (c) 2023 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. @@ -14,15 +14,13 @@ * limitations under the License. */ -package im.vector.app.core.time - -import javax.inject.Inject +package im.vector.lib.core.utils.timer interface Clock { fun epochMillis(): Long } -class DefaultClock @Inject constructor() : Clock { +class DefaultClock : Clock { /** * Provides a UTC epoch in milliseconds diff --git a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt index 77b94d45df..8f39fb01a6 100644 --- a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt @@ -27,12 +27,15 @@ import kotlinx.coroutines.flow.onEach import java.util.concurrent.atomic.AtomicLong @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class) -class CountUpTimer(initialTime: Long = 0L, private val intervalInMs: Long = 1_000) { +class CountUpTimer( + private val clock: Clock = DefaultClock(), + private val intervalInMs: Long = 1_000, + initialTime: Long = 0L, +) { private val coroutineScope = CoroutineScope(Dispatchers.Main) private var counterJob: Job? = null - private val clock: Clock = DefaultClock() private val lastTime: AtomicLong = AtomicLong() private val elapsedTime: AtomicLong = AtomicLong(initialTime) diff --git a/vector-app/build.gradle b/vector-app/build.gradle index b2c2e79bcb..8df513ae58 100644 --- a/vector-app/build.gradle +++ b/vector-app/build.gradle @@ -347,6 +347,7 @@ android { dependencies { implementation project(':vector') implementation project(':vector-config') + implementation project(':library:core-utils') debugImplementation project(':library:ui-styles') implementation libs.dagger.hilt implementation 'androidx.multidex:multidex:2.0.1' diff --git a/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt b/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt index af63e6eae0..487283c70d 100644 --- a/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt +++ b/vector-app/src/debug/java/im/vector/app/features/debug/DebugMenuActivity.kt @@ -28,7 +28,6 @@ import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.platform.VectorBaseActivity -import im.vector.app.core.time.Clock import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO import im.vector.app.core.utils.checkPermissions import im.vector.app.core.utils.registerForPermissionsResult @@ -41,6 +40,7 @@ import im.vector.app.features.debug.sas.DebugSasEmojiActivity import im.vector.app.features.debug.settings.DebugPrivateSettingsActivity import im.vector.app.features.qrcode.QrCodeScannerActivity import im.vector.application.databinding.ActivityDebugMenuBinding +import im.vector.lib.core.utils.timer.Clock import im.vector.lib.ui.styles.debug.DebugMaterialThemeDarkDefaultActivity import im.vector.lib.ui.styles.debug.DebugMaterialThemeDarkTestActivity import im.vector.lib.ui.styles.debug.DebugMaterialThemeDarkVectorActivity diff --git a/vector-app/src/fdroid/java/im/vector/app/fdroid/BackgroundSyncStarter.kt b/vector-app/src/fdroid/java/im/vector/app/fdroid/BackgroundSyncStarter.kt index eaa3d57d42..ac43d2f8c1 100644 --- a/vector-app/src/fdroid/java/im/vector/app/fdroid/BackgroundSyncStarter.kt +++ b/vector-app/src/fdroid/java/im/vector/app/fdroid/BackgroundSyncStarter.kt @@ -18,10 +18,10 @@ package im.vector.app.fdroid import android.content.Context import im.vector.app.core.di.ActiveSessionHolder -import im.vector.app.core.time.Clock import im.vector.app.fdroid.receiver.AlarmSyncBroadcastReceiver import im.vector.app.features.settings.BackgroundSyncMode import im.vector.app.features.settings.VectorPreferences +import im.vector.lib.core.utils.timer.Clock import timber.log.Timber import javax.inject.Inject diff --git a/vector-app/src/fdroid/java/im/vector/app/fdroid/receiver/AlarmSyncBroadcastReceiver.kt b/vector-app/src/fdroid/java/im/vector/app/fdroid/receiver/AlarmSyncBroadcastReceiver.kt index bccbf42e92..a4da6990bf 100644 --- a/vector-app/src/fdroid/java/im/vector/app/fdroid/receiver/AlarmSyncBroadcastReceiver.kt +++ b/vector-app/src/fdroid/java/im/vector/app/fdroid/receiver/AlarmSyncBroadcastReceiver.kt @@ -28,7 +28,7 @@ import androidx.core.content.getSystemService import im.vector.app.core.extensions.singletonEntryPoint import im.vector.app.core.platform.PendingIntentCompat import im.vector.app.core.services.VectorSyncAndroidService -import im.vector.app.core.time.Clock +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.session.sync.job.SyncAndroidService import timber.log.Timber diff --git a/vector-app/src/gplay/java/im/vector/app/nightly/FirebaseNightlyProxy.kt b/vector-app/src/gplay/java/im/vector/app/nightly/FirebaseNightlyProxy.kt index 71ffda7c36..05097702a8 100644 --- a/vector-app/src/gplay/java/im/vector/app/nightly/FirebaseNightlyProxy.kt +++ b/vector-app/src/gplay/java/im/vector/app/nightly/FirebaseNightlyProxy.kt @@ -22,8 +22,8 @@ import com.google.firebase.appdistribution.FirebaseAppDistribution import com.google.firebase.appdistribution.FirebaseAppDistributionException import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.resources.BuildMeta -import im.vector.app.core.time.Clock import im.vector.app.features.home.NightlyProxy +import im.vector.lib.core.utils.timer.Clock import timber.log.Timber import javax.inject.Inject diff --git a/vector-app/src/main/java/im/vector/app/core/di/SingletonModule.kt b/vector-app/src/main/java/im/vector/app/core/di/SingletonModule.kt index a6d6fcd14b..68b09be8e8 100644 --- a/vector-app/src/main/java/im/vector/app/core/di/SingletonModule.kt +++ b/vector-app/src/main/java/im/vector/app/core/di/SingletonModule.kt @@ -40,8 +40,6 @@ import im.vector.app.core.dispatchers.CoroutineDispatchers import im.vector.app.core.error.DefaultErrorFormatter import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.resources.BuildMeta -import im.vector.app.core.time.Clock -import im.vector.app.core.time.DefaultClock import im.vector.app.core.utils.AndroidSystemSettingsProvider import im.vector.app.core.utils.SystemSettingsProvider import im.vector.app.features.analytics.AnalyticsTracker @@ -63,6 +61,8 @@ import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.ui.SharedPreferencesUiStateRepository import im.vector.app.features.ui.UiStateRepository import im.vector.application.BuildConfig +import im.vector.lib.core.utils.timer.Clock +import im.vector.lib.core.utils.timer.DefaultClock import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.Dispatchers @@ -106,9 +106,6 @@ import javax.inject.Singleton @Binds abstract fun bindAutoAcceptInvites(autoAcceptInvites: CompileTimeAutoAcceptInvites): AutoAcceptInvites - @Binds - abstract fun bindDefaultClock(clock: DefaultClock): Clock - @Binds abstract fun bindEmojiSpanify(emojiCompatWrapper: EmojiCompatWrapper): EmojiSpanify @@ -243,4 +240,8 @@ import javax.inject.Singleton fun providesDefaultSharedPreferences(context: Context): SharedPreferences { return PreferenceManager.getDefaultSharedPreferences(context.applicationContext) } + + @Singleton + @Provides + fun providesDefaultClock(): Clock = DefaultClock() } diff --git a/vector/src/main/java/im/vector/app/core/date/VectorDateFormatter.kt b/vector/src/main/java/im/vector/app/core/date/VectorDateFormatter.kt index 780a3ab705..69c99ce14f 100644 --- a/vector/src/main/java/im/vector/app/core/date/VectorDateFormatter.kt +++ b/vector/src/main/java/im/vector/app/core/date/VectorDateFormatter.kt @@ -22,7 +22,7 @@ import android.text.format.DateUtils import im.vector.app.core.resources.DateProvider import im.vector.app.core.resources.LocaleProvider import im.vector.app.core.resources.toTimestamp -import im.vector.app.core.time.Clock +import im.vector.lib.core.utils.timer.Clock import org.threeten.bp.LocalDateTime import org.threeten.bp.Period import org.threeten.bp.format.DateTimeFormatter diff --git a/vector/src/main/java/im/vector/app/core/di/SingletonEntryPoint.kt b/vector/src/main/java/im/vector/app/core/di/SingletonEntryPoint.kt index dc88229a10..acf2250449 100644 --- a/vector/src/main/java/im/vector/app/core/di/SingletonEntryPoint.kt +++ b/vector/src/main/java/im/vector/app/core/di/SingletonEntryPoint.kt @@ -21,7 +21,6 @@ import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent import im.vector.app.core.dialogs.UnrecognizedCertificateDialog import im.vector.app.core.error.ErrorFormatter -import im.vector.app.core.time.Clock import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.call.webrtc.WebRtcCallManager import im.vector.app.features.home.AvatarRenderer @@ -31,6 +30,7 @@ import im.vector.app.features.rageshake.BugReporter import im.vector.app.features.session.SessionListener import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.ui.UiStateRepository +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.CoroutineScope @InstallIn(SingletonComponent::class) diff --git a/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelper.kt b/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelper.kt index c2af05123b..cec43dfc08 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelper.kt +++ b/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelper.kt @@ -27,12 +27,12 @@ import im.vector.app.core.dialogs.GalleryOrCameraDialogHelper.Listener import im.vector.app.core.extensions.insertBeforeLast import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.resources.ColorProvider -import im.vector.app.core.time.Clock import im.vector.app.core.utils.PERMISSIONS_FOR_TAKING_PHOTO import im.vector.app.core.utils.checkPermissions import im.vector.app.core.utils.onPermissionDeniedDialog import im.vector.app.core.utils.registerForPermissionsResult import im.vector.app.features.media.createUCropWithDefaultSettings +import im.vector.lib.core.utils.timer.Clock import im.vector.lib.multipicker.MultiPicker import im.vector.lib.multipicker.entity.MultiPickerImageType import java.io.File diff --git a/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelperFactory.kt b/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelperFactory.kt index 0e8dc1d0d1..ee747629bf 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelperFactory.kt +++ b/vector/src/main/java/im/vector/app/core/dialogs/GalleryOrCameraDialogHelperFactory.kt @@ -18,7 +18,7 @@ package im.vector.app.core.dialogs import androidx.fragment.app.Fragment import im.vector.app.core.resources.ColorProvider -import im.vector.app.core.time.Clock +import im.vector.lib.core.utils.timer.Clock import javax.inject.Inject /** diff --git a/vector/src/main/java/im/vector/app/core/services/VectorSyncAndroidService.kt b/vector/src/main/java/im/vector/app/core/services/VectorSyncAndroidService.kt index f746c0749b..5fa263ff7b 100644 --- a/vector/src/main/java/im/vector/app/core/services/VectorSyncAndroidService.kt +++ b/vector/src/main/java/im/vector/app/core/services/VectorSyncAndroidService.kt @@ -34,10 +34,10 @@ import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.extensions.startForegroundCompat import im.vector.app.core.platform.PendingIntentCompat -import im.vector.app.core.time.Clock -import im.vector.app.core.time.DefaultClock import im.vector.app.features.notifications.NotificationUtils import im.vector.app.features.settings.BackgroundSyncMode +import im.vector.lib.core.utils.timer.Clock +import im.vector.lib.core.utils.timer.DefaultClock import org.matrix.android.sdk.api.Matrix import org.matrix.android.sdk.api.session.sync.job.SyncAndroidService import timber.log.Timber diff --git a/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt b/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt index d97c46c3cb..b38a4d934b 100644 --- a/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt +++ b/vector/src/main/java/im/vector/app/features/analytics/DecryptionFailureTracker.kt @@ -16,10 +16,10 @@ package im.vector.app.features.analytics -import im.vector.app.core.time.Clock import im.vector.app.features.analytics.plan.Error import im.vector.lib.core.utils.compat.removeIfCompat import im.vector.lib.core.utils.flow.tickerFlow +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob diff --git a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt index e7ab8c9804..5f7776bc95 100644 --- a/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt +++ b/vector/src/main/java/im/vector/app/features/attachments/preview/AttachmentsPreviewFragment.kt @@ -47,12 +47,12 @@ import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.core.resources.ColorProvider -import im.vector.app.core.time.Clock import im.vector.app.core.utils.OnSnapPositionChangeListener import im.vector.app.core.utils.SnapOnScrollListener import im.vector.app.core.utils.attachSnapHelperWithListener import im.vector.app.databinding.FragmentAttachmentsPreviewBinding import im.vector.app.features.media.createUCropWithDefaultSettings +import im.vector.lib.core.utils.timer.Clock import kotlinx.parcelize.Parcelize import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.content.ContentAttachmentData diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt index d14f358801..aba2fe445f 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt @@ -19,7 +19,6 @@ package im.vector.app.features.call.conference import im.vector.app.R import im.vector.app.core.network.await import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.core.utils.ensureProtocol import im.vector.app.core.utils.toBase32String import im.vector.app.features.call.conference.jwt.JitsiJWTFactory @@ -27,6 +26,7 @@ import im.vector.app.features.displayname.getBestName import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.settings.VectorLocaleProvider import im.vector.app.features.themes.ThemeProvider +import im.vector.lib.core.utils.timer.Clock import okhttp3.Request import org.jitsi.meet.sdk.JitsiMeetUserInfo import org.matrix.android.sdk.api.extensions.tryOrNull diff --git a/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureAndroidService.kt b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureAndroidService.kt index 00b6bc40d2..ab2a39ace8 100644 --- a/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureAndroidService.kt +++ b/vector/src/main/java/im/vector/app/features/call/webrtc/ScreenCaptureAndroidService.kt @@ -22,8 +22,8 @@ import android.os.IBinder import dagger.hilt.android.AndroidEntryPoint import im.vector.app.core.extensions.startForegroundCompat import im.vector.app.core.services.VectorAndroidService -import im.vector.app.core.time.Clock import im.vector.app.features.notifications.NotificationUtils +import im.vector.lib.core.utils.timer.Clock import javax.inject.Inject @AndroidEntryPoint diff --git a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt index dfa7d1aaa3..9d75999bc9 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/keysbackup/setup/KeysBackupSetupSharedViewModel.kt @@ -22,8 +22,8 @@ import androidx.lifecycle.ViewModel import com.nulabinc.zxcvbn.Strength import im.vector.app.R import im.vector.app.core.platform.WaitingViewData -import im.vector.app.core.time.Clock import im.vector.app.core.utils.LiveEvent +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.MatrixCallback import org.matrix.android.sdk.api.listeners.ProgressListener import org.matrix.android.sdk.api.session.Session diff --git a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt index 0f8f5c633e..b15999e7e5 100644 --- a/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt +++ b/vector/src/main/java/im/vector/app/features/crypto/verification/IncomingVerificationRequestHandler.kt @@ -18,7 +18,6 @@ package im.vector.app.features.crypto.verification import android.content.Context import im.vector.app.R import im.vector.app.core.platform.VectorBaseActivity -import im.vector.app.core.time.Clock import im.vector.app.features.analytics.plan.ViewRoom import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.AvatarRenderer @@ -27,6 +26,7 @@ import im.vector.app.features.home.room.detail.arguments.TimelineArgs import im.vector.app.features.popup.PopupAlertManager import im.vector.app.features.popup.VerificationVectorAlert import im.vector.lib.core.utils.compat.getParcelableCompat +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest import org.matrix.android.sdk.api.session.crypto.verification.VerificationService diff --git a/vector/src/main/java/im/vector/app/features/home/SetUnverifiedSessionsAlertShownUseCase.kt b/vector/src/main/java/im/vector/app/features/home/SetUnverifiedSessionsAlertShownUseCase.kt index 4580ac0f31..fef3be3c1d 100644 --- a/vector/src/main/java/im/vector/app/features/home/SetUnverifiedSessionsAlertShownUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/home/SetUnverifiedSessionsAlertShownUseCase.kt @@ -16,8 +16,8 @@ package im.vector.app.features.home -import im.vector.app.core.time.Clock import im.vector.app.features.settings.VectorPreferences +import im.vector.lib.core.utils.timer.Clock import javax.inject.Inject class SetUnverifiedSessionsAlertShownUseCase @Inject constructor( diff --git a/vector/src/main/java/im/vector/app/features/home/ShouldShowUnverifiedSessionsAlertUseCase.kt b/vector/src/main/java/im/vector/app/features/home/ShouldShowUnverifiedSessionsAlertUseCase.kt index 18c7ed9689..301a8c6ccc 100644 --- a/vector/src/main/java/im/vector/app/features/home/ShouldShowUnverifiedSessionsAlertUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/home/ShouldShowUnverifiedSessionsAlertUseCase.kt @@ -17,9 +17,9 @@ package im.vector.app.features.home import im.vector.app.config.Config -import im.vector.app.core.time.Clock import im.vector.app.features.VectorFeatures import im.vector.app.features.settings.VectorPreferences +import im.vector.lib.core.utils.timer.Clock import javax.inject.Inject class ShouldShowUnverifiedSessionsAlertUseCase @Inject constructor( diff --git a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt index 665498153a..b8cb34ca94 100644 --- a/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/UnknownDeviceDetectorSharedViewModel.kt @@ -32,7 +32,7 @@ import im.vector.app.core.platform.EmptyViewEvents import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.platform.VectorViewModelAction import im.vector.app.core.session.clientinfo.DeleteUnusedClientInformationUseCase -import im.vector.app.core.time.Clock +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.launchIn diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/ChatEffectManager.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/ChatEffectManager.kt index 69ee6fe4fc..cb64da0655 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/ChatEffectManager.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/ChatEffectManager.kt @@ -16,7 +16,7 @@ package im.vector.app.features.home.room.detail -import im.vector.app.core.time.Clock +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.session.events.model.toModel import org.matrix.android.sdk.api.session.room.model.message.MessageContent import org.matrix.android.sdk.api.session.room.model.message.MessageType diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomMessageTouchHelperCallback.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomMessageTouchHelperCallback.kt index 5a1342b7da..9efea7c33d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomMessageTouchHelperCallback.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomMessageTouchHelperCallback.kt @@ -33,8 +33,8 @@ import com.airbnb.epoxy.EpoxyModel import com.airbnb.epoxy.EpoxyTouchHelperCallback import com.airbnb.epoxy.EpoxyViewHolder import im.vector.app.R -import im.vector.app.core.time.Clock import im.vector.app.features.themes.ThemeUtils +import im.vector.lib.core.utils.timer.Clock import timber.log.Timber import kotlin.math.abs import kotlin.math.min diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt index 7b94508b37..daf833a00d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt @@ -86,7 +86,6 @@ import im.vector.app.core.platform.VectorMenuProvider import im.vector.app.core.platform.showOptimizedSnackbar import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.UserPreferencesProvider -import im.vector.app.core.time.Clock import im.vector.app.core.ui.views.CurrentCallsView import im.vector.app.core.ui.views.CurrentCallsViewPresenter import im.vector.app.core.ui.views.FailedMessagesWarningView @@ -186,6 +185,7 @@ import im.vector.app.features.widgets.WidgetActivity import im.vector.app.features.widgets.WidgetArgs import im.vector.app.features.widgets.WidgetKind import im.vector.app.features.widgets.permissions.RoomWidgetPermissionBottomSheet +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt index fc79c069fe..d52cf0cbd3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/MessageComposerViewModel.kt @@ -29,7 +29,6 @@ import im.vector.app.core.di.hiltMavericksViewModelFactory import im.vector.app.core.extensions.getVectorLastMessageContent import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.extensions.toAnalyticsComposer import im.vector.app.features.analytics.extensions.toAnalyticsJoinedRoom @@ -52,6 +51,7 @@ import im.vector.app.features.voicebroadcast.model.VoiceBroadcastState import im.vector.app.features.voicebroadcast.model.asVoiceBroadcastEvent import im.vector.app.features.voicebroadcast.usecase.GetVoiceBroadcastStateEventLiveUseCase import im.vector.app.features.voicebroadcast.voiceBroadcastId +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flatMapLatest diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt index b5c4b4a537..526c774b6d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt @@ -23,10 +23,10 @@ import androidx.constraintlayout.widget.ConstraintLayout import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.hardware.vibrate -import im.vector.app.core.time.Clock import im.vector.app.core.utils.DimensionConverter import im.vector.app.databinding.ViewVoiceMessageRecorderBinding import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker +import im.vector.lib.core.utils.timer.Clock import im.vector.lib.core.utils.timer.CountUpTimer import javax.inject.Inject import kotlin.math.floor diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceRecorderFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceRecorderFragment.kt index 90b813d347..e5f93368b1 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceRecorderFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceRecorderFragment.kt @@ -27,7 +27,6 @@ import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.hardware.vibrate import im.vector.app.core.platform.VectorBaseFragment -import im.vector.app.core.time.Clock import im.vector.app.core.utils.PERMISSIONS_FOR_VOICE_MESSAGE import im.vector.app.core.utils.checkPermissions import im.vector.app.core.utils.onPermissionDeniedSnackbar @@ -41,6 +40,7 @@ import im.vector.app.features.home.room.detail.composer.MessageComposerViewState import im.vector.app.features.home.room.detail.composer.SendMode import im.vector.app.features.home.room.detail.composer.boolean import im.vector.app.features.home.room.detail.timeline.helper.AudioMessagePlaybackTracker +import im.vector.lib.core.utils.timer.Clock import javax.inject.Inject @AndroidEntryPoint diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchResultController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchResultController.kt index 81e4d8fd5f..71c0427c97 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchResultController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/search/SearchResultController.kt @@ -30,11 +30,11 @@ import im.vector.app.core.epoxy.loadingItem import im.vector.app.core.epoxy.noResultItem import im.vector.app.core.resources.StringProvider import im.vector.app.core.resources.UserPreferencesProvider -import im.vector.app.core.time.Clock import im.vector.app.core.ui.list.GenericHeaderItem_ import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.Content import org.matrix.android.sdk.api.session.events.model.Event diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt index f845a42dcd..fcdbcd777c 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/TimelineEventController.kt @@ -31,7 +31,6 @@ import im.vector.app.core.epoxy.LoadingItem_ import im.vector.app.core.extensions.localDateTime import im.vector.app.core.extensions.nextOrNull import im.vector.app.core.extensions.prevOrNull -import im.vector.app.core.time.Clock import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.JitsiState import im.vector.app.features.home.room.detail.RoomDetailAction @@ -64,6 +63,7 @@ import im.vector.app.features.media.AttachmentData import im.vector.app.features.media.ImageContentRenderer import im.vector.app.features.media.VideoContentRenderer import im.vector.app.features.settings.VectorPreferences +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.api.session.events.model.toModel diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt index 52ecc6d588..6c18c78615 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/edithistory/ViewEditHistoryEpoxyController.kt @@ -26,13 +26,13 @@ import im.vector.app.core.date.DateFormatKind import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.core.ui.list.genericFooterItem import im.vector.app.core.ui.list.genericHeaderItem import im.vector.app.core.ui.list.genericItem import im.vector.app.core.ui.list.genericLoaderItem import im.vector.app.features.html.EventHtmlRenderer import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence +import im.vector.lib.core.utils.timer.Clock import me.gujun.android.span.span import name.fraser.neil.plaintext.diff_match_patch import org.matrix.android.sdk.api.session.events.model.Event diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt index 9cb1608415..67983fc351 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MessageItemFactory.kt @@ -32,7 +32,6 @@ import im.vector.app.core.extensions.getVectorLastMessageContent import im.vector.app.core.files.LocalFilesHelper import im.vector.app.core.resources.ColorProvider import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.core.utils.DimensionConverter import im.vector.app.core.utils.containsOnlyEmojis import im.vector.app.features.home.room.detail.timeline.TimelineEventController @@ -83,6 +82,7 @@ import im.vector.app.features.voice.AudioWaveformView import im.vector.app.features.voicebroadcast.isVoiceBroadcast import im.vector.app.features.voicebroadcast.model.MessageVoiceBroadcastInfoContent import im.vector.lib.core.utils.epoxy.charsequence.toEpoxyCharSequence +import im.vector.lib.core.utils.timer.Clock import me.gujun.android.span.span import org.matrix.android.sdk.api.MatrixUrls.isMxcUrl import org.matrix.android.sdk.api.session.Session diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt index 25656080f8..47b9a1afa9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/VerificationRequestItem.kt @@ -31,11 +31,11 @@ import com.airbnb.epoxy.EpoxyModelClass import im.vector.app.R import im.vector.app.core.epoxy.ClickListener import im.vector.app.core.epoxy.onClick -import im.vector.app.core.time.Clock import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.home.room.detail.RoomDetailAction import im.vector.app.features.home.room.detail.timeline.MessageColorProvider import im.vector.app.features.home.room.detail.timeline.TimelineEventController +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.session.crypto.verification.VerificationService import org.matrix.android.sdk.api.session.crypto.verification.VerificationState diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt index 0616ea84d9..80f845c3b2 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationBottomSheetController.kt @@ -23,8 +23,8 @@ import im.vector.app.core.date.VectorDateFormatter import im.vector.app.core.resources.DateProvider import im.vector.app.core.resources.StringProvider import im.vector.app.core.resources.toTimestamp -import im.vector.app.core.time.Clock import im.vector.app.features.home.AvatarRenderer +import im.vector.lib.core.utils.timer.Clock import javax.inject.Inject class LiveLocationBottomSheetController @Inject constructor( diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt index 724b2c9b6f..6d87ef99f7 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt @@ -27,9 +27,9 @@ import im.vector.app.core.epoxy.VectorEpoxyHolder import im.vector.app.core.epoxy.VectorEpoxyModel import im.vector.app.core.epoxy.onClick import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.core.utils.TextUtils import im.vector.app.features.home.AvatarRenderer +import im.vector.lib.core.utils.timer.Clock import im.vector.lib.core.utils.timer.CountUpTimer import org.matrix.android.sdk.api.util.MatrixItem import org.threeten.bp.Duration diff --git a/vector/src/main/java/im/vector/app/features/location/live/tracking/LiveLocationNotificationBuilder.kt b/vector/src/main/java/im/vector/app/features/location/live/tracking/LiveLocationNotificationBuilder.kt index 5bc730f3d7..34cf0b0589 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/tracking/LiveLocationNotificationBuilder.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/tracking/LiveLocationNotificationBuilder.kt @@ -25,7 +25,6 @@ import im.vector.app.R import im.vector.app.core.extensions.createIgnoredUri import im.vector.app.core.platform.PendingIntentCompat import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.features.home.HomeActivity import im.vector.app.features.home.room.detail.RoomDetailActivity import im.vector.app.features.home.room.detail.arguments.TimelineArgs @@ -34,6 +33,7 @@ import im.vector.app.features.location.live.map.LiveLocationMapViewArgs import im.vector.app.features.notifications.NotificationActionIds import im.vector.app.features.notifications.NotificationUtils import im.vector.app.features.themes.ThemeUtils +import im.vector.lib.core.utils.timer.Clock import javax.inject.Inject import javax.inject.Singleton diff --git a/vector/src/main/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCase.kt b/vector/src/main/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCase.kt index 6a24ac4fd7..506622e71f 100644 --- a/vector/src/main/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/media/domain/usecase/DownloadMediaUseCase.kt @@ -20,9 +20,9 @@ import android.content.Context import androidx.core.net.toUri import dagger.hilt.android.qualifiers.ApplicationContext import im.vector.app.core.intent.getMimeTypeFromUri -import im.vector.app.core.time.Clock import im.vector.app.core.utils.saveMedia import im.vector.app.features.notifications.NotificationUtils +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.withContext import org.matrix.android.sdk.api.session.Session import java.io.File diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt index 988ab01ef8..a69958ef25 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotifiableEventResolver.kt @@ -21,10 +21,10 @@ import im.vector.app.core.extensions.getVectorLastMessageContent import im.vector.app.core.extensions.takeAs import im.vector.app.core.resources.BuildMeta import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.features.displayname.getBestName import im.vector.app.features.home.room.detail.timeline.format.DisplayableEventFormatter import im.vector.app.features.home.room.detail.timeline.format.NoticeEventFormatter +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.extensions.orFalse import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.content.ContentUrlResolver diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationBroadcastReceiver.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationBroadcastReceiver.kt index e231686c27..008ec7a0c9 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationBroadcastReceiver.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationBroadcastReceiver.kt @@ -23,11 +23,11 @@ import androidx.core.app.RemoteInput import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.di.ActiveSessionHolder -import im.vector.app.core.time.Clock import im.vector.app.features.analytics.AnalyticsTracker import im.vector.app.features.analytics.extensions.toAnalyticsJoinedRoom import im.vector.app.features.analytics.plan.JoinedRoom import im.vector.app.features.session.coroutineScope +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.launch import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.session.Session diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt index 5b3a244137..908a1ed340 100755 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt @@ -50,7 +50,6 @@ import im.vector.app.core.extensions.createIgnoredUri import im.vector.app.core.platform.PendingIntentCompat import im.vector.app.core.resources.StringProvider import im.vector.app.core.services.CallAndroidService -import im.vector.app.core.time.Clock import im.vector.app.core.utils.startNotificationChannelSettingsIntent import im.vector.app.features.MainActivity import im.vector.app.features.call.VectorCallActivity @@ -65,6 +64,7 @@ import im.vector.app.features.home.room.threads.arguments.ThreadTimelineArgs import im.vector.app.features.settings.VectorPreferences import im.vector.app.features.settings.troubleshoot.TestNotificationReceiver import im.vector.app.features.themes.ThemeUtils +import im.vector.lib.core.utils.timer.Clock import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton diff --git a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt index e0310b340e..d3c6e83589 100644 --- a/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt +++ b/vector/src/main/java/im/vector/app/features/popup/PopupAlertManager.kt @@ -24,7 +24,6 @@ import android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS import com.tapadoo.alerter.Alerter import im.vector.app.R import im.vector.app.core.platform.VectorBaseActivity -import im.vector.app.core.time.Clock import im.vector.app.core.utils.isAnimationEnabled import im.vector.app.features.MainActivity import im.vector.app.features.analytics.ui.consent.AnalyticsOptInActivity @@ -32,6 +31,7 @@ import im.vector.app.features.home.room.list.home.release.ReleaseNotesActivity import im.vector.app.features.pin.PinActivity import im.vector.app.features.signout.hard.SignedOutActivity import im.vector.app.features.themes.ThemeUtils +import im.vector.lib.core.utils.timer.Clock import timber.log.Timber import java.lang.ref.WeakReference import javax.inject.Inject diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt index d982ab3e32..f318ecc638 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/uploads/RoomUploadsFragment.kt @@ -31,7 +31,6 @@ import dagger.hilt.android.AndroidEntryPoint import im.vector.app.R import im.vector.app.core.intent.getMimeTypeFromUri import im.vector.app.core.platform.VectorBaseFragment -import im.vector.app.core.time.Clock import im.vector.app.core.utils.saveMedia import im.vector.app.core.utils.shareMedia import im.vector.app.databinding.FragmentRoomUploadsBinding @@ -39,6 +38,7 @@ import im.vector.app.features.analytics.plan.MobileScreen import im.vector.app.features.home.AvatarRenderer import im.vector.app.features.notifications.NotificationUtils import im.vector.app.features.roomprofile.RoomProfileArgs +import im.vector.lib.core.utils.timer.Clock import kotlinx.coroutines.launch import org.matrix.android.sdk.api.util.toMatrixItem import javax.inject.Inject diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index 2d5fb351f9..d405d458c0 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -27,12 +27,12 @@ import im.vector.app.R import im.vector.app.core.di.DefaultPreferences import im.vector.app.core.resources.BuildMeta import im.vector.app.core.resources.StringProvider -import im.vector.app.core.time.Clock import im.vector.app.features.VectorFeatures import im.vector.app.features.disclaimer.SHARED_PREF_KEY import im.vector.app.features.home.ShortcutsHandler import im.vector.app.features.homeserver.ServerUrlsRepository import im.vector.app.features.themes.ThemeUtils +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.extensions.tryOrNull import timber.log.Timber import javax.inject.Inject diff --git a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CheckIfSessionIsInactiveUseCase.kt b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CheckIfSessionIsInactiveUseCase.kt index f3670793bd..beffbf251a 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CheckIfSessionIsInactiveUseCase.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devices/v2/list/CheckIfSessionIsInactiveUseCase.kt @@ -16,7 +16,7 @@ package im.vector.app.features.settings.devices.v2.list -import im.vector.app.core.time.Clock +import im.vector.lib.core.utils.timer.Clock import java.util.concurrent.TimeUnit import javax.inject.Inject diff --git a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt index f7e4a12793..a07013ea57 100644 --- a/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/devtools/KeyRequestsFragment.kt @@ -36,9 +36,9 @@ import im.vector.app.core.extensions.registerStartForActivityResult import im.vector.app.core.extensions.safeOpenOutputStream import im.vector.app.core.platform.VectorBaseFragment import im.vector.app.core.platform.VectorMenuProvider -import im.vector.app.core.time.Clock import im.vector.app.core.utils.selectTxtFileToWrite import im.vector.app.databinding.FragmentDevtoolKeyrequestsBinding +import im.vector.lib.core.utils.timer.Clock import org.matrix.android.sdk.api.extensions.tryOrNull import javax.inject.Inject diff --git a/vector/src/test/java/im/vector/app/test/fakes/FakeClock.kt b/vector/src/test/java/im/vector/app/test/fakes/FakeClock.kt index 1d531f147f..a292c3eb9b 100644 --- a/vector/src/test/java/im/vector/app/test/fakes/FakeClock.kt +++ b/vector/src/test/java/im/vector/app/test/fakes/FakeClock.kt @@ -16,7 +16,7 @@ package im.vector.app.test.fakes -import im.vector.app.core.time.Clock +import im.vector.lib.core.utils.timer.Clock import io.mockk.every import io.mockk.mockk From 3f6b60c63db6724c804736ee497febd795f47ffc Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Tue, 31 Jan 2023 17:34:10 +0100 Subject: [PATCH 13/30] Replace ticker flow with simple coroutine --- .../lib/core/utils/timer/CountUpTimer.kt | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt index 8f39fb01a6..8485398ffa 100644 --- a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt @@ -16,14 +16,12 @@ package im.vector.lib.core.utils.timer -import im.vector.lib.core.utils.flow.tickerFlow import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.cancel -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.delay +import kotlinx.coroutines.launch import java.util.concurrent.atomic.AtomicLong @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class) @@ -40,14 +38,12 @@ class CountUpTimer( private val elapsedTime: AtomicLong = AtomicLong(initialTime) private fun startCounter() { - counterJob = tickerFlow( - scope = coroutineScope, - delayMillis = intervalInMs, - initialDelayMillis = intervalInMs - (elapsedTime() % intervalInMs) - ) - .map { elapsedTime() } - .onEach { tickListener?.onTick(it) } - .launchIn(coroutineScope) + counterJob = coroutineScope.launch { + while (true) { + delay(intervalInMs - elapsedTime() % intervalInMs) + tickListener?.onTick(elapsedTime()) + } + } } var tickListener: TickListener? = null @@ -63,7 +59,8 @@ class CountUpTimer( fun pause() { tickListener?.onTick(elapsedTime()) - coroutineScope.cancel() + counterJob?.cancel() + counterJob = null } fun resume() { @@ -74,6 +71,7 @@ class CountUpTimer( fun stop() { tickListener?.onTick(elapsedTime()) coroutineScope.cancel() + counterJob = null } fun interface TickListener { From 6f18c020ea77d39d78d8b83d87ae0b84c823cf3f Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Feb 2023 17:35:38 +0100 Subject: [PATCH 14/30] Add unit test on count up timer --- library/core-utils/build.gradle | 8 ++ .../lib/core/utils/timer/CountUpTimer.kt | 7 +- .../lib/core/utils/test/fakes/FakeClock.kt | 27 ++++++ .../lib/core/utils/timer/CountUpTimerTest.kt | 96 +++++++++++++++++++ 4 files changed, 134 insertions(+), 4 deletions(-) create mode 100644 library/core-utils/src/test/java/im/vector/lib/core/utils/test/fakes/FakeClock.kt create mode 100644 library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt diff --git a/library/core-utils/build.gradle b/library/core-utils/build.gradle index b985127ec6..d1e82fcb9a 100644 --- a/library/core-utils/build.gradle +++ b/library/core-utils/build.gradle @@ -53,4 +53,12 @@ android { dependencies { implementation libs.jetbrains.coroutinesAndroid + + // TESTS + testImplementation libs.tests.junit + testImplementation libs.tests.kluent + testImplementation libs.mockk.mockk + testImplementation(libs.jetbrains.coroutinesTest) { + exclude group: "org.jetbrains.kotlinx", module: "kotlinx-coroutines-debug" + } } diff --git a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt index 8485398ffa..435a8603e8 100644 --- a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt @@ -19,22 +19,21 @@ package im.vector.lib.core.utils.timer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job -import kotlinx.coroutines.cancel import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.concurrent.atomic.AtomicLong @OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class) class CountUpTimer( + private val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main), private val clock: Clock = DefaultClock(), private val intervalInMs: Long = 1_000, initialTime: Long = 0L, ) { - private val coroutineScope = CoroutineScope(Dispatchers.Main) private var counterJob: Job? = null - private val lastTime: AtomicLong = AtomicLong() + private val lastTime: AtomicLong = AtomicLong(clock.epochMillis()) private val elapsedTime: AtomicLong = AtomicLong(initialTime) private fun startCounter() { @@ -70,7 +69,7 @@ class CountUpTimer( fun stop() { tickListener?.onTick(elapsedTime()) - coroutineScope.cancel() + counterJob?.cancel() counterJob = null } diff --git a/library/core-utils/src/test/java/im/vector/lib/core/utils/test/fakes/FakeClock.kt b/library/core-utils/src/test/java/im/vector/lib/core/utils/test/fakes/FakeClock.kt new file mode 100644 index 0000000000..4bad4471f1 --- /dev/null +++ b/library/core-utils/src/test/java/im/vector/lib/core/utils/test/fakes/FakeClock.kt @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2023 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.lib.core.utils.test.fakes + +import im.vector.lib.core.utils.timer.Clock +import io.mockk.every +import io.mockk.mockk + +class FakeClock : Clock by mockk() { + fun givenEpoch(epoch: Long) { + every { epochMillis() } returns epoch + } +} diff --git a/library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt b/library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt new file mode 100644 index 0000000000..df517751ed --- /dev/null +++ b/library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2023 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.lib.core.utils.timer + +import im.vector.lib.core.utils.test.fakes.FakeClock +import io.mockk.every +import io.mockk.mockk +import io.mockk.verifySequence +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceTimeBy +import kotlinx.coroutines.test.currentTime +import kotlinx.coroutines.test.runTest +import org.junit.Test + +private const val AN_INTERVAL = 500L +private const val AN_INITIAL_TIME = 2_333L + +@OptIn(ExperimentalCoroutinesApi::class) +internal class CountUpTimerTest { + + private val fakeClock = FakeClock() + + @Test + fun `when pausing and resuming the timer, the timer ticks the right values at the right moments`() = runTest { + every { fakeClock.epochMillis() } answers { currentTime } + val tickListener = mockk(relaxed = true) + val timer = CountUpTimer( + coroutineScope = this, + clock = fakeClock, + intervalInMs = AN_INTERVAL, + initialTime = 0, + ).also { it.tickListener = tickListener } + + timer.resume() + advanceTimeBy(AN_INTERVAL / 2) // no tick + timer.pause() // tick + advanceTimeBy(AN_INTERVAL * 10) // no tick + timer.resume() // no tick + advanceTimeBy(AN_INTERVAL * 4) // tick * 4 + timer.stop() // tick + + verifySequence { + tickListener.onTick(AN_INTERVAL / 2) + tickListener.onTick(AN_INTERVAL) + tickListener.onTick(AN_INTERVAL * 2) + tickListener.onTick(AN_INTERVAL * 3) + tickListener.onTick(AN_INTERVAL * 4) + tickListener.onTick(AN_INTERVAL * 4 + AN_INTERVAL / 2) + } + } + + @Test + fun `given an initial time, the timer ticks the right values at the right moments`() = runTest { + every { fakeClock.epochMillis() } answers { currentTime } + val tickListener = mockk(relaxed = true) + val timer = CountUpTimer( + coroutineScope = this, + clock = fakeClock, + intervalInMs = AN_INTERVAL, + initialTime = AN_INITIAL_TIME, + ).also { it.tickListener = tickListener } + + timer.resume() + advanceTimeBy(AN_INTERVAL) // tick + timer.pause() // tick + advanceTimeBy(AN_INTERVAL * 10) // no tick + timer.resume() // no tick + advanceTimeBy(AN_INTERVAL * 4) // tick * 4 + timer.stop() // tick + + val offset = AN_INITIAL_TIME % AN_INTERVAL + verifySequence { + tickListener.onTick(AN_INITIAL_TIME + AN_INTERVAL - offset) + tickListener.onTick(AN_INITIAL_TIME + AN_INTERVAL) + tickListener.onTick(AN_INITIAL_TIME + AN_INTERVAL * 2 - offset) + tickListener.onTick(AN_INITIAL_TIME + AN_INTERVAL * 3 - offset) + tickListener.onTick(AN_INITIAL_TIME + AN_INTERVAL * 4 - offset) + tickListener.onTick(AN_INITIAL_TIME + AN_INTERVAL * 5 - offset) + tickListener.onTick(AN_INITIAL_TIME + AN_INTERVAL * 5) + } + } +} From 524680fced7f43bb0a2a17069477b2d6b7d97571 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Feb 2023 18:12:18 +0100 Subject: [PATCH 15/30] changelog --- changelog.d/8058.misc | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/8058.misc diff --git a/changelog.d/8058.misc b/changelog.d/8058.misc new file mode 100644 index 0000000000..d864b3c7a8 --- /dev/null +++ b/changelog.d/8058.misc @@ -0,0 +1 @@ +Improve the `CountUpTimer` implementation From 9383319b37cc0095e689f2a7e96b0d653928c797 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Wed, 1 Feb 2023 23:26:49 +0100 Subject: [PATCH 16/30] Fix import --- vector-app/src/androidTest/java/im/vector/app/EspressoExt.kt | 2 +- .../java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vector-app/src/androidTest/java/im/vector/app/EspressoExt.kt b/vector-app/src/androidTest/java/im/vector/app/EspressoExt.kt index 68a54e9901..7139af49a2 100644 --- a/vector-app/src/androidTest/java/im/vector/app/EspressoExt.kt +++ b/vector-app/src/androidTest/java/im/vector/app/EspressoExt.kt @@ -43,8 +43,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.bottomsheet.BottomSheetDialogFragment import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment -import im.vector.app.core.time.DefaultClock import im.vector.app.espresso.tools.waitUntilViewVisible +import im.vector.lib.core.utils.timer.DefaultClock import org.hamcrest.Matcher import org.hamcrest.Matchers import org.hamcrest.StringDescription diff --git a/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt b/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt index 5e131479bf..69b43770c5 100644 --- a/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt +++ b/vector-app/src/androidTest/java/im/vector/app/espresso/tools/ScreenshotFailureRule.kt @@ -24,7 +24,7 @@ import android.os.Build import android.os.Environment import android.provider.MediaStore import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation -import im.vector.app.core.time.DefaultClock +import im.vector.lib.core.utils.timer.DefaultClock import org.junit.rules.TestWatcher import org.junit.runner.Description import timber.log.Timber From 8a1f1a37569df5972a6a42ee46836162f009ae5d Mon Sep 17 00:00:00 2001 From: oksya8and8 Date: Sat, 4 Feb 2023 18:29:45 +0000 Subject: [PATCH 17/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 54a8c8ee0f..24f71a0ca7 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -848,7 +848,7 @@ %1$sがこのルームのアドレスに%2$sを追加しました。 - %sがこのルームのサーバーのアクセス制御リストを変更しました。 + %sがこのサーバーのACLを変更しました。 IPリテラルに一致するサーバーは禁止されています。 ・IPリテラルに一致するサーバーを許可します。 ・%sに一致するサーバーは許可されています。 From e1a285180378215d8543b3d65fcbd84478ba9214 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sat, 4 Feb 2023 18:29:05 +0000 Subject: [PATCH 18/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- .../src/main/res/values-ja/strings.xml | 208 +++++++++++++----- 1 file changed, 151 insertions(+), 57 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 24f71a0ca7..276fb2e234 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -16,14 +16,14 @@ %1$sが表示名(%2$s)を削除しました %1$sがテーマを%2$sに変更しました %1$sがルーム名を%2$sに変更しました - %sがビデオ通話を開始しました。 - %sが音声通話を開始しました。 + %sがビデオ通話を発信しました。 + %sが音声通話を発信しました。 %sが電話に出ました。 %sが通話を終了しました。 ルームへの招待 %1$sと%2$s 空のルーム - %1$sが今後のルーム履歴を「%2$s」閲覧可能に設定しました。 + %1$sが今後のルームの履歴を「%2$s」閲覧可能に設定しました。 ルームのメンバー全員(招待された時点から) ルームのメンバー全員(参加した時点から) ルームのメンバー全員 @@ -34,7 +34,7 @@ %1$sが%2$sにルームへの招待を送りました %1$sが%2$sの招待を受け入れました ** 復号化できません:%s ** - 送信者の端末からこのメッセージの鍵が送信されていません。 + 送信者の端末からこのメッセージ用の鍵が送信されていません。 メッセージを送信できません Matrixエラー メールアドレス @@ -72,7 +72,7 @@ 共有 削除 招待 - 全ての発言を既読にする + 全て既読にする すぐに返信 開く 閉じる @@ -230,8 +230,8 @@ ダイレクトメッセージ ブロック ブロックを解除 - この参加者の発言を全て非表示 - このメンバーの発言を全て表示 + 無視 + 無視を解除 メンション ログアウト 無視 @@ -302,7 +302,7 @@ サーバーの管理者が、これは想定されていることであると言っているのであれば、以下のフィンガープリントが、管理者によるフィンガープリントと一致していることを確認してください。 証明書はあなたの電話により信頼されていたものから変更されています。これはきわめて異常な事態です。この新しい証明書を承認しないことを強く推奨します。 証明書は以前信頼されていたものから信頼されていないものへと変更されています。サーバーがその証明書を更新した可能性があります。サーバーの管理者に連絡して、適切なフィンガープリントを確認してください。 - サーバーの管理者が上のフィンガープリントと一致するものを発行した場合に限り、証明書を承認してください。 + サーバーの管理者が上記のものと一致するフィンガープリントを発行した場合にのみ、証明書を承認してください。 検索 このアプリの情報をシステム設定で表示。 アプリの情報 @@ -352,13 +352,13 @@ メンバー - %d名のメンバー + %d人のメンバー %d件の新しいメッセージ アバター - スタンプを送る + ステッカーを送る ダウンロード システムアラート 可能であれば、英語で説明文を記述してください。 @@ -403,7 +403,7 @@ 表示するニックネームを変更 Markdown書式の入/切 Matrixアプリの管理を修正するには - %1$sのホームサーバーの使用を継続するには、利用規約を確認し、同意する必要があります。 + %1$sのホームサーバーを引き続き使用するには、利用規約を確認して同意する必要があります。 エラー 今すぐ確認 アカウントを停止 @@ -641,7 +641,7 @@ 拡張設定 現在の言語 他の利用可能な言語 - メッセージエディタ + メッセージエディター 環境設定 この端末で設定 セキュアバックアップを再設定 @@ -761,7 +761,7 @@ このユーザーの招待をキャンセルしてよろしいですか? 招待をキャンセル このユーザーを解除すると、そのユーザーからの全てのメッセージが再び表示されます。 - ユーザーを無視しない + ユーザーの無視を解除 このユーザーを無視すると、あなたが共有しているルームからそのユーザーのメッセージが削除されます。 \n \nこの操作は、設定からいつでも元に戻すことができます。 @@ -787,11 +787,11 @@ 非公開 切り替える 追加 - %1$sがエンドツーエンド暗号化(認識されていないアルゴリズム %2$s)をオンにしました。 - エンドツーエンド暗号化(認識されていないアルゴリズム %1$s)をオンにしました。 + %1$sがエンドツーエンド暗号化(認識されていないアルゴリズム %2$s)を有効にしました。 + エンドツーエンド暗号化(認識されていないアルゴリズム %1$s)を有効にしました。 会話を始める - %1$sがエンドツーエンド暗号化をオンにしました。 - エンドツーエンド暗号化をオンにしました。 + %1$sがエンドツーエンド暗号化を有効にしました。 + エンドツーエンド暗号化を有効にしました。 ゲストがルームに参加するのを拒否しました。 %1$sはゲストがルームに参加するのを拒否しました。 ゲストがルームに参加するのを拒否しました。 @@ -849,19 +849,19 @@ %1$sがこのルームのアドレスに%2$sを追加しました。 %sがこのサーバーのACLを変更しました。 - IPリテラルに一致するサーバーは禁止されています。 + ・IPリテラルに一致するサーバーはブロックされています。 ・IPリテラルに一致するサーバーを許可します。 ・%sに一致するサーバーは許可されています。 - ・%sに一致するサーバーは禁止されています。 + ・%sに一致するサーバーはブロックされています。 %sがこのルームのサーバーアクセス制御リストを設定しました。 %sがここをアップグレードしました。 %sがこのルームをアップグレードしました。 今後のメッセージを「%1$s」閲覧可能に設定しました。 - 今後のルーム履歴を「%1$s」閲覧可能に設定しました。 + 今後のルームの履歴を「%1$s」閲覧可能に設定しました。 %1$sが今後のメッセージを「%2$s」閲覧可能に設定しました。 %sが通話を設定するためにデータを送信しました。 - 通話を開始しました。 - ビデオ通話を開始しました。 + 音声通話を発信しました。 + ビデオ通話を発信しました。 %1$sをブロックしました。理由:%2$s %1$sが%2$sをブロックしました。理由:%3$s %1$sのブロックを解除しました。理由:%2$s @@ -913,7 +913,7 @@ %1$sの権限レベルを%2$sから%3$sへ変更しました。 カスタム カスタム (%1$d) - デフォルト + 既定 モデレーター 管理者 %1$sウィジェットを変更しました @@ -1115,7 +1115,7 @@ ホームサーバーにバックアップが存在しています リカバリーキーが保存されました。 リカバリーキーを保存 - コピーをしました + コピーしました リカバリーキーはパスワードマネージャー(もしくは金庫)のような、非常に安全な場所で保管してください リカバリーキーはセーフティーネットとなります。パスフレーズを忘れた場合でも、リカバリーキーを使えば、暗号化されたメッセージにアクセスすることができます。 \nリカバリーキーは、パスワードマネージャー(もしくは金庫)のような、非常に安全な場所で保管してください。 @@ -1175,7 +1175,7 @@ 既に一覧に載っているサーバーです サーバーまたはそのルーム一覧が見つかりません - 探索したい新しいサーバーの名前を入力してください。 + 探したい新しいサーバーの名前を入力してください。 新しいサーバーを追加 あなたのサーバー 暗号化されたメッセージの復元 @@ -1187,7 +1187,7 @@ スペースのメンバーのみ 誰でもルームを発見し参加できます 公開 - 招待された人だけが発見し参加できます + 招待した人のみが検索・参加できます 非公開 不明のアクセス設定(%s) 誰でもルームにノックができ、メンバーがその参加を承認または拒否できます @@ -1490,7 +1490,7 @@ 暗号化されていません 終了 再読み込み - セッション一覧 + セッション 警告 無視を解除 動画。 @@ -1543,7 +1543,7 @@ スペースに関する変更を行うために必要な役割を更新する権限がありません スペースに関する変更を行うために必要な役割を選択 スペースに関する変更を行うために必要な役割を表示し更新します。 - フィルター + 絞り込む スレッド スレッド スペースをアップグレード @@ -1595,17 +1595,17 @@ スレッド機能を使うと、会話のテーマを維持したり、会話を簡単に追跡したりすることができます。 あなたの非公開のスペース あなたの公開スペース - 自分のみ + 自分専用 スレッド機能を使って、会話をまとめましょう %sを待機しています… この端末でスキャン - 認証を送信済 + 認証を送信しました このセッションを認証 音声 ルームのアドレスを入力してください このアドレスは既に使用されています スペースのアドレス - 一致しません + 一致していません 一致しています サインイン サインアウトしました @@ -1748,7 +1748,7 @@ %1$d個の投票 アンケートを締め切り、最終結果を表示します。 - 招待者のみ参加可能。個人やチームに最適 + 招待者のみ参加可能。個人やチーム向け スペースを作成 連絡先をスペースに招待 IDサーバーには利用規約がありません @@ -1777,7 +1777,7 @@ このアンケートを削除してよろしいですか?一度削除すると復元することはできません。 共有データの取り扱いに失敗しました 回転とクロップ - ルームを探索 + ルームを探す 既存のルームとスペースを追加 スレッドのメッセージを有効にする おすすめに追加 @@ -1826,7 +1826,7 @@ 認証済 未送信のメッセージを削除 カスタムイベントを送信 - ルームの状態を探索 + ルームの状態を調査 開封確認メッセージを表示 通知しない ファイルから鍵をインポート @@ -1840,7 +1840,7 @@ 初めに設定画面でIDサーバーの利用規約を承認してください。 初めにIDサーバーを設定してください。 - %1$d個の投票があります。結果を見るには投票してください + 合計%1$d票。投票すると結果を確認できます 未認証の端末で暗号化 メッセージを紙吹雪と共に送信 @@ -1860,15 +1860,15 @@ 一度有効にしたルームの暗号化は無効にすることはできません。暗号化されたルームで送信されたメッセージは、サーバーからは見ることができず、そのルームのメンバーだけが見ることができます。暗号化を有効にすると、多くのボットやブリッジが正常に動作しなくなる場合があります。 %sして、このルームを皆に紹介しましょう。 このコードを共有し、スキャンして追加してもらい、会話を始めましょう。 - 正当な参加者が%sにアクセスできることを確認してください。 - 参加者を追加 + 正しい参加者が%sにアクセスできるようにしましょう。 + 連絡先を追加 %d人の知り合いがすでに参加しています %sに招待 ユーザー名かメールアドレスで招待 %sから退出してよろしいですか? - スペースは、ルームや連絡先をグループ化する新しい方法です。 + スペースは、ルームや連絡先をまとめる新しい方法です。 招待されています 新しいスペースを、あなたが管理するスペースに追加。 注意:アプリケーションが再起動します @@ -1882,7 +1882,7 @@ %1$d個の投票に基づく - %1$d個の投票に基づく最終結果 + 合計%1$d票の投票に基づく最終結果 新しいセッションが認証されました。セッションは暗号化されたメッセージにアクセスでき、他のユーザーには信頼済として表示されます。 このルームを同じホームサーバー上で組織内のチームとのコラボレーションにのみ使用するなら、このオプションを有効にするといいかもしれません。これは後から変更できません。 @@ -1992,7 +1992,7 @@ テキストメッセージで共有 保護を設定 このルームのみ - 誰でも参加可能。コミュニティーに最適 + 誰でも参加可能。コミュニティー向け 既存のスペースに参加するには、招待が必要です。 これは後から変更できます 変更を破棄 @@ -2131,7 +2131,7 @@ 暗号化を有効な状態に取り戻すために、管理者に連絡してください。 このユーザーとのメッセージはエンドツーエンドで暗号化されており、第三者が解読することはできません。 このコードを相手の画面に現れているコードと比較してください。 - 絵文字を比較して、同じ順番で現れているのを確認してください。 + 絵文字を比較して、同じ順番で現れていることを確認してください。 セキュリティーを高めるために、対面で行うか、他の通信手段を利用しましょう。 選択されたエモートを虹色にして送信します 選択されたテキストを虹色にして送信します @@ -2170,17 +2170,17 @@ %1$sの権限レベルを変更しました。 誰と使いますか? 作成するスペースの種類を選択してください - 自分と仲間の非公開のスペース - ルームを整理するためのプライベートスペース + 自分とチームメイトの非公開のスペース + ルームを整理するための非公開のスペース ここが会話のスタート地点です。 ここが%sのスタート地点です。 - あと少しです!確認を待機しています… + もう少しです!確認を待機しています… あと少しです!もう一方のデバイスは同じマークを表示していますか? %sを待機しています… このユーザーがこのセッションを認証するまで、送受信されるメッセージには警告マークが付きます。手動で認証することも可能です。 セッションの取得に失敗しました - 誰がチームの仲間ですか? - %sを探索できるようになります + チームの仲間を招待しましょう + %sを探せるようになります 私のスペース %1$s %2$s に参加してください スキップ ルームの通知 @@ -2227,7 +2227,7 @@ 最新の${app_name}を他の端末で、${app_name} ウェブ版、${app_name} デスクトップ版、${app_name} iOS、${app_name} Android、あるいはクロス署名に対応した他のMatrixのクライアントでご使用ください スライドして通話を終了 電話番号を検索する際にエラーが発生しました - 着信を拒否しました + 通話を拒否しました それぞれにルームを作りましょう。後から追加することもできます(既にあるルームも追加できます)。 このスペースを特定できるような特徴を記入してください。これはいつでも変更できます。 目立つように特徴を記入してください。これはいつでも変更できます。 @@ -2240,7 +2240,7 @@ ステートイベント カスタムのステートイベントを送信 ステートイベントを送信しました! - 続行するには名前を付けてください。 + 続行するには名前を設定してください。 どんな作業に取り組みますか? あと%1$d件 @@ -2289,7 +2289,7 @@ IDサーバー %s から切断しますか? ダイレクトメッセージを作成できませんでした。招待したいユーザーを確認し、もう一度やり直してください。 セキュリティーフレーズ - 自分と仲間 + 自分とチームメイト メッセージの種類がありません 絵文字の一覧を閉じる 絵文字の一覧を開く @@ -2306,7 +2306,7 @@ 操作を実行できません。ホームサーバーは最新のバージョンではありません。 ビデオ通話が拒否されました 音声通話が拒否されました - %1$sは着信を拒否しました + %1$sは通話を拒否しました このデバイスを認証可能な他の端末が全くない場合にのみ、続行してください。 このセッションを信頼済として認証すると、暗号化されたメッセージにアクセスすることができます。このアカウントにサインインしなかった場合は、あなたのアカウントのセキュリティーが破られている可能性があります: アカウントのセキュリティーが破られている可能性があります @@ -2401,12 +2401,12 @@ 進みましょう ユーザー名 / メールアドレス / 電話番号 あなたは人間ですか? - %sに送信された手順に従ってください + %sに送信された手順に従ってください。 パスワードを再設定 パスワードを忘れた場合 電子メールを再送信 電子メールが届いていませんか? - %sに送信された手順に従ってください + %sに送信された手順に従ってください。 メールアドレスを認証 コードを再送信 コードが%sに送信されました @@ -2447,7 +2447,7 @@ 初期同期のリクエスト %sの子スペースを折りたたむ %sの子スペースを展開 - ルームを探索 + ルームを探す スペースを変更 ルームを作成 チャットを開始 @@ -2504,7 +2504,7 @@ 地図を読み込めません \nこのホームサーバーは地図が読み込むよう設定されていないおそれがあります。 - スペースは、ルームや連絡先をグループ化する新しい方法です。右下のボタンを使うと、既存のルームを追加したり新たに作成したりできます。 + スペースは、ルームや連絡先をまとめる新しい方法です。右下のボタンを使うと、既存のルームを追加したり新たに作成したりできます。 セキュリティーに関する勧告 その他のセッション セキュリティーを最大限に高めるには、不明なセッションや利用していないセッションからサインアウトしてください。 @@ -2530,7 +2530,7 @@ セッション名を設定すると、端末をより簡単に認識できるようになります。 このセッションでプッシュ通知を受信。 絞り込みを解除 - 絞り込み + 絞り込む アプリケーション、端末、アクティビティーに関する情報。 直近のアクティビティー セッション名 @@ -2706,8 +2706,8 @@ 問い合わせる 自分でサーバーを運営したいですか? サーバーのURL - あなたのサーバーのアドレスを入力してください - あなたのサーバーのアドレスを指定してください。サーバーにはあなたの全てのデータが保管されます + ホームサーバーのアドレスを入力してください + あなたのホームサーバーのアドレスを入力してください。ここにあなたの全てのデータがホストされます サーバーを選択 編集 8文字以上にしてください @@ -2760,4 +2760,98 @@ 問題が発生しました。ネットワークの接続を確認して、もう一度やり直してください。 引用 チーム、友達、組織向けのオールインワンの安全なチャットアプリです。はじめに、チャットを作成するか既存のルームに参加しましょう。 + 一致していませんか? + 接続に失敗しました + サインイン済の端末を確認してください。以下のコードが表示されているはずです。以下のコードがサインイン済の端末と一致していることを確認してください: + サインイン済の端末で以下のQRコードをスキャンしてください: + この端末を使い、QRコードをスキャンして新しい端末でサインインできます。2つの方法があります: + このスペース内のもの + 正しい参加者が%sにアクセスできるようにしましょう。後から追加で招待できます。 + 終了したアンケート + アンケートを終了しました。 + アンケートを作成しました。 + ステッカーを送信しました。 + 動画を送信しました。 + 画像を送信しました。 + 音声メッセージを送信しました。 + 音声ファイルを送信しました。 + ファイルを送信しました。 + インラインコードの装飾を適用 + 箇条書きリストの表示を切り替える + 番号付きリストの表示を切り替える + 下線で装飾 + 打ち消し線で装飾 + このコードの出所を知っていることを確認してください。端末をリンクすると、あなたのアカウントに無制限にアクセスできるようになります。 + もう一度試してください + サインインしています + この端末でQRコードを表示 + 「QRコードをスキャン」を選択してください + 「QRコードでサインイン」を選択してください + 「QRコードを表示」を選択してください + 設定から「セキュリティーとプライバシー」を開いてください + 他の端末でアプリを開いてください + もう一方の端末のサインインはキャンセルされました。 + もう一方のデバイスは既にサインインしています。 + リクエストはもう一方の端末で拒否されました。 + 時間内にリンクが完了しませんでした。 + この端末とのリンクはサポートしていません。 + サインアウトした端末で以下のQRコードをスキャンしてください。 + この端末のカメラを使用して、他の端末に表示されているQRコードをスキャンしてください: + %s +\nは空です。 + クライアントの名称、バージョン、URLを記録し、セッションマネージャーでより容易にセッションを認識できるよう設定。 + セッション名を変更 + 絞り込む + 直近のオンライン日時 %1$s + + 使用していない古いセッション(%1$d日以上使用されていません)からサインアウトすることを検討してください。 + + 未認証のセッションを認証するか、サインアウトしてください。 + 未認証・現在のセッション + 未認証・直近のオンライン日時 %1$s + 認証済・直近のオンライン日時 %1$s + 現在のセッションを認証すると、このセッションの認証の状態を確認できます。 + セキュリティーを最大限に高めるには、セッションを認証し、不明なセッションや利用していないセッションからサインアウトしてください。 + Element Callウィジェットを自動で承認し、カメラまたはマイクのアクセス権を付与 + Element Callの権限のショートカットを有効にする + 現在のゲートウェイ:%s + ゲートウェイ + + %d個の方法が見つかりました。 + + フォトライブラリー + %1$s前に更新済 + %1$sまで共有(ライブ) + 他のアンケートを読み込む + + 過去%1$d日に実施されたアンケートはありません。 +\nさらにアンケートを読み込み、前の月のアンケートを表示。 + + + 過去%1$d日に実施中のアンケートはありません。 +\nさらにアンケートを読み込み、前の月のアンケートを表示。 + + 30秒早送り + 30秒巻き戻す + 音声配信を再生または再開 + 音声配信の録音を停止 + 音声配信の録音を一時停止 + %1$s、%2$s、%3$s + 録音をタップして停止または再生 + 非公開で招待が必要なものは表示されていません。 + 下書きを取り消しました + あなたが参加するダイレクトメッセージとルームの他のユーザーは、あなたのセッションの一覧を閲覧できます。 +\n +\nセッションの一覧から、相手はあなたとやり取りしていることを確かめることができます。なお、あなたがここに入力するセッション名は相手に対して表示されます。 + このセッションは暗号化をサポートしていないため、認証できません。 +\n +\nこのセッションでは、暗号化が有効になっているルームに参加することができません。 +\n +\nセキュリティーとプライバシー保護の観点から、暗号化をサポートしているMatrixのクライアントの使用を推奨します。 + 未認証のセッションは、認証情報でログインされていますが、クロス認証は行われていないセッションです。 +\n +\nこれらのセッションは、アカウントの不正使用を示している可能性があるため、注意して確認してください。 + 認証済のセッションは、パスフレーズの入力、または他の認証済のセッションで本人確認を行ったセッションです。 +\n +\n認証済のセッションには、暗号化されたメッセージを復号化する際に使用する全ての鍵が備わっています。また、他のユーザーに対しては、あなたがこのセッションを信頼していることが表示されます。 \ No newline at end of file From 222262e75a27b2b346c5f38c815d649a7e66b117 Mon Sep 17 00:00:00 2001 From: Tuomas Hietala Date: Thu, 2 Feb 2023 23:25:28 +0000 Subject: [PATCH 19/30] Translated using Weblate (Finnish) Currently translated at 80.4% (2090 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fi/ --- .../src/main/res/values-fi/strings.xml | 64 +++++++++++++++++-- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/library/ui-strings/src/main/res/values-fi/strings.xml b/library/ui-strings/src/main/res/values-fi/strings.xml index c1cc5da2c8..66f333845f 100644 --- a/library/ui-strings/src/main/res/values-fi/strings.xml +++ b/library/ui-strings/src/main/res/values-fi/strings.xml @@ -252,7 +252,7 @@ Saapuva videopuhelu Saapuva puhelu Puhelu käynnissä… - Toinen puoli ei vastannut. + Toinen osapuoli ei vastannut. Huomio ${app_name} tarvitsee käyttöluvan mikrofoniin suorittakseen puheluita. ${app_name} tarvitsee käyttöluvan kameraan ja mikrofoniin suorittakseen videopuheluita. @@ -887,7 +887,7 @@ Jaat sähköpostiosoitteita tai puhelinnumeroita identiteettipalvelimella %1$s. Sinun täytyy yhdistää uudelleen palvelimeen %2$s, jotta voit lopettaa niiden jakamisen. Hyväksy identiteettipalvelimen (%s) käyttöehdot salliaksesi, että sinut voi löytää sähköpostiosoitteen tai puhelinnumeron perusteella. Yhteyden katkaiseminen identiteettipalvelimeesi tarkoittaa, että muut käyttäjät eivät voi etsiä sinua etkä voi kutsua muita sähköpostin tai puhelinnumeron perusteella. - Lähetimme sinulle vahvistussähköpostin osoitteeseen %s, tarkista sähköpostisi ja klikkaa vahvistuslinkkiä + Lähetimme sinulle sähköpostia osoitteeseen %s. Tarkista sähköpostisi ja klikkaa vahvistuslinkkiä. Ota yksityiskohtaiset lokit käyttöön. Yritä uudelleen, kun olet hyväksynyt kotipalvelimesi käyttöehdot. Palvelimen vastaus näyttäisi olevan liian hidas. Tämä voi johtua kehnosta yhteydestä tai palvelimella olevasta ongelmasta. Yritä hetken kuluttua uudelleen. @@ -1026,7 +1026,7 @@ Kirjaudu sisään palvelimeen %1$s Rekisteröidy Kirjaudu sisään - Jatka kertakirjautumiseen + Jatka kertakirjautumisella Element Matrix Services in osoite Osoite Korkealuokkaista isännöintiä organisaatioille @@ -1097,8 +1097,8 @@ Syöttämäsi koodi ei ole kelvollinen. Tarkista se. Vanhentunut kotipalvelin - Liian monta pyyntöä lähetettiin. Voit yrittää uudelleen 1 sekunnissa… - Liian monta pyyntöä lähetettiin. Voit yrittää uudelleen %1$d sekunnissa… + Liian monta pyyntöä lähetettiin. Voit yrittää uudelleen sekunnin kuluttua… + Liian monta pyyntöä lähetettiin. Voit yrittää uudelleen %1$d sekunnin kuluttua… Nähneet Olet kirjautunut ulos @@ -2068,7 +2068,7 @@ Onnittelut! Personoi profiili ohittaa tämän kysymyksen - Ei varmuutta vielä\? Voit %s + Etkö ole vielä varma\? Voit %s Identiteettipalvelin ei tarjoa käytäntöä Piilota identiteettipalvelimen käytäntö Näytä identiteettipalvelimen käytäntö @@ -2307,4 +2307,54 @@ %1$d valittu %1$d valittu - + Puskuroidaan… + Ääniviestiä ei voi aloittaa + Tässä huoneessa on käytössä huoneversio %s, jonka tämä kotipalvelin on merkinnyt epävakaaksi. + Älä poistu mistään + Poistu kaikista + Poista profiilikuva + Vaihda profiilikuva + Puhelinnumeron haussa tapahtui virhe + + Kutsut lähetetty käyttäjälle %1$s ja yhdelle muulle + Kutsut lähetetty käyttäjälle %1$s ja %2$d muulle + + Kutsu lähetetty käyttäjille %1$s ja %2$s + Kutsu lähetetty käyttäjälle %1$s + Kutsu %s keskusteluun lähettämällä ensimmäinen viesti + Tästä alkaa yksityisviestihistoriasi sinun ja käyttäjän %s välillä. + %s alkaa tästä. + Salaus on säädetty väärin + Salaus on säädetty väärin. + Tällä kotipalvelimella on vanha versio. Pyydä kotipalvelimesi ylläpitäjää päivittämään se. Voit jatkaa, mutta jotkin ominaisuudet eivät välttämättä toimi oikein. + Ota yhteyttä + Jatka %s-kirjautumisella + tai + Keskustelujesi koti + Keskustelujesi koti + Laitetaan yhteydet kuntoon + Kenen kanssa juttelet eniten\? + ${app_name} toimii mainiosti työpaikallakin. Siihen luottavat maailman turvallisimmat organisaatiot. + Poistutaanko nykyisestä ryhmäpuhelusta ja vaihdetaan toiseen\? + Tämä palvelin on jo luettelossa + Tätä palvelinta tai sen huoneluetteloa ei löydy + Kuka vain voi koputtaa huoneeseen ja jäsenet voivat sen jälkeen hyväksyä tai hylätä + Poista osoitteen \"%1$s\" julkaiseminen\? + Huomaa, että maininnat ja avainsanailmoitukset eivät ole käytössä salausta käyttävissä huoneissa mobiililaitteilla. + Ota suora jako käyttöön + Toista aikajanalla olevat animoidut kuvat heti, kun ne näkyvät + Toista animoidut kuvat automaattisesti + Et saa ilmoituksia maininnoista ja avainsanoista salausta käyttävissä huoneissa mobiililaitteilla. + Huonepäivitykset + Botin lähettämät viestit + ${app_name} tarvitsee luvan ilmoitusten näyttämiseen. +\nAnna lupa. + Päivitä huone + Ota lykätyt yksityisviestit käyttöön + Poista valinta kaikista + Valitse kaikki + Anna mikrofonin käyttöoikeus ääniviestien lähettämiseksi. + Anna kameran käyttöoikeus järjestelmän asetuksista tämän toiminnon suorittamiseksi. + Tämän toiminnon suorittaminen vaatii enemmän oikeuksia. Anna oikeudet järjestelmän asetuksista. + Kuunnellaan ilmoituksia + \ No newline at end of file From 91db521ca934f9ab39b60233ef4ecfa192cff1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sveinn=20=C3=AD=20Felli?= Date: Thu, 2 Feb 2023 17:35:36 +0000 Subject: [PATCH 20/30] Translated using Weblate (Icelandic) Currently translated at 86.0% (2236 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/is/ --- .../src/main/res/values-is/strings.xml | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-is/strings.xml b/library/ui-strings/src/main/res/values-is/strings.xml index ba505bc0a3..8af9da3c9d 100644 --- a/library/ui-strings/src/main/res/values-is/strings.xml +++ b/library/ui-strings/src/main/res/values-is/strings.xml @@ -2382,4 +2382,44 @@ Náði því Þú endaðir talútsendingu. %1$s endaði talútsendingu. - + Víxla heilskjásham af/á + Víxla punktalista af/á + Víxla tölusettum lista af/á + Setja tengil + Virkja undirstrikun + Virkja yfirstrikun + Virkja skáletrað snið + Virkja feitletrað snið + Óstaðfest · Núverandi setan þín + Óstaðfest - Síðasta virkni %1$s + Staðfest - Síðasta virkni %1$s + Núverandi gátt: %s + Finn ekki endapunktinn. + Núverandi endapunktur: %s + Endapunktur + Tiltækar aðferðir + Ertu viss um að þú viljir stöðva þessa beinu útsendingu\? Þetta mun stöðva útsendinguna og full skráning hennar verður tiltæk á spjallrásinni. + Stöðva beina útsendingu\? + Villa í tengingu - Upptaka í bið + Tekst ekki að spila þessa talútsendingu. + Get ekki byrjað nýja talútsendingu + setja talútsendingu í bið + Spila eða halda áfram með talútsendingu + Stöðva upptöku á talútsendingu + Setja upptöku á talútsendingu í bið + Halda áfram með upptöku á talútsendingu + Nafnlaust lyklaborð + Tilgreindu ástæðu + Takmörk netþjóns á innsendingum skráa + Takmörk fyrir greiningu + Það eru engar skrár í þessari spjallrás + Útbúa nýtt samtal eða spjallrás + Staðfestingarkóðinn er ekki réttur. + Uppgötvanleg símanúmer + Umsögn um beta-útgáfu spjallþráða + Innifelur breytingar á auðkennismynd og birtingarnafni. + Birta atburði notandaaðgangs + Virkja beina deilingu + Beta-útgáfa spjallþráða + Beta-útgáfa spjallþráða + \ No newline at end of file From d798a83b4eb434ba4921b72fcaa9ce845e2abef7 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sat, 4 Feb 2023 18:30:04 +0000 Subject: [PATCH 21/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 276fb2e234..357edd5708 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -848,7 +848,7 @@ %1$sがこのルームのアドレスに%2$sを追加しました。 - %sがこのサーバーのACLを変更しました。 + %sがこのルームのサーバーのアクセス制御リストを変更しました。 ・IPリテラルに一致するサーバーはブロックされています。 ・IPリテラルに一致するサーバーを許可します。 ・%sに一致するサーバーは許可されています。 From 24b6c407ee338315e410a3b4e8bbfe3e5227d2b5 Mon Sep 17 00:00:00 2001 From: phardyle Date: Sat, 4 Feb 2023 00:02:14 +0000 Subject: [PATCH 22/30] Translated using Weblate (Chinese (Simplified)) Currently translated at 98.7% (2566 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- library/ui-strings/src/main/res/values-zh-rCN/strings.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml index 1e75540acf..f3b5854afb 100644 --- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml +++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml @@ -1803,7 +1803,7 @@ %d 个条目 这不是有效的 Matrix QR码 - 扫描二维码 + 扫描QR码 添加人员 邀请朋友 服务器版本 @@ -2819,4 +2819,5 @@ 无法播放此语音广播。 你无法启动语音消息因为你正在录制实时广播。请终止实时广播以开始录制语音消息 无法启动语音消息 - + 结束了投票。 + \ No newline at end of file From d190ebfbcd9464a19ab6d60a0fcab2e4fe5f3345 Mon Sep 17 00:00:00 2001 From: Joe Sagawa Date: Sat, 4 Feb 2023 18:32:27 +0000 Subject: [PATCH 23/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 357edd5708..3195249829 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -1366,7 +1366,7 @@ %d件の不在着信(音声) - デフォルトで使いもう尋ねない + 規定と設定して次回から確認しない 鍵の共有リクエストの履歴を送信 結果がありません 自分に電話をかけることはできません。参加者が招待を受け入れるまでお待ちください From a7c1c4381b04057162b333f9bafd6b4cce8c20d3 Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sat, 4 Feb 2023 18:32:09 +0000 Subject: [PATCH 24/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 3195249829..490c95b2bc 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -1060,7 +1060,7 @@ ルームを追加 %sはあなたを招待しています このルームでグループ通話を開始する権限がありません - オーディオミーティングを開始 + 音声通話を開始 安全バックアップを設定 鍵のバックアップで管理 鍵のバックアップを使用 @@ -1370,7 +1370,7 @@ 鍵の共有リクエストの履歴を送信 結果がありません 自分に電話をかけることはできません。参加者が招待を受け入れるまでお待ちください - ミーティングはJitsiのセキュリティーとパーミッションポリシーを使用します。会議中は、現在ルームにいる全ての人に招待が表示されます。 + ミーティングはJitsiのセキュリティーとパーミッションポリシーを使用します。ミーティング中は、現在ルームにいる全ての人に招待が表示されます。 権限がありません 音声メッセージを送信するには、マイクの権限を許可してください。 この操作を実行するには、システム設定からカメラの権限を許可してください。 From 4d228a9c18c94a3630139d299cd04a46bd7d4187 Mon Sep 17 00:00:00 2001 From: oksya8and8 Date: Sat, 4 Feb 2023 18:36:51 +0000 Subject: [PATCH 25/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 490c95b2bc..fc5c62d34b 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -2173,7 +2173,7 @@ 自分とチームメイトの非公開のスペース ルームを整理するための非公開のスペース ここが会話のスタート地点です。 - ここが%sのスタート地点です。 + これは%sの始まりです。 もう少しです!確認を待機しています… あと少しです!もう一方のデバイスは同じマークを表示していますか? %sを待機しています… From a88937b2f96dc1a7d99f82571969110dc7bec63e Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sat, 4 Feb 2023 18:35:07 +0000 Subject: [PATCH 26/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index fc5c62d34b..810930a0d8 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -1354,8 +1354,8 @@ ダイレクトメッセージ 自分のユーザー名 自分の表示名 - グループチャットでのメッセージの暗号化 - 個別チャットでのメッセージの暗号化 + グループチャットで暗号化されたメッセージ + 1対1のチャットで暗号化されたメッセージ 以下がメッセージに含まれる場合に通知 その他 メンションとキーワード @@ -1366,7 +1366,7 @@ %d件の不在着信(音声) - 規定と設定して次回から確認しない + 既定に設定して次回から確認しない 鍵の共有リクエストの履歴を送信 結果がありません 自分に電話をかけることはできません。参加者が招待を受け入れるまでお待ちください From 85bff0e786874fa51d9a0b7921389f41b50f074c Mon Sep 17 00:00:00 2001 From: oksya8and8 Date: Sat, 4 Feb 2023 18:38:44 +0000 Subject: [PATCH 27/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 810930a0d8..5eaf5d9691 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -1236,7 +1236,7 @@ 次に 次に ユーザー名を選択してください。 - ユーザー名やパスワードが正しくありません。 入力したパスワードは、スペースで開始または終了していますので、ご確認ください。 + ユーザー名かパスワードが正しくありません。入力されたパスワードがスペースによって開始しているか終了しているので、確認してください。 そのユーザー名は既に使用されています ユーザー名 ユーザー名またはメールアドレス From 033316eec31bd5bedf3fffc03a96d0c184b4723e Mon Sep 17 00:00:00 2001 From: Suguru Hirahara Date: Sat, 4 Feb 2023 18:37:48 +0000 Subject: [PATCH 28/30] Translated using Weblate (Japanese) Currently translated at 99.7% (2592 of 2598 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/ja/ --- library/ui-strings/src/main/res/values-ja/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml index 5eaf5d9691..d37cc518d7 100644 --- a/library/ui-strings/src/main/res/values-ja/strings.xml +++ b/library/ui-strings/src/main/res/values-ja/strings.xml @@ -1008,7 +1008,7 @@ %1$s、%2$s、他%3$d人のユーザーが読みました %1$s、%2$s、%3$sが読みました - メッセージをマークダウンとして解釈せずにプレーンテキストとして送信 + メッセージをマークダウンとして解釈せず、プレーンテキストとして送信 ファイルとして保存 共有 完了 @@ -2173,9 +2173,9 @@ 自分とチームメイトの非公開のスペース ルームを整理するための非公開のスペース ここが会話のスタート地点です。 - これは%sの始まりです。 + ここが%sの始まりです。 もう少しです!確認を待機しています… - あと少しです!もう一方のデバイスは同じマークを表示していますか? + あと少しです!もう一方の端末は同じマークを表示していますか? %sを待機しています… このユーザーがこのセッションを認証するまで、送受信されるメッセージには警告マークが付きます。手動で認証することも可能です。 セッションの取得に失敗しました From 912c37e3ff5727726bfa03f2494d80add6100047 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Mon, 6 Feb 2023 10:36:40 +0100 Subject: [PATCH 29/30] Reset elapsed time on stop action and add a start method to the CountUpTimer --- .../im/vector/lib/attachmentviewer/VideoViewHolder.kt | 2 +- .../im/vector/lib/core/utils/timer/CountUpTimer.kt | 10 +++++++--- .../im/vector/lib/core/utils/timer/CountUpTimerTest.kt | 6 ++---- .../home/room/detail/composer/AudioMessageHelper.kt | 10 +++------- .../detail/composer/voice/VoiceMessageRecorderView.kt | 2 +- .../features/location/live/map/LiveLocationUserItem.kt | 8 +++++--- .../listening/VoiceBroadcastPlayerImpl.kt | 7 ++----- .../recording/VoiceBroadcastRecorderQ.kt | 6 +++--- 8 files changed, 24 insertions(+), 27 deletions(-) diff --git a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt index 30da59750e..64bd31cd8c 100644 --- a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt +++ b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt @@ -110,7 +110,7 @@ class VideoViewHolder constructor(itemView: View) : // Log.v("FOO", "isPlaying $isPlaying $progress/$duration") eventListener?.get()?.onEvent(AttachmentEvents.VideoEvent(isPlaying, progress, duration)) } - it.resume() + it.start() } } try { diff --git a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt index 435a8603e8..3ed63a407b 100644 --- a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt +++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt @@ -23,18 +23,16 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import java.util.concurrent.atomic.AtomicLong -@OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class) class CountUpTimer( private val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main), private val clock: Clock = DefaultClock(), private val intervalInMs: Long = 1_000, - initialTime: Long = 0L, ) { private var counterJob: Job? = null private val lastTime: AtomicLong = AtomicLong(clock.epochMillis()) - private val elapsedTime: AtomicLong = AtomicLong(initialTime) + private val elapsedTime: AtomicLong = AtomicLong(0) private fun startCounter() { counterJob = coroutineScope.launch { @@ -56,6 +54,11 @@ class CountUpTimer( } } + fun start(initialTime: Long = 0L) { + elapsedTime.set(initialTime) + resume() + } + fun pause() { tickListener?.onTick(elapsedTime()) counterJob?.cancel() @@ -71,6 +74,7 @@ class CountUpTimer( tickListener?.onTick(elapsedTime()) counterJob?.cancel() counterJob = null + elapsedTime.set(0L) } fun interface TickListener { diff --git a/library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt b/library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt index df517751ed..83f11900b1 100644 --- a/library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt +++ b/library/core-utils/src/test/java/im/vector/lib/core/utils/timer/CountUpTimerTest.kt @@ -42,10 +42,9 @@ internal class CountUpTimerTest { coroutineScope = this, clock = fakeClock, intervalInMs = AN_INTERVAL, - initialTime = 0, ).also { it.tickListener = tickListener } - timer.resume() + timer.start() advanceTimeBy(AN_INTERVAL / 2) // no tick timer.pause() // tick advanceTimeBy(AN_INTERVAL * 10) // no tick @@ -71,10 +70,9 @@ internal class CountUpTimerTest { coroutineScope = this, clock = fakeClock, intervalInMs = AN_INTERVAL, - initialTime = AN_INITIAL_TIME, ).also { it.tickListener = tickListener } - timer.resume() + timer.start(AN_INITIAL_TIME) advanceTimeBy(AN_INTERVAL) // tick timer.pause() // tick advanceTimeBy(AN_INTERVAL * 10) // no tick diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt index 1929abcc4f..beec925f09 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt @@ -200,7 +200,7 @@ class AudioMessageHelper @Inject constructor( amplitudeTicker?.stop() amplitudeTicker = CountUpTimer(intervalInMs = 50).apply { tickListener = CountUpTimer.TickListener { onAmplitudeTick() } - resume() + start() } } @@ -217,11 +217,7 @@ class AudioMessageHelper @Inject constructor( stopRecordingAmplitudes() } } - - private fun resumeRecordingAmplitudes() { - amplitudeTicker?.resume() - } - + private fun stopRecordingAmplitudes() { amplitudeTicker?.stop() amplitudeTicker = null @@ -231,7 +227,7 @@ class AudioMessageHelper @Inject constructor( playbackTicker?.stop() playbackTicker = CountUpTimer().apply { tickListener = CountUpTimer.TickListener { onPlaybackTick(id) } - resume() + start() } onPlaybackTick(id) } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt index 526c774b6d..76656457b9 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/voice/VoiceMessageRecorderView.kt @@ -193,7 +193,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor( val isLocked = startFromLocked || lastKnownState is RecordingUiState.Locked onRecordingTick(isLocked, milliseconds + startMs) } - resume() + start() } onRecordingTick(startFromLocked, milliseconds = startMs) } diff --git a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt index 6d87ef99f7..fee267a46c 100644 --- a/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt +++ b/vector/src/main/java/im/vector/app/features/location/live/map/LiveLocationUserItem.kt @@ -79,10 +79,12 @@ abstract class LiveLocationUserItem : VectorEpoxyModel onTick(tick) } + it.start() } } From 43ecb63b178c57ef9dc6dd47af7f9db0da6a637c Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Mon, 6 Feb 2023 11:27:16 +0100 Subject: [PATCH 30/30] Remove trailing space --- .../features/home/room/detail/composer/AudioMessageHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt index beec925f09..c55f8ec047 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/AudioMessageHelper.kt @@ -217,7 +217,7 @@ class AudioMessageHelper @Inject constructor( stopRecordingAmplitudes() } } - + private fun stopRecordingAmplitudes() { amplitudeTicker?.stop() amplitudeTicker = null