From 0fc9e148abff9f692b4b5310dd26f9717099e751 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Oct 2025 11:13:45 +0200 Subject: [PATCH 1/7] Set a sound to the noisy notification channel --- .../channels/NotificationChannels.kt | 21 +++++++++++++++++- .../push/impl/src/main/res/raw/message.mp3 | Bin 0 -> 22414 bytes 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 libraries/push/impl/src/main/res/raw/message.mp3 diff --git a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt index da5e0dc785..f5f0ce5cca 100644 --- a/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt +++ b/libraries/push/impl/src/main/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannels.kt @@ -7,8 +7,12 @@ package io.element.android.libraries.push.impl.notifications.channels +import android.content.ContentResolver +import android.content.Context import android.media.AudioAttributes +import android.media.AudioAttributes.USAGE_NOTIFICATION import android.media.AudioManager +import android.net.Uri import android.os.Build import android.provider.Settings import androidx.annotation.ChecksSdkIntAtLeast @@ -19,6 +23,7 @@ import dev.zacsweers.metro.ContributesBinding import dev.zacsweers.metro.Inject import dev.zacsweers.metro.SingleIn import io.element.android.appconfig.NotificationConfig +import io.element.android.libraries.di.annotations.ApplicationContext import io.element.android.libraries.push.impl.R import io.element.android.services.toolbox.api.strings.StringProvider @@ -26,7 +31,7 @@ import io.element.android.services.toolbox.api.strings.StringProvider * IDs for channels * ========================================================================================== */ internal const val SILENT_NOTIFICATION_CHANNEL_ID = "DEFAULT_SILENT_NOTIFICATION_CHANNEL_ID_V2" -internal const val NOISY_NOTIFICATION_CHANNEL_ID = "DEFAULT_NOISY_NOTIFICATION_CHANNEL_ID" +internal const val NOISY_NOTIFICATION_CHANNEL_ID = "DEFAULT_NOISY_NOTIFICATION_CHANNEL_ID_V2" internal const val CALL_NOTIFICATION_CHANNEL_ID = "CALL_NOTIFICATION_CHANNEL_ID_V3" internal const val RINGING_CALL_NOTIFICATION_CHANNEL_ID = "RINGING_CALL_NOTIFICATION_CHANNEL_ID" @@ -61,6 +66,8 @@ private fun supportNotificationChannels() = Build.VERSION.SDK_INT >= Build.VERSI class DefaultNotificationChannels( private val notificationManager: NotificationManagerCompat, private val stringProvider: StringProvider, + @ApplicationContext + private val context: Context, ) : NotificationChannels { init { createNotificationChannels() @@ -94,6 +101,7 @@ class DefaultNotificationChannels( // Migration - Remove deprecated channels for (channelId in listOf( "DEFAULT_SILENT_NOTIFICATION_CHANNEL_ID", + "DEFAULT_NOISY_NOTIFICATION_CHANNEL_ID", "CALL_NOTIFICATION_CHANNEL_ID", "CALL_NOTIFICATION_CHANNEL_ID_V2", "LISTEN_FOR_EVENTS_NOTIFICATION_CHANNEL_ID", @@ -112,6 +120,17 @@ class DefaultNotificationChannels( NOISY_NOTIFICATION_CHANNEL_ID, NotificationManagerCompat.IMPORTANCE_DEFAULT ) + .setSound( + Uri.Builder() + .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) + // Strangely wwe have to provide a "//" before the package name + .path("//" + context.packageName + "/" + R.raw.message) + .build(), + AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setUsage(USAGE_NOTIFICATION) + .build(), + ) .setName(stringProvider.getString(R.string.notification_channel_noisy).ifEmpty { "Noisy notifications" }) .setDescription(stringProvider.getString(R.string.notification_channel_noisy)) .setVibrationEnabled(true) diff --git a/libraries/push/impl/src/main/res/raw/message.mp3 b/libraries/push/impl/src/main/res/raw/message.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5e9645adaf1f2b7435ef29360c690b8ddc405d3a GIT binary patch literal 22414 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 Date: Tue, 7 Oct 2025 11:30:58 +0200 Subject: [PATCH 2/7] Update Localazy config and sync all the strings. --- .../impl/src/main/res/values-da/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-de/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-fr/translations.xml | 4 ++-- .../impl/src/main/res/values-nb/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-ro/translations.xml | 11 +++++++++++ .../impl/src/main/res/values-da/translations.xml | 2 ++ .../impl/src/main/res/values-de/translations.xml | 2 ++ .../impl/src/main/res/values-fr/translations.xml | 2 ++ .../impl/src/main/res/values-nb/translations.xml | 2 ++ .../impl/src/main/res/values-ro/translations.xml | 2 ++ .../impl/src/main/res/values-ru/translations.xml | 2 ++ .../home/impl/src/main/res/values/localazy.xml | 2 ++ .../impl/src/main/res/values-da/translations.xml | 14 +++++++------- .../impl/src/main/res/values-de/translations.xml | 14 +++++++------- .../impl/src/main/res/values-nb/translations.xml | 14 +++++++------- .../impl/src/main/res/values-ro/translations.xml | 4 ++-- .../joinroom/impl/src/main/res/values/localazy.xml | 14 +++++++------- .../impl/src/main/res/values-da/translations.xml | 6 ++++++ .../impl/src/main/res/values-de/translations.xml | 6 ++++++ .../impl/src/main/res/values-fr/translations.xml | 5 +++++ .../impl/src/main/res/values-nb/translations.xml | 6 ++++++ .../impl/src/main/res/values-ro/translations.xml | 6 ++++++ .../impl/src/main/res/values-ru/translations.xml | 4 ++++ .../impl/src/main/res/values-nb/translations.xml | 1 + .../impl/src/main/res/values-da/translations.xml | 3 +++ .../impl/src/main/res/values-de/translations.xml | 3 +++ .../impl/src/main/res/values-nb/translations.xml | 4 ++++ .../impl/src/main/res/values-nb/translations.xml | 1 + .../impl/src/main/res/values-da/translations.xml | 3 +++ .../impl/src/main/res/values-de/translations.xml | 1 + .../impl/src/main/res/values-nb/translations.xml | 7 +++++++ .../src/main/res/values-da/translations.xml | 5 +++++ .../src/main/res/values-de/translations.xml | 4 ++++ .../src/main/res/values-fr/translations.xml | 2 ++ .../src/main/res/values-nb/translations.xml | 8 ++++++++ .../src/main/res/values-ro/translations.xml | 3 +++ .../src/main/res/values-ru/translations.xml | 6 ------ .../ui-strings/src/main/res/values/localazy.xml | 7 ------- tools/localazy/config.json | 1 + 39 files changed, 169 insertions(+), 45 deletions(-) create mode 100644 features/announcement/impl/src/main/res/values-da/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-de/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-nb/translations.xml create mode 100644 features/announcement/impl/src/main/res/values-ro/translations.xml diff --git a/features/announcement/impl/src/main/res/values-da/translations.xml b/features/announcement/impl/src/main/res/values-da/translations.xml new file mode 100644 index 0000000000..933ae95d6d --- /dev/null +++ b/features/announcement/impl/src/main/res/values-da/translations.xml @@ -0,0 +1,11 @@ + + + "Se klynger, du har oprettet eller tilmeldt dig" + "Acceptere eller afvise invitationer til klynger" + "Finde alle rum, du kan deltage i, i dine klynger" + "Deltage i offentlige klynger" + "Forlade de klynger, du har tilsluttet dig" + "Oprettelse og administration af klynger kommer snart." + "Velkommen til betaversionen af Klynger! Med denne første version kan du:" + "Introduktion til Klynger" + diff --git a/features/announcement/impl/src/main/res/values-de/translations.xml b/features/announcement/impl/src/main/res/values-de/translations.xml new file mode 100644 index 0000000000..c38a9b5cd9 --- /dev/null +++ b/features/announcement/impl/src/main/res/values-de/translations.xml @@ -0,0 +1,11 @@ + + + "Von dir erstellte oder beigetretene Spaces anzeigen" + "Einladungen zu Spaces annehmen oder ablehnen" + "Chats innerhalb deiner Spaces entdecken, um ihnen beizutreten" + "Öffentlichen Spaces beitreten" + "Spaces verlassen, bei denen du Mitglied bist" + "Das Erstellen und Verwalten von Spaces ist bald verfügbar." + "Willkommen bei der Beta-Version von Spaces! Mit dieser ersten Version kannst du:" + "Einführung in Spaces" + diff --git a/features/announcement/impl/src/main/res/values-fr/translations.xml b/features/announcement/impl/src/main/res/values-fr/translations.xml index a529e99100..04a35b0fc0 100644 --- a/features/announcement/impl/src/main/res/values-fr/translations.xml +++ b/features/announcement/impl/src/main/res/values-fr/translations.xml @@ -2,9 +2,9 @@ "Voir les espaces que vous avez créés ou rejoints" "Accepter ou refuser les invitations aux espaces" - "Découvrez les salons que vous pouvez joindre depuis vos espaces" + "Découvrir les salons que vous pouvez joindre depuis vos espaces" "Rejoindre les espaces publics" - "Quittez les espaces dont vous êtes membre." + "Quitter les espaces dont vous êtes membre." "La création et la gestion des espaces seront bientôt disponibles." "Bienvenue dans la version bêta des espaces! Avec cette première version, vous pourrez :" "Ajout des espaces" diff --git a/features/announcement/impl/src/main/res/values-nb/translations.xml b/features/announcement/impl/src/main/res/values-nb/translations.xml new file mode 100644 index 0000000000..0765e557f8 --- /dev/null +++ b/features/announcement/impl/src/main/res/values-nb/translations.xml @@ -0,0 +1,11 @@ + + + "Se områder du har opprettet eller blitt med i" + "Godta eller avslå invitasjoner til områder" + "Oppdag alle rom du kan bli med i i dine områder" + "Bli med i offentlige områder" + "Forlat områder du har blitt med i" + "Oppretting og administrasjon av områder kommer snart." + "Velkommen til betaversjonen av Områder! Med denne første versjonen kan du:" + "Vi introduserer Områder" + diff --git a/features/announcement/impl/src/main/res/values-ro/translations.xml b/features/announcement/impl/src/main/res/values-ro/translations.xml new file mode 100644 index 0000000000..48fa06fca4 --- /dev/null +++ b/features/announcement/impl/src/main/res/values-ro/translations.xml @@ -0,0 +1,11 @@ + + + "Vizualizați spațiile pe care le-ați creat sau la care v-ați alăturat" + "Acceptați sau refuzați invitațiile la spații" + "Descoperiți toate camerele la care vă puteți alătura în spațiile dumneavoastră." + "Alăturați-vă spațiilor publice" + "Părăsiți spațiile la care v-ați alăturat." + "Crearea și gestionarea spațiilor vor fi disponibile în curând." + "Bun venit la versiunea beta a Spațiilor! Cu această primă versiune puteți:" + "Vă prezentăm Spații" + diff --git a/features/home/impl/src/main/res/values-da/translations.xml b/features/home/impl/src/main/res/values-da/translations.xml index b5cc2ef7cb..b686fb6e03 100644 --- a/features/home/impl/src/main/res/values-da/translations.xml +++ b/features/home/impl/src/main/res/values-da/translations.xml @@ -3,6 +3,8 @@ "Deaktiver batterioptimering for denne app for at sikre, at alle notifikationer dukker op." "Deaktivér optimering" "Modtager du ikke notifikationer?" + "Dit notifikationsping er blevet opdateret – tydeligere, hurtigere og mindre forstyrrende." + "Vi har opdateret dine lyde" "Gendan din kryptografiske identitet og meddelelseshistorik med en gendannelsesnøgle, hvis du har mistet alle dine eksisterende enheder." "Opsæt gendannelse" "Konfigurer gendannelse for at beskytte din konto" diff --git a/features/home/impl/src/main/res/values-de/translations.xml b/features/home/impl/src/main/res/values-de/translations.xml index 0596dc45e4..2502df5fc1 100644 --- a/features/home/impl/src/main/res/values-de/translations.xml +++ b/features/home/impl/src/main/res/values-de/translations.xml @@ -3,6 +3,8 @@ "Deaktiviere die Batterieoptimierung für diese App, um sicherzustellen, dass alle Benachrichtigungen empfangen werden." "Optimierung deaktivieren" "Kommen die Benachrichtigungen nicht an?" + "Dein Benachrichtigungs-Ping wurde aktualisiert – klarer, schneller und weniger störend." + "Wir haben deine Sounds aktualisiert" "Stelle Deine kryptographische Identität und Deinen Nachrichtenverlauf mit Hilfe eines Wiederherstellungsschlüssels wieder her, falls du alle deine Geräte verloren haben solltest" "Wiederherstellung einrichten" "Wiederherstellung einrichten" diff --git a/features/home/impl/src/main/res/values-fr/translations.xml b/features/home/impl/src/main/res/values-fr/translations.xml index 11f842916f..d54e8fb943 100644 --- a/features/home/impl/src/main/res/values-fr/translations.xml +++ b/features/home/impl/src/main/res/values-fr/translations.xml @@ -3,6 +3,8 @@ "Désactivez l’optimisation de la batterie pour cette application afin de vous assurer que toutes les notifications sont reçues." "Désactiver l’optimisation" "Ils vous manque des notifications?" + "Le son des notifications a été modifié: plus clair, plus court et moins perturbateur." + "Nous avons rafraîchi les sons" "Générez une nouvelle clé de récupération qui peut être utilisée pour restaurer l’historique de vos messages chiffrés au cas où vous perdriez l’accès à vos appareils." "Configurer la sauvegarde" "Configurer la récupération" diff --git a/features/home/impl/src/main/res/values-nb/translations.xml b/features/home/impl/src/main/res/values-nb/translations.xml index 172ca33485..42216442cb 100644 --- a/features/home/impl/src/main/res/values-nb/translations.xml +++ b/features/home/impl/src/main/res/values-nb/translations.xml @@ -3,6 +3,8 @@ "Deaktiver batterioptimalisering for denne appen for å sikre at alle varsler mottas." "Deaktiver optimalisering" "Kommer ikke varslene frem?" + "Varslingssignalet ditt er oppdatert – tydeligere, raskere og mindre forstyrrende." + "Vi har oppdatert lydene dine" "Gjenopprett din kryptografiske identitet og meldingshistorikk med en gjenopprettingsnøkkel hvis du har mistet alle dine brukte enheter." "Konfigurer gjenoppretting" "Konfigurer gjenoppretting for å beskytte kontoen din" diff --git a/features/home/impl/src/main/res/values-ro/translations.xml b/features/home/impl/src/main/res/values-ro/translations.xml index 36a32bf089..e4a80b4fb7 100644 --- a/features/home/impl/src/main/res/values-ro/translations.xml +++ b/features/home/impl/src/main/res/values-ro/translations.xml @@ -3,6 +3,8 @@ "Dezactivați optimizarea bateriei pentru această aplicație, pentru a vă asigura că toate notificările sunt primite." "Dezactivați optimizarea" "Nu primiți notificări?" + "Sunetul pentru notificări a fost actualizat — mai clar, mai rapid și mai puțin perturbatoar." + "Am reîmprospătat sunetele" "Recuperați-vă identitatea criptografică și mesajele anterioare cu o cheie de recuperare dacă ați pierdut toate dispozitivele existente." "Configurați recuperarea" "Configurați recuperarea pentru a vă proteja contul" diff --git a/features/home/impl/src/main/res/values-ru/translations.xml b/features/home/impl/src/main/res/values-ru/translations.xml index 975e48a160..0f77d56db4 100644 --- a/features/home/impl/src/main/res/values-ru/translations.xml +++ b/features/home/impl/src/main/res/values-ru/translations.xml @@ -3,6 +3,8 @@ "Выключите оптимизацию расхода батареи, чтобы убедиться, что все уведомления будут поступать." "Выключить оптимизацию" "Уведомления не поступают?" + "Ваши уведомления были обновлены — теперь они понятнее, быстрее и менее отвлекающие." + "Мы обновили ваши звуки" "Создайте новый ключ восстановления, который можно использовать для восстановления зашифрованной истории сообщений в случае потери доступа к своим устройствам." "Настроить восстановление" "Для защиты вашего аккаунта рекомендуется настроить восстановление" diff --git a/features/home/impl/src/main/res/values/localazy.xml b/features/home/impl/src/main/res/values/localazy.xml index e6e09b5e47..80a263a179 100644 --- a/features/home/impl/src/main/res/values/localazy.xml +++ b/features/home/impl/src/main/res/values/localazy.xml @@ -3,6 +3,8 @@ "Disable battery optimisation for this app, to make sure all notifications are received." "Disable optimisation" "Notifications not arriving?" + "Your notification ping has been updated—clearer, quicker, and less disruptive." + "We’ve refreshed your sounds" "Recover your cryptographic identity and message history with a recovery key if you have lost all your existing devices." "Set up recovery" "Set up recovery to protect your account" diff --git a/features/joinroom/impl/src/main/res/values-da/translations.xml b/features/joinroom/impl/src/main/res/values-da/translations.xml index ff85698b23..ac1cd26191 100644 --- a/features/joinroom/impl/src/main/res/values-da/translations.xml +++ b/features/joinroom/impl/src/main/res/values-da/translations.xml @@ -1,7 +1,7 @@ - "Du blev spærret fra dette rum af %1$s." - "Du blev spærret fra dette rum" + "Du blev spærret af %1$s." + "Du blev spærret" "Årsag: %1$s." "Annuller anmodning" "Ja, annullér" @@ -11,12 +11,12 @@ "Er du sikker på, at du vil afvise invitationen til at deltage i dette rum? Dette forhindrer også %1$s i at kontakte dig eller invitere dig til andre rum." "Afvis invitation og blokér" "Afvis og blokér" - "Deltagelse i rummet fejlede." - "Dette rum er enten kun for gæster, eller der kan være sat begrænsninger for adgangen på klyngeniveau." - "Glem dette rum" - "Du har brug for en invitation for at deltage i dette rum" + "Deltagelse fejlede." + "Du skal enten inviteres til at deltage, eller der kan være adgangsbegrænsninger." + "Glem" + "Du har brug for en invitation for at deltage" "Inviteret af" - "Deltag i rummet" + "Deltag" "Du skal muligvis være inviteret eller være medlem af en klynge for at deltage." "Send anmodning om at deltage" "Tilladte tegn %1$d af %2$d" diff --git a/features/joinroom/impl/src/main/res/values-de/translations.xml b/features/joinroom/impl/src/main/res/values-de/translations.xml index 7971edbeff..c6d97d6fcb 100644 --- a/features/joinroom/impl/src/main/res/values-de/translations.xml +++ b/features/joinroom/impl/src/main/res/values-de/translations.xml @@ -1,7 +1,7 @@ - "Du wurdest von %1$s für diesen Chat gesperrt." - "Du wurdest für diesen Chat gesperrt" + "Du wurdest von %1$s gesperrt." + "Du wurdest gesperrt" "Grund:%1$s." "Anfrage abbrechen" "Ja, abbrechen" @@ -11,12 +11,12 @@ "Bist du sicher, dass du die Einladung zu diesem Chat ablehnen möchtest? Dadurch wird auch jede weitere Kontaktaufnahme oder Chat Einladung von %1$s blockiert." "Einladung ablehnen & Nutzer blockieren" "Ablehnen und blockieren" - "Der Beitritt zum Chat schlug fehl." - "Dieser Chat ist entweder nur auf Einladung zugänglich oder es gibt andere Zugangsbeschränkungen durch Spaces." - "Vergiss diesen Chat" - "Du benötigst eine Einladung, um diesem Chat beizutreten" + "Beitritt fehlgeschlagen" + "Du musst entweder eingeladen werden, um beizutreten, oder es gibt möglicherweise Zugriffsbeschränkungen." + "Vergessen" + "Du benötigst eine Einladung, um beizutreten" "Eingeladen von" - "Chat beitreten" + "Beitreten" "Möglicherweise musst du eingeladen werden oder ein Mitglied eines Spaces sein, um beitreten zu können." "Anklopfen" "%1$d von %2$d erlaubte Zeichen" diff --git a/features/joinroom/impl/src/main/res/values-nb/translations.xml b/features/joinroom/impl/src/main/res/values-nb/translations.xml index f494bfa4f8..5c4873bc57 100644 --- a/features/joinroom/impl/src/main/res/values-nb/translations.xml +++ b/features/joinroom/impl/src/main/res/values-nb/translations.xml @@ -1,7 +1,7 @@ - "Du ble utestengt fra dette rommet av %1$s." - "Du ble utestengt fra dette rommet" + "Du ble utestengt av %1$s." + "Du ble utestengt" "Årsak: %1$s." "Avbryt forespørsel" "Ja, avbryt" @@ -11,12 +11,12 @@ "Er du sikker på at du vil avslå invitasjonen til å bli med i dette rommet? Dette vil også forhindre %1$s fra å kontakte deg eller invitere deg til rom." "Avslå invitasjon og blokker" "Avslå og blokker" - "Å bli med i rommet mislyktes." - "Dette rommet er enten kun for inviterte, eller det kan være begrensninger for tilgang på områdenivå." - "Glem dette rommet" - "Du trenger en invitasjon for å bli med i dette rommet" + "Kunne ikke bli med" + "Du må enten bli invitert til å bli med, eller så kan det være begrensninger på tilgangen." + "Glem" + "Du trenger en invitasjon for å bli med" "Invitert av" - "Bli med i rommet" + "Bli med" "Du må kanskje bli invitert eller være medlem av et område for å bli med." "Send forespørsel om å bli med" "Tillatte tegn %1$d av %2$d" diff --git a/features/joinroom/impl/src/main/res/values-ro/translations.xml b/features/joinroom/impl/src/main/res/values-ro/translations.xml index 2246013403..8326ce06bf 100644 --- a/features/joinroom/impl/src/main/res/values-ro/translations.xml +++ b/features/joinroom/impl/src/main/res/values-ro/translations.xml @@ -1,6 +1,6 @@ - "Ai fost exclus din această cameră de către %1$s." + "Ați fost exclus din această cameră de către %1$s." "Ați fost exclus din această cameră." "Motiv: %1$s." "Anulați cererea" @@ -16,7 +16,7 @@ "Uitați această cameră" "Aveți nevoie de o invitație pentru a vă alătura acestei camere." "Invitat de" - "Alăturați-vă camerei" + "Alăturați-vă" "Este posibil să fie necesar să fiți invitat sau să fiți membru al unui spațiu pentru a vă alătura." "Trimiteți o cerere de alăturare" "Caractere permise %1$d din %2$d" diff --git a/features/joinroom/impl/src/main/res/values/localazy.xml b/features/joinroom/impl/src/main/res/values/localazy.xml index 3d6a319aa6..0e1787fc0b 100644 --- a/features/joinroom/impl/src/main/res/values/localazy.xml +++ b/features/joinroom/impl/src/main/res/values/localazy.xml @@ -1,7 +1,7 @@ - "You were banned from this room by %1$s." - "You were banned from this room" + "You were banned by %1$s." + "You were banned" "Reason: %1$s." "Cancel request" "Yes, cancel" @@ -11,12 +11,12 @@ "Are you sure you want to decline the invite to join this room? This will also prevent %1$s from contacting you or inviting you to rooms." "Decline invite & block" "Decline and block" - "Joining the room failed." - "This room is either invite-only or there might be restrictions to access at space level." - "Forget this room" - "You need an invite in order to join this room" + "Joining failed" + "You either need to be invited to join or there might be restrictions to access." + "Forget" + "You need an invite in order to join" "Invited by" - "Join room" + "Join" "You may need to be invited or be a member of a space in order to join." "Send request to join" "Allowed characters %1$d of %2$d" diff --git a/features/preferences/impl/src/main/res/values-da/translations.xml b/features/preferences/impl/src/main/res/values-da/translations.xml index acf9fe4087..f258fb0952 100644 --- a/features/preferences/impl/src/main/res/values-da/translations.xml +++ b/features/preferences/impl/src/main/res/values-da/translations.xml @@ -10,6 +10,7 @@ "Ugyldig URL, sørg for at inkludere protokollen (http/https) og den korrekte adresse." "Skjul avatarer i anmodninger om invitation til rum" "Skjul forhåndsvisning af medier i tidslinjen" + "Laboratorier" "Upload fotos og videoer hurtigere, og reducér dataforbrug" "Optimér mediekvaliteten" "Moderation og sikkerhed" @@ -43,6 +44,11 @@ "Kan ikke opdatere profilen" "Redigér profil" "Opdaterer profil…" + "Aktivér svar-tråde" + "Appen genstarter for at anvende denne ændring." + "Prøv vores nyeste idéer under udvikling. Disse funktioner er ikke færdige; de ​​kan være ustabile og kan ændre sig." + "Er du i humør til at eksperimentere?" + "Laboratorier" "Yderligere indstillinger" "Lyd- og videoopkald" "Uoverensstemmelse i konfigurationen" diff --git a/features/preferences/impl/src/main/res/values-de/translations.xml b/features/preferences/impl/src/main/res/values-de/translations.xml index 4072207fb4..c3722ec88c 100644 --- a/features/preferences/impl/src/main/res/values-de/translations.xml +++ b/features/preferences/impl/src/main/res/values-de/translations.xml @@ -10,6 +10,7 @@ "Ungültige URL, bitte gib das Protokoll (http/https) und die richtige Adresse an." "Avatare in Chateinladungen ausblenden" "Medienvorschau im Nachrichtenverlauf ausblenden" + "Labs" "Lade Fotos und Videos schneller hoch und reduziere den Datenverbrauch" "Optimiere die Medienqualität" "Moderation und Sicherheit" @@ -43,6 +44,11 @@ "Profil kann nicht aktualisiert werden" "Profil bearbeiten" "Profil wird aktualisiert…" + "Thread-Antworten aktivieren" + "Die App wird neu gestartet, um diese Änderung zu übernehmen." + "Probier unsere neuesten Ideen in der Entwicklung aus. Diese Funktionen sind noch nicht fertiggestellt; sie können instabil sein und sich noch ändern." + "Entdeckungsfreudig?" + "Labs" "Zusätzliche Einstellungen" "Audio- und Videoanrufe" "Konfiguration stimmt nicht überein" diff --git a/features/preferences/impl/src/main/res/values-fr/translations.xml b/features/preferences/impl/src/main/res/values-fr/translations.xml index dbb0b13326..19cc8f464a 100644 --- a/features/preferences/impl/src/main/res/values-fr/translations.xml +++ b/features/preferences/impl/src/main/res/values-fr/translations.xml @@ -10,6 +10,7 @@ "URL invalide, assurez-vous d’inclure le protocol (http/https) et l’adresse correcte." "Masquer les avatars des salons dans les invitations" "Masquer les aperçus des médias dans les discussions" + "Expérimental" "Téléchargez des photos et des vidéos plus rapidement et réduisez la consommation de données" "Optimisez la qualité des médias" "Modération et sécurité" @@ -43,6 +44,10 @@ "Impossible de mettre à jour le profil" "Modifier le profil" "Mise à jour du profil…" + "Activez les fils de discussion." + "Découvrez nos dernières idées en cours de développement. Ces fonctionnalités ne sont pas encore finalisées; elles peuvent être instables et évoluer." + "Envie d’expérimenter?" + "Expérimental" "Réglages supplémentaires" "Appels audio et vidéo" "Incompatibilité de configuration" diff --git a/features/preferences/impl/src/main/res/values-nb/translations.xml b/features/preferences/impl/src/main/res/values-nb/translations.xml index f30bbc9e90..90ec12a1a1 100644 --- a/features/preferences/impl/src/main/res/values-nb/translations.xml +++ b/features/preferences/impl/src/main/res/values-nb/translations.xml @@ -10,6 +10,7 @@ "Ugyldig URL. Pass på at du inkluderer protokollen (http/https) og riktig adresse." "Skjul avatarer i invitasjonsforespørsler til rom" "Skjul forhåndsvisninger av medier på tidslinjen" + "Prøvefunksjoner" "Last opp bilder og videoer raskere og reduser databruken" "Optimaliser mediekvaliteten" "Moderasjon og sikkerhet" @@ -43,6 +44,11 @@ "Kan ikke oppdatere profilen" "Rediger profil" "Oppdaterer profilen…" + "Aktiver trådsvar" + "Appen vil starte på nytt for å implementere denne endringen." + "Prøv ut våre nyeste ideer under utvikling. Disse funksjonene er ikke ferdig utviklet; de kan være ustabile og kan endres." + "Lyst til å prøve noe nytt?" + "Prøvefunksjoner" "Ytterligere innstillinger" "Lyd- og videosamtaler" "Uoverensstemmelse i konfigurasjonen" diff --git a/features/preferences/impl/src/main/res/values-ro/translations.xml b/features/preferences/impl/src/main/res/values-ro/translations.xml index 5977771ee6..6f8e41c5b9 100644 --- a/features/preferences/impl/src/main/res/values-ro/translations.xml +++ b/features/preferences/impl/src/main/res/values-ro/translations.xml @@ -10,6 +10,7 @@ "URL invalid, vă rugăm să vă asigurați că includeți protocolul (http/https) și adresa corectă." "Ascundeți avatarele din invitațiile pentru camere" "Ascundeți previzualizările media în lista de mesaje" + "Laboratoare" "Încărcați fotografii și videoclipuri mai rapid și reduceți consumul de date" "Optimizați calitatea media" "Moderare și siguranță" @@ -43,6 +44,11 @@ "Nu s-a putut actualiza profilul" "Editați profilul" "Se actualizează profilul…" + "Activați răspunsurile în fir" + "Aplicația va reporni pentru a aplica această modificare." + "Încercați cele mai noi idei în curs de dezvoltare. Aceste funcții nu sunt finalizate; pot fi instabile și pot suferi modificări." + "Doriți experiențe noi?" + "Laboratoare" "Setări adiționale" "Apeluri audio și video" "Nepotrivire de configurație" diff --git a/features/preferences/impl/src/main/res/values-ru/translations.xml b/features/preferences/impl/src/main/res/values-ru/translations.xml index 72a9f75c7c..6ac5a5d03c 100644 --- a/features/preferences/impl/src/main/res/values-ru/translations.xml +++ b/features/preferences/impl/src/main/res/values-ru/translations.xml @@ -44,6 +44,10 @@ "Невозможно обновить профиль" "Редактировать профиль" "Обновление профиля…" + "Включить ответы в топике" + "Попробуйте наши последние идеи в разработке. Эти функции ещё не завершены, они могут быть нестабильны и могут измениться." + "Хотите попробовать?" + "Лаборатория" "Дополнительные параметры" "Аудио и видео звонки" "Несоответствие конфигурации" diff --git a/features/rageshake/impl/src/main/res/values-nb/translations.xml b/features/rageshake/impl/src/main/res/values-nb/translations.xml index 277effef92..4fa4d0a653 100644 --- a/features/rageshake/impl/src/main/res/values-nb/translations.xml +++ b/features/rageshake/impl/src/main/res/values-nb/translations.xml @@ -14,5 +14,6 @@ "Send skjermbilde" "Logger vil bli inkludert i meldingen din, for å sikre at alt fungerer som det skal. For å sende meldingen uten logger, slå av denne innstillingen." "%1$s krasjet sist gang den ble brukt. Vil du dele en krasjrapport med oss?" + "Hvis du har problemer med varsler, kan det å laste opp varslingsinnstillingene hjelpe oss med å finne den underliggende årsaken." "Vis logger" diff --git a/features/space/impl/src/main/res/values-da/translations.xml b/features/space/impl/src/main/res/values-da/translations.xml index ec7da700a9..7953f32e99 100644 --- a/features/space/impl/src/main/res/values-da/translations.xml +++ b/features/space/impl/src/main/res/values-da/translations.xml @@ -6,5 +6,8 @@ "Forlad %1$d rum og klynger" "Vælg de rum, du vil forlade, som du ikke er den eneste administrator for:" + "Du skal tildele en anden administrator til denne klynge, før du kan forlade den." + "Du vil ikke blive fjernet fra følgende rum, fordi du er den eneste administrator:" "Forlad %1$s?" + "Du er den eneste administrator for %1$s" diff --git a/features/space/impl/src/main/res/values-de/translations.xml b/features/space/impl/src/main/res/values-de/translations.xml index d42e979ef1..6fd5d7c76b 100644 --- a/features/space/impl/src/main/res/values-de/translations.xml +++ b/features/space/impl/src/main/res/values-de/translations.xml @@ -6,5 +6,8 @@ "%1$d Chats und Space verlassen" "Dadurch wirst du auch aus allen Chats in diesem Space entfernt." + "Du musst einen anderen Admin für diesen Space zuweisen, bevor du ihn verlassen kannst." + "Du wirst aus den folgenden Chats nicht entfernt, weil du der einzige Admin bist:" "%1$s verlassen?" + "Du bist der einzige Administrator für %1$s" diff --git a/features/space/impl/src/main/res/values-nb/translations.xml b/features/space/impl/src/main/res/values-nb/translations.xml index e25a2ba6f0..aafe1d756f 100644 --- a/features/space/impl/src/main/res/values-nb/translations.xml +++ b/features/space/impl/src/main/res/values-nb/translations.xml @@ -1,5 +1,9 @@ + "%1$s (Admin)" "Velg rommene du vil forlate, som du ikke er den eneste administratoren for:" + "Du må tildele en annen administrator for dette området før du kan forlate det." + "Du vil ikke bli fjernet fra følgende rom fordi du er den eneste administratoren:" "Forlat %1$s?" + "Du er den eneste administratoren for %1$s" diff --git a/features/verifysession/impl/src/main/res/values-nb/translations.xml b/features/verifysession/impl/src/main/res/values-nb/translations.xml index 2696ae62f4..bec26b129e 100644 --- a/features/verifysession/impl/src/main/res/values-nb/translations.xml +++ b/features/verifysession/impl/src/main/res/values-nb/translations.xml @@ -18,6 +18,7 @@ "Sammenlign tallene" "Nå kan du lese eller sende meldinger sikkert på den andre enheten din." "Nå kan du stole på identiteten til denne brukeren når du sender eller mottar meldinger." + "Enheten er verifisert" "Skriv inn gjenopprettingsnøkkel" "Enten ble forespørselen tidsavbrutt, forespørselen ble avslått eller det var en feil i verifiseringen." "Bevis at det er deg for å få tilgang til den krypterte meldingshistorikken din." diff --git a/libraries/push/impl/src/main/res/values-da/translations.xml b/libraries/push/impl/src/main/res/values-da/translations.xml index 17893b5135..255605953b 100644 --- a/libraries/push/impl/src/main/res/values-da/translations.xml +++ b/libraries/push/impl/src/main/res/values-da/translations.xml @@ -64,7 +64,10 @@ "Blokerede brugere" "Få navnet på den aktuelle udbyder." "Ingen push-udbydere valgt." + "Nuværende push-udbyder: %1$s og nuværende distributør: %2$s. Men distributøren %3$s kan ikke findes. Måske er applikationen blevet afinstalleret?" + "Nuværende push-udbyder: %1$s, men der er ikke konfigureret nogen distributører." "Nuværende push-udbyder: %1$s." + "Nuværende push-udbyder: %1$s (%2$s)" "Nuværende push-udbyder" "Sørg for, at programmet understøtter mindst én push-udbyder." "Ingen push-udbyder understøttelse fundet." diff --git a/libraries/push/impl/src/main/res/values-de/translations.xml b/libraries/push/impl/src/main/res/values-de/translations.xml index 81e1815168..4ded5207f2 100644 --- a/libraries/push/impl/src/main/res/values-de/translations.xml +++ b/libraries/push/impl/src/main/res/values-de/translations.xml @@ -65,6 +65,7 @@ "Ermittele den Namen des aktuellen Anbieters." "Kein Dienst für Push-Benachrichtigungen ausgewählt." "Aktueller Push-Dienst: %1$s." + "Aktueller Push-Dienst: %1$s (%2$s)" "Aktueller Push-Dienst" "Stelle sicher, dass die Anwendung mindestens einen Push-Dienst hat." "Keine Unterstützung für Push-Dienst gefunden." diff --git a/libraries/push/impl/src/main/res/values-nb/translations.xml b/libraries/push/impl/src/main/res/values-nb/translations.xml index 08c327acdb..7f8cc41413 100644 --- a/libraries/push/impl/src/main/res/values-nb/translations.xml +++ b/libraries/push/impl/src/main/res/values-nb/translations.xml @@ -55,11 +55,18 @@ "Google Services" "Ingen gyldige Google Play-tjenester funnet. Det kan hende at varsler ikke fungerer som de skal." "Sjekker blokkerte brukere" + "Vis blokkerte brukere" "Ingen brukere er blokkert." + + "Du blokkerte%1$d bruker. Du vil ikke motta varsler for denne brukeren." + "Du blokkerte%1$d brukere. Du vil ikke motta varsler for disse brukerne." + "Blokkerte brukere" "Få navnet på den nåværende tilbyderen." "Ingen push-leverandører er valgt." + "Nåværende push-leverandør: %1$s, men ingen distributører er konfigurert." "Gjeldende push-leverandør: %1$s." + "Nåværende push-leverandør: %1$s (%2$s)" "Nåværende push-leverandør" "Påse at applikasjonen har minst én push-leverandør." "Ingen push-leverandører funnet." 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 d411d3d0d1..93295756b9 100644 --- a/libraries/ui-strings/src/main/res/values-da/translations.xml +++ b/libraries/ui-strings/src/main/res/values-da/translations.xml @@ -94,6 +94,7 @@ "Har du glemt din adgangskode?" "Videresend" "Gå tilbage" + "Gå til indstillinger" "Ignorér" "Invitér" "Invitér andre" @@ -110,6 +111,7 @@ "Administrer konto" "Administrer enheder" "Besked" + "Minimér" "Næste" "Nej" "Ikke nu" @@ -176,6 +178,7 @@ "Du blev logget ud af sessionen" "Udseende" "Lyd" + "Beta" "Blokerede brugere" "Bobler" "Opkald startet" @@ -225,6 +228,7 @@ "Installer APK" "Dette Matrix-ID kan ikke findes, så invitationen modtages muligvis ikke." "Forlader rummet" + "Forlader klynge" "Lyst tema" "Linje kopieret til udklipsholder" "Linket er kopieret til udklipsholderen" @@ -313,6 +317,7 @@ "Indstillinger" "Del klynge" "Delt placering" + "Delt klynge" "Logger ud" "Noget gik galt" "Vi stødte på et problem. Prøv venligst igen." 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 a5557b2b60..6528cd924f 100644 --- a/libraries/ui-strings/src/main/res/values-de/translations.xml +++ b/libraries/ui-strings/src/main/res/values-de/translations.xml @@ -94,6 +94,7 @@ "Passwort vergessen?" "Weiterleiten" "Zurück" + "Zu den Einstellungen" "Ignorieren" "Einladen" "Nutzer einladen" @@ -110,6 +111,7 @@ "Konto verwalten" "Geräte verwalten" "Nachricht" + "Minimieren" "Weiter" "Nein" "Später" @@ -176,6 +178,7 @@ "Du wurdest aus der Sitzung abgemeldet." "Erscheinungsbild" "Audio" + "Beta" "Blockierte Nutzer" "Sprechblasen" "Anruf gestartet" @@ -314,6 +317,7 @@ Grund: %1$s." "Einstellungen" "Space teilen" "Geteilter Standort" + "Gemeinsamer Space" "Abmelden" "Es ist ein Fehler aufgetreten." "Wir haben ein Problem festgestellt. Bitte versuch es erneut." 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 3dce6a923c..d35d9886fa 100644 --- a/libraries/ui-strings/src/main/res/values-fr/translations.xml +++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml @@ -94,6 +94,7 @@ "Mot de passe oublié ?" "Transférer" "Retour" + "Ouvrir les paramètres" "Ignorer" "Inviter" "Inviter des amis" @@ -177,6 +178,7 @@ "Vous avez été déconnecté de la session" "Apparence" "Audio" + "Bêta" "Utilisateurs bloqués" "Bulles" "Appel démarré" 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 eb2f8cc5b1..6f21f7b86c 100644 --- a/libraries/ui-strings/src/main/res/values-nb/translations.xml +++ b/libraries/ui-strings/src/main/res/values-nb/translations.xml @@ -93,6 +93,7 @@ "Glemt passordet?" "Videresend" "Gå tilbake" + "Gå til innstillinger" "Ignorer" "Inviter" "Inviter folk" @@ -109,6 +110,7 @@ "Administrer konto" "Administrer enheter" "Melding" + "Minimer" "Neste" "Nei" "Ikke nå" @@ -175,6 +177,7 @@ "Du ble logget ut av økten" "Utseende" "Lyd" + "Beta" "Blokkerte brukere" "Bobler" "Samtale startet" @@ -189,6 +192,7 @@ "Mørk" "Dekrypteringsfeil" "Beskrivelse" + "Velg bort alle" "Alternativer for utviklere" "Enhets-ID" "Direkte chat" @@ -223,6 +227,7 @@ "Installer APK" "Finner ikke denne Matrix-IDen, så invitasjonen blir kanskje ikke mottatt." "Forlater rommet" + "Forlater området" "Lys" "Linje kopiert til utklippstavlen" "Lenke kopiert til utklippstavlen" @@ -298,6 +303,7 @@ "Sikkerhet" "Sett av" "Velg en konto" + "Velg alle" "Sendt til" "Sender…" "Kunne ikke sende" @@ -308,6 +314,7 @@ "Innstillinger" "Del område" "Delt posisjon" + "Delt område" "Logger av" "Noe gikk galt" "Vi har støtt på et problem. Vennligst prøv igjen." @@ -453,6 +460,7 @@ Er du sikker på at du vil fortsette?" "Del denne lokasjonen" "Områder du har opprettet eller blitt med i." "%1$s • %2$s" + "%1$s område" "Områder" "Meldingen ble ikke sendt fordi %1$ss verifiserte identitet er tilbakestilt." "Meldingen ble ikke sendt fordi %1$s ikke har verifisert alle enheter." 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 9fe88da203..905969debb 100644 --- a/libraries/ui-strings/src/main/res/values-ro/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ro/translations.xml @@ -96,6 +96,7 @@ "Ați uitat parola?" "Redirecționați" "Înapoi" + "Mergeți la setări" "Ignorați" "Invitați" "Invitați prieteni" @@ -179,6 +180,7 @@ "Ați fost deconectat din sesiune." "Aspect" "Audio" + "Beta" "Utilizatori blocați" "Baloane" "A început un apel" @@ -323,6 +325,7 @@ Motiv:%1$s." "Setări" "Partajați spațiul" "Locație partajată" + "Spațiu comun" "Deconectare în curs" "Ceva nu a mers bine" "Am întâmpinat o problemă. Vă rugăm să încercați din nou." 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 5773be3e1d..d8fe1367bb 100644 --- a/libraries/ui-strings/src/main/res/values-ru/translations.xml +++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml @@ -166,8 +166,6 @@ "Да, попробуйте еще раз" "Теперь ваш сервер поддерживает новый, более быстрый протокол. Чтобы обновить его прямо сейчас, выйдите и войдите в свою учётную запись снова. Сделав это сейчас, вы сможете избежать принудительного выхода из системы при последующем удалении старого протокола." "Доступно обновление" - "Ваши уведомления были обновлены — теперь они понятнее, быстрее и менее отвлекающие." - "Мы обновили ваши звуки" "О приложении" "Политика допустимого использования" "Добавить аккаунт" @@ -433,10 +431,6 @@ "Параметры" "Удалить %1$s" "Настройки" - "Включить ответы в топике" - "Попробуйте наши последние идеи в разработке. Эти функции ещё не завершены, они могут быть нестабильны и могут измениться." - "Хотите попробовать?" - "Лаборатория" "Не удалось выбрать носитель, попробуйте еще раз." "Нажмите на сообщение и выберите “%1$s”, чтобы добавить его сюда." "Закрепите важные сообщения, чтобы их можно было легко найти" diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml index 9b254127ee..dab9506ae5 100644 --- a/libraries/ui-strings/src/main/res/values/localazy.xml +++ b/libraries/ui-strings/src/main/res/values/localazy.xml @@ -166,8 +166,6 @@ "Yes, try again" "Your server now supports a new, faster protocol. Log out and log back in to upgrade now. Doing this now will help you avoid a forced logout when the old protocol is removed later." "Upgrade available" - "Your notification ping has been updated—clearer, quicker, and less disruptive." - "We’ve refreshed your sounds" "About" "Acceptable use policy" "Add an account" @@ -428,11 +426,6 @@ Are you sure you want to continue?" "Options" "Remove %1$s" "Settings" - "Enable thread replies" - "Restarting the app is required to apply changes" - "Try out our latest ideas in development. These features are not finalised; they may be unstable, may change." - "Feeling experimental?" - "Labs" "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 3840e5f38c..82c273db2e 100644 --- a/tools/localazy/config.json +++ b/tools/localazy/config.json @@ -185,6 +185,7 @@ "confirm_recovery_key_banner_.*", "banner\\.set_up_recovery\\..*", "banner\\.battery_optimization\\..*", + "banner\\.new_sound\\..*", "full_screen_intent_banner_.*", "screen_migration_.*", "screen_invites_.*" From 2f1866afd8f84d6d1541035f061b9a58334cc327 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Oct 2025 11:31:18 +0200 Subject: [PATCH 3/7] New notification sound banner --- .../components/NewNotificationSoundBanner.kt | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/NewNotificationSoundBanner.kt diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/NewNotificationSoundBanner.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/NewNotificationSoundBanner.kt new file mode 100644 index 0000000000..f7516e41e8 --- /dev/null +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/NewNotificationSoundBanner.kt @@ -0,0 +1,43 @@ +/* + * 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.home.impl.components + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import io.element.android.features.home.impl.R +import io.element.android.libraries.designsystem.components.Announcement +import io.element.android.libraries.designsystem.components.AnnouncementType +import io.element.android.libraries.designsystem.preview.ElementPreview +import io.element.android.libraries.designsystem.preview.PreviewsDayNight +import io.element.android.libraries.ui.strings.CommonStrings + +@Composable +internal fun NewNotificationSoundBanner( + onDismissClick: () -> Unit, + modifier: Modifier = Modifier, +) { + Announcement( + modifier = modifier.roomListBannerPadding(), + title = stringResource(R.string.banner_new_sound_title), + description = stringResource(R.string.banner_new_sound_message), + type = AnnouncementType.Actionable( + actionText = stringResource(CommonStrings.action_ok), + onActionClick = onDismissClick, + onDismissClick = onDismissClick, + ), + ) +} + +@PreviewsDayNight +@Composable +internal fun NewNotificationSoundBannerPreview() = ElementPreview { + NewNotificationSoundBanner( + onDismissClick = {}, + ) +} From 71d2c1d9df23d4a0ebbee296671d56482c3acb4b Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Oct 2025 12:16:49 +0200 Subject: [PATCH 4/7] Add isFreshInstall Boolean to allow the miration to behave in a different way for an application upgrade or a fresh install. We cannot restore the previous code which existed because of https://github.com/element-hq/element-x-android/pull/3535 --- .../migration/impl/MigrationPresenter.kt | 4 +++- .../migration/impl/migrations/AppMigration.kt | 2 +- .../impl/migrations/AppMigration01.kt | 2 +- .../impl/migrations/AppMigration02.kt | 2 +- .../impl/migrations/AppMigration03.kt | 4 ++-- .../impl/migrations/AppMigration04.kt | 2 +- .../impl/migrations/AppMigration05.kt | 2 +- .../impl/migrations/AppMigration06.kt | 2 +- .../impl/migrations/AppMigration07.kt | 2 +- .../migration/impl/MigrationPresenterTest.kt | 21 ++++++++++++------- .../impl/migrations/AppMigration01Test.kt | 2 +- .../impl/migrations/AppMigration02Test.kt | 2 +- .../impl/migrations/AppMigration03Test.kt | 2 +- .../impl/migrations/AppMigration04Test.kt | 2 +- .../impl/migrations/AppMigration05Test.kt | 4 ++-- .../impl/migrations/AppMigration06Test.kt | 4 ++-- .../impl/migrations/AppMigration07Test.kt | 2 +- 17 files changed, 35 insertions(+), 26 deletions(-) diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt index 7edbc5389f..d4e6d6dc37 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/MigrationPresenter.kt @@ -31,6 +31,7 @@ class MigrationPresenter( ) : Presenter { private val orderedMigrations = migrations.sortedBy { it.order } private val lastMigration: Int = orderedMigrations.lastOrNull()?.order ?: 0 + private var isFreshInstall = false @Composable override fun present(): MigrationState { @@ -49,6 +50,7 @@ class MigrationPresenter( val migrationValue = migrationStoreVersion ?: return@LaunchedEffect if (migrationValue == -1) { Timber.d("Fresh install, or previous installed application did not have the migration mechanism.") + isFreshInstall = true } if (migrationValue == lastMigration) { Timber.d("Current app migration version: $migrationValue. No migration needed.") @@ -59,7 +61,7 @@ class MigrationPresenter( val nextMigration = orderedMigrations.firstOrNull { it.order > migrationValue } if (nextMigration != null) { Timber.d("Current app migration version: $migrationValue. Applying migration: ${nextMigration.order}") - nextMigration.migrate() + nextMigration.migrate(isFreshInstall) migrationStore.setApplicationMigrationVersion(nextMigration.order) } } diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration.kt index a0327e8b09..f14ec89dbe 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration.kt @@ -9,5 +9,5 @@ package io.element.android.features.migration.impl.migrations interface AppMigration { val order: Int - suspend fun migrate() + suspend fun migrate(isFreshInstall: Boolean) } diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt index 048a400f6c..88fdb16b9e 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01.kt @@ -22,7 +22,7 @@ class AppMigration01( ) : AppMigration { override val order: Int = 1 - override suspend fun migrate() { + override suspend fun migrate(isFreshInstall: Boolean) { logFilesRemover.perform() } } diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt index 44f4806c65..0ba2712427 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02.kt @@ -27,7 +27,7 @@ class AppMigration02( ) : AppMigration { override val order: Int = 2 - override suspend fun migrate() { + override suspend fun migrate(isFreshInstall: Boolean) { coroutineScope { for (session in sessionStore.getAllSessions()) { val sessionId = SessionId(session.userId) diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt index 0cb3573954..e24e18a205 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03.kt @@ -21,7 +21,7 @@ class AppMigration03( ) : AppMigration { override val order: Int = 3 - override suspend fun migrate() { - migration01.migrate() + override suspend fun migrate(isFreshInstall: Boolean) { + migration01.migrate(isFreshInstall) } } diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04.kt index 8ab4921038..f1f16b7a97 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04.kt @@ -27,7 +27,7 @@ class AppMigration04( } override val order: Int = 4 - override suspend fun migrate() { + override suspend fun migrate(isFreshInstall: Boolean) { runCatchingExceptions { context.getDatabasePath(NOTIFICATION_FILE_NAME).delete() } } } diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05.kt index 109ff7e0b7..2a60822c5d 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05.kt @@ -22,7 +22,7 @@ class AppMigration05( ) : AppMigration { override val order: Int = 5 - override suspend fun migrate() { + override suspend fun migrate(isFreshInstall: Boolean) { val allSessions = sessionStore.getAllSessions() for (session in allSessions) { if (session.sessionPath.isEmpty()) { diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06.kt index 2eb98b9e5f..be3050f919 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06.kt @@ -25,7 +25,7 @@ class AppMigration06( ) : AppMigration { override val order: Int = 6 - override suspend fun migrate() { + override suspend fun migrate(isFreshInstall: Boolean) { val allSessions = sessionStore.getAllSessions() for (session in allSessions) { if (session.cachePath.isEmpty()) { diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07.kt index fe88817796..5367323b75 100644 --- a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07.kt +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07.kt @@ -22,7 +22,7 @@ class AppMigration07( ) : AppMigration { override val order: Int = 7 - override suspend fun migrate() { + override suspend fun migrate(isFreshInstall: Boolean) { logFilesRemover.perform { file -> file.name.startsWith("logs-") } diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt index 635a06f028..e5898ea0dd 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/MigrationPresenterTest.kt @@ -15,8 +15,10 @@ import io.element.android.features.migration.impl.migrations.AppMigration import io.element.android.libraries.architecture.AsyncData import io.element.android.tests.testutils.WarmUpRule import io.element.android.tests.testutils.consumeItemsUntilPredicate -import io.element.android.tests.testutils.lambda.LambdaNoParamRecorder +import io.element.android.tests.testutils.lambda.LambdaOneParamRecorder +import io.element.android.tests.testutils.lambda.lambdaError import io.element.android.tests.testutils.lambda.lambdaRecorder +import io.element.android.tests.testutils.lambda.value import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.runTest import org.junit.Rule @@ -48,13 +50,18 @@ class MigrationPresenterTest { assertThat(store.applicationMigrationVersion().first()).isEqualTo(migrations.maxOf { it.order }) } for (migration in migrations) { - migration.migrateLambda.assertions().isCalledOnce() + migration.migrateLambda.assertions().isCalledOnce().with(value(true)) } } @Test fun `present - no migration should occurs if ApplicationMigrationVersion is the last one`() = runTest { - val migrations = (1..10).map { FakeAppMigration(it) } + val migrations = (1..10).map { + FakeAppMigration( + order = it, + migrateLambda = lambdaRecorder { lambdaError() }, + ) + } val store = InMemoryMigrationStore(migrations.maxOf { it.order }) val presenter = createPresenter( migrationStore = store, @@ -90,7 +97,7 @@ class MigrationPresenterTest { consumeItemsUntilPredicate { it.migrationAction is AsyncData.Success } assertThat(store.applicationMigrationVersion().first()).isEqualTo(migrations.maxOf { it.order }) for (migration in migrations) { - migration.migrateLambda.assertions().isCalledOnce() + migration.migrateLambda.assertions().isCalledOnce().with(value(false)) } } } @@ -106,9 +113,9 @@ private fun createPresenter( private class FakeAppMigration( override val order: Int, - val migrateLambda: LambdaNoParamRecorder = lambdaRecorder { -> }, + val migrateLambda: LambdaOneParamRecorder = lambdaRecorder { }, ) : AppMigration { - override suspend fun migrate() { - migrateLambda() + override suspend fun migrate(isFreshInstall: Boolean) { + migrateLambda(isFreshInstall) } } diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01Test.kt index 580be7d705..6e1b663e3c 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration01Test.kt @@ -17,7 +17,7 @@ class AppMigration01Test { val logsFileRemover = FakeLogFilesRemover() val migration = AppMigration01(logsFileRemover) - migration.migrate() + migration.migrate(true) logsFileRemover.performLambda.assertions().isCalledOnce() } diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt index fb7dbf5281..08c10160b8 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration02Test.kt @@ -30,7 +30,7 @@ class AppMigration02Test { ) val migration = AppMigration02(sessionStore = sessionStore, sessionPreferenceStoreFactory = sessionPreferencesStoreFactory) - migration.migrate() + migration.migrate(true) // We got the session preferences store sessionPreferencesStoreFactory.getLambda.assertions().isCalledOnce() diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt index e4911faaa5..0f4db78aa2 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration03Test.kt @@ -17,7 +17,7 @@ class AppMigration03Test { val logsFileRemover = FakeLogFilesRemover() val migration = AppMigration03(migration01 = AppMigration01(logsFileRemover)) - migration.migrate() + migration.migrate(true) logsFileRemover.performLambda.assertions().isCalledOnce() } diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04Test.kt index f272dadc22..68cbfde689 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration04Test.kt @@ -28,7 +28,7 @@ class AppMigration04Test { val migration = AppMigration04(context) - migration.migrate() + migration.migrate(true) // Check that the file has been deleted assertThat(file.exists()).isFalse() diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05Test.kt index af71905635..ff5b8cd40a 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration05Test.kt @@ -27,7 +27,7 @@ class AppMigration05Test { ) ) val migration = AppMigration05(sessionStore = sessionStore, baseDirectory = File("/a/path")) - migration.migrate() + migration.migrate(true) val storedData = sessionStore.getSession(A_SESSION_ID.value)!! assertThat(storedData.sessionPath).isEqualTo("/a/path/${A_SESSION_ID.value.replace(':', '_')}") } @@ -43,7 +43,7 @@ class AppMigration05Test { ) ) val migration = AppMigration05(sessionStore = sessionStore, baseDirectory = File("/a/path")) - migration.migrate() + migration.migrate(true) val storedData = sessionStore.getSession(A_SESSION_ID.value)!! assertThat(storedData.sessionPath).isEqualTo("/a/path/existing") } diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06Test.kt index 095085cd17..e7e15ba821 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration06Test.kt @@ -28,7 +28,7 @@ class AppMigration06Test { ) ) val migration = AppMigration06(sessionStore = sessionStore, cacheDirectory = File("/a/path/cache")) - migration.migrate() + migration.migrate(true) val storedData = sessionStore.getSession(A_SESSION_ID.value)!! assertThat(storedData.cachePath).isEqualTo("/a/path/cache/AN_ID") } @@ -44,7 +44,7 @@ class AppMigration06Test { ) ) val migration = AppMigration05(sessionStore = sessionStore, baseDirectory = File("/a/path/cache")) - migration.migrate() + migration.migrate(true) val storedData = sessionStore.getSession(A_SESSION_ID.value)!! assertThat(storedData.cachePath).isEqualTo("/a/path/existing") } diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07Test.kt index a375ef8563..a2575b32df 100644 --- a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07Test.kt +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration07Test.kt @@ -24,7 +24,7 @@ class AppMigration07Test { } val logsFileRemover = FakeLogFilesRemover(performLambda = performLambda) val migration = AppMigration07(logsFileRemover) - migration.migrate() + migration.migrate(true) performLambda.assertions().isCalledOnce() } } From 4475ed0d37be151c9ae68dccb2aa811642cebbed Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Oct 2025 12:20:24 +0200 Subject: [PATCH 5/7] Show new notification sound banner logic --- .../impl/components/RoomListContentView.kt | 6 ++++ .../roomlist/RoomListContentStateProvider.kt | 5 +++ .../home/impl/roomlist/RoomListEvents.kt | 1 + .../home/impl/roomlist/RoomListPresenter.kt | 15 ++++++-- .../home/impl/roomlist/RoomListState.kt | 1 + .../impl/roomlist/RoomListPresenterTest.kt | 33 ++++++++++++++++++ .../impl/migrations/AppMigration08.kt | 30 ++++++++++++++++ .../impl/migrations/AppMigration08Test.kt | 34 +++++++++++++++++++ .../api/store/AppPreferencesStore.kt | 3 ++ .../impl/store/DefaultAppPreferencesStore.kt | 14 ++++++++ .../test/InMemoryAppPreferencesStore.kt | 10 ++++++ 11 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08.kt create mode 100644 features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08Test.kt diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt index 2845a79b8e..34d036b204 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/components/RoomListContentView.kt @@ -251,6 +251,12 @@ private fun RoomsViewList( item { BatteryOptimizationBanner(state = state.batteryOptimizationState) } + } else if (state.showNewNotificationSoundBanner) { + item { + NewNotificationSoundBanner( + onDismissClick = { updatedEventSink(RoomListEvents.DismissNewNotificationSoundBanner) }, + ) + } } } diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt index a421c239cb..0cc2fd6282 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListContentStateProvider.kt @@ -26,17 +26,22 @@ open class RoomListContentStateProvider : PreviewParameterProvider = aRoomListRoomSummaryList(), fullScreenIntentPermissionsState: FullScreenIntentPermissionsState = aFullScreenIntentPermissionsState(), batteryOptimizationState: BatteryOptimizationState = aBatteryOptimizationState(), seenRoomInvites: Set = emptySet(), ) = RoomListContentState.Rooms( securityBannerState = securityBannerState, + showNewNotificationSoundBanner = showNewNotificationSoundBanner, fullScreenIntentPermissionsState = fullScreenIntentPermissionsState, batteryOptimizationState = batteryOptimizationState, summaries = summaries, diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt index 02df2cac35..52da613be7 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListEvents.kt @@ -14,6 +14,7 @@ sealed interface RoomListEvents { data class UpdateVisibleRange(val range: IntRange) : RoomListEvents data object DismissRequestVerificationPrompt : RoomListEvents data object DismissBanner : RoomListEvents + data object DismissNewNotificationSoundBanner : RoomListEvents data object ToggleSearchResults : RoomListEvents data class ShowContextMenu(val roomSummary: RoomListRoomSummary) : RoomListEvents diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt index 7b51e4797e..72a666a124 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenter.kt @@ -98,6 +98,7 @@ class RoomListPresenter( } var securityBannerDismissed by rememberSaveable { mutableStateOf(false) } + val showNewNotificationSoundBanner by appPreferencesStore.showNewNotificationSoundBanner().collectAsState(false) // Avatar indicator val hideInvitesAvatar by client.rememberHideInvitesAvatar() @@ -112,6 +113,9 @@ class RoomListPresenter( } RoomListEvents.DismissRequestVerificationPrompt -> securityBannerDismissed = true RoomListEvents.DismissBanner -> securityBannerDismissed = true + RoomListEvents.DismissNewNotificationSoundBanner -> coroutineScope.launch { + appPreferencesStore.setShowNewNotificationSoundBanner(false) + } RoomListEvents.ToggleSearchResults -> searchState.eventSink(RoomListSearchEvents.ToggleSearchVisibility) is RoomListEvents.ShowContextMenu -> { coroutineScope.showContextMenu(event, contextMenu) @@ -141,7 +145,10 @@ class RoomListPresenter( } } - val contentState = roomListContentState(securityBannerDismissed) + val contentState = roomListContentState( + securityBannerDismissed, + showNewNotificationSoundBanner, + ) val canReportRoom by produceState(false) { value = client.canReportRoom() } @@ -197,6 +204,7 @@ class RoomListPresenter( @Composable private fun roomListContentState( securityBannerDismissed: Boolean, + showNewNotificationSoundBanner: Boolean, ): RoomListContentState { val roomSummaries by produceState(initialValue = AsyncData.Loading()) { roomListDataSource.allRooms.collect { value = AsyncData.Success(it) } @@ -215,11 +223,14 @@ class RoomListPresenter( val seenRoomInvites by remember { seenInvitesStore.seenRoomIds() }.collectAsState(emptySet()) val securityBannerState by rememberSecurityBannerState(securityBannerDismissed) return when { - showEmpty -> RoomListContentState.Empty(securityBannerState = securityBannerState) + showEmpty -> RoomListContentState.Empty( + securityBannerState = securityBannerState, + ) showSkeleton -> RoomListContentState.Skeleton(count = 16) else -> { RoomListContentState.Rooms( securityBannerState = securityBannerState, + showNewNotificationSoundBanner = showNewNotificationSoundBanner, fullScreenIntentPermissionsState = fullScreenIntentPermissionsPresenter.present(), batteryOptimizationState = batteryOptimizationPresenter.present(), summaries = roomSummaries.dataOrNull().orEmpty().toPersistentList(), diff --git a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt index 4a301f0897..80cd6394e8 100644 --- a/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt +++ b/features/home/impl/src/main/kotlin/io/element/android/features/home/impl/roomlist/RoomListState.kt @@ -69,6 +69,7 @@ sealed interface RoomListContentState { val securityBannerState: SecurityBannerState, val fullScreenIntentPermissionsState: FullScreenIntentPermissionsState, val batteryOptimizationState: BatteryOptimizationState, + val showNewNotificationSoundBanner: Boolean, val summaries: ImmutableList, val seenRoomInvites: ImmutableSet, ) : RoomListContentState diff --git a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt index bde004cf82..041c43dab0 100644 --- a/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt +++ b/features/home/impl/src/test/kotlin/io/element/android/features/home/impl/roomlist/RoomListPresenterTest.kt @@ -75,6 +75,7 @@ import io.element.android.tests.testutils.lambda.value import io.element.android.tests.testutils.test import io.element.android.tests.testutils.testCoroutineDispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.first import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runTest @@ -593,6 +594,38 @@ class RoomListPresenterTest { } } + @Test + fun `present - notification sound banner`() = runTest { + val subscribeToVisibleRoomsLambda = lambdaRecorder { _: List -> } + val roomListService = FakeRoomListService(subscribeToVisibleRoomsLambda = subscribeToVisibleRoomsLambda) + val matrixClient = FakeMatrixClient( + roomListService = roomListService, + ) + val roomSummary = aRoomSummary( + currentUserMembership = CurrentUserMembership.INVITED + ) + roomListService.postAllRoomsLoadingState(RoomList.LoadingState.Loaded(1)) + roomListService.postAllRooms(listOf(roomSummary)) + val store = InMemoryAppPreferencesStore() + val presenter = createRoomListPresenter( + client = matrixClient, + appPreferencesStore = store, + ) + presenter.test { + assertThat(store.showNewNotificationSoundBanner().first()).isFalse() + skipItems(1) + val state = awaitItem() + assertThat(state.contentAsRooms().showNewNotificationSoundBanner).isFalse() + store.setShowNewNotificationSoundBanner(true) + assertThat(store.showNewNotificationSoundBanner().first()).isTrue() + assertThat(awaitItem().contentAsRooms().showNewNotificationSoundBanner).isTrue() + state.eventSink(RoomListEvents.DismissNewNotificationSoundBanner) + assertThat(awaitItem().contentAsRooms().showNewNotificationSoundBanner).isFalse() + // Ensure store has been updated + assertThat(store.showNewNotificationSoundBanner().first()).isFalse() + } + } + private fun TestScope.createRoomListPresenter( client: MatrixClient = FakeMatrixClient(), leaveRoomState: LeaveRoomState = aLeaveRoomState(), diff --git a/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08.kt b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08.kt new file mode 100644 index 0000000000..df1a508a6d --- /dev/null +++ b/features/migration/impl/src/main/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08.kt @@ -0,0 +1,30 @@ +/* + * 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.migration.impl.migrations + +import dev.zacsweers.metro.AppScope +import dev.zacsweers.metro.ContributesIntoSet +import dev.zacsweers.metro.Inject +import io.element.android.libraries.preferences.api.store.AppPreferencesStore + +/** + * Ensure the new notification sound banner is displayed, but only on application upgrade. + */ +@ContributesIntoSet(AppScope::class) +@Inject +class AppMigration08( + private val appPreferencesStore: AppPreferencesStore, +) : AppMigration { + override val order: Int = 8 + + override suspend fun migrate(isFreshInstall: Boolean) { + if (!isFreshInstall) { + appPreferencesStore.setShowNewNotificationSoundBanner(true) + } + } +} diff --git a/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08Test.kt b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08Test.kt new file mode 100644 index 0000000000..f908a10bcc --- /dev/null +++ b/features/migration/impl/src/test/kotlin/io/element/android/features/migration/impl/migrations/AppMigration08Test.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2024 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.migration.impl.migrations + +import com.google.common.truth.Truth.assertThat +import io.element.android.libraries.preferences.test.InMemoryAppPreferencesStore +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.test.runTest +import org.junit.Test + +class AppMigration08Test { + @Test + fun `migration on fresh install should not modify the store`() = runTest { + val store = InMemoryAppPreferencesStore() + assertThat(store.showNewNotificationSoundBanner().first()).isFalse() + val migration = AppMigration08(store) + migration.migrate(isFreshInstall = true) + assertThat(store.showNewNotificationSoundBanner().first()).isFalse() + } + + @Test + fun `migration on upgrade should modify the store`() = runTest { + val store = InMemoryAppPreferencesStore() + assertThat(store.showNewNotificationSoundBanner().first()).isFalse() + val migration = AppMigration08(store) + migration.migrate(isFreshInstall = false) + assertThat(store.showNewNotificationSoundBanner().first()).isTrue() + } +} diff --git a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt index 7e47785088..18d7d4f092 100644 --- a/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt +++ b/libraries/preferences/api/src/main/kotlin/io/element/android/libraries/preferences/api/store/AppPreferencesStore.kt @@ -37,5 +37,8 @@ interface AppPreferencesStore { suspend fun setTracingLogPacks(targets: Set) fun getTracingLogPacksFlow(): Flow> + suspend fun setShowNewNotificationSoundBanner(show: Boolean) + fun showNewNotificationSoundBanner(): Flow + suspend fun reset() } diff --git a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt index b3890a8a7d..984503e673 100644 --- a/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt +++ b/libraries/preferences/impl/src/main/kotlin/io/element/android/libraries/preferences/impl/store/DefaultAppPreferencesStore.kt @@ -30,6 +30,7 @@ private val hideInviteAvatarsKey = booleanPreferencesKey("hideInviteAvatars") private val timelineMediaPreviewValueKey = stringPreferencesKey("timelineMediaPreviewValue") private val logLevelKey = stringPreferencesKey("logLevel") private val traceLogPacksKey = stringPreferencesKey("traceLogPacks") +private val showNewNotificationSoundBannerKey = booleanPreferencesKey("showNewNotificationSoundBanner") @ContributesBinding(AppScope::class) @Inject @@ -145,6 +146,19 @@ class DefaultAppPreferencesStore( } } + override suspend fun setShowNewNotificationSoundBanner(show: Boolean) { + store.edit { prefs -> + prefs[showNewNotificationSoundBannerKey] = show + } + } + + override fun showNewNotificationSoundBanner(): Flow { + return store.data.map { prefs -> + // Default is false, but a migration will set it to true on application upgrade (see AppMigration08) + prefs[showNewNotificationSoundBannerKey] ?: false + } + } + override suspend fun reset() { store.edit { it.clear() } } diff --git a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt index d0ee298a66..a601eb6b1d 100644 --- a/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt +++ b/libraries/preferences/test/src/main/kotlin/io/element/android/libraries/preferences/test/InMemoryAppPreferencesStore.kt @@ -22,6 +22,7 @@ class InMemoryAppPreferencesStore( theme: String? = null, logLevel: LogLevel = LogLevel.INFO, traceLockPacks: Set = emptySet(), + showNewNotificationSoundBanner: Boolean = false, ) : AppPreferencesStore { private val isDeveloperModeEnabled = MutableStateFlow(isDeveloperModeEnabled) private val customElementCallBaseUrl = MutableStateFlow(customElementCallBaseUrl) @@ -30,6 +31,7 @@ class InMemoryAppPreferencesStore( private val tracingLogPacks = MutableStateFlow(traceLockPacks) private val hideInviteAvatars = MutableStateFlow(hideInviteAvatars) private val timelineMediaPreviewValue = MutableStateFlow(timelineMediaPreviewValue) + private val showNewNotificationSoundBanner = MutableStateFlow(showNewNotificationSoundBanner) override suspend fun setDeveloperModeEnabled(enabled: Boolean) { isDeveloperModeEnabled.value = enabled @@ -91,6 +93,14 @@ class InMemoryAppPreferencesStore( return tracingLogPacks } + override suspend fun setShowNewNotificationSoundBanner(show: Boolean) { + showNewNotificationSoundBanner.value = show + } + + override fun showNewNotificationSoundBanner(): Flow { + return showNewNotificationSoundBanner + } + override suspend fun reset() { // No op } From 3f9c0bd70d94169adbc12a065c14c65078192411 Mon Sep 17 00:00:00 2001 From: ElementBot Date: Tue, 7 Oct 2025 14:09:53 +0000 Subject: [PATCH 6/7] Update screenshots --- ...me.impl.components_NewNotificationSoundBanner_Day_0_en.png | 3 +++ ....impl.components_NewNotificationSoundBanner_Night_0_en.png | 3 +++ ...ures.home.impl.components_RoomListContentView_Day_5_en.png | 3 +++ ...es.home.impl.components_RoomListContentView_Night_5_en.png | 3 +++ .../images/features.joinroom.impl_JoinRoomView_Day_10_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_14_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_15_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_16_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_1_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_2_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_3_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_4_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_5_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Day_9_en.png | 4 ++-- .../features.joinroom.impl_JoinRoomView_Night_10_en.png | 4 ++-- .../features.joinroom.impl_JoinRoomView_Night_14_en.png | 4 ++-- .../features.joinroom.impl_JoinRoomView_Night_15_en.png | 4 ++-- .../features.joinroom.impl_JoinRoomView_Night_16_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Night_1_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Night_2_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Night_3_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Night_4_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Night_5_en.png | 4 ++-- .../images/features.joinroom.impl_JoinRoomView_Night_9_en.png | 4 ++-- 24 files changed, 52 insertions(+), 40 deletions(-) create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Day_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Night_0_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_5_en.png create mode 100644 tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_5_en.png diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Day_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Day_0_en.png new file mode 100644 index 0000000000..dbfe7bfa4a --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Day_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:367bec41d3cf5e7d0e369a4610584c5a11ca7a69fe26b794290c49027de465a4 +size 23221 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Night_0_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Night_0_en.png new file mode 100644 index 0000000000..0d2f51d4c1 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl.components_NewNotificationSoundBanner_Night_0_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e666d80cb22b979a075ee9b749a36c4f9a4874149ba4d736d745c8311f6e0e85 +size 22563 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_5_en.png new file mode 100644 index 0000000000..e1efabe407 --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Day_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf85a6a94ee3eed576e91c7a3a55e45571dff4a6dce1f6c6bbd22845fb01a76b +size 59896 diff --git a/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_5_en.png new file mode 100644 index 0000000000..70f3c084fe --- /dev/null +++ b/tests/uitests/src/test/snapshots/images/features.home.impl.components_RoomListContentView_Night_5_en.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4646f1622c26a45208fa8ad59c9f531c1794e1874e31e50942f459bf3be3de2 +size 58927 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_10_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_10_en.png index 4f172d6a06..7475ebf250 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fdd74d6df903a0cedfbfc2f30430b5802e4f0bc7b2711e20ae47d297066b056 -size 40297 +oid sha256:c8ed797426703ce250ebb4e0cd0d6753e0581a7751fc35654d12ebe4c0746a9b +size 39351 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_14_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_14_en.png index 0834071308..578db9b288 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:37ac3a032e758c4abf9ac8a87e887c7e015f2d35160d59a7e263963300bd0941 -size 31558 +oid sha256:f892ffadc2999b904be4fc72b0345524a53699386265ff446ee981f815e51ed0 +size 30111 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_15_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_15_en.png index 330bd7edc7..8c7da8b54c 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_15_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_15_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44b9c4608696c6a690e7f00f661b3cb55d03826b11569b6e8ce0a48f9754dd39 -size 38547 +oid sha256:44f1bc19ce7f2db1d2e9ce5a0018d48848c63af21847ec238d08791999df8401 +size 34559 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_16_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_16_en.png index e9ce885cd8..1549fc3041 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f92065e3de67f39ce27ae3e321f59fa2d18b5927752dc760450ec275935b1959 -size 43405 +oid sha256:4b05cd6be3be2571745310c89448bce1562fa191a061549cd3ad0936656933d8 +size 42456 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_1_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_1_en.png index c127d5b02f..0c2e9f7f03 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:919101bfd215af97a098bdfae4980445bd1d0560f96fe9ce13a870e2d8817fff -size 34247 +oid sha256:680f7a4fd4a992e70aef33628faed82c8238109860fe87b91a417d1b880f0a4d +size 33258 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_2_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_2_en.png index a902aef055..33023589e6 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f9707b754041c871c408e12613faa186fa4f4f760ca793caf20c62bae07246b -size 32021 +oid sha256:62a10762a1eb986d6f870d82fd9f5b10803e5178ce4192c4ae6cc17889f44c14 +size 31021 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_3_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_3_en.png index 16ac399dbf..78c6876524 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5ad9105ca2659f51b16b41f9317812590f38adb8431a64a139bb47f54fdf9eff -size 29754 +oid sha256:8f592039e3dcf2036bbfc7e644eddd717bb9c2fac2715077b8744a96d5e8ce94 +size 28712 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_4_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_4_en.png index 78b8500823..12dee69df9 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:04180611d2a959d07bbbd051c4386f6428d841c5ea74e197a80149370db76e04 -size 41830 +oid sha256:2a707c7e9e4a1c91d12733a4002c914feb5365dad1e5fda77b4b3fd862d98916 +size 39587 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_5_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_5_en.png index 644110ef6d..0e57f43ea3 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7c4a828b9aa4e4963e3cb39e6f65f82ff5e595fdccb4dc5b48db532eeac1fb00 -size 31388 +oid sha256:018a813fbd3d3bbae4627fa9acbbbde709d83d67b7292ce02c3cd170572184d6 +size 30602 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_9_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_9_en.png index 593cc05c7a..fd13827148 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Day_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7d0bd66c54a98b59a6b4325735eb34ab9bef7c6807c4fc0e33044ee396e46b14 -size 36344 +oid sha256:19484bb21efbedc60478192da648d035334fb0adf7f6efda0977a3a25e3b6696 +size 35394 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_10_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_10_en.png index edc2a732b6..4e05331ad7 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_10_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_10_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f5a6da57cc5659ba3f3705cba41fd23c7628ba2477fcfc427b8e26bde37ed812 -size 39960 +oid sha256:27c86e8f5c4a00cb13b024bd0cb1375f04d547d03dd35459c4a0853106f1a3c9 +size 39079 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_14_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_14_en.png index 867ef2ea72..f5fe9ed256 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_14_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_14_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5f47c18fda5c4839e1098955f57c4a3e5b9856203c6a84c31903aa5e0b2da46b -size 30971 +oid sha256:6977342388cd3702e94d7b233dcf89ee2b0698ff1f39323c0520a9b88128a3fd +size 29622 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_15_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_15_en.png index 40257d2267..bcfe430ad5 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_15_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_15_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:112286f6a18865db2333a68cb804e930eb873bb04596bada2f825e2223b4f537 -size 37362 +oid sha256:f6993298eb428c9f79a7b837c633b20c69a8170f179bf47af1f967ca2eb28f66 +size 33788 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_16_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_16_en.png index abc81a0d58..d0a42e7563 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_16_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_16_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ff86f906357d0bf611bfc9cd235e66e0247dd7bb66903cb0e5730224d5dc897c -size 43008 +oid sha256:374318e250e1b813025f56ee7121e05905421c6c5657e228bce58f60da9729f2 +size 42137 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_1_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_1_en.png index b480466344..27790717cd 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_1_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_1_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cc849f3158de5cd3cdc64a57e613f3b3a5cd70794e7984d7cfa1f8f425184592 -size 33440 +oid sha256:498e344123c195dadb96125bb2fad6ff7c8647dc1205adbb1e2068820e861631 +size 32516 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_2_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_2_en.png index 9869f158e6..129a92851b 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_2_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_2_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ed211c9bc258185de6ea4cc414fd214f256ad1649c26a8a28f25fd1b29c34783 -size 31630 +oid sha256:d14358f97b6a7267deae81f0ff721fcde2acf63c5baff718beb94c41c9afa022 +size 30696 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_3_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_3_en.png index 42619d6321..8a6464958c 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_3_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_3_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6a88ffdfd4259a2e85b3a8375591eab3b0f12e927eb83f9c6820995acf44d79e -size 29607 +oid sha256:77f4e76bc68f099d5f28f811c004dbc48a5da17edb0576dc76761cbe85ee9bb0 +size 28629 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_4_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_4_en.png index 1b95755ca6..8093435a66 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_4_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_4_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7fbe20a3d4e0c3706ce81c1f52c65ff4f749b0afd6bdd3efb4100ee1019afc51 -size 40580 +oid sha256:a7fc4c0f8964f6cde35dc18ad39cc89249e14af35a10ab7a060e213b622f008b +size 38446 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_5_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_5_en.png index 0211928122..0ceacc4260 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_5_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_5_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cff1f0a8a34cfd4eb55487540a02c70e629d7f6123355c95380498817053eb78 -size 29575 +oid sha256:1151f42b6fdb810a78dae144be8cdc1a97f4d0153c8690cbf2756b75308aaa13 +size 28869 diff --git a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_9_en.png b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_9_en.png index 5e4e84c276..ecf3010c75 100644 --- a/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_9_en.png +++ b/tests/uitests/src/test/snapshots/images/features.joinroom.impl_JoinRoomView_Night_9_en.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:029fd9d3e150b6a8d52b4d348ccdbbb661b0009b7065b9530f4e7f168fc6ee78 -size 35965 +oid sha256:b2e279977cd66e1be4159c788a70b8caca9cf32d7b428b0a2407105aabe9a405 +size 35083 From cb228d35e954764209679be51a94defd78ee8488 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Oct 2025 16:49:51 +0200 Subject: [PATCH 7/7] Fix compilation issue in tests. --- .../impl/notifications/channels/NotificationChannelsTest.kt | 2 ++ .../factories/DefaultNotificationCreatorTest.kt | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt index a6b8bc9985..b93bbcaf15 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/channels/NotificationChannelsTest.kt @@ -18,6 +18,7 @@ import io.mockk.verify import org.junit.Test import org.junit.runner.RunWith import org.robolectric.RobolectricTestRunner +import org.robolectric.RuntimeEnvironment import org.robolectric.annotation.Config @RunWith(RobolectricTestRunner::class) @@ -66,5 +67,6 @@ class NotificationChannelsTest { ) = DefaultNotificationChannels( notificationManager = notificationManager, stringProvider = FakeStringProvider(), + context = RuntimeEnvironment.getApplication(), ) } diff --git a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt index 5fd1b6386e..7786fb261e 100644 --- a/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt +++ b/libraries/push/impl/src/test/kotlin/io/element/android/libraries/push/impl/notifications/factories/DefaultNotificationCreatorTest.kt @@ -332,5 +332,9 @@ fun createNotificationCreator( fun createNotificationChannels(): NotificationChannels { val context = RuntimeEnvironment.getApplication() - return DefaultNotificationChannels(NotificationManagerCompat.from(context), FakeStringProvider("")) + return DefaultNotificationChannels( + notificationManager = NotificationManagerCompat.from(context), + stringProvider = FakeStringProvider(""), + context = context, + ) }