From 971f44c0d31b5df7a333cf8939e24a109d7c838d Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 25 Apr 2024 10:10:08 +0200 Subject: [PATCH 01/10] Expected UTDs due to membership support --- .../event/TimelineItemEncryptedView.kt | 37 +++++++++++++++---- gradle/libs.versions.toml | 2 +- .../api/timeline/item/event/EventContent.kt | 3 +- .../api/timeline/item/event/UtdCause.kt | 22 +++++++++++ .../matrix/impl/analytics/UtdTracker.kt | 8 +++- .../item/event/TimelineEventContentMapper.kt | 11 +++++- 6 files changed, 70 insertions(+), 13 deletions(-) create mode 100644 libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/UtdCause.kt diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt index 1b67fce85d..039188b3aa 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt @@ -16,6 +16,7 @@ package io.element.android.features.messages.impl.timeline.components.event +import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -25,6 +26,7 @@ import io.element.android.libraries.designsystem.icons.CompoundDrawables import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent +import io.element.android.libraries.matrix.api.timeline.item.event.UtdCause import io.element.android.libraries.ui.strings.CommonStrings @Composable @@ -33,10 +35,17 @@ fun TimelineItemEncryptedView( onContentLayoutChanged: (ContentAvoidingLayoutData) -> Unit, modifier: Modifier = Modifier ) { + var text = stringResource(id = CommonStrings.common_waiting_for_decryption_key) + var iconId = CompoundDrawables.ic_compound_time + if (content.data is UnableToDecryptContent.Data.MegolmV1AesSha2 && + content.data.utdCause == UtdCause.Membership) { + text = stringResource(id = CommonStrings.common_unable_to_decrypt_no_access) + iconId = CompoundDrawables.ic_compound_block + } TimelineItemInformativeView( - text = stringResource(id = CommonStrings.common_waiting_for_decryption_key), + text = text, iconDescription = stringResource(id = CommonStrings.dialog_title_warning), - iconResourceId = CompoundDrawables.ic_compound_time, + iconResourceId = iconId, onContentLayoutChanged = onContentLayoutChanged, modifier = modifier ) @@ -45,10 +54,22 @@ fun TimelineItemEncryptedView( @PreviewsDayNight @Composable internal fun TimelineItemEncryptedViewPreview() = ElementPreview { - TimelineItemEncryptedView( - content = TimelineItemEncryptedContent( - data = UnableToDecryptContent.Data.Unknown - ), - onContentLayoutChanged = {}, - ) + Column { + TimelineItemEncryptedView( + content = TimelineItemEncryptedContent( + data = UnableToDecryptContent.Data.Unknown + ), + onContentLayoutChanged = {}, + ) + + TimelineItemEncryptedView( + content = TimelineItemEncryptedContent( + data = UnableToDecryptContent.Data.MegolmV1AesSha2( + sessionId = "sessionId", + utdCause = UtdCause.Membership + ) + ), + onContentLayoutChanged = {}, + ) + } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 3f877b3e05..090a65d9f4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -179,7 +179,7 @@ posthog = "com.posthog:posthog-android:3.1.18" sentry = "io.sentry:sentry-android:7.8.0" # Note: only 0.19.0 will compile properly # main branch can be tested replacing the version with main-SNAPSHOT -matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.15.0" +matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.20.0" # Emojibase matrix_emojibase_bindings = "io.element.android:emojibase-bindings:1.1.3" diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt index 9020a4c853..c0aac298a8 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/EventContent.kt @@ -63,7 +63,8 @@ data class UnableToDecryptContent( ) : Data data class MegolmV1AesSha2( - val sessionId: String + val sessionId: String, + val utdCause: UtdCause ) : Data data object Unknown : Data diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/UtdCause.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/UtdCause.kt new file mode 100644 index 0000000000..46e4d62249 --- /dev/null +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/UtdCause.kt @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024 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 io.element.android.libraries.matrix.api.timeline.item.event + +enum class UtdCause { + Unknown, + Membership, +} diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTracker.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTracker.kt index 578782d6c2..e8f09d1686 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTracker.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTracker.kt @@ -21,6 +21,7 @@ import io.element.android.services.analytics.api.AnalyticsService import org.matrix.rustcomponents.sdk.UnableToDecryptDelegate import org.matrix.rustcomponents.sdk.UnableToDecryptInfo import timber.log.Timber +import uniffi.matrix_sdk_crypto.UtdCause import javax.inject.Inject class UtdTracker @Inject constructor( @@ -28,6 +29,10 @@ class UtdTracker @Inject constructor( ) : UnableToDecryptDelegate { override fun onUtd(info: UnableToDecryptInfo) { Timber.d("onUtd for event ${info.eventId}, timeToDecryptMs: ${info.timeToDecryptMs}") + val name = when (info.cause) { + UtdCause.UNKNOWN -> Error.Name.OlmKeysNotSentError + UtdCause.MEMBERSHIP -> Error.Name.ExpectedDueToMembership + } val event = Error( context = null, // Keep cryptoModule for compatibility. @@ -35,8 +40,7 @@ class UtdTracker @Inject constructor( cryptoSDK = Error.CryptoSDK.Rust, timeToDecryptMillis = info.timeToDecryptMs?.toInt() ?: -1, domain = Error.Domain.E2EE, - // TODO get a more specific error name from `info` - name = Error.Name.OlmKeysNotSentError, + name = name, ) analyticsService.capture(event) } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt index 4e9ff6b98b..14ea994d38 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt @@ -31,6 +31,7 @@ import io.element.android.libraries.matrix.api.timeline.item.event.StateContent import io.element.android.libraries.matrix.api.timeline.item.event.StickerContent import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent import io.element.android.libraries.matrix.api.timeline.item.event.UnknownContent +import io.element.android.libraries.matrix.api.timeline.item.event.UtdCause import io.element.android.libraries.matrix.impl.media.map import io.element.android.libraries.matrix.impl.poll.map import kotlinx.collections.immutable.toImmutableList @@ -41,6 +42,7 @@ import org.matrix.rustcomponents.sdk.use import org.matrix.rustcomponents.sdk.EncryptedMessage as RustEncryptedMessage import org.matrix.rustcomponents.sdk.MembershipChange as RustMembershipChange import org.matrix.rustcomponents.sdk.OtherState as RustOtherState +import uniffi.matrix_sdk_crypto.UtdCause as RustUtdCause class TimelineEventContentMapper(private val eventMessageMapper: EventMessageMapper = EventMessageMapper()) { fun map(content: TimelineItemContent): EventContent { @@ -148,6 +150,13 @@ private fun RustMembershipChange.map(): MembershipChange { } } +private fun RustUtdCause.map(): UtdCause { + return when (this) { + RustUtdCause.MEMBERSHIP -> UtdCause.Membership + RustUtdCause.UNKNOWN -> UtdCause.Unknown + } +} + // TODO extract state events? private fun RustOtherState.map(): OtherState { return when (this) { @@ -177,7 +186,7 @@ private fun RustOtherState.map(): OtherState { private fun RustEncryptedMessage.map(): UnableToDecryptContent.Data { return when (this) { - is RustEncryptedMessage.MegolmV1AesSha2 -> UnableToDecryptContent.Data.MegolmV1AesSha2(sessionId) + is RustEncryptedMessage.MegolmV1AesSha2 -> UnableToDecryptContent.Data.MegolmV1AesSha2(sessionId, cause.map()) is RustEncryptedMessage.OlmV1Curve25519AesSha2 -> UnableToDecryptContent.Data.OlmV1Curve25519AesSha2(senderKey) RustEncryptedMessage.Unknown -> UnableToDecryptContent.Data.Unknown } From 7e5f270e2bc662697d33a762be88b2159565de80 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 25 Apr 2024 17:29:40 +0200 Subject: [PATCH 02/10] Create proper PreviewParameterProvider for TimelineItemEncryptedContent And remove `@Suppress("UNUSED_PARAMETER")` --- .../event/TimelineItemEncryptedView.kt | 31 +++++--------- .../TimelineItemEncryptedContentProvider.kt | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt index 039188b3aa..cb314c23a6 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt @@ -16,12 +16,13 @@ package io.element.android.features.messages.impl.timeline.components.event -import androidx.compose.foundation.layout.Column import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.PreviewParameter import io.element.android.features.messages.impl.timeline.components.layout.ContentAvoidingLayoutData import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContent +import io.element.android.features.messages.impl.timeline.model.event.TimelineItemEncryptedContentProvider import io.element.android.libraries.designsystem.icons.CompoundDrawables import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight @@ -31,7 +32,7 @@ import io.element.android.libraries.ui.strings.CommonStrings @Composable fun TimelineItemEncryptedView( - @Suppress("UNUSED_PARAMETER") content: TimelineItemEncryptedContent, + content: TimelineItemEncryptedContent, onContentLayoutChanged: (ContentAvoidingLayoutData) -> Unit, modifier: Modifier = Modifier ) { @@ -53,23 +54,11 @@ fun TimelineItemEncryptedView( @PreviewsDayNight @Composable -internal fun TimelineItemEncryptedViewPreview() = ElementPreview { - Column { - TimelineItemEncryptedView( - content = TimelineItemEncryptedContent( - data = UnableToDecryptContent.Data.Unknown - ), - onContentLayoutChanged = {}, - ) - - TimelineItemEncryptedView( - content = TimelineItemEncryptedContent( - data = UnableToDecryptContent.Data.MegolmV1AesSha2( - sessionId = "sessionId", - utdCause = UtdCause.Membership - ) - ), - onContentLayoutChanged = {}, - ) - } +internal fun TimelineItemEncryptedViewPreview( + @PreviewParameter(TimelineItemEncryptedContentProvider::class) content: TimelineItemEncryptedContent +) = ElementPreview { + TimelineItemEncryptedView( + content = content, + onContentLayoutChanged = {}, + ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt new file mode 100644 index 0000000000..fafc65ac1b --- /dev/null +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 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 io.element.android.features.messages.impl.timeline.model.event + +import androidx.compose.ui.tooling.preview.PreviewParameterProvider +import io.element.android.libraries.matrix.api.timeline.item.event.UnableToDecryptContent +import io.element.android.libraries.matrix.api.timeline.item.event.UtdCause + +open class TimelineItemEncryptedContentProvider : PreviewParameterProvider { + override val values: Sequence + get() = sequenceOf( + aTimelineItemEncryptedContent(), + aTimelineItemEncryptedContent( + data = UnableToDecryptContent.Data.MegolmV1AesSha2( + sessionId = "sessionId", + utdCause = UtdCause.Membership + ) + ), + ) +} + +private fun aTimelineItemEncryptedContent( + data: UnableToDecryptContent.Data = UnableToDecryptContent.Data.Unknown +) = TimelineItemEncryptedContent( + data = data +) From 8a532769e3dee06acd0fc2751c5e9016af4fa181 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 25 Apr 2024 17:33:01 +0200 Subject: [PATCH 03/10] Compact code. --- .../components/event/TimelineItemEncryptedView.kt | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt index cb314c23a6..e6ea67359e 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt @@ -36,15 +36,14 @@ fun TimelineItemEncryptedView( onContentLayoutChanged: (ContentAvoidingLayoutData) -> Unit, modifier: Modifier = Modifier ) { - var text = stringResource(id = CommonStrings.common_waiting_for_decryption_key) - var iconId = CompoundDrawables.ic_compound_time - if (content.data is UnableToDecryptContent.Data.MegolmV1AesSha2 && + val (textId, iconId) = if (content.data is UnableToDecryptContent.Data.MegolmV1AesSha2 && content.data.utdCause == UtdCause.Membership) { - text = stringResource(id = CommonStrings.common_unable_to_decrypt_no_access) - iconId = CompoundDrawables.ic_compound_block + (CommonStrings.common_unable_to_decrypt_no_access to CompoundDrawables.ic_compound_block) + } else { + (CommonStrings.common_waiting_for_decryption_key to CompoundDrawables.ic_compound_time) } TimelineItemInformativeView( - text = text, + text = stringResource(id = textId), iconDescription = stringResource(id = CommonStrings.dialog_title_warning), iconResourceId = iconId, onContentLayoutChanged = onContentLayoutChanged, From f65025f841251d0a9e7eade37783a97a39131dd7 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Thu, 25 Apr 2024 17:40:18 +0200 Subject: [PATCH 04/10] Clearer code. --- .../timeline/components/event/TimelineItemEncryptedView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt index e6ea67359e..57cf3e0ecc 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt @@ -36,8 +36,8 @@ fun TimelineItemEncryptedView( onContentLayoutChanged: (ContentAvoidingLayoutData) -> Unit, modifier: Modifier = Modifier ) { - val (textId, iconId) = if (content.data is UnableToDecryptContent.Data.MegolmV1AesSha2 && - content.data.utdCause == UtdCause.Membership) { + val isMembershipUtd = (content.data as? UnableToDecryptContent.Data.MegolmV1AesSha2)?.utdCause == UtdCause.Membership + val (textId, iconId) = if (isMembershipUtd) { (CommonStrings.common_unable_to_decrypt_no_access to CompoundDrawables.ic_compound_block) } else { (CommonStrings.common_waiting_for_decryption_key to CompoundDrawables.ic_compound_time) From 7d2e3d586f267e818648b427c8da600615a60d58 Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 30 Apr 2024 09:30:05 +0200 Subject: [PATCH 05/10] test for utd cause --- .../matrix/impl/analytics/UtdTrackerTest.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTrackerTest.kt b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTrackerTest.kt index f43142900b..a05a425609 100644 --- a/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTrackerTest.kt +++ b/libraries/matrix/impl/src/test/kotlin/io/element/android/libraries/matrix/impl/analytics/UtdTrackerTest.kt @@ -74,4 +74,29 @@ class UtdTrackerTest { assertThat(fakeAnalyticsService.screenEvents).isEmpty() assertThat(fakeAnalyticsService.trackedErrors).isEmpty() } + + @Test + fun `when onUtd is called with membership cause, the expected analytics Event is sent`() { + val fakeAnalyticsService = FakeAnalyticsService() + val sut = UtdTracker(fakeAnalyticsService) + sut.onUtd( + UnableToDecryptInfo( + eventId = AN_EVENT_ID.value, + timeToDecryptMs = 123.toULong(), + cause = UtdCause.MEMBERSHIP, + ) + ) + assertThat(fakeAnalyticsService.capturedEvents).containsExactly( + Error( + context = null, + cryptoModule = Error.CryptoModule.Rust, + cryptoSDK = Error.CryptoSDK.Rust, + timeToDecryptMillis = 123, + domain = Error.Domain.E2EE, + name = Error.Name.ExpectedDueToMembership + ) + ) + assertThat(fakeAnalyticsService.screenEvents).isEmpty() + assertThat(fakeAnalyticsService.trackedErrors).isEmpty() + } } From 937f440df7cab8c8480404ef1d6babe3ccd3ce0b Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 30 Apr 2024 09:34:02 +0200 Subject: [PATCH 06/10] Update changelog --- changelog.d/2754.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/2754.feature diff --git a/changelog.d/2754.feature b/changelog.d/2754.feature new file mode 100644 index 0000000000..85880c7adc --- /dev/null +++ b/changelog.d/2754.feature @@ -0,0 +1 @@ +Add support for expected decryption errors due to membership (UX and analytics). From 80497a8b30abde15a2a74e03a428d773ef508c01 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 30 Apr 2024 09:47:20 +0200 Subject: [PATCH 07/10] Remove unnecessary parenthesis --- .../timeline/components/event/TimelineItemEncryptedView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt index 57cf3e0ecc..b0753be9b1 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/event/TimelineItemEncryptedView.kt @@ -38,9 +38,9 @@ fun TimelineItemEncryptedView( ) { val isMembershipUtd = (content.data as? UnableToDecryptContent.Data.MegolmV1AesSha2)?.utdCause == UtdCause.Membership val (textId, iconId) = if (isMembershipUtd) { - (CommonStrings.common_unable_to_decrypt_no_access to CompoundDrawables.ic_compound_block) + CommonStrings.common_unable_to_decrypt_no_access to CompoundDrawables.ic_compound_block } else { - (CommonStrings.common_waiting_for_decryption_key to CompoundDrawables.ic_compound_time) + CommonStrings.common_waiting_for_decryption_key to CompoundDrawables.ic_compound_time } TimelineItemInformativeView( text = stringResource(id = textId), From 207c4929aa366dca99dc855c23cc7ca4387ce83f Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 30 Apr 2024 09:50:21 +0200 Subject: [PATCH 08/10] Cleanup --- gradle/libs.versions.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 090a65d9f4..86f3144395 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -177,7 +177,6 @@ kotlinpoet = "com.squareup:kotlinpoet:1.16.0" # Analytics posthog = "com.posthog:posthog-android:3.1.18" sentry = "io.sentry:sentry-android:7.8.0" -# Note: only 0.19.0 will compile properly # main branch can be tested replacing the version with main-SNAPSHOT matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.20.0" From 2c85d86c7a0f655a8a370979109648b713783cca Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 30 Apr 2024 09:51:29 +0200 Subject: [PATCH 09/10] Add missing preview case. --- .../model/event/TimelineItemEncryptedContentProvider.kt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt index fafc65ac1b..5c2b059ba5 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/model/event/TimelineItemEncryptedContentProvider.kt @@ -27,7 +27,13 @@ open class TimelineItemEncryptedContentProvider : PreviewParameterProvider Date: Tue, 30 Apr 2024 08:01:47 +0000 Subject: [PATCH 10/10] Update screenshots --- ...lineItemEncryptedView-Day-36_36_null_0,NEXUS_5,1.0,en].png} | 0 ...elineItemEncryptedView-Day-36_36_null_1,NEXUS_5,1.0,en].png | 3 +++ ...elineItemEncryptedView-Day-36_36_null_2,NEXUS_5,1.0,en].png | 3 +++ ...neItemEncryptedView-Night-36_37_null_0,NEXUS_5,1.0,en].png} | 0 ...ineItemEncryptedView-Night-36_37_null_1,NEXUS_5,1.0,en].png | 3 +++ ...ineItemEncryptedView-Night-36_37_null_2,NEXUS_5,1.0,en].png | 3 +++ 6 files changed, 12 insertions(+) rename tests/uitests/src/test/snapshots/images/{ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null,NEXUS_5,1.0,en].png => ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_0,NEXUS_5,1.0,en].png} (100%) create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_1,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_2,NEXUS_5,1.0,en].png rename tests/uitests/src/test/snapshots/images/{ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null,NEXUS_5,1.0,en].png => ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_0,NEXUS_5,1.0,en].png} (100%) create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_1,NEXUS_5,1.0,en].png create mode 100644 tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_2,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_1,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..f77a0b4ca9 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_1,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42816394d24d8bad66d38b97b1ffdb180b4c44ae205397d817a828e72649163b +size 11761 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_2,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..8aad553288 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Day-36_36_null_2,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b5fe193d680293c89c5faad9e74e4f887d1202f2f58ba9e145529c9d3a21fab +size 10022 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_0,NEXUS_5,1.0,en].png similarity index 100% rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null,NEXUS_5,1.0,en].png rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_0,NEXUS_5,1.0,en].png diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_1,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..e4e6bacc09 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_1,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4364b6c6fe2d308ba89492d8444138fd85c63e378fb538351dd56237cd846a7e +size 11616 diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_2,NEXUS_5,1.0,en].png new file mode 100644 index 0000000000..ed6fe4f171 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.messages.impl.timeline.components.event_TimelineItemEncryptedView_null_TimelineItemEncryptedView-Night-36_37_null_2,NEXUS_5,1.0,en].png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80ee405fc93dfc1074e840a078b71d270058e75d7913ceeefe7883698ff8134c +size 9869