From e492f0638667f1f1a4af573fef442e161dbbc77a Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 17 Jul 2026 22:09:01 +0200 Subject: [PATCH 01/24] Migrate libraries/recentemojis into libraries/emoji --- .../io/element/android/x/di/AppModule.kt | 10 ++----- features/messages/impl/build.gradle.kts | 5 ++-- .../messages/impl/MessagesPresenter.kt | 2 +- .../impl/actionlist/ActionListPresenter.kt | 2 +- .../customreaction/CustomReactionPresenter.kt | 4 +-- .../messages/impl/MessagesPresenterTest.kt | 2 +- .../actionlist/ActionListPresenterTest.kt | 2 +- .../CustomReactionPresenterTest.kt | 2 +- .../api/build.gradle.kts | 7 ++--- .../libraries/emoji}/api/EmojibaseProvider.kt | 2 +- .../emoji/api/recentemojis}/AddRecentEmoji.kt | 2 +- .../api/recentemojis}/GetRecentEmojis.kt | 2 +- .../impl/build.gradle.kts | 28 +++++++++++-------- .../emoji}/impl/DefaultEmojibaseProvider.kt | 12 ++++++-- .../recentemojis}/DefaultAddRecentEmoji.kt | 4 +-- .../recentemojis}/DefaultGetRecentEmojis.kt | 6 ++-- .../DefaultGetRecentEmojisTest.kt | 4 +-- .../test/build.gradle.kts | 9 +++--- .../emoji}/test/FakeEmojibaseProvider.kt | 4 +-- .../kotlin/extension/DependencyHandleScope.kt | 2 +- 20 files changed, 57 insertions(+), 54 deletions(-) rename libraries/{recentemojis => emoji}/api/build.gradle.kts (69%) rename libraries/{recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis => emoji/api/src/main/kotlin/io/element/android/libraries/emoji}/api/EmojibaseProvider.kt (87%) rename libraries/{recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api => emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis}/AddRecentEmoji.kt (84%) rename libraries/{recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api => emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis}/GetRecentEmojis.kt (88%) rename libraries/{recentemojis => emoji}/impl/build.gradle.kts (51%) rename libraries/{recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis => emoji/impl/src/main/kotlin/io/element/android/libraries/emoji}/impl/DefaultEmojibaseProvider.kt (52%) rename libraries/{recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl => emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis}/DefaultAddRecentEmoji.kt (86%) rename libraries/{recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl => emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis}/DefaultGetRecentEmojis.kt (87%) rename libraries/{recentemojis/impl/src/test/kotlin/io/element/android/libraries/recentemojis/impl => emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis}/DefaultGetRecentEmojisTest.kt (95%) rename libraries/{recentemojis => emoji}/test/build.gradle.kts (70%) rename libraries/{recentemojis/test/src/main/kotlin/io/element/android/libraries/recentemojis => emoji/test/src/main/kotlin/io/element/android/libraries/emoji}/test/FakeEmojibaseProvider.kt (85%) diff --git a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt index 87d0ece7a1..80d68bd17d 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt @@ -28,8 +28,8 @@ import io.element.android.libraries.di.BaseDirectory import io.element.android.libraries.di.CacheDirectory import io.element.android.libraries.di.annotations.AppCoroutineScope import io.element.android.libraries.di.annotations.ApplicationContext -import io.element.android.libraries.recentemojis.api.EmojibaseProvider -import io.element.android.libraries.recentemojis.impl.DefaultEmojibaseProvider +import io.element.android.libraries.emoji.api.EmojibaseProvider +import io.element.android.libraries.emoji.impl.DefaultEmojibaseProvider import io.element.android.x.BuildConfig import io.element.android.x.R import kotlinx.coroutines.CoroutineName @@ -115,10 +115,4 @@ object AppModule { fun provideSnackbarDispatcher(): SnackbarDispatcher { return SnackbarDispatcher() } - - @Provides - @SingleIn(AppScope::class) - fun providesEmojibaseProvider(@ApplicationContext context: Context): EmojibaseProvider { - return DefaultEmojibaseProvider(context) - } } diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index 116a3a7c41..b40aebab39 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -51,7 +51,7 @@ dependencies { implementation(projects.libraries.mediaupload.api) implementation(projects.libraries.permissions.api) implementation(projects.libraries.preferences.api) - implementation(projects.libraries.recentemojis.api) + implementation(projects.libraries.emoji.api) implementation(projects.libraries.roomselect.api) implementation(projects.libraries.slashcommands.api) implementation(projects.libraries.audio.api) @@ -106,6 +106,7 @@ dependencies { testImplementation(projects.libraries.testtags) testImplementation(projects.features.poll.test) testImplementation(projects.libraries.eventformatter.test) - testImplementation(projects.libraries.recentemojis.test) + testImplementation(projects.libraries.emoji.impl) + testImplementation(projects.libraries.emoji.test) testImplementation(projects.libraries.slashcommands.test) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 1109b2c70d..17127ff6ec 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -69,6 +69,7 @@ import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatch import io.element.android.libraries.designsystem.utils.snackbar.SnackbarMessage import io.element.android.libraries.designsystem.utils.snackbar.collectSnackbarMessageAsState import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.emoji.api.recentemojis.AddRecentEmoji import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.toThreadId @@ -85,7 +86,6 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransa import io.element.android.libraries.matrix.ui.messages.reply.map import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.room.getDirectRoomMember -import io.element.android.libraries.recentemojis.api.AddRecentEmoji import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.ui.strings.CommonStrings import io.element.android.services.analytics.api.AnalyticsService diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt index f17a841c52..8caa95f31d 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenter.kt @@ -44,13 +44,13 @@ import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.dateformatter.api.DateFormatter import io.element.android.libraries.dateformatter.api.DateFormatterMode import io.element.android.libraries.di.RoomScope +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis import io.element.android.libraries.featureflag.api.FeatureFlagService import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.room.BaseRoom import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.preferences.api.store.AppPreferencesStore -import io.element.android.libraries.recentemojis.api.GetRecentEmojis import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt index a1ebb66ea7..1fddf4e3bb 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt @@ -18,8 +18,8 @@ import androidx.compose.runtime.setValue import dev.zacsweers.metro.Inject import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.recentemojis.api.EmojibaseProvider -import io.element.android.libraries.recentemojis.api.GetRecentEmojis +import io.element.android.libraries.emoji.api.EmojibaseProvider +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableSet diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt index 65aa1d857e..0a0d310b16 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesPresenterTest.kt @@ -52,6 +52,7 @@ import io.element.android.libraries.core.mimetype.MimeTypes import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.designsystem.utils.snackbar.SnackbarDispatcher +import io.element.android.libraries.emoji.api.recentemojis.AddRecentEmoji import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.core.EventId @@ -94,7 +95,6 @@ import io.element.android.libraries.matrix.test.room.threads.FakeThreadsListServ import io.element.android.libraries.matrix.test.timeline.FakeTimeline import io.element.android.libraries.matrix.test.timeline.aTimelineItemDebugInfo import io.element.android.libraries.matrix.ui.messages.reply.InReplyToDetails -import io.element.android.libraries.recentemojis.api.AddRecentEmoji import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.TextEditorState import io.element.android.libraries.textcomposer.model.aTextEditorStateMarkdown diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt index 20b636081a..fb597df290 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/actionlist/ActionListPresenterTest.kt @@ -27,6 +27,7 @@ import io.element.android.features.messages.impl.timeline.model.event.aTimelineI import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemVoiceContent import io.element.android.features.poll.api.pollcontent.aPollAnswerItemList import io.element.android.libraries.dateformatter.test.FakeDateFormatter +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.featureflag.test.FakeFeatureFlagService import io.element.android.libraries.matrix.api.notification.CallIntent @@ -42,7 +43,6 @@ import io.element.android.libraries.matrix.test.A_USER_ID import io.element.android.libraries.matrix.test.room.FakeBaseRoom import io.element.android.libraries.matrix.test.room.aRoomInfo import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore -import io.element.android.libraries.recentemojis.api.GetRecentEmojis import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.test import kotlinx.collections.immutable.persistentListOf diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt index e3317b3d42..d0765bd5e7 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt @@ -11,8 +11,8 @@ package io.element.android.features.messages.impl.timeline.components.customreac import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.aTimelineItemReactions +import io.element.android.libraries.emoji.test.FakeEmojibaseProvider import io.element.android.libraries.matrix.test.AN_EVENT_ID -import io.element.android.libraries.recentemojis.test.FakeEmojibaseProvider import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.test import kotlinx.collections.immutable.persistentListOf diff --git a/libraries/recentemojis/api/build.gradle.kts b/libraries/emoji/api/build.gradle.kts similarity index 69% rename from libraries/recentemojis/api/build.gradle.kts rename to libraries/emoji/api/build.gradle.kts index 2fc74c03c7..749e13a4c7 100644 --- a/libraries/recentemojis/api/build.gradle.kts +++ b/libraries/emoji/api/build.gradle.kts @@ -1,17 +1,16 @@ /* - * Copyright (c) 2025 Element Creations Ltd. - * Copyright 2025 New Vector Ltd. + * Copyright (c) 2026 Element Creations Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. * Please see LICENSE files in the repository root for full details. */ plugins { - id("io.element.android-library") + id("io.element.android-compose-library") } android { - namespace = "io.element.android.libraries.recentemojis.api" + namespace = "io.element.android.libraries.emoji.api" } dependencies { diff --git a/libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/EmojibaseProvider.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/EmojibaseProvider.kt similarity index 87% rename from libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/EmojibaseProvider.kt rename to libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/EmojibaseProvider.kt index 9d6e41eb55..d8f9c92777 100644 --- a/libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/EmojibaseProvider.kt +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/EmojibaseProvider.kt @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.api +package io.element.android.libraries.emoji.api import io.element.android.emojibasebindings.EmojibaseStore diff --git a/libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/AddRecentEmoji.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/AddRecentEmoji.kt similarity index 84% rename from libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/AddRecentEmoji.kt rename to libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/AddRecentEmoji.kt index 5b50823f77..5865568511 100644 --- a/libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/AddRecentEmoji.kt +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/AddRecentEmoji.kt @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.api +package io.element.android.libraries.emoji.api.recentemojis fun interface AddRecentEmoji { suspend operator fun invoke(emoji: String): Result diff --git a/libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/GetRecentEmojis.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/GetRecentEmojis.kt similarity index 88% rename from libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/GetRecentEmojis.kt rename to libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/GetRecentEmojis.kt index 6517512f44..9a9983805e 100644 --- a/libraries/recentemojis/api/src/main/kotlin/io/element/android/libraries/recentemojis/api/GetRecentEmojis.kt +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/GetRecentEmojis.kt @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.api +package io.element.android.libraries.emoji.api.recentemojis import kotlinx.collections.immutable.ImmutableList diff --git a/libraries/recentemojis/impl/build.gradle.kts b/libraries/emoji/impl/build.gradle.kts similarity index 51% rename from libraries/recentemojis/impl/build.gradle.kts rename to libraries/emoji/impl/build.gradle.kts index 061a7ecd89..871c19a41a 100644 --- a/libraries/recentemojis/impl/build.gradle.kts +++ b/libraries/emoji/impl/build.gradle.kts @@ -1,37 +1,41 @@ /* - * Copyright (c) 2025 Element Creations Ltd. - * Copyright 2025 New Vector Ltd. + * Copyright (c) 2026 Element Creations Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. * Please see LICENSE files in the repository root for full details. */ import extension.setupDependencyInjection +import extension.testCommonDependencies plugins { id("io.element.android-compose-library") - id("kotlin-parcelize") } android { - namespace = "io.element.android.libraries.recentemojis.impl" + namespace = "io.element.android.libraries.emoji.impl" + testOptions { + unitTests { + isIncludeAndroidResources = true + } + } } setupDependencyInjection() dependencies { - api(projects.libraries.recentemojis.api) + api(projects.libraries.emoji.api) implementation(projects.libraries.architecture) + implementation(projects.libraries.core) + implementation(projects.libraries.designsystem) + implementation(projects.libraries.di) implementation(projects.libraries.matrix.api) + implementation(projects.libraries.uiStrings) + implementation(libs.kotlinx.collections.immutable) implementation(libs.matrix.emojibase.bindings) - testImplementation(projects.libraries.recentemojis.test) - testImplementation(libs.test.junit) - testImplementation(libs.coroutines.test) - testImplementation(libs.molecule.runtime) - testImplementation(libs.test.truth) - testImplementation(libs.test.turbine) + testImplementation(projects.libraries.emoji.test) testImplementation(projects.libraries.matrix.test) - testImplementation(projects.tests.testutils) + testCommonDependencies(libs) } diff --git a/libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultEmojibaseProvider.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/DefaultEmojibaseProvider.kt similarity index 52% rename from libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultEmojibaseProvider.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/DefaultEmojibaseProvider.kt index 161dd0cc56..f0ad797648 100644 --- a/libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultEmojibaseProvider.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/DefaultEmojibaseProvider.kt @@ -6,14 +6,20 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.impl +package io.element.android.libraries.emoji.impl import android.content.Context +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.SingleIn import io.element.android.emojibasebindings.EmojibaseDatasource import io.element.android.emojibasebindings.EmojibaseStore -import io.element.android.libraries.recentemojis.api.EmojibaseProvider +import io.element.android.libraries.di.annotations.ApplicationContext +import io.element.android.libraries.emoji.api.EmojibaseProvider -class DefaultEmojibaseProvider(val context: Context) : EmojibaseProvider { +@SingleIn(AppScope::class) +@ContributesBinding(AppScope::class) +class DefaultEmojibaseProvider(@ApplicationContext val context: Context) : EmojibaseProvider { override val emojibaseStore: EmojibaseStore by lazy { EmojibaseDatasource().load(context) } diff --git a/libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultAddRecentEmoji.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultAddRecentEmoji.kt similarity index 86% rename from libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultAddRecentEmoji.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultAddRecentEmoji.kt index 4444d7e01a..cc9da75fd8 100644 --- a/libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultAddRecentEmoji.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultAddRecentEmoji.kt @@ -6,13 +6,13 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.impl +package io.element.android.libraries.emoji.impl.recentemojis import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.emoji.api.recentemojis.AddRecentEmoji import io.element.android.libraries.matrix.api.MatrixClient -import io.element.android.libraries.recentemojis.api.AddRecentEmoji import kotlinx.coroutines.withContext @ContributesBinding(SessionScope::class) diff --git a/libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojis.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojis.kt similarity index 87% rename from libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojis.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojis.kt index 9c5ed178dd..acd5e012ce 100644 --- a/libraries/recentemojis/impl/src/main/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojis.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojis.kt @@ -6,14 +6,14 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.impl +package io.element.android.libraries.emoji.impl.recentemojis import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.emoji.api.EmojibaseProvider +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis import io.element.android.libraries.matrix.api.MatrixClient -import io.element.android.libraries.recentemojis.api.EmojibaseProvider -import io.element.android.libraries.recentemojis.api.GetRecentEmojis import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.withContext diff --git a/libraries/recentemojis/impl/src/test/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojisTest.kt b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojisTest.kt similarity index 95% rename from libraries/recentemojis/impl/src/test/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojisTest.kt rename to libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojisTest.kt index 722aaee234..2ae8a86c25 100644 --- a/libraries/recentemojis/impl/src/test/kotlin/io/element/android/libraries/recentemojis/impl/DefaultGetRecentEmojisTest.kt +++ b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojisTest.kt @@ -6,14 +6,14 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.impl +package io.element.android.libraries.emoji.impl.recentemojis import com.google.common.truth.Truth.assertThat import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.EmojibaseCategory import io.element.android.emojibasebindings.EmojibaseCategory.People +import io.element.android.libraries.emoji.test.FakeEmojibaseProvider import io.element.android.libraries.matrix.test.FakeMatrixClient -import io.element.android.libraries.recentemojis.test.FakeEmojibaseProvider import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableMap diff --git a/libraries/recentemojis/test/build.gradle.kts b/libraries/emoji/test/build.gradle.kts similarity index 70% rename from libraries/recentemojis/test/build.gradle.kts rename to libraries/emoji/test/build.gradle.kts index 7c32d162ee..42192c8061 100644 --- a/libraries/recentemojis/test/build.gradle.kts +++ b/libraries/emoji/test/build.gradle.kts @@ -1,6 +1,5 @@ /* - * Copyright (c) 2025 Element Creations Ltd. - * Copyright 2023-2025 New Vector Ltd. + * Copyright (c) 2026 Element Creations Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. * Please see LICENSE files in the repository root for full details. @@ -11,16 +10,16 @@ plugins { } android { - namespace = "io.element.android.libraries.recentemojis.test" + namespace = "io.element.android.libraries.emoji.test" } dependencies { + api(projects.libraries.emoji.api) api(projects.libraries.matrix.api) api(libs.coroutines.core) implementation(libs.kotlinx.collections.immutable) implementation(libs.coroutines.test) - implementation(projects.tests.testutils) - implementation(projects.libraries.recentemojis.api) implementation(libs.matrix.emojibase.bindings) + implementation(projects.tests.testutils) } diff --git a/libraries/recentemojis/test/src/main/kotlin/io/element/android/libraries/recentemojis/test/FakeEmojibaseProvider.kt b/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojibaseProvider.kt similarity index 85% rename from libraries/recentemojis/test/src/main/kotlin/io/element/android/libraries/recentemojis/test/FakeEmojibaseProvider.kt rename to libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojibaseProvider.kt index 4774144707..0e7c42e538 100644 --- a/libraries/recentemojis/test/src/main/kotlin/io/element/android/libraries/recentemojis/test/FakeEmojibaseProvider.kt +++ b/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojibaseProvider.kt @@ -6,12 +6,12 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.recentemojis.test +package io.element.android.libraries.emoji.test import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.EmojibaseCategory import io.element.android.emojibasebindings.EmojibaseStore -import io.element.android.libraries.recentemojis.api.EmojibaseProvider +import io.element.android.libraries.emoji.api.EmojibaseProvider import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toPersistentMap diff --git a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt index 3e01ffc25f..babd9f27ff 100644 --- a/plugins/src/main/kotlin/extension/DependencyHandleScope.kt +++ b/plugins/src/main/kotlin/extension/DependencyHandleScope.kt @@ -123,7 +123,7 @@ fun DependencyHandlerScope.allLibrariesImpl() { implementation(project(":libraries:wellknown:impl")) implementation(project(":libraries:oauth:impl")) implementation(project(":libraries:workmanager:impl")) - implementation(project(":libraries:recentemojis:impl")) + implementation(project(":libraries:emoji:impl")) } fun DependencyHandlerScope.allServicesImpl() { From 5d8290b24001cbd83e4e17b8b295ba3cca51003d Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 17 Jul 2026 22:11:23 +0200 Subject: [PATCH 02/24] Extract EmojiPicker into libraries/emoji with Renderer/Presenter pattern --- .../io/element/android/x/di/AppModule.kt | 2 - features/messages/impl/build.gradle.kts | 1 - .../features/messages/impl/MessagesNode.kt | 12 ++ .../messages/impl/MessagesStateProvider.kt | 3 - .../features/messages/impl/MessagesView.kt | 11 +- .../MessagesViewWithIdentityChangePreview.kt | 1 + .../impl/threads/ThreadedMessagesNode.kt | 1 + .../CustomReactionBottomSheet.kt | 69 +++++---- .../customreaction/CustomReactionPresenter.kt | 67 ++++----- .../customreaction/CustomReactionState.kt | 6 +- .../picker/EmojiPickerPresenter.kt | 114 --------------- .../src/main/res/values-be/translations.xml | 8 -- .../src/main/res/values-bg/translations.xml | 8 -- .../src/main/res/values-ca/translations.xml | 9 -- .../src/main/res/values-cs/translations.xml | 9 -- .../src/main/res/values-cy/translations.xml | 9 -- .../src/main/res/values-da/translations.xml | 9 -- .../src/main/res/values-de/translations.xml | 9 -- .../src/main/res/values-el/translations.xml | 9 -- .../src/main/res/values-es/translations.xml | 8 -- .../src/main/res/values-et/translations.xml | 9 -- .../src/main/res/values-eu/translations.xml | 8 -- .../src/main/res/values-fa/translations.xml | 9 -- .../src/main/res/values-fi/translations.xml | 9 -- .../src/main/res/values-fr/translations.xml | 9 -- .../src/main/res/values-hr/translations.xml | 9 -- .../src/main/res/values-hu/translations.xml | 9 -- .../src/main/res/values-in/translations.xml | 9 -- .../src/main/res/values-it/translations.xml | 9 -- .../src/main/res/values-ja/translations.xml | 9 -- .../src/main/res/values-ka/translations.xml | 8 -- .../src/main/res/values-ko/translations.xml | 9 -- .../src/main/res/values-lt/translations.xml | 8 -- .../src/main/res/values-nb/translations.xml | 9 -- .../src/main/res/values-nl/translations.xml | 8 -- .../src/main/res/values-pl/translations.xml | 9 -- .../main/res/values-pt-rBR/translations.xml | 9 -- .../src/main/res/values-pt/translations.xml | 9 -- .../src/main/res/values-ro/translations.xml | 9 -- .../src/main/res/values-ru/translations.xml | 9 -- .../src/main/res/values-sk/translations.xml | 9 -- .../src/main/res/values-sv/translations.xml | 8 -- .../src/main/res/values-tr/translations.xml | 8 -- .../src/main/res/values-uk/translations.xml | 9 -- .../src/main/res/values-ur/translations.xml | 8 -- .../src/main/res/values-uz/translations.xml | 9 -- .../src/main/res/values-vi/translations.xml | 9 -- .../main/res/values-zh-rTW/translations.xml | 9 -- .../src/main/res/values-zh/translations.xml | 9 -- .../impl/src/main/res/values/localazy.xml | 9 -- .../messages/impl/MessagesViewTest.kt | 41 ++++-- .../CustomReactionPresenterTest.kt | 6 +- .../picker/EmojiPickerPresenterTest.kt | 125 ---------------- .../emoji/api/picker/EmojiPickerPresenter.kt | 12 ++ .../emoji/api/picker/EmojiPickerRenderer.kt | 33 +++++ .../emoji/api/picker/EmojiPickerState.kt | 20 +++ libraries/emoji/impl/build.gradle.kts | 1 - .../emoji/impl/DefaultEmojibaseProvider.kt | 18 ++- .../emoji/impl}/EmojibaseProvider.kt | 7 +- .../picker/DefaultEmojiPickerPresenter.kt | 133 ++++++++++++++++++ .../impl/picker/DefaultEmojiPickerRenderer.kt | 43 ++++++ .../impl/picker/DefaultEmojiPickerState.kt | 16 +-- .../picker/DefaultEmojiPickerStateProvider.kt | 56 ++++---- .../libraries/emoji/impl/picker}/EmojiItem.kt | 28 +--- .../emoji/impl}/picker/EmojiPickerEvent.kt | 4 +- .../emoji/impl/picker/EmojiPickerView.kt | 18 ++- .../emoji/impl/picker}/EmojibaseExtensions.kt | 8 +- .../emoji/impl}/picker/SkinTonePicker.kt | 10 +- .../recentemojis/DefaultGetRecentEmojis.kt | 4 +- .../impl/src/main/res/values/temporary.xml | 13 ++ .../impl/fixtures}/FakeEmojibaseProvider.kt | 12 +- .../impl/picker/EmojiPickerPresenterTest.kt | 112 +++++++++++++++ .../DefaultGetRecentEmojisTest.kt | 2 +- libraries/emoji/test/build.gradle.kts | 25 ---- 74 files changed, 571 insertions(+), 804 deletions(-) delete mode 100644 features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenter.kt delete mode 100644 features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenterTest.kt create mode 100644 libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt create mode 100644 libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerRenderer.kt create mode 100644 libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerState.kt rename libraries/emoji/{api/src/main/kotlin/io/element/android/libraries/emoji/api => impl/src/main/kotlin/io/element/android/libraries/emoji/impl}/EmojibaseProvider.kt (60%) create mode 100644 libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt create mode 100644 libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerRenderer.kt rename features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerState.kt => libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerState.kt (72%) rename features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerStateProvider.kt => libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerStateProvider.kt (58%) rename {features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction => libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker}/EmojiItem.kt (86%) rename {features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction => libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl}/picker/EmojiPickerEvent.kt (71%) rename features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPicker.kt => libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt (91%) rename {features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction => libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker}/EmojibaseExtensions.kt (91%) rename {features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction => libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl}/picker/SkinTonePicker.kt (95%) create mode 100644 libraries/emoji/impl/src/main/res/values/temporary.xml rename libraries/emoji/{test/src/main/kotlin/io/element/android/libraries/emoji/test => impl/src/test/kotlin/io/element/android/libraries/emoji/impl/fixtures}/FakeEmojibaseProvider.kt (60%) create mode 100644 libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerPresenterTest.kt delete mode 100644 libraries/emoji/test/build.gradle.kts diff --git a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt index 80d68bd17d..7564db5d95 100644 --- a/app/src/main/kotlin/io/element/android/x/di/AppModule.kt +++ b/app/src/main/kotlin/io/element/android/x/di/AppModule.kt @@ -28,8 +28,6 @@ import io.element.android.libraries.di.BaseDirectory import io.element.android.libraries.di.CacheDirectory import io.element.android.libraries.di.annotations.AppCoroutineScope import io.element.android.libraries.di.annotations.ApplicationContext -import io.element.android.libraries.emoji.api.EmojibaseProvider -import io.element.android.libraries.emoji.impl.DefaultEmojibaseProvider import io.element.android.x.BuildConfig import io.element.android.x.R import kotlinx.coroutines.CoroutineName diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index b40aebab39..d442e1bb95 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -107,6 +107,5 @@ dependencies { testImplementation(projects.features.poll.test) testImplementation(projects.libraries.eventformatter.test) testImplementation(projects.libraries.emoji.impl) - testImplementation(projects.libraries.emoji.test) testImplementation(projects.libraries.slashcommands.test) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt index 18c02d8f40..d4fce982e8 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesNode.kt @@ -38,6 +38,7 @@ import io.element.android.features.messages.impl.messagecomposer.MessageComposer import io.element.android.features.messages.impl.timeline.TimelineController import io.element.android.features.messages.impl.timeline.TimelineEvent import io.element.android.features.messages.impl.timeline.TimelinePresenter +import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionBottomSheet import io.element.android.features.messages.impl.timeline.di.LocalTimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.di.TimelineItemPresenterFactories import io.element.android.features.messages.impl.timeline.model.TimelineItem @@ -54,6 +55,7 @@ import io.element.android.libraries.designsystem.utils.OnLifecycleEvent import io.element.android.libraries.di.RoomScope import io.element.android.libraries.di.annotations.ApplicationContext import io.element.android.libraries.di.annotations.SessionCoroutineScope +import io.element.android.libraries.emoji.api.picker.EmojiPickerRenderer import io.element.android.libraries.matrix.api.analytics.toAnalyticsViewRoom import io.element.android.libraries.matrix.api.core.EventId import io.element.android.libraries.matrix.api.core.RoomId @@ -100,6 +102,7 @@ class MessagesNode( private val knockRequestsBannerRenderer: KnockRequestsBannerRenderer, private val roomMemberModerationRenderer: RoomMemberModerationRenderer, private val eventContentValidationCache: EventContentValidationCache, + private val emojiPickerRenderer: EmojiPickerRenderer, ) : Node(buildContext, plugins = plugins), MessagesNavigator { data class Inputs( val focusedEventId: EventId?, @@ -329,6 +332,15 @@ class MessagesNode( onViewRequestsClick = callback::navigateToKnockRequestsList, ) }, + customReactionBottomSheet = { + CustomReactionBottomSheet( + state = state.customReactionState, + onSelectEmoji = { uniqueId, emoji -> + state.eventSink(MessagesEvent.ToggleReaction(emoji.unicode, uniqueId)) + }, + emojiPickerRenderer = emojiPickerRenderer, + ) + }, onThreadsListClick = callback::navigateToThreadsList, ) roomMemberModerationRenderer.Render( diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt index 6389089e07..f47e76fbef 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesStateProvider.kt @@ -53,7 +53,6 @@ import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.textcomposer.model.MessageComposerMode import io.element.android.libraries.textcomposer.model.aTextEditorStateMarkdown import io.element.android.libraries.textcomposer.model.aTextEditorStateRich -import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentSetOf @@ -193,11 +192,9 @@ fun aReactionSummaryState( fun aCustomReactionState( target: CustomReactionState.Target = CustomReactionState.Target.None, - recentEmojis: ImmutableList = persistentListOf(), eventSink: (CustomReactionEvent) -> Unit = {}, ) = CustomReactionState( target = target, - recentEmojis = recentEmojis, selectedEmoji = persistentSetOf(), eventSink = eventSink, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt index ec014a4ff6..74d6c71aab 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt @@ -81,7 +81,6 @@ import io.element.android.features.messages.impl.timeline.aTimelineItemDaySepara import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.aTimelineState import io.element.android.features.messages.impl.timeline.components.CallMenuItem -import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionBottomSheet import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionEvent import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryEvent import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryView @@ -149,6 +148,7 @@ fun MessagesView( modifier: Modifier = Modifier, forceJumpToBottomVisibility: Boolean = false, knockRequestsBannerView: @Composable () -> Unit, + customReactionBottomSheet: @Composable () -> Unit, ) { val eventContentValidationState = LocalEventContentValidationState.current @@ -409,12 +409,7 @@ fun MessagesView( }, ) - CustomReactionBottomSheet( - state = state.customReactionState, - onSelectEmoji = { uniqueId, emoji -> - state.eventSink(MessagesEvent.ToggleReaction(emoji.unicode, uniqueId)) - } - ) + customReactionBottomSheet() ReactionSummaryView(state = state.reactionSummaryState) ReadReceiptBottomSheet( @@ -669,6 +664,7 @@ internal fun MessagesViewPreview(@PreviewParameter(MessagesStateProvider::class) onViewAllPinnedMessagesClick = { }, forceJumpToBottomVisibility = true, knockRequestsBannerView = {}, + customReactionBottomSheet = {}, onThreadsListClick = {}, ) } @@ -726,5 +722,6 @@ internal fun MessagesViewA11yPreview() = ElementPreview { onThreadsListClick = {}, forceJumpToBottomVisibility = true, knockRequestsBannerView = {}, + customReactionBottomSheet = {}, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt index d7dd95eb95..4e9bf9249a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/crypto/identity/MessagesViewWithIdentityChangePreview.kt @@ -43,6 +43,7 @@ internal fun MessagesViewWithIdentityChangePreview( onJoinCallClick = {}, onViewAllPinnedMessagesClick = {}, knockRequestsBannerView = {}, + customReactionBottomSheet = {}, onThreadsListClick = {}, ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt index c3e06b880b..b56268eb02 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/threads/ThreadedMessagesNode.kt @@ -322,6 +322,7 @@ class ThreadedMessagesNode( onViewAllPinnedMessagesClick = {}, modifier = modifier, knockRequestsBannerView = {}, + customReactionBottomSheet = {}, onThreadsListClick = {}, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt index 5b66a7a9ba..cc971e16ba 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt @@ -13,15 +13,13 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.SheetValue import androidx.compose.material3.rememberBottomSheetState import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import io.element.android.emojibasebindings.Emoji -import io.element.android.features.messages.impl.timeline.components.customreaction.picker.EmojiPicker -import io.element.android.features.messages.impl.timeline.components.customreaction.picker.EmojiPickerPresenter -import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.features.messages.impl.timeline.a11y.a11yReactionAction import io.element.android.libraries.designsystem.theme.components.ModalBottomSheet import io.element.android.libraries.designsystem.theme.components.hide +import io.element.android.libraries.emoji.api.picker.EmojiPickerRenderer import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId @OptIn(ExperimentalMaterial3Api::class) @@ -29,46 +27,45 @@ import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransa fun CustomReactionBottomSheet( state: CustomReactionState, onSelectEmoji: (EventOrTransactionId, Emoji) -> Unit, + emojiPickerRenderer: EmojiPickerRenderer, modifier: Modifier = Modifier, ) { - val sheetState = rememberBottomSheetState( - initialValue = SheetValue.Hidden, - ) + val sheetState = rememberBottomSheetState(initialValue = SheetValue.Hidden) val coroutineScope = rememberCoroutineScope() - val target = state.target as? CustomReactionState.Target.Success - fun onDismiss() { - state.eventSink(CustomReactionEvent.DismissCustomReactionSheet) - } + when (state.target) { + CustomReactionState.Target.None, + is CustomReactionState.Target.Loading -> Unit + is CustomReactionState.Target.Success -> { - fun onEmojiSelectedDismiss(emoji: Emoji) { - if (target?.event == null) return - sheetState.hide(coroutineScope) { - state.eventSink(CustomReactionEvent.DismissCustomReactionSheet) - onSelectEmoji(target.event.eventOrTransactionId, emoji) - } - } + fun onEmojiSelectedDismiss(emoji: Emoji) { + sheetState.hide(coroutineScope) { + state.eventSink(CustomReactionEvent.DismissCustomReactionSheet) + onSelectEmoji(state.target.event.eventOrTransactionId, emoji) + } + } - if (target?.emojibaseStore != null && target.event.eventId != null) { - ModalBottomSheet( - onDismissRequest = ::onDismiss, - sheetState = sheetState, - modifier = modifier, - scrollable = false, - ) { - val presenter = remember { - EmojiPickerPresenter( - emojibaseStore = target.emojibaseStore, - recentEmojis = state.recentEmojis, - coroutineDispatchers = CoroutineDispatchers.Default, + fun onDismiss() { + state.eventSink(CustomReactionEvent.DismissCustomReactionSheet) + } + + + ModalBottomSheet( + onDismissRequest = ::onDismiss, + sheetState = sheetState, + modifier = modifier, + scrollable = false, + ) { + emojiPickerRenderer.Render( + state = state.target.emojiPickerState, + onSelectEmoji = ::onEmojiSelectedDismiss, + selectedEmojis = state.selectedEmoji, + modifier = Modifier.fillMaxSize(), + contentDescription = { emoji, isSelected -> + a11yReactionAction(emoji = emoji.unicode, userAlreadyReacted = isSelected) + }, ) } - EmojiPicker( - onSelectEmoji = ::onEmojiSelectedDismiss, - state = presenter.present(), - selectedEmojis = state.selectedEmoji, - modifier = Modifier.fillMaxSize(), - ) } } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt index 1fddf4e3bb..7a9f5fe4ff 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt @@ -9,59 +9,50 @@ package io.element.android.features.messages.impl.timeline.components.customreaction import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import dev.zacsweers.metro.Inject import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.emoji.api.EmojibaseProvider -import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.persistentListOf +import io.element.android.libraries.emoji.api.picker.EmojiPickerPresenter import kotlinx.collections.immutable.toImmutableSet -import kotlinx.coroutines.launch @Inject class CustomReactionPresenter( - private val emojibaseProvider: EmojibaseProvider, - private val getRecentEmojis: GetRecentEmojis, + private val emojiPickerPresenter: EmojiPickerPresenter, ) : Presenter { @Composable override fun present(): CustomReactionState { - val localCoroutineScope = rememberCoroutineScope() - var recentEmojis by remember { mutableStateOf>(persistentListOf()) } - - val target: MutableState = remember { - mutableStateOf(CustomReactionState.Target.None) - } - - fun handleShowCustomReactionSheet(event: TimelineItem.Event) { - target.value = CustomReactionState.Target.Loading(event) - localCoroutineScope.launch { - recentEmojis = getRecentEmojis().getOrNull() ?: persistentListOf() - target.value = CustomReactionState.Target.Success( - event = event, - emojibaseStore = emojibaseProvider.emojibaseStore - ) - } - } - - fun handleDismissCustomReactionSheet() { - target.value = CustomReactionState.Target.None - } + var internalTarget by remember { mutableStateOf(InternalTarget.None) } + val emojiPickerState = emojiPickerPresenter.present() fun handleEvent(event: CustomReactionEvent) { when (event) { - is CustomReactionEvent.ShowCustomReactionSheet -> handleShowCustomReactionSheet(event.event) - is CustomReactionEvent.DismissCustomReactionSheet -> handleDismissCustomReactionSheet() + is CustomReactionEvent.ShowCustomReactionSheet -> { + internalTarget = InternalTarget.Showing(event.event) + } + is CustomReactionEvent.DismissCustomReactionSheet -> { + internalTarget = InternalTarget.None + } } } - val event = (target.value as? CustomReactionState.Target.Success)?.event - val selectedEmoji = event + + val computedTarget = when (val target = internalTarget) { + InternalTarget.None -> CustomReactionState.Target.None + is InternalTarget.Showing -> if (emojiPickerState.isReady) { + CustomReactionState.Target.Success( + event = target.event, + emojiPickerState = emojiPickerState, + ) + } else { + CustomReactionState.Target.Loading(target.event) + } + } + + val eventForSelection = (computedTarget as? CustomReactionState.Target.Success)?.event + val selectedEmoji = eventForSelection ?.reactionsState ?.reactions ?.mapNotNull { if (it.isHighlighted) it.key else null } @@ -69,10 +60,14 @@ class CustomReactionPresenter( .toImmutableSet() return CustomReactionState( - target = target.value, + target = computedTarget, selectedEmoji = selectedEmoji, - recentEmojis = recentEmojis, eventSink = ::handleEvent, ) } } + +private sealed interface InternalTarget { + data object None : InternalTarget + data class Showing(val event: TimelineItem.Event) : InternalTarget +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionState.kt index 1897d4e5a7..566453b32b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionState.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionState.kt @@ -8,15 +8,13 @@ package io.element.android.features.messages.impl.timeline.components.customreaction -import io.element.android.emojibasebindings.EmojibaseStore import io.element.android.features.messages.impl.timeline.model.TimelineItem -import kotlinx.collections.immutable.ImmutableList +import io.element.android.libraries.emoji.api.picker.EmojiPickerState import kotlinx.collections.immutable.ImmutableSet data class CustomReactionState( val target: Target, val selectedEmoji: ImmutableSet, - val recentEmojis: ImmutableList, val eventSink: (CustomReactionEvent) -> Unit, ) { sealed interface Target { @@ -24,7 +22,7 @@ data class CustomReactionState( data class Loading(val event: TimelineItem.Event) : Target data class Success( val event: TimelineItem.Event, - val emojibaseStore: EmojibaseStore, + val emojiPickerState: EmojiPickerState, ) : Target } } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenter.kt deleted file mode 100644 index 3a4cf6c9ce..0000000000 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenter.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.timeline.components.customreaction.picker - -import androidx.compose.foundation.text.input.rememberTextFieldState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue -import androidx.compose.ui.platform.LocalInspectionMode -import io.element.android.compound.tokens.generated.CompoundIcons -import io.element.android.emojibasebindings.Emoji -import io.element.android.emojibasebindings.EmojibaseStore -import io.element.android.features.messages.impl.R -import io.element.android.features.messages.impl.timeline.components.customreaction.icon -import io.element.android.features.messages.impl.timeline.components.customreaction.title -import io.element.android.libraries.architecture.Presenter -import io.element.android.libraries.core.coroutine.CoroutineDispatchers -import io.element.android.libraries.designsystem.theme.components.IconSource -import io.element.android.libraries.designsystem.theme.components.SearchBarResultState -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toImmutableList -import kotlinx.coroutines.delay -import kotlinx.coroutines.withContext -import kotlin.time.Duration.Companion.milliseconds - -class EmojiPickerPresenter( - private val emojibaseStore: EmojibaseStore, - private val recentEmojis: ImmutableList, - private val coroutineDispatchers: CoroutineDispatchers, -) : Presenter { - @Composable - override fun present(): EmojiPickerState { - val queryState = rememberTextFieldState() - var isSearchActive by remember { mutableStateOf(false) } - var emojiResults by remember { mutableStateOf>>(SearchBarResultState.Initial()) } - - val recentEmojiIcon = CompoundIcons.History() - val categories = remember { - val providedCategories = emojibaseStore.categories.map { (category, emojis) -> - EmojiCategory( - titleId = category.title, - icon = IconSource.Vector(category.icon), - emojis = emojis - ) - } - if (recentEmojis.isNotEmpty()) { - val recentEmojis = recentEmojis.mapNotNull { recentEmoji -> - emojibaseStore.allEmojis.find { it.unicode == recentEmoji } - }.toImmutableList() - val recentCategory = - EmojiCategory( - titleId = R.string.emoji_picker_category_recent, - icon = IconSource.Vector(recentEmojiIcon), - emojis = recentEmojis - ) - (listOf(recentCategory) + providedCategories).toImmutableList() - } else { - providedCategories.toImmutableList() - } - } - - val searchQuery = queryState.text.toString() - LaunchedEffect(searchQuery) { - emojiResults = if (searchQuery.isEmpty()) { - SearchBarResultState.Initial() - } else { - // Add a small delay to avoid doing too many computations when the user is typing quickly - delay(100.milliseconds) - - val lowercaseQuery = searchQuery.lowercase() - val results = withContext(coroutineDispatchers.computation) { - emojibaseStore.allEmojis - .asSequence() - .filter { emoji -> - emoji.tags.orEmpty().any { it.contains(lowercaseQuery) } || - emoji.shortcodes.any { it.contains(lowercaseQuery) } - } - .take(60) - .toImmutableList() - } - - SearchBarResultState.Results(results) - } - } - - val isInPreview = LocalInspectionMode.current - fun handleEvent(event: EmojiPickerEvent) { - when (event) { - // For some reason, in preview mode the SearchBar emits this event with an `isActive = true` value automatically - is EmojiPickerEvent.ToggleSearchActive -> if (!isInPreview) { - isSearchActive = event.isActive - } - } - } - - return EmojiPickerState( - categories = categories, - allEmojis = emojibaseStore.allEmojis, - searchQuery = queryState, - isSearchActive = isSearchActive, - searchResults = emojiResults, - eventSink = ::handleEvent, - ) - } -} diff --git a/features/messages/impl/src/main/res/values-be/translations.xml b/features/messages/impl/src/main/res/values-be/translations.xml index 8b40c72040..b6cac43616 100644 --- a/features/messages/impl/src/main/res/values-be/translations.xml +++ b/features/messages/impl/src/main/res/values-be/translations.xml @@ -6,14 +6,6 @@ "Зашыфравана невядомай ці выдаленай прыладай." "Зашыфравана прыладай, не пацверджанай яе ўладальнікам." "Зашыфравана неправераным карыстальнікам." - "Актыўнасці" - "Сцягі" - "Ежа & Напоі" - "Жывёлы & Прырода" - "Аб\'екты" - "Усмешкі & Удзельнікі" - "Падарожжы & Месцы" - "Сімвалы" "Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз." "Не атрымалася загрузіць медыяфайлы, паспрабуйце яшчэ раз." "Апрацоўка…" diff --git a/features/messages/impl/src/main/res/values-bg/translations.xml b/features/messages/impl/src/main/res/values-bg/translations.xml index 1e675f52ae..2db2e6930f 100644 --- a/features/messages/impl/src/main/res/values-bg/translations.xml +++ b/features/messages/impl/src/main/res/values-bg/translations.xml @@ -1,14 +1,6 @@ "Без шифроване" - "Дейности" - "Знамена" - "Храна & Напитки" - "Животни & Природа" - "Обекти" - "Усмивки & Хора" - "Пътуване & Места" - "Символи" "Докоснете, за да промените качеството на качване на видео" "Файлът не можа да бъде качен." "Неуспешна обработка на мултимедия за качване, моля, опитайте отново." diff --git a/features/messages/impl/src/main/res/values-ca/translations.xml b/features/messages/impl/src/main/res/values-ca/translations.xml index f9b2685c7d..44fe948683 100644 --- a/features/messages/impl/src/main/res/values-ca/translations.xml +++ b/features/messages/impl/src/main/res/values-ca/translations.xml @@ -7,15 +7,6 @@ "Xifrat per un dispositiu desconegut o eliminat." "Xifrat per un dispositiu no verificat pel seu propietari." "Xifrat per un usuari no verificat." - "Activitats" - "Banderes" - "Menjar & begudes" - "Animals i naturalesa" - "Objectes" - "Cares i persones" - "Viatges i llocs" - "Emoticones recents" - "Símbols" "És possible que les llegendes no siguin visibles pels que utilitzin aplicacions antigues." "No s\'ha pogut processar el contingut que s\'havia de pujar. Torna-ho a provar." "No s\'ha pogut pujar el contingut. Torna-ho a provar." diff --git a/features/messages/impl/src/main/res/values-cs/translations.xml b/features/messages/impl/src/main/res/values-cs/translations.xml index 9bf1c5c079..6c39d67583 100644 --- a/features/messages/impl/src/main/res/values-cs/translations.xml +++ b/features/messages/impl/src/main/res/values-cs/translations.xml @@ -7,15 +7,6 @@ "Šifrováno neznámým nebo smazaným zařízením." "Šifrováno zařízením, které nebylo ověřeno jeho vlastníkem." "Šifrováno neověřeným uživatelem." - "Aktivity" - "Vlajky" - "Jídlo a nápoje" - "Zvířata a příroda" - "Předměty" - "Smajlíci a lidé" - "Cestování a místa" - "Nedávné emotikony" - "Symboly" "Titulky nemusí být viditelné pro lidi, kteří používají starší aplikace." "Klepnutím změníte kvalitu nahrávání videa" "Soubor nelze nahrát." diff --git a/features/messages/impl/src/main/res/values-cy/translations.xml b/features/messages/impl/src/main/res/values-cy/translations.xml index 736a9a34f9..f0db099f8e 100644 --- a/features/messages/impl/src/main/res/values-cy/translations.xml +++ b/features/messages/impl/src/main/res/values-cy/translations.xml @@ -7,15 +7,6 @@ "Wedi\'i amgryptio gan ddyfais anhysbys neu wedi\'i dileu." "Wedi\'i amgryptio gan ddyfais nad yw wedi\'i wirio gan ei pherchennog." "Wedi\'i amgryptio gan ddefnyddiwr heb ei wirio." - "Gweithgareddau" - "Baneri" - "Bwyd a Diod" - "Anifeiliaid a Natur" - "Gwrthrychau" - "Wynebau Hapus a Phobl" - "Teithio a Llefydd" - "Emojis diweddar" - "Symbolau" "Efallai na fydd capsiynau yn weladwy i bobl sy\'n defnyddio apiau hŷn." "Tapiwch i newid ansawdd llwytho\'r fideo" "Nid oedd modd llwytho\'r ffeil." diff --git a/features/messages/impl/src/main/res/values-da/translations.xml b/features/messages/impl/src/main/res/values-da/translations.xml index e068df293a..f168dd7896 100644 --- a/features/messages/impl/src/main/res/values-da/translations.xml +++ b/features/messages/impl/src/main/res/values-da/translations.xml @@ -7,15 +7,6 @@ "Krypteret af en ukendt eller slettet enhed." "Krypteret af en enhed, der ikke er verificeret af sin ejer." "Krypteret af en ikke-verificeret bruger." - "Aktiviteter" - "Flag" - "Mad og drikke" - "Dyr og natur" - "Objekter" - "Smileys og personer" - "Rejser og steder" - "Seneste emojis" - "Symboler" "Billedtekster er muligvis ikke synlige for personer, der bruger ældre apps." "Tryk for at ændre videokvaliteten i uploadet" "Filen kunne ikke uploades." diff --git a/features/messages/impl/src/main/res/values-de/translations.xml b/features/messages/impl/src/main/res/values-de/translations.xml index 4848f1f282..1bdb3e0b16 100644 --- a/features/messages/impl/src/main/res/values-de/translations.xml +++ b/features/messages/impl/src/main/res/values-de/translations.xml @@ -7,15 +7,6 @@ "Verschlüsselt von einem unbekannten oder gelöschten Gerät." "Verschlüsselt durch ein Gerät, das nicht von seinem Besitzer verifiziert wurde." "Verschlüsselt durch einen nicht verifizierten Nutzer." - "Aktivitäten" - "Flaggen" - "Essen & Trinken" - "Tiere & Natur" - "Objekte" - "Smileys & Menschen" - "Reisen & Orte" - "Zuletzt verwendete Emojis" - "Symbole" "Bildunterschriften sind für Nutzer älterer Apps möglicherweise nicht sichtbar." "Tippe, um die Qualität des Video-Uploads zu ändern" "Die Datei konnte nicht hochgeladen werden." diff --git a/features/messages/impl/src/main/res/values-el/translations.xml b/features/messages/impl/src/main/res/values-el/translations.xml index bfecdbb944..4a944d5250 100644 --- a/features/messages/impl/src/main/res/values-el/translations.xml +++ b/features/messages/impl/src/main/res/values-el/translations.xml @@ -7,15 +7,6 @@ "Κρυπτογραφημένο από άγνωστη ή διαγεγραμμένη συσκευή." "Κρυπτογραφημένο από μια συσκευή που δεν έχει επαληθευτεί από τον ιδιοκτήτη της." "Κρυπτογραφημένο από μη επαληθευμένο χρήστη." - "Δραστηριότητες" - "Σημαίες" - "Φαγητό & Ποτό" - "Ζώα & Φύση" - "Αντικείμενα" - "Φατσούλες & Άνθρωποι" - "Ταξίδια & Μέρη" - "Πρόσφατα emoji" - "Σύμβολα" "Οι λεζάντες ενδέχεται να μην είναι ορατές σε άτομα που χρησιμοποιούν παλαιότερες εφαρμογές." "Πατήστε για να αλλάξετε την ποιότητα μεταφόρτωσης βίντεο" "Δεν ήταν δυνατή η μεταφόρτωση του αρχείου." diff --git a/features/messages/impl/src/main/res/values-es/translations.xml b/features/messages/impl/src/main/res/values-es/translations.xml index 81ca655676..0a0b57cc5e 100644 --- a/features/messages/impl/src/main/res/values-es/translations.xml +++ b/features/messages/impl/src/main/res/values-es/translations.xml @@ -7,14 +7,6 @@ "Cifrado por un dispositivo desconocido o eliminado." "Cifrado por un dispositivo no verificado por su propietario." "Cifrado por un usuario no verificado." - "Actividades" - "Banderas" - "Comida y bebida" - "Animales y naturaleza" - "Objetos" - "Emojis y personas" - "Viajes y lugares" - "Símbolos" "Es posible que las leyendas no sean visibles para las personas que usan aplicaciones más antiguas." "Error al procesar el contenido multimedia, por favor inténtalo de nuevo." "Error al subir el contenido multimedia, por favor inténtalo de nuevo." diff --git a/features/messages/impl/src/main/res/values-et/translations.xml b/features/messages/impl/src/main/res/values-et/translations.xml index 86b1995f32..aa6576fc17 100644 --- a/features/messages/impl/src/main/res/values-et/translations.xml +++ b/features/messages/impl/src/main/res/values-et/translations.xml @@ -7,15 +7,6 @@ "Krüptitud tundmatu või kustutatud seadme poolt." "Krüptitud seadme poolt, mida tema omanik pole verifitseerinud." "Krüptitud verifitseerimata kasutaja poolt." - "Tegevused" - "Lipud" - "Toit ja jook" - "Loomad ja loodus" - "Esemed" - "Emotikonid ja inimesed" - "Reisimine ja kohad" - "Hiljutised emojid" - "Sümbolid" "Pööra pilti ümber rõhttelje" "Pilt on pööratud ümber rõhttelje" "Pildi algne variant" diff --git a/features/messages/impl/src/main/res/values-eu/translations.xml b/features/messages/impl/src/main/res/values-eu/translations.xml index 6c76b4dfd9..8c158d688a 100644 --- a/features/messages/impl/src/main/res/values-eu/translations.xml +++ b/features/messages/impl/src/main/res/values-eu/translations.xml @@ -1,14 +1,6 @@ "Ez dago zifratuta." - "Jarduerak" - "Banderak" - "Jana eta edana" - "Animaliak eta natura" - "Objektuak" - "Irribartxoak eta jendea" - "Bidaiak eta tokiak" - "Ikurrak" "Huts egin du multimedia igotzeak, saiatu berriro." "Blokeatu erabiltzailea" "Mezua zure zerbitzariko administratzaileari jakinaraziko zaio. Ezingo dute zifratutako mezurik irakurri." diff --git a/features/messages/impl/src/main/res/values-fa/translations.xml b/features/messages/impl/src/main/res/values-fa/translations.xml index 19f55a5559..4f8f737f9c 100644 --- a/features/messages/impl/src/main/res/values-fa/translations.xml +++ b/features/messages/impl/src/main/res/values-fa/translations.xml @@ -6,15 +6,6 @@ "رمز شده به دست افزاره‌ای ناشناخته یا حذف شده." "رمز شده به دست افزاره‌ای که از سوی مالکش تأیید نشده." "رمز شده به دست کاربری تأیید نشده." - "فعّالیت‌ها" - "پرچم‌ها" - "غذا و نوشیدنی" - "حیوانات و طبعیت" - "اشیا" - "شکلک‌ها و افراد" - "سفر و مکان‌ها" - "شکلک‌های اخیر" - "نمادها" "پردازش رسانه برای بارگذاری شکست خورد. لطفاً دوباره تلاش کنید." "بارگذاری رسانه شکست خورد. لطفاً دوباره تلاش کنید." "پردازش کردن…" diff --git a/features/messages/impl/src/main/res/values-fi/translations.xml b/features/messages/impl/src/main/res/values-fi/translations.xml index 881a5386e7..3705047087 100644 --- a/features/messages/impl/src/main/res/values-fi/translations.xml +++ b/features/messages/impl/src/main/res/values-fi/translations.xml @@ -7,15 +7,6 @@ "Tuntemattoman tai poistetun laitteen salaama." "Salattu laitteella, jota sen omistaja ei ole vahvistanut." "Vahvistamattoman käyttäjän salaama." - "Aktiviteetit" - "Liput" - "Ruoka ja juoma" - "Eläimet ja luonto" - "Esineet" - "Hymiöt ja ihmiset" - "Matkustaminen ja paikat" - "Viimeaikaiset emojit" - "Symbolit" "Käännä kuva vaakasuunnassa" "Käännetty vaakasuunnassa" "Alkuperäinen" diff --git a/features/messages/impl/src/main/res/values-fr/translations.xml b/features/messages/impl/src/main/res/values-fr/translations.xml index 3505fd520d..0062421326 100644 --- a/features/messages/impl/src/main/res/values-fr/translations.xml +++ b/features/messages/impl/src/main/res/values-fr/translations.xml @@ -7,15 +7,6 @@ "Chiffré par un appareil inconnu ou supprimé." "Chiffré par un appareil non vérifié par son propriétaire." "Chiffré par un utilisateur non vérifié." - "Activités" - "Drapeaux" - "Nourriture et boissons" - "Animaux et nature" - "Objets" - "Émoticônes et personnes" - "Voyages & lieux" - "Emojis récents" - "Symboles" "Retourner l’image horizontalement" "Retournée horizontalement" "Originale" diff --git a/features/messages/impl/src/main/res/values-hr/translations.xml b/features/messages/impl/src/main/res/values-hr/translations.xml index 0f04f2179a..23912aaf78 100644 --- a/features/messages/impl/src/main/res/values-hr/translations.xml +++ b/features/messages/impl/src/main/res/values-hr/translations.xml @@ -7,15 +7,6 @@ "Šifrirano nepoznatim ili izbrisanim uređajem." "Šifrirano uređajem koji vlasnik nije potvrdio." "Šifrirao neprovjereni korisnik." - "Aktivnosti" - "Zastave" - "Hrana i piće" - "Životinje i priroda" - "Objekti" - "Emotikoni i osobe" - "Putovanja i mjesta" - "Nedavni emotikoni" - "Simboli" "Okreni sliku vodoravno" "Okrenuto vodoravno" "Izvornik" diff --git a/features/messages/impl/src/main/res/values-hu/translations.xml b/features/messages/impl/src/main/res/values-hu/translations.xml index bb33520cb6..2b428f92b2 100644 --- a/features/messages/impl/src/main/res/values-hu/translations.xml +++ b/features/messages/impl/src/main/res/values-hu/translations.xml @@ -7,15 +7,6 @@ "Ismeretlen vagy törölt eszköz által titkosítva." "A tulajdonos által nem ellenőrzött eszköz által titkosítva." "Nem ellenőrzött felhasználó által titkosítva." - "Tevékenységek" - "Zászlók" - "Étel és ital" - "Állatok és természet" - "Tárgyak" - "Mosolyok és emberek" - "Utazás és helyek" - "Legutóbbi emodzsik" - "Szimbólumok" "Kép vízszintes tükrözése" "Vízszintesen tükrözve" "Eredeti" diff --git a/features/messages/impl/src/main/res/values-in/translations.xml b/features/messages/impl/src/main/res/values-in/translations.xml index d052efb769..00233facfd 100644 --- a/features/messages/impl/src/main/res/values-in/translations.xml +++ b/features/messages/impl/src/main/res/values-in/translations.xml @@ -7,15 +7,6 @@ "Dienkripsi oleh perangkat yang tidak dikenal atau dihapus." "Dienkripsi oleh perangkat yang tidak diverifikasi oleh pemiliknya." "Dienkripsi oleh pengguna yang tidak terverifikasi." - "Aktivitas" - "Bendera" - "Makanan & Minuman" - "Hewan & Alam" - "Objek" - "Senyuman & Orang" - "Wisata & Tempat" - "Emojis Sebelumnya" - "Simbol" "Putar gambar ke kiri" "%1$d derajat" diff --git a/features/messages/impl/src/main/res/values-it/translations.xml b/features/messages/impl/src/main/res/values-it/translations.xml index 0f2e0d37be..53812093ee 100644 --- a/features/messages/impl/src/main/res/values-it/translations.xml +++ b/features/messages/impl/src/main/res/values-it/translations.xml @@ -7,15 +7,6 @@ "Cifrato da un dispositivo sconosciuto o eliminato." "Cifrato da un dispositivo non verificato dal proprietario." "Cifrato da un utente non verificato." - "Attività" - "Bandiere" - "Cibi & Bevande" - "Animali & Natura" - "Oggetti" - "Faccine & Persone" - "Viaggi & Luoghi" - "Emoji recenti" - "Simboli" "Capovolgi l\'immagine orizzontalmente" "Capovolto orizzontalmente" "Originale" diff --git a/features/messages/impl/src/main/res/values-ja/translations.xml b/features/messages/impl/src/main/res/values-ja/translations.xml index 26d33c4aa1..15851b893e 100644 --- a/features/messages/impl/src/main/res/values-ja/translations.xml +++ b/features/messages/impl/src/main/res/values-ja/translations.xml @@ -7,15 +7,6 @@ "削除されたまたは不明な端末により暗号化されています。" "所有者に検証されていない端末により暗号化されています。" "未検証のユーザーにより暗号化されています。" - "アクティビティ" - "旗" - "食べ物" - "動物・自然" - "物" - "顔・人" - "旅・場所" - "最近使用" - "記号" "水平に反転" "垂直に反転" "元画像" diff --git a/features/messages/impl/src/main/res/values-ka/translations.xml b/features/messages/impl/src/main/res/values-ka/translations.xml index 842fa4bf5b..54002be4b2 100644 --- a/features/messages/impl/src/main/res/values-ka/translations.xml +++ b/features/messages/impl/src/main/res/values-ka/translations.xml @@ -1,13 +1,5 @@ - "აქტივობები" - "დროშები" - "Საჭმელ-სასმელი" - "ცხოველები & ბუნება" - "ობიექტები" - "ღიმილები & ხალხი" - "მოგზაურობა და ადგილები" - "სიმბოლოები" "მედიის ატვირთვა ვერ მოხერხდა. გთხოვთ, სცადოთ ხელახლა." "მედიის ატვირთვა ვერ მოხერხდა, გთხოვთ, სცადოთ ხელახლა." "მომხმარებლის დაბლოკვა" diff --git a/features/messages/impl/src/main/res/values-ko/translations.xml b/features/messages/impl/src/main/res/values-ko/translations.xml index fbcb0cab52..82d81f42cd 100644 --- a/features/messages/impl/src/main/res/values-ko/translations.xml +++ b/features/messages/impl/src/main/res/values-ko/translations.xml @@ -7,15 +7,6 @@ "알 수 없거나 삭제된 장치에 의해 암호화됩니다." "소유자가 확인하지 않은 장치에 의해 암호화되었습니다." "검증되지 않은 사용자에 의해 암호화되었습니다." - "활동" - "깃발" - "음식 & 음료" - "동물 & 자연" - "사물" - "표정 & 사람" - "여행 & 장소" - "최근 이모지" - "상징" "이미지를 왼쪽으로 회전" "%1$d도" diff --git a/features/messages/impl/src/main/res/values-lt/translations.xml b/features/messages/impl/src/main/res/values-lt/translations.xml index 379f9ae853..39f1b43627 100644 --- a/features/messages/impl/src/main/res/values-lt/translations.xml +++ b/features/messages/impl/src/main/res/values-lt/translations.xml @@ -1,13 +1,5 @@ - "Veikla" - "Vėliavos" - "Maistas ir Gėrimai" - "Gyvūnai ir Gamta" - "Objektai" - "Šypsenėlės ir Žmonės" - "Kelionės ir Vietovės" - "Simboliai" "Nepavyko apdoroti įkeliamos laikmenos, bandykite dar kartą." "Nepavyko įkelti laikmenos, pabandykite dar kartą." "Blokuoti vartotoją" diff --git a/features/messages/impl/src/main/res/values-nb/translations.xml b/features/messages/impl/src/main/res/values-nb/translations.xml index a0dafdd136..a68aeabcdf 100644 --- a/features/messages/impl/src/main/res/values-nb/translations.xml +++ b/features/messages/impl/src/main/res/values-nb/translations.xml @@ -7,15 +7,6 @@ "Kryptert av en ukjent eller slettet enhet." "Kryptert med en enhet som ikke er verifisert av eieren." "Kryptert av en ubekreftet bruker." - "Aktiviteter" - "Flagg" - "Mat og drikke" - "Dyr og natur" - "Gjenstander" - "Smilefjes og mennesker" - "Reising og steder" - "Nylige emojier" - "Symboler" "Teksting er kanskje ikke synlig for personer som bruker eldre apper." "Trykk for å endre kvaliteten på videoopplastingen" "Filen kunne ikke lastes opp." diff --git a/features/messages/impl/src/main/res/values-nl/translations.xml b/features/messages/impl/src/main/res/values-nl/translations.xml index d2305229a7..dbce48fc97 100644 --- a/features/messages/impl/src/main/res/values-nl/translations.xml +++ b/features/messages/impl/src/main/res/values-nl/translations.xml @@ -6,14 +6,6 @@ "Versleuteld door een onbekend of verwijderd apparaat." "Versleuteld door een apparaat dat niet is geverifieerd door de eigenaar." "Versleuteld door een niet-geverifieerde gebruiker." - "Activiteiten" - "Vlaggen" - "Eten & Drinken" - "Dieren & Natuur" - "Voorwerpen" - "Smileys & Mensen" - "Reizen & Locaties" - "Symbolen" "Het verwerken van media voor uploaden is mislukt. Probeer het opnieuw." "Het uploaden van media is mislukt. Probeer het opnieuw." "Gebruiker blokkeren" diff --git a/features/messages/impl/src/main/res/values-pl/translations.xml b/features/messages/impl/src/main/res/values-pl/translations.xml index d8ffaac54c..651a8e460e 100644 --- a/features/messages/impl/src/main/res/values-pl/translations.xml +++ b/features/messages/impl/src/main/res/values-pl/translations.xml @@ -7,15 +7,6 @@ "Zaszyfrowana przez nieznane lub usunięte urządzenie." "Zaszyfrowana przez urządzenie niezweryfikowane przez jego właściciela." "Zaszyfrowana przez niezweryfikowanego użytkownika." - "Aktywności" - "Flagi" - "Jedzenie i napoje" - "Zwierzęta i natura" - "Obiekty" - "Buźki i osoby" - "Podróż i miejsca" - "Ostatnie emoji" - "Symbole" "Odwróć obraz w poziomie" "Odwrócono w poziomie" "Oryginalny" diff --git a/features/messages/impl/src/main/res/values-pt-rBR/translations.xml b/features/messages/impl/src/main/res/values-pt-rBR/translations.xml index f93f0d71ca..5c8b62e5dd 100644 --- a/features/messages/impl/src/main/res/values-pt-rBR/translations.xml +++ b/features/messages/impl/src/main/res/values-pt-rBR/translations.xml @@ -7,15 +7,6 @@ "Criptografado por um dispositivo desconhecido ou apagado." "Criptografado por um dispositivo que não foi verificado pelo seu dono." "Criptografado por um usuário não verificado." - "Atividades" - "Bandeiras" - "Comida & Bebida" - "Animais & Natureza" - "Objetos" - "Sorrisos & Pessoas" - "Viagens & Lugares" - "Emojis recentes" - "Símbolos" "As legendas podem não ser visíveis para pessoas que usam apps mais antigos." "Toque para alterar a qualidade do envio do vídeo" "O arquivo não pôde ser enviado." diff --git a/features/messages/impl/src/main/res/values-pt/translations.xml b/features/messages/impl/src/main/res/values-pt/translations.xml index 2fb5173169..6329956b05 100644 --- a/features/messages/impl/src/main/res/values-pt/translations.xml +++ b/features/messages/impl/src/main/res/values-pt/translations.xml @@ -7,15 +7,6 @@ "Cifragem com origem num dispositivo eliminado ou desconhecido." "Cifragem com origem num dispositivo não verificado pelo seu dono." "Cifragem com origem num utilizador não verificado." - "Atividades" - "Bandeiras" - "Comidas e Bebidas" - "Animais e Natureza" - "Objetos" - "Caras e Pessoas" - "Viagens e Lugares" - "Emojis recentes" - "Símbolos" "As legendas poderão não ser visíveis em versões mais antigas da aplicação." "Toca para alterar a qualidade de carregamento do vídeo" "Não foi possível enviar o ficheiro" diff --git a/features/messages/impl/src/main/res/values-ro/translations.xml b/features/messages/impl/src/main/res/values-ro/translations.xml index 67b72dc2a8..e9e4da87c3 100644 --- a/features/messages/impl/src/main/res/values-ro/translations.xml +++ b/features/messages/impl/src/main/res/values-ro/translations.xml @@ -7,15 +7,6 @@ "Criptat de un dispozitiv necunoscut sau șters." "Criptat de un dispozitiv care nu este verificat de proprietarul său." "Criptat de un utilizator neverificat." - "Activități" - "Steaguri" - "Mâncare & Băutură" - "Animale și Natură" - "Obiecte" - "Fețe zâmbitoare & Oameni" - "Călătorii & Locuri" - "Emoticoane recente" - "Simboluri" "Este posibil ca descrierile să nu fie vizibile pentru persoanele care folosesc aplicații mai vechi." "Atingeți pentru a modifica calitatea încărcării videoclipului" "Fișierul nu a putut fi încărcat." diff --git a/features/messages/impl/src/main/res/values-ru/translations.xml b/features/messages/impl/src/main/res/values-ru/translations.xml index 3744beff8f..32e6e16980 100644 --- a/features/messages/impl/src/main/res/values-ru/translations.xml +++ b/features/messages/impl/src/main/res/values-ru/translations.xml @@ -7,15 +7,6 @@ "Зашифровано неизвестным или удаленным устройством." "Зашифровано устройством, не проверенным его владельцем." "Зашифровано непроверенным пользователем." - "Активности" - "Флаги" - "Еда и напитки" - "Животные и природа" - "Объекты" - "Эмодзи и люди" - "Путешествия и места" - "Недавние эмодзи" - "Символы" "Перевернуть изображение по горизонтали" "Перевернуто по горизонтали" "Оригинал" diff --git a/features/messages/impl/src/main/res/values-sk/translations.xml b/features/messages/impl/src/main/res/values-sk/translations.xml index d2022c4882..c64e5ba62e 100644 --- a/features/messages/impl/src/main/res/values-sk/translations.xml +++ b/features/messages/impl/src/main/res/values-sk/translations.xml @@ -7,15 +7,6 @@ "Zašifrované neznámym alebo odstráneným zariadením." "Šifrované zariadením, ktoré nie je overené jeho majiteľom." "Šifrované neovereným používateľom." - "Aktivity" - "Vlajky" - "Jedlo a nápoje" - "Zvieratá a príroda" - "Predmety" - "Smajlíky a ľudia" - "Cestovanie a miesta" - "Nedávne emotikony" - "Symboly" "Titulky nemusia byť viditeľné pre ľudí používajúcich staršie aplikácie." "Ťuknutím zmeníte kvalitu nahratého videa" "Súbor sa nepodarilo nahrať." diff --git a/features/messages/impl/src/main/res/values-sv/translations.xml b/features/messages/impl/src/main/res/values-sv/translations.xml index 2e10fd3166..6de0b1ebcc 100644 --- a/features/messages/impl/src/main/res/values-sv/translations.xml +++ b/features/messages/impl/src/main/res/values-sv/translations.xml @@ -7,14 +7,6 @@ "Krypterad av en okänd eller raderad enhet." "Krypterad av en enhet som inte verifierats av ägaren." "Krypterad av en overifierad användare." - "Aktiviteter" - "Flaggor" - "Mat & dryck" - "Djur & natur" - "Föremål" - "Smileys & personer" - "Resor & platser" - "Symboler" "Bildtexter kanske inte är synliga för personer som använder äldre appar." "Tryck för att ändra videouppladdningskvaliteten" "Filen kunde inte laddas upp." diff --git a/features/messages/impl/src/main/res/values-tr/translations.xml b/features/messages/impl/src/main/res/values-tr/translations.xml index a40687444b..a987f63ce3 100644 --- a/features/messages/impl/src/main/res/values-tr/translations.xml +++ b/features/messages/impl/src/main/res/values-tr/translations.xml @@ -7,14 +7,6 @@ "Bilinmeyen veya silinmiş bir cihaz tarafından şifrelenmiştir." "Sahibi tarafından doğrulanmamış bir cihaz tarafından şifrelenmiştir." "Doğrulanmamış bir kullanıcı tarafından şifrelenmiştir." - "Aktiviteler" - "Bayraklar" - "Yiyecek ve İçecek" - "Hayvanlar ve Doğa" - "Nesneler" - "İfadeler ve İnsanlar" - "Seyahat ve Yerler" - "Simgeler" "Açıklamalar, eski uygulamaları kullanan kişiler tarafından görülemeyebilir." "Medya yüklenemedi, lütfen tekrar deneyin." "Medya yüklenemedi, lütfen tekrar deneyin." diff --git a/features/messages/impl/src/main/res/values-uk/translations.xml b/features/messages/impl/src/main/res/values-uk/translations.xml index cae9560768..c5f5ddde91 100644 --- a/features/messages/impl/src/main/res/values-uk/translations.xml +++ b/features/messages/impl/src/main/res/values-uk/translations.xml @@ -7,15 +7,6 @@ "Зашифровано невідомим або видаленим пристроєм." "Зашифровано пристроєм, який не звірено його власником." "Зашифровано не звіреним користувачем." - "Дії" - "Прапори" - "Їжа та напої" - "Тварини та природа" - "Об\'єкти" - "Смайлики та люди" - "Подорожі та місця" - "Нещодавні емодзі" - "Символи" "Повернути зображення по горизонталі" "Перевернуто по горизонталі" "Оригінал" diff --git a/features/messages/impl/src/main/res/values-ur/translations.xml b/features/messages/impl/src/main/res/values-ur/translations.xml index cb110ef5c6..6f549a5ba3 100644 --- a/features/messages/impl/src/main/res/values-ur/translations.xml +++ b/features/messages/impl/src/main/res/values-ur/translations.xml @@ -6,14 +6,6 @@ "کسی نامعلوم یا حذف شدہ آلے کے ذریعے مرموز کردہ۔" "کسی ایسے آلے کے ذریعے مرموز کردہ جس کی توثیق اسکے مالک سے نہیں ہوئی۔" "ایک غیر توثیق شدہ صارف کے ذریعے مرموز کردہ۔" - "سرگرمیاں" - "جھنڈے" - "طعم و مشروب" - "حیوانات و فطرت" - "اشیاء" - "مسکراہٹیں و لوگ" - "سفر و مقامات" - "علامتیں" "وسائط کا معالجہ برائے ترفیع ناکام، برائے مہربانی دوبارہ کوشش کریں۔" "وسائط رفع کرنے میں ناکام، برائے مہربانی دوبارہ کوشش کریں۔" "صارف کو مسدود کریں" diff --git a/features/messages/impl/src/main/res/values-uz/translations.xml b/features/messages/impl/src/main/res/values-uz/translations.xml index 03a1f6ef7e..8941917f5f 100644 --- a/features/messages/impl/src/main/res/values-uz/translations.xml +++ b/features/messages/impl/src/main/res/values-uz/translations.xml @@ -7,15 +7,6 @@ "Nomaʼlum yoki oʻchirib tashlangan qurilma tomonidan shifrlangan." "Egasi tasdiqlamagan qurilma tomonidan shifrlangan." "Tasdiqlanmagan foydalanuvchi tomonidan shifrlangan." - "Faoliyatlar" - "Bayroqlar" - "Oziq-ovqat va ichimliklar" - "Hayvonlar va tabiat" - "Ob\'ektlar" - "Smayllar va odamlar" - "Sayohat va Joylar" - "Oxirgi kulgichlar" - "Belgilar" "Rasmni gorizontal ravishda aylantiring" "Gorizontal ravishda aylantirildi" "Asl nusxasi" diff --git a/features/messages/impl/src/main/res/values-vi/translations.xml b/features/messages/impl/src/main/res/values-vi/translations.xml index 5104cd5a5b..a16d7378b3 100644 --- a/features/messages/impl/src/main/res/values-vi/translations.xml +++ b/features/messages/impl/src/main/res/values-vi/translations.xml @@ -7,15 +7,6 @@ "Được mã hóa bởi một thiết bị không xác định hoặc đã bị xóa." "Được mã hóa bởi một thiết bị chưa được chủ sở hữu xác minh." "Được mã hóa bởi một người dùng chưa được xác minh." - "Hoạt động" - "Cờ" - "Thực phẩm và đồ uống" - "Động vật và thiên nhiên" - "Đồ vật" - "Mặt cười & mọi người" - "Du lịch và địa danh" - "Biểu tượng cảm xúc gần đây" - "Biểu tượng" "Xử lý phương tiện tải lên không thành công, vui lòng thử lại." "Không thể tải lên tệp phương tiện. Vui lòng thử lại." "Chặn người dùng" diff --git a/features/messages/impl/src/main/res/values-zh-rTW/translations.xml b/features/messages/impl/src/main/res/values-zh-rTW/translations.xml index 0eea6e808e..e8cd285b5e 100644 --- a/features/messages/impl/src/main/res/values-zh-rTW/translations.xml +++ b/features/messages/impl/src/main/res/values-zh-rTW/translations.xml @@ -7,15 +7,6 @@ "由未知或已刪除的裝置加密。" "由未經其擁有者驗證的裝置加密。" "由未經驗證的使用者加密。" - "活動" - "旗幟" - "食物與飲料" - "動物與大自然" - "物品" - "表情與人物" - "旅行與景點" - "最近使用的表情符號" - "標誌" "使用舊應用程式的使用者可能看不到標題。" "輕點即可變更影片上傳品質" "無法上傳檔案。" diff --git a/features/messages/impl/src/main/res/values-zh/translations.xml b/features/messages/impl/src/main/res/values-zh/translations.xml index e2300912ae..41e55e1cce 100644 --- a/features/messages/impl/src/main/res/values-zh/translations.xml +++ b/features/messages/impl/src/main/res/values-zh/translations.xml @@ -7,15 +7,6 @@ "由未知或已删除的设备加密。" "由未经其所有者验证的设备加密。" "由未经验证的用户加密。" - "节假日" - "旗帜" - "饮食" - "动物和自然" - "日常物品" - "表情和人物" - "文旅景点" - "最近的 Emoji" - "符号" "水平翻转图像" "水平翻转" "原始" diff --git a/features/messages/impl/src/main/res/values/localazy.xml b/features/messages/impl/src/main/res/values/localazy.xml index e4790feba0..556ab00ee0 100644 --- a/features/messages/impl/src/main/res/values/localazy.xml +++ b/features/messages/impl/src/main/res/values/localazy.xml @@ -7,15 +7,6 @@ "Encrypted by an unknown or deleted device." "Encrypted by a device not verified by its owner." "Encrypted by an unverified user." - "Activities" - "Flags" - "Food & Drink" - "Animals & Nature" - "Objects" - "Smileys & People" - "Travel & Places" - "Recent emojis" - "Symbols" "Flip image horizontally" "Flipped horizontally" "Original" diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt index 5d2dceaf31..2800c737ad 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/MessagesViewTest.kt @@ -31,7 +31,6 @@ import androidx.compose.ui.test.v2.runAndroidComposeUiTest import androidx.compose.ui.text.AnnotatedString import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.EmojibaseCategory -import io.element.android.emojibasebindings.EmojibaseStore import io.element.android.features.messages.impl.actionlist.ActionListEvent import io.element.android.features.messages.impl.actionlist.ActionListState import io.element.android.features.messages.impl.actionlist.anActionListState @@ -48,6 +47,7 @@ import io.element.android.features.messages.impl.timeline.aTimelineItemList import io.element.android.features.messages.impl.timeline.aTimelineItemReadReceipts import io.element.android.features.messages.impl.timeline.aTimelineRoomInfo import io.element.android.features.messages.impl.timeline.aTimelineState +import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionBottomSheet import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionEvent import io.element.android.features.messages.impl.timeline.components.customreaction.CustomReactionState import io.element.android.features.messages.impl.timeline.components.reactionsummary.ReactionSummaryEvent @@ -56,6 +56,8 @@ import io.element.android.features.messages.impl.timeline.components.receipt.bot import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.features.messages.impl.timeline.model.event.aTimelineItemTextContent import io.element.android.features.roomcall.api.aStandByCallState +import io.element.android.libraries.emoji.impl.picker.DefaultEmojiPickerRenderer +import io.element.android.libraries.emoji.impl.picker.anEmojiPickerState import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.tombstone.SuccessorRoom @@ -538,24 +540,23 @@ class MessagesViewTest : RobolectricTest() { eventSink = eventsRecorder, ) val timelineItem = state.timelineState.timelineItems.first() as TimelineItem.Event + val emojisByCategory = persistentMapOf( + EmojibaseCategory.People to persistentListOf( + Emoji( + hexcode = "", + label = "", + tags = persistentListOf(), + shortcodes = persistentListOf(), + unicode = aUnicode, + skins = null, + ) + ) + ) val stateWithCustomReactionState = state.copy( customReactionState = aCustomReactionState( target = CustomReactionState.Target.Success( event = timelineItem, - emojibaseStore = EmojibaseStore( - categories = persistentMapOf( - EmojibaseCategory.People to persistentListOf( - Emoji( - hexcode = "", - label = "", - tags = persistentListOf(), - shortcodes = persistentListOf(), - unicode = aUnicode, - skins = null, - ) - ) - ) - ), + emojiPickerState = anEmojiPickerState(emojis = emojisByCategory), ), eventSink = customReactionStateEventsRecorder ), @@ -695,6 +696,7 @@ private fun AndroidComposeUiTest.setMessagesView( onViewAllPinnedMessagesClick: () -> Unit = EnsureNeverCalled(), onThreadsListClicked: () -> Unit = EnsureNeverCalled(), ) { + val emojiPickerRenderer = DefaultEmojiPickerRenderer() setSafeContent { // Cannot use the RichTextEditor, so simulate a LocalInspectionMode CompositionLocalProvider(LocalInspectionMode provides true) { @@ -711,6 +713,15 @@ private fun AndroidComposeUiTest.setMessagesView( onJoinCallClick = onJoinCallClick, onViewAllPinnedMessagesClick = onViewAllPinnedMessagesClick, knockRequestsBannerView = {}, + customReactionBottomSheet = { + CustomReactionBottomSheet( + state = state.customReactionState, + onSelectEmoji = { uniqueId, emoji -> + state.eventSink(MessagesEvent.ToggleReaction(emoji.unicode, uniqueId)) + }, + emojiPickerRenderer = emojiPickerRenderer, + ) + }, onThreadsListClick = onThreadsListClicked, ) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt index d0765bd5e7..be765554de 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt @@ -11,11 +11,10 @@ package io.element.android.features.messages.impl.timeline.components.customreac import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.aTimelineItemReactions -import io.element.android.libraries.emoji.test.FakeEmojibaseProvider +import io.element.android.libraries.emoji.impl.picker.anEmojiPickerState import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.test -import kotlinx.collections.immutable.persistentListOf import kotlinx.coroutines.test.runTest import org.junit.Rule import org.junit.Test @@ -25,8 +24,7 @@ class CustomReactionPresenterTest { val warmUpRule = WarmUpRule() private val presenter = CustomReactionPresenter( - emojibaseProvider = FakeEmojibaseProvider(), - getRecentEmojis = { Result.success(persistentListOf()) }, + emojiPickerPresenter = { anEmojiPickerState() }, ) @Test diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenterTest.kt deleted file mode 100644 index 9ebbfd5a3a..0000000000 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerPresenterTest.kt +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) 2025 Element Creations Ltd. - * Copyright 2025 New Vector Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -package io.element.android.features.messages.impl.timeline.components.customreaction.picker - -import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd -import androidx.compose.runtime.InternalComposeApi -import androidx.compose.runtime.currentComposer -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalContext -import androidx.test.platform.app.InstrumentationRegistry -import app.cash.molecule.RecompositionMode -import app.cash.molecule.moleculeFlow -import app.cash.turbine.TurbineTestContext -import app.cash.turbine.test -import com.google.common.truth.Truth.assertThat -import io.element.android.emojibasebindings.Emoji -import io.element.android.emojibasebindings.EmojibaseCategory -import io.element.android.emojibasebindings.EmojibaseStore -import io.element.android.libraries.designsystem.theme.components.SearchBarResultState -import io.element.android.tests.testutils.WarmUpRule -import io.element.android.tests.testutils.robolectric.RobolectricTest -import io.element.android.tests.testutils.testCoroutineDispatchers -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.persistentListOf -import kotlinx.collections.immutable.toImmutableMap -import kotlinx.coroutines.test.TestScope -import kotlinx.coroutines.test.runTest -import org.junit.Rule -import org.junit.Test - -class EmojiPickerPresenterTest : RobolectricTest() { - @get:Rule - val warmUpRule = WarmUpRule() - - @Test - fun `updating search query loads new results`() = runTest { - testPresenter { - skipItems(1) - - val initialState = awaitItem() - assertThat(initialState.searchQuery.text.toString()).isEmpty() - assertThat(initialState.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java) - - initialState.searchQuery.setTextAndPlaceCursorAtEnd("smile") - assertThat(awaitItem().searchQuery.text.toString()).isEqualTo("smile") - - val stateWithResults = awaitItem() - assertThat(stateWithResults.searchQuery.text.toString()).isEqualTo("smile") - assertThat(stateWithResults.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) - } - } - - @Test - fun `ToggleSearchActive toggles the search state`() = runTest { - testPresenter { - skipItems(1) - - val initialState = awaitItem() - assertThat(initialState.isSearchActive).isFalse() - - initialState.eventSink(EmojiPickerEvent.ToggleSearchActive(true)) - assertThat(awaitItem().isSearchActive).isTrue() - - initialState.eventSink(EmojiPickerEvent.ToggleSearchActive(false)) - assertThat(awaitItem().isSearchActive).isFalse() - } - } - - @Test - fun `recent emojis are automatically added to the categories if present`() = runTest { - val providedCategories = persistentListOf(emojiCategory(EmojibaseCategory.Activity)) - val presenter = createPresenter( - categories = providedCategories, - recentEmojis = persistentListOf("😊"), - ) - testPresenter(presenter) { - skipItems(1) - - val initialState = awaitItem() - assertThat(providedCategories.size).isNotEqualTo(initialState.categories.size) - assertThat(initialState.categories.size).isEqualTo(2) - } - } - - private fun TestScope.createPresenter( - categories: ImmutableList>> = persistentListOf(emojiCategory()), - recentEmojis: ImmutableList = persistentListOf(), - ) = EmojiPickerPresenter( - emojibaseStore = EmojibaseStore(categories.toMap().toImmutableMap()), - recentEmojis = recentEmojis, - coroutineDispatchers = testCoroutineDispatchers(), - ) - - private fun emojiCategory( - category: EmojibaseCategory = EmojibaseCategory.Activity, - emojis: ImmutableList = persistentListOf( - Emoji("1F3C3", "Smile", persistentListOf("smile"), persistentListOf("smile"), "😊", skins = null) - ) - ) = category to emojis - - @OptIn(InternalComposeApi::class) - private suspend fun TestScope.testPresenter( - presenter: EmojiPickerPresenter = createPresenter(), - testBlock: suspend TurbineTestContext.() -> Unit, - ) { - moleculeFlow(RecompositionMode.Immediate) { - // These are needed to load the history icon in the presenter - currentComposer.startProviders(arrayOf( - LocalContext provides InstrumentationRegistry.getInstrumentation().context, - LocalConfiguration provides InstrumentationRegistry.getInstrumentation().context.resources.configuration, - )) - val state = presenter.present() - currentComposer.endProviders() - state - }.test { - testBlock() - } - } -} diff --git a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt new file mode 100644 index 0000000000..5e29ee01ab --- /dev/null +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt @@ -0,0 +1,12 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.api.picker + +import io.element.android.libraries.architecture.Presenter + +fun interface EmojiPickerPresenter : Presenter diff --git a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerRenderer.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerRenderer.kt new file mode 100644 index 0000000000..6d2f67a5a6 --- /dev/null +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerRenderer.kt @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.api.picker + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.Modifier +import io.element.android.emojibasebindings.Emoji +import kotlinx.collections.immutable.ImmutableSet + +@Immutable +interface EmojiPickerRenderer { + /** + * @param state opaque state produced by [EmojiPickerPresenter.present]. + * @param onSelectEmoji invoked when the user taps an emoji (including a skin-tone variant). + * @param selectedEmojis emojis to visually mark as already selected. + * @param modifier layout modifier for the picker container. + * @param contentDescription accessibility label for each emoji cell. + */ + @Composable + fun Render( + state: EmojiPickerState, + onSelectEmoji: (Emoji) -> Unit, + selectedEmojis: ImmutableSet, + modifier: Modifier = Modifier, + contentDescription: @Composable (Emoji, Boolean) -> String = { emoji, _ -> emoji.unicode }, + ) +} diff --git a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerState.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerState.kt new file mode 100644 index 0000000000..a5c820e648 --- /dev/null +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerState.kt @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.api.picker + +/** + * Opaque state produced by an [EmojiPickerPresenter] and consumed by an [EmojiPickerRenderer]. + */ +interface EmojiPickerState { + /** + * `true` once the picker has finished loading its data and is safe to display. + * Callers should typically defer showing the picker (or its container, e.g. a bottom sheet) + * until this flips to `true` to avoid flashing an empty picker. + */ + val isReady: Boolean +} diff --git a/libraries/emoji/impl/build.gradle.kts b/libraries/emoji/impl/build.gradle.kts index 871c19a41a..1cb274e6c0 100644 --- a/libraries/emoji/impl/build.gradle.kts +++ b/libraries/emoji/impl/build.gradle.kts @@ -35,7 +35,6 @@ dependencies { implementation(libs.kotlinx.collections.immutable) implementation(libs.matrix.emojibase.bindings) - testImplementation(projects.libraries.emoji.test) testImplementation(projects.libraries.matrix.test) testCommonDependencies(libs) } diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/DefaultEmojibaseProvider.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/DefaultEmojibaseProvider.kt index f0ad797648..9f64879a80 100644 --- a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/DefaultEmojibaseProvider.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/DefaultEmojibaseProvider.kt @@ -11,16 +11,28 @@ package io.element.android.libraries.emoji.impl import android.content.Context import dev.zacsweers.metro.AppScope import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.Inject import dev.zacsweers.metro.SingleIn import io.element.android.emojibasebindings.EmojibaseDatasource import io.element.android.emojibasebindings.EmojibaseStore +import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.di.annotations.AppCoroutineScope import io.element.android.libraries.di.annotations.ApplicationContext -import io.element.android.libraries.emoji.api.EmojibaseProvider +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.async +@Inject @SingleIn(AppScope::class) @ContributesBinding(AppScope::class) -class DefaultEmojibaseProvider(@ApplicationContext val context: Context) : EmojibaseProvider { - override val emojibaseStore: EmojibaseStore by lazy { +class DefaultEmojibaseProvider( + @ApplicationContext private val context: Context, + dispatchers: CoroutineDispatchers, + @AppCoroutineScope appScope: CoroutineScope, +) : EmojibaseProvider { + private val deferred = appScope.async(dispatchers.io, start = CoroutineStart.LAZY) { EmojibaseDatasource().load(context) } + + override suspend fun getStore(): EmojibaseStore = deferred.await() } diff --git a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/EmojibaseProvider.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/EmojibaseProvider.kt similarity index 60% rename from libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/EmojibaseProvider.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/EmojibaseProvider.kt index d8f9c92777..ddd18f8861 100644 --- a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/EmojibaseProvider.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/EmojibaseProvider.kt @@ -1,15 +1,14 @@ /* - * Copyright (c) 2025 Element Creations Ltd. - * Copyright 2025 New Vector Ltd. + * Copyright (c) 2026 Element Creations Ltd. * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.emoji.api +package io.element.android.libraries.emoji.impl import io.element.android.emojibasebindings.EmojibaseStore interface EmojibaseProvider { - val emojibaseStore: EmojibaseStore + suspend fun getStore(): EmojibaseStore } diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt new file mode 100644 index 0000000000..e7afe50c0f --- /dev/null +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.impl.picker + +import androidx.compose.foundation.text.input.rememberTextFieldState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.produceState +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.platform.LocalInspectionMode +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.Inject +import io.element.android.emojibasebindings.Emoji +import io.element.android.libraries.core.coroutine.CoroutineDispatchers +import io.element.android.libraries.designsystem.theme.components.IconSource +import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.emoji.api.picker.EmojiPickerPresenter +import io.element.android.libraries.emoji.api.picker.EmojiPickerState +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis +import io.element.android.libraries.emoji.impl.EmojibaseProvider +import io.element.android.libraries.emoji.impl.R +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.collections.immutable.toImmutableList +import kotlinx.coroutines.async +import kotlinx.coroutines.delay +import kotlinx.coroutines.withContext +import kotlin.time.Duration.Companion.milliseconds + +@Inject +@ContributesBinding(SessionScope::class) +class DefaultEmojiPickerPresenter( + private val emojibaseProvider: EmojibaseProvider, + private val getRecentEmojis: GetRecentEmojis, + private val coroutineDispatchers: CoroutineDispatchers, +) : EmojiPickerPresenter { + @Composable + override fun present(): EmojiPickerState { + val queryState = rememberTextFieldState() + var isSearchActive by remember { mutableStateOf(false) } + var emojiResults by remember { mutableStateOf>>(SearchBarResultState.Initial()) } + + val data by produceState(EmojiPickerData.Empty) { + val storeDeferred = async { emojibaseProvider.getStore() } + val recentsDeferred = async { getRecentEmojis().getOrNull() ?: persistentListOf() } + val store = storeDeferred.await() + val recentEmojiUnicodes = recentsDeferred.await() + value = withContext(coroutineDispatchers.computation) { + val baseCategories = store.categories.map { (category, emojis) -> + EmojiCategory( + titleId = category.title, + icon = IconSource.Vector(category.icon), + emojis = emojis, + ) + } + val recentEmojis = recentEmojiUnicodes + .mapNotNull { unicode -> store.allEmojis.find { it.unicode == unicode } } + .toImmutableList() + val categories = if (recentEmojis.isEmpty()) { + baseCategories.toImmutableList() + } else { + val recentCategory = EmojiCategory( + titleId = R.string.emoji_picker_category_recent, + icon = IconSource.Resource(io.element.android.compound.R.drawable.ic_compound_history), + emojis = recentEmojis, + ) + (listOf(recentCategory) + baseCategories).toImmutableList() + } + EmojiPickerData( + categories = categories, + allEmojis = store.allEmojis, + ) + } + } + + val searchQuery = queryState.text.toString() + LaunchedEffect(searchQuery, data) { + if (searchQuery.isEmpty() || data.allEmojis.isEmpty()) { + emojiResults = SearchBarResultState.Initial() + return@LaunchedEffect + } + delay(100.milliseconds) + val lowercaseQuery = searchQuery.lowercase() + val results = withContext(coroutineDispatchers.computation) { + data.allEmojis + .asSequence() + .filter { emoji -> + emoji.tags.orEmpty().any { it.contains(lowercaseQuery) } || + emoji.shortcodes.any { it.contains(lowercaseQuery) } + } + .take(60) + .toImmutableList() + } + emojiResults = SearchBarResultState.Results(results) + } + + val isInPreview = LocalInspectionMode.current + fun handleEvent(event: EmojiPickerEvent) { + when (event) { + is EmojiPickerEvent.ToggleSearchActive -> if (!isInPreview) { + isSearchActive = event.isActive + } + } + } + + return DefaultEmojiPickerState( + categories = data.categories, + searchQuery = queryState, + isSearchActive = isSearchActive, + searchResults = emojiResults, + eventSink = ::handleEvent, + ) + } +} + +private data class EmojiPickerData( + val categories: ImmutableList, + val allEmojis: ImmutableList, +) { + companion object { + val Empty = EmojiPickerData(persistentListOf(), persistentListOf()) + } +} diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerRenderer.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerRenderer.kt new file mode 100644 index 0000000000..4b6fcd8554 --- /dev/null +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerRenderer.kt @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.impl.picker + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import dev.zacsweers.metro.ContributesBinding +import dev.zacsweers.metro.Inject +import io.element.android.emojibasebindings.Emoji +import io.element.android.libraries.di.SessionScope +import io.element.android.libraries.emoji.api.picker.EmojiPickerRenderer +import io.element.android.libraries.emoji.api.picker.EmojiPickerState +import kotlinx.collections.immutable.ImmutableSet + +@Inject +@ContributesBinding(SessionScope::class) +class DefaultEmojiPickerRenderer : EmojiPickerRenderer { + @Composable + override fun Render( + state: EmojiPickerState, + onSelectEmoji: (Emoji) -> Unit, + selectedEmojis: ImmutableSet, + modifier: Modifier, + contentDescription: @Composable (Emoji, Boolean) -> String, + ) { + if (state is DefaultEmojiPickerState) { + EmojiPickerView( + state = state, + onSelectEmoji = onSelectEmoji, + selectedEmojis = selectedEmojis, + contentDescription = contentDescription, + modifier = modifier, + ) + } else { + error("Unsupported state type: ${state::class.java}") + } + } +} diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerState.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerState.kt similarity index 72% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerState.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerState.kt index c1d306dece..8b3835724b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerState.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerState.kt @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.timeline.components.customreaction.picker +package io.element.android.libraries.emoji.impl.picker import androidx.annotation.StringRes import androidx.compose.foundation.text.input.TextFieldState @@ -14,23 +14,21 @@ import androidx.compose.runtime.Immutable import io.element.android.emojibasebindings.Emoji import io.element.android.libraries.designsystem.theme.components.IconSource import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +import io.element.android.libraries.emoji.api.picker.EmojiPickerState import kotlinx.collections.immutable.ImmutableList -// Emoji is unstable (because from an external library?), so we annotate with @Immutable @Immutable -data class EmojiPickerState( +internal data class DefaultEmojiPickerState( val categories: ImmutableList, - val allEmojis: ImmutableList, val searchQuery: TextFieldState, val isSearchActive: Boolean, val searchResults: SearchBarResultState>, val eventSink: (EmojiPickerEvent) -> Unit, -) +) : EmojiPickerState { + override val isReady = categories.isNotEmpty() +} -/** - * Represents a category of emojis with a title id, icon, and the list of associated emojis. - */ -data class EmojiCategory( +internal data class EmojiCategory( @StringRes val titleId: Int, val icon: IconSource, val emojis: ImmutableList, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerStateProvider.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerStateProvider.kt similarity index 58% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerStateProvider.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerStateProvider.kt index 958b3849f5..0a091a2b66 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerStateProvider.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerStateProvider.kt @@ -6,29 +6,26 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.timeline.components.customreaction.picker +package io.element.android.libraries.emoji.impl.picker import androidx.compose.foundation.text.input.TextFieldState import androidx.compose.ui.tooling.preview.PreviewParameterProvider import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.EmojibaseCategory -import io.element.android.features.messages.impl.R -import io.element.android.features.messages.impl.timeline.components.customreaction.icon -import io.element.android.features.messages.impl.timeline.components.customreaction.title -import io.element.android.libraries.designsystem.icons.CompoundDrawables import io.element.android.libraries.designsystem.theme.components.IconSource import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +import io.element.android.libraries.emoji.api.picker.EmojiPickerState import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -class EmojiPickerStateProvider : PreviewParameterProvider { - override val values: Sequence +internal class DefaultEmojiPickerStateProvider : PreviewParameterProvider { + override val values: Sequence get() = sequenceOf( - anEmojiPickerState(), - anEmojiPickerState(isSearchActive = true), - anEmojiPickerState(isSearchActive = true, searchQuery = "smile"), - anEmojiPickerState( + aDefaultEmojiPickerState(), + aDefaultEmojiPickerState(isSearchActive = true), + aDefaultEmojiPickerState(isSearchActive = true, searchQuery = "smile"), + aDefaultEmojiPickerState( isSearchActive = true, searchQuery = "smile", searchResults = SearchBarResultState.Results(emojiList()) @@ -36,12 +33,6 @@ class EmojiPickerStateProvider : PreviewParameterProvider { ) } -private fun recentEmojisCategory() = EmojiCategory( - titleId = R.string.emoji_picker_category_recent, - icon = IconSource.Resource(CompoundDrawables.ic_compound_history), - emojis = emojiList(), -) - private fun emojiList(): ImmutableList = persistentListOf( Emoji( "0x00", @@ -56,29 +47,46 @@ private fun emojiList(): ImmutableList = persistentListOf( "crying face", persistentListOf("crying"), persistentListOf("smile, crying"), - "\uD83E\uDD72", + "🥲", null ) ) -internal fun anEmojiPickerState( - categories: ImmutableList = (listOf(recentEmojisCategory()) + EmojibaseCategory.entries.map { +internal fun aDefaultEmojiPickerState( + categories: ImmutableList = EmojibaseCategory.entries.map { EmojiCategory( titleId = it.title, icon = IconSource.Vector(it.icon), emojis = emojiList(), ) - }).toImmutableList(), - allEmojis: ImmutableList = categories.flatMap { it.emojis }.toImmutableList(), + }.toImmutableList(), searchQuery: String = "", isSearchActive: Boolean = false, searchResults: SearchBarResultState> = SearchBarResultState.Initial(), eventSink: (EmojiPickerEvent) -> Unit = {}, -) = EmojiPickerState( +) = DefaultEmojiPickerState( categories = categories, - allEmojis = allEmojis, searchQuery = TextFieldState(initialText = searchQuery), isSearchActive = isSearchActive, searchResults = searchResults, eventSink = eventSink, ) + +/** + * Public helper for external tests that need an [EmojiPickerState] instance the impl's + * [DefaultEmojiPickerRenderer] will accept. The no-arg overload returns a ready state + * (see [EmojiPickerState.isReady]); use the [emojis] overload to inject specific categories. + */ +fun anEmojiPickerState(): EmojiPickerState = aDefaultEmojiPickerState() + +fun anEmojiPickerState( + emojis: Map>, +): EmojiPickerState = aDefaultEmojiPickerState( + categories = emojis.map { (category, list) -> + EmojiCategory( + titleId = category.title, + icon = IconSource.Vector(category.icon), + emojis = list, + ) + }.toImmutableList(), +) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiItem.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiItem.kt similarity index 86% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiItem.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiItem.kt index db3a70715d..27c80af961 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojiItem.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiItem.kt @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.timeline.components.customreaction +package io.element.android.libraries.emoji.impl.picker import androidx.compose.foundation.Canvas import androidx.compose.foundation.background @@ -52,12 +52,6 @@ import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Popup import io.element.android.compound.theme.ElementTheme import io.element.android.emojibasebindings.Emoji -import io.element.android.features.messages.impl.timeline.a11y.a11yReactionAction -import io.element.android.features.messages.impl.timeline.components.customreaction.picker.SkinTonePadding -import io.element.android.features.messages.impl.timeline.components.customreaction.picker.SkinTonePicker -import io.element.android.features.messages.impl.timeline.components.customreaction.picker.SkinToneSlotSize -import io.element.android.features.messages.impl.timeline.components.customreaction.picker.SkinToneSlotSpacing -import io.element.android.features.messages.impl.timeline.components.customreaction.picker.aSkinList import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.components.Text @@ -66,7 +60,7 @@ import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentSetOf @Composable -fun EmojiItem( +internal fun EmojiItem( item: Emoji, isSelected: Boolean, onSelectEmoji: (Emoji) -> Unit, @@ -75,6 +69,7 @@ fun EmojiItem( skinPickerEmoji: Emoji?, selectedSkinUnicodes: ImmutableSet, hasSelectedSkin: Boolean, + contentDescription: @Composable (emoji: Emoji, isSelected: Boolean) -> String = { emoji, _ -> emoji.unicode }, modifier: Modifier = Modifier, emojiSize: TextUnit = 20.sp, ) { @@ -89,18 +84,13 @@ fun EmojiItem( var hoveredIndex by remember { mutableIntStateOf(-1) } var dismissed by remember { mutableStateOf(false) } val interactionSource = remember { MutableInteractionSource() } - val description = a11yReactionAction( - emoji = item.unicode, - userAlreadyReacted = isSelected, - ) + val description = contentDescription(item, isSelected) val hasSkinTones = !item.skins.isNullOrEmpty() Box( modifier = modifier .onPlaced { coordinates -> val position = coordinates.positionInParent() val parentBounds = coordinates.parentLayoutCoordinates?.size ?: return@onPlaced - // Calculate the offset of the item inside its parent as a percentage, to be able to set the initial offset - // for the selection inside the skin tone picker relative to its size. itemOffsetPercent = if (parentBounds.width > 0) { position.x / parentBounds.width } else { @@ -112,7 +102,6 @@ fun EmojiItem( .background(backgroundColor, CircleShape) .indication(interactionSource, ripple()) .pointerInput(item) { - // Always detect long press and tap gestures detectTapGestures( onPress = { pressOffset -> val press = PressInteraction.Press(pressOffset) @@ -130,7 +119,6 @@ fun EmojiItem( ) } .then( - // Only detect drag after long press for those items which have a skin tone picker if (hasSkinTones) { Modifier.pointerInput(item) { val slotWidthPx = with(density) { SkinToneSlotSize.toPx() } @@ -147,8 +135,6 @@ fun EmojiItem( onDrag = { change, _ -> if (!dismissed) { change.consume() - // It's a valid drag event if it's within ~2 items height above, so, on top of the current one or the skin tone selector, - // or 1 item below, which should be far enough to not be triggered by mistake val isValidDrag = if (change.position.y < startOffset.y) { startOffset.y - change.position.y <= itemSize.height * 2f } else { @@ -160,15 +146,11 @@ fun EmojiItem( onDismissSkinPicker() } else { val skinItemsCount = item.skins!!.size - // Original + variants val totalSlots = 1 + skinItemsCount - // Calculate the whole size of the skin tone picker val pickerWidthPx = 2 * paddingPx + totalSlots * slotWidthPx + (totalSlots - 1) * spacingPx - // Calculate the initial offset inside the picker, given the relative position of the item inside its parent val initialOffset = pickerWidthPx * itemOffsetPercent val xInPicker = initialOffset + change.position.x - // If it's a valid offset, calculate the hovered index, otherwise, set it to -1 to indicate that no item is hovered val index = if (xInPicker in 0f..pickerWidthPx) { (xInPicker / slotWidthPx).toInt().coerceIn(0, totalSlots - 1) } else { @@ -210,7 +192,7 @@ fun EmojiItem( } ) .clearAndSetSemantics { - contentDescription = description + this.contentDescription = description }, contentAlignment = Alignment.Center ) { diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerEvent.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerEvent.kt similarity index 71% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerEvent.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerEvent.kt index 6ea5eea0f6..57cbf8e08b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPickerEvent.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerEvent.kt @@ -6,8 +6,8 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.timeline.components.customreaction.picker +package io.element.android.libraries.emoji.impl.picker -sealed interface EmojiPickerEvent { +internal sealed interface EmojiPickerEvent { data class ToggleSearchActive(val isActive: Boolean) : EmojiPickerEvent } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPicker.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt similarity index 91% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPicker.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt index ce65a435f4..325f1d792b 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/EmojiPicker.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.timeline.components.customreaction.picker +package io.element.android.libraries.emoji.impl.picker import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -35,7 +35,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp import io.element.android.emojibasebindings.Emoji -import io.element.android.features.messages.impl.timeline.components.customreaction.EmojiItem import io.element.android.libraries.designsystem.preview.ElementPreview import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.text.toSp @@ -50,11 +49,12 @@ import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable -fun EmojiPicker( +internal fun EmojiPickerView( + state: DefaultEmojiPickerState, onSelectEmoji: (Emoji) -> Unit, - state: EmojiPickerState, selectedEmojis: ImmutableSet, modifier: Modifier = Modifier, + contentDescription: @Composable (emoji: Emoji, isSelected: Boolean) -> String = { emoji, _ -> emoji.unicode }, ) { val coroutineScope = rememberCoroutineScope() val pagerState = rememberPagerState(pageCount = { state.categories.size }) @@ -78,6 +78,7 @@ fun EmojiPicker( skinPickerEmoji = skinPickerEmoji, onDismissSkinPicker = { skinPickerEmoji = null }, selectedEmojis = selectedEmojis, + contentDescription = contentDescription, ) } @@ -120,6 +121,7 @@ fun EmojiPicker( skinPickerEmoji = skinPickerEmoji, onDismissSkinPicker = { skinPickerEmoji = null }, selectedEmojis = selectedEmojis, + contentDescription = contentDescription, ) } } @@ -135,6 +137,7 @@ private fun EmojiResults( skinPickerEmoji: Emoji?, onDismissSkinPicker: () -> Unit, selectedEmojis: ImmutableSet, + contentDescription: @Composable (emoji: Emoji, isSelected: Boolean) -> String, ) { LazyVerticalGrid( modifier = Modifier.fillMaxSize(), @@ -155,6 +158,7 @@ private fun EmojiResults( emojiSize = 32.dp.toSp(), selectedSkinUnicodes = selectedEmojis, hasSelectedSkin = item.skins?.any { skin -> skin.unicode in selectedEmojis } == true, + contentDescription = contentDescription, ) } } @@ -162,10 +166,10 @@ private fun EmojiResults( @PreviewsDayNight @Composable -internal fun EmojiPickerPreview(@PreviewParameter(EmojiPickerStateProvider::class) state: EmojiPickerState) = ElementPreview { - EmojiPicker( - onSelectEmoji = {}, +internal fun EmojiPickerViewPreview(@PreviewParameter(DefaultEmojiPickerStateProvider::class) state: DefaultEmojiPickerState) = ElementPreview { + EmojiPickerView( state = state, + onSelectEmoji = {}, selectedEmojis = persistentSetOf("😀", "😄", "😃"), modifier = Modifier.fillMaxWidth(), ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojibaseExtensions.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojibaseExtensions.kt similarity index 91% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojibaseExtensions.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojibaseExtensions.kt index 0f967cc41d..c6b428a13d 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/EmojibaseExtensions.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojibaseExtensions.kt @@ -6,7 +6,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.timeline.components.customreaction +package io.element.android.libraries.emoji.impl.picker import androidx.annotation.StringRes import androidx.compose.material.icons.Icons @@ -20,10 +20,10 @@ import androidx.compose.material.icons.outlined.EmojiSymbols import androidx.compose.material.icons.outlined.EmojiTransportation import androidx.compose.ui.graphics.vector.ImageVector import io.element.android.emojibasebindings.EmojibaseCategory -import io.element.android.features.messages.impl.R +import io.element.android.libraries.emoji.impl.R @get:StringRes -val EmojibaseCategory.title: Int +internal val EmojibaseCategory.title: Int get() = when (this) { EmojibaseCategory.People -> R.string.emoji_picker_category_people EmojibaseCategory.Nature -> R.string.emoji_picker_category_nature @@ -35,7 +35,7 @@ val EmojibaseCategory.title: Int EmojibaseCategory.Flags -> R.string.emoji_picker_category_flags } -val EmojibaseCategory.icon: ImageVector +internal val EmojibaseCategory.icon: ImageVector get() = when (this) { EmojibaseCategory.People -> Icons.Outlined.EmojiPeople EmojibaseCategory.Nature -> Icons.Outlined.EmojiNature diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/SkinTonePicker.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/SkinTonePicker.kt similarity index 95% rename from features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/SkinTonePicker.kt rename to libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/SkinTonePicker.kt index 1ac66b5378..6d2618873a 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/picker/SkinTonePicker.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/SkinTonePicker.kt @@ -5,7 +5,7 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.features.messages.impl.timeline.components.customreaction.picker +package io.element.android.libraries.emoji.impl.picker import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -36,12 +36,12 @@ import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.persistentSetOf -val SkinToneSlotSize = 48.dp -val SkinToneSlotSpacing = 2.dp -val SkinTonePadding = 4.dp +internal val SkinToneSlotSize = 48.dp +internal val SkinToneSlotSpacing = 2.dp +internal val SkinTonePadding = 4.dp @Composable -fun SkinTonePicker( +internal fun SkinTonePicker( emoji: Emoji, hoveredIndex: Int, selectedUnicodes: ImmutableSet, diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojis.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojis.kt index acd5e012ce..412332e984 100644 --- a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojis.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojis.kt @@ -11,8 +11,8 @@ package io.element.android.libraries.emoji.impl.recentemojis import dev.zacsweers.metro.ContributesBinding import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.SessionScope -import io.element.android.libraries.emoji.api.EmojibaseProvider import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis +import io.element.android.libraries.emoji.impl.EmojibaseProvider import io.element.android.libraries.matrix.api.MatrixClient import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList @@ -25,7 +25,7 @@ class DefaultGetRecentEmojis( private val emojibaseProvider: EmojibaseProvider, ) : GetRecentEmojis { override suspend operator fun invoke(): Result> = withContext(dispatchers.io) { - val allEmojis = emojibaseProvider.emojibaseStore.allEmojis + val allEmojis = emojibaseProvider.getStore().allEmojis client.getRecentEmojis() .map { emojis -> // Remove any possible duplicates diff --git a/libraries/emoji/impl/src/main/res/values/temporary.xml b/libraries/emoji/impl/src/main/res/values/temporary.xml new file mode 100644 index 0000000000..34467795b9 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values/temporary.xml @@ -0,0 +1,13 @@ + + + + "Activities" + "Flags" + "Food & Drink" + "Animals & Nature" + "Objects" + "Smileys & People" + "Travel & Places" + "Recent emojis" + "Symbols" + diff --git a/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojibaseProvider.kt b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/fixtures/FakeEmojibaseProvider.kt similarity index 60% rename from libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojibaseProvider.kt rename to libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/fixtures/FakeEmojibaseProvider.kt index 0e7c42e538..f01b6a1268 100644 --- a/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojibaseProvider.kt +++ b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/fixtures/FakeEmojibaseProvider.kt @@ -6,18 +6,18 @@ * Please see LICENSE files in the repository root for full details. */ -package io.element.android.libraries.emoji.test +package io.element.android.libraries.emoji.impl.fixtures import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.EmojibaseCategory import io.element.android.emojibasebindings.EmojibaseStore -import io.element.android.libraries.emoji.api.EmojibaseProvider +import io.element.android.libraries.emoji.impl.EmojibaseProvider import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toPersistentMap -class FakeEmojibaseProvider( - val emojis: Map> = mapOf(), +internal class FakeEmojibaseProvider( + emojis: Map> = mapOf(), ) : EmojibaseProvider { - override val emojibaseStore: EmojibaseStore - get() = EmojibaseStore(emojis.toPersistentMap()) + private val store = EmojibaseStore(emojis.toPersistentMap()) + override suspend fun getStore(): EmojibaseStore = store } diff --git a/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerPresenterTest.kt b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerPresenterTest.kt new file mode 100644 index 0000000000..cf1a68f9d5 --- /dev/null +++ b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerPresenterTest.kt @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2025 Element Creations Ltd. + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.impl.picker + +import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd +import app.cash.turbine.TurbineTestContext +import com.google.common.truth.Truth.assertThat +import io.element.android.emojibasebindings.Emoji +import io.element.android.emojibasebindings.EmojibaseCategory +import io.element.android.libraries.designsystem.theme.components.SearchBarResultState +import io.element.android.libraries.emoji.api.picker.EmojiPickerState +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis +import io.element.android.libraries.emoji.impl.fixtures.FakeEmojibaseProvider +import io.element.android.tests.testutils.WarmUpRule +import io.element.android.tests.testutils.robolectric.RobolectricTest +import io.element.android.tests.testutils.test +import io.element.android.tests.testutils.testCoroutineDispatchers +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runTest +import org.junit.Rule +import org.junit.Test + +class EmojiPickerPresenterTest : RobolectricTest() { + @get:Rule + val warmUpRule = WarmUpRule() + + @Test + fun `updating search query loads new results`() = runTest { + createPresenter().test { + val initialState = awaitStoreLoaded() + assertThat(initialState.searchQuery.text.toString()).isEmpty() + assertThat(initialState.searchResults).isInstanceOf(SearchBarResultState.Initial::class.java) + + initialState.searchQuery.setTextAndPlaceCursorAtEnd("smile") + val stateAfterQuery = awaitItem() as DefaultEmojiPickerState + assertThat(stateAfterQuery.searchQuery.text.toString()).isEqualTo("smile") + + val stateWithResults = awaitItem() as DefaultEmojiPickerState + assertThat(stateWithResults.searchQuery.text.toString()).isEqualTo("smile") + assertThat(stateWithResults.searchResults).isInstanceOf(SearchBarResultState.Results::class.java) + } + } + + @Test + fun `recent emojis are prepended as a category when the source returns any`() = runTest { + createPresenter( + categories = persistentListOf(emojiCategory(EmojibaseCategory.Activity)), + getRecentEmojis = GetRecentEmojis { Result.success(persistentListOf("😊")) }, + ).test { + val state = awaitStoreLoaded() + assertThat(state.categories.size).isEqualTo(2) + } + } + + @Test + fun `ToggleSearchActive toggles the search state`() = runTest { + createPresenter().test { + val initialState = awaitStoreLoaded() + assertThat(initialState.isSearchActive).isFalse() + + initialState.eventSink(EmojiPickerEvent.ToggleSearchActive(true)) + assertThat((awaitItem() as DefaultEmojiPickerState).isSearchActive).isTrue() + + initialState.eventSink(EmojiPickerEvent.ToggleSearchActive(false)) + assertThat((awaitItem() as DefaultEmojiPickerState).isSearchActive).isFalse() + } + } + + @Test + fun `presenter exposes categories from the emoji store when the recent source is empty`() = runTest { + val providedCategories = persistentListOf( + emojiCategory(EmojibaseCategory.Activity), + emojiCategory(EmojibaseCategory.People), + ) + createPresenter(categories = providedCategories).test { + val state = awaitStoreLoaded() + assertThat(state.categories.size).isEqualTo(providedCategories.size) + } + } + + private suspend fun TurbineTestContext.awaitStoreLoaded(): DefaultEmojiPickerState { + var state = awaitItem() as DefaultEmojiPickerState + while (state.categories.isEmpty()) { + state = awaitItem() as DefaultEmojiPickerState + } + return state + } + + private fun TestScope.createPresenter( + categories: ImmutableList>> = persistentListOf(emojiCategory()), + getRecentEmojis: GetRecentEmojis = GetRecentEmojis { Result.success(persistentListOf()) }, + ) = DefaultEmojiPickerPresenter( + emojibaseProvider = FakeEmojibaseProvider(emojis = categories.toMap()), + getRecentEmojis = getRecentEmojis, + coroutineDispatchers = testCoroutineDispatchers(), + ) + + private fun emojiCategory( + category: EmojibaseCategory = EmojibaseCategory.Activity, + emojis: ImmutableList = persistentListOf( + Emoji("1F3C3", "Smile", persistentListOf("smile"), persistentListOf("smile"), "😊", skins = null) + ) + ) = category to emojis +} diff --git a/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojisTest.kt b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojisTest.kt index 2ae8a86c25..822e6e652a 100644 --- a/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojisTest.kt +++ b/libraries/emoji/impl/src/test/kotlin/io/element/android/libraries/emoji/impl/recentemojis/DefaultGetRecentEmojisTest.kt @@ -12,7 +12,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.emojibasebindings.Emoji import io.element.android.emojibasebindings.EmojibaseCategory import io.element.android.emojibasebindings.EmojibaseCategory.People -import io.element.android.libraries.emoji.test.FakeEmojibaseProvider +import io.element.android.libraries.emoji.impl.fixtures.FakeEmojibaseProvider import io.element.android.libraries.matrix.test.FakeMatrixClient import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.collections.immutable.ImmutableList diff --git a/libraries/emoji/test/build.gradle.kts b/libraries/emoji/test/build.gradle.kts deleted file mode 100644 index 42192c8061..0000000000 --- a/libraries/emoji/test/build.gradle.kts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2026 Element Creations Ltd. - * - * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. - * Please see LICENSE files in the repository root for full details. - */ - -plugins { - id("io.element.android-library") -} - -android { - namespace = "io.element.android.libraries.emoji.test" -} - -dependencies { - api(projects.libraries.emoji.api) - api(projects.libraries.matrix.api) - api(libs.coroutines.core) - - implementation(libs.kotlinx.collections.immutable) - implementation(libs.coroutines.test) - implementation(libs.matrix.emojibase.bindings) - implementation(projects.tests.testutils) -} From 93d6d5c84c6edbd0eb93bc6dab6d967d0a198050 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 22 Jul 2026 15:31:40 +0200 Subject: [PATCH 03/24] Migrate EmojiPickerPresenter to assisted-factory pattern with EmptyGetRecentEmojis --- .../CustomReactionBottomSheet.kt | 2 -- .../customreaction/CustomReactionPresenter.kt | 5 ++++- .../CustomReactionPresenterTest.kt | 9 ++++----- libraries/emoji/api/build.gradle.kts | 2 +- .../emoji/api/picker/EmojiPickerPresenter.kt | 7 ++++++- .../emoji/api/recentemojis/GetRecentEmojis.kt | 9 +++++++++ .../picker/DefaultEmojiPickerPresenter.kt | 19 ++++++++++++++----- 7 files changed, 38 insertions(+), 15 deletions(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt index cc971e16ba..c90a0e5acc 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionBottomSheet.kt @@ -37,7 +37,6 @@ fun CustomReactionBottomSheet( CustomReactionState.Target.None, is CustomReactionState.Target.Loading -> Unit is CustomReactionState.Target.Success -> { - fun onEmojiSelectedDismiss(emoji: Emoji) { sheetState.hide(coroutineScope) { state.eventSink(CustomReactionEvent.DismissCustomReactionSheet) @@ -49,7 +48,6 @@ fun CustomReactionBottomSheet( state.eventSink(CustomReactionEvent.DismissCustomReactionSheet) } - ModalBottomSheet( onDismissRequest = ::onDismiss, sheetState = sheetState, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt index 7a9f5fe4ff..fe68092be0 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenter.kt @@ -17,12 +17,15 @@ import dev.zacsweers.metro.Inject import io.element.android.features.messages.impl.timeline.model.TimelineItem import io.element.android.libraries.architecture.Presenter import io.element.android.libraries.emoji.api.picker.EmojiPickerPresenter +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis import kotlinx.collections.immutable.toImmutableSet @Inject class CustomReactionPresenter( - private val emojiPickerPresenter: EmojiPickerPresenter, + emojiPickerPresenterFactory: EmojiPickerPresenter.Factory, + getRecentEmojis: GetRecentEmojis, ) : Presenter { + private val emojiPickerPresenter = emojiPickerPresenterFactory.create(getRecentEmojis) @Composable override fun present(): CustomReactionState { var internalTarget by remember { mutableStateOf(InternalTarget.None) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt index be765554de..8ba316ea4d 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt @@ -11,6 +11,8 @@ package io.element.android.features.messages.impl.timeline.components.customreac import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.aTimelineItemReactions +import io.element.android.libraries.emoji.api.picker.EmojiPickerPresenter +import io.element.android.libraries.emoji.api.recentemojis.EmptyGetRecentEmojis import io.element.android.libraries.emoji.impl.picker.anEmojiPickerState import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.tests.testutils.WarmUpRule @@ -24,7 +26,8 @@ class CustomReactionPresenterTest { val warmUpRule = WarmUpRule() private val presenter = CustomReactionPresenter( - emojiPickerPresenter = { anEmojiPickerState() }, + emojiPickerPresenterFactory = EmojiPickerPresenter.Factory { EmojiPickerPresenter { anEmojiPickerState() } }, + getRecentEmojis = EmptyGetRecentEmojis, ) @Test @@ -36,8 +39,6 @@ class CustomReactionPresenterTest { initialState.eventSink(CustomReactionEvent.ShowCustomReactionSheet(event)) - assertThat(awaitItem().target).isEqualTo(CustomReactionState.Target.Loading(event)) - val eventId = (awaitItem().target as? CustomReactionState.Target.Success)?.event?.eventId assertThat(eventId).isEqualTo(AN_EVENT_ID) @@ -57,8 +58,6 @@ class CustomReactionPresenterTest { val key = reactions.reactions.first().key initialState.eventSink(CustomReactionEvent.ShowCustomReactionSheet(event)) - assertThat(awaitItem().target).isEqualTo(CustomReactionState.Target.Loading(event)) - val stateWithSelectedEmojis = awaitItem() val eventId = (stateWithSelectedEmojis.target as? CustomReactionState.Target.Success)?.event?.eventId assertThat(eventId).isEqualTo(AN_EVENT_ID) diff --git a/libraries/emoji/api/build.gradle.kts b/libraries/emoji/api/build.gradle.kts index 749e13a4c7..48143d9512 100644 --- a/libraries/emoji/api/build.gradle.kts +++ b/libraries/emoji/api/build.gradle.kts @@ -18,5 +18,5 @@ dependencies { implementation(projects.libraries.matrix.api) implementation(libs.kotlinx.collections.immutable) - implementation(libs.matrix.emojibase.bindings) + api(libs.matrix.emojibase.bindings) } diff --git a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt index 5e29ee01ab..a20b53a480 100644 --- a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/picker/EmojiPickerPresenter.kt @@ -8,5 +8,10 @@ package io.element.android.libraries.emoji.api.picker import io.element.android.libraries.architecture.Presenter +import io.element.android.libraries.emoji.api.recentemojis.GetRecentEmojis -fun interface EmojiPickerPresenter : Presenter +fun interface EmojiPickerPresenter : Presenter { + fun interface Factory { + fun create(getRecentEmojis: GetRecentEmojis): EmojiPickerPresenter + } +} diff --git a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/GetRecentEmojis.kt b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/GetRecentEmojis.kt index 9a9983805e..cf6015d799 100644 --- a/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/GetRecentEmojis.kt +++ b/libraries/emoji/api/src/main/kotlin/io/element/android/libraries/emoji/api/recentemojis/GetRecentEmojis.kt @@ -9,6 +9,7 @@ package io.element.android.libraries.emoji.api.recentemojis import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.persistentListOf /** * Returns the list of recently used emojis for reactions. @@ -16,3 +17,11 @@ import kotlinx.collections.immutable.ImmutableList fun interface GetRecentEmojis { suspend operator fun invoke(): Result> } + +/** + * A [GetRecentEmojis] that never returns any recent emojis. Handy for pickers that don't want + * a "Recent" tab (e.g. the user-status picker). + */ +object EmptyGetRecentEmojis : GetRecentEmojis { + override suspend fun invoke(): Result> = Result.success(persistentListOf()) +} diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt index e7afe50c0f..6a0c4924b3 100644 --- a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt @@ -17,8 +17,10 @@ import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalInspectionMode +import dev.zacsweers.metro.Assisted +import dev.zacsweers.metro.AssistedFactory +import dev.zacsweers.metro.AssistedInject import dev.zacsweers.metro.ContributesBinding -import dev.zacsweers.metro.Inject import io.element.android.emojibasebindings.Emoji import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.designsystem.theme.components.IconSource @@ -37,13 +39,18 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.withContext import kotlin.time.Duration.Companion.milliseconds -@Inject -@ContributesBinding(SessionScope::class) +@AssistedInject class DefaultEmojiPickerPresenter( private val emojibaseProvider: EmojibaseProvider, - private val getRecentEmojis: GetRecentEmojis, + @Assisted private val getRecentEmojis: GetRecentEmojis, private val coroutineDispatchers: CoroutineDispatchers, ) : EmojiPickerPresenter { + @AssistedFactory + @ContributesBinding(SessionScope::class) + interface Factory : EmojiPickerPresenter.Factory { + override fun create(getRecentEmojis: GetRecentEmojis): DefaultEmojiPickerPresenter + } + @Composable override fun present(): EmojiPickerState { val queryState = rememberTextFieldState() @@ -86,7 +93,9 @@ class DefaultEmojiPickerPresenter( val searchQuery = queryState.text.toString() LaunchedEffect(searchQuery, data) { if (searchQuery.isEmpty() || data.allEmojis.isEmpty()) { - emojiResults = SearchBarResultState.Initial() + if (emojiResults !is SearchBarResultState.Initial) { + emojiResults = SearchBarResultState.Initial() + } return@LaunchedEffect } delay(100.milliseconds) From 89deff8a5321f430690ac672544113c07f6f1218 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 22 Jul 2026 15:33:54 +0200 Subject: [PATCH 04/24] Add libraries/emoji/test module with picker fakes --- features/messages/impl/build.gradle.kts | 1 + .../CustomReactionPresenterTest.kt | 5 ++--- libraries/emoji/test/build.gradle.kts | 19 +++++++++++++++++++ .../emoji/test/FakeEmojiPickerPresenter.kt | 19 +++++++++++++++++++ .../emoji/test/FakeEmojiPickerState.kt | 18 ++++++++++++++++++ 5 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 libraries/emoji/test/build.gradle.kts create mode 100644 libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerPresenter.kt create mode 100644 libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerState.kt diff --git a/features/messages/impl/build.gradle.kts b/features/messages/impl/build.gradle.kts index d442e1bb95..b40aebab39 100644 --- a/features/messages/impl/build.gradle.kts +++ b/features/messages/impl/build.gradle.kts @@ -107,5 +107,6 @@ dependencies { testImplementation(projects.features.poll.test) testImplementation(projects.libraries.eventformatter.test) testImplementation(projects.libraries.emoji.impl) + testImplementation(projects.libraries.emoji.test) testImplementation(projects.libraries.slashcommands.test) } diff --git a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt index 8ba316ea4d..4d3c4ab41a 100644 --- a/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt +++ b/features/messages/impl/src/test/kotlin/io/element/android/features/messages/impl/timeline/components/customreaction/CustomReactionPresenterTest.kt @@ -11,9 +11,8 @@ package io.element.android.features.messages.impl.timeline.components.customreac import com.google.common.truth.Truth.assertThat import io.element.android.features.messages.impl.timeline.aTimelineItemEvent import io.element.android.features.messages.impl.timeline.aTimelineItemReactions -import io.element.android.libraries.emoji.api.picker.EmojiPickerPresenter import io.element.android.libraries.emoji.api.recentemojis.EmptyGetRecentEmojis -import io.element.android.libraries.emoji.impl.picker.anEmojiPickerState +import io.element.android.libraries.emoji.test.fakeEmojiPickerPresenterFactory import io.element.android.libraries.matrix.test.AN_EVENT_ID import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.test @@ -26,7 +25,7 @@ class CustomReactionPresenterTest { val warmUpRule = WarmUpRule() private val presenter = CustomReactionPresenter( - emojiPickerPresenterFactory = EmojiPickerPresenter.Factory { EmojiPickerPresenter { anEmojiPickerState() } }, + emojiPickerPresenterFactory = fakeEmojiPickerPresenterFactory(), getRecentEmojis = EmptyGetRecentEmojis, ) diff --git a/libraries/emoji/test/build.gradle.kts b/libraries/emoji/test/build.gradle.kts new file mode 100644 index 0000000000..3a18a239ad --- /dev/null +++ b/libraries/emoji/test/build.gradle.kts @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +plugins { + id("io.element.android-compose-library") +} + +android { + namespace = "io.element.android.libraries.emoji.test" +} + +dependencies { + api(projects.libraries.emoji.api) + implementation(projects.libraries.architecture) +} diff --git a/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerPresenter.kt b/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerPresenter.kt new file mode 100644 index 0000000000..76a239ac49 --- /dev/null +++ b/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerPresenter.kt @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.test + +import io.element.android.libraries.emoji.api.picker.EmojiPickerPresenter +import io.element.android.libraries.emoji.api.picker.EmojiPickerState + +fun fakeEmojiPickerPresenter( + state: EmojiPickerState = FakeEmojiPickerState(), +): EmojiPickerPresenter = EmojiPickerPresenter { state } + +fun fakeEmojiPickerPresenterFactory( + presenter: EmojiPickerPresenter = fakeEmojiPickerPresenter(), +): EmojiPickerPresenter.Factory = EmojiPickerPresenter.Factory { presenter } diff --git a/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerState.kt b/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerState.kt new file mode 100644 index 0000000000..234fe2e9b2 --- /dev/null +++ b/libraries/emoji/test/src/main/kotlin/io/element/android/libraries/emoji/test/FakeEmojiPickerState.kt @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2026 Element Creations Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial. + * Please see LICENSE files in the repository root for full details. + */ + +package io.element.android.libraries.emoji.test + +import io.element.android.libraries.emoji.api.picker.EmojiPickerState + +/** + * Minimal [EmojiPickerState] for use in tests that don't render the picker (typically presenter + * tests). + */ +data class FakeEmojiPickerState( + override val isReady: Boolean = true, +) : EmojiPickerState From 4dadb3c8c8463756c55b796ae09b28980ddd6dee Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 22 Jul 2026 15:35:21 +0200 Subject: [PATCH 05/24] Wire the emoji picker into the user-status feature --- .idea/codeStyles/Project.xml | 34 +++++++++++ features/preferences/impl/build.gradle.kts | 2 + .../impl/root/PreferencesRootNode.kt | 3 + .../impl/root/PreferencesRootView.kt | 12 +++- .../impl/userstatus/UserStatusEvent.kt | 2 + .../impl/userstatus/UserStatusPresenter.kt | 61 ++++++++++++++----- .../impl/userstatus/UserStatusState.kt | 9 +++ .../userstatus/UserStatusStateProvider.kt | 16 ++++- .../impl/userstatus/UserStatusView.kt | 51 +++++++++++++++- .../impl/root/PreferencesRootViewTest.kt | 2 + .../userstatus/UserStatusPresenterTest.kt | 6 +- .../emoji/api/picker/EmojiPickerRenderer.kt | 11 ++++ 12 files changed, 189 insertions(+), 20 deletions(-) diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index cdef735570..8151cb4ea3 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -1,5 +1,39 @@ + + + "On the map" + "Your homeserver is on your local network. To connect, Element needs permission to reach devices on this network." + "Allow access to local network" "Failed selecting media, please try again." "Press on a message and choose “%1$s” to include here." "Pin important messages so that they can be easily discovered" diff --git a/tools/localazy/config.json b/tools/localazy/config.json index 5753fe5f47..02b9205ef6 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -330,6 +330,7 @@ "includeRegex" : [ "screen_advanced_settings_.*", "screen\\.advanced_settings\\..*", + "screen\\.settings\\..*", "screen_edit_profile_.*", "screen_notification_settings_.*", "screen\\.notification_settings\\..*", From 140074f23c5c024e161f47617627c37e2978c537 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Thu, 16 Jul 2026 14:43:40 +0000 Subject: [PATCH 10/24] Update screenshots --- .../images/appnav.loggedin_LoggedInView_Day_4_en.png | 4 ++-- .../images/appnav.loggedin_LoggedInView_Day_5_en.png | 4 ++-- .../images/appnav.loggedin_LoggedInView_Night_4_en.png | 4 ++-- .../images/appnav.loggedin_LoggedInView_Night_5_en.png | 4 ++-- .../features.invitepeople.impl_InvitePeopleView_Day_5_en.png | 4 ++-- ...features.invitepeople.impl_InvitePeopleView_Night_5_en.png | 4 ++-- ...ures.login.impl.changeserver_ChangeServerView_Day_6_en.png | 4 ++-- ...es.login.impl.changeserver_ChangeServerView_Night_6_en.png | 4 ++-- ...essages.impl.actionlist_ActionListViewContent_Day_3_en.png | 4 ++-- ...sages.impl.actionlist_ActionListViewContent_Night_3_en.png | 4 ++-- ...agecomposer.suggestions_SuggestionsPickerView_Day_0_en.png | 4 ++-- ...ecomposer.suggestions_SuggestionsPickerView_Night_0_en.png | 4 ++-- ...ures.messages.impl.topbars_MessagesViewTopBar_Day_0_en.png | 4 ++-- ...es.messages.impl.topbars_MessagesViewTopBar_Night_0_en.png | 4 ++-- ...eatures.preferences.impl.user_UserPreferences_Day_2_en.png | 3 +++ ...tures.preferences.impl.user_UserPreferences_Night_2_en.png | 3 +++ .../images/features.roomdetails.impl_RoomDetailsA11y_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_0_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_10_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_11_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_12_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_13_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_14_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_15_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_16_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_17_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_18_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_19_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_1_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_20_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_21_en.png | 4 ++-- .../features.roomdetails.impl_RoomDetailsDark_22_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_2_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_3_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_4_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_5_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_6_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_7_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_8_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetailsDark_9_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_0_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_10_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_11_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_12_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_13_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_14_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_15_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_16_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_17_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_18_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_19_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_1_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_20_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_21_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_22_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_2_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_3_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_4_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_5_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_6_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_7_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_8_en.png | 4 ++-- .../images/features.roomdetails.impl_RoomDetails_9_en.png | 4 ++-- ...embermoderation.impl_RoomMemberModerationView_Day_0_en.png | 4 ++-- ...embermoderation.impl_RoomMemberModerationView_Day_1_en.png | 4 ++-- ...embermoderation.impl_RoomMemberModerationView_Day_2_en.png | 4 ++-- ...embermoderation.impl_RoomMemberModerationView_Day_3_en.png | 4 ++-- ...bermoderation.impl_RoomMemberModerationView_Night_0_en.png | 4 ++-- ...bermoderation.impl_RoomMemberModerationView_Night_1_en.png | 4 ++-- ...bermoderation.impl_RoomMemberModerationView_Night_2_en.png | 4 ++-- ...bermoderation.impl_RoomMemberModerationView_Night_3_en.png | 4 ++-- ...ProfileHeaderSectionWithVerificationViolation_Day_0_en.png | 4 ++-- ...ofileHeaderSectionWithVerificationViolation_Night_0_en.png | 4 ++-- ...s.userprofile.shared_UserProfileHeaderSection_Day_0_en.png | 4 ++-- ...userprofile.shared_UserProfileHeaderSection_Night_0_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_0_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_1_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_2_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_3_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_4_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_5_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_6_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_7_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_8_en.png | 4 ++-- .../features.userprofile.shared_UserProfileView_Day_9_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_0_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_1_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_2_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_3_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_4_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_5_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_6_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_7_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_8_en.png | 4 ++-- ...features.userprofile.shared_UserProfileView_Night_9_en.png | 4 ++-- ...aries.matrix.ui.components_CheckableResolvedUserRow_en.png | 4 ++-- ...braries.matrix.ui.components_MatrixUserHeader_Day_2_en.png | 3 +++ ...aries.matrix.ui.components_MatrixUserHeader_Night_2_en.png | 3 +++ .../libraries.matrix.ui.components_MatrixUserRow_Day_2_en.png | 3 +++ ...ibraries.matrix.ui.components_MatrixUserRow_Night_2_en.png | 3 +++ 100 files changed, 206 insertions(+), 188 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Night_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Day_2_en.png create mode 100644 tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Night_2_en.png diff --git a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_4_en.png index 5cfd616c0e..652703aae3 100644 --- a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:924b97967296d3f50e1f911a14bd63b9d5d0d3d5d171053c1a0e6a5048c4d336 -size 34048 +oid sha256:d9eff127b4c393418646e3874a174e807aaaeea37587b07ca2716a551fb10d8e +size 33418 diff --git a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_5_en.png index ea86b6f571..88e414ee25 100644 --- a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f98480a126f3cd955fc10e42404d8aa812e2f7fb59a9655593bbebb1c8fa972 -size 33249 +oid sha256:bb2dc44a39b82a4138b15214cccc945eef34b2f244b4646e925a2a62568dec37 +size 32619 diff --git a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_4_en.png index 348422394b..8dae0180a8 100644 --- a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c89fc51cf4c9a8b623bb7582aa1490109220cec3b0bfc9ce58e150c5a7702029 -size 32158 +oid sha256:94d9e39df7c1aba7a6ca7eb6abf073f0170469ef837c95afcb5f199f8c2bd7ec +size 31504 diff --git a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_5_en.png index d66f1ab4f2..603fbef2f1 100644 --- a/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/appnav.loggedin_LoggedInView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:794613b9e61283cab807a35b23875b4ea9c1198789c844958c755699279fa3b7 -size 31413 +oid sha256:7ba2563c905c2400a50f81c6d029bc9cf4a99d1cb6483ee3ee8cfe373601a0dd +size 30770 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png index e2c64a6d5b..c67c062ddc 100644 --- a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:686b6dbb0e54dc133a504bb56bf254c8bc6d76faf1c51e696c2b980ad67ffd35 -size 37320 +oid sha256:5a9237dbe1fd700357d7d073408977653a52d9f8c2ca92aad26569c10c0247a1 +size 37488 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png index 2f41c0ac43..eb0e3331e0 100644 --- a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:33e7d75e2f1ebed36e05491eb27475ce74cce35a4121aaa053aff34ac6f8c0dc -size 38272 +oid sha256:ed1399fb1ec24eddadaf91700ac446a9f76784953b8b84cf1675c979fc9aebb9 +size 38509 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_6_en.png index 7ff27996e2..09b645e184 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee3174b63b166511e6c51725a8b6fe00b31eafff011f9059f2f728b77823b465 -size 33670 +oid sha256:487e0a1f72382c418f95d337edbf8047228e8d3b116d192ce3f8abf3cf97fbd4 +size 33063 diff --git a/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_6_en.png index 2c304a2695..6cbd05d003 100644 --- a/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.login.impl.changeserver_ChangeServerView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7910112f7ab526dbf0e5326213e03c3f3fe109dc8cc1bd3a8bf5fb05ddb5b0a7 -size 32054 +oid sha256:36300a7d6bd6f2529bcd72ae3f654b6ef40706e0533f54d9473a9dff23df560e +size 31406 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_3_en.png index b6f510f5f1..3756f9ed3e 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6e42d39ee8965360d92cb66485670b48c265c0728240529c3d35d14a27f325d1 -size 46965 +oid sha256:29b6dc68656a924ba73148f570eaf72b20e9f887b1ae42bfd3c5dc378f2b3791 +size 46613 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_3_en.png index a3529b5d97..948d5d1f87 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.actionlist_ActionListViewContent_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf69710dd5e9926970b9c13ebbe5dbaa9d2e87773ba7c439fe18f3474459fc40 -size 46325 +oid sha256:a0177ab6b9034de7eb35bc5774bef46f8ecf89b63695aa92e20407e605c1b0f5 +size 45968 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en.png index ed3c8abf17..064bc60974 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a1a4672f87cf79f8052e29650be198bee1ee6c00a24ded5fb243b6a32b51c372 -size 38017 +oid sha256:8cb541e97832b6dfc8190c017f4bd8fef3f952fadaa13dc0622a52e22ba664cb +size 41970 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en.png index 6798590348..bd64300ada 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.messagecomposer.suggestions_SuggestionsPickerView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f8c69700f738d00379102fac8d2d1f33891983558d4a650edce317282e16b6c7 -size 37737 +oid sha256:955ec27126825710b2829fe2447773ccaabd0f4415c92195853bbafcc8b2c1ea +size 41552 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Day_0_en.png index 3ea918900d..bcbf444dd1 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e088da462be419f059caa750afe0ce5d806ce25e682cb5aaaf37f88e5c236ee3 -size 55745 +oid sha256:7faf196e521dd713a99a7ea22786a429c937884a25194ce4bbbd55bde12e8bdf +size 62797 diff --git a/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Night_0_en.png index 695f6809c7..abd96c1fb9 100644 --- a/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.messages.impl.topbars_MessagesViewTopBar_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f5658c53966bfab8a24a1e123d10a1b3c98b7d43361469ba8d6519c2d2f1cc22 -size 55067 +oid sha256:292167265d9c1135e545b911f7268d45a9a0195768fd09fc88c1eaf7a5c57b09 +size 62322 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Day_2_en.png new file mode 100644 index 0000000000..0a34d0b390 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3ecf110c258f4ec5fd5d2a4126395e248d73d894afd54a0135dc710f680c0ee +size 12395 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Night_2_en.png new file mode 100644 index 0000000000..58a30a7304 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.user_UserPreferences_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bc66cd4269ee462103e77bfa24723a740d8a91dc7e06ca808b8109e74d1784f +size 12127 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png index 232eff8a27..e9863d1b93 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsA11y_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd57c6da7471850cbf9d4fd749b249589cd1dd71eebeac50fcef8a1db9efc04e -size 67420 +oid sha256:8a6fbd84c3f2a9e40a2e8e81a00ffb82d48e8714035a2da737953e15bac7ea93 +size 67635 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png index 77c11f54a2..29980e7099 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a78e7d4a345b9beca19dedd29282f9a891ceabdc05d203cb4091790924b0bbf3 -size 40335 +oid sha256:fbb8a435e9753f441c832db6622ed94b404dce4237996add3aeb72e518cc14fb +size 40522 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png index 5764767fef..b45888cc98 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:29304b6e03fae0031e6fb536ffa038c436b224cf6c2fe095af1509d8cf1729ff -size 38520 +oid sha256:c4c5e6f2905960f6042ecb61d57a7a2a2b882c73fb49d043bd2d9d71e075c3e8 +size 38657 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png index d242f48a87..18caac8b41 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:966f9a73b258b8b0036255d2519c64a306c07098001f9a140d5a3af9a7ed7734 -size 38088 +oid sha256:f45a01ce91d5e56c19d47a01fd3845a92d32f364925d2490ccaca889e288077e +size 38221 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png index d3baeac29c..231dfeaa33 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44fbeb3efaad275d864b9cf58075fcc1df67c49f5498017e53a6c203ad5d0513 -size 38858 +oid sha256:9d87f7b70a1043231c213cc2e11c8d6aec03b49b24a7fce2261a865d16fd3146 +size 39008 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png index a1e27998fa..78ddf668e3 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:82f34129e77fb9e84c513a950b7c3d2e20af376f357135cd7bfec67ec0850b62 -size 38790 +oid sha256:4684ba74e78e6ed36ce3fa168ce50c3bd828d70e9bf54c9c3f8d8ddccf7e5d81 +size 38948 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png index fb02b6a6ed..c7db94c48b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cfa7cf1c8e98ecf02f00a20096e5edd5a720050dffd8a359335d479493b40f50 -size 40212 +oid sha256:e6a301bdb68740effd68841d5f4afab2ad211ff02fdf99828f9780bb43975709 +size 40361 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png index 1da1c133bb..8d2ee2032e 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_15_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8f5be262e881a33b9ad1425164ff8424ca72e12a276918f173fd3ff5cffb9ed5 -size 40555 +oid sha256:7cdd7dce0071f305c82c4a084a8d6112fde6ee79c0e347109edba61baddebeb6 +size 40714 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png index 645a7ac9f4..58f6776089 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:dd555ca1156752b9d07d808702c2e7bb04af00bf8240947e1cb4a7ffdc4814a4 -size 39066 +oid sha256:548a7a2b247dca3a454951d168eb30a8fdce2d1c0c5de77ee7e623e3a2355b3d +size 39235 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png index 99451027b5..e1dccc7bc3 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8630ba0169ecb20ed5076623fc9a6bfab6d30c75c8040958fcbe3663661f5cf1 -size 38502 +oid sha256:1131ffbf59970257df26ba42bf2a5612398a7b62393c41753e84af0fe1a61af2 +size 38648 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png index 9647ec0023..68b81c731a 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_18_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57d4c23cf1f13899370c0bf0c99e23b0113039dd50a8fdbc1706df7691943044 -size 37354 +oid sha256:6922b04770ab6805693ef7fe9f0c5ddd93afdceb2725b3b1b795c6ab8c10d136 +size 37520 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png index b786e48fd2..f1f356e0a1 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_19_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9256ef115348a6fbcdc5bd275c7dd97c5018b890104c1074b65d0eef6d2ca319 -size 37334 +oid sha256:ffccceb346d0c768fa98e233701058fa5b73f480f6390b26dbbf2ab7240511ad +size 37525 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png index 9114e9a598..211d398cdb 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9c4a343ba9e0a8a6c75eb9cc54c4fbd460606de184c8078242a4e06eef7c3304 -size 34641 +oid sha256:3abf55145dd71a1f511ebb07b7481f4538eeb2730bf3a23d83e4dbd2fbd5100d +size 34829 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png index 449946c634..bc377f0cf3 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_20_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef52fdbd2ed8efdf526efe2fab402d7100952522b7e01023ec73e10415e27700 -size 39183 +oid sha256:c5137c3539f68dd9d501d8745645847304ca40a58517baa4d4fc21fc99702520 +size 39382 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png index b10f7d38d0..8a5000cdf7 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_21_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0215a5c510ebd2b99176525f7f317654e3c3b2fda4f5599c63b589f5c6286efc -size 38951 +oid sha256:c6a26f7ac512ab192f0b022bf59ade1c0275b34943e4c06016d873ee6dc1b49e +size 39107 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png index 5fd4e0e5ca..1ef2d75e9f 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_22_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bf37f6deee46b8949ab91e88c49811013876307009b9c84ffaefd8229034a26a -size 38837 +oid sha256:3b8cfb69cf931f52a5110b08b262cfe943e82cc95d10afb5c3126acdd6908055 +size 39002 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png index 96f469822a..28bf4f49dc 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:569c1c17bae3b57d21f04d9ffec1ee91f7bae1ee773e75e7418850e9f83f3281 -size 32286 +oid sha256:9e086cdd74b0f4620ab8e1fd026792e91365f6d71b246d7f34688f55f29e9d91 +size 32270 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png index 557f249715..1bcec82516 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6db7bc187b92d8fda605212e54168649f1385f7fd5d938496510289cbbdcfe63 -size 30729 +oid sha256:af53108a51bba6dd19f89d416a513a014dc93709bb92e84f1a97a3936e9a656b +size 30989 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png index 240291e5da..c02a47d24c 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8be6501b50d413f75e860bd04f03803cc13965a991e7d64019e1a7e39a0bbf2b -size 37416 +oid sha256:250ec00454674d1a240eb1189586bb313f61950d8bf736d6812208c0c49c223c +size 37459 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png index 7ee59b0d02..2dd2e61820 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c56e98e7ff452bd15b7a635d748815b1c8dd5490b9309e09a93a3cd4832db660 -size 37066 +oid sha256:446b9f6e5b9fd3ead36ef3983eec7445fb647b28719ac37ea42911a34ba639d8 +size 37236 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png index f30bbd9f27..f3b24f79b7 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a10328f429081b196dba40ae60a6100f2489a60a2aab37388deb645549fadfcb -size 31485 +oid sha256:de8a33b55900579b94ba7201a924a35e0d64a7c231591743386f3653f334f3be +size 31516 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png index ea46034c38..35b64abb88 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cb772e96c733fddf80ba6dda94039d971b1541a39ae349b3736e1a272f0857b2 -size 39440 +oid sha256:8c15274bfe393b43066b7885e300b8fbeba83993d4ada34c260cb41fb6425476 +size 39555 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png index 00e9e79aa4..5af1e44f46 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cbdce666db6f4fb2a35f854b3e3c652dbbf4c0ba798aff3f5f7bfe0da4510950 -size 38841 +oid sha256:69cb1432c2fdcf5b9f29774baa8cd5d628a76feee10fda86e3aeb284078a108f +size 39005 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png index 7530f500f9..5d0b8251fa 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetailsDark_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d9fbc551023fce72f97c6f562306e80e4e43bf83ed35ddbfcd86a1a3053c1545 -size 38936 +oid sha256:cf9e568b617a863fc2c4ad221f6453a739a385867e30cb2f813c55964fd27646 +size 39153 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png index f63ae1fe95..ffea1c96ec 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3b7a58ad7ba5f3a81f0b06a9f464f91ec3b4b39fea3e4db6657bb9bd43f80321 -size 41501 +oid sha256:bdc91adbd0eafe0ca75381cf1362e4421c12b9871efc558f8203fba43b119e84 +size 41670 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png index d292c67bfc..b17010db4a 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f92b85722afbc65a584f6e6f064fe6b3b38a888965d97c569c727253f4cc7d7 -size 39519 +oid sha256:4078a0609c3b9c45307bbe5d2a1dcf8aedbcd58e3fefa24c0d1ae4156702ad49 +size 39733 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png index f36d741372..04927b495b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_11_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:77e3e9dd2ec03e1a4a988e25a8a094d96296149ce7b6dc1d319c71b84dabfb2f -size 39357 +oid sha256:7ef80e3950422cb5ea2cbbf4822d3a34229286719cb0d43159f6d252eaed5cf7 +size 39515 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png index 069df089eb..af9e54e79a 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_12_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8c182019343e29d186a1f2a7551f82573999a26d12c77c10ee2563aee44045d9 -size 39893 +oid sha256:e17a12f4586b3b6f57a99a0dd6a26e5b6029bcac995ee6f70c9047f913708242 +size 40060 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png index d8d659411d..048c1037ba 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_13_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85e5490ba14a46176971c2c23eec05d352e871463eed9241862faa9929c11188 -size 39837 +oid sha256:fd6ec055f0139812c8b0ab9017526760706d5ee7ba29aedc9e292e8286994687 +size 40004 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png index 01041d80be..00c3a5cf5b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c07ef87165b3f4e13108882f108cd3f217f3c6f8930c703b8909f431b2a9ed2a -size 41337 +oid sha256:3a443622d261092af01abe5717ba1e52b06ab5e46c5428d21523b57c6dd76738 +size 41511 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png index 5a90de8c66..964d90da1f 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_15_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19dbd2929dda9108118ede7627241db2249f8ab7a062f17bdc3619ff42253594 -size 41768 +oid sha256:20fd55f968c30945318e80f2c003c67c02d7495b661475087fc0b0e724210f84 +size 41940 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png index 3d2700e9af..e099e70827 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c87ff2cbbe4d5912cb17fccfe5fa7614d5260b43ada3b952dedee57a3c004cbb -size 40117 +oid sha256:25ec51f2100062e64501a88595a4f4ca7a8ab2e70aaf18ce65df49fd444b81ad +size 40303 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png index 10b75e049f..21cfb86dab 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_17_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:77359209da8ffbdd933d123a1a6952da961c75b3ca6a70b6d49ee9be188fca7c -size 39670 +oid sha256:27a90a335b3ea802a72e6157493b2aa3f8e131a9de39e88a3cad6843f1f4c038 +size 39833 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png index 4cbe816fd3..ca593f67c9 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_18_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7190a790a208709d20691052ea3de64a359e7ca16d8a988d0ef62b33a64da3f -size 38756 +oid sha256:72bbf2ec4beb1b9cb526d47013773b26267ac2e019c218cf81231f86cca6b13b +size 39164 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png index 8eeffdbcf1..781c3c3aa6 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_19_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15458edded2d32980c16163e6674d714d67442a2421d0af73594590cf6f144d3 -size 38718 +oid sha256:e93f90d704f810f2cd0ddc82170e429c53d09039a39c45d2177e431f1c3e683c +size 39102 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png index c4c2f1822d..76bbb7afe4 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:13ac1bdcdacb72bd268cf00e8e754f5746928723891fe1f70277daa46f67ef1f -size 35720 +oid sha256:8ee504b49e9b7595feeff6a2cb7e96a581ae39cf096732fff9b8eedaf2779ccd +size 35959 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png index c70dbc195d..bfcb5051ef 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_20_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4b9ca327302ed396498c60db4341c78e3d48079e04bfdbb4ce8f024e82684f8 -size 40307 +oid sha256:8cfc4b97ed57ae7bf2f54ab574cd82b3190fcc2bc6873447a5d1fbe63e374b73 +size 40418 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png index 3a06126d05..ffb83196e8 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_21_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f4c7a00882958b916e99ef643cd698229f8659fb8f21e4e2b86db1432362f508 -size 40007 +oid sha256:8a1aa73c2c4316ce86d8d657d563d146080bfb81e120328b512cef714e57d340 +size 40176 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png index e6ccda4710..c1d344c706 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_22_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a9bab5037912d2bdeb85ed013e169d98f5f7333c274430d69667e32dfc72c1fa -size 39880 +oid sha256:616d6eeae9be6af14620508ad4ac835e6651537b8656b556624b062c89e84ae8 +size 40064 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png index 0f9431284b..bfc5a1bdd1 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c074ba644aa7ab073e2b1893a2f82a8e11eb479e8f50ab9cbd6e991709cc5d5e -size 33376 +oid sha256:1804ad3cea84565e84944959c9d57faa546e8f2ddefe59998c9dae352951d72d +size 33392 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png index 56cfd78cd6..347ca6f537 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a07f005c828af6a622527a062e6cd2d8f4120ed4ac4a63daf675cfaf1b36da11 -size 31486 +oid sha256:89a7d8046a9206a5bb0d5969eaf406fc1a4922d47871782b3e153fb7859ec36f +size 31928 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png index f82973cda9..97cfa26a7d 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee239549a179ce7678494cc20b32db88a211bba1f6368ba17fa1b18ca3400810 -size 38586 +oid sha256:e3b592944d49fa32a35042fada1a6fe7ccc64fac066c14214a351ac922dcb860 +size 38524 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png index a37eaa2ae6..0cbdcde004 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b56916b6d08aa4fcf55ee414ae928946d5a2bc5eeb610f9ec4ac86cf783aa11e -size 38429 +oid sha256:5500501d34b1cf5db3b68b0c620e915fe882536d5cede2bc920de05ca43100b6 +size 38825 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png index f305d86263..25545ffdcc 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b576b33a5c3bedaa8d1e7df6e95541730559c8149f5a0d920c9245449b33c26d -size 32616 +oid sha256:f7f6d55c95501d8c8259a4318f7897f11f5e0effd53f37b441a7adfd409935d3 +size 32822 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png index 964ccd2680..a32798b98b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a7b1c29bca9904fc55d17356c27a8dbe035e1fbbf0ffa27ee2b466cf1558c418 -size 40573 +oid sha256:ff81f7a43722314cedd1d4fc271d994002502141fab672d5d1d142403eaf4732 +size 40714 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png index 2ced0a9e17..37ec51d503 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8ad0f0df59f4231bd85a0ae99ad6eccb74b338975353a201f434e5047fd58628 -size 39963 +oid sha256:b8776b535fa481298d2b3e29621174048b42590a9a4f8a2aaf644dc020bd08eb +size 40131 diff --git a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png index 9e24db9017..951615ddbd 100644 --- a/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roomdetails.impl_RoomDetails_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:616b6050ca126b0630b5283901afe4096f7d041a40a5d6ae8e64ff808f2d4e7d -size 39971 +oid sha256:f2ce271672bcae59e254facedf7fdfe7f71ae21f9f3a147fe9657d2943281bcb +size 40165 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en.png index 202f8a06db..60997dceec 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:75880628a454ca00a186e5d1c5438117e7af4ab9b23eb6fbf9c9696210234169 -size 17246 +oid sha256:bc0c611e5c552906b26adda91bd3601f34fc190860a1b1368b0e1c9b0835c9eb +size 20056 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en.png index 9186ac2de4..f646e0ee30 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1fe61c20e2c6a7bb72e82aefd546469dfc49bf736b6d12f4c1927628df1bdb3e -size 20211 +oid sha256:03e68ff235e90c659a3a15d26f3ede94aa169fd7142eabc19b5511047577df93 +size 22912 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en.png index ca8464fad9..51dd1fea52 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ca3ee9a09bbbc69f2ba7e8b40cdc5196cc53745fe3222282d98bcf948dc16745 -size 22596 +oid sha256:baa29dce32895f21a4799a47a62e7152c99d56fc22a3882ac7da7f005a3532f2 +size 25259 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en.png index 945743ff26..72bc2e1d8b 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96971a8981aea8918c01827403933c9e75275a2fda92716f803e6f28ad284bae -size 22702 +oid sha256:e02e039a0586a8f36c00d4e237885a55713040036b4481f0626beb2b3b8ea161 +size 25365 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en.png index c1b0c4ff1e..834857696d 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bc96eec2d61713f01d43c92812bbf27bc44a202ce55f0fa1dc8e8659dabcfcf2 -size 16347 +oid sha256:38d2e1c53d09debe38dbd49a058f3612c4a6cc4d3a604f53f86d0db29f0efecb +size 19047 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en.png index 16b567164c..778f0c8209 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:56c4df7da32b71dca109a1db1f4a797a2930e3b42c00eb51d72f0e1f5b99bf48 -size 19200 +oid sha256:4680eb47d53ea43ba48e4164ad819278fd8844e24f77badee742aa4e8ddca452 +size 21859 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en.png index ec10d3fd8a..1bcdbbd146 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:592c6ec197b193803679eee5df7769fa4858fe883a2f3a1294f39ad87f9f4ff1 -size 21610 +oid sha256:d07c9ab2a4bea18c3604675225d23b0d4dfa41d16676eba821adcbcc619bdabf +size 24246 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en.png index 5ff44ac3a4..9a97f2911f 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:62e99b8070a394ea5b2d666f3a8abf0fe41ea4a34a382223903f2de4085195dc -size 21710 +oid sha256:e596a8cda9c1054b5f780798fd455a004acb1b848bc21069e415dc700a106b10 +size 24337 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png index a141a26bce..2a90fdd71b 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3ceaeb4841d4d480fd66d1014dd0f1257fe7c40db3a66cf18f0ff71d7ef79b9d -size 24170 +oid sha256:26a21536fcc98041b4c349498f126da520251e57b601f0f5943225c191d00910 +size 26241 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png index ba0aee9b41..649da85f0e 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSectionWithVerificationViolation_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bcba7790fd7f16a1f0db0dc248a8ce895534c1a5155b96f4877b2137ec5a6412 -size 23456 +oid sha256:84a13525255fc639f817d1ef8dacef0dcfd48c2d72bab309175f99ccd56a34cd +size 25903 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png index cf5c451505..809e2624f6 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d09796f261ba9552fd94f595467a958ff7cf7113c3ca23117128cdf76f729e43 -size 15808 +oid sha256:326840103b3ad46a5d80c80c5cb58604d0c561dc484cdd505ae837ff4cf71bad +size 18632 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png index 09475dd0ac..39e2b34bda 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileHeaderSection_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:49216216b3078897afd41a04c3eea2d82cc89d13390c2f61ef8045b84ad69e6f -size 15253 +oid sha256:dc027c17c7e4b41774ba20b39b38fd98fc7199b41ea7610ec01b184c4bf9ec99 +size 17925 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png index 1e86845bc2..fc6d33f7f0 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d705422db764094ca6e92ace3cb61eb7b855a9bc1fb37e840b8a886b5306e181 -size 23994 +oid sha256:413a3f42ad23bbab9a920128950b40f9eac5ef9248fd5ca164b838b7d10d9cdc +size 24062 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png index 6f74640f03..c5b576ef74 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:197ce66690463abeed16142edb0a212d5e49f2ef1df1233a3d6a0fd9d5153f2e -size 21772 +oid sha256:5893b1d1b8851d26d3bdb12f6b68954d03c9234d4ebf0ced6aff13b155595f83 +size 21828 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png index 3419a50b07..f255914d84 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9973d9a9fa00d362eae8f50c2936e5ae0adc2653b4671413b856c1e73538eb73 -size 24261 +oid sha256:ba293e027a30171d36aba06bbead8b616c706822fefea912b1f4beb9a3985da0 +size 24290 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png index fca3f7ed9b..43b8414534 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f707615c108e66cda3ccac1f70f6b1f6909ac88f4e8c43b86062ac11d7ad3f27 -size 36171 +oid sha256:a233930f23a1ffd82b9c48a3106218de88df49ef785b252ba1844a126c7eddd9 +size 36159 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png index 45e42c6ad0..51a45218fc 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6a2a849c7335452fc79215f4fc1c50ca606d491879cd6ec6b265e4f443f665e -size 27706 +oid sha256:2583c6fca6d7528b7bb8ea2eb3d82e012b970ef7b024c5bbeefc1c4973794e32 +size 28715 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png index 7e6ca5d507..2d7523e28c 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4a4154169fd6e74358001ecc151a0cb4635423bf4a0b2d72f1d5bb12dfb0ea95 -size 22446 +oid sha256:94b86f639e03998bd47b423f0c90dbb9767165cd2905a700b5ed29ecfa63d525 +size 22496 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png index f7ee67c10a..1b3752626a 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b3e9e3da0ba44d070fbc0e434be2c52dc0391eda581792b227587cb4d16997a2 -size 22945 +oid sha256:9848fa1e1af5dd63be1f6df0375627efab136fbada1c6afb7aa058db697f245b +size 22284 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png index 1c84803007..356db152ec 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fa809d53b1ad821c047fabc9b655e47150e201941e004d5b8f769a0ebe1a2b74 -size 26629 +oid sha256:db9f567fdf457f2ce5072c0c848ad48942f92f5af96c7d0f144d4e12fd651e6e +size 26688 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png index aef669fae0..805f752c50 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:781bf8c86e88c9ee564f45de7446ee2eb554efe68ae9e708aa1b5bde7fce6d6b -size 34137 +oid sha256:5fa1c110fa0804eb0363cf6c9631ed5664a547e2213eb76c211b7d11194c64a0 +size 33532 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png index d30cff8678..bd9cb74dc5 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85b62859396f9c34ee7bbb4166d6f030474bd750b043c7bc1f14eb6e75e613d6 -size 32374 +oid sha256:e87058ca16fa51807d79a8112aa3c105957c9785ae057686a92403133a556c2c +size 32353 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png index c3e2d149b3..3b4a36e777 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fb347c3b537220d85af8e6473dac0e7658b2104cc4a1746a8019265f8085947 -size 23379 +oid sha256:33356c2a7ba816a0a6920e50eb8bf20212a062d11d6ba117923c9ea973d171d8 +size 23455 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png index 95e144b3f3..ce6861e02c 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7378680765db7cf811b1ba3c7901cb954765794cc741454bf31b4418c5f77da0 -size 21317 +oid sha256:c4d8861aae54ab13cc8fdba1d506b8bb682fc41bf05584db55ca8fce688ef240 +size 21435 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png index 224210123e..097e96258f 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e28754f90d584c329a5e3c51eba89c166320c69fda309b6b06b6f5ee9c74c1b2 -size 23549 +oid sha256:e42a2617242df3e2dcad13ca623ef2a2f60fd133a2da287a49255808cf31ff4e +size 23640 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png index 0c63f7b2c5..34304b7884 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0d88762c47be041fa9978b987f3a1226c55d711e8eab1a68c7c1fed72bc4a0ac -size 33925 +oid sha256:3acb94720610f1a0ea9a1861a091109b1fb9555b09faf432fb1bd702f5c81320 +size 33946 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png index b7c5aa9fa2..cc712188d9 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:24310edc91b912416a1c20240bfce6a5a14165fe9c77f2123a35a9148e2ea50c -size 25833 +oid sha256:490fcf83d06592f39d88906b445aa826f6f4c0d0735e7fd8187b1eada5474d79 +size 26981 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png index 408be83664..2056976aac 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3b815d4cf8ed95cb983072d75419637c10bd4808ddfbf14865409d0a4fd64c37 -size 22070 +oid sha256:89b989f3c910c24270a09e2804e9e5bf1901d0247d00f7abc6045f394acb7dfa +size 22030 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png index d945d1c6f8..981ac8e6a6 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:85a6cf5a532ecbcfc07cc4a6e3bfa2370f7a401c357aa1e251bb15f7cd8611ba -size 21672 +oid sha256:25496e6505e3905108d74bbd0d299576a24d1a40e78107b0780f50a5ed1617ab +size 21065 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png index 46417d9248..43a79d0897 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b6f0f76fd0bb0f6f8dc9532c801d86e7574e53a62e828400c2fcfcf5fe9fe29 -size 25880 +oid sha256:e29852c6193c1fdac9b81629844d32399d8e8451e1ec7ff1f5185904a2eb2361 +size 25947 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png index 3c90a4f7ef..c3527328e3 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_8_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:45c706bb63ab7df8e66898ec67fabbf8c227cac421b8c5eda84a2f6532c8f199 -size 32504 +oid sha256:2446d1ac74dceba5fc64507eea199773549dc65769aa8950fb88cdf411046abf +size 31858 diff --git a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png index 2021017f88..3b411f6e37 100644 --- a/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.userprofile.shared_UserProfileView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c382fc5a53d664ce6fd78e1187be311cd8675a75a217992ad21bbc943139d8a0 -size 31438 +oid sha256:92b56ea3b119795c4d4f9b4a8f430a5ddac400f87651419e35d1668c90833e13 +size 31285 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png index 32ed8ebc5e..185aeb6a20 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef82fb23d7da19f1c3f37c3fbd1472f138a8edb27c307072cebb3b2444c239ae -size 46245 +oid sha256:e7b042410cfc2999e599534c263abd27ef43a64444e90aeed3a45a72ec8f0a15 +size 46735 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Day_2_en.png new file mode 100644 index 0000000000..0a34d0b390 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3ecf110c258f4ec5fd5d2a4126395e248d73d894afd54a0135dc710f680c0ee +size 12395 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Night_2_en.png new file mode 100644 index 0000000000..58a30a7304 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserHeader_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bc66cd4269ee462103e77bfa24723a740d8a91dc7e06ca808b8109e74d1784f +size 12127 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Day_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Day_2_en.png new file mode 100644 index 0000000000..181261b486 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Day_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e685aef8bc10159ba5cde38217382b3b33273bb04bf3c7e8dda392a0612d8a20 +size 10460 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Night_2_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Night_2_en.png new file mode 100644 index 0000000000..a13027690a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_MatrixUserRow_Night_2_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff742cfbc02f4a728a034e7cb3f161c98d706f5c05d8032cb8e3bb1d9e52a646 +size 10242 From 2152552daad1d0282c988f958c31ae1c435d69a5 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 16 Jul 2026 20:04:53 +0200 Subject: [PATCH 11/24] Add displayedStatus parameter to test fixtures for user status --- .../features/home/impl/model/RoomListBaseRoomSummaryTest.kt | 5 ++++- .../android/libraries/matrix/test/room/RoomMemberFixture.kt | 3 +++ .../android/libraries/previewutils/room/RoomMemberFixture.kt | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt index 63f1ecebd7..0e00f43712 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/model/RoomListBaseRoomSummaryTest.kt @@ -12,6 +12,7 @@ import com.google.common.truth.Truth.assertThat import io.element.android.libraries.designsystem.components.avatar.AvatarData import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.room.RoomNotificationMode +import io.element.android.libraries.matrix.api.user.DisplayedStatus import io.element.android.libraries.matrix.test.A_ROOM_ID import io.element.android.libraries.matrix.test.A_ROOM_NAME import kotlinx.collections.immutable.toImmutableList @@ -87,6 +88,7 @@ internal fun createRoomListRoomSummary( timestamp: String? = null, isTombstoned: Boolean = false, isSpace: Boolean = false, + dmUserStatus: DisplayedStatus? = null, ) = RoomListRoomSummary( id = A_ROOM_ID.value, roomId = A_ROOM_ID, @@ -109,5 +111,6 @@ internal fun createRoomListRoomSummary( isDm = false, heroes = heroes.toImmutableList(), isTombstoned = isTombstoned, - isSpace = isSpace + isSpace = isSpace, + dmUserStatus = dmUserStatus, ) diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomMemberFixture.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomMemberFixture.kt index 33a1b68ba3..1a19eddba0 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomMemberFixture.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/RoomMemberFixture.kt @@ -11,6 +11,7 @@ package io.element.android.libraries.matrix.test.room import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.api.user.DisplayedStatus import kotlinx.collections.immutable.persistentListOf fun aRoomMember( @@ -24,6 +25,7 @@ fun aRoomMember( role: RoomMember.Role = RoomMember.Role.User, membershipChangeReason: String? = null, isServiceMember: Boolean = false, + displayedStatus: DisplayedStatus? = null, ) = RoomMember( userId = userId, displayName = displayName, @@ -35,6 +37,7 @@ fun aRoomMember( role = role, membershipChangeReason = membershipChangeReason, isServiceMember = isServiceMember, + displayedStatus = displayedStatus, ) fun aRoomMemberList() = persistentListOf( diff --git a/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/RoomMemberFixture.kt b/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/RoomMemberFixture.kt index 6fe6e82fa7..e835075d81 100644 --- a/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/RoomMemberFixture.kt +++ b/libraries/previewutils/src/main/kotlin/io/element/android/libraries/previewutils/room/RoomMemberFixture.kt @@ -35,7 +35,7 @@ fun aRoomMember( role: RoomMember.Role = RoomMember.Role.User, membershipChangeReason: String? = null, isServiceMember: Boolean = false, - userStatus: DisplayedStatus? = null, + displayedStatus: DisplayedStatus? = null, ) = RoomMember( userId = userId, displayName = displayName, @@ -47,7 +47,7 @@ fun aRoomMember( role = role, membershipChangeReason = membershipChangeReason, isServiceMember = isServiceMember, - displayedStatus = userStatus, + displayedStatus = displayedStatus, ) fun aRoomMemberList() = persistentListOf( From 3fdd6be832fefd3c88383e02f8f93dc4d23e1b2a Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 16 Jul 2026 21:26:23 +0200 Subject: [PATCH 12/24] Extract dmUserStatus helper for DM user status resolution --- .../impl/datasource/RoomListRoomSummaryFactory.kt | 3 ++- .../features/messages/impl/MessagesPresenter.kt | 3 ++- .../libraries/matrix/ui/model/RoomInfoExtension.kt | 12 ++++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt index 232a21e42e..96e9f9344b 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/datasource/RoomListRoomSummaryFactory.kt @@ -21,6 +21,7 @@ import io.element.android.libraries.matrix.api.room.CallIntentConsensus import io.element.android.libraries.matrix.api.room.CurrentUserMembership import io.element.android.libraries.matrix.api.roomlist.LatestEventValue import io.element.android.libraries.matrix.api.roomlist.RoomSummary +import io.element.android.libraries.matrix.ui.model.dmUserStatus import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.toInviteSender import kotlinx.collections.immutable.toImmutableList @@ -76,7 +77,7 @@ class RoomListRoomSummaryFactory( }.toImmutableList(), isTombstoned = roomInfo.successorRoom != null, isSpace = roomInfo.isSpace, - dmUserStatus = if (roomInfo.isDm) roomInfo.heroes.firstOrNull()?.displayedStatus else null, + dmUserStatus = roomInfo.dmUserStatus(), ) } diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt index 85c61f2131..712413c9f4 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt @@ -83,6 +83,7 @@ import io.element.android.libraries.matrix.api.room.powerlevels.permissionsAsSta import io.element.android.libraries.matrix.api.timeline.Timeline import io.element.android.libraries.matrix.api.timeline.item.event.EventOrTransactionId import io.element.android.libraries.matrix.ui.messages.reply.map +import io.element.android.libraries.matrix.ui.model.dmUserStatus import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.room.getDirectRoomMember import io.element.android.libraries.recentemojis.api.AddRecentEmoji @@ -319,7 +320,7 @@ class MessagesPresenter( appName = buildMeta.applicationName, pinnedMessagesBannerState = pinnedMessagesBannerState, dmUserVerificationState = dmUserVerificationState, - dmUserStatus = dmRoomMember?.displayedStatus, + dmUserStatus = roomInfo.dmUserStatus(), roomMemberModerationState = roomMemberModerationState, topBarSharedHistoryIcon = topBarSharedHistoryIcon, successorRoom = roomInfo.successorRoom, diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/RoomInfoExtension.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/RoomInfoExtension.kt index 3a03d8329b..cf5ac37d74 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/RoomInfoExtension.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/model/RoomInfoExtension.kt @@ -13,6 +13,7 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarSize import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomInfo import io.element.android.libraries.matrix.api.room.RoomMember +import io.element.android.libraries.matrix.api.user.DisplayedStatus fun RoomInfo.getAvatarData(size: AvatarSize) = AvatarData( id = id.value, @@ -45,3 +46,14 @@ fun RoomInfo.roleOf(userId: UserId): RoomMember.Role { val powerLevel = powerLevelOf(userId = userId) return RoomMember.Role.forPowerLevel(powerLevel) } + +/** + * Return the [DisplayedStatus] of the other member in a DM. + */ +fun RoomInfo.dmUserStatus(): DisplayedStatus? { + return if (isDm) { + heroes.firstOrNull()?.displayedStatus + } else { + null + } +} From 7935dc2ac7461d38e1e1ab103123d512d001d1d5 Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 17 Jul 2026 10:13:33 +0200 Subject: [PATCH 13/24] Restore disabled-state color on UserRow AnnotatedString overload --- .../io/element/android/libraries/matrix/ui/components/UserRow.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt index c0a7e969ff..fba2f606e3 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/UserRow.kt @@ -46,6 +46,7 @@ internal fun UserRow( text = name, maxLines = 1, overflow = TextOverflow.Ellipsis, + color = if (enabled) ElementTheme.colors.textPrimary else ElementTheme.colors.textDisabled, style = ElementTheme.typography.fontBodyLgRegular, ) }, From 9c3fe5ad230d913fe642af9510aa5053cb49826d Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 17 Jul 2026 10:13:37 +0200 Subject: [PATCH 14/24] Drop mutating setter for MentionSpan trailingText --- .../libraries/textcomposer/mentions/MentionSpan.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt index 6442b70a42..937561e2a5 100644 --- a/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt +++ b/libraries/textcomposer/impl/src/main/kotlin/io/element/android/libraries/textcomposer/mentions/MentionSpan.kt @@ -46,9 +46,7 @@ class MentionSpan( private set var trailingText: String? = null - set(value) { - field = value?.let { " $it" } - } + private set /** * Updates the visual properties of this span. @@ -101,7 +99,7 @@ class MentionSpan( textPaint.typeface = typeface // Measure the full text width without truncation measuredTextWidth = textPaint.measureText(displayText, 0, displayText.length).roundToInt() - measuredTrailingWidth = trailingText?.let { textPaint.measureText(it).roundToInt() } ?: 0 + measuredTrailingWidth = trailingText?.let { textPaint.measureText(" $it").roundToInt() } ?: 0 return measuredTextWidth + measuredTrailingWidth + startPadding + endPadding } @@ -140,7 +138,7 @@ class MentionSpan( trailingText?.let { val drawnTextWidth = minOf(availableWidthForText, measuredTextWidth.toFloat()) - canvas.drawText(it, x + startPadding + drawnTextWidth, y.toFloat(), textPaint) + canvas.drawText(" $it", x + startPadding + drawnTextWidth, y.toFloat(), textPaint) } } } From b9831734a0af0e8672dfe7b6765a0b24ff64b32a Mon Sep 17 00:00:00 2001 From: ganfra Date: Fri, 17 Jul 2026 10:13:45 +0200 Subject: [PATCH 15/24] Take DisplayedStatus directly in DisplayNameWithStatus and always show emoji --- .../features/home/impl/components/RoomSummaryRow.kt | 3 +-- .../messagecomposer/suggestions/SuggestionsPickerView.kt | 7 +++---- .../features/messages/impl/topbars/MessagesViewTopBar.kt | 3 +-- .../matrix/ui/components/DisplayNameWithStatus.kt | 6 ++++-- .../libraries/matrix/ui/components/MatrixUserHeader.kt | 5 ++--- .../libraries/matrix/ui/components/MatrixUserRow.kt | 3 +-- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt index 286576e344..2a21518e83 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomSummaryRow.kt @@ -67,7 +67,6 @@ import io.element.android.libraries.matrix.api.user.DisplayedStatus import io.element.android.libraries.matrix.ui.components.DisplayNameWithStatus import io.element.android.libraries.matrix.ui.components.InviteSenderView import io.element.android.libraries.matrix.ui.model.InviteSender -import io.element.android.libraries.matrix.ui.model.toEmojiText import io.element.android.libraries.ui.strings.CommonStrings import timber.log.Timber @@ -233,7 +232,7 @@ private fun NameAndTimestampRow( val displayName = name?.toSafeLength(ellipsize = true) ?: stringResource(id = CommonStrings.common_no_room_name) DisplayNameWithStatus( name = displayName, - status = dmUserStatus?.toEmojiText(), + status = dmUserStatus, modifier = Modifier.weight(1f), style = ElementTheme.typography.fontBodyLgMedium, nameColor = ElementTheme.colors.roomListRoomName, diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt index 9cc76b2458..d19061d8ed 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt @@ -43,7 +43,6 @@ import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMembershipState import io.element.android.libraries.matrix.ui.components.DisplayNameWithStatus import io.element.android.libraries.matrix.ui.model.getAvatarData -import io.element.android.libraries.matrix.ui.model.toEmojiText import io.element.android.libraries.slashcommands.api.SlashCommandSuggestion import io.element.android.libraries.textcomposer.mentions.ResolvedSuggestion import kotlinx.collections.immutable.ImmutableList @@ -120,8 +119,8 @@ private fun SuggestionItemView( is ResolvedSuggestion.Alias -> suggestion.roomName is ResolvedSuggestion.Command -> suggestion.command.command } - val statusEmoji = when (suggestion) { - is ResolvedSuggestion.Member -> suggestion.roomMember.displayedStatus?.toEmojiText() + val status = when (suggestion) { + is ResolvedSuggestion.Member -> suggestion.roomMember.displayedStatus else -> null } val details = when (suggestion) { @@ -156,7 +155,7 @@ private fun SuggestionItemView( title?.let { DisplayNameWithStatus( name = title, - status = statusEmoji, + status = status, style = ElementTheme.typography.fontBodyLgRegular, nameColor = ElementTheme.colors.textPrimary, ) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt index 67fb07e4d2..2daa90af53 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/topbars/MessagesViewTopBar.kt @@ -51,7 +51,6 @@ import io.element.android.libraries.matrix.api.user.DisplayedStatus import io.element.android.libraries.matrix.ui.components.DisplayNameWithStatus import io.element.android.libraries.matrix.ui.components.aMatrixUserList import io.element.android.libraries.matrix.ui.model.getAvatarData -import io.element.android.libraries.matrix.ui.model.toEmojiText import io.element.android.libraries.ui.strings.CommonStrings import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf @@ -163,7 +162,7 @@ private fun RoomAvatarAndNameRow( ) DisplayNameWithStatus( name = roomName ?: stringResource(CommonStrings.common_no_room_name), - status = dmUserStatus?.toEmojiText(), + status = dmUserStatus, modifier = Modifier.padding(start = 8.dp), style = ElementTheme.typography.fontBodyLgMedium, nameColor = ElementTheme.colors.textPrimary, diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/DisplayNameWithStatus.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/DisplayNameWithStatus.kt index 7c6e5854da..627b892fc5 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/DisplayNameWithStatus.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/DisplayNameWithStatus.kt @@ -21,6 +21,8 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import io.element.android.compound.theme.ElementTheme import io.element.android.libraries.designsystem.theme.components.Text +import io.element.android.libraries.matrix.api.user.DisplayedStatus +import io.element.android.libraries.matrix.ui.model.toEmojiText /** * Component to display side by side a display name and an optional status. @@ -28,7 +30,7 @@ import io.element.android.libraries.designsystem.theme.components.Text @Composable fun DisplayNameWithStatus( name: String, - status: String?, + status: DisplayedStatus?, style: TextStyle, modifier: Modifier = Modifier, nameColor: Color = Color.Unspecified, @@ -52,7 +54,7 @@ fun DisplayNameWithStatus( if (status != null) { Spacer(Modifier.width(4.dp)) Text( - text = status, + text = status.toEmojiText(), style = style, color = ElementTheme.colors.textSecondary, ) diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt index 3132fe1140..89b0532580 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserHeader.kt @@ -31,7 +31,6 @@ import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName -import io.element.android.libraries.matrix.ui.model.toEmojiText @Composable fun MatrixUserHeader( @@ -60,9 +59,9 @@ fun MatrixUserHeader( // Name DisplayNameWithStatus( name = matrixUser.getBestName(), - status = matrixUser.displayedStatus?.toEmojiText(), + status = matrixUser.displayedStatus, nameColor = ElementTheme.colors.textPrimary, - style = ElementTheme.typography.fontHeadingMdRegular + style = ElementTheme.typography.fontHeadingMdRegular, ) // Id if (matrixUser.displayName.isNullOrEmpty().not()) { diff --git a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt index 7fa4fe4557..9fc7ea7b4a 100644 --- a/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt +++ b/libraries/matrixui/src/main/kotlin/io/element/android/libraries/matrix/ui/components/MatrixUserRow.kt @@ -20,7 +20,6 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.matrix.api.user.MatrixUser import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.matrix.ui.model.getBestName -import io.element.android.libraries.matrix.ui.model.toEmojiText @Composable fun MatrixUserRow( @@ -34,7 +33,7 @@ fun MatrixUserRow( nameContent = { DisplayNameWithStatus( name = matrixUser.getBestName(), - status = matrixUser.displayedStatus?.toEmojiText(), + status = matrixUser.displayedStatus, nameColor = ElementTheme.colors.textPrimary, style = ElementTheme.typography.fontBodyLgRegular, ) From 471b80af18176b24b6fc3423c13b5fae8c324f86 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 22 Jul 2026 18:32:35 +0200 Subject: [PATCH 16/24] Fix duplicate string resources after rebase --- libraries/ui-strings/src/main/res/values/temporary.xml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libraries/ui-strings/src/main/res/values/temporary.xml b/libraries/ui-strings/src/main/res/values/temporary.xml index 2526f254d3..c704e811ff 100644 --- a/libraries/ui-strings/src/main/res/values/temporary.xml +++ b/libraries/ui-strings/src/main/res/values/temporary.xml @@ -6,12 +6,8 @@ --> - "Mark as read" - "Jump to first unread message" "Expanded" "Collapsed" - Allow access to local network - Your homeserver is on your local network. To connect, Element needs permission to reach other devices on this network. Active Inactive From e4f8139791a4c45ee90e4746702e07b177d8fe40 Mon Sep 17 00:00:00 2001 From: ganfra Date: Wed, 22 Jul 2026 18:19:12 +0200 Subject: [PATCH 17/24] Sync emoji picker translations from Localazy --- .../libraries/emoji/impl/picker/EmojiPickerView.kt | 4 ++-- .../impl/src/main/res/values-be/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-bg/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-ca/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-cs/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-cy/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-da/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-de/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-el/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-es/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-et/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-eu/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-fa/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-fi/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-fr/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-hr/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-hu/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-in/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-it/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-ja/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-ka/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-ko/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-lt/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-nb/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-nl/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-pl/translations.xml | 13 +++++++++++++ .../src/main/res/values-pt-rBR/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-pt/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-ro/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-ru/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-sk/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-sv/translations.xml | 12 ++++++++++++ .../impl/src/main/res/values-tr/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-uk/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-ur/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-uz/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-vi/translations.xml | 13 +++++++++++++ .../src/main/res/values-zh-rTW/translations.xml | 13 +++++++++++++ .../impl/src/main/res/values-zh/translations.xml | 13 +++++++++++++ .../emoji/impl/src/main/res/values/localazy.xml | 13 +++++++++++++ .../emoji/impl/src/main/res/values/temporary.xml | 13 ------------- .../src/main/res/values-ca/translations.xml | 1 - .../src/main/res/values-cs/translations.xml | 1 - .../src/main/res/values-cy/translations.xml | 1 - .../src/main/res/values-da/translations.xml | 1 - .../src/main/res/values-de/translations.xml | 1 - .../src/main/res/values-et/translations.xml | 1 - .../src/main/res/values-fa/translations.xml | 1 - .../src/main/res/values-hr/translations.xml | 1 - .../src/main/res/values-nb/translations.xml | 1 - .../src/main/res/values-pl/translations.xml | 1 - .../src/main/res/values-pt-rBR/translations.xml | 1 - .../src/main/res/values-pt/translations.xml | 1 - .../src/main/res/values-ro/translations.xml | 1 - .../src/main/res/values-ru/translations.xml | 1 - .../src/main/res/values-sk/translations.xml | 1 - .../src/main/res/values-sv/translations.xml | 1 - .../src/main/res/values-uk/translations.xml | 1 - .../src/main/res/values-uz/translations.xml | 1 - .../src/main/res/values-vi/translations.xml | 1 - .../src/main/res/values-zh-rTW/translations.xml | 1 - .../src/main/res/values-zh/translations.xml | 1 - .../ui-strings/src/main/res/values/localazy.xml | 1 - tools/localazy/config.json | 7 ++++++- 64 files changed, 496 insertions(+), 38 deletions(-) create mode 100644 libraries/emoji/impl/src/main/res/values-be/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-bg/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-ca/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-cs/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-cy/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-da/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-de/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-el/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-es/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-et/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-eu/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-fa/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-fi/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-fr/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-hr/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-hu/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-in/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-it/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-ja/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-ka/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-ko/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-lt/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-nb/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-nl/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-pl/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-pt-rBR/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-pt/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-ro/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-ru/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-sk/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-sv/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-tr/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-uk/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-ur/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-uz/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-vi/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-zh-rTW/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values-zh/translations.xml create mode 100644 libraries/emoji/impl/src/main/res/values/localazy.xml delete mode 100644 libraries/emoji/impl/src/main/res/values/temporary.xml diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt index 325f1d792b..94eaea1595 100644 --- a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiPickerView.kt @@ -41,7 +41,7 @@ import io.element.android.libraries.designsystem.text.toSp import io.element.android.libraries.designsystem.theme.components.Icon import io.element.android.libraries.designsystem.theme.components.IconSource import io.element.android.libraries.designsystem.theme.components.SearchBar -import io.element.android.libraries.ui.strings.CommonStrings +import io.element.android.libraries.emoji.impl.R import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.ImmutableSet import kotlinx.collections.immutable.persistentSetOf @@ -68,7 +68,7 @@ internal fun EmojiPickerView( active = state.isSearchActive, onActiveChange = { state.eventSink(EmojiPickerEvent.ToggleSearchActive(it)) }, windowInsets = WindowInsets(0, 0, 0, 0), - placeHolderTitle = stringResource(CommonStrings.emoji_picker_search_placeholder), + placeHolderTitle = stringResource(R.string.emoji_picker_search_placeholder), ) { emojis -> EmojiResults( emojis = emojis, diff --git a/libraries/emoji/impl/src/main/res/values-be/translations.xml b/libraries/emoji/impl/src/main/res/values-be/translations.xml new file mode 100644 index 0000000000..6b07d89e30 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-be/translations.xml @@ -0,0 +1,11 @@ + + + "Актыўнасці" + "Сцягі" + "Ежа & Напоі" + "Жывёлы & Прырода" + "Аб\'екты" + "Усмешкі & Удзельнікі" + "Падарожжы & Месцы" + "Сімвалы" + diff --git a/libraries/emoji/impl/src/main/res/values-bg/translations.xml b/libraries/emoji/impl/src/main/res/values-bg/translations.xml new file mode 100644 index 0000000000..465b88d91f --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-bg/translations.xml @@ -0,0 +1,11 @@ + + + "Дейности" + "Знамена" + "Храна & Напитки" + "Животни & Природа" + "Обекти" + "Усмивки & Хора" + "Пътуване & Места" + "Символи" + diff --git a/libraries/emoji/impl/src/main/res/values-ca/translations.xml b/libraries/emoji/impl/src/main/res/values-ca/translations.xml new file mode 100644 index 0000000000..eec4847ec4 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-ca/translations.xml @@ -0,0 +1,13 @@ + + + "Activitats" + "Banderes" + "Menjar & begudes" + "Animals i naturalesa" + "Objectes" + "Cares i persones" + "Viatges i llocs" + "Emoticones recents" + "Símbols" + "Cerca emoticones" + diff --git a/libraries/emoji/impl/src/main/res/values-cs/translations.xml b/libraries/emoji/impl/src/main/res/values-cs/translations.xml new file mode 100644 index 0000000000..899a4ab0da --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-cs/translations.xml @@ -0,0 +1,13 @@ + + + "Aktivity" + "Vlajky" + "Jídlo a nápoje" + "Zvířata a příroda" + "Předměty" + "Smajlíci a lidé" + "Cestování a místa" + "Nedávné emotikony" + "Symboly" + "Hledat emotikony" + diff --git a/libraries/emoji/impl/src/main/res/values-cy/translations.xml b/libraries/emoji/impl/src/main/res/values-cy/translations.xml new file mode 100644 index 0000000000..d2dc0d1f3c --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-cy/translations.xml @@ -0,0 +1,13 @@ + + + "Gweithgareddau" + "Baneri" + "Bwyd a Diod" + "Anifeiliaid a Natur" + "Gwrthrychau" + "Wynebau Hapus a Phobl" + "Teithio a Llefydd" + "Emojis diweddar" + "Symbolau" + "Chwilio emojis" + diff --git a/libraries/emoji/impl/src/main/res/values-da/translations.xml b/libraries/emoji/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..ae0e860608 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,13 @@ + + + "Aktiviteter" + "Flag" + "Mad og drikke" + "Dyr og natur" + "Objekter" + "Smileys og personer" + "Rejser og steder" + "Seneste emojis" + "Symboler" + "Søg emojis" + diff --git a/libraries/emoji/impl/src/main/res/values-de/translations.xml b/libraries/emoji/impl/src/main/res/values-de/translations.xml new file mode 100644 index 0000000000..874769c469 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-de/translations.xml @@ -0,0 +1,13 @@ + + + "Aktivitäten" + "Flaggen" + "Essen & Trinken" + "Tiere & Natur" + "Objekte" + "Smileys & Menschen" + "Reisen & Orte" + "Zuletzt verwendete Emojis" + "Symbole" + "Emojis suchen" + diff --git a/libraries/emoji/impl/src/main/res/values-el/translations.xml b/libraries/emoji/impl/src/main/res/values-el/translations.xml new file mode 100644 index 0000000000..c61f78e1da --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-el/translations.xml @@ -0,0 +1,13 @@ + + + "Δραστηριότητες" + "Σημαίες" + "Φαγητό & Ποτό" + "Ζώα & Φύση" + "Αντικείμενα" + "Φατσούλες & Άνθρωποι" + "Ταξίδια & Μέρη" + "Πρόσφατα emoji" + "Σύμβολα" + "Αναζήτηση emoji" + diff --git a/libraries/emoji/impl/src/main/res/values-es/translations.xml b/libraries/emoji/impl/src/main/res/values-es/translations.xml new file mode 100644 index 0000000000..7a694296b2 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-es/translations.xml @@ -0,0 +1,11 @@ + + + "Actividades" + "Banderas" + "Comida y bebida" + "Animales y naturaleza" + "Objetos" + "Emojis y personas" + "Viajes y lugares" + "Símbolos" + diff --git a/libraries/emoji/impl/src/main/res/values-et/translations.xml b/libraries/emoji/impl/src/main/res/values-et/translations.xml new file mode 100644 index 0000000000..881a342c8d --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-et/translations.xml @@ -0,0 +1,13 @@ + + + "Tegevused" + "Lipud" + "Toit ja jook" + "Loomad ja loodus" + "Esemed" + "Emotikonid ja inimesed" + "Reisimine ja kohad" + "Hiljutised emojid" + "Sümbolid" + "Otsi emojisid" + diff --git a/libraries/emoji/impl/src/main/res/values-eu/translations.xml b/libraries/emoji/impl/src/main/res/values-eu/translations.xml new file mode 100644 index 0000000000..a5cce4e187 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-eu/translations.xml @@ -0,0 +1,11 @@ + + + "Jarduerak" + "Banderak" + "Jana eta edana" + "Animaliak eta natura" + "Objektuak" + "Irribartxoak eta jendea" + "Bidaiak eta tokiak" + "Ikurrak" + diff --git a/libraries/emoji/impl/src/main/res/values-fa/translations.xml b/libraries/emoji/impl/src/main/res/values-fa/translations.xml new file mode 100644 index 0000000000..7c19e79b30 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-fa/translations.xml @@ -0,0 +1,13 @@ + + + "فعّالیت‌ها" + "پرچم‌ها" + "غذا و نوشیدنی" + "حیوانات و طبعیت" + "اشیا" + "شکلک‌ها و افراد" + "سفر و مکان‌ها" + "شکلک‌های اخیر" + "نمادها" + "حست‌وجوی شکلک‌ها" + diff --git a/libraries/emoji/impl/src/main/res/values-fi/translations.xml b/libraries/emoji/impl/src/main/res/values-fi/translations.xml new file mode 100644 index 0000000000..d41d0a8af1 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-fi/translations.xml @@ -0,0 +1,13 @@ + + + "Aktiviteetit" + "Liput" + "Ruoka ja juoma" + "Eläimet ja luonto" + "Esineet" + "Hymiöt ja ihmiset" + "Matkustaminen ja paikat" + "Viimeaikaiset emojit" + "Symbolit" + "Etsi emojeja" + diff --git a/libraries/emoji/impl/src/main/res/values-fr/translations.xml b/libraries/emoji/impl/src/main/res/values-fr/translations.xml new file mode 100644 index 0000000000..856b5a1064 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-fr/translations.xml @@ -0,0 +1,13 @@ + + + "Activités" + "Drapeaux" + "Nourriture et boissons" + "Animaux et nature" + "Objets" + "Émoticônes et personnes" + "Voyages & lieux" + "Emojis récents" + "Symboles" + "Chercher des emojis" + diff --git a/libraries/emoji/impl/src/main/res/values-hr/translations.xml b/libraries/emoji/impl/src/main/res/values-hr/translations.xml new file mode 100644 index 0000000000..db677e5362 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-hr/translations.xml @@ -0,0 +1,13 @@ + + + "Aktivnosti" + "Zastave" + "Hrana i piće" + "Životinje i priroda" + "Objekti" + "Emotikoni i osobe" + "Putovanja i mjesta" + "Nedavni emotikoni" + "Simboli" + "Pretraživanje emotikona" + diff --git a/libraries/emoji/impl/src/main/res/values-hu/translations.xml b/libraries/emoji/impl/src/main/res/values-hu/translations.xml new file mode 100644 index 0000000000..a6542d118a --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-hu/translations.xml @@ -0,0 +1,13 @@ + + + "Tevékenységek" + "Zászlók" + "Étel és ital" + "Állatok és természet" + "Tárgyak" + "Mosolyok és emberek" + "Utazás és helyek" + "Legutóbbi emodzsik" + "Szimbólumok" + "Emodzsik keresése" + diff --git a/libraries/emoji/impl/src/main/res/values-in/translations.xml b/libraries/emoji/impl/src/main/res/values-in/translations.xml new file mode 100644 index 0000000000..20ff1aa10a --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-in/translations.xml @@ -0,0 +1,13 @@ + + + "Aktivitas" + "Bendera" + "Makanan & Minuman" + "Hewan & Alam" + "Objek" + "Senyuman & Orang" + "Wisata & Tempat" + "Emojis Sebelumnya" + "Simbol" + "Cari emoji" + diff --git a/libraries/emoji/impl/src/main/res/values-it/translations.xml b/libraries/emoji/impl/src/main/res/values-it/translations.xml new file mode 100644 index 0000000000..dbfb9ac6f4 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-it/translations.xml @@ -0,0 +1,13 @@ + + + "Attività" + "Bandiere" + "Cibi & Bevande" + "Animali & Natura" + "Oggetti" + "Faccine & Persone" + "Viaggi & Luoghi" + "Emoji recenti" + "Simboli" + "Cerca emoji" + diff --git a/libraries/emoji/impl/src/main/res/values-ja/translations.xml b/libraries/emoji/impl/src/main/res/values-ja/translations.xml new file mode 100644 index 0000000000..273422bd11 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-ja/translations.xml @@ -0,0 +1,13 @@ + + + "アクティビティ" + "旗" + "食べ物" + "動物・自然" + "物" + "顔・人" + "旅・場所" + "最近使用" + "記号" + "絵文字を検索" + diff --git a/libraries/emoji/impl/src/main/res/values-ka/translations.xml b/libraries/emoji/impl/src/main/res/values-ka/translations.xml new file mode 100644 index 0000000000..0cfa48d863 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-ka/translations.xml @@ -0,0 +1,11 @@ + + + "აქტივობები" + "დროშები" + "Საჭმელ-სასმელი" + "ცხოველები & ბუნება" + "ობიექტები" + "ღიმილები & ხალხი" + "მოგზაურობა და ადგილები" + "სიმბოლოები" + diff --git a/libraries/emoji/impl/src/main/res/values-ko/translations.xml b/libraries/emoji/impl/src/main/res/values-ko/translations.xml new file mode 100644 index 0000000000..7ab40e73ed --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-ko/translations.xml @@ -0,0 +1,13 @@ + + + "활동" + "깃발" + "음식 & 음료" + "동물 & 자연" + "사물" + "표정 & 사람" + "여행 & 장소" + "최근 이모지" + "상징" + "이모지 검색" + diff --git a/libraries/emoji/impl/src/main/res/values-lt/translations.xml b/libraries/emoji/impl/src/main/res/values-lt/translations.xml new file mode 100644 index 0000000000..3affbd9124 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-lt/translations.xml @@ -0,0 +1,11 @@ + + + "Veikla" + "Vėliavos" + "Maistas ir Gėrimai" + "Gyvūnai ir Gamta" + "Objektai" + "Šypsenėlės ir Žmonės" + "Kelionės ir Vietovės" + "Simboliai" + diff --git a/libraries/emoji/impl/src/main/res/values-nb/translations.xml b/libraries/emoji/impl/src/main/res/values-nb/translations.xml new file mode 100644 index 0000000000..dd7ddd8cd2 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-nb/translations.xml @@ -0,0 +1,13 @@ + + + "Aktiviteter" + "Flagg" + "Mat og drikke" + "Dyr og natur" + "Gjenstander" + "Smilefjes og mennesker" + "Reising og steder" + "Nylige emojier" + "Symboler" + "Søk etter emojier" + diff --git a/libraries/emoji/impl/src/main/res/values-nl/translations.xml b/libraries/emoji/impl/src/main/res/values-nl/translations.xml new file mode 100644 index 0000000000..bd4f28f420 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-nl/translations.xml @@ -0,0 +1,11 @@ + + + "Activiteiten" + "Vlaggen" + "Eten & Drinken" + "Dieren & Natuur" + "Voorwerpen" + "Smileys & Mensen" + "Reizen & Locaties" + "Symbolen" + diff --git a/libraries/emoji/impl/src/main/res/values-pl/translations.xml b/libraries/emoji/impl/src/main/res/values-pl/translations.xml new file mode 100644 index 0000000000..c59f2c6b54 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-pl/translations.xml @@ -0,0 +1,13 @@ + + + "Aktywności" + "Flagi" + "Jedzenie i napoje" + "Zwierzęta i natura" + "Obiekty" + "Buźki i osoby" + "Podróż i miejsca" + "Ostatnie emoji" + "Symbole" + "Wyszukaj emoji" + diff --git a/libraries/emoji/impl/src/main/res/values-pt-rBR/translations.xml b/libraries/emoji/impl/src/main/res/values-pt-rBR/translations.xml new file mode 100644 index 0000000000..aa0c06f602 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-pt-rBR/translations.xml @@ -0,0 +1,13 @@ + + + "Atividades" + "Bandeiras" + "Comida & Bebida" + "Animais & Natureza" + "Objetos" + "Sorrisos & Pessoas" + "Viagens & Lugares" + "Emojis recentes" + "Símbolos" + "Pesquisar emojis" + diff --git a/libraries/emoji/impl/src/main/res/values-pt/translations.xml b/libraries/emoji/impl/src/main/res/values-pt/translations.xml new file mode 100644 index 0000000000..02ecf31351 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-pt/translations.xml @@ -0,0 +1,13 @@ + + + "Atividades" + "Bandeiras" + "Comidas e Bebidas" + "Animais e Natureza" + "Objetos" + "Caras e Pessoas" + "Viagens e Lugares" + "Emojis recentes" + "Símbolos" + "Pesquisar emojis" + diff --git a/libraries/emoji/impl/src/main/res/values-ro/translations.xml b/libraries/emoji/impl/src/main/res/values-ro/translations.xml new file mode 100644 index 0000000000..410bcef3bc --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-ro/translations.xml @@ -0,0 +1,13 @@ + + + "Activități" + "Steaguri" + "Mâncare & Băutură" + "Animale și Natură" + "Obiecte" + "Fețe zâmbitoare & Oameni" + "Călătorii & Locuri" + "Emoticoane recente" + "Simboluri" + "Căutați emoticoane" + diff --git a/libraries/emoji/impl/src/main/res/values-ru/translations.xml b/libraries/emoji/impl/src/main/res/values-ru/translations.xml new file mode 100644 index 0000000000..2b975ac252 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-ru/translations.xml @@ -0,0 +1,13 @@ + + + "Активности" + "Флаги" + "Еда и напитки" + "Животные и природа" + "Объекты" + "Эмодзи и люди" + "Путешествия и места" + "Недавние эмодзи" + "Символы" + "Поиск эмодзи" + diff --git a/libraries/emoji/impl/src/main/res/values-sk/translations.xml b/libraries/emoji/impl/src/main/res/values-sk/translations.xml new file mode 100644 index 0000000000..09257c943c --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-sk/translations.xml @@ -0,0 +1,13 @@ + + + "Aktivity" + "Vlajky" + "Jedlo a nápoje" + "Zvieratá a príroda" + "Predmety" + "Smajlíky a ľudia" + "Cestovanie a miesta" + "Nedávne emotikony" + "Symboly" + "Hľadať emotikony" + diff --git a/libraries/emoji/impl/src/main/res/values-sv/translations.xml b/libraries/emoji/impl/src/main/res/values-sv/translations.xml new file mode 100644 index 0000000000..8484eb80bb --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-sv/translations.xml @@ -0,0 +1,12 @@ + + + "Aktiviteter" + "Flaggor" + "Mat & dryck" + "Djur & natur" + "Föremål" + "Smileys & personer" + "Resor & platser" + "Symboler" + "Sök emojier" + diff --git a/libraries/emoji/impl/src/main/res/values-tr/translations.xml b/libraries/emoji/impl/src/main/res/values-tr/translations.xml new file mode 100644 index 0000000000..f27e7d29eb --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-tr/translations.xml @@ -0,0 +1,11 @@ + + + "Aktiviteler" + "Bayraklar" + "Yiyecek ve İçecek" + "Hayvanlar ve Doğa" + "Nesneler" + "İfadeler ve İnsanlar" + "Seyahat ve Yerler" + "Simgeler" + diff --git a/libraries/emoji/impl/src/main/res/values-uk/translations.xml b/libraries/emoji/impl/src/main/res/values-uk/translations.xml new file mode 100644 index 0000000000..c05a4576bf --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-uk/translations.xml @@ -0,0 +1,13 @@ + + + "Дії" + "Прапори" + "Їжа та напої" + "Тварини та природа" + "Об\'єкти" + "Смайлики та люди" + "Подорожі та місця" + "Нещодавні емодзі" + "Символи" + "Пошук емоджі" + diff --git a/libraries/emoji/impl/src/main/res/values-ur/translations.xml b/libraries/emoji/impl/src/main/res/values-ur/translations.xml new file mode 100644 index 0000000000..b1c0848e2b --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-ur/translations.xml @@ -0,0 +1,11 @@ + + + "سرگرمیاں" + "جھنڈے" + "طعم و مشروب" + "حیوانات و فطرت" + "اشیاء" + "مسکراہٹیں و لوگ" + "سفر و مقامات" + "علامتیں" + diff --git a/libraries/emoji/impl/src/main/res/values-uz/translations.xml b/libraries/emoji/impl/src/main/res/values-uz/translations.xml new file mode 100644 index 0000000000..692c23b0cc --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-uz/translations.xml @@ -0,0 +1,13 @@ + + + "Faoliyatlar" + "Bayroqlar" + "Oziq-ovqat va ichimliklar" + "Hayvonlar va tabiat" + "Ob\'ektlar" + "Smayllar va odamlar" + "Sayohat va Joylar" + "Oxirgi kulgichlar" + "Belgilar" + "Emojilarni qidiring" + diff --git a/libraries/emoji/impl/src/main/res/values-vi/translations.xml b/libraries/emoji/impl/src/main/res/values-vi/translations.xml new file mode 100644 index 0000000000..1b8e165600 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-vi/translations.xml @@ -0,0 +1,13 @@ + + + "Hoạt động" + "Cờ" + "Thực phẩm và đồ uống" + "Động vật và thiên nhiên" + "Đồ vật" + "Mặt cười & mọi người" + "Du lịch và địa danh" + "Biểu tượng cảm xúc gần đây" + "Biểu tượng" + "Tìm kiếm biểu tượng cảm xúc" + diff --git a/libraries/emoji/impl/src/main/res/values-zh-rTW/translations.xml b/libraries/emoji/impl/src/main/res/values-zh-rTW/translations.xml new file mode 100644 index 0000000000..4461477da5 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-zh-rTW/translations.xml @@ -0,0 +1,13 @@ + + + "活動" + "旗幟" + "食物與飲料" + "動物與大自然" + "物品" + "表情與人物" + "旅行與景點" + "最近使用的表情符號" + "標誌" + "搜尋表情符號" + diff --git a/libraries/emoji/impl/src/main/res/values-zh/translations.xml b/libraries/emoji/impl/src/main/res/values-zh/translations.xml new file mode 100644 index 0000000000..b4e8c6c859 --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values-zh/translations.xml @@ -0,0 +1,13 @@ + + + "节假日" + "旗帜" + "饮食" + "动物和自然" + "日常物品" + "表情和人物" + "文旅景点" + "最近的 Emoji" + "符号" + "搜索 Emoji" + diff --git a/libraries/emoji/impl/src/main/res/values/localazy.xml b/libraries/emoji/impl/src/main/res/values/localazy.xml new file mode 100644 index 0000000000..f767a29ecb --- /dev/null +++ b/libraries/emoji/impl/src/main/res/values/localazy.xml @@ -0,0 +1,13 @@ + + + "Activities" + "Flags" + "Food & Drink" + "Animals & Nature" + "Objects" + "Smileys & People" + "Travel & Places" + "Recent emojis" + "Symbols" + "Search emojis" + diff --git a/libraries/emoji/impl/src/main/res/values/temporary.xml b/libraries/emoji/impl/src/main/res/values/temporary.xml deleted file mode 100644 index 34467795b9..0000000000 --- a/libraries/emoji/impl/src/main/res/values/temporary.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - "Activities" - "Flags" - "Food & Drink" - "Animals & Nature" - "Objects" - "Smileys & People" - "Travel & Places" - "Recent emojis" - "Symbols" - diff --git a/libraries/ui-strings/src/main/res/values-ca/translations.xml b/libraries/ui-strings/src/main/res/values-ca/translations.xml index 5a4c1dd516..f7798cd008 100644 --- a/libraries/ui-strings/src/main/res/values-ca/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ca/translations.xml @@ -321,7 +321,6 @@ Segur que vols continuar?" "Hi ha canvis sense desar." "Els canvis no s\'han desat. Segur que vols tornar enrere?" "Desar canvis?" - "Cerca emoticones" "El servidor utilitzat s\'ha d\'actualitzar per admetre el servei d\'autenticació de Matrix i la creació de comptes." "No s\'ha pogut crear l\'enllaç permanent" "%1$s no ha pogut carregar el mapa. Torna-ho a provar més tard." diff --git a/libraries/ui-strings/src/main/res/values-cs/translations.xml b/libraries/ui-strings/src/main/res/values-cs/translations.xml index ccd15c10c3..11ded645d7 100644 --- a/libraries/ui-strings/src/main/res/values-cs/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cs/translations.xml @@ -452,7 +452,6 @@ Opravdu chcete pokračovat?" "Maximální povolená velikost souboru je: %1$s" "Vyberte kvalitu videa, které chcete nahrát." "Vyberte kvalitu nahrávání videa" - "Hledat emotikony" "Na tomto zařízení jste již přihlášeni jako %1$s." "Váš domovský server je třeba upgradovat, aby podporoval službu Matrix Authentication Service a vytváření účtu." "Vytvoření trvalého odkazu se nezdařilo" diff --git a/libraries/ui-strings/src/main/res/values-cy/translations.xml b/libraries/ui-strings/src/main/res/values-cy/translations.xml index bed2fff573..f2fb860515 100644 --- a/libraries/ui-strings/src/main/res/values-cy/translations.xml +++ b/libraries/ui-strings/src/main/res/values-cy/translations.xml @@ -416,7 +416,6 @@ Ydych chi\'n siŵr eich bod am barhau?" "Y maint ffeil mwyaf sy\'n cael ei ganiatáu yw: %1$s" "Dewiswch ansawdd y fideo rydych chi am ei llwytho." "Dewiswch ansawdd llwytho fideo" - "Chwilio emojis" "Rydych chi eisoes wedi mewngofnodi ar y ddyfais hon fel %1$s ." "Mae angen uwchraddio eich gweinydd cartref i gefnogi Gwasanaeth Dilysu Matrix a chreu cyfrif." "Wedi methu creu\'r ddolen barhaol" diff --git a/libraries/ui-strings/src/main/res/values-da/translations.xml b/libraries/ui-strings/src/main/res/values-da/translations.xml index 41fe346190..614cec39cf 100644 --- a/libraries/ui-strings/src/main/res/values-da/translations.xml +++ b/libraries/ui-strings/src/main/res/values-da/translations.xml @@ -440,7 +440,6 @@ Er du sikker på, at du vil fortsætte?" "Den maksimalt tilladte filstørrelse er: %1$s" "Vælg den kvalitet, du ønsker at uploade videoen i." "Vælg kvalitet for video-overførsel" - "Søg emojis" "Du er allerede logget ind på denne enhed som %1$s." "Din hjemmeserver skal opgraderes for at understøtte Matrix Authentication Service og kontooprettelse." "Oprettelse af permalink mislykkedes" diff --git a/libraries/ui-strings/src/main/res/values-de/translations.xml b/libraries/ui-strings/src/main/res/values-de/translations.xml index fe1eaac312..d83fb1ee64 100644 --- a/libraries/ui-strings/src/main/res/values-de/translations.xml +++ b/libraries/ui-strings/src/main/res/values-de/translations.xml @@ -433,7 +433,6 @@ Möchtest du wirklich fortfahren?" "Die maximal erlaubte Dateigröße ist: %1$s" "Wähle die Qualität des Videos, das du hochladen möchtest." "Wähle die Video-Upload-Qualität" - "Emojis suchen" "Du bist auf diesem Gerät bereits als %1$s angemeldet." "Dein Homeserver muss aktualisiert werden, um den Matrix Authentication Services und die Erstellung von Konten zu unterstützen." "Fehler beim Erstellen des Permalinks" diff --git a/libraries/ui-strings/src/main/res/values-et/translations.xml b/libraries/ui-strings/src/main/res/values-et/translations.xml index dab809f74d..938e1a5e9a 100644 --- a/libraries/ui-strings/src/main/res/values-et/translations.xml +++ b/libraries/ui-strings/src/main/res/values-et/translations.xml @@ -477,7 +477,6 @@ Kas sa oled kindel, et soovid jätkata?" "Suurim lubatud failisuurus on: %1$s" "Vali üleslaaditava video kvaliteet." "Vali video kvaliteet." - "Otsi emojisid" "Sa juba oled sellesse seadmesse sisseloginud kasutajana %1$s." "Selleks et koos kasutajakonto loomisega toimiks Matrix Authentication Service\'i tugi, vajab sinu koduserver uuendamist." "Püsilingi loomine ei õnnestumud" diff --git a/libraries/ui-strings/src/main/res/values-fa/translations.xml b/libraries/ui-strings/src/main/res/values-fa/translations.xml index 6d377a9652..03d1172040 100644 --- a/libraries/ui-strings/src/main/res/values-fa/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fa/translations.xml @@ -348,7 +348,6 @@ "تغییراتی ذخیره نشده دارید." "تغییراتتان ذخیره نشده‌اند. مطمئنید که می‌خواهید برگردید؟" "ذخیرهٔ تغییرات؟" - "حست‌وجوی شکلک‌ها" "شکست در ایجاد پایاپیوند" "%1$s نتوانست نقشه را بارگیری کند. لطفا بعدا دوباره امتحان کنید." "شکست در بار کردن پیام‌ها" diff --git a/libraries/ui-strings/src/main/res/values-hr/translations.xml b/libraries/ui-strings/src/main/res/values-hr/translations.xml index 03e24aebd3..6ca10c229e 100644 --- a/libraries/ui-strings/src/main/res/values-hr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-hr/translations.xml @@ -475,7 +475,6 @@ Jeste li sigurni da želite nastaviti?" "Maksimalna dopuštena veličina datoteke je: %1$s" "Odaberite kvalitetu videozapisa koji želite prenijeti." "Odaberi kvalitetu prijenosa videozapisa" - "Pretraživanje emotikona" "Već ste prijavljeni na ovom uređaju kao %1$s." "Vaš matični poslužitelj potrebno je nadograditi kako bi podržavao uslugu Matrix Authentication Service i stvaranje računa." "Nije uspjelo stvaranje trajne poveznice" diff --git a/libraries/ui-strings/src/main/res/values-nb/translations.xml b/libraries/ui-strings/src/main/res/values-nb/translations.xml index 60ee544965..492268c38f 100644 --- a/libraries/ui-strings/src/main/res/values-nb/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml @@ -429,7 +429,6 @@ Er du sikker på at du vil fortsette?" "Maksimal tillatt filstørrelse er: %1$s" "Velg kvaliteten på videoen du vil laste opp." "Velg kvalitet for videoopplasting" - "Søk etter emojier" "Du er allerede logget inn på denne enheten som %1$s." "Hjemmeserveren din må oppgraderes for å støtte Matrix Authentication Service og kontooppretting." "Opprettelse av permalenken mislyktes" diff --git a/libraries/ui-strings/src/main/res/values-pl/translations.xml b/libraries/ui-strings/src/main/res/values-pl/translations.xml index fcea19da49..e5c8755a96 100644 --- a/libraries/ui-strings/src/main/res/values-pl/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pl/translations.xml @@ -477,7 +477,6 @@ Czy na pewno chcesz kontynuować?" "Maksymalny dozwolony rozmiar pliku to: %1$s" "Wybierz jakość filmu, który chcesz przesłać." "Wybierz jakość przesyłania wideo" - "Wyszukaj emoji" "Jesteś już zalogowany na tym urządzeniu jako %1$s." "Twój serwer domowy wymaga aktualizacji, aby uzyskać wsparcie usługi Matrix Authentication Service i tworzenia kont." "Nie udało się utworzyć linku bezpośredniego" diff --git a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml index 474d1c8917..49decfa49b 100644 --- a/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml @@ -410,7 +410,6 @@ Você tem certeza de que deseja continuar?" "O tamanho máximo permitido de arquivos é: %1$s" "Selecione a qualidade do video que quer enviar." "Selecione a qualidade de envio dos vídeos" - "Pesquisar emojis" "Você já está conectado neste dispositivo como %1$s ." "Seu servidor-casa precisa ser atualizado para oferecer suporte ao Matrix Authentication Service e à criação de contas." "Falha ao criar o link permanente" diff --git a/libraries/ui-strings/src/main/res/values-pt/translations.xml b/libraries/ui-strings/src/main/res/values-pt/translations.xml index e8d32ee72e..617ecad2db 100644 --- a/libraries/ui-strings/src/main/res/values-pt/translations.xml +++ b/libraries/ui-strings/src/main/res/values-pt/translations.xml @@ -391,7 +391,6 @@ Tens a certeza de que queres continuar?" "O tamanho máximo de ficheiro permitido é: %1$s" "Seleciona a qualidade do vídeo que pretendes carregar." "Seleciona a qualidade de carregamento do vídeo" - "Pesquisar emojis" "Já tens sessão iniciada como %1$s neste dispositivo." "Seu homeserver precisa ser atualizado para suportar o Matrix Authentication Service e a criação de conta." "Falha ao criar ligação permanente" diff --git a/libraries/ui-strings/src/main/res/values-ro/translations.xml b/libraries/ui-strings/src/main/res/values-ro/translations.xml index bdb220c9a0..4eba83312b 100644 --- a/libraries/ui-strings/src/main/res/values-ro/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ro/translations.xml @@ -451,7 +451,6 @@ Sunteți sigur că doriți să continuați?" "Dimensiunea maximă permisă pentru fișiere este: %1$s" "Selectați calitatea videoclipului pe care doriți să îl încărcați." "Selectați calitatea de încărcare a videoclipurilor" - "Căutați emoticoane" "Sunteți deja conectat pe acest dispozitiv ca %1$s." "Serverul dumneavoastră trebuie actualizat pentru a suporta serviciul de autentificare Matrix și crearea de conturi." "Crearea permalink-ului a eșuat" diff --git a/libraries/ui-strings/src/main/res/values-ru/translations.xml b/libraries/ui-strings/src/main/res/values-ru/translations.xml index cd711bf18b..892d4348c1 100644 --- a/libraries/ui-strings/src/main/res/values-ru/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml @@ -476,7 +476,6 @@ "Максимально допустимый размер файла: %1$s" "Выберите качество видео, которое Вы хотите загрузить." "Выберите качество загружаемого видео" - "Поиск эмодзи" "Вы уже вошли на данном устройстве как %1$s." "Домашний сервер необходимо обновить, чтобы он поддерживал Matrix Authentication Service и создание учётных записей." "Не удалось создать постоянную ссылку" diff --git a/libraries/ui-strings/src/main/res/values-sk/translations.xml b/libraries/ui-strings/src/main/res/values-sk/translations.xml index f4f03fd3b8..4fdf503c97 100644 --- a/libraries/ui-strings/src/main/res/values-sk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml @@ -423,7 +423,6 @@ Naozaj chcete pokračovať?" "Maximálna povolená veľkosť súboru je: %1$s" "Vyberte kvalitu videa, ktoré chcete nahrať." "Vyberte kvalitu nahrávania videa" - "Hľadať emotikony" "Už ste prihlásený/á na tomto zariadení ako %1$s ." "Váš domovský server musí byť aktualizovaný tak, aby podporoval Matrix Authentication Service a vytvorenie účtu." "Nepodarilo sa vytvoriť trvalý odkaz" diff --git a/libraries/ui-strings/src/main/res/values-sv/translations.xml b/libraries/ui-strings/src/main/res/values-sv/translations.xml index ea7ba155c4..4e46cd4653 100644 --- a/libraries/ui-strings/src/main/res/values-sv/translations.xml +++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml @@ -379,7 +379,6 @@ Anledning:%1$s." "Den maximala tillåtna filstorleken är: %1$s" "Välj kvaliteten på videon du vill ladda upp." "Välj videouppladdningskvalitet" - "Sök emojier" "Du är redan inloggad på den här enheten som %1$s." "Din hemserver måste uppgraderas för att stödja Matrix Authentication Service och skapande av konto." "Misslyckades att skapa permalänken" diff --git a/libraries/ui-strings/src/main/res/values-uk/translations.xml b/libraries/ui-strings/src/main/res/values-uk/translations.xml index aabea67405..4f92b9547f 100644 --- a/libraries/ui-strings/src/main/res/values-uk/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml @@ -476,7 +476,6 @@ "Максимально дозволений розмір файлу: %1$s" "Виберіть якість відео, яке ви хочете вивантажити." "Виберіть якість вивантажуваного відео" - "Пошук емоджі" "Ви вже ввійшли на цьому пристрої як %1$s." "Ваш домашній сервер потрібно оновити, щоб він підтримував службу автентифікації Matrix і створення облікових записів." "Не вдалося створити постійне посилання" diff --git a/libraries/ui-strings/src/main/res/values-uz/translations.xml b/libraries/ui-strings/src/main/res/values-uz/translations.xml index 6a21c6aea6..120de32b66 100644 --- a/libraries/ui-strings/src/main/res/values-uz/translations.xml +++ b/libraries/ui-strings/src/main/res/values-uz/translations.xml @@ -450,7 +450,6 @@ Davom etasizmi?" "Ruxsat etilgan maksimal fayl hajmi: %1$s" "Yuklanadigan video sifatini tanlang." "Video yuklash sifatini tanlang" - "Emojilarni qidiring" "Bu qurilmada allaqachon %1$s hisobiga kirgansiz." "Matrix autentifikatsiya xizmati va hisob yaratish imkoniyatini qo‘llab-quvvatlash uchun uy serveringizni yangilash talab etiladi." "Doimiy havola yaratilmadi" diff --git a/libraries/ui-strings/src/main/res/values-vi/translations.xml b/libraries/ui-strings/src/main/res/values-vi/translations.xml index 3da8d7f394..87baf98c47 100644 --- a/libraries/ui-strings/src/main/res/values-vi/translations.xml +++ b/libraries/ui-strings/src/main/res/values-vi/translations.xml @@ -422,7 +422,6 @@ Bạn có chắc muốn tiếp tục không?" "Kích thước tệp tối đa cho phép là: %1$s" "Chọn chất lượng video bạn muốn tải lên." "Chọn chất lượng tải lên video" - "Tìm kiếm biểu tượng cảm xúc" "Bạn đã đăng nhập trên thiết bị này với tư cách là%1$s ." "Máy chủ của bạn cần được nâng cấp để hỗ trợ Dịch vụ Xác thực và tạo tài khoản." "Không tạo được liên kết cố định" diff --git a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml index f54a9cc5a5..c2ff955eac 100644 --- a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml @@ -425,7 +425,6 @@ "最大允許的檔案大小為:%1$s" "選取您要上傳的視訊的品質。" "選取視訊上傳品質" - "搜尋表情符號" "您已在此裝置上以 %1$s 的身份登入。" "您的家伺服器需要升級才能支援 Matrix Authentication Service 與帳號建立。" "無法建立永久連結" diff --git a/libraries/ui-strings/src/main/res/values-zh/translations.xml b/libraries/ui-strings/src/main/res/values-zh/translations.xml index e91509ab3f..99f0d20b14 100644 --- a/libraries/ui-strings/src/main/res/values-zh/translations.xml +++ b/libraries/ui-strings/src/main/res/values-zh/translations.xml @@ -466,7 +466,6 @@ "允许的最大文件大小为:%1$s" "选择你要上传的视频的质量。" "选择视频上传质量" - "搜索 Emoji" "你已在此设备以 %1$s 的身份登录。" "你的主服务器需要升级,以支持 Matrix 认证服务和账户创建。" "永久链接创建失败" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 485b9b9d59..ed45f312e3 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -477,7 +477,6 @@ Are you sure you want to continue?" "The max file size allowed is: %1$s" "Select the quality of the video you want to upload." "Select video upload quality" - "Search emojis" "You\'re already logged in on this device as %1$s." "Your homeserver needs to be upgraded to support Matrix Authentication Service and account creation." "Failed creating the permalink" diff --git a/tools/localazy/config.json b/tools/localazy/config.json index 5753fe5f47..ac5b1295fe 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -261,7 +261,6 @@ { "name" : ":features:messages:impl", "includeRegex" : [ - "emoji_picker_category_.*", "screen_report_content_.*", "screen_room_attachment.*", "screen_room_encrypted.*", @@ -426,6 +425,12 @@ "screen\\.share_location\\..*", "screen\\.view_location\\..*" ] + }, + { + "name" : ":libraries:emoji:impl", + "includeRegex" : [ + "emoji_picker_.*" + ] } ] } From 2f09585b813490c88ad759a913bdbb84881997d6 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Wed, 22 Jul 2026 19:22:11 +0000 Subject: [PATCH 18/24] Update screenshots --- .../features.invitepeople.impl_InvitePeopleView_Day_5_en.png | 4 ++-- ...features.invitepeople.impl_InvitePeopleView_Night_5_en.png | 4 ++-- ...es.preferences.impl.userstatus_UserStatusView_Day_5_en.png | 4 ++-- ...es.preferences.impl.userstatus_UserStatusView_Day_6_en.png | 4 ++-- ....preferences.impl.userstatus_UserStatusView_Night_5_en.png | 4 ++-- ....preferences.impl.userstatus_UserStatusView_Night_6_en.png | 4 ++-- ...embermoderation.impl_RoomMemberModerationView_Day_5_en.png | 4 ++-- ...embermoderation.impl_RoomMemberModerationView_Day_7_en.png | 4 ++-- ...bermoderation.impl_RoomMemberModerationView_Night_5_en.png | 4 ++-- ...bermoderation.impl_RoomMemberModerationView_Night_7_en.png | 4 ++-- ...eme.components_HorizontalFloatingToolbarNoFab_Day_0_en.png | 4 ++-- ...e.components_HorizontalFloatingToolbarNoFab_Night_0_en.png | 4 ++-- ...em.theme.components_HorizontalFloatingToolbar_Day_0_en.png | 4 ++-- ....theme.components_HorizontalFloatingToolbar_Night_0_en.png | 4 ++-- ...aries.matrix.ui.components_CheckableResolvedUserRow_en.png | 4 ++-- 15 files changed, 30 insertions(+), 30 deletions(-) diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png index c67c062ddc..e2c64a6d5b 100644 --- a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a9237dbe1fd700357d7d073408977653a52d9f8c2ca92aad26569c10c0247a1 -size 37488 +oid sha256:686b6dbb0e54dc133a504bb56bf254c8bc6d76faf1c51e696c2b980ad67ffd35 +size 37320 diff --git a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png index eb0e3331e0..2f41c0ac43 100644 --- a/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.invitepeople.impl_InvitePeopleView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed1399fb1ec24eddadaf91700ac446a9f76784953b8b84cf1675c979fc9aebb9 -size 38509 +oid sha256:33e7d75e2f1ebed36e05491eb27475ce74cce35a4121aaa053aff34ac6f8c0dc +size 38272 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_5_en.png index 7ef9b7ae0a..270dbe6d1e 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d19e7a09114e76294a0626e5d617cf55fe7c13a0188a7d5b364f57c0d9daedc1 -size 12123 +oid sha256:195338046951366fd2345fdc8471e3e2b2786723c8bfffa9fa9057929c608afb +size 12113 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_6_en.png index f831ed92a2..0ca6f66438 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Day_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fe1f51d385bba8821dfc0f0da84990cf0d148e991d765484b343d8764abd47d -size 11724 +oid sha256:5896eb5df6f5398bdb94e74280d0d5c04b6a5a53c2378b7377c60fa58eef544b +size 12013 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_5_en.png index 1e04c3e7d7..fb72cafe03 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6bbc8c05e6f6818d00282228f52424ebe93e6e3dca3431d742e8c652d56460d6 -size 11712 +oid sha256:4ef1b643a16b5a94c75f8bb845c36d3cbc7f7ed96a0cac32fdb9f0b09d26b4d1 +size 11747 diff --git a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_6_en.png b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_6_en.png index 8e1b9c99d2..ce1258d2ac 100644 --- a/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_6_en.png +++ b/tests/uitests/src/test/snapshots/images/features.preferences.impl.userstatus_UserStatusView_Night_6_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66f6d0d6b03ee4c999cd4edc9c6ae567d31b8b537ca6f9cc8fbe436d06ce80ab -size 11643 +oid sha256:ce754ce205fd864e01828659aff42ab19dccf7c921c1c733ed1757f1b2122309 +size 11403 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en.png index 73b8b8e50c..5c597300e4 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e8a3ad99763929d2783147814e44fa9ec7e7efb7b99949e3580f23c38fb5d971 -size 9398 +oid sha256:21aee17ee9a292bb2f0d3d2ec2db565ebb8d5df753454a5a002f033ed5ed39c5 +size 3853 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en.png index 5c597300e4..f8a1f24b34 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Day_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21aee17ee9a292bb2f0d3d2ec2db565ebb8d5df753454a5a002f033ed5ed39c5 -size 3853 +oid sha256:1342b6427f5b2e3075ae3ccee60bf1d3b11afaccf3e152643d6ef2d65c21b54e +size 9108 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en.png index d47bf90664..4ae7279fe7 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:520cae2544153ba45f8fe4b021286c2d22da06aa1b60be7f1b13879723ff994c -size 3664 +oid sha256:410a8596d4c70b9a3856d959d6d71ade8e831e8581ff410c9900957a93b3eb50 +size 8114 diff --git a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en.png b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en.png index a87d89c701..d47bf90664 100644 --- a/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en.png +++ b/tests/uitests/src/test/snapshots/images/features.roommembermoderation.impl_RoomMemberModerationView_Night_7_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f3a0cb5d9bae6725a1c527f3d9575aabf85d3edf63a28d9faa23f4f0b65e2d0 -size 7624 +oid sha256:520cae2544153ba45f8fe4b021286c2d22da06aa1b60be7f1b13879723ff994c +size 3664 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Day_0_en.png index ee5c582240..58546b8522 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:75de341f705bb22955f9399180519b65ad59c2e1917317d56e50ea4db78f35bc -size 12102 +oid sha256:30357bf18792db5ab20085010251170a724ffe8c00313facd04ee704e806af64 +size 10982 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Night_0_en.png index fedead0fa8..52fd9b9693 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbarNoFab_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4811667dec0f32accc5e2c8a5dd5c0b34017fcff8d1e0376ee7a4708426bca0f -size 9838 +oid sha256:58b9491aaa5554b89d86c62a5c9c44975367538c6baa5562f8dc5768f76d8264 +size 8705 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Day_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Day_0_en.png index 38ad0e4b56..83302d6ba4 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:326d59cf768b2dbd96eb7964d54c8eda509a5cd57c6e62087625e3314da0bb4d -size 13658 +oid sha256:16dee1dfe746cd40dac9fe8f0af3ecb42cd14bab5cc490917b589beed065ed1b +size 14686 diff --git a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Night_0_en.png b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Night_0_en.png index 4da2a98aca..687e0d436a 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.designsystem.theme.components_HorizontalFloatingToolbar_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ef0dc4d53daeb986f378b6e4d85928b4b6729336c89cf21e642c88c53688a3ab -size 10292 +oid sha256:d57df7110371c9224e232b707d6a1b10ce14afcb56c803a78220792f2a0d4cf2 +size 11354 diff --git a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png index 185aeb6a20..32ed8ebc5e 100644 --- a/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png +++ b/tests/uitests/src/test/snapshots/images/libraries.matrix.ui.components_CheckableResolvedUserRow_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e7b042410cfc2999e599534c263abd27ef43a64444e90aeed3a45a72ec8f0a15 -size 46735 +oid sha256:ef82fb23d7da19f1c3f37c3fbd1472f138a8edb27c307072cebb3b2444c239ae +size 46245 From 14feeca2a5881938eb33b2947697fd4490080075 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 23 Jul 2026 11:25:40 +0200 Subject: [PATCH 19/24] Add some comments after PR review --- .../preferences/impl/userstatus/UserStatusPresenter.kt | 2 ++ .../emoji/impl/picker/DefaultEmojiPickerPresenter.kt | 2 ++ .../android/libraries/emoji/impl/picker/EmojiItem.kt | 10 ++++++++++ 3 files changed, 14 insertions(+) diff --git a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenter.kt b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenter.kt index 6079ae04cc..60f02ad05a 100644 --- a/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenter.kt +++ b/features/preferences/impl/src/main/kotlin/io/element/android/features/preferences/impl/userstatus/UserStatusPresenter.kt @@ -79,6 +79,8 @@ class UserStatusPresenter( } } + // In CustomInput mode, override the picker state's `emojiPickerSheetState` with the freshly composed emoji-picker + // sub-state so recompositions of the picker propagate up. Other modes pass through unchanged. val effectivePickerState = when (val current = pickerState) { is UserStatusPickerState.CustomInput -> { val emojiPickerState = presentEmojiPickerSheetState(isEmojiPickerVisible) diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt index 6a0c4924b3..9d7dbfdce8 100644 --- a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/DefaultEmojiPickerPresenter.kt @@ -93,6 +93,8 @@ class DefaultEmojiPickerPresenter( val searchQuery = queryState.text.toString() LaunchedEffect(searchQuery, data) { if (searchQuery.isEmpty() || data.allEmojis.isEmpty()) { + // `SearchBarResultState.Initial` has no `equals` override, so reassigning a new instance + // would trigger a redundant emission each time this effect re-runs while the query is empty. if (emojiResults !is SearchBarResultState.Initial) { emojiResults = SearchBarResultState.Initial() } diff --git a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiItem.kt b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiItem.kt index 02ed46c0ae..930b42c789 100644 --- a/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiItem.kt +++ b/libraries/emoji/impl/src/main/kotlin/io/element/android/libraries/emoji/impl/picker/EmojiItem.kt @@ -91,6 +91,8 @@ internal fun EmojiItem( .onPlaced { coordinates -> val position = coordinates.positionInParent() val parentBounds = coordinates.parentLayoutCoordinates?.size ?: return@onPlaced + // Calculate the offset of the item inside its parent as a percentage, to be able to set the initial offset + // for the selection inside the skin tone picker relative to its size. itemOffsetPercent = if (parentBounds.width > 0) { position.x / parentBounds.width } else { @@ -102,6 +104,7 @@ internal fun EmojiItem( .background(backgroundColor, CircleShape) .indication(interactionSource, ripple()) .pointerInput(item) { + // Always detect long press and tap gestures detectTapGestures( onPress = { pressOffset -> val press = PressInteraction.Press(pressOffset) @@ -119,6 +122,7 @@ internal fun EmojiItem( ) } .then( + // Only detect drag after long press for those items which have a skin tone picker if (hasSkinTones) { Modifier.pointerInput(item) { val slotWidthPx = with(density) { SkinToneSlotSize.toPx() } @@ -135,6 +139,8 @@ internal fun EmojiItem( onDrag = { change, _ -> if (!dismissed) { change.consume() + // It's a valid drag event if it's within ~2 items height above, so, on top of the current one or the skin tone selector, + // or 1 item below, which should be far enough to not be triggered by mistake val isValidDrag = if (change.position.y < startOffset.y) { startOffset.y - change.position.y <= itemSize.height * 2f } else { @@ -146,11 +152,15 @@ internal fun EmojiItem( onDismissSkinPicker() } else { val skinItemsCount = item.skins!!.size + // Original + variants val totalSlots = 1 + skinItemsCount + // Calculate the whole size of the skin tone picker val pickerWidthPx = 2 * paddingPx + totalSlots * slotWidthPx + (totalSlots - 1) * spacingPx + // Calculate the initial offset inside the picker, given the relative position of the item inside its parent val initialOffset = pickerWidthPx * itemOffsetPercent val xInPicker = initialOffset + change.position.x + // If it's a valid offset, calculate the hovered index, otherwise, set it to -1 to indicate that no item is hovered val index = if (xInPicker in 0f..pickerWidthPx) { (xInPicker / slotWidthPx).toInt().coerceIn(0, totalSlots - 1) } else { From 0d6c35a4a2f344a35457be75ed674f6116f26e3f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 11:41:48 +0000 Subject: [PATCH 20/24] Update dependency org.matrix.rustcomponents:sdk-android to v26.07.23 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1aee681c47..ff1f313d9e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -185,7 +185,7 @@ test_detekt_test = { module = "io.gitlab.arturbosch.detekt:detekt-test", version # https://github.com/matrix-org/matrix-rust-components-kotlin/commits/main/sdk/sdk-android/src/main/kotlin/org/matrix/rustcomponents/sdk/matrix_sdk_ffi.kt # All new features should not be implemented in the pull request that upgrades the version, developers should # only fix API breaks and may add some TODOs. -matrix_sdk = "org.matrix.rustcomponents:sdk-android:26.07.22" +matrix_sdk = "org.matrix.rustcomponents:sdk-android:26.07.23" # Others coil = { module = "io.coil-kt.coil3:coil", version.ref = "coil" } From ff7f54c416462fc3ad83d410da3ae8648052bbeb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 11:41:57 +0000 Subject: [PATCH 21/24] Update dependency io.sentry:sentry-android to v8.49.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1aee681c47..02309d37af 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -230,7 +230,7 @@ color_picker = "io.mhssn:colorpicker:1.0.0" # Analytics posthog = "com.posthog:posthog-android:3.51.1" -sentry = "io.sentry:sentry-android:8.48.0" +sentry = "io.sentry:sentry-android:8.49.0" # main branch can be tested replacing the version with main-SNAPSHOT matrix_analytics_events = "com.github.matrix-org:matrix-analytics-events:0.37.0" From 075cca2d21c6e4eea8cf0837457e4ddf904d6f00 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 23 Jul 2026 13:56:30 +0200 Subject: [PATCH 22/24] Sync emoji picker translations from Localazy --- libraries/ui-strings/src/main/res/values-el/translations.xml | 1 - libraries/ui-strings/src/main/res/values-fi/translations.xml | 1 - libraries/ui-strings/src/main/res/values-fr/translations.xml | 1 - libraries/ui-strings/src/main/res/values-hu/translations.xml | 1 - libraries/ui-strings/src/main/res/values-in/translations.xml | 1 - libraries/ui-strings/src/main/res/values-it/translations.xml | 1 - libraries/ui-strings/src/main/res/values-ja/translations.xml | 1 - libraries/ui-strings/src/main/res/values-ko/translations.xml | 1 - 8 files changed, 8 deletions(-) diff --git a/libraries/ui-strings/src/main/res/values-el/translations.xml b/libraries/ui-strings/src/main/res/values-el/translations.xml index 5bbfeb20e5..1b69bb001f 100644 --- a/libraries/ui-strings/src/main/res/values-el/translations.xml +++ b/libraries/ui-strings/src/main/res/values-el/translations.xml @@ -434,7 +434,6 @@ "Το μέγιστο επιτρεπόμενο μέγεθος αρχείου είναι: %1$s" "Επιλέξτε την ποιότητα του βίντεο που θέλετε να ανεβάσετε." "Επιλέξτε την ποιότητα μεταφόρτωσης βίντεο" - "Αναζήτηση emoji" "Έχετε ήδη συνδεθεί σε αυτή τη συσκευή ως %1$s." "Ο οικιακός διακομιστής σου πρέπει να αναβαθμιστεί για να υποστηρίζει το Matrix Authentication Service και τη δημιουργία λογαριασμού." "Αποτυχία δημιουργίας του μόνιμου συνδέσμου" diff --git a/libraries/ui-strings/src/main/res/values-fi/translations.xml b/libraries/ui-strings/src/main/res/values-fi/translations.xml index ef7d518779..52d3bf16e5 100644 --- a/libraries/ui-strings/src/main/res/values-fi/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fi/translations.xml @@ -477,7 +477,6 @@ Haluatko varmasti jatkaa?" "Suurin sallittu tiedostokoko on: %1$s" "Valitse lähetettävän videon laatu." "Valitse videon lähetyslaatu" - "Etsi emojeja" "Olet jo kirjautuneena tälle laitteelle käyttäjällä %1$s." "Kotipalvelimesi on päivitettävä tukemaan Matrix Authentication Serviceä ja tilin luomista." "Pysyvän linkin luominen epäonnistui" diff --git a/libraries/ui-strings/src/main/res/values-fr/translations.xml b/libraries/ui-strings/src/main/res/values-fr/translations.xml index a6cbd9b48e..8d550ae51e 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -452,7 +452,6 @@ Raison : %1$s." "La taille maximale de fichier autorisée est: %1$s" "Sélectionnez la qualité des vidéos que vous souhaitez envoyer." "Sélectionnez la qualité d’envoi des vidéos" - "Chercher des emojis" "Vous êtes déjà connecté sur cet appareil en tant que %1$s." "Votre serveur d’accueil doit être mis à jour pour prendre en charge le protocole MAS (Matrix Authentication Service) et la création de compte." "Échec de la création du permalien" diff --git a/libraries/ui-strings/src/main/res/values-hu/translations.xml b/libraries/ui-strings/src/main/res/values-hu/translations.xml index af1c071227..0a37baf199 100644 --- a/libraries/ui-strings/src/main/res/values-hu/translations.xml +++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml @@ -467,7 +467,6 @@ Biztos, hogy folytatja?" "A legnagyobb megengedett fájlméret: %1$s" "Válassza ki a feltöltendő videó minőségét." "Feltöltött videó minőségének kiválasztása" - "Emodzsik keresése" "Már bejelentkezett erre az eszközre, mint %1$s." "A Matrix-kiszolgálót frissíteni kell a Matrix Authentication Service és a fióklétrehozás támogatásához." "Nem sikerült létrehozni az állandó hivatkozást" diff --git a/libraries/ui-strings/src/main/res/values-in/translations.xml b/libraries/ui-strings/src/main/res/values-in/translations.xml index ac74be0e8e..5527a10802 100644 --- a/libraries/ui-strings/src/main/res/values-in/translations.xml +++ b/libraries/ui-strings/src/main/res/values-in/translations.xml @@ -439,7 +439,6 @@ Apakah Anda yakin ingin melanjutkan?" "Ukuran file maksimum yang diizinkan adalah: %1$s" "Pilih kualitas video yang ingin Anda unggah." "Pilih kualitas unggahan video" - "Cari emoji" "Anda sudah masuk ke akun di perangkat ini sebagai%1$s ." "Homeserver Anda perlu ditingkatkan untuk mendukung Matrix Authentication Service dan pembuatan akun." "Gagal membuat tautan permanen" diff --git a/libraries/ui-strings/src/main/res/values-it/translations.xml b/libraries/ui-strings/src/main/res/values-it/translations.xml index 394e043e07..3b47c41665 100644 --- a/libraries/ui-strings/src/main/res/values-it/translations.xml +++ b/libraries/ui-strings/src/main/res/values-it/translations.xml @@ -467,7 +467,6 @@ Sei sicuro di voler continuare?" "La dimensione massima consentita per il file è: %1$s" "Seleziona la qualità del video che vuoi caricare." "Seleziona la qualità di caricamento del video" - "Cerca emoji" "Hai già effettuato l\'accesso su questo dispositivo come %1$s ." "Il tuo homeserver deve essere aggiornato per supportare il Matrix Authentication Service e la creazione di account." "Impossibile creare il collegamento permanente" diff --git a/libraries/ui-strings/src/main/res/values-ja/translations.xml b/libraries/ui-strings/src/main/res/values-ja/translations.xml index 9ab50981dc..7f54e420b8 100644 --- a/libraries/ui-strings/src/main/res/values-ja/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ja/translations.xml @@ -452,7 +452,6 @@ "アップロードできる最大サイズは %1$s です。" "アップロードする画質を選択してください。" "動画のアップロード品質を選択" - "絵文字を検索" "この端末では既に %1$s としてログインしています。" "Matrix Authentication Service とアカウント作成に対応するため、このホームサーバーはアップグレードが必要です。" "固定リンクの作成に失敗しました" diff --git a/libraries/ui-strings/src/main/res/values-ko/translations.xml b/libraries/ui-strings/src/main/res/values-ko/translations.xml index 3010ef136c..e97fe17ca5 100644 --- a/libraries/ui-strings/src/main/res/values-ko/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ko/translations.xml @@ -443,7 +443,6 @@ " "업로드할 비디오의 품질을 선택하세요." "비디오 업로드 품질 선택" - "이모지 검색" "이 기기에서 이미 %1$s님으로 로그인되어 있습니다." "Matrix Authentication Service 및 계정 생성을 지원하려면 홈서버를 업그레이드해야 합니다." "퍼머링크 생성 실패" From 93786cdcbb821f53abe7c871b2e5026c62c21cdb Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 23 Jul 2026 14:23:05 +0200 Subject: [PATCH 23/24] Use roomMember.getBestName() in SuggestionPickerView --- .../impl/messagecomposer/suggestions/SuggestionsPickerView.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt index d19061d8ed..a4d8453d10 100644 --- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt +++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/messagecomposer/suggestions/SuggestionsPickerView.kt @@ -41,6 +41,7 @@ import io.element.android.libraries.matrix.api.core.RoomId import io.element.android.libraries.matrix.api.core.UserId import io.element.android.libraries.matrix.api.room.RoomMember import io.element.android.libraries.matrix.api.room.RoomMembershipState +import io.element.android.libraries.matrix.api.room.getBestName import io.element.android.libraries.matrix.ui.components.DisplayNameWithStatus import io.element.android.libraries.matrix.ui.model.getAvatarData import io.element.android.libraries.slashcommands.api.SlashCommandSuggestion @@ -115,7 +116,7 @@ private fun SuggestionItemView( } val title: String? = when (suggestion) { is ResolvedSuggestion.AtRoom -> stringResource(R.string.screen_room_mentions_at_room_title) - is ResolvedSuggestion.Member -> suggestion.roomMember.displayName ?: suggestion.roomMember.userId.value + is ResolvedSuggestion.Member -> suggestion.roomMember.getBestName() is ResolvedSuggestion.Alias -> suggestion.roomName is ResolvedSuggestion.Command -> suggestion.command.command } From 72c47f7c419de51e0ff1b943aa6d8ff7f2d87e09 Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Thu, 23 Jul 2026 15:38:33 +0200 Subject: [PATCH 24/24] Add warning to the 'Scan QR code' screen (#7264) * Add warning to the 'Scan QR code' screen * Update screenshots --------- Co-authored-by: ElementBot --- .../impl/screens/desktop/DesktopNoticeView.kt | 21 ++++++++++++++++--- .../impl/src/main/res/values/localazy.xml | 1 + ...ens.desktop_DesktopNoticeView_Day_0_en.png | 4 ++-- ...ens.desktop_DesktopNoticeView_Day_1_en.png | 4 ++-- ...s.desktop_DesktopNoticeView_Night_0_en.png | 4 ++-- ...s.desktop_DesktopNoticeView_Night_1_en.png | 4 ++-- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/desktop/DesktopNoticeView.kt b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/desktop/DesktopNoticeView.kt index c7f0bb61e7..ad2e67dbc7 100644 --- a/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/desktop/DesktopNoticeView.kt +++ b/features/linknewdevice/impl/src/main/kotlin/io/element/android/features/linknewdevice/impl/screens/desktop/DesktopNoticeView.kt @@ -9,21 +9,25 @@ package io.element.android.features.linknewdevice.impl.screens.desktop +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.unit.dp +import io.element.android.compound.theme.ElementTheme import io.element.android.compound.tokens.generated.CompoundIcons import io.element.android.features.linknewdevice.impl.R import io.element.android.libraries.designsystem.atomic.organisms.NumberedListOrganism @@ -34,6 +38,7 @@ import io.element.android.libraries.designsystem.preview.PreviewsDayNight import io.element.android.libraries.designsystem.theme.LocalBuildMeta import io.element.android.libraries.designsystem.theme.components.Button import io.element.android.libraries.designsystem.theme.components.Icon +import io.element.android.libraries.designsystem.theme.components.Text import io.element.android.libraries.designsystem.utils.annotatedTextWithBold import io.element.android.libraries.permissions.api.PermissionsView import kotlinx.collections.immutable.persistentListOf @@ -71,11 +76,10 @@ fun DesktopNoticeView( } ) { Column( - Modifier.fillMaxWidth() + Modifier.fillMaxWidth(), ) { Spacer(modifier = Modifier.height(40.dp)) NumberedListOrganism( - modifier = Modifier.fillMaxSize(), items = persistentListOf( AnnotatedString(stringResource(R.string.screen_link_new_device_desktop_step1, appName)), annotatedTextWithBold( @@ -88,6 +92,17 @@ fun DesktopNoticeView( AnnotatedString(stringResource(R.string.screen_link_new_device_desktop_step3)), ) ) + Spacer(modifier = Modifier.height(32.dp)) + Text( + modifier = Modifier + .clip(RoundedCornerShape(12.dp)) + .background(ElementTheme.colors.bgCriticalSubtle) + .padding(16.dp) + .fillMaxWidth(), + text = stringResource(R.string.screen_link_new_device_desktop_warning), + style = ElementTheme.typography.fontBodyMdMedium, + color = ElementTheme.colors.textCriticalPrimary, + ) } } diff --git a/features/linknewdevice/impl/src/main/res/values/localazy.xml b/features/linknewdevice/impl/src/main/res/values/localazy.xml index 6ffcce227a..47d25cbff6 100644 --- a/features/linknewdevice/impl/src/main/res/values/localazy.xml +++ b/features/linknewdevice/impl/src/main/res/values/localazy.xml @@ -5,6 +5,7 @@ "Scan the QR code with this device" "Ready to scan" "Open %1$s on a desktop computer to get the QR code" + "Only scan a QR code after following the steps above on your own device. Never scan a code sent by another person." "The numbers don’t match" "Enter 2-digit code" "This will verify that the connection to your other device is secure." diff --git a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_0_en.png index b1fef99b4a..a83e8f7923 100644 --- a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b0acb8106154715ea852d54e6a8c06dec3ed367f14cd4a6eb7ea68baab11014 -size 43495 +oid sha256:3e6d5e199d232901dfddcfaf6d2821e0a9a7bf2b98db7dcfe4d8db40ba4176f4 +size 60579 diff --git a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_1_en.png index 300ffa1122..51090926ba 100644 --- a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:88609772b74d36b5bd1f0d192a6dd10e9c5c324e670b02932b6d2204c92cdfff -size 42846 +oid sha256:aa0ea6f6fd6ed40abd3d6a1055a2f0d034208c518bd5841e5536cb9c83dd292d +size 56366 diff --git a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_0_en.png index 01618be617..4c26bd27c9 100644 --- a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_0_en.png +++ b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_0_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d8c70e27a0b88c40e6ea2a3e8b03ec3f5034eef8c25843f16677e75354eff1be -size 42244 +oid sha256:80cc35d9eea08e8ce92a1025c3432f7e10821493896b1cd5156ae5382cdac14e +size 58031 diff --git a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_1_en.png index 638fb99be6..c59e81351c 100644 --- a/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.linknewdevice.impl.screens.desktop_DesktopNoticeView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f0b25c02e6c1c1d70e560c8d570d2a0224b2496ebcc1f782be03f247038a62f2 -size 40846 +oid sha256:9a3e89bd126e83ace147edacfa70b3ad8930d2485f3165f89e2b08ce7e94cf61 +size 53462