diff --git a/.gitignore b/.gitignore
index 823b4e4872..e7029fd3cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,6 +56,7 @@ captures/
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
+.idea/copilot
.idea/inspectionProfiles
# Shelved changes in the IDE
.idea/shelf
diff --git a/changelog.d/2259.feature b/changelog.d/2259.feature
new file mode 100644
index 0000000000..24a3b06b3e
--- /dev/null
+++ b/changelog.d/2259.feature
@@ -0,0 +1 @@
+Change a room's permissions power levels.
diff --git a/changelog.d/2530.bugfix b/changelog.d/2530.bugfix
new file mode 100644
index 0000000000..612a83dc54
--- /dev/null
+++ b/changelog.d/2530.bugfix
@@ -0,0 +1 @@
+Fix timeline not showing sender info when room is marked as direct but not a 1:1 room.
diff --git a/features/analytics/api/src/main/res/values-it/translations.xml b/features/analytics/api/src/main/res/values-it/translations.xml
index d4d22f39d9..794dfc56fc 100644
--- a/features/analytics/api/src/main/res/values-it/translations.xml
+++ b/features/analytics/api/src/main/res/values-it/translations.xml
@@ -3,5 +3,5 @@
"Condividi dati di utilizzo anonimi per aiutarci a identificare problemi."
"Puoi leggere tutti i nostri termini %1$s."
"qui"
- "Condividi dati statistici"
+ "Condividi statistiche"
diff --git a/features/invitelist/impl/src/main/res/values-it/translations.xml b/features/invitelist/impl/src/main/res/values-it/translations.xml
index e5d25b10cf..7da765090e 100644
--- a/features/invitelist/impl/src/main/res/values-it/translations.xml
+++ b/features/invitelist/impl/src/main/res/values-it/translations.xml
@@ -2,8 +2,8 @@
"Vuoi davvero rifiutare l\'invito ad entrare in %1$s?"
"Rifiuta l\'invito"
- "Vuoi davvero rifiutare questa chat privata con %1$s?"
- "Rifiuta la chat"
+ "Vuoi davvero rifiutare questa conversazione privata con %1$s?"
+ "Rifiuta l\'invito alla conversazione"
"Nessun invito"
"%1$s (%2$s) ti ha invitato"
diff --git a/features/leaveroom/api/src/main/res/values-be/translations.xml b/features/leaveroom/api/src/main/res/values-be/translations.xml
index f7d4ed17df..79a0789738 100644
--- a/features/leaveroom/api/src/main/res/values-be/translations.xml
+++ b/features/leaveroom/api/src/main/res/values-be/translations.xml
@@ -1,5 +1,6 @@
+ "Вы ўпэўнены, што хочаце пакінуць гэту размову? Гэта размова не з\'яўляецца публічнай, і вы не зможаце далучыцца зноў без запрашэння."
"Вы ўпэўнены, што жадаеце пакінуць гэты пакой? Вы тут адзіны карыстальнік. Калі вы выйдзеце, ніхто не зможа далучыцца ў будучыні, у тым ліку і вы."
"Вы ўпэўнены, што жадаеце пакінуць гэты пакой? Гэты пакой не агульнадаступны, і вы не зможаце далучыцца да яго зноў без запрашэння."
"Вы ўпэўнены, што жадаеце пакінуць пакой?"
diff --git a/features/lockscreen/impl/src/main/res/values-it/translations.xml b/features/lockscreen/impl/src/main/res/values-it/translations.xml
index 177fb6d1ec..3c9cfbe45d 100644
--- a/features/lockscreen/impl/src/main/res/values-it/translations.xml
+++ b/features/lockscreen/impl/src/main/res/values-it/translations.xml
@@ -1,8 +1,8 @@
"autenticazione biometrica"
- "sblocco biometrico"
- "Sblocca con la biometria"
+ "sblocco con biometria"
+ "Sblocca con biometria"
"PIN dimenticato?"
"Modifica il codice PIN"
"Consenti lo sblocco biometrico"
@@ -16,9 +16,9 @@
"Conferma il PIN"
"Non puoi scegliere questo codice PIN per motivi di sicurezza"
"Scegli un PIN diverso"
- "Blocca %1$s per aggiungere ulteriore sicurezza alle tue chat.
+ "Blocca %1$s per aggiungere ulteriore sicurezza alle tue conversazioni.
-Scegli qualcosa che puoi ricordare. Se dimentichi questo PIN, verrai disconnesso dall\'app."
+Scegli qualcosa facile da ricordare. Se dimentichi questo PIN, verrai disconnesso dall\'app."
"Inserisci lo stesso PIN due volte"
"I PIN non corrispondono"
"Dovrai effettuare nuovamente l\'accesso e creare un nuovo PIN per procedere"
@@ -33,5 +33,5 @@ Scegli qualcosa che puoi ricordare. Se dimentichi questo PIN, verrai disconnesso
"Usa la biometria"
"Usa il PIN"
- "Uscita in corso…"
+ "Disconnessione in corso…"
diff --git a/features/login/impl/src/main/res/values-be/translations.xml b/features/login/impl/src/main/res/values-be/translations.xml
index 69c217689f..228deb957c 100644
--- a/features/login/impl/src/main/res/values-be/translations.xml
+++ b/features/login/impl/src/main/res/values-be/translations.xml
@@ -14,6 +14,8 @@
"Выкарыстоўвайце іншага правайдара ўліковых запісаў, напрыклад, уласны прыватны сервер або працоўны ўліковы запіс."
"Змяніць правайдара ўліковага запісу"
"Нам не ўдалося звязацца з гэтым хатнім серверам. Упэўніцеся, што вы правільна ўвялі URL-адрас хатняга сервера. Калі URL-адрас пазначаны правільна, звярніцеся да адміністратара хатняга сервера за дадатковай дапамогай."
+ "Sliding sync недаступны з-за праблемы ў вядомым файле:
+%1$s"
"На жаль, гэты сервер не падтрымлівае sliding sync."
"URL хатняга сервера"
"Вы можаце падключыцца толькі да існуючага сервера, які падтрымлівае sliding sync. Адміністратару хатняга сервера запатрабуецца наладзіць яго. %1$s"
@@ -22,6 +24,7 @@
"Гэты ўліковы запіс быў дэактываваны."
"Няправільнае імя карыстальніка і/або пароль"
"Гэта несапраўдны ідэнтыфікатар карыстальніка. Чаканы фармат: ‘@user:homeserver.org’"
+ "Гэты сервер настроены на выкарыстанне маркераў абнаўлення. Яны не падтрымліваюцца пры ўваходзе на аснове пароля."
"Выбраны хатні сервер не падтрымлівае пароль або ўваход у OIDC. Калі ласка, звярніцеся да адміністратара або абярыце іншы хатні сервер."
"Увядзіце свае даныя"
"Matrix - гэта адкрытая сетка для бяспечнай, дэцэнтралізаванай сувязі."
@@ -38,4 +41,5 @@
Дзякуй за цярпенне!"
"Вітаем у %1$s!"
"Амаль гатова."
+ "Вы зарэгістраваны."
diff --git a/features/login/impl/src/main/res/values-it/translations.xml b/features/login/impl/src/main/res/values-it/translations.xml
index 9ae53cdbe6..dcfc5c7b08 100644
--- a/features/login/impl/src/main/res/values-it/translations.xml
+++ b/features/login/impl/src/main/res/values-it/translations.xml
@@ -3,25 +3,28 @@
"Cambia fornitore dell\'account"
"Indirizzo dell\'homeserver"
"Inserisci un termine di ricerca o un indirizzo di dominio."
- "Cerca un\' azienda, una comunità o un server privato."
+ "Cerca un\'azienda, una comunità o un server privato."
"Trova un fornitore di account"
"Qui è dove vivranno le tue conversazioni — proprio come useresti un fornitore di posta elettronica per conservare le tue email."
"Stai per accedere a %s"
"Qui è dove vivranno le tue conversazioni — proprio come useresti un fornitore di posta elettronica per conservare le tue email."
"Stai per creare un account su %s"
- "Matrix.org è un grande server gratuito nella rete pubblica Matrix per una comunicazione sicura e decentralizzata, gestito dalla Fondazione Matrix.org."
+ "Matrix.org è un grande server gratuito nella rete pubblica Matrix per una comunicazione sicura e decentralizzata, gestito da Matrix.org Foundation."
"Altro"
"Utilizza un provider di account diverso, ad esempio il tuo server privato o un account di lavoro."
"Cambia fornitore dell\'account"
- "Non siamo riusciti a raggiungere questo homserver. Verifica di aver inserito correttamente l\'URL del server domestico. Se l\'URL è corretto, contatta l\'amministratore del tuo server domestico per ulteriore assistenza."
- "Questo server attualmente non supporta la sincronizzazione scorrevole."
+ "Non siamo riusciti a raggiungere questo homeserver. Verifica di aver inserito correttamente l\'URL. Se l\'URL è corretto, contatta l\'amministratore del homeserver per ulteriore assistenza."
+ "La sliding sync non è disponibile per un problema nel file well-known:
+%1$s"
+ "Questo server attualmente non supporta la sliding sync."
"URL dell\'homeserver"
- "Puoi connetterti solo a un server esistente che supporta la sincronizzazione scorrevole. L\'amministratore del tuo server domestico dovrà configurarlo. %1$s"
+ "Puoi connetterti solo a un server esistente che supporta la sliding sync. L\'amministratore del tuo homeserver dovrà configurarla. %1$s"
"Qual è l\'indirizzo del tuo server?"
"Seleziona il tuo server"
- "Questo profilo è stato disattivato."
+ "Questo account è stato disattivato."
"Nome utente e/o password errati"
- "Questo non è un identificatore utente valido. Formato previsto: \'@user:homeserver.org\'"
+ "Questo non è un identità utente valida. il formato atteso é: \'@user:homeserver.org\'"
+ "Questo server è configurato per usare i token di aggiornamento. Non sono supportati quando si usa l\'accesso basato su password."
"L\'homeserver selezionato non supporta la password o l\'accesso OIDC. Contatta il tuo amministratore o scegli un altro homeserver."
"Inserisci i tuoi dati"
"Matrix è una rete aperta per comunicazioni sicure e decentralizzate."
diff --git a/features/logout/impl/src/main/res/values-it/translations.xml b/features/logout/impl/src/main/res/values-it/translations.xml
index 8a1f4ff08c..47d6bcf519 100644
--- a/features/logout/impl/src/main/res/values-it/translations.xml
+++ b/features/logout/impl/src/main/res/values-it/translations.xml
@@ -3,7 +3,7 @@
"Sei sicuro di voler uscire?"
"Disconnetti"
"Disconnetti"
- "Uscita in corso…"
+ "Disconnessione in corso…"
"Stai per disconnettere la tua ultima sessione. Se esci ora, perderai l\'accesso ai tuoi messaggi cifrati."
"Hai disattivato il backup"
"Il backup delle chiavi era ancora in corso quando sei andato offline. Riconnettiti per eseguire il backup delle chiavi prima di uscire."
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt
index a37f6419a4..83cb42b614 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesPresenter.kt
@@ -445,7 +445,7 @@ class MessagesPresenter @AssistedInject constructor(
clipboardHelper.copyPlainText(content)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
- snackbarDispatcher.post(SnackbarMessage(R.string.screen_room_message_copied))
+ snackbarDispatcher.post(SnackbarMessage(R.string.screen_room_timeline_message_copied))
}
}
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt
index ba977edd6c..91cccd88e8 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/MessagesView.kt
@@ -551,7 +551,7 @@ private fun CantSendMessageBanner() {
horizontalArrangement = Arrangement.Center
) {
Text(
- text = stringResource(id = R.string.screen_room_no_permission_to_post),
+ text = stringResource(id = R.string.screen_room_timeline_no_permission_to_post),
color = MaterialTheme.colorScheme.onSecondary,
style = MaterialTheme.typography.bodyMedium,
textAlign = TextAlign.Center,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt
index 2207c81750..2791ee632c 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/report/ReportMessageView.kt
@@ -101,14 +101,14 @@ fun ReportMessageView(
OutlinedTextField(
value = state.reason,
onValueChange = { state.eventSink(ReportMessageEvents.UpdateReason(it)) },
- placeholder = { Text(stringResource(R.string.report_content_hint)) },
+ placeholder = { Text(stringResource(R.string.screen_report_content_hint)) },
enabled = !isSending,
modifier = Modifier
.fillMaxWidth()
.heightIn(min = 90.dp)
)
Text(
- text = stringResource(R.string.report_content_explanation),
+ text = stringResource(R.string.screen_report_content_explanation),
style = ElementTheme.typography.fontBodySmRegular,
color = MaterialTheme.colorScheme.secondary,
textAlign = TextAlign.Start,
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt
index b976b14960..67915bf9d4 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelinePresenter.kt
@@ -94,6 +94,7 @@ class TimelinePresenter @AssistedInject constructor(
val timelineItems by timelineItemsFactory.collectItemsAsState()
val paginationState by timeline.paginationState.collectAsState()
val syncUpdateFlow = room.syncUpdateFlow.collectAsState()
+
val userHasPermissionToSendMessage by room.canSendMessageAsState(type = MessageEventType.ROOM_MESSAGE, updateKey = syncUpdateFlow.value)
val userHasPermissionToSendReaction by room.canSendMessageAsState(type = MessageEventType.REACTION, updateKey = syncUpdateFlow.value)
@@ -170,7 +171,7 @@ class TimelinePresenter @AssistedInject constructor(
val timelineRoomInfo by remember {
derivedStateOf {
TimelineRoomInfo(
- isDirect = room.isDirect,
+ isDm = room.isDm,
userHasPermissionToSendMessage = userHasPermissionToSendMessage,
userHasPermissionToSendReaction = userHasPermissionToSendReaction,
)
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt
index a709aa932f..ab9d93d678 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineState.kt
@@ -38,7 +38,7 @@ data class TimelineState(
@Immutable
data class TimelineRoomInfo(
- val isDirect: Boolean,
+ val isDm: Boolean,
val userHasPermissionToSendMessage: Boolean,
val userHasPermissionToSendReaction: Boolean,
)
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt
index 002bffc549..aa35b620b9 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineStateProvider.kt
@@ -235,10 +235,10 @@ internal fun aGroupedEvents(
}
internal fun aTimelineRoomInfo(
- isDirect: Boolean = false,
+ isDm: Boolean = false,
userHasPermissionToSendMessage: Boolean = true,
) = TimelineRoomInfo(
- isDirect = isDirect,
+ isDm = isDm,
userHasPermissionToSendMessage = userHasPermissionToSendMessage,
userHasPermissionToSendReaction = true,
)
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt
index 6805cd926e..094ecb6c3b 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/TimelineView.kt
@@ -160,7 +160,7 @@ fun TimelineView(
}
}
}
- if (state.paginationState.beginningOfRoomReached && !state.timelineRoomInfo.isDirect) {
+ if (state.paginationState.beginningOfRoomReached && !state.timelineRoomInfo.isDm) {
item(contentType = "BeginningOfRoomReached") {
TimelineItemRoomBeginningView(roomName = roomName)
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt
index e7ca8116f1..9e1095e02a 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/MessageEventBubble.kt
@@ -95,7 +95,7 @@ fun MessageEventBubble(
fun Modifier.offsetForItem(): Modifier {
return when {
state.isMine -> this
- state.timelineRoomInfo.isDirect -> this
+ state.timelineRoomInfo.isDm -> this
else -> offset(x = BUBBLE_INCOMING_OFFSET)
}
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt
index 75f4a7ce6d..ffd2925c14 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRow.kt
@@ -301,7 +301,7 @@ private fun TimelineItemEventRowContent(
// Sender
val avatarStrokeSize = 3.dp
- if (event.showSenderInformation && !timelineRoomInfo.isDirect) {
+ if (event.showSenderInformation && !timelineRoomInfo.isDm) {
MessageSenderInformation(
event.safeSenderName,
event.senderAvatar,
@@ -371,7 +371,7 @@ private fun TimelineItemEventRowContent(
// In design we want a offset of 6.dp compare to the bubble, so start is 22.dp (16 + 6)
start = when {
event.isMine -> 22.dp
- timelineRoomInfo.isDirect -> 22.dp
+ timelineRoomInfo.isDm -> 22.dp
else -> 22.dp + BUBBLE_INCOMING_OFFSET
},
end = 16.dp
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowForDirectRoomPreview.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowForDirectRoomPreview.kt
index 3ac2703ee5..1981bc2c39 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowForDirectRoomPreview.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemEventRowForDirectRoomPreview.kt
@@ -41,7 +41,7 @@ internal fun TimelineItemEventRowForDirectRoomPreview() = ElementPreview {
groupPosition = TimelineItemGroupPosition.First,
),
timelineRoomInfo = aTimelineRoomInfo(
- isDirect = true,
+ isDm = true,
),
)
ATimelineItemEventRow(
@@ -53,7 +53,7 @@ internal fun TimelineItemEventRowForDirectRoomPreview() = ElementPreview {
groupPosition = TimelineItemGroupPosition.Last,
),
timelineRoomInfo = aTimelineRoomInfo(
- isDirect = true,
+ isDm = true,
),
)
}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt
index a2a691cbcf..74998afb89 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemGroupedEventsRow.kt
@@ -113,7 +113,7 @@ private fun TimelineItemGroupedEventsRowContent(
Column(modifier = modifier.animateContentSize()) {
GroupHeaderView(
text = pluralStringResource(
- id = R.plurals.room_timeline_state_changes,
+ id = R.plurals.screen_room_timeline_state_changes,
count = timelineItem.events.size,
timelineItem.events.size
),
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemReactionsView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemReactionsView.kt
index 5fd8b20f14..b91699a5ee 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemReactionsView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/TimelineItemReactionsView.kt
@@ -90,7 +90,13 @@ private fun TimelineItemReactionsView(
expandButton = {
MessagesReactionButton(
content = MessagesReactionsButtonContent.Text(
- text = stringResource(id = if (expanded) R.string.screen_room_reactions_show_less else R.string.screen_room_reactions_show_more)
+ text = stringResource(
+ id = if (expanded) {
+ R.string.screen_room_timeline_reactions_show_less
+ } else {
+ R.string.screen_room_timeline_reactions_show_more
+ }
+ )
),
onClick = onToggleExpandClick,
onLongClick = {}
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt
index 1d50bedfbb..25b32ec1e4 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemReadMarkerView.kt
@@ -44,7 +44,7 @@ internal fun TimelineItemReadMarkerView(
verticalArrangement = spacedBy(4.dp),
) {
Text(
- text = stringResource(id = R.string.room_timeline_read_marker_title).uppercase(),
+ text = stringResource(id = R.string.screen_room_timeline_read_marker_title).uppercase(),
style = ElementTheme.typography.fontBodySmMedium,
color = ElementTheme.colors.textSecondary,
)
diff --git a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemRoomBeginningView.kt b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemRoomBeginningView.kt
index 7601a466c4..d3ded0e603 100644
--- a/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemRoomBeginningView.kt
+++ b/features/messages/impl/src/main/kotlin/io/element/android/features/messages/impl/timeline/components/virtual/TimelineItemRoomBeginningView.kt
@@ -45,9 +45,9 @@ fun TimelineItemRoomBeginningView(
contentAlignment = Alignment.Center,
) {
val text = if (roomName == null) {
- stringResource(id = R.string.room_timeline_beginning_of_room_no_name)
+ stringResource(id = R.string.screen_room_timeline_beginning_of_room_no_name)
} else {
- stringResource(id = R.string.room_timeline_beginning_of_room, roomName)
+ stringResource(id = R.string.screen_room_timeline_beginning_of_room, roomName)
}
Text(
color = MaterialTheme.colorScheme.secondary,
diff --git a/features/messages/impl/src/main/res/values-be/translations.xml b/features/messages/impl/src/main/res/values-be/translations.xml
index eedf125577..c91bb96d04 100644
--- a/features/messages/impl/src/main/res/values-be/translations.xml
+++ b/features/messages/impl/src/main/res/values-be/translations.xml
@@ -8,18 +8,10 @@
"Усмешкі & Людзі"
"Падарожжы & Месцы"
"Сімвалы"
- "Гэтае паведамленне будзе перададзена адміністратару вашага хатняга сервера. Яны не змогуць прачытаць зашыфраваныя паведамленні."
- "Прычына, па якой вы паскардзіліся на гэты змест"
- "Гэта пачатак %1$s."
- "Гэта пачатак гэтай размовы."
- "Новы"
-
- - "%1$d змена ў пакоі"
- - "%1$d змен у пакоі"
- - "%1$d змен у пакоі"
-
"Заблакіраваць карыстальніка"
"Адзначце, ці жадаеце вы схаваць усе бягучыя і будучыя паведамленні ад гэтага карыстальніка"
+ "Гэтае паведамленне будзе перададзена адміністратару вашага хатняга сервера. Яны не змогуць прачытаць зашыфраваныя паведамленні."
+ "Прычына, па якой вы паскардзіліся на гэты змест"
"Камера"
"Зрабіць фота"
"Запісаць відэа"
@@ -28,36 +20,36 @@
"Месцазнаходжанне"
"Апытанне"
"Фармаціраванне тэксту"
- "Усе"
"Гісторыя паведамленняў зараз недаступна."
"Гісторыя паведамленняў у гэтым пакоі недаступная. Праверце гэтую прыладу, каб убачыць гісторыю паведамленняў."
- "Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз."
- "Не ўдалося атрымаць інфармацыю пра карыстальніка"
"Вы жадаеце запрасіць іх назад?"
"Вы адзін у гэтым чаце"
"Апавясціць увесь пакой"
"Усе"
- "Паведамленне скапіравана"
- "У вас няма дазволу публікаваць паведамленні ў гэтым пакоі"
- "Дазволіць карыстальніцкую наладу"
- "Калі гэта ўключыць, ваша налада па змаўчанні будзе адменена"
- "Апавяшчаць мяне ў гэтым чаце для"
- "Вы можаце змяніць яго ў сваім %1$s."
- "глабальныя налады"
- "Налада па змаўчанні"
- "Выдаліць карыстальніцкую наладу"
- "Падчас загрузкі налад апавяшчэнняў адбылася памылка."
- "Не атрымалася аднавіць рэжым па змаўчанні, паспрабуйце яшчэ раз."
- "Не ўдалося наладзіць рэжым, паспрабуйце яшчэ раз."
- "Ваш хатні сервер не падтрымлівае гэту опцыю ў зашыфраваных пакоях, вы не атрымаеце апавяшчэнне ў гэтым пакоі."
- "Усе паведамленні"
- "Толькі згадванні і ключавыя словы"
- "У гэтым пакоі паведаміце мяне пра"
- "Паказаць менш"
- "Паказаць больш"
"Адправіць зноў"
"Не ўдалося адправіць ваша паведамленне"
"Дадаць эмодзі"
+ "Гэта пачатак %1$s."
+ "Гэта пачатак гэтай размовы."
"Паказаць менш"
- "Утрымлівайце для запісу"
+ "Паведамленне скапіравана"
+ "У вас няма дазволу публікаваць паведамленні ў гэтым пакоі"
+ "Паказаць менш"
+ "Паказаць больш"
+ "Новы"
+
+ - "%1$d змена ў пакоі"
+ - "%1$d змен у пакоі"
+ - "%1$d змен у пакоі"
+
+
+ - "%1$s, %2$s і %3$d іншы"
+ - "%1$s, %2$s і %3$d іншыя"
+
+
+ - "%1$s піша"
+ - "%1$s пішуць"
+ - "%1$s пішуць"
+
+ "%1$s і %2$s"
diff --git a/features/messages/impl/src/main/res/values-bg/translations.xml b/features/messages/impl/src/main/res/values-bg/translations.xml
index d5bfc69334..284177448c 100644
--- a/features/messages/impl/src/main/res/values-bg/translations.xml
+++ b/features/messages/impl/src/main/res/values-bg/translations.xml
@@ -8,12 +8,6 @@
"Усмивки & Хора"
"Пътуване & Места"
"Символи"
- "Това е началото на %1$s."
- "Това е началото на този разговор."
-
- - "%1$d промяна в стаята"
- - "%1$d промени в стаята"
-
"Блокиране на потребителя"
"Камера"
"Снимка"
@@ -24,15 +18,17 @@
"Анкета"
"Форматиране на текст"
"Хронологията на съобщенията не е налична в момента."
- "Съобщението е копирано"
- "Да бъда известяван в този чат за"
- "Всички съобщения"
- "Само споменавания и ключови думи"
- "В тази стая, да бъда известяван за"
- "Показване на по-малко"
- "Показване на повече"
"Добавяне на емоджи"
+ "Това е началото на %1$s."
+ "Това е началото на този разговор."
"Показване на по-малко"
+ "Съобщението е копирано"
+ "Показване на по-малко"
+ "Показване на повече"
+
+ - "%1$d промяна в стаята"
+ - "%1$d промени в стаята"
+
- "%1$s, %2$s и %3$d друг"
- "%1$s, %2$s и %3$d други"
diff --git a/features/messages/impl/src/main/res/values-cs/translations.xml b/features/messages/impl/src/main/res/values-cs/translations.xml
index b1ade6e004..3ef8438a08 100644
--- a/features/messages/impl/src/main/res/values-cs/translations.xml
+++ b/features/messages/impl/src/main/res/values-cs/translations.xml
@@ -8,18 +8,10 @@
"Smajlíci a lidé"
"Cestování a místa"
"Symboly"
- "Tato zpráva bude nahlášena správci vašeho domovského serveru. Nebude si moci přečíst žádné šifrované zprávy."
- "Důvod nahlášení tohoto obsahu"
- "Toto je začátek %1$s."
- "Toto je začátek této konverzace."
- "Nové"
-
- - "%1$d změna místnosti"
- - "%1$d změny místnosti"
- - "%1$d změn místnosti"
-
"Zablokovat uživatele"
"Zaškrtněte, pokud chcete skrýt všechny aktuální a budoucí zprávy od tohoto uživatele"
+ "Tato zpráva bude nahlášena správci vašeho domovského serveru. Nebude si moci přečíst žádné šifrované zprávy."
+ "Důvod nahlášení tohoto obsahu"
"Fotoaparát"
"Vyfotit"
"Natočit video"
@@ -28,73 +20,28 @@
"Poloha"
"Hlasování"
"Formátování textu"
- "Pouze správci"
- "Vykázat lidi"
- "Odstranit zprávy"
- "Všichni"
- "Pozvat lidi"
- "Moderování členů"
- "Zprávy a obsah"
- "Správci a moderátoři"
- "Odebrat lidi"
- "Změnit avatar místnosti"
- "Podrobnosti místnosti"
- "Změnit název místnosti"
- "Změnit téma místnosti"
- "Odeslat zprávy"
- "Upravit správce"
- "Tuto akci nebudete moci vrátit zpět. Upravujete oprávnění uživatele, tak aby měl stejnou úroveň jako vy."
- "Přidat správce?"
- "Degradovat"
- "Tuto změnu nebudete moci vrátit zpět, protože sami degradujete, pokud jste posledním privilegovaným uživatelem v místnosti, nebude možné znovu získat oprávnění."
- "Degradovat se?"
- "Upravit moderátory"
- "Máte neuložené změny."
- "Uložit změny?"
"Historie zpráv je momentálně v této místnosti nedostupná"
"Historie zpráv není v této místnosti k dispozici. Ověřte toto zařízení, abyste viděli historii zpráv."
- "Nahrání média se nezdařilo, zkuste to prosím znovu."
- "Nepodařilo se načíst údaje o uživateli"
"Chtěli byste je pozvat zpět?"
"V tomto chatu jste sami"
"Informujte celou místnost"
"Všichni"
- "Zpráva zkopírována"
- "Nemáte oprávnění zveřejňovat příspěvky v této místnosti"
- "Povolit vlastní nastavení"
- "Zapnutím této funkce přepíšete výchozí nastavení"
- "Upozornit mě v tomto chatu na"
- "Můžete změnit ve vašem %1$s."
- "globální nastavení"
- "Výchozí nastavení"
- "Odebrat vlastní nastavení"
- "Při načítání nastavení oznámení došlo k chybě."
- "Obnovení výchozího režimu se nezdařilo, zkuste to prosím znovu."
- "Nastavení režimu se nezdařilo, zkuste to prosím znovu."
- "Váš domovský server tuto možnost nepodporuje v šifrovaných místnostech, v této místnosti nebudete dostávat upozornění."
- "Všechny zprávy"
- "Pouze zmínky a klíčová slova"
- "V této místnosti mě upozornit na"
- "Zobrazit méně"
- "Zobrazit více"
"Odeslat znovu"
"Vaši zprávu se nepodařilo odeslat"
- "Správci"
- "Změnit moji roli"
- "Degradovat na člena"
- "Degradovat na moderátora"
- "Moderování členů"
- "Zprávy a obsah"
- "Moderátoři"
- "Oprávnění"
- "Obnovit oprávnění"
- "Po obnovení oprávnění ztratíte aktuální nastavení."
- "Obnovit oprávnění?"
- "Role"
- "Podrobnosti místnosti"
- "Role a oprávnění"
"Přidat emoji"
+ "Toto je začátek %1$s."
+ "Toto je začátek této konverzace."
"Zobrazit méně"
+ "Zpráva zkopírována"
+ "Nemáte oprávnění zveřejňovat příspěvky v této místnosti"
+ "Zobrazit méně"
+ "Zobrazit více"
+ "Nové"
+
+ - "%1$d změna místnosti"
+ - "%1$d změny místnosti"
+ - "%1$d změn místnosti"
+
- "%1$s, %2$s a %3$d další"
- "%1$s, %2$s a %3$d další"
@@ -106,5 +53,4 @@
- "%1$s píše"
"%1$s a %2$s"
- "Držte pro nahrávání"
diff --git a/features/messages/impl/src/main/res/values-de/translations.xml b/features/messages/impl/src/main/res/values-de/translations.xml
index 0e3fa9d617..ddc498a6a9 100644
--- a/features/messages/impl/src/main/res/values-de/translations.xml
+++ b/features/messages/impl/src/main/res/values-de/translations.xml
@@ -8,17 +8,10 @@
"Smileys & Menschen"
"Reisen & Orte"
"Symbole"
- "Diese Meldung wird an den Administrator deines Homeservers weitergeleitet. Dieser kann keine verschlüsselten Nachrichten lesen."
- "Grund für die Meldung dieses Inhalts"
- "Dies ist der Anfang von %1$s."
- "Dies ist der Anfang dieses Gesprächs."
- "Neu"
-
- - "%1$d Raumänderung"
- - "%1$d Raumänderungen"
-
"Benutzer blockieren"
"Prüfe, ob du alle aktuellen und zukünftigen Nachrichten dieses Benutzers ausblenden möchtest"
+ "Diese Meldung wird an den Administrator deines Homeservers weitergeleitet. Dieser kann keine verschlüsselten Nachrichten lesen."
+ "Grund für die Meldung dieses Inhalts"
"Kamera"
"Foto aufnehmen"
"Video aufnehmen"
@@ -27,54 +20,27 @@
"Standort"
"Umfrage"
"Textformatierung"
- "Alle"
- "Moderation der Mitglieder"
- "Nachrichten und Inhalte"
- "Raumdetails"
- "Du vergibst das selbe Rolle, die auch Du hast. Diese Aktion kann daher nicht mehr rückgängig gemacht werden."
- "Als Administrator hinzufügen?"
- "Zurückstufen"
- "Du stufst dich selbst herab. Diese Änderung kann nicht rückgängig gemacht werden. Wenn du der letzte Benutzer mit dieser Rolle bist, ist es nicht möglich, diese Rolle wiederzuerlangen."
- "Möchtest Du Dich selbst herabstufen?"
"Der Nachrichtenverlauf ist derzeit in diesem Raum nicht verfügbar"
"Der Nachrichtenverlauf ist in diesem Raum nicht verfügbar. Verifiziere dieses Gerät, um deinen Nachrichtenverlauf zu sehen."
- "Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut."
- "Benutzerdetails konnten nicht abgerufen werden"
"Möchtest du sie wieder einladen?"
"Du bist allein in diesem Chat"
"Den ganzen Raum benachrichtigen"
"Alle"
- "Nachricht wurde kopiert"
- "Du bist nicht berechtigt, in diesem Raum zu posten"
- "Benutzerdefinierte Einstellungen verwenden"
- "Wenn du diese Option aktivierst, wird deine Standardeinstellung außer Kraft gesetzt."
- "Benachrichtige mich in diesem Chat bei"
- "Zum Anpassen der Standardeinstellungen gehe zu: %1$s"
- "Globale Einstellungen"
- "Standardeinstellung"
- "Benutzerdefinierte Einstellung entfernen"
- "Beim Laden der Benachrichtigungseinstellungen ist ein Fehler aufgetreten."
- "Fehler beim Wiederherstellen des Standardmodus. Bitte versuche es erneut."
- "Fehler beim Einstellen des Modus. Bitte versuche es erneut."
- "Dein Homeserver unterstützt diese Option in verschlüsselten Räumen nicht. Du wirst in diesem Raum nicht benachrichtigt."
- "Alle Nachrichten"
- "Nur Erwähnungen und Schlüsselwörter"
- "Benachrichtige mich in diesem Raum bei"
- "Weniger anzeigen"
- "Mehr anzeigen"
"Erneut senden"
"Deine Nachricht konnte nicht gesendet werden"
- "Administratoren"
- "Moderation der Mitglieder"
- "Nachrichten und Inhalte"
- "Moderatoren"
- "Berechtigungen"
- "Rollen und Berechtigungen zurücksetzen"
- "Rollen"
- "Raumdetails"
- "Rollen und Berechtigungen"
"Emoji hinzufügen"
+ "Dies ist der Anfang von %1$s."
+ "Dies ist der Anfang dieses Gesprächs."
"Weniger anzeigen"
+ "Nachricht wurde kopiert"
+ "Du bist nicht berechtigt, in diesem Raum zu posten"
+ "Weniger anzeigen"
+ "Mehr anzeigen"
+ "Neu"
+
+ - "%1$d Raumänderung"
+ - "%1$d Raumänderungen"
+
- "%1$s, %2$s und %3$d weitere Person"
- "%1$s, %2$s und %3$d weitere Person"
@@ -84,5 +50,4 @@
- "%1$s schreiben…"
"%1$s und %2$s"
- "Zum Aufnehmen gedrückt halten"
diff --git a/features/messages/impl/src/main/res/values-es/translations.xml b/features/messages/impl/src/main/res/values-es/translations.xml
index 12295aee9d..2f4fdca67d 100644
--- a/features/messages/impl/src/main/res/values-es/translations.xml
+++ b/features/messages/impl/src/main/res/values-es/translations.xml
@@ -8,17 +8,10 @@
"Emojis y personas"
"Viajes y lugares"
"Símbolos"
- "Este mensaje se notificará al administrador de su homeserver. No podrán leer ningún mensaje cifrado."
- "Motivo para denunciar este contenido"
- "Este es el principio de %1$s."
- "Este es el principio de esta conversación."
- "Nuevos"
-
- - "%1$d cambio en la sala"
- - "%1$d cambios en la sala"
-
"Bloquear usuario"
"Marque si quieres ocultar todos los mensajes actuales y futuros de este usuario"
+ "Este mensaje se notificará al administrador de su homeserver. No podrán leer ningún mensaje cifrado."
+ "Motivo para denunciar este contenido"
"Cámara"
"Hacer foto"
"Grabar video"
@@ -27,36 +20,25 @@
"Ubicación"
"Encuesta"
"Formato de Texto"
- "Todos"
"El historial de mensajes no está disponible en este momento."
"El historial de mensajes no está disponible en esta sala. Verifica este dispositivo para ver tu historial de mensajes."
- "Error al procesar el contenido multimedia, por favor inténtalo de nuevo."
- "No se pudieron recuperar los detalles del usuario"
"¿Quieres volver a invitarlos?"
"Estás solo en este chat"
"Notificar a toda la sala"
"Todos"
- "Mensaje copiado"
- "No tienes permiso para publicar en esta sala"
- "Permitir configuración personalizada"
- "Si activas esta opción, anularás tu configuración por defecto"
- "Notificarme en este chat para"
- "Puedes cambiarlo en tus %1$s."
- "ajustes globales"
- "Ajustes predeterminados"
- "Eliminar configuración personalizada"
- "Se ha producido un error al cargar la configuración de las notificaciones."
- "No se pudo restaurar el modo predeterminado, por favor vuelve a intentarlo de nuevo."
- "No se pudo cambiar el modo, por favor inténtalo de nuevo."
- "Tu servidor principal no admite esta opción en salas cifradas, no recibirás notificaciones en esta sala."
- "Todos los mensajes"
- "Únicamente Menciones y Palabras clave"
- "En esta sala, notificarme por"
- "Mostrar menos"
- "Mostrar más"
"Enviar de nuevo"
"No se pudo enviar tu mensaje"
"Añadir emoji"
+ "Este es el principio de %1$s."
+ "Este es el principio de esta conversación."
"Mostrar menos"
- "Mantén pulsado para grabar"
+ "Mensaje copiado"
+ "No tienes permiso para publicar en esta sala"
+ "Mostrar menos"
+ "Mostrar más"
+ "Nuevos"
+
+ - "%1$d cambio en la sala"
+ - "%1$d cambios en la sala"
+
diff --git a/features/messages/impl/src/main/res/values-fr/translations.xml b/features/messages/impl/src/main/res/values-fr/translations.xml
index 376261fd86..1aa0cf330b 100644
--- a/features/messages/impl/src/main/res/values-fr/translations.xml
+++ b/features/messages/impl/src/main/res/values-fr/translations.xml
@@ -8,17 +8,10 @@
"Émoticônes et personnes"
"Voyages & lieux"
"Symboles"
- "Ce message sera signalé à l’administrateur de votre serveur d’accueil. Il ne pourra lire aucun message chiffré."
- "Raison du signalement de ce contenu"
- "Ceci est le début de %1$s."
- "Ceci est le début de cette conversation."
- "Nouveau"
-
- - "%1$d changement dans le salon"
- - "%1$d changements dans le salon"
-
"Bloquer l’utilisateur"
"Cochez si vous souhaitez masquer tous les messages actuels et futurs de cet utilisateur."
+ "Ce message sera signalé à l’administrateur de votre serveur d’accueil. Il ne pourra lire aucun message chiffré."
+ "Raison du signalement de ce contenu"
"Appareil photo"
"Prendre une photo"
"Enregistrer une vidéo"
@@ -27,52 +20,27 @@
"Position"
"Sondage"
"Formatage du texte"
- "Tout le monde"
- "Changer l’avatar du salon"
- "Détails du salon"
- "Changer le nom du salon"
- "Changer le sujet du salon"
- "Vous ne pourrez pas annuler cette action. Vous êtes en train de promouvoir l’utilisateur pour qu’il ait le même niveau que vous."
- "Ajouter un administrateur ?"
- "Rétrograder"
- "Vous ne pourrez pas annuler ce changement car vous vous rétrogradez, si vous êtes le dernier utilisateur privilégié du salon il sera impossible de retrouver les privilèges."
- "Vous rétrograder ?"
"L’historique des messages n’est actuellement pas disponible dans ce salon"
"L’historique de la discussion n’est pas disponible. Vérifiez cette session pour accéder à l’historique."
- "Échec du traitement des médias à télécharger, veuillez réessayer."
- "Impossible de récupérer les détails de l’utilisateur"
"Souhaitez-vous inviter l’ancien membre à revenir ?"
"Vous êtes seul dans ce salon"
"Notifier tout le salon"
"Tout le monde"
- "Message copié"
- "Vous n’êtes pas autorisé à publier dans ce salon"
- "Autoriser les paramètres personnalisés"
- "L’activation de cette option annulera votre paramètre par défaut"
- "Prévenez-moi dans ce salon pour"
- "Vous pouvez le modifier dans votre %1$s."
- "paramètres globaux"
- "Paramètre par défaut"
- "Supprimer le paramètre personnalisé"
- "Une erreur s’est produite lors du chargement des paramètres de notification."
- "Échec de la restauration du mode par défaut, veuillez réessayer."
- "Échec de la configuration du mode, veuillez réessayer."
- "Votre serveur d’accueil ne supporte pas cette option pour les salons chiffrés, vous ne serez pas notifié(e) dans ce salon."
- "Tous les messages"
- "Mentions et mots clés uniquement"
- "Dans ce salon, prévenez-moi pour"
- "Afficher moins"
- "Afficher plus"
"Envoyer à nouveau"
"Votre message n’a pas pu être envoyé"
- "Administrateurs"
- "Modérateurs"
- "Autorisations"
- "Rôles"
- "Détails du salon"
- "Rôles et autorisations"
"Ajouter un émoji"
+ "Ceci est le début de %1$s."
+ "Ceci est le début de cette conversation."
"Afficher moins"
+ "Message copié"
+ "Vous n’êtes pas autorisé à publier dans ce salon"
+ "Afficher moins"
+ "Afficher plus"
+ "Nouveau"
+
+ - "%1$d changement dans le salon"
+ - "%1$d changements dans le salon"
+
- "%1$s, %2$s et %3$d autre"
- "%1$s, %2$s et %3$d autres"
@@ -82,5 +50,4 @@
- "%1$s écrivent"
"%1$s et %2$s"
- "Maintenir pour enregistrer"
diff --git a/features/messages/impl/src/main/res/values-hu/translations.xml b/features/messages/impl/src/main/res/values-hu/translations.xml
index 1df3bfae26..f3c1cddf8c 100644
--- a/features/messages/impl/src/main/res/values-hu/translations.xml
+++ b/features/messages/impl/src/main/res/values-hu/translations.xml
@@ -8,17 +8,10 @@
"Mosolyok és emberek"
"Utazás és helyek"
"Szimbólumok"
- "Ez az üzenet jelentve lesz a Matrix-kiszolgáló rendszergazdájának. Nem fogja tudni elolvasni a titkosított üzeneteket."
- "A tartalom jelentésének oka"
- "Ez a(z) %1$s kezdete."
- "Ez a beszélgetés kezdete."
- "Új"
-
- - "%1$d szobaváltozás"
- - "%1$d szobaváltozás"
-
"Felhasználó letiltása"
"Jelölje be, ha el akarja rejteni az összes jelenlegi és jövőbeli üzenetet ettől a felhasználótól"
+ "Ez az üzenet jelentve lesz a Matrix-kiszolgáló rendszergazdájának. Nem fogja tudni elolvasni a titkosított üzeneteket."
+ "A tartalom jelentésének oka"
"Kamera"
"Fénykép készítése"
"Videó rögzítése"
@@ -27,38 +20,27 @@
"Hely"
"Szavazás"
"Szövegformázás"
- "Mindenki"
- "Adminisztrátor hozzáadása?"
"Az üzenetelőzmények jelenleg nem érhetők el."
"Az üzenetelőzmények nem érhetők el ebben a szobában. Ellenőrizze ezt az eszközt, hogy lássa az előzményeket."
- "Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra."
- "Nem sikerült letölteni a felhasználói adatokat"
"Visszahívja?"
"Egyedül van ebben a csevegésben"
"Az egész szoba értesítése"
"Mindenki"
- "Üzenet másolva"
- "Nincs jogosultsága arra, hogy bejegyzést tegyen közzé ebben a szobában"
- "Egyéni beállítás engedélyezése"
- "Ennek bekapcsolása felülírja az alapértelmezett beállítást"
- "Értesítések kérése ebben a csevegésben ezekről:"
- "Megváltoztathatja a %1$s."
- "globális beállításokban"
- "Alapértelmezett beállítás"
- "Egyéni beállítás eltávolítása"
- "Hiba történt az értesítési beállítások betöltésekor."
- "Nem sikerült visszaállítani az alapértelmezett módot, próbálja újra."
- "Nem sikerült a mód beállítása, próbálja újra."
- "A Matrix-kiszolgálója nem támogatja ezt a beállítást a titkosított szobákban, egyes szobákban nem fog értesítéseket kapni."
- "Összes üzenet"
- "Csak említések és kulcsszavak"
- "Ebben a szobában, értesítés ezekről:"
- "Kevesebb megjelenítése"
- "Több megjelenítése"
"Újraküldés"
"Az üzenet elküldése sikertelen"
"Emodzsi hozzáadása"
+ "Ez a(z) %1$s kezdete."
+ "Ez a beszélgetés kezdete."
"Kevesebb megjelenítése"
+ "Üzenet másolva"
+ "Nincs jogosultsága arra, hogy bejegyzést tegyen közzé ebben a szobában"
+ "Kevesebb megjelenítése"
+ "Több megjelenítése"
+ "Új"
+
+ - "%1$d szobaváltozás"
+ - "%1$d szobaváltozás"
+
- "%1$s, %2$s és %3$d további felhasználó"
- "%1$s, %2$s és %3$d további felhasználó"
@@ -68,5 +50,4 @@
- "%1$s éppen ír…"
"%1$s és %2$s"
- "Tartsa a rögzítéshez"
diff --git a/features/messages/impl/src/main/res/values-in/translations.xml b/features/messages/impl/src/main/res/values-in/translations.xml
index 313b699e4c..c1f6f5bbbb 100644
--- a/features/messages/impl/src/main/res/values-in/translations.xml
+++ b/features/messages/impl/src/main/res/values-in/translations.xml
@@ -8,16 +8,10 @@
"Senyuman & Orang"
"Wisata & Tempat"
"Simbol"
- "Pesan ini akan dilaporkan ke administrator homeserver Anda. Mereka tidak akan dapat membaca pesan terenkripsi apa pun."
- "Alasan melaporkan konten ini"
- "Ini adalah awal dari %1$s."
- "Ini adalah awal dari percakapan ini."
- "Baru"
-
- - "%1$d perubahan ruangan"
-
"Blokir pengguna"
"Centang jika Anda ingin menyembunyikan semua pesan saat ini dan yang akan datang dari pengguna ini"
+ "Pesan ini akan dilaporkan ke administrator homeserver Anda. Mereka tidak akan dapat membaca pesan terenkripsi apa pun."
+ "Alasan melaporkan konten ini"
"Kamera"
"Ambil foto"
"Rekam video"
@@ -26,36 +20,24 @@
"Lokasi"
"Pemungutan suara"
"Pemformatan Teks"
- "Semua orang"
"Riwayat pesan saat ini tidak tersedia di ruangan ini"
"Riwayat pesan tidak tersedia di ruangan ini. Verifikasi perangkat ini untuk melihat riwayat pesan."
- "Gagal memproses media untuk diunggah, silakan coba lagi."
- "Tidak dapat mengambil detail pengguna"
"Apakah Anda ingin mengundang mereka kembali?"
"Anda sendirian di obrolan ini"
"Beri tahu seluruh ruangan"
"Semua orang"
- "Pesan disalin"
- "Anda tidak memiliki izin untuk mengirim di ruangan ini"
- "Izinkan pengaturan khusus"
- "Mengaktifkan ini akan mengganti pengaturan bawaan Anda"
- "Beri tahu saya di obrolan ini tentang"
- "Anda dapat mengubahnya di %1$s Anda."
- "pengaturan global"
- "Pengaturan bawaan"
- "Hapus pengaturan khusus"
- "Terjadi kesalahan saat memuat pengaturan pemberitahuan."
- "Gagal memulihkan mode bawaan, silakan coba lagi."
- "Gagal mengatur mode, silakan coba lagi."
- "Homeserver Anda tidak mendukung opsi ini dalam ruangan terenkripsi, Anda tidak akan diberi tahu dalam ruangan ini."
- "Semua pesan"
- "Sebutan dan Kata Kunci saja"
- "Di ruangan ini, beri tahu saya tentang"
- "Tampilkan lebih sedikit"
- "Tampilkan lebih banyak"
"Kirim ulang"
"Pesan Anda gagal dikirim"
"Tambahkan emoji"
+ "Ini adalah awal dari %1$s."
+ "Ini adalah awal dari percakapan ini."
"Tampilkan lebih sedikit"
- "Tahan untuk merekam"
+ "Pesan disalin"
+ "Anda tidak memiliki izin untuk mengirim di ruangan ini"
+ "Tampilkan lebih sedikit"
+ "Tampilkan lebih banyak"
+ "Baru"
+
+ - "%1$d perubahan ruangan"
+
diff --git a/features/messages/impl/src/main/res/values-it/translations.xml b/features/messages/impl/src/main/res/values-it/translations.xml
index 3911dbd015..c1acba9be8 100644
--- a/features/messages/impl/src/main/res/values-it/translations.xml
+++ b/features/messages/impl/src/main/res/values-it/translations.xml
@@ -8,17 +8,10 @@
"Faccine & Persone"
"Viaggi & Luoghi"
"Simboli"
- "Questo messaggio verrà segnalato all\'amministratore dell\'homeserver. Questi non sarà in grado di leggere i messaggi criptati."
- "Motivo della segnalazione di questo contenuto"
- "Questo è l\'inizio di %1$s."
- "Questo è l\'inizio della conversazione."
- "Nuovo"
-
- - "%1$d modifica alla stanza"
- - "%1$d modifiche alla stanza"
-
"Blocca utente"
"Seleziona se vuoi nascondere tutti i messaggi attuali e futuri di questo utente"
+ "Questo messaggio verrà segnalato all\'amministratore dell\'homeserver. Questi non sarà in grado di leggere i messaggi cifrati."
+ "Motivo della segnalazione di questo contenuto"
"Fotocamera"
"Scatta foto"
"Registra video"
@@ -27,37 +20,27 @@
"Posizione"
"Sondaggio"
"Formattazione del testo"
- "Tutti"
"La cronologia dei messaggi non è attualmente disponibile."
"La cronologia dei messaggi non è disponibile in questa stanza. Verifica questo dispositivo per vedere la cronologia dei messaggi."
- "Elaborazione del file multimediale da caricare fallita, riprova."
- "Impossibile recuperare i dettagli dell\'utente"
"Vorresti invitarli di nuovo?"
"Ci sei solo tu in questa chat"
- "Avvisa l\'intera stanza"
+ "Notifica l\'intera stanza"
"Tutti"
- "Messaggio copiato"
- "Non sei autorizzato a postare in questa stanza"
- "Consenti impostazione personalizzata"
- "L\'attivazione di questa opzione sovrascriverà l\'impostazione predefinita"
- "Avvisami in questa chat per"
- "Puoi cambiarlo nelle tue %1$s."
- "impostazioni globali"
- "Impostazione predefinita"
- "Rimuovi l\'impostazione personalizzata"
- "Si è verificato un errore durante il caricamento delle impostazioni di notifica."
- "Ripristino della modalità predefinita fallito, riprova."
- "Impossibile impostare la modalità, riprova."
- "Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi non riceverai notifiche in questa stanza."
- "Tutti i messaggi"
- "Solo menzioni e parole chiave"
- "In questa stanza, avvisami per"
- "Mostra meno"
- "Mostra di più"
"Invia di nuovo"
"Il tuo messaggio non è stato inviato"
"Aggiungi emoji"
+ "Questo è l\'inizio di %1$s."
+ "Questo è l\'inizio della conversazione."
"Mostra meno"
+ "Messaggio copiato"
+ "Non sei autorizzato a postare in questa stanza"
+ "Mostra meno"
+ "Mostra di più"
+ "Nuovo"
+
+ - "%1$d modifica alla stanza"
+ - "%1$d modifiche alla stanza"
+
- "%1$s, %2$s e %3$d altro"
- "%1$s, %2$s e altri %3$d"
@@ -67,5 +50,4 @@
- "%1$s stanno scrivendo"
"%1$s e %2$s"
- "Tieni premuto per registrare"
diff --git a/features/messages/impl/src/main/res/values-ro/translations.xml b/features/messages/impl/src/main/res/values-ro/translations.xml
index 2ca0953d5e..98520ece20 100644
--- a/features/messages/impl/src/main/res/values-ro/translations.xml
+++ b/features/messages/impl/src/main/res/values-ro/translations.xml
@@ -8,18 +8,10 @@
"Fețe zâmbitoare & Oameni"
"Călătorii & Locuri"
"Simboluri"
- "Acest mesaj va fi raportat administratorilor homeserver-ului tau. Ei nu vor putea citi niciun mesaj criptat."
- "Motivul raportării acestui conținut"
- "Acesta este începutul conversației %1$s."
- "Acesta este începutul acestei conversații."
- "Nou"
-
- - "%1$d schimbare a camerii"
- - "%1$d schimbări ale camerei"
- - "%1$d schimbări ale camerei"
-
"Blocați utilizatorul"
"Confirmați că doriți să ascundeți toate mesajele curente și viitoare de la acest utilizator"
+ "Acest mesaj va fi raportat administratorilor homeserver-ului tau. Ei nu vor putea citi niciun mesaj criptat."
+ "Motivul raportării acestui conținut"
"Cameră foto"
"Faceți o fotografie"
"Înregistrați un videoclip"
@@ -28,37 +20,28 @@
"Locație"
"Sondaj"
"Formatarea textului"
- "Toți"
"Istoricul mesajelor este momentan indisponibil în această cameră"
"Istoricul mesajelor nu este disponibil în această cameră. Verificați acest dispozitiv pentru a vedea istoricul mesajelor."
- "Procesarea datelor media a eșuat, vă rugăm să încercați din nou."
- "Nu am putut găsi detaliile utilizatorului"
"Doriți să îi invitați înapoi?"
"Sunteți singur în această cameră"
"Notificați întreaga cameră"
"Toți"
- "Mesaj copiat"
- "Nu aveți permisiunea de a posta în această cameră"
- "Permiteți setări personalizate"
- "Activarea acestei opțiuni va anula setările implicite."
- "Anunțați-mă în acestă cameră pentru"
- "Îl puteți schimba în %1$s."
- "Setări generale"
- "Setare implicită"
- "Stergeți setarea personalizată"
- "A apărut o eroare la încărcarea setărilor pentry notificari."
- "Nu s-a reușit restaurarea modului implicit, vă rugăm să încercați din nou."
- "Nu s-a reușit setarea modului, vă rugăm să încercați din nou."
- "Serverul dumneavoastră nu acceptă această opțiune în camerele criptate, nu veți primi notificări în această cameră."
- "Toate mesajele"
- "Numai mențiuni și cuvinte cheie"
- "În această cameră, anunțați-mă pentru"
- "Afișați mai puțin"
- "Afișați mai mult"
"Trimiteți din nou"
"Mesajul dvs. nu a putut fi trimis"
"Adăugați emoji"
+ "Acesta este începutul conversației %1$s."
+ "Acesta este începutul acestei conversații."
"Afișați mai puțin"
+ "Mesaj copiat"
+ "Nu aveți permisiunea de a posta în această cameră"
+ "Afișați mai puțin"
+ "Afișați mai mult"
+ "Nou"
+
+ - "%1$d schimbare a camerii"
+ - "%1$d schimbări ale camerei"
+ - "%1$d schimbări ale camerei"
+
- "%1$s, %2$s și încă %3$d"
- "%1$s, %2$s și încă %3$d"
@@ -70,5 +53,4 @@
- "%1$s scriu"
"%1$s și %2$s"
- "Țineți apăsat pentru a înregistra"
diff --git a/features/messages/impl/src/main/res/values-ru/translations.xml b/features/messages/impl/src/main/res/values-ru/translations.xml
index fd2a4e692d..28ca6271d9 100644
--- a/features/messages/impl/src/main/res/values-ru/translations.xml
+++ b/features/messages/impl/src/main/res/values-ru/translations.xml
@@ -8,18 +8,10 @@
"Улыбки и люди"
"Путешествия и места"
"Символы"
- "Это сообщение будет передано администратору вашего домашнего сервера. Они не смогут прочитать зашифрованные сообщения."
- "Причина, по которой вы пожаловались на этот контент"
- "Это начало %1$s."
- "Это начало разговора."
- "Новый"
-
- - "%1$d изменение в комнате"
- - "%1$d изменения в комнате"
- - "%1$d изменений в комнате"
-
"Заблокировать пользователя"
"Отметьте, хотите ли вы скрыть все текущие и будущие сообщения от этого пользователя"
+ "Это сообщение будет передано администратору вашего домашнего сервера. Они не смогут прочитать зашифрованные сообщения."
+ "Причина, по которой вы пожаловались на этот контент"
"Камера"
"Сделать фото"
"Записать видео"
@@ -28,73 +20,28 @@
"Местоположение"
"Опрос"
"Форматирование текста"
- "Только для администраторов"
- "Заблокировать людей"
- "Удалить сообщения"
- "Для всех"
- "Пригласить людей"
- "Модерация участников"
- "Сообщения и содержание"
- "Администраторы и модераторы"
- "Удалить людей"
- "Изменить изображение комнаты"
- "Информация о комнате"
- "Изменить название комнаты"
- "Сменить тему комнаты"
- "Отправить сообщение"
- "Редактировать роль администраторов"
- "Вы не сможете отменить это действие. Вы устанавливаете уровень пользователю соответствующий вашему."
- "Добавить администратора?"
- "Понизить уровень"
- "Вы не сможете отменить это изменение, так как понижаете себя статус. Если вы являетесь последним привилегированным пользователем в комнате, восстановить привилегии будет невозможно."
- "Понизить свой уровень?"
- "Редактировать роль модераторов"
- "У вас есть несохраненные изменения."
- "Сохранить изменения?"
"В настоящее время история сообщений недоступна в этой комнате."
"История сообщений в этой комнате недоступна. Проверьте это устройство, чтобы увидеть историю сообщений."
- "Не удалось обработать медиафайл для загрузки, попробуйте еще раз."
- "Не удалось получить данные о пользователе"
"Хотите пригласить их снова?"
"Вы одни в этой комнате"
"Уведомить всю комнату"
"Для всех"
- "Сообщение скопировано"
- "У вас нет разрешения публиковать сообщения в этой комнате"
- "Разрешить пользовательские настройки"
- "Включение этого параметра отменяет настройки по умолчанию"
- "Уведомить меня в этом чате"
- "Вы можете изменить его в своем %1$s."
- "основные настройки"
- "Настройка по умолчанию"
- "Удалить пользовательскую настройку"
- "Произошла ошибка при загрузке настроек уведомлений."
- "Не удалось восстановить режим по умолчанию, попробуйте еще раз."
- "Не удалось настроить режим, попробуйте еще раз."
- "Ваш домашний сервер не поддерживает эту опцию в зашифрованных комнатах, вы не будете получать уведомления в этой комнате."
- "Все сообщения"
- "Только упоминания и ключевые слова"
- "В этой комнате уведомить меня о"
- "Показать меньше"
- "Показать больше"
"Отправить снова"
"Не удалось отправить ваше сообщение"
- "Администраторы"
- "Измените мою роль"
- "Понижение до участника"
- "Понизить до модератора"
- "Модерация участников"
- "Сообщения и содержание"
- "Модераторы"
- "Разрешения"
- "Сбросить разрешения"
- "Как только вы сбросите разрешения, вы потеряете текущие настройки."
- "Сбросить разрешения?"
- "Роли"
- "Информация о комнате"
- "Роли и разрешения"
"Добавить эмодзи"
+ "Это начало %1$s."
+ "Это начало разговора."
"Показать меньше"
+ "Сообщение скопировано"
+ "У вас нет разрешения публиковать сообщения в этой комнате"
+ "Показать меньше"
+ "Показать больше"
+ "Новый"
+
+ - "%1$d изменение в комнате"
+ - "%1$d изменения в комнате"
+ - "%1$d изменений в комнате"
+
- "%1$s, %2$s и %3$d"
- "%1$s, %2$s и другие %3$d"
@@ -106,5 +53,4 @@
- "%1$s набирают сообщения"
"%1$s и %2$s"
- "Удерживайте для записи"
diff --git a/features/messages/impl/src/main/res/values-sk/translations.xml b/features/messages/impl/src/main/res/values-sk/translations.xml
index 6e102a6886..932cf1d9b1 100644
--- a/features/messages/impl/src/main/res/values-sk/translations.xml
+++ b/features/messages/impl/src/main/res/values-sk/translations.xml
@@ -8,18 +8,10 @@
"Smajlíky a ľudia"
"Cestovanie a miesta"
"Symboly"
- "Táto správa bude nahlásená správcovi vášho domovského servera. Nebude môcť prečítať žiadne šifrované správy."
- "Dôvod nahlásenia tohto obsahu"
- "Toto je začiatok %1$s."
- "Toto je začiatok tejto konverzácie."
- "Nové"
-
- - "%1$d zmena miestnosti"
- - "%1$d zmeny miestnosti"
- - "%1$d zmien miestnosti"
-
"Zablokovať používateľa"
"Označte, či chcete skryť všetky aktuálne a budúce správy od tohto používateľa"
+ "Táto správa bude nahlásená správcovi vášho domovského servera. Nebude môcť prečítať žiadne šifrované správy."
+ "Dôvod nahlásenia tohto obsahu"
"Kamera"
"Urobiť fotku"
"Nahrať video"
@@ -28,73 +20,28 @@
"Poloha"
"Anketa"
"Formátovanie textu"
- "Iba správcovia"
- "Zakázať ľudí"
- "Odstrániť správy"
- "Všetci"
- "Pozvať ľudí"
- "Moderovanie členov"
- "Správy a obsah"
- "Správcovia a moderátori"
- "Odstrániť ľudí"
- "Zmeniť obrázok miestnosti"
- "Podrobnosti o miestnosti"
- "Zmeniť názov miestnosti"
- "Zmeniť tému miestnosti"
- "Odoslať správy"
- "Upraviť správcov"
- "Túto akciu nebudete môcť vrátiť späť. Zvyšujete úroveň používateľa na rovnakú úroveň výkonu ako máte vy."
- "Pridať správcu?"
- "Znížiť"
- "Túto zmenu nebudete môcť vrátiť späť, pretože znižujete svoju úroveň. Ak ste posledným privilegovaným používateľom v miestnosti, nebude možné získať znova oprávnenia."
- "Znížiť svoju úroveň?"
- "Upraviť moderátorov"
- "Máte neuložené zmeny."
- "Uložiť zmeny?"
"História správ v tejto miestnosti nie je momentálne k dispozícii"
"História správ nie je v tejto miestnosti k dispozícii. Ak chcete zobraziť históriu správ, overte toto zariadenie."
- "Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova."
- "Nepodarilo sa získať údaje o používateľovi"
"Chceli by ste ich pozvať späť?"
"V tomto rozhovore ste sami"
"Informovať celú miestnosť"
"Všetci"
- "Správa skopírovaná"
- "Nemáte povolenie uverejňovať príspevky v tejto miestnosti"
- "Povoliť vlastné nastavenie"
- "Zapnutím tohto nastavenia sa prepíše vaše predvolené nastavenie"
- "Upozorniť ma v tejto konverzácii na"
- "Môžete to zmeniť vo svojich %1$s."
- "všeobecných nastaveniach"
- "Predvolené nastavenie"
- "Odstrániť vlastné nastavenie"
- "Pri načítavaní nastavení oznámení došlo k chybe."
- "Nepodarilo sa obnoviť predvolený režim, skúste to prosím znova."
- "Nepodarilo sa nastaviť režim, skúste to prosím znova."
- "Váš domovský server nepodporuje túto možnosť v šifrovaných miestnostiach, v tejto miestnosti nedostanete upozornenie."
- "Všetky správy"
- "Iba zmienky a kľúčové slová"
- "V tejto miestnosti ma upozorniť na"
- "Zobraziť menej"
- "Zobraziť viac"
"Odoslať znova"
"Vašu správu sa nepodarilo odoslať"
- "Správcovia"
- "Zmeniť moje oprávnenia"
- "Znížiť úroveň na člena"
- "Znížiť úroveň na moderátora"
- "Moderovanie členov"
- "Správy a obsah"
- "Moderátori"
- "Oprávnenia"
- "Obnoviť povolenia"
- "Po obnovení oprávnení prídete o aktuálne nastavenia."
- "Obnoviť oprávnenia?"
- "Roly"
- "Podrobnosti o miestnosti"
- "Roly a povolenia"
"Pridať emoji"
+ "Toto je začiatok %1$s."
+ "Toto je začiatok tejto konverzácie."
"Zobraziť menej"
+ "Správa skopírovaná"
+ "Nemáte povolenie uverejňovať príspevky v tejto miestnosti"
+ "Zobraziť menej"
+ "Zobraziť viac"
+ "Nové"
+
+ - "%1$d zmena miestnosti"
+ - "%1$d zmeny miestnosti"
+ - "%1$d zmien miestnosti"
+
- "%1$s, %2$s a %3$d ďalší"
- "%1$s, %2$s a %3$d ďalší"
@@ -106,5 +53,4 @@
- "%1$s píšu"
"%1$s a %2$s"
- "Podržaním nahrajte"
diff --git a/features/messages/impl/src/main/res/values-sv/translations.xml b/features/messages/impl/src/main/res/values-sv/translations.xml
index daf3427c0b..fddf525181 100644
--- a/features/messages/impl/src/main/res/values-sv/translations.xml
+++ b/features/messages/impl/src/main/res/values-sv/translations.xml
@@ -8,17 +8,10 @@
"Smileys & personer"
"Resor & platser"
"Symboler"
- "Det här meddelandet kommer att rapporteras till din hemservers administratör. Denne kommer inte att kunna läsa några krypterade meddelanden."
- "Anledning till att rapportera detta innehåll"
- "Det här är början på %1$s."
- "Detta är början på det här samtalet."
- "Nytt"
-
- - "%1$d rumsändring"
- - "%1$d rumsändringar"
-
"Blockera användare"
"Markera om du vill dölja alla nuvarande och framtida meddelanden från denna användare"
+ "Det här meddelandet kommer att rapporteras till din hemservers administratör. Denne kommer inte att kunna läsa några krypterade meddelanden."
+ "Anledning till att rapportera detta innehåll"
"Kamera"
"Ta ett foto"
"Spela in video"
@@ -27,33 +20,23 @@
"Plats"
"Omröstning"
"Textformatering"
- "Alla"
"Meddelandehistoriken är för närvarande otillgänglig."
- "Misslyckades att bearbeta media för uppladdning, vänligen pröva igen."
- "Kunde inte hämta användarinformation"
"Vill du bjuda tillbaka dem?"
"Du är ensam i den här chatten"
"Alla"
- "Meddelande kopierat"
- "Du är inte behörig att göra inlägg i det här rummet"
- "Tillåt anpassad inställning"
- "Om du aktiverar detta åsidosätts din standardinställning"
- "Meddela mig i den här chatten för"
- "Du kan ändra det i dina %1$s ."
- "globala inställningar"
- "Standardinställning"
- "Ta bort anpassad inställning"
- "Ett fel uppstod vid laddning av aviseringsinställningarna."
- "Misslyckades att återställa standardläget, vänligen försök igen."
- "Misslyckades att ställa in läget, vänligen pröva igen."
- "Alla meddelanden"
- "Endast omnämnanden och nyckelord"
- "I det här rummet, meddela mig för"
- "Visa mindre"
- "Visa mer"
"Skicka igen"
"Ditt meddelande kunde inte skickas"
"Lägg till emoji"
+ "Det här är början på %1$s."
+ "Detta är början på det här samtalet."
"Visa mindre"
- "Håll för att spela in"
+ "Meddelande kopierat"
+ "Du är inte behörig att göra inlägg i det här rummet"
+ "Visa mindre"
+ "Visa mer"
+ "Nytt"
+
+ - "%1$d rumsändring"
+ - "%1$d rumsändringar"
+
diff --git a/features/messages/impl/src/main/res/values-uk/translations.xml b/features/messages/impl/src/main/res/values-uk/translations.xml
index 9451f25300..e2aed62a60 100644
--- a/features/messages/impl/src/main/res/values-uk/translations.xml
+++ b/features/messages/impl/src/main/res/values-uk/translations.xml
@@ -8,18 +8,10 @@
"Смайлики та люди"
"Подорожі та місця"
"Символи"
- "Це повідомлення буде надіслано адміністратору вашого домашнього сервера. Він (вона) не зможе прочитати жодні зашифровані повідомлення."
- "Причина скарги на цей вміст"
- "Це початок %1$s"
- "Це початок цієї розмови."
- "Нове"
-
- - "%1$d зміна в кімнаті"
- - "%1$d зміни в кімнаті"
- - "%1$d змін у кімнаті"
-
"Заблокувати користувача"
"Перевірте, чи хочете Ви приховати всі поточні та майбутні повідомлення від цього користувача"
+ "Це повідомлення буде надіслано адміністратору вашого домашнього сервера. Він (вона) не зможе прочитати жодні зашифровані повідомлення."
+ "Причина скарги на цей вміст"
"Камера"
"Зробити фото"
"Записати відео"
@@ -28,66 +20,28 @@
"Розташування"
"Опитування"
"Форматування тексту"
- "Тільки для адміністраторів"
- "Заблоковувати людей"
- "Видалити повідомлення"
- "Усі"
- "Запросити людей"
- "Модерація учасників"
- "Повідомлення та зміст"
- "Адміністратори та модератори"
- "Видалити людей"
- "Змінити аватар кімнати"
- "Деталі кімнати"
- "Змінити назву кімнати"
- "Змінити тему кімнати"
- "Надіслати повідомлення"
- "Керувати адмінами"
- "Ви не зможете скасувати цю дію. Ви просуваєте користувача, щоб він мав такий же рівень прав, як і ви."
- "Додати адміністратора?"
- "Понизити"
- "Ви не зможете скасувати цю зміну, оскільки ви знижуєте себе, якщо ви останній привілейований користувач у кімнаті, відновити привілеї буде неможливо."
- "Понизити себе?"
- "Керувати модераторами"
"Історія повідомлень наразі недоступна."
"Історія повідомлень недоступна в цій кімнаті. Перевірте цей пристрій, щоб побачити історію повідомлень."
- "Не вдалося обробити медіафайл для завантаження, спробуйте ще раз."
- "Не вдалося отримати дані користувача"
"Чи хотіли б Ви запросити їх знову?"
"Ви одні в цьому чаті"
"Сповістіть усю кімнату"
"Усі"
- "Повідомлення скопійовано"
- "У Вас немає дозволу на публікацію в цій кімнаті"
- "Дозволити користувальницькі налаштування"
- "Увімкнення цього параметра змінить налаштування за замовчуванням"
- "Повідомте мене в цьому чаті для"
- "Ви можете змінити це у своїх %1$s."
- "глобальних налаштуваннях"
- "Налаштування за замовчуванням"
- "Вилучити користувальницькі налаштування"
- "Під час завантаження налаштувань сповіщень сталася помилка."
- "Не вдалося відновити режим за замовчуванням, спробуйте ще раз."
- "Не вдалося встановити режим, спробуйте ще раз."
- "Ваш домашній сервер не підтримує цю опцію в зашифрованих кімнатах, ви не отримаєте сповіщення в цій кімнаті."
- "Всі повідомлення"
- "Тільки згадки та ключові слова"
- "У цій кімнаті повідомляти мене про"
- "Показувати менше"
- "Показати більше"
"Надіслати знову"
"Ваше повідомлення не вдалося надіслати"
- "Адміністратори"
- "Модерація учасників"
- "Повідомлення та зміст"
- "Модератори"
- "Дозволи"
- "Скинути дозволи"
- "Ролі"
- "Деталі кімнати"
- "Ролі та дозволи"
"Додати смайлики"
+ "Це початок %1$s"
+ "Це початок цієї розмови."
"Показувати менше"
+ "Повідомлення скопійовано"
+ "У Вас немає дозволу на публікацію в цій кімнаті"
+ "Показувати менше"
+ "Показати більше"
+ "Нове"
+
+ - "%1$d зміна в кімнаті"
+ - "%1$d зміни в кімнаті"
+ - "%1$d змін у кімнаті"
+
- "%1$s%2$s та %3$d інший"
- "%1$s%2$s та %3$d інші"
@@ -99,5 +53,4 @@
- "%1$s пишуть"
"%1$s та %2$s"
- "Тримати, щоб записати"
diff --git a/features/messages/impl/src/main/res/values-zh-rTW/translations.xml b/features/messages/impl/src/main/res/values-zh-rTW/translations.xml
index 780be3cbcb..07336793b5 100644
--- a/features/messages/impl/src/main/res/values-zh-rTW/translations.xml
+++ b/features/messages/impl/src/main/res/values-zh-rTW/translations.xml
@@ -8,12 +8,8 @@
"表情與人物"
"旅行與景點"
"標誌"
- "檢舉這個內容的原因"
- "新訊息"
-
- - "%1$d 個聊天室變更"
-
"封鎖使用者"
+ "檢舉這個內容的原因"
"照相機"
"拍照"
"錄影"
@@ -22,24 +18,21 @@
"位置"
"投票"
"格式化文字"
- "所有人"
"您想要邀請他們回來嗎?"
"此聊天室只有您一個人"
"所有人"
- "訊息已複製"
- "您沒有權限在此聊天室傳送訊息"
- "全域設定"
- "預設"
- "無法重設為預設模式,請再試一次。"
- "無法設定模式,請再試一次。"
- "所有訊息"
- "僅限提及與關鍵字"
- "較少"
- "更多"
"重傳"
"無法傳送您的訊息"
"新增表情符號"
"較少"
+ "訊息已複製"
+ "您沒有權限在此聊天室傳送訊息"
+ "較少"
+ "更多"
+ "新訊息"
+
+ - "%1$d 個聊天室變更"
+
- "%1$s、%2$s 和其他 %3$d 個人"
diff --git a/features/messages/impl/src/main/res/values/localazy.xml b/features/messages/impl/src/main/res/values/localazy.xml
index daebb8613b..63d3d90382 100644
--- a/features/messages/impl/src/main/res/values/localazy.xml
+++ b/features/messages/impl/src/main/res/values/localazy.xml
@@ -8,17 +8,10 @@
"Smileys & People"
"Travel & Places"
"Symbols"
- "This message will be reported to your homeserver’s administrator. They will not be able to read any encrypted messages."
- "Reason for reporting this content"
- "This is the beginning of %1$s."
- "This is the beginning of this conversation."
- "New"
-
- - "%1$d room change"
- - "%1$d room changes"
-
"Block user"
"Check if you want to hide all current and future messages from this user"
+ "This message will be reported to your homeserver’s administrator. They will not be able to read any encrypted messages."
+ "Reason for reporting this content"
"Camera"
"Take photo"
"Record video"
@@ -27,73 +20,27 @@
"Location"
"Poll"
"Text Formatting"
- "Admins only"
- "Ban people"
- "Delete messages"
- "Everyone"
- "Invite people"
- "Member moderation"
- "Messages and content"
- "Admins and moderators"
- "Remove people"
- "Change room avatar"
- "Room details"
- "Change room name"
- "Change room topic"
- "Send messages"
- "Edit Admins"
- "You will not be able to undo this action. You are promoting the user to have the same power level as you."
- "Add Admin?"
- "Demote"
- "You will not be able to undo this change as you are demoting yourself, if you are the last privileged user in the room it will be impossible to regain privileges."
- "Demote yourself?"
- "Edit Moderators"
- "You have unsaved changes."
- "Save changes?"
"Message history is currently unavailable."
"Message history is unavailable in this room. Verify this device to see your message history."
- "Failed processing media to upload, please try again."
- "Could not retrieve user details"
"Would you like to invite them back?"
"You are alone in this chat"
"Notify the whole room"
"Everyone"
- "Message copied"
- "You do not have permission to post to this room"
- "Allow custom setting"
- "Turning this on will override your default setting"
- "Notify me in this chat for"
- "You can change it in your %1$s."
- "global settings"
- "Default setting"
- "Remove custom setting"
- "An error occurred while loading notification settings."
- "Failed restoring the default mode, please try again."
- "Failed setting the mode, please try again."
- "Your homeserver does not support this option in encrypted rooms, you won\'t get notified in this room."
- "All messages"
- "Mentions and Keywords only"
- "In this room, notify me for"
- "Show less"
- "Show more"
"Send again"
"Your message failed to send"
- "Admins"
- "Change my role"
- "Demote to member"
- "Demote to moderator"
- "Member moderation"
- "Messages and content"
- "Moderators"
- "Permissions"
- "Reset permissions"
- "Once you reset permissions, you will lose the current settings."
- "Reset permissions?"
- "Roles"
- "Room details"
- "Roles and permissions"
"Add emoji"
+ "This is the beginning of %1$s."
+ "This is the beginning of this conversation."
"Show less"
+ "Message copied"
+ "You do not have permission to post to this room"
+ "Show less"
+ "Show more"
+ "New"
+
+ - "%1$d room change"
+ - "%1$d room changes"
+
- "%1$s, %2$s and %3$d other"
- "%1$s, %2$s and %3$d others"
@@ -103,5 +50,4 @@
- "%1$s are typing"
"%1$s and %2$s"
- "Hold to record"
diff --git a/features/onboarding/impl/src/main/res/values-be/translations.xml b/features/onboarding/impl/src/main/res/values-be/translations.xml
index f39880e97e..e6605b9378 100644
--- a/features/onboarding/impl/src/main/res/values-be/translations.xml
+++ b/features/onboarding/impl/src/main/res/values-be/translations.xml
@@ -4,4 +4,6 @@
"Увайдзіце з QR-кодам"
"Стварыць уліковы запіс"
"Сардэчна запрашаем у самы хуткі Element. Перавага ў хуткасці і прастаце."
+ "Сардэчна запрашаем у %1$s. Зараджаны, для хуткасці і прастаты."
+ " Адчуйце сябе ў сваім element"
diff --git a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt
index 4ea8717688..456eebea72 100644
--- a/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt
+++ b/features/poll/impl/src/main/kotlin/io/element/android/features/poll/impl/history/PollHistoryView.kt
@@ -39,6 +39,7 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
@@ -195,7 +196,8 @@ private fun PollHistoryList(
text = emptyStringResource,
style = ElementTheme.typography.fontBodyLgRegular,
color = ElementTheme.colors.textSecondary,
- modifier = Modifier.padding(vertical = 24.dp, horizontal = 16.dp)
+ modifier = Modifier.padding(vertical = 24.dp, horizontal = 16.dp),
+ textAlign = TextAlign.Center,
)
}
}
diff --git a/features/preferences/impl/src/main/res/values-be/translations.xml b/features/preferences/impl/src/main/res/values-be/translations.xml
index 1f69842028..ce931f9c5f 100644
--- a/features/preferences/impl/src/main/res/values-be/translations.xml
+++ b/features/preferences/impl/src/main/res/values-be/translations.xml
@@ -6,10 +6,16 @@
"Задайце свой сервер Element Call."
"Адрас пазначаны няправільна, пераканайцеся, што вы ўказалі пратакол (http/https) і правільны адрас."
"Адключыць рэдактар фарматаванага тэксту і ўключыць Markdown."
+ "Апавяшчэнні аб чытанні"
+ "Калі выключыць, вашы пасведчанні аб прачытанні нікому не будуць адпраўляцца. Вы па-ранейшаму будзеце атрымліваць пасведчанні аб прачытанні ад іншых карыстальнікаў."
+ "Падзяліцеся прысутнасцю"
+ "Калі гэта выключана, вы не зможаце адпраўляць або атрымліваць апавяшчэнні аб прачытанні або апавяшчэнні аб наборы тэксту"
"Уключыце опцыю для прагляду крыніцы паведамлення на часовай шкале."
+ "У вас няма заблакіраваных карыстальнікаў"
"Разблакіраваць"
"Вы зноў зможаце ўбачыць усе паведамленні."
"Разблакіраваць карыстальніка"
+ "Разблакіроўка…"
"Бачнае імя"
"Ваша бачнае імя"
"Узнікла невядомая памылка, і інфармацыю не ўдалося змяніць."
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 1b1f751262..ddfd6eec5c 100644
--- a/features/preferences/impl/src/main/res/values-fr/translations.xml
+++ b/features/preferences/impl/src/main/res/values-fr/translations.xml
@@ -11,6 +11,7 @@
"Partager la présence"
"Si cette option est désactivée, vous ne pourrez ni envoyer ni recevoir de confirmations de lecture ni de notifications de saisie"
"Activer cette option pour pouvoir voir la source des messages dans la discussion."
+ "Vous n’avez bloqué personne"
"Débloquer"
"Vous pourrez à nouveau voir tous ses messages."
"Débloquer l’utilisateur"
diff --git a/features/preferences/impl/src/main/res/values-it/translations.xml b/features/preferences/impl/src/main/res/values-it/translations.xml
index 76fc34e954..8b0c6baa64 100644
--- a/features/preferences/impl/src/main/res/values-it/translations.xml
+++ b/features/preferences/impl/src/main/res/values-it/translations.xml
@@ -1,48 +1,50 @@
"Modalità sviluppatore"
- "Attiva per avere accesso a caratteristiche e funzionalità per sviluppatori."
+ "Attiva per avere accesso alle funzionalità per sviluppatori."
"URL base di Element Call personalizzato"
"Imposta un URL di base personalizzato per Element Call."
"URL non valido, assicurati di includere il protocollo (http/https) e l\'indirizzo corretto."
- "Disattiva l\'editor in rich text per digitare Markdown manualmente."
- "Conferme di lettura"
- "Se disattivato, le tue conferme di lettura non verranno inviate a nessuno. Riceverai comunque conferme di lettura da altri utenti."
+ "Disattiva l\'editor di testo avanzato per scrivere manualmente in Markdown"
+ "Ricevute di visualizzazione"
+ "Se disattivato, le tue ricevute di visualizzazione non verranno inviate a nessuno. Riceverai comunque ricevute di visualizzazione da altri utenti."
"Condividi presenza online"
- "Se disattivato, non potrai inviare o ricevere ricevute di lettura o notifiche di digitazione."
- "Attiva l\'opzione per visualizzare il sorgente del messaggio nella linea temporale."
+ "Se disattivato, non potrai inviare o ricevere ricevute di visualizzazione o notifiche di scrittura."
+ "Attiva l\'opzione per visualizzare il codice sorgente del messaggio nella conversazione."
+ "Non hai utenti bloccati"
"Sblocca"
"Potrai vedere di nuovo tutti i suoi messaggi."
"Sblocca utente"
- "Nome da mostrare"
- "Il tuo nome da mostrare"
+ "Sblocco in corso…"
+ "Nome visualizzato"
+ "Il tuo nome visualizzato"
"Si è verificato un errore sconosciuto e non è stato possibile modificare le informazioni."
"Impossibile aggiornare il profilo"
"Modifica profilo"
"Aggiornamento del profilo…"
"Impostazioni aggiuntive"
"Chiamate audio e video"
- "Mancata corrispondenza della configurazione"
+ "Mancata corrispondenza di configurazione"
"Abbiamo semplificato le impostazioni di notifica per rendere le opzioni più facili da trovare. Alcune impostazioni personalizzate che hai scelto in passato non sono mostrate qui, ma sono ancora attive.
Se procedi, alcune delle tue impostazioni potrebbero cambiare."
- "Chat dirette"
- "Impostazione personalizzata per chat"
+ "Conversazioni dirette"
+ "Impostazione personalizzata per conversazione"
"Si è verificato un errore durante l\'aggiornamento delle impostazioni di notifica."
"Tutti i messaggi"
"Solo menzioni e parole chiave"
- "Nelle chat dirette, avvisami per"
- "Nelle chat di gruppo, avvisami per"
+ "Nelle conversazioni dirette, avvisami per"
+ "Nelle conversazioni di gruppo, avvisami per"
"Attiva le notifiche su questo dispositivo"
"La configurazione non è stata corretta, riprova."
"Chat di gruppo"
"Inviti"
- "Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi potresti non ricevere notifiche in alcune stanze."
+ "Il tuo homeserver non supporta questa opzione nelle stanze crifrate, quindi potresti non ricevere notifiche in alcune stanze."
"Menzioni"
"Tutto"
"Menzioni"
"Avvisami per"
- "Avvisami su @room"
+ "Avvisami con @room"
"Per ricevere notifiche, modifica le tue %1$s."
"impostazioni di sistema"
"Notifiche di sistema disattivate"
diff --git a/features/rageshake/impl/src/main/res/values-be/translations.xml b/features/rageshake/impl/src/main/res/values-be/translations.xml
index 7d8c8b5327..277ba258be 100644
--- a/features/rageshake/impl/src/main/res/values-be/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-be/translations.xml
@@ -7,9 +7,11 @@
"Калі ласка, апішыце памылку. Што вы зрабілі? Якія паводзіны вы чакалі? Што адбылося насамрэч. Калі ласка, апішыце ўсё як магчыма падрабязней."
"Апішыце праблему…"
"Калі магчыма, калі ласка, напішыце апісанне на англійскай мове."
+ "Апісанне занадта кароткае. Дайце больш падрабязную інфармацыю аб тым, што адбылося. Дзякуй!"
"Адправіць часопісы збояў"
"Дазволіць часопісы"
"Адправіць здымак экрана"
"Каб пераканацца, што ўсё працуе правільна, у паведамленне будуць уключаны часопісы. Каб адправіць паведамленне без часопісаў, адключыце гэтую наладу."
"Пры апошнім выкарыстанні %1$s адбыўся збой. Жадаеце падзяліцца справаздачай аб збоі?"
+ "Прагляд часопісаў"
diff --git a/features/rageshake/impl/src/main/res/values-it/translations.xml b/features/rageshake/impl/src/main/res/values-it/translations.xml
index 3fd7abfddf..bbc5da3ce9 100644
--- a/features/rageshake/impl/src/main/res/values-it/translations.xml
+++ b/features/rageshake/impl/src/main/res/values-it/translations.xml
@@ -3,7 +3,7 @@
"Allega istantanea schermo"
"Potete contattarmi per qualsiasi altra domanda."
"Contattami"
- "Modifica istantanea schermo"
+ "Cambia istantanea schermo"
"Descrivi il problema. Che cosa hai fatto? Cosa ti aspettavi che accadesse? Cosa è effettivamente accaduto. Si prega di inserire il maggior numero di dettagli possibile."
"Descrivi il problema…"
"Se possibile, scrivere la descrizione in inglese."
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsEvents.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsEvents.kt
index 249d934816..f81fd94fb0 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsEvents.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsEvents.kt
@@ -21,5 +21,6 @@ import io.element.android.libraries.matrix.api.room.RoomMember
sealed interface RolesAndPermissionsEvents {
data object ChangeOwnRole : RolesAndPermissionsEvents
data class DemoteSelfTo(val role: RoomMember.Role) : RolesAndPermissionsEvents
+ data object ResetPermissions : RolesAndPermissionsEvents
data object CancelPendingAction : RolesAndPermissionsEvents
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt
index 6c38551441..319de14309 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsFlowNode.kt
@@ -28,6 +28,8 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import io.element.android.anvilannotations.ContributesNode
import io.element.android.features.roomdetails.impl.rolesandpermissions.changeroles.ChangeRolesNode
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsNode
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsSection
import io.element.android.libraries.architecture.BackstackView
import io.element.android.libraries.architecture.BaseFlowNode
import io.element.android.libraries.architecture.createNode
@@ -55,6 +57,9 @@ class RolesAndPermissionsFlowNode @AssistedInject constructor(
@Parcelize
data object ModeratorList : NavTarget
+
+ @Parcelize
+ data class ChangeRoomPermissions(val section: ChangeRoomPermissionsSection) : NavTarget
}
override fun resolve(navTarget: NavTarget, buildContext: BuildContext): Node {
@@ -68,6 +73,18 @@ class RolesAndPermissionsFlowNode @AssistedInject constructor(
override fun openModeratorList() {
backstack.push(NavTarget.ModeratorList)
}
+
+ override fun openEditRoomDetailsPermissions() {
+ backstack.push(NavTarget.ChangeRoomPermissions(ChangeRoomPermissionsSection.RoomDetails))
+ }
+
+ override fun openMessagesAndContentPermissions() {
+ backstack.push(NavTarget.ChangeRoomPermissions(ChangeRoomPermissionsSection.MessagesAndContent))
+ }
+
+ override fun openModerationPermissions() {
+ backstack.push(NavTarget.ChangeRoomPermissions(ChangeRoomPermissionsSection.MembershipModeration))
+ }
}
createNode(
buildContext = buildContext,
@@ -88,6 +105,13 @@ class RolesAndPermissionsFlowNode @AssistedInject constructor(
plugins = listOf(inputs),
)
}
+ is NavTarget.ChangeRoomPermissions -> {
+ val inputs = ChangeRoomPermissionsNode.Inputs(navTarget.section)
+ createNode(
+ buildContext = buildContext,
+ plugins = listOf(inputs),
+ )
+ }
}
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt
index 1e78302146..0da156e54b 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsNode.kt
@@ -17,6 +17,7 @@
package io.element.android.features.roomdetails.impl.rolesandpermissions
import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleEventObserver
@@ -46,17 +47,24 @@ class RolesAndPermissionsNode @AssistedInject constructor(
@Assisted plugins: List,
private val presenter: RolesAndPermissionsPresenter,
private val room: MatrixRoom,
-) : Node(buildContext, plugins = plugins), RoomDetailsAdminSettingsNavigator {
- interface Callback : Plugin {
- fun openAdminList()
- fun openModeratorList()
+) : Node(buildContext, plugins = plugins), RolesAndPermissionsNavigator {
+ interface Callback : Plugin, RolesAndPermissionsNavigator {
+ override fun openAdminList()
+ override fun openModeratorList()
+ override fun openEditRoomDetailsPermissions()
+ override fun openMessagesAndContentPermissions()
+ override fun openModerationPermissions()
+ override fun onBackPressed() {}
}
private val callback = plugins().first()
- override fun onBackPressed() = navigateUp()
- override fun openAdminList() = callback.openAdminList()
- override fun openModeratorList() = callback.openModeratorList()
+ @Stable
+ private val navigator = object : RolesAndPermissionsNavigator by callback {
+ override fun onBackPressed() {
+ navigateUp()
+ }
+ }
override fun onBuilt() {
super.onBuilt()
@@ -88,14 +96,17 @@ class RolesAndPermissionsNode @AssistedInject constructor(
val state = presenter.present()
RolesAndPermissionsView(
state = state,
- roomDetailsAdminSettingsNavigator = this,
+ rolesAndPermissionsNavigator = navigator,
modifier = modifier,
)
}
}
-interface RoomDetailsAdminSettingsNavigator {
+interface RolesAndPermissionsNavigator {
fun onBackPressed() {}
fun openAdminList() {}
fun openModeratorList() {}
+ fun openEditRoomDetailsPermissions() {}
+ fun openMessagesAndContentPermissions() {}
+ fun openModerationPermissions() {}
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
index db67de66a4..9e6eb824cc 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsPresenter.kt
@@ -55,6 +55,7 @@ class RolesAndPermissionsPresenter @Inject constructor(
}
}
val changeOwnRoleAction = remember { mutableStateOf>(AsyncAction.Uninitialized) }
+ val resetPermissionsAction = remember { mutableStateOf>(AsyncAction.Uninitialized) }
fun handleEvent(event: RolesAndPermissionsEvents) {
when (event) {
@@ -63,11 +64,17 @@ class RolesAndPermissionsPresenter @Inject constructor(
}
is RolesAndPermissionsEvents.CancelPendingAction -> {
changeOwnRoleAction.value = AsyncAction.Uninitialized
+ resetPermissionsAction.value = AsyncAction.Uninitialized
}
is RolesAndPermissionsEvents.DemoteSelfTo -> coroutineScope.demoteSelfTo(
role = event.role,
changeOwnRoleAction = changeOwnRoleAction,
)
+ is RolesAndPermissionsEvents.ResetPermissions -> if (resetPermissionsAction.value.isConfirming()) {
+ coroutineScope.resetPermissions(resetPermissionsAction)
+ } else {
+ resetPermissionsAction.value = AsyncAction.Confirming
+ }
}
}
@@ -75,6 +82,7 @@ class RolesAndPermissionsPresenter @Inject constructor(
adminCount = adminCount,
moderatorCount = moderatorCount,
changeOwnRoleAction = changeOwnRoleAction.value,
+ resetPermissionsAction = resetPermissionsAction.value,
eventSink = { handleEvent(it) },
)
}
@@ -88,6 +96,14 @@ class RolesAndPermissionsPresenter @Inject constructor(
}
}
+ private fun CoroutineScope.resetPermissions(
+ resetPermissionsAction: MutableState>,
+ ) = launch(dispatchers.io) {
+ runUpdatingState(resetPermissionsAction) {
+ room.resetPowerLevels().map {}
+ }
+ }
+
private fun MatrixRoomInfo?.userCountWithRole(role: RoomMember.Role): Int {
return if (this != null) {
userPowerLevels.count { (_, level) -> RoomMember.Role.forPowerLevel(level) == role }
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsState.kt
index b1c2905ae8..5fab19fcef 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsState.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsState.kt
@@ -22,5 +22,6 @@ data class RolesAndPermissionsState(
val adminCount: Int,
val moderatorCount: Int,
val changeOwnRoleAction: AsyncAction,
+ val resetPermissionsAction: AsyncAction,
val eventSink: (RolesAndPermissionsEvents) -> Unit,
)
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsStateProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsStateProvider.kt
index cde21c1e7e..9fa91879ba 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsStateProvider.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsStateProvider.kt
@@ -39,6 +39,21 @@ class RolesAndPermissionsStateProvider : PreviewParameterProvider = AsyncAction.Uninitialized,
+ resetPermissionsAction: AsyncAction = AsyncAction.Uninitialized,
eventSink: (RolesAndPermissionsEvents) -> Unit = {},
) = RolesAndPermissionsState(
adminCount = adminCount,
moderatorCount = moderatorCount,
changeOwnRoleAction = changeOwnRoleAction,
+ resetPermissionsAction = resetPermissionsAction,
eventSink = eventSink,
)
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsView.kt
index 087fa8c862..f97b069215 100644
--- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsView.kt
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/RolesAndPermissionsView.kt
@@ -33,6 +33,8 @@ import io.element.android.compound.tokens.generated.CompoundIcons
import io.element.android.features.roomdetails.impl.R
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.designsystem.components.ProgressDialog
+import io.element.android.libraries.designsystem.components.async.AsyncActionView
+import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
import io.element.android.libraries.designsystem.components.dialogs.ErrorDialog
import io.element.android.libraries.designsystem.components.list.ListItemContent
import io.element.android.libraries.designsystem.components.preferences.PreferencePage
@@ -53,35 +55,72 @@ import io.element.android.libraries.ui.strings.CommonStrings
@Composable
fun RolesAndPermissionsView(
state: RolesAndPermissionsState,
- roomDetailsAdminSettingsNavigator: RoomDetailsAdminSettingsNavigator,
+ rolesAndPermissionsNavigator: RolesAndPermissionsNavigator,
modifier: Modifier = Modifier,
) {
PreferencePage(
modifier = modifier,
title = stringResource(R.string.screen_room_roles_and_permissions_title),
- onBackPressed = roomDetailsAdminSettingsNavigator::onBackPressed,
+ onBackPressed = rolesAndPermissionsNavigator::onBackPressed,
) {
ListSectionHeader(title = stringResource(R.string.screen_room_roles_and_permissions_roles_header), hasDivider = false)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_admins)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Admin())),
trailingContent = ListItemContent.Text("${state.adminCount}"),
- onClick = { roomDetailsAdminSettingsNavigator.openAdminList() },
+ onClick = { rolesAndPermissionsNavigator.openAdminList() },
)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_moderators)) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.ChatProblem())),
trailingContent = ListItemContent.Text("${state.moderatorCount}"),
- onClick = { roomDetailsAdminSettingsNavigator.openModeratorList() },
+ onClick = { rolesAndPermissionsNavigator.openModeratorList() },
)
ListItem(
headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_change_my_role)) },
onClick = { state.eventSink(RolesAndPermissionsEvents.ChangeOwnRole) },
leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Edit()))
)
+ ListSectionHeader(title = stringResource(R.string.screen_room_roles_and_permissions_permissions_header), hasDivider = true)
+ ListItem(
+ headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_room_details)) },
+ leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Info())),
+ onClick = { rolesAndPermissionsNavigator.openEditRoomDetailsPermissions() },
+ )
+ ListItem(
+ headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_messages_and_content)) },
+ leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.Chat())),
+ onClick = { rolesAndPermissionsNavigator.openMessagesAndContentPermissions() },
+ )
+ ListItem(
+ headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_member_moderation)) },
+ leadingContent = ListItemContent.Icon(IconSource.Vector(CompoundIcons.User())),
+ onClick = { rolesAndPermissionsNavigator.openModerationPermissions() },
+ )
HorizontalDivider()
+ ListItem(
+ headlineContent = { Text(stringResource(R.string.screen_room_roles_and_permissions_reset)) },
+ onClick = { state.eventSink(RolesAndPermissionsEvents.ResetPermissions) },
+ style = ListItemStyle.Destructive,
+ )
}
+ AsyncActionView(
+ async = state.resetPermissionsAction,
+ confirmationDialog = {
+ ConfirmationDialog(
+ title = stringResource(R.string.screen_room_roles_and_permissions_reset_confirm_title),
+ content = stringResource(R.string.screen_room_roles_and_permissions_reset_confirm_description),
+ submitText = stringResource(CommonStrings.action_reset),
+ destructiveSubmit = true,
+ onSubmitClicked = { state.eventSink(RolesAndPermissionsEvents.ResetPermissions) },
+ onDismiss = { state.eventSink(RolesAndPermissionsEvents.CancelPendingAction) },
+ )
+ },
+ onSuccess = { state.eventSink(RolesAndPermissionsEvents.CancelPendingAction) },
+ onErrorDismiss = { state.eventSink(RolesAndPermissionsEvents.CancelPendingAction) }
+ )
+
when (state.changeOwnRoleAction) {
is AsyncAction.Confirming -> {
ChangeOwnRoleBottomSheet(
@@ -156,11 +195,7 @@ private fun ChangeOwnRoleBottomSheet(
)
ListItem(
headlineContent = { Text(stringResource(CommonStrings.action_cancel)) },
- onClick = {
- sheetState.hide(coroutineScope) {
- eventSink(RolesAndPermissionsEvents.CancelPendingAction)
- }
- },
+ onClick = ::dismiss,
style = ListItemStyle.Primary,
)
}
@@ -168,11 +203,11 @@ private fun ChangeOwnRoleBottomSheet(
@PreviewsDayNight
@Composable
-internal fun RoomDetailsAdminSettingsViewPreview(@PreviewParameter(RolesAndPermissionsStateProvider::class) state: RolesAndPermissionsState) {
+internal fun RolesAndPermissionViewPreview(@PreviewParameter(RolesAndPermissionsStateProvider::class) state: RolesAndPermissionsState) {
ElementPreview {
RolesAndPermissionsView(
state = state,
- roomDetailsAdminSettingsNavigator = object : RoomDetailsAdminSettingsNavigator {},
+ rolesAndPermissionsNavigator = object : RolesAndPermissionsNavigator {},
)
}
}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsEvent.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsEvent.kt
new file mode 100644
index 0000000000..003c4f7233
--- /dev/null
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsEvent.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
+
+import io.element.android.libraries.matrix.api.room.RoomMember
+
+interface ChangeRoomPermissionsEvent {
+ data class ChangeMinimumRoleForAction(val action: RoomPermissionType, val role: RoomMember.Role) : ChangeRoomPermissionsEvent
+ data object Save : ChangeRoomPermissionsEvent
+ data object Exit : ChangeRoomPermissionsEvent
+ data object ResetPendingActions : ChangeRoomPermissionsEvent
+}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsNode.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsNode.kt
new file mode 100644
index 0000000000..18b369a38b
--- /dev/null
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsNode.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
+
+import android.os.Parcelable
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import com.bumble.appyx.core.modality.BuildContext
+import com.bumble.appyx.core.node.Node
+import com.bumble.appyx.core.plugin.Plugin
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedInject
+import io.element.android.anvilannotations.ContributesNode
+import io.element.android.libraries.architecture.NodeInputs
+import io.element.android.libraries.architecture.inputs
+import io.element.android.libraries.di.RoomScope
+import kotlinx.parcelize.Parcelize
+
+@ContributesNode(RoomScope::class)
+class ChangeRoomPermissionsNode @AssistedInject constructor(
+ @Assisted buildContext: BuildContext,
+ @Assisted plugins: List,
+ presenterFactory: ChangeRoomPermissionsPresenter.Factory,
+) : Node(buildContext, plugins = plugins) {
+ @Parcelize
+ data class Inputs(
+ val section: ChangeRoomPermissionsSection,
+ ) : NodeInputs, Parcelable
+
+ private val inputs: Inputs = inputs()
+
+ private val presenter = presenterFactory.run {
+ create(inputs.section)
+ }
+
+ @Composable
+ override fun View(modifier: Modifier) {
+ val state = presenter.present()
+ ChangeRoomPermissionsView(
+ modifier = modifier,
+ state = state,
+ onBackPressed = this::navigateUp,
+ )
+ }
+}
+
+@Parcelize
+enum class ChangeRoomPermissionsSection : Parcelable {
+ RoomDetails,
+ MessagesAndContent,
+ MembershipModeration,
+}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt
new file mode 100644
index 0000000000..37d5d351eb
--- /dev/null
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsPresenter.kt
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import dagger.assisted.Assisted
+import dagger.assisted.AssistedFactory
+import dagger.assisted.AssistedInject
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.architecture.Presenter
+import io.element.android.libraries.matrix.api.room.MatrixRoom
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
+import kotlinx.collections.immutable.ImmutableList
+import kotlinx.collections.immutable.persistentListOf
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+
+class ChangeRoomPermissionsPresenter @AssistedInject constructor(
+ @Assisted private val section: ChangeRoomPermissionsSection,
+ private val room: MatrixRoom,
+) : Presenter {
+ companion object {
+ internal fun itemsForSection(section: ChangeRoomPermissionsSection) = when (section) {
+ ChangeRoomPermissionsSection.RoomDetails -> persistentListOf(
+ RoomPermissionType.ROOM_NAME,
+ RoomPermissionType.ROOM_AVATAR,
+ RoomPermissionType.ROOM_TOPIC,
+ )
+ ChangeRoomPermissionsSection.MessagesAndContent -> persistentListOf(
+ RoomPermissionType.SEND_EVENTS,
+ RoomPermissionType.REDACT_EVENTS,
+ )
+ ChangeRoomPermissionsSection.MembershipModeration -> persistentListOf(
+ RoomPermissionType.INVITE,
+ RoomPermissionType.KICK,
+ RoomPermissionType.BAN,
+ )
+ }
+ }
+ @AssistedFactory
+ interface Factory {
+ fun create(section: ChangeRoomPermissionsSection): ChangeRoomPermissionsPresenter
+ }
+
+ private val items: ImmutableList = itemsForSection(section)
+
+ private var initialPermissions by mutableStateOf(null)
+ private var currentPermissions by mutableStateOf(null)
+ private var saveAction by mutableStateOf>(AsyncAction.Uninitialized)
+ private var confirmExitAction by mutableStateOf>(AsyncAction.Uninitialized)
+
+ @Composable
+ override fun present(): ChangeRoomPermissionsState {
+ val coroutineScope = rememberCoroutineScope()
+
+ LaunchedEffect(Unit) {
+ updatePermissions()
+ }
+
+ val hasChanges by remember {
+ derivedStateOf { initialPermissions != currentPermissions }
+ }
+
+ fun handleEvent(event: ChangeRoomPermissionsEvent) {
+ when (event) {
+ is ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction -> {
+ currentPermissions = when (event.action) {
+ RoomPermissionType.BAN -> currentPermissions?.copy(ban = event.role.powerLevel)
+ RoomPermissionType.INVITE -> currentPermissions?.copy(invite = event.role.powerLevel)
+ RoomPermissionType.KICK -> currentPermissions?.copy(kick = event.role.powerLevel)
+ RoomPermissionType.SEND_EVENTS -> currentPermissions?.copy(sendEvents = event.role.powerLevel)
+ RoomPermissionType.REDACT_EVENTS -> currentPermissions?.copy(redactEvents = event.role.powerLevel)
+ RoomPermissionType.ROOM_NAME -> currentPermissions?.copy(roomName = event.role.powerLevel)
+ RoomPermissionType.ROOM_AVATAR -> currentPermissions?.copy(roomAvatar = event.role.powerLevel)
+ RoomPermissionType.ROOM_TOPIC -> currentPermissions?.copy(roomTopic = event.role.powerLevel)
+ }
+ }
+ is ChangeRoomPermissionsEvent.Save -> coroutineScope.save()
+ is ChangeRoomPermissionsEvent.Exit -> {
+ confirmExitAction = if (!hasChanges || confirmExitAction.isConfirming()) {
+ AsyncAction.Success(Unit)
+ } else {
+ AsyncAction.Confirming
+ }
+ }
+ is ChangeRoomPermissionsEvent.ResetPendingActions -> {
+ saveAction = AsyncAction.Uninitialized
+ confirmExitAction = AsyncAction.Uninitialized
+ }
+ }
+ }
+ return ChangeRoomPermissionsState(
+ section = section,
+ currentPermissions = currentPermissions,
+ items = items,
+ hasChanges = hasChanges,
+ saveAction = saveAction,
+ confirmExitAction = confirmExitAction,
+ eventSink = { handleEvent(it) }
+ )
+ }
+
+ private suspend fun updatePermissions() {
+ val powerLevels = room.powerLevels().getOrNull() ?: return
+ initialPermissions = powerLevels
+ currentPermissions = initialPermissions
+ }
+
+ private fun CoroutineScope.save() = launch {
+ saveAction = AsyncAction.Loading
+ val updatedRoomPowerLevels = currentPermissions ?: run {
+ saveAction = AsyncAction.Failure(IllegalStateException("Failed to set room power levels"))
+ return@launch
+ }
+ room.updatePowerLevels(updatedRoomPowerLevels)
+ .onSuccess {
+ initialPermissions = currentPermissions
+ saveAction = AsyncAction.Success(Unit)
+ }
+ .onFailure {
+ saveAction = AsyncAction.Failure(it)
+ }
+ }
+}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsState.kt
new file mode 100644
index 0000000000..a80e7bb49f
--- /dev/null
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsState.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
+
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
+import kotlinx.collections.immutable.ImmutableList
+
+data class ChangeRoomPermissionsState(
+ val section: ChangeRoomPermissionsSection,
+ val currentPermissions: MatrixRoomPowerLevels?,
+ val items: ImmutableList,
+ val hasChanges: Boolean,
+ val saveAction: AsyncAction,
+ val confirmExitAction: AsyncAction,
+ val eventSink: (ChangeRoomPermissionsEvent) -> Unit,
+)
+
+enum class RoomPermissionType {
+ BAN,
+ INVITE,
+ KICK,
+ SEND_EVENTS,
+ REDACT_EVENTS,
+ ROOM_NAME,
+ ROOM_AVATAR,
+ ROOM_TOPIC
+}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsStatePreviewProvider.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsStatePreviewProvider.kt
new file mode 100644
index 0000000000..8bb8073068
--- /dev/null
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsStatePreviewProvider.kt
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
+
+import androidx.compose.ui.tooling.preview.PreviewParameterProvider
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.room.RoomMember
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
+import kotlinx.collections.immutable.toPersistentList
+
+class ChangeRoomPermissionsStatePreviewProvider : PreviewParameterProvider {
+ override val values: Sequence
+ get() = sequenceOf(
+ aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails),
+ aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.MessagesAndContent),
+ aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.MembershipModeration),
+ aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails, hasChanges = true),
+ aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails, hasChanges = true, saveAction = AsyncAction.Loading),
+ aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ hasChanges = true,
+ saveAction = AsyncAction.Failure(IllegalStateException("Failed to save changes"))
+ ),
+ aChangeRoomPermissionsState(section = ChangeRoomPermissionsSection.RoomDetails, hasChanges = true, confirmExitAction = AsyncAction.Confirming),
+ )
+}
+
+internal fun aChangeRoomPermissionsState(
+ section: ChangeRoomPermissionsSection,
+ currentPermissions: MatrixRoomPowerLevels = previewPermissions(),
+ items: List = ChangeRoomPermissionsPresenter.itemsForSection(section),
+ hasChanges: Boolean = false,
+ saveAction: AsyncAction = AsyncAction.Uninitialized,
+ confirmExitAction: AsyncAction = AsyncAction.Uninitialized,
+ eventSink: (ChangeRoomPermissionsEvent) -> Unit = {},
+) = ChangeRoomPermissionsState(
+ section = section,
+ currentPermissions = currentPermissions,
+ items = items.toPersistentList(),
+ hasChanges = hasChanges,
+ saveAction = saveAction,
+ confirmExitAction = confirmExitAction,
+ eventSink = eventSink,
+)
+
+private fun previewPermissions(): MatrixRoomPowerLevels {
+ return MatrixRoomPowerLevels(
+ // MembershipModeration section
+ invite = RoomMember.Role.ADMIN.powerLevel,
+ kick = RoomMember.Role.MODERATOR.powerLevel,
+ ban = RoomMember.Role.USER.powerLevel,
+ // MessagesAndContent section
+ redactEvents = RoomMember.Role.MODERATOR.powerLevel,
+ sendEvents = RoomMember.Role.ADMIN.powerLevel,
+ // RoomDetails section
+ roomName = RoomMember.Role.ADMIN.powerLevel,
+ roomAvatar = RoomMember.Role.MODERATOR.powerLevel,
+ roomTopic = RoomMember.Role.USER.powerLevel,
+ )
+}
diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsView.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsView.kt
new file mode 100644
index 0000000000..1d57545a0b
--- /dev/null
+++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/rolesandpermissions/permissions/ChangeRoomPermissionsView.kt
@@ -0,0 +1,192 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.impl.rolesandpermissions.permissions
+
+import androidx.activity.compose.BackHandler
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.tooling.preview.PreviewParameter
+import io.element.android.compound.theme.ElementTheme
+import io.element.android.compound.tokens.generated.CompoundIcons
+import io.element.android.features.roomdetails.impl.R
+import io.element.android.libraries.core.bool.orFalse
+import io.element.android.libraries.designsystem.components.async.AsyncActionView
+import io.element.android.libraries.designsystem.components.button.BackButton
+import io.element.android.libraries.designsystem.components.dialogs.ConfirmationDialog
+import io.element.android.libraries.designsystem.components.list.ListItemContent
+import io.element.android.libraries.designsystem.preview.ElementPreview
+import io.element.android.libraries.designsystem.preview.PreviewsDayNight
+import io.element.android.libraries.designsystem.theme.aliasScreenTitle
+import io.element.android.libraries.designsystem.theme.components.IconSource
+import io.element.android.libraries.designsystem.theme.components.ListItem
+import io.element.android.libraries.designsystem.theme.components.ListItemStyle
+import io.element.android.libraries.designsystem.theme.components.ListSectionHeader
+import io.element.android.libraries.designsystem.theme.components.Scaffold
+import io.element.android.libraries.designsystem.theme.components.Text
+import io.element.android.libraries.designsystem.theme.components.TextButton
+import io.element.android.libraries.designsystem.theme.components.TopAppBar
+import io.element.android.libraries.matrix.api.room.RoomMember
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
+import io.element.android.libraries.ui.strings.CommonStrings
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+fun ChangeRoomPermissionsView(
+ state: ChangeRoomPermissionsState,
+ onBackPressed: () -> Unit,
+ modifier: Modifier = Modifier,
+) {
+ BackHandler {
+ state.eventSink(ChangeRoomPermissionsEvent.Exit)
+ }
+ Scaffold(
+ modifier = modifier,
+ topBar = {
+ val title = when (state.section) {
+ ChangeRoomPermissionsSection.RoomDetails -> stringResource(R.string.screen_room_change_permissions_room_details)
+ ChangeRoomPermissionsSection.MessagesAndContent -> stringResource(R.string.screen_room_change_permissions_messages_and_content)
+ ChangeRoomPermissionsSection.MembershipModeration -> stringResource(R.string.screen_room_change_permissions_member_moderation)
+ }
+ TopAppBar(
+ title = { Text(text = title, style = ElementTheme.typography.aliasScreenTitle) },
+ navigationIcon = {
+ BackButton(onClick = { state.eventSink(ChangeRoomPermissionsEvent.Exit) })
+ },
+ actions = {
+ TextButton(
+ text = stringResource(CommonStrings.action_save),
+ onClick = { state.eventSink(ChangeRoomPermissionsEvent.Save) },
+ enabled = state.hasChanges,
+ )
+ }
+ )
+ }
+ ) { padding ->
+ Column(modifier = Modifier.padding(padding)) {
+ for ((index, permissionItem) in state.items.withIndex()) {
+ ListSectionHeader(titleForSection(item = permissionItem), hasDivider = index > 0)
+ SelectRoleItem(
+ permissionsItem = permissionItem,
+ role = RoomMember.Role.ADMIN,
+ currentPermissions = state.currentPermissions
+ ) { item, role ->
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(item, role))
+ }
+ SelectRoleItem(
+ permissionsItem = permissionItem,
+ role = RoomMember.Role.MODERATOR,
+ currentPermissions = state.currentPermissions
+ ) { item, role ->
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(item, role))
+ }
+ SelectRoleItem(
+ permissionsItem = permissionItem,
+ role = RoomMember.Role.USER,
+ currentPermissions = state.currentPermissions
+ ) { item, role ->
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(item, role))
+ }
+ }
+ }
+ }
+
+ AsyncActionView(
+ async = state.saveAction,
+ onSuccess = { onBackPressed() },
+ onErrorDismiss = { state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions) }
+ )
+
+ AsyncActionView(
+ async = state.confirmExitAction,
+ onSuccess = { onBackPressed() },
+ confirmationDialog = {
+ ConfirmationDialog(
+ title = stringResource(R.string.screen_room_change_role_unsaved_changes_title),
+ content = stringResource(R.string.screen_room_change_role_unsaved_changes_description),
+ submitText = stringResource(CommonStrings.action_save),
+ cancelText = stringResource(CommonStrings.action_discard),
+ onSubmitClicked = { state.eventSink(ChangeRoomPermissionsEvent.Save) },
+ onDismiss = { state.eventSink(ChangeRoomPermissionsEvent.Exit) }
+ )
+ },
+ onErrorDismiss = {},
+ )
+}
+
+@Composable
+private fun SelectRoleItem(
+ permissionsItem: RoomPermissionType,
+ role: RoomMember.Role,
+ currentPermissions: MatrixRoomPowerLevels?,
+ onClick: (RoomPermissionType, RoomMember.Role) -> Unit
+) {
+ val title = when (role) {
+ RoomMember.Role.ADMIN -> stringResource(R.string.screen_room_change_permissions_administrators)
+ RoomMember.Role.MODERATOR -> stringResource(R.string.screen_room_change_permissions_moderators)
+ RoomMember.Role.USER -> stringResource(R.string.screen_room_change_permissions_everyone)
+ }
+ ListItem(
+ headlineContent = { Text(text = title) },
+ trailingContent = if (currentPermissions?.isSelected(permissionsItem, role).orFalse()) {
+ ListItemContent.Icon(IconSource.Vector(CompoundIcons.Check()))
+ } else {
+ null
+ },
+ style = ListItemStyle.Primary,
+ onClick = { onClick(permissionsItem, role) },
+ )
+}
+
+private fun MatrixRoomPowerLevels.isSelected(item: RoomPermissionType, role: RoomMember.Role): Boolean {
+ return when (item) {
+ RoomPermissionType.BAN -> RoomMember.Role.forPowerLevel(ban) == role
+ RoomPermissionType.INVITE -> RoomMember.Role.forPowerLevel(invite) == role
+ RoomPermissionType.KICK -> RoomMember.Role.forPowerLevel(kick) == role
+ RoomPermissionType.SEND_EVENTS -> RoomMember.Role.forPowerLevel(sendEvents) == role
+ RoomPermissionType.REDACT_EVENTS -> RoomMember.Role.forPowerLevel(redactEvents) == role
+ RoomPermissionType.ROOM_NAME -> RoomMember.Role.forPowerLevel(roomName) == role
+ RoomPermissionType.ROOM_AVATAR -> RoomMember.Role.forPowerLevel(roomAvatar) == role
+ RoomPermissionType.ROOM_TOPIC -> RoomMember.Role.forPowerLevel(roomTopic) == role
+ }
+}
+
+@Composable
+private fun titleForSection(item: RoomPermissionType): String = when (item) {
+ RoomPermissionType.INVITE -> stringResource(R.string.screen_room_change_permissions_invite_people)
+ RoomPermissionType.KICK -> stringResource(R.string.screen_room_change_permissions_remove_people)
+ RoomPermissionType.BAN -> stringResource(R.string.screen_room_change_permissions_ban_people)
+ RoomPermissionType.SEND_EVENTS -> stringResource(R.string.screen_room_change_permissions_send_messages)
+ RoomPermissionType.REDACT_EVENTS -> stringResource(R.string.screen_room_change_permissions_delete_messages)
+ RoomPermissionType.ROOM_NAME -> stringResource(R.string.screen_room_change_permissions_room_name)
+ RoomPermissionType.ROOM_AVATAR -> stringResource(R.string.screen_room_change_permissions_room_avatar)
+ RoomPermissionType.ROOM_TOPIC -> stringResource(R.string.screen_room_change_permissions_room_topic)
+}
+
+@PreviewsDayNight
+@Composable
+internal fun ChangeRoomPermissionsViewPreview(@PreviewParameter(ChangeRoomPermissionsStatePreviewProvider::class) state: ChangeRoomPermissionsState) {
+ ElementPreview {
+ ChangeRoomPermissionsView(
+ state = state,
+ onBackPressed = {},
+ )
+ }
+}
diff --git a/features/roomdetails/impl/src/main/res/values-be/translations.xml b/features/roomdetails/impl/src/main/res/values-be/translations.xml
index b0c078b88e..9187ad4837 100644
--- a/features/roomdetails/impl/src/main/res/values-be/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-be/translations.xml
@@ -9,7 +9,27 @@
"Пры абнаўленні налад апавяшчэнняў адбылася памылка."
"Ваш хатні сервер не падтрымлівае гэтую опцыю ў зашыфраваных пакоях, вы можаце не атрымаць апавяшчэнне ў некаторых пакоях."
"Апытанні"
+ "Толькі для адміністратараў"
+ "Заблакіраваць людзей"
+ "Выдаліць паведамленні"
"Усе"
+ "Запрасіць людзей"
+ "Мадэрацыя ўдзельнікаў"
+ "Паведамленні і змест"
+ "Адміністратары і мадэратары"
+ "Выдаліць людзей"
+ "Змяніць аватар пакоя"
+ "Дэталі пакоя"
+ "Змяніць назву пакоя"
+ "Змяніць тэму пакоя"
+ "Адправіць паведамленні"
+ "Рэдагаваць адміністратараў"
+ "Вы не зможаце адмяніць гэта дзеянне. Вы прасоўваеце карыстальніка да таго ж узроўню магутнасці, што і вы."
+ "Дадаць адміністратара?"
+ "Паніжэнне ўзроўню"
+ "Вы не зможаце адмяніць гэтае змяненне, бо паніжаеце сябе. Калі вы апошні адміністратар у пакоі, вярнуць права будзе немагчыма."
+ "Панізіць сябе?"
+ "Рэдагаваць мадэратараў"
"Дадаць тэму"
"Ужо ўдзельнік"
"Ужо запрасілі"
@@ -27,18 +47,37 @@
"Карыстальніцкі"
"Па змаўчанні"
"Апавяшчэнні"
+ "Ролі і дазволы"
"Назва пакоя"
"Бяспека"
"Падзяліцца пакоем"
"Тэма"
"Ідзе абнаўленне пакоя…"
+ "Заблакіраваць"
+ "Яны не змогуць зноў далучыцца да гэтага пакоя, калі іх запросяць."
+ "Вы ўпэўнены, што хочаце заблакіраваць гэтага карыстальніка?"
+ "Блакіроўка %1$s"
- "%1$d карыстальнік"
- "%1$d карыстальнікаў"
- "%1$d карыстальнікаў"
+ "Выдаліць удзельніка"
+ "Выдаліць і заблакіраваць удзельніка"
+ "Толькі выдаліць удзельніка"
+ "Выдаліць удзельніка і забараніць далучацца ў будучыні?"
+ "Разблакіраваць"
+ "Яны змогуць зноў далучыцца да гэтага пакоя, калі іх запросяць."
+ "Разблакіраваць карыстальніка"
+ "Інфармацыю пра карыстальніка"
+ "Заблакіраваны"
+ "Удзельнікі"
"У чаканні"
+ "Выдаленне %1$s …"
+ "Адміністратар"
+ "Мадэратар"
"Карыстальнікі пакоя"
+ "Разблакіроўка %1$s"
"Дазволіць карыстальніцкую наладу"
"Калі гэта ўключыць, ваша налада па змаўчанні будзе адменена"
"Апавяшчаць мяне ў гэтым чаце для"
@@ -53,5 +92,14 @@
"Усе паведамленні"
"Толькі згадванні і ключавыя словы"
"У гэтым пакоі паведаміце мяне пра"
+ "Адміністратары"
+ "Мадэрацыя ўдзельнікаў"
+ "Паведамленні і змест"
+ "Мадэратары"
+ "Дазволы"
+ "Скінуць дазволы"
+ "Ролі"
+ "Дэталі пакоя"
+ "Ролі і дазволы"
"Пры спробе пачаць чат адбылася памылка"
diff --git a/features/roomdetails/impl/src/main/res/values-de/translations.xml b/features/roomdetails/impl/src/main/res/values-de/translations.xml
index 7f882c2007..6fe56c474f 100644
--- a/features/roomdetails/impl/src/main/res/values-de/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-de/translations.xml
@@ -9,15 +9,29 @@
"Beim Aktualisieren der Benachrichtigungseinstellungen ist ein Fehler aufgetreten."
"Dein Homeserver unterstützt diese Option in verschlüsselten Räumen nicht. In einigen Räumen wirst du möglicherweise nicht benachrichtigt."
"Umfragen"
+ "Nur Administratoren"
+ "Mitglieder sperren"
+ "Nachrichten löschen"
"Alle"
+ "Personen einladen"
"Moderation der Mitglieder"
"Nachrichten und Inhalte"
+ "Administratoren und Moderatoren"
+ "Personen entfernen"
+ "Raum-Avatar ändern"
"Raumdetails"
+ "Raumname ändern"
+ "Raumthema ändern"
+ "Nachrichten senden"
+ "Admins bearbeiten"
"Du vergibst das selbe Rolle, die auch Du hast. Diese Aktion kann daher nicht mehr rückgängig gemacht werden."
"Als Administrator hinzufügen?"
"Zurückstufen"
"Du stufst dich selbst herab. Diese Änderung kann nicht rückgängig gemacht werden. Wenn du der letzte Benutzer mit dieser Rolle bist, ist es nicht möglich, diese Rolle wiederzuerlangen."
"Möchtest Du Dich selbst herabstufen?"
+ "Moderatoren bearbeiten"
+ "Du hast nicht gespeicherte Änderungen."
+ "Änderungen speichern?"
"Thema hinzufügen"
"Bereits Mitglied"
"Bereits eingeladen"
@@ -41,11 +55,16 @@
"Raum teilen"
"Thema"
"Raum wird aktualisiert…"
+ "Sperren"
+ "Sie können dem Raum nicht mehr beitreten, selbst wenn sie eingeladen werden."
+ "Bist du sicher, dass du dieses Mitglied sperren möchtest?"
+ "In diesem Raum gibt es keine gesperrten Benutzer."
"%1$s wird gesperrt."
- "%1$d Person"
- "%1$d Personen"
+ "Mitglied entfernen und sperren"
"Mitglied entfernen"
"Mitglied entfernen und sperren"
"Mitglied nur entfernen"
@@ -77,11 +96,16 @@
"Nur Erwähnungen und Schlüsselwörter"
"Benachrichtige mich in diesem Raum bei"
"Administratoren"
+ "Ändere meine Rolle"
+ "Zum Mitglied herabstufen"
+ "Zum Moderator herabstufen"
"Moderation der Mitglieder"
"Nachrichten und Inhalte"
"Moderatoren"
"Berechtigungen"
"Rollen und Berechtigungen zurücksetzen"
+ "Sobald Sie die Berechtigungen zurücksetzen, verlieren Sie die aktuellen Einstellungen."
+ "Berechtigungen zurücksetzen?"
"Rollen"
"Raumdetails"
"Rollen und Berechtigungen"
diff --git a/features/roomdetails/impl/src/main/res/values-fr/translations.xml b/features/roomdetails/impl/src/main/res/values-fr/translations.xml
index 0ac5926078..97779e8fd7 100644
--- a/features/roomdetails/impl/src/main/res/values-fr/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-fr/translations.xml
@@ -9,16 +9,29 @@
"Une erreur s’est produite lors de la mise à jour du paramètre de notification."
"Votre serveur d’accueil ne supporte pas cette option pour les salons chiffrés, vous pourriez ne pas être notifié(e) dans certains salons."
"Sondages"
+ "Administrateurs seulement"
+ "Bannir les membres"
+ "Supprimer les messages"
"Tout le monde"
+ "Inviter des membres"
+ "Administration des membres"
+ "Messages et contenus"
+ "Administrateurs et modérateurs"
+ "Retirer des membres"
"Changer l’avatar du salon"
"Détails du salon"
"Changer le nom du salon"
"Changer le sujet du salon"
+ "Envoyer des messages"
+ "Modifier les administrateurs"
"Vous ne pourrez pas annuler cette action. Vous êtes en train de promouvoir l’utilisateur pour qu’il ait le même niveau que vous."
"Ajouter un administrateur ?"
"Rétrograder"
"Vous ne pourrez pas annuler ce changement car vous vous rétrogradez, si vous êtes le dernier utilisateur privilégié du salon il sera impossible de retrouver les privilèges."
"Vous rétrograder ?"
+ "Modifier les modérateurs"
+ "Vous avez des modifications non-enregistrées."
+ "Enregistrer les modifications?"
"Ajouter un sujet"
"Déjà membre"
"Déjà invité(e)"
@@ -42,17 +55,24 @@
"Partager le salon"
"Sujet"
"Mise à jour du salon…"
+ "Bannir"
+ "L‘utilisateur ne pourra pas rejoindre le salon à nouveau, même si il est invité."
+ "Êtes-vous certain de vouloir bannir ce membre?"
+ "Il n’y a pas d’utilisateur banni dans ce salon."
"Bannissement de %1$s"
- "%1$d personne"
- "%1$d personnes"
- "Retirer le membre"
+ "Retirer et bannir ce membre"
+ "Retirer le membre du salon"
"Retirer et bannir le membre"
"Retirer le membre uniquement"
"Retirer le membre et interdire l’adhésion à l’avenir ?"
"Débannir"
- "Voir profil"
+ "Cet utilisateur pourra rejoindre le salon à nouveau si il est invité."
+ "Débannir l’utilisateur"
+ "Voir le profil"
"Bannis"
"Membres"
"En attente"
@@ -76,8 +96,16 @@
"Mentions et mots clés uniquement"
"Dans ce salon, prévenez-moi pour"
"Administrateurs"
+ "Changer mon rôle"
+ "Devenir simple membre"
+ "Devenir simple modérateur"
+ "Administration des membres"
+ "Messages et contenus"
"Modérateurs"
"Autorisations"
+ "Réinitialisation des permissions"
+ "La réinitialisation des permissions entraîne la perte des réglages actuels."
+ "Réinitialisation des permissions?"
"Rôles"
"Détails du salon"
"Rôles et autorisations"
diff --git a/features/roomdetails/impl/src/main/res/values-it/translations.xml b/features/roomdetails/impl/src/main/res/values-it/translations.xml
index 93bfe905d5..02e7f03cba 100644
--- a/features/roomdetails/impl/src/main/res/values-it/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-it/translations.xml
@@ -7,9 +7,31 @@
"Potrai vedere di nuovo tutti i suoi messaggi."
"Sblocca utente"
"Si è verificato un errore durante l\'aggiornamento delle impostazioni di notifica."
- "Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi potresti non ricevere notifiche in alcune stanze."
+ "Il tuo homeserver non supporta questa opzione nelle stanze crifrate, quindi potresti non ricevere notifiche in alcune stanze."
"Sondaggi"
+ "Solo amministratori"
+ "Escludi membri"
+ "Eliminare messaggi"
"Tutti"
+ "Invitare persone"
+ "Moderazione dei membri"
+ "Messaggi e contenuti"
+ "Amministratori e moderatori"
+ "Rimuovi persone"
+ "Cambia avatar della stanza"
+ "Dettagli della stanza"
+ "Cambia il nome della stanza"
+ "Cambiare l\'argomento della stanza"
+ "Inviare messaggi"
+ "Modifica amministratori"
+ "Non potrai annullare questa azione. Stai promuovendo l\'utente al tuo stesso livello di potere."
+ "Aggiungi amministratore?"
+ "Declassa"
+ "Non potrai annullare questa modifica perché ti stai declassando, se sei l\'ultimo utente privilegiato nella stanza, sarà impossibile riottenere i privilegi."
+ "Declassare te stesso?"
+ "Modifica moderatori"
+ "Hai delle modifiche non salvate."
+ "Salvare le modifiche?"
"Aggiungi argomento"
"Già membro"
"Già invitato"
@@ -27,19 +49,38 @@
"Personalizzato"
"Predefinito"
"Notifiche"
+ "Ruoli e autorizzazioni"
"Nome stanza"
"Sicurezza"
"Condividi stanza"
- "Oggetto"
+ "Argomento"
"Aggiornamento della stanza…"
+ "Escludi"
+ "Non potrà entrare nuovamente in questa stanza se invitato."
+ "Vuoi davvero escludere questo membro?"
+ "Non ci sono utenti esclusi in questa stanza."
+ "Esclusione di %1$s"
- "1 persona"
- "%1$d persone"
+ "Rimuovi ed escludi"
+ "Rimuovi dalla stanza"
+ "Rimuovi ed escludi"
+ "Rimuovi soltanto"
+ "Rimuovere e vietare l\'accesso in futuro?"
+ "Riammetti"
+ "Potrà entrare nuovamente in questa stanza se invitato."
+ "Riammetti utente"
+ "Visualizza profilo"
+ "Esclusi"
+ "Membri"
"In attesa"
+ "Rimozione di %1$s…"
"Amministratore"
"Moderatore"
"Membri della stanza"
+ "Riammissione di %1$s"
"Consenti impostazione personalizzata"
"L\'attivazione di questa opzione sovrascriverà l\'impostazione predefinita"
"Avvisami in questa chat per"
@@ -50,9 +91,23 @@
"Si è verificato un errore durante il caricamento delle impostazioni di notifica."
"Ripristino della modalità predefinita fallito, riprova."
"Impossibile impostare la modalità, riprova."
- "Il tuo homeserver non supporta questa opzione nelle stanze criptate, quindi non riceverai notifiche in questa stanza."
+ "Il tuo homeserver non supporta questa opzione nelle stanze cifrate, quindi non riceverai notifiche in questa stanza."
"Tutti i messaggi"
"Solo menzioni e parole chiave"
"In questa stanza, avvisami per"
+ "Amministratori"
+ "Cambia il mio ruolo"
+ "Declassa a membro"
+ "Declassa a moderatore"
+ "Moderazione dei membri"
+ "Messaggi e contenuti"
+ "Moderatori"
+ "Autorizzazioni"
+ "Reimpostare le autorizzazioni"
+ "Una volta reimpostate le autorizzazioni, perderai le impostazioni correnti."
+ "Reimpostare autorizzazioni?"
+ "Ruoli"
+ "Dettagli della stanza"
+ "Ruoli e autorizzazioni"
"Si è verificato un errore durante il tentativo di avviare una chat"
diff --git a/features/roomdetails/impl/src/main/res/values-uk/translations.xml b/features/roomdetails/impl/src/main/res/values-uk/translations.xml
index 3c2f354abb..b42e1a5e63 100644
--- a/features/roomdetails/impl/src/main/res/values-uk/translations.xml
+++ b/features/roomdetails/impl/src/main/res/values-uk/translations.xml
@@ -30,6 +30,8 @@
"Ви не зможете скасувати цю зміну, оскільки ви знижуєте себе, якщо ви останній привілейований користувач у кімнаті, відновити привілеї буде неможливо."
"Понизити себе?"
"Керувати модераторами"
+ "У вас є не збережені зміни."
+ "Зберегти зміни?"
"Додати тему"
"Уже учасник"
"Уже запрошені"
@@ -56,20 +58,22 @@
"Заблокувати"
"Він не зможе приєднатися до цієї кімнати знову, якщо його запросять."
"Ви точно хочете заблокувати цього користувача?"
+ "У цій кімнаті немає заблокованих користувачів."
"Блокування %1$s"
- "%1$d особа"
- "%1$d особи"
- "%1$d осіб"
- "Вилучити учасника"
+ "Вилучити й заблокувати учасника"
+ "Вилучити з кімнати"
"Видалити та заблокувати учасника"
"Лише видалити учасника"
"Видалити учасника та заборонити приєднання в майбутньому?"
"Розблокувати"
"Вони зможуть знову приєднатися до цієї кімнати, якщо їх запросять."
"Розблокувати користувача"
- "Переглянути інформацію про користувача"
+ "Переглянути профіль"
"Заблоковані"
"Учасники"
"На розгляді"
@@ -93,11 +97,16 @@
"Тільки згадки та ключові слова"
"У цій кімнаті повідомляти мене про"
"Адміністратори"
+ "Змінити мою роль"
+ "Понизити до учасника"
+ "Понизити до модератора"
"Модерація учасників"
"Повідомлення та зміст"
"Модератори"
"Дозволи"
"Скинути дозволи"
+ "Після скидання дозволів ви втратите поточні налаштування."
+ "Скинути дозволи?"
"Ролі"
"Деталі кімнати"
"Ролі та дозволи"
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionPresenterTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionPresenterTests.kt
index 0221a6851a..0c81a549b9 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionPresenterTests.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionPresenterTests.kt
@@ -118,6 +118,36 @@ class RolesAndPermissionPresenterTests {
}
}
+ @Test
+ fun `present - ResetPermissions needs confirmation, then resets permissions`() = runTest {
+ val presenter = createRolesAndPermissionsPresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val initialState = awaitItem()
+ initialState.eventSink(RolesAndPermissionsEvents.ResetPermissions)
+ // Confirmation
+ awaitItem().eventSink(RolesAndPermissionsEvents.ResetPermissions)
+
+ assertThat(awaitItem().resetPermissionsAction).isEqualTo(AsyncAction.Loading)
+ assertThat(awaitItem().resetPermissionsAction).isEqualTo(AsyncAction.Success(Unit))
+ }
+ }
+
+ @Test
+ fun `present - ResetPermissions confirmation can be cancelled`() = runTest {
+ val presenter = createRolesAndPermissionsPresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val initialState = awaitItem()
+ initialState.eventSink(RolesAndPermissionsEvents.ResetPermissions)
+ awaitItem().eventSink(RolesAndPermissionsEvents.CancelPendingAction)
+
+ assertThat(awaitItem().resetPermissionsAction).isEqualTo(AsyncAction.Uninitialized)
+ }
+ }
+
private fun TestScope.createRolesAndPermissionsPresenter(
room: FakeMatrixRoom = FakeMatrixRoom(),
dispatchers: CoroutineDispatchers = testCoroutineDispatchers(),
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionsViewTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionsViewTests.kt
index 6eb596ce83..be6411b373 100644
--- a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionsViewTests.kt
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/RolesAndPermissionsViewTests.kt
@@ -21,19 +21,26 @@ import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.features.roomdetails.impl.R
+import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsEvents
+import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsNavigator
import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsState
import io.element.android.features.roomdetails.impl.rolesandpermissions.RolesAndPermissionsView
-import io.element.android.features.roomdetails.impl.rolesandpermissions.RoomDetailsAdminSettingsNavigator
import io.element.android.features.roomdetails.impl.rolesandpermissions.aRolesAndPermissionsState
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.room.RoomMember
+import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled
import io.element.android.tests.testutils.EventsRecorder
import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.ensureCalledOnce
+import io.element.android.tests.testutils.ensureCalledTimes
import io.element.android.tests.testutils.pressBack
+import kotlinx.coroutines.test.runTest
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
@RunWith(AndroidJUnit4::class)
class RolesAndPermissionsViewTests {
@@ -68,6 +75,100 @@ class RolesAndPermissionsViewTests {
rule.clickOn(R.string.screen_room_roles_and_permissions_moderators)
}
}
+
+ @Test
+ @Config(qualifiers = "h640dp")
+ fun `tapping on any of the permission items open the change permissions screen`() {
+ ensureCalledTimes(3) { callback ->
+ rule.setRolesAndPermissionsView(
+ openPermissionScreens = callback,
+ )
+ rule.clickOn(R.string.screen_room_roles_and_permissions_room_details)
+ rule.clickOn(R.string.screen_room_roles_and_permissions_messages_and_content)
+ rule.clickOn(R.string.screen_room_roles_and_permissions_member_moderation)
+ }
+ }
+
+ @Test
+ @Config(qualifiers = "h640dp")
+ fun `tapping on reset permissions triggers ResetPermissions event`() {
+ val recorder = EventsRecorder()
+ rule.setRolesAndPermissionsView(
+ state = aRolesAndPermissionsState(
+ eventSink = recorder,
+ ),
+ )
+ rule.clickOn(R.string.screen_room_roles_and_permissions_reset)
+ recorder.assertSingle(RolesAndPermissionsEvents.ResetPermissions)
+ }
+
+ @Test
+ fun `tapping on Reset in the reset permissions confirmation dialog triggers ResetPermissions event`() {
+ val recorder = EventsRecorder()
+ rule.setRolesAndPermissionsView(
+ state = aRolesAndPermissionsState(
+ resetPermissionsAction = AsyncAction.Confirming,
+ eventSink = recorder,
+ ),
+ )
+ rule.clickOn(CommonStrings.action_reset)
+ recorder.assertSingle(RolesAndPermissionsEvents.ResetPermissions)
+ }
+
+ @Test
+ fun `tapping on Cancel in the reset permissions confirmation dialog triggers CancelPendingAction event`() {
+ val recorder = EventsRecorder()
+ rule.setRolesAndPermissionsView(
+ state = aRolesAndPermissionsState(
+ resetPermissionsAction = AsyncAction.Confirming,
+ eventSink = recorder,
+ ),
+ )
+ rule.clickOn(CommonStrings.action_cancel)
+ recorder.assertSingle(RolesAndPermissionsEvents.CancelPendingAction)
+ }
+
+ @Test
+ fun `tapping on 'Demote to moderator' in the demote self bottom sheet triggers the right event`() {
+ val recorder = EventsRecorder()
+ rule.setRolesAndPermissionsView(
+ state = aRolesAndPermissionsState(
+ changeOwnRoleAction = AsyncAction.Confirming,
+ eventSink = recorder,
+ ),
+ )
+ rule.clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_moderator)
+ rule.mainClock.advanceTimeBy(1_000L)
+ recorder.assertSingle(RolesAndPermissionsEvents.DemoteSelfTo(RoomMember.Role.MODERATOR))
+ }
+
+ @Test
+ fun `tapping on 'Demote to member' in the demote self bottom sheet triggers the right event`() = runTest {
+ val recorder = EventsRecorder()
+ rule.setRolesAndPermissionsView(
+ state = aRolesAndPermissionsState(
+ changeOwnRoleAction = AsyncAction.Confirming,
+ eventSink = recorder,
+ ),
+ )
+ rule.clickOn(R.string.screen_room_roles_and_permissions_change_role_demote_to_member)
+ rule.mainClock.advanceTimeBy(1_000L)
+ recorder.assertSingle(RolesAndPermissionsEvents.DemoteSelfTo(RoomMember.Role.USER))
+ }
+
+ @Test
+ fun `tapping on 'Cancel' in the demote self bottom sheet triggers the right event`() {
+ val recorder = EventsRecorder()
+ rule.setRolesAndPermissionsView(
+ state = aRolesAndPermissionsState(
+ changeOwnRoleAction = AsyncAction.Confirming,
+ eventSink = recorder,
+ ),
+ )
+ rule.clickOn(CommonStrings.action_cancel)
+ rule.mainClock.advanceTimeBy(1_000L)
+ recorder.assertSingle(RolesAndPermissionsEvents.CancelPendingAction)
+ }
}
private fun AndroidComposeTestRule.setRolesAndPermissionsView(
@@ -77,14 +178,18 @@ private fun AndroidComposeTestRule.setRoles
goBack: () -> Unit = EnsureNeverCalled(),
openAdminList: () -> Unit = EnsureNeverCalled(),
openModeratorList: () -> Unit = EnsureNeverCalled(),
+ openPermissionScreens: () -> Unit = EnsureNeverCalled(),
) {
setContent {
RolesAndPermissionsView(
state = state,
- roomDetailsAdminSettingsNavigator = object : RoomDetailsAdminSettingsNavigator {
+ rolesAndPermissionsNavigator = object : RolesAndPermissionsNavigator {
override fun onBackPressed() = goBack()
override fun openAdminList() = openAdminList()
override fun openModeratorList() = openModeratorList()
+ override fun openEditRoomDetailsPermissions() = openPermissionScreens()
+ override fun openModerationPermissions() = openPermissionScreens()
+ override fun openMessagesAndContentPermissions() = openPermissionScreens()
}
)
}
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/permissions/ChangeRoomPermissionsPresenterTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/permissions/ChangeRoomPermissionsPresenterTests.kt
new file mode 100644
index 0000000000..513438b710
--- /dev/null
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/permissions/ChangeRoomPermissionsPresenterTests.kt
@@ -0,0 +1,294 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.rolesandpermissions.permissions
+
+import app.cash.molecule.RecompositionMode
+import app.cash.molecule.moleculeFlow
+import app.cash.turbine.Event
+import app.cash.turbine.TurbineTestContext
+import app.cash.turbine.test
+import com.google.common.truth.Truth.assertThat
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsEvent
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsPresenter
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsSection
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsState
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.RoomPermissionType
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.room.RoomMember.Role.ADMIN
+import io.element.android.libraries.matrix.api.room.RoomMember.Role.MODERATOR
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
+import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
+import io.element.android.libraries.matrix.test.room.defaultRoomPowerLevels
+import kotlinx.coroutines.test.runTest
+import org.junit.Test
+
+class ChangeRoomPermissionsPresenterTests {
+ @Test
+ fun `present - initial state`() = runTest {
+ val section = ChangeRoomPermissionsSection.RoomDetails
+ val presenter = createChangeRoomPermissionsPresenter(section = section)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ // Initial state, no permissions loaded
+ awaitItem().run {
+ assertThat(this.section).isEqualTo(section)
+ assertThat(this.currentPermissions).isNull()
+ assertThat(this.items).isNotEmpty()
+ assertThat(this.hasChanges).isFalse()
+ assertThat(this.saveAction).isEqualTo(AsyncAction.Uninitialized)
+ assertThat(this.confirmExitAction).isEqualTo(AsyncAction.Uninitialized)
+ }
+
+ // Updated state, permissions loaded
+ assertThat(awaitItem().currentPermissions).isEqualTo(defaultPermissions())
+ }
+ }
+
+ @Test
+ fun `present - RoomDetails section contains the right items`() = runTest {
+ val section = ChangeRoomPermissionsSection.RoomDetails
+ val presenter = createChangeRoomPermissionsPresenter(section = section)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ assertThat(awaitUpdatedItem().items).containsExactly(
+ RoomPermissionType.ROOM_NAME,
+ RoomPermissionType.ROOM_AVATAR,
+ RoomPermissionType.ROOM_TOPIC,
+ )
+ }
+ }
+
+ @Test
+ fun `present - MessagesAndContent section contains the right items`() = runTest {
+ val section = ChangeRoomPermissionsSection.MessagesAndContent
+ val presenter = createChangeRoomPermissionsPresenter(section = section)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ assertThat(awaitUpdatedItem().items).containsExactly(
+ RoomPermissionType.SEND_EVENTS,
+ RoomPermissionType.REDACT_EVENTS,
+ )
+ }
+ }
+
+ @Test
+ fun `present - MembershipModeration section contains the right items`() = runTest {
+ val section = ChangeRoomPermissionsSection.MembershipModeration
+ val presenter = createChangeRoomPermissionsPresenter(section = section)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ assertThat(awaitUpdatedItem().items).containsExactly(
+ RoomPermissionType.INVITE,
+ RoomPermissionType.KICK,
+ RoomPermissionType.BAN,
+ )
+ }
+ }
+
+ @Test
+ fun `present - ChangeMinimumRoleForAction updates the current permissions and hasChanges`() = runTest {
+ val presenter = createChangeRoomPermissionsPresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val state = awaitUpdatedItem()
+ assertThat(state.currentPermissions?.roomName).isEqualTo(ADMIN.powerLevel)
+ assertThat(state.hasChanges).isFalse()
+
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
+
+ awaitItem().run {
+ assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
+ assertThat(hasChanges).isTrue()
+ }
+ }
+ }
+
+ @Test
+ fun `present - ChangeMinimumRoleForAction works for all actions`() = runTest {
+ val presenter = createChangeRoomPermissionsPresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val state = awaitUpdatedItem()
+
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.INVITE, MODERATOR))
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.KICK, MODERATOR))
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.BAN, MODERATOR))
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.SEND_EVENTS, MODERATOR))
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.REDACT_EVENTS, MODERATOR))
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_AVATAR, MODERATOR))
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_TOPIC, MODERATOR))
+
+ val items = cancelAndConsumeRemainingEvents()
+
+ (items.last() as? Event.Item)?.value?.run {
+ assertThat(currentPermissions).isEqualTo(
+ MatrixRoomPowerLevels(
+ invite = MODERATOR.powerLevel,
+ kick = MODERATOR.powerLevel,
+ ban = MODERATOR.powerLevel,
+ redactEvents = MODERATOR.powerLevel,
+ sendEvents = MODERATOR.powerLevel,
+ roomName = MODERATOR.powerLevel,
+ roomAvatar = MODERATOR.powerLevel,
+ roomTopic = MODERATOR.powerLevel,
+ )
+ )
+ }
+ }
+ }
+
+ @Test
+ fun `present - Save updates the current permissions and resets hasChanges`() = runTest {
+ val presenter = createChangeRoomPermissionsPresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val state = awaitUpdatedItem()
+ assertThat(state.currentPermissions?.roomName).isEqualTo(ADMIN.powerLevel)
+ assertThat(state.hasChanges).isFalse()
+
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
+ assertThat(awaitItem().hasChanges).isTrue()
+
+ state.eventSink(ChangeRoomPermissionsEvent.Save)
+
+ assertThat(awaitItem().saveAction).isEqualTo(AsyncAction.Loading)
+ assertThat(awaitItem().hasChanges).isFalse()
+ awaitItem().run {
+ assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
+ assertThat(saveAction).isEqualTo(AsyncAction.Success(Unit))
+ }
+ }
+ }
+
+ @Test
+ fun `present - Save will fail if there are not current permissions`() = runTest {
+ val room = FakeMatrixRoom().apply {
+ givenPowerLevelsResult(Result.failure(IllegalStateException("Failed to load power levels")))
+ }
+ val presenter = createChangeRoomPermissionsPresenter(room = room)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val state = awaitItem()
+ assertThat(state.currentPermissions).isNull()
+
+ state.eventSink(ChangeRoomPermissionsEvent.Save)
+ assertThat(awaitItem().saveAction).isInstanceOf(AsyncAction.Failure::class.java)
+ }
+ }
+
+ @Test
+ fun `present - Save can handle failures and they can be cleared`() = runTest {
+ val room = FakeMatrixRoom().apply {
+ givenUpdatePowerLevelsResult(Result.failure(IllegalStateException("Failed to update power levels")))
+ }
+ val presenter = createChangeRoomPermissionsPresenter(room = room)
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val state = awaitUpdatedItem()
+ assertThat(state.currentPermissions?.roomName).isEqualTo(ADMIN.powerLevel)
+ assertThat(state.hasChanges).isFalse()
+
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
+ assertThat(awaitItem().hasChanges).isTrue()
+
+ state.eventSink(ChangeRoomPermissionsEvent.Save)
+
+ assertThat(awaitItem().saveAction).isEqualTo(AsyncAction.Loading)
+ awaitItem().run {
+ assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
+ // Couldn't save the changes, so they're still pending
+ assertThat(hasChanges).isTrue()
+ assertThat(saveAction).isInstanceOf(AsyncAction.Failure::class.java)
+ }
+
+ state.eventSink(ChangeRoomPermissionsEvent.ResetPendingActions)
+ awaitItem().run {
+ assertThat(currentPermissions?.roomName).isEqualTo(MODERATOR.powerLevel)
+ assertThat(saveAction).isEqualTo(AsyncAction.Uninitialized)
+ assertThat(hasChanges).isTrue()
+ }
+ }
+ }
+
+ @Test
+ fun `present - Exit does not need a confirmation when there are no pending changes`() = runTest {
+ val presenter = createChangeRoomPermissionsPresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val state = awaitUpdatedItem()
+ state.eventSink(ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, MODERATOR))
+ assertThat(awaitItem().hasChanges).isTrue()
+
+ state.eventSink(ChangeRoomPermissionsEvent.Exit)
+ assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Confirming)
+
+ state.eventSink(ChangeRoomPermissionsEvent.Exit)
+ assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit))
+ }
+ }
+
+ @Test
+ fun `present - Exit needs confirmation when there are pending changes`() = runTest {
+ val presenter = createChangeRoomPermissionsPresenter()
+ moleculeFlow(RecompositionMode.Immediate) {
+ presenter.present()
+ }.test {
+ val state = awaitUpdatedItem()
+
+ state.eventSink(ChangeRoomPermissionsEvent.Exit)
+
+ assertThat(awaitItem().confirmExitAction).isEqualTo(AsyncAction.Success(Unit))
+ }
+ }
+
+ private fun createChangeRoomPermissionsPresenter(
+ section: ChangeRoomPermissionsSection = ChangeRoomPermissionsSection.RoomDetails,
+ room: FakeMatrixRoom = FakeMatrixRoom(),
+ ) = ChangeRoomPermissionsPresenter(
+ section = section,
+ room = room,
+ )
+
+ private fun defaultPermissions() = defaultRoomPowerLevels().run {
+ MatrixRoomPowerLevels(
+ invite = invite,
+ kick = kick,
+ ban = ban,
+ redactEvents = redactEvents,
+ sendEvents = sendEvents,
+ roomName = roomName,
+ roomAvatar = roomAvatar,
+ roomTopic = roomTopic,
+ )
+ }
+
+ private suspend fun TurbineTestContext.awaitUpdatedItem(): ChangeRoomPermissionsState {
+ skipItems(1)
+ return awaitItem()
+ }
+}
diff --git a/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/permissions/ChangeRoomPermissionsViewTests.kt b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/permissions/ChangeRoomPermissionsViewTests.kt
new file mode 100644
index 0000000000..942b40ff7a
--- /dev/null
+++ b/features/roomdetails/impl/src/test/kotlin/io/element/android/features/roomdetails/rolesandpermissions/permissions/ChangeRoomPermissionsViewTests.kt
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.features.roomdetails.rolesandpermissions.permissions
+
+import androidx.activity.ComponentActivity
+import androidx.compose.ui.test.junit4.AndroidComposeTestRule
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onAllNodesWithText
+import androidx.compose.ui.test.onFirst
+import androidx.compose.ui.test.performClick
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import io.element.android.features.roomdetails.impl.R
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsEvent
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsSection
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsState
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.ChangeRoomPermissionsView
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.RoomPermissionType
+import io.element.android.features.roomdetails.impl.rolesandpermissions.permissions.aChangeRoomPermissionsState
+import io.element.android.libraries.architecture.AsyncAction
+import io.element.android.libraries.matrix.api.room.RoomMember
+import io.element.android.libraries.ui.strings.CommonStrings
+import io.element.android.tests.testutils.EnsureNeverCalled
+import io.element.android.tests.testutils.EventsRecorder
+import io.element.android.tests.testutils.clickOn
+import io.element.android.tests.testutils.clickOnFirst
+import io.element.android.tests.testutils.ensureCalledOnce
+import io.element.android.tests.testutils.pressBack
+import io.element.android.tests.testutils.pressBackKey
+import org.junit.Rule
+import org.junit.Test
+import org.junit.rules.TestRule
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class ChangeRoomPermissionsViewTests {
+ @get:Rule val rule = createAndroidComposeRule()
+
+ @Test
+ fun `click on back icon invokes Exit`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ eventsRecorder = recorder,
+ )
+ rule.pressBack()
+ recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
+ }
+
+ @Test
+ fun `click on back key invokes Exit`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ eventsRecorder = recorder,
+ )
+ rule.pressBackKey()
+ recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
+ }
+
+ @Test
+ fun `when confirming exit with pending changes, using the back key actually exits`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ state = aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ hasChanges = true,
+ eventSink = recorder,
+ ),
+ eventsRecorder = recorder,
+ )
+ rule.pressBackKey()
+ recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
+ }
+
+ @Test
+ fun `when confirming exit with pending changes, clicking on 'discard' button in the dialog actually exits`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ state = aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ hasChanges = true,
+ confirmExitAction = AsyncAction.Confirming,
+ eventSink = recorder,
+ ),
+ eventsRecorder = recorder,
+ )
+ rule.clickOn(CommonStrings.action_discard)
+ recorder.assertSingle(ChangeRoomPermissionsEvent.Exit)
+ }
+
+ @Test
+ fun `when confirming exit with pending changes, clicking on 'save' button in the dialog saves the changes`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ state = aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ hasChanges = true,
+ confirmExitAction = AsyncAction.Confirming,
+ eventSink = recorder,
+ ),
+ eventsRecorder = recorder,
+ )
+ rule.clickOnFirst(CommonStrings.action_save)
+ recorder.assertSingle(ChangeRoomPermissionsEvent.Save)
+ }
+
+ @Test
+ fun `click on a role item triggers ChangeRole event`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ eventsRecorder = recorder,
+ )
+ val admins = rule.activity.getText(R.string.screen_room_change_permissions_administrators).toString()
+ val moderators = rule.activity.getText(R.string.screen_room_change_permissions_moderators).toString()
+ val users = rule.activity.getText(R.string.screen_room_change_permissions_everyone).toString()
+ rule.onAllNodesWithText(admins).onFirst().performClick()
+ rule.onAllNodesWithText(moderators).onFirst().performClick()
+ rule.onAllNodesWithText(users).onFirst().performClick()
+ recorder.assertList(
+ listOf(
+ ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, RoomMember.Role.ADMIN),
+ ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, RoomMember.Role.MODERATOR),
+ ChangeRoomPermissionsEvent.ChangeMinimumRoleForAction(RoomPermissionType.ROOM_NAME, RoomMember.Role.USER),
+ )
+ )
+ }
+
+ @Test
+ fun `click on the Save menu item triggers Save event`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ state = aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ hasChanges = true,
+ eventSink = recorder,
+ ),
+ eventsRecorder = recorder,
+ )
+ rule.clickOn(CommonStrings.action_save)
+ recorder.assertSingle(ChangeRoomPermissionsEvent.Save)
+ }
+
+ @Test
+ fun `a successful save exits the screen`() {
+ ensureCalledOnce { callback ->
+ rule.setChangeRoomPermissionsRule(
+ state = aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ hasChanges = true,
+ saveAction = AsyncAction.Success(Unit),
+ ),
+ onBackPressed = callback
+ )
+ rule.clickOn(CommonStrings.action_save)
+ }
+ }
+
+ @Test
+ fun `click on the Ok option in save error dialog triggers ResetPendingAction event`() {
+ val recorder = EventsRecorder()
+ rule.setChangeRoomPermissionsRule(
+ state = aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ hasChanges = true,
+ saveAction = AsyncAction.Failure(IllegalStateException("Failed to set room power levels")),
+ eventSink = recorder,
+ ),
+ eventsRecorder = recorder,
+ )
+ rule.clickOn(CommonStrings.action_ok)
+ recorder.assertSingle(ChangeRoomPermissionsEvent.ResetPendingActions)
+ }
+}
+
+private fun AndroidComposeTestRule.setChangeRoomPermissionsRule(
+ eventsRecorder: EventsRecorder = EventsRecorder(expectEvents = false),
+ state: ChangeRoomPermissionsState = aChangeRoomPermissionsState(
+ section = ChangeRoomPermissionsSection.RoomDetails,
+ eventSink = eventsRecorder,
+ ),
+ onBackPressed: () -> Unit = EnsureNeverCalled(),
+) {
+ setContent {
+ ChangeRoomPermissionsView(
+ state = state,
+ onBackPressed = onBackPressed,
+ )
+ }
+}
diff --git a/features/roomlist/impl/src/main/res/values-be/translations.xml b/features/roomlist/impl/src/main/res/values-be/translations.xml
index 04f843c9f6..62583b32bc 100644
--- a/features/roomlist/impl/src/main/res/values-be/translations.xml
+++ b/features/roomlist/impl/src/main/res/values-be/translations.xml
@@ -7,8 +7,14 @@
"Стварыце новую размову або пакой"
"Пачніце з паведамлення каму-небудзь."
"Пакуль няма чатаў."
+ "Абранае"
+ "Нізкі прыярытэт"
"Людзі"
+ "Пакоі"
+ "Непрачытаныя"
"Усе чаты"
+ "Пазначыць як прачытанае"
+ "Пазначыць як непрачытанае"
"Здаецца, вы карыстаецеся новай прыладай. Праверце з дапамогай іншай прылады, каб атрымаць доступ да зашыфраваных паведамленняў."
"Пацвердзіце, што гэта вы"
diff --git a/features/roomlist/impl/src/main/res/values-de/translations.xml b/features/roomlist/impl/src/main/res/values-de/translations.xml
index fa01c4f7d1..267394e611 100644
--- a/features/roomlist/impl/src/main/res/values-de/translations.xml
+++ b/features/roomlist/impl/src/main/res/values-de/translations.xml
@@ -8,10 +8,19 @@
"Beginne, indem du jemandem eine Nachricht sendest."
"Noch keine Chats."
"Favoriten"
+ "In den Chat-Einstellungen kannst du einen Chat als Favorit hinzufügen.
+Um deine anderen Chats zu sehen wähle diesen Filter ab."
+ "Du hast noch keine Chats als Favorit markiert."
"Niedrige Priorität"
+ "Wähle Filter ab, um Deine Chats zu sehen."
+ "Du hast keine Chats für diese Auswahl"
"Personen"
+ "Du hast noch keine Direktnachrichten"
"Räume"
+ "Du bist noch in keinem Raum."
"Ungelesen"
+ "Glückwunsch!
+Du hast keine ungelesenen Nachrichten!"
"Chats"
"Als gelesen markieren"
"Als ungelesen markieren"
diff --git a/features/roomlist/impl/src/main/res/values-fr/translations.xml b/features/roomlist/impl/src/main/res/values-fr/translations.xml
index e6631bb720..2864c990c9 100644
--- a/features/roomlist/impl/src/main/res/values-fr/translations.xml
+++ b/features/roomlist/impl/src/main/res/values-fr/translations.xml
@@ -8,10 +8,19 @@
"Commencez par envoyer un message à quelqu’un."
"Aucune discussion pour le moment."
"Favoris"
+ "Vous pouvez ajouter une discussion aux favoris depuis les paramètres de la discussion.
+En attendant, vous pouvez désélectionner des filtres pour voir vos autres salons."
+ "Vous n’avez pas encore de discussions favorites"
"Priorité basse"
+ "Veuillez désélectionner des filtres pour voir vos discussions"
+ "Vous n’avez pas de discussions pour cette sélection"
"Personnes"
+ "Vous n’avez pas encore de discussions"
"Salons"
+ "Vous n’êtes membre d’aucun salon"
"Non-lus"
+ "Félicitations!
+Vous n’avez plus de messages non-lus!"
"Conversations"
"Marquer comme lu"
"Marquer comme non lu"
diff --git a/features/roomlist/impl/src/main/res/values-it/translations.xml b/features/roomlist/impl/src/main/res/values-it/translations.xml
index dad8ef7c8e..cd1261f3b3 100644
--- a/features/roomlist/impl/src/main/res/values-it/translations.xml
+++ b/features/roomlist/impl/src/main/res/values-it/translations.xml
@@ -1,17 +1,26 @@
"Il backup della chat non è attualmente sincronizzato. Devi confermare la chiave di recupero per mantenere l\'accesso al backup della chat."
- "Conferma la chiave di recupero"
+ "Inserisci la chiave di recupero"
"Si tratta di una procedura che si effettua una sola volta, grazie per l\'attesa."
"Configurazione del tuo account."
"Crea una nuova conversazione o stanza"
"Inizia inviando un messaggio a qualcuno."
- "Ancora nessuna chat."
+ "Ancora nessuna conversazione."
"Preferiti"
+ "Puoi aggiungere una conversazione ai tuoi preferiti nelle impostazioni della stessa.
+Per il momento, puoi deselezionare i filtri per vedere le altre conversazioni."
+ "Non hai ancora conversazioni preferite"
"Bassa priorità"
+ "Puoi deselezionare i filtri per vedere le altre conversazioni."
+ "Non hai conversazioni per questa selezione"
"Persone"
+ "Non hai ancora nessuna conversazione diretta"
"Stanze"
+ "Non sei ancora in nessuna stanza"
"Non letti"
+ "Congratulazioni!
+Non hai messaggi non letti!"
"Tutte le conversazioni"
"Segna come letto"
"Segna come non letto"
diff --git a/features/securebackup/impl/src/main/res/values-it/translations.xml b/features/securebackup/impl/src/main/res/values-it/translations.xml
index 2670c5b052..60211a4347 100644
--- a/features/securebackup/impl/src/main/res/values-it/translations.xml
+++ b/features/securebackup/impl/src/main/res/values-it/translations.xml
@@ -6,7 +6,7 @@
"Backup"
"Cambia la chiave di recupero"
"Conferma la chiave di recupero"
- "Il backup della chat attualmente non è sincronizzato."
+ "Il backup delle conversazioni non è attualmente sincronizzato."
"Configura il recupero"
"Ottieni l\'accesso ai tuoi messaggi cifrati se perdi tutti i tuoi dispositivi o se sei disconnesso da %1$s ovunque."
"Disattiva"
diff --git a/features/signedout/impl/src/main/res/values-it/translations.xml b/features/signedout/impl/src/main/res/values-it/translations.xml
index c9da145562..fa6ade1b36 100644
--- a/features/signedout/impl/src/main/res/values-it/translations.xml
+++ b/features/signedout/impl/src/main/res/values-it/translations.xml
@@ -1,7 +1,7 @@
"Hai cambiato la password in un\'altra sessione"
- "Hai eliminato la sessione da un\'altra sessione"
+ "Hai eliminato la sessione da un\'altra"
"L\'amministratore del tuo server ha invalidato il tuo accesso"
"Potresti essere stato disconnesso per uno dei motivi elencati di seguito. Accedi di nuovo per continuare a usare %s."
"Sei disconnesso"
diff --git a/features/verifysession/impl/src/main/res/values-be/translations.xml b/features/verifysession/impl/src/main/res/values-be/translations.xml
index 5605dbc962..57786fec8d 100644
--- a/features/verifysession/impl/src/main/res/values-be/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-be/translations.xml
@@ -6,6 +6,7 @@
"Пераканайцеся, што прыведзеныя ніжэй лічбы супадаюць з лічбамі, паказанымі ў іншым сеансе."
"Параўнайце лічбы"
"Ваш новы сеанс пацверджаны. Ён мае доступ да вашых зашыфраваных паведамленняў, і іншыя карыстальнікі будуць лічыць яго давераным."
+ "Увядзіце ключ аднаўлення"
"Дакажыце, што гэта вы, каб атрымаць доступ да вашай зашыфраванай гісторыі паведамленняў."
"Адкрыйце існуючы сеанс"
"Паўтарыце праверку"
diff --git a/features/verifysession/impl/src/main/res/values-it/translations.xml b/features/verifysession/impl/src/main/res/values-it/translations.xml
index 0f4f86adf4..6fb227308e 100644
--- a/features/verifysession/impl/src/main/res/values-it/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-it/translations.xml
@@ -6,6 +6,7 @@
"Conferma che i numeri seguenti corrispondano a quelli mostrati nell\'altra sessione."
"Confronta i numeri"
"La tua nuova sessione è ora verificata. Ha accesso ai tuoi messaggi crittografati e gli altri utenti la vedranno come attendibile."
+ "Inserisci la chiave di recupero"
"Dimostra la tua identità per accedere alla cronologia dei messaggi crittografati."
"Apri una sessione esistente"
"Riprova la verifica"
diff --git a/features/verifysession/impl/src/main/res/values-uk/translations.xml b/features/verifysession/impl/src/main/res/values-uk/translations.xml
index a24d277398..beed211c15 100644
--- a/features/verifysession/impl/src/main/res/values-uk/translations.xml
+++ b/features/verifysession/impl/src/main/res/values-uk/translations.xml
@@ -8,7 +8,7 @@
"Ваш новий сеанс підтверджено. Він матиме доступ до ваших зашифрованих повідомлень, й інші користувачі вважатимуть його надійним."
"Введіть ключ відновлення"
"Доведіть, що це Ви, щоб отримати доступ до історії зашифрованих повідомлень."
- "Відкрити існуючий сеанс"
+ "Відкрийте існуючий сеанс"
"Повторити перевірку"
"Я готовий"
"Очікування збігу"
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index aab05b6241..d844a58a5c 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -153,7 +153,7 @@ jsoup = "org.jsoup:jsoup:1.17.2"
appyx_core = { module = "com.bumble.appyx:core", version.ref = "appyx" }
molecule-runtime = "app.cash.molecule:molecule-runtime:1.4.1"
timber = "com.jakewharton.timber:timber:5.0.1"
-matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.7"
+matrix_sdk = "org.matrix.rustcomponents:sdk-android:0.2.8"
matrix_richtexteditor = { module = "io.element.android:wysiwyg", version.ref = "wysiwyg" }
matrix_richtexteditor_compose = { module = "io.element.android:wysiwyg-compose", version.ref = "wysiwyg" }
sqldelight-driver-android = { module = "app.cash.sqldelight:android-driver", version.ref = "sqldelight" }
diff --git a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt
index 857bc0b89e..2e86648f7b 100644
--- a/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt
+++ b/libraries/eventformatter/impl/src/main/kotlin/io/element/android/libraries/eventformatter/impl/StateContentFormatter.kt
@@ -170,7 +170,7 @@ class StateContentFormatter @Inject constructor(
"RoomPinnedEvents"
}
}
- is OtherState.RoomPowerLevels -> when (renderingMode) {
+ is OtherState.RoomUserPowerLevels -> when (renderingMode) {
RenderingMode.RoomList -> {
Timber.v("Filtering timeline item for room state change: $content")
null
diff --git a/libraries/eventformatter/impl/src/main/res/values-be/translations.xml b/libraries/eventformatter/impl/src/main/res/values-be/translations.xml
index d46abb9041..641bb3e78a 100644
--- a/libraries/eventformatter/impl/src/main/res/values-be/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-be/translations.xml
@@ -39,6 +39,8 @@
"Вы змянілі назву пакоя на: %1$s"
"%1$s выдаліў(-ла) назву пакоя"
"Вы выдалілі назву пакоя"
+ "%1$s не зрабіў ніякіх змен"
+ "Вы не зрабілі ніякіх змен"
"%1$s адхіліў запрашэнне"
"Вы адхілілі запрашэнне"
"%1$s выдаліў %2$s"
diff --git a/libraries/eventformatter/impl/src/main/res/values-de/translations.xml b/libraries/eventformatter/impl/src/main/res/values-de/translations.xml
index 3444cdaef0..ad6e614195 100644
--- a/libraries/eventformatter/impl/src/main/res/values-de/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-de/translations.xml
@@ -3,12 +3,16 @@
"(Avatar wurde auch geändert)"
"%1$s hat den Avatar geändert"
"Du hast deinen Avatar geändert"
+ "%1$s wurde zum Mitglied herabgestuft"
+ "%1$s wurde zum Moderator herabgestuft"
"%1$s hat den Anzeigenamen von %2$s auf %3$s geändert"
"Du hast deinen Anzeigenamen von %1$s auf %2$s geändert"
"%1$s hat den Anzeigenamen entfernt (war %2$s)"
"Du hast deinen Anzeigenamen entfernt (war %1$s)"
"%1$s hat den Anzeigenamen auf %2$s geändert"
"Du hast deinen Anzeigenamen zu %1$s geändert"
+ "%1$s ist jetzt Administrator*in"
+ "%1$s ist jetzt Moderator*in"
"%1$s hat den Raum-Avatar geändert"
"Du hast den Raum-Avatar geändert"
"%1$s hat den Raum-Avatar entfernt"
diff --git a/libraries/eventformatter/impl/src/main/res/values-fr/translations.xml b/libraries/eventformatter/impl/src/main/res/values-fr/translations.xml
index be8f466aa3..7a5fd1a2bd 100644
--- a/libraries/eventformatter/impl/src/main/res/values-fr/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-fr/translations.xml
@@ -3,12 +3,16 @@
"(l’avatar a aussi été modifié)"
"%1$s a changé son avatar"
"Vous avez changé d’avatar"
+ "%1$s a été rétrogradé vers simple utilisateur"
+ "%1$s a été rétrogradé vers modérateur"
"%1$s a changé son pseudonyme de %2$s à %3$s"
"Vous avez changé votre pseudonyme de %1$s à %2$s"
"%1$s a supprimé son pseudonyme (c’était %2$s)"
"Vous avez supprimé votre pseudonyme (c’était %1$s)"
"%1$s a défini son pseudonyme en tant que %2$s"
"Vous avez défini votre pseudonyme comme %1$s"
+ "%1$s a été promu administrateur"
+ "%1$s a été promu modérateur"
"%1$s a changé l’avatar du salon"
"Vous avez changé l’avatar du salon"
"%1$s a supprimé l’avatar du salon"
diff --git a/libraries/eventformatter/impl/src/main/res/values-it/translations.xml b/libraries/eventformatter/impl/src/main/res/values-it/translations.xml
index 85a55d51a4..f5250ab40e 100644
--- a/libraries/eventformatter/impl/src/main/res/values-it/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-it/translations.xml
@@ -3,18 +3,22 @@
"(anche l\'avatar è stato cambiato)"
"%1$s ha cambiato il proprio avatar"
"Hai cambiato il tuo avatar"
+ "%1$s è stato declassato a membro"
+ "%1$s è stato declassato a moderatore"
"%1$s ha cambiato il proprio nome visualizzato da %2$s a %3$s"
"Hai cambiato il tuo nome visualizzato da %1$s a %2$s"
"%1$s ha rimosso il proprio nome visualizzato (era %2$s)"
"Hai rimosso il tuo nome visualizzato (era %1$s)"
"%1$s ha impostato il proprio nome visualizzato su %2$s"
"Hai impostato il tuo nome visualizzato su %1$s"
+ "%1$s è stato promosso amministratore"
+ "%1$s è stato promosso a moderatore"
"%1$s ha cambiato l\'avatar della stanza"
"Hai cambiato l\'avatar della stanza"
"%1$s ha rimosso l\'avatar della stanza"
"Hai rimosso l\'avatar della stanza"
- "%1$s ha rimosso %2$s"
- "Hai rimosso %1$s"
+ "%1$s ha escluso %2$s"
+ "Hai escluso %1$s"
"%1$s ha creato la stanza"
"Hai creato la stanza"
"%1$s ha invitato %2$s"
@@ -48,12 +52,12 @@
"%1$s ha inviato un invito a %2$s per unirsi alla stanza"
"Hai inviato un invito a %1$s per unirsi alla stanza"
"%1$s ha revocato l\'invito di %2$s ad unirsi alla stanza."
- "Hai revocato l\'invito a %1$s a universi alla stanza"
- "%1$s ha cambiato l\'oggetto in: %2$s"
- "Hai cambiato l\'oggetto in: %1$s"
+ "Hai revocato l\'invito a %1$s a unirsi alla stanza"
+ "%1$s ha cambiato l\'argomento in: %2$s"
+ "Hai cambiato l\'argomento in: %1$s"
"%1$s ha rimosso l\'oggetto della stanza"
- "Hai rimosso l\'oggetto della stanza"
+ "Hai rimosso l\'argomento della stanza"
"%1$s ha sbloccato %2$s"
"Hai sbloccato %1$s"
- "%1$s ha apportato una modifica sconosciuta alla propria iscrizione"
+ "%1$s ha apportato una modifica sconosciuta alla propria presenza nella stanza"
diff --git a/libraries/eventformatter/impl/src/main/res/values-ru/translations.xml b/libraries/eventformatter/impl/src/main/res/values-ru/translations.xml
index 8e72eb5993..459b4919a6 100644
--- a/libraries/eventformatter/impl/src/main/res/values-ru/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-ru/translations.xml
@@ -3,12 +3,16 @@
"(аватар тоже был изменен)"
"%1$s сменили свой аватар"
"Вы сменили изображение"
+ "%1$s был понижен в должности до участника"
+ "%1$s был понижен в должности до модератора"
"%1$s изменил свое отображаемое имя с %2$s на %3$s"
"Вы изменили свое отображаемое имя с %1$s на %2$s"
"%1$s удалил свое отображаемое имя (оно было %2$s)"
"Вы удалили свое отображаемое имя (оно было %1$s)"
"%1$s установили свое отображаемое имя на %2$s"
"Вы установили отображаемое имя на %1$s"
+ "%1$s был повышен до уровня администратора"
+ "%1$s был повышен до модератора"
"%1$s изменил аватар комнаты"
"Вы изменили аватар комнаты"
"%1$s удалил аватар комнаты"
diff --git a/libraries/eventformatter/impl/src/main/res/values-sk/translations.xml b/libraries/eventformatter/impl/src/main/res/values-sk/translations.xml
index 1987a2d333..4af6956f3e 100644
--- a/libraries/eventformatter/impl/src/main/res/values-sk/translations.xml
+++ b/libraries/eventformatter/impl/src/main/res/values-sk/translations.xml
@@ -3,12 +3,16 @@
"(obrázok bol tiež zmenený)"
"%1$s zmenili svoj obrázok"
"Zmenili ste svoj obrázok"
+ "Používateľovi %1$s bola znížená úroveň na člena"
+ "Používateľovi %1$s bola znížená úroveň na moderátora"
"%1$s zmenili svoje zobrazované meno z %2$s na %3$s"
"Zmenili ste si zobrazované meno z %1$s na %2$s"
"%1$s odstránili svoje zobrazované meno (predtým bolo %2$s)"
"Odstránili ste svoje zobrazované meno (predtým bolo %1$s)"
"%1$s nastavili svoje zobrazované meno na %2$s"
"Svoje zobrazované meno ste nastavili na %1$s"
+ "%1$s bol/a povýšený/á na správcu"
+ "%1$s bol/a povýšený/á na moderátora"
"%1$s zmenil/a obrázok miestnosti"
"Zmenili ste obrázok miestnosti"
"%1$s odstránil/a obrázok miestnosti"
diff --git a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt
index 5165e5dadf..b127911cc0 100644
--- a/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt
+++ b/libraries/eventformatter/impl/src/test/kotlin/io/element/android/libraries/eventformatter/impl/DefaultRoomLastMessageFormatterTest.kt
@@ -650,7 +650,7 @@ class DefaultRoomLastMessageFormatterTest {
OtherState.RoomHistoryVisibility,
OtherState.RoomJoinRules,
OtherState.RoomPinnedEvents,
- OtherState.RoomPowerLevels(emptyMap()),
+ OtherState.RoomUserPowerLevels(emptyMap()),
OtherState.RoomServerAcl,
OtherState.RoomTombstone,
OtherState.SpaceChild,
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt
index 97285a345a..f049bd1deb 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/MatrixRoom.kt
@@ -29,6 +29,7 @@ import io.element.android.libraries.matrix.api.media.MediaUploadHandler
import io.element.android.libraries.matrix.api.media.VideoInfo
import io.element.android.libraries.matrix.api.poll.PollKind
import io.element.android.libraries.matrix.api.room.location.AssetType
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import io.element.android.libraries.matrix.api.timeline.ReceiptType
@@ -97,6 +98,12 @@ interface MatrixRoom : Closeable {
suspend fun unsubscribeFromSync()
+ suspend fun powerLevels(): Result
+
+ suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result
+
+ suspend fun resetPowerLevels(): Result
+
suspend fun userRole(userId: UserId): Result
suspend fun updateUsersRoles(changes: List): Result
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt
index 2950788c68..f2577fcb6b 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/room/powerlevels/MatrixRoomPowerLevels.kt
@@ -20,6 +20,17 @@ import io.element.android.libraries.matrix.api.room.MatrixRoom
import io.element.android.libraries.matrix.api.room.MessageEventType
import io.element.android.libraries.matrix.api.room.StateEventType
+data class MatrixRoomPowerLevels(
+ val ban: Long,
+ val invite: Long,
+ val kick: Long,
+ val sendEvents: Long,
+ val redactEvents: Long,
+ val roomName: Long,
+ val roomAvatar: Long,
+ val roomTopic: Long,
+)
+
/**
* Shortcut for calling [MatrixRoom.canUserInvite] with our own user.
*/
diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt
index 90b30cc1f9..d963b71a63 100644
--- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt
+++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/timeline/item/event/OtherState.kt
@@ -33,7 +33,7 @@ sealed interface OtherState {
data object RoomJoinRules : OtherState
data class RoomName(val name: String?) : OtherState
data object RoomPinnedEvents : OtherState
- data class RoomPowerLevels(val users: Map) : OtherState
+ data class RoomUserPowerLevels(val users: Map) : OtherState
data object RoomServerAcl : OtherState
data class RoomThirdPartyInvite(val displayName: String?) : OtherState
data object RoomTombstone : OtherState
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt
index 26e0036415..9a85f25502 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/RustMatrixRoom.kt
@@ -39,6 +39,7 @@ import io.element.android.libraries.matrix.api.room.MessageEventType
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.location.AssetType
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.room.roomNotificationSettings
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
@@ -54,6 +55,7 @@ import io.element.android.libraries.matrix.impl.poll.toInner
import io.element.android.libraries.matrix.impl.room.location.toInner
import io.element.android.libraries.matrix.impl.room.member.RoomMemberListFetcher
import io.element.android.libraries.matrix.impl.room.member.RoomMemberMapper
+import io.element.android.libraries.matrix.impl.room.powerlevels.RoomPowerLevelsMapper
import io.element.android.libraries.matrix.impl.timeline.RustMatrixTimeline
import io.element.android.libraries.matrix.impl.timeline.toRustReceiptType
import io.element.android.libraries.matrix.impl.util.mxCallbackFlow
@@ -86,6 +88,7 @@ import org.matrix.rustcomponents.sdk.messageEventContentFromHtml
import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown
import org.matrix.rustcomponents.sdk.use
import timber.log.Timber
+import uniffi.matrix_sdk.RoomPowerLevelChanges
import java.io.File
import org.matrix.rustcomponents.sdk.Room as InnerRoom
import org.matrix.rustcomponents.sdk.Timeline as InnerTimeline
@@ -253,6 +256,34 @@ class RustMatrixRoom(
}
}
+ override suspend fun powerLevels(): Result = withContext(roomDispatcher) {
+ runCatching {
+ RoomPowerLevelsMapper.map(innerRoom.getPowerLevels())
+ }
+ }
+
+ override suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result = withContext(roomDispatcher) {
+ runCatching {
+ val changes = RoomPowerLevelChanges(
+ ban = matrixRoomPowerLevels.ban,
+ invite = matrixRoomPowerLevels.invite,
+ kick = matrixRoomPowerLevels.kick,
+ redact = matrixRoomPowerLevels.redactEvents,
+ eventsDefault = matrixRoomPowerLevels.sendEvents,
+ roomName = matrixRoomPowerLevels.roomName,
+ roomAvatar = matrixRoomPowerLevels.roomAvatar,
+ roomTopic = matrixRoomPowerLevels.roomTopic,
+ )
+ innerRoom.applyPowerLevelChanges(changes)
+ }
+ }
+
+ override suspend fun resetPowerLevels(): Result = withContext(roomDispatcher) {
+ runCatching {
+ RoomPowerLevelsMapper.map(innerRoom.resetPowerLevels())
+ }
+ }
+
override suspend fun userAvatarUrl(userId: UserId): Result = withContext(roomDispatcher) {
runCatching {
innerRoom.memberAvatarUrl(userId.value)
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapper.kt
new file mode 100644
index 0000000000..fdf8cdbf85
--- /dev/null
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/room/powerlevels/RoomPowerLevelsMapper.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2024 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package io.element.android.libraries.matrix.impl.room.powerlevels
+
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
+import org.matrix.rustcomponents.sdk.RoomPowerLevels as RustRoomPowerLevels
+
+object RoomPowerLevelsMapper {
+ fun map(roomPowerLevels: RustRoomPowerLevels): MatrixRoomPowerLevels {
+ return MatrixRoomPowerLevels(
+ ban = roomPowerLevels.ban,
+ invite = roomPowerLevels.invite,
+ kick = roomPowerLevels.kick,
+ sendEvents = roomPowerLevels.eventsDefault,
+ redactEvents = roomPowerLevels.redact,
+ roomName = roomPowerLevels.roomName,
+ roomAvatar = roomPowerLevels.roomAvatar,
+ roomTopic = roomPowerLevels.roomTopic
+ )
+ }
+}
diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt
index 0bef1744cc..c2f08f778e 100644
--- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt
+++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/timeline/item/event/TimelineEventContentMapper.kt
@@ -163,7 +163,7 @@ private fun RustOtherState.map(): OtherState {
RustOtherState.RoomJoinRules -> OtherState.RoomJoinRules
is RustOtherState.RoomName -> OtherState.RoomName(name)
RustOtherState.RoomPinnedEvents -> OtherState.RoomPinnedEvents
- is RustOtherState.RoomPowerLevels -> OtherState.RoomPowerLevels(users)
+ is RustOtherState.RoomPowerLevels -> OtherState.RoomUserPowerLevels(users)
RustOtherState.RoomServerAcl -> OtherState.RoomServerAcl
is RustOtherState.RoomThirdPartyInvite -> OtherState.RoomThirdPartyInvite(displayName)
RustOtherState.RoomTombstone -> OtherState.RoomTombstone
diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt
index a1e51b4f7b..56d63fe1d8 100644
--- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt
+++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/room/FakeMatrixRoom.kt
@@ -40,6 +40,7 @@ import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomNotificationMode
import io.element.android.libraries.matrix.api.room.StateEventType
import io.element.android.libraries.matrix.api.room.location.AssetType
+import io.element.android.libraries.matrix.api.room.powerlevels.MatrixRoomPowerLevels
import io.element.android.libraries.matrix.api.room.powerlevels.UserRoleChange
import io.element.android.libraries.matrix.api.timeline.MatrixTimeline
import io.element.android.libraries.matrix.api.timeline.ReceiptType
@@ -125,6 +126,9 @@ class FakeMatrixRoom(
private var canUserTriggerRoomNotificationResult: Result = Result.success(true)
private var canUserJoinCallResult: Result = Result.success(true)
private var setIsFavoriteResult = Result.success(Unit)
+ private var powerLevelsResult = Result.success(defaultRoomPowerLevels())
+ private var updatePowerLevelsResult = Result.success(Unit)
+ private var resetPowerLevelsResult = Result.success(defaultRoomPowerLevels())
var sendMessageMentions = emptyList()
val editMessageCalls = mutableListOf>()
private val _typingRecord = mutableListOf()
@@ -204,6 +208,17 @@ class FakeMatrixRoom(
override suspend fun subscribeToSync() = Unit
override suspend fun unsubscribeFromSync() = Unit
+ override suspend fun powerLevels(): Result {
+ return powerLevelsResult
+ }
+
+ override suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result = simulateLongTask {
+ updatePowerLevelsResult
+ }
+
+ override suspend fun resetPowerLevels(): Result = simulateLongTask {
+ resetPowerLevelsResult
+ }
override fun destroy() = Unit
@@ -676,6 +691,18 @@ class FakeMatrixRoom(
fun givenRoomTypingMembers(typingMembers: List) {
_roomTypingMembersFlow.tryEmit(typingMembers)
}
+
+ fun givenPowerLevelsResult(result: Result) {
+ powerLevelsResult = result
+ }
+
+ fun givenUpdatePowerLevelsResult(result: Result) {
+ updatePowerLevelsResult = result
+ }
+
+ fun givenResetPowerLevelsResult(result: Result) {
+ resetPowerLevelsResult = result
+ }
}
data class SendLocationInvocation(
@@ -752,3 +779,14 @@ fun aRoomInfo(
userPowerLevels = userPowerLevels,
activeRoomCallParticipants = activeRoomCallParticipants.toImmutableList(),
)
+
+fun defaultRoomPowerLevels() = MatrixRoomPowerLevels(
+ ban = 50,
+ invite = 0,
+ kick = 50,
+ sendEvents = 0,
+ redactEvents = 50,
+ roomName = 100,
+ roomAvatar = 100,
+ roomTopic = 100
+)
diff --git a/libraries/push/impl/src/main/res/values-be/translations.xml b/libraries/push/impl/src/main/res/values-be/translations.xml
index fa90cc7444..4c7ce25f88 100644
--- a/libraries/push/impl/src/main/res/values-be/translations.xml
+++ b/libraries/push/impl/src/main/res/values-be/translations.xml
@@ -32,6 +32,7 @@
- "%d новых паведамленняў"
"Адрэагаваў на %1$s"
+ "Пазначыць як прачытанае"
"Хуткі адказ"
"Запрасіў вас далучыцца да пакоя"
"Я"
diff --git a/libraries/push/impl/src/main/res/values-it/translations.xml b/libraries/push/impl/src/main/res/values-it/translations.xml
index 9c23d17a5e..74dabeced7 100644
--- a/libraries/push/impl/src/main/res/values-it/translations.xml
+++ b/libraries/push/impl/src/main/res/values-it/translations.xml
@@ -1,7 +1,7 @@
"Chiamata"
- "Ascolto degli eventi"
+ "Eventi in ascolto"
"Notifiche con suono"
"Notifiche silenziose"
@@ -20,7 +20,7 @@
- "%d invito"
- "%d inviti"
- "Ti ha invitato a chattare"
+ "Ti ha invitato ad una conversazione"
"Ti ha menzionato: %1$s"
"Nuovi messaggi"
diff --git a/libraries/textcomposer/impl/src/main/res/values-it/translations.xml b/libraries/textcomposer/impl/src/main/res/values-it/translations.xml
index 262aa14c01..4db0f2cb95 100644
--- a/libraries/textcomposer/impl/src/main/res/values-it/translations.xml
+++ b/libraries/textcomposer/impl/src/main/res/values-it/translations.xml
@@ -7,13 +7,13 @@
"Messaggio…"
"Crea un collegamento"
"Modifica collegamento"
- "Applica il formato in grassetto"
+ "Applica il formato grassetto"
"Applicare il formato corsivo"
"Applica il formato barrato"
"Applicare il formato di sottolineatura"
"Attiva/disattiva la modalità a schermo intero"
"Rientro a destra"
- "Applicare il formato del codice in linea"
+ "Applicare il formato codice inline"
"Imposta collegamento"
"Attiva/disattiva elenco numerato"
"Apri le opzioni di composizione"
diff --git a/libraries/ui-strings/src/main/res/values-be/translations.xml b/libraries/ui-strings/src/main/res/values-be/translations.xml
index 91948a272d..9c8d15244e 100644
--- a/libraries/ui-strings/src/main/res/values-be/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-be/translations.xml
@@ -113,6 +113,7 @@
"Аналітыка"
"Знешні выгляд"
"Аўдыё"
+ "Заблакіраваныя карыстальнікі"
"Бурбалкі"
"Рэзервовае капіраванне чата"
"Аўтарскае права"
@@ -129,7 +130,9 @@
"Увядзіце свой PIN-код"
"Памылка"
"Усе"
+ "Памылка"
"Захаванае"
+ "Абранае"
"Файл"
"Файл захаваны ў папку Спампоўкі"
"Перасылка паведамлення"
@@ -155,6 +158,7 @@
"Адключыць гук"
"Вынікаў няма"
"Па-за сеткай"
+ "або"
"Пароль"
"Людзі"
"Пастаянная спасылка"
@@ -181,6 +185,7 @@
"Пакой"
"Назва пакоя"
"напрыклад, назва вашага праекта"
+ "Захаванне"
"Блакіроўка экрана"
"Шукаць карыстальніка"
"Вынікі пошуку"
@@ -192,6 +197,7 @@
"Сервер не падтрымліваецца"
"URL-адрас сервера"
"Налады"
+ "Абагуленыя геаданыя"
"Выхад"
"Пачатак чата…"
"Стыкер"
@@ -239,6 +245,14 @@
"Не ўдалося выбраць носьбіт, паўтарыце спробу."
"Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз."
"Не атрымалася загрузіць медыяфайлы, паспрабуйце яшчэ раз."
+ "Не атрымалася апрацаваць медыяфайл для загрузкі, паспрабуйце яшчэ раз."
+ "Не ўдалося атрымаць інфармацыю пра карыстальніка"
+ "Заблакіраваць"
+ "Заблакіраваныя карыстальнікі не змогуць адпраўляць вам паведамленні, і ўсе іх паведамленні будуць схаваны. Вы можаце разблакіраваць іх у любы час."
+ "Заблакіраваць карыстальніка"
+ "Разблакіраваць"
+ "Вы зноў зможаце ўбачыць усе паведамленні."
+ "Разблакіраваць карыстальніка"
"Падзяліцца месцазнаходжаннем"
"Падзяліцца маім месцазнаходжаннем"
"Адкрыць у Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-bg/translations.xml b/libraries/ui-strings/src/main/res/values-bg/translations.xml
index dbe0fa17dc..48c602706b 100644
--- a/libraries/ui-strings/src/main/res/values-bg/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-bg/translations.xml
@@ -198,6 +198,10 @@
"🔐️ Присъединете се към мен в %1$s"
"Хей, говорете с мен в %1$s: %2$s"
"%1$s Android"
+ "Блокиране"
+ "Блокиране на потребителя"
+ "Отблокиране"
+ "Отблокиране на потребителя"
"Споделяне на местоположение"
"Споделяне на моето местоположение"
"Отваряне в Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-cs/translations.xml b/libraries/ui-strings/src/main/res/values-cs/translations.xml
index 9f1d435b6e..aaeaef80d1 100644
--- a/libraries/ui-strings/src/main/res/values-cs/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-cs/translations.xml
@@ -251,6 +251,14 @@
"Výběr média se nezdařil, zkuste to prosím znovu."
"Nahrání média se nezdařilo, zkuste to prosím znovu."
"Nahrání média se nezdařilo, zkuste to prosím znovu."
+ "Nahrání média se nezdařilo, zkuste to prosím znovu."
+ "Nepodařilo se načíst údaje o uživateli"
+ "Zablokovat"
+ "Blokovaní uživatelé vám nebudou moci posílat zprávy a všechny jejich zprávy budou skryty. Můžete je kdykoli odblokovat."
+ "Zablokovat uživatele"
+ "Odblokovat"
+ "Znovu uvidíte všechny zprávy od nich."
+ "Odblokovat uživatele"
"Sdílet polohu"
"Sdílet moji polohu"
"Otevřít v Mapách Apple"
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 2288449a43..3824564ce7 100644
--- a/libraries/ui-strings/src/main/res/values-de/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-de/translations.xml
@@ -57,6 +57,7 @@
"PIN eingeben"
"Passwort vergessen?"
"Weiterleiten"
+ "Zurück"
"Einladen"
"Personen einladen"
"Zu %1$s einladen"
@@ -84,6 +85,7 @@
"Im Thread antworten"
"Fehler melden"
"Inhalt melden"
+ "Zurücksetzen"
"Erneut versuchen"
"Entschlüsselung wiederholen"
"Speichern"
@@ -113,6 +115,7 @@
"Audio"
"Blockierte Nutzer"
"Sprechblasen"
+ "Aktiver Anruf (nicht unterstützt)"
"Chat-Backup"
"Copyright"
"Raum wird erstellt…"
@@ -181,6 +184,8 @@
"Raum"
"Raumname"
"z.B. dein Projektname"
+ "Gespeicherte Änderungen"
+ "Speichern"
"Bildschirmsperre"
"Nach jemandem suchen"
"Suchergebnisse"
@@ -223,6 +228,8 @@
"Fehler"
"Erfolg"
"Warnung"
+ "Deine Änderungen wurden nicht gespeichert. Bist du sicher, dass du zurückgehen willst?"
+ "Änderungen speichern?"
"Fehler beim Erstellen des Permalinks"
"%1$s konnte die Karte nicht laden. Bitte versuche es später erneut."
"Fehler beim Laden der Nachrichten"
@@ -240,6 +247,14 @@
"Medienauswahl fehlgeschlagen, bitte versuche es erneut."
"Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut."
"Das Hochladen der Medien ist fehlgeschlagen. Bitte versuche es erneut."
+ "Fehler beim Verarbeiten des hochgeladenen Mediums. Bitte versuche es erneut."
+ "Benutzerdetails konnten nicht abgerufen werden"
+ "Blockieren"
+ "Blockierte Benutzer können Dir keine Nachrichten senden und alle ihre alten Nachrichten werden ausgeblendet. Die Blockierung kann jederzeit aufgehoben werden."
+ "Benutzer blockieren"
+ "Blockierung aufheben"
+ "Du kannst dann wieder alle Nachrichten von ihnen sehen."
+ "Blockierung aufheben"
"Standort teilen"
"Meinen Standort teilen"
"In Apple Maps öffnen"
diff --git a/libraries/ui-strings/src/main/res/values-es/translations.xml b/libraries/ui-strings/src/main/res/values-es/translations.xml
index 7377ed9ec7..43e6919c34 100644
--- a/libraries/ui-strings/src/main/res/values-es/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-es/translations.xml
@@ -234,6 +234,14 @@
"Error al seleccionar archivos multimedia, por favor inténtalo de nuevo."
"Error al procesar el contenido multimedia, por favor inténtalo de nuevo."
"Error al subir el contenido multimedia, por favor inténtalo de nuevo."
+ "Error al procesar el contenido multimedia, por favor inténtalo de nuevo."
+ "No se pudieron recuperar los detalles del usuario"
+ "Bloquear"
+ "Los usuarios bloqueados no podrán enviarte mensajes y todos sus mensajes se ocultarán. Puedes desbloquearlos cuando quieras."
+ "Bloquear usuario"
+ "Desbloquear"
+ "Podrás ver todos sus mensajes de nuevo."
+ "Desbloquear usuario"
"Compartir ubicación"
"Compartir mi ubicación"
"Abrir en Apple Maps"
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 b7affd760f..9626a4143a 100644
--- a/libraries/ui-strings/src/main/res/values-fr/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-fr/translations.xml
@@ -49,6 +49,7 @@
"Refuser"
"Supprimer le sondage"
"Désactiver"
+ "Annuler"
"Terminé"
"Modifier"
"Modifier le sondage"
@@ -57,6 +58,7 @@
"Saisir le code PIN"
"Mot de passe oublié ?"
"Transférer"
+ "Retour"
"Inviter"
"Inviter des amis"
"Inviter des amis à %1$s"
@@ -84,6 +86,7 @@
"Répondre dans le fil de discussion"
"Signaler un problème"
"Signaler le contenu"
+ "Réinitialiser"
"Réessayer"
"Réessayer le déchiffrement"
"Enregistrer"
@@ -113,6 +116,7 @@
"Audio"
"Utilisateurs bloqués"
"Bulles"
+ "Appel en cours (non supporté)"
"Sauvegarde des discussions"
"Droits d’auteur"
"Création du salon…"
@@ -181,6 +185,8 @@
"Salon"
"Nom du salon"
"par exemple, le nom de votre projet"
+ "Modifications enregistrées"
+ "Enregistrement"
"Verrouillage d’écran"
"Rechercher quelqu’un"
"Résultats de la recherche"
@@ -223,6 +229,8 @@
"Erreur"
"Succès"
"Attention"
+ "Vos modifications n’ont pas été enregistrées. Êtes-vous certain de vouloir quitter?"
+ "Enregistrer les changements?"
"Échec de la création du permalien"
"%1$s n’a pas pu charger la carte. Veuillez réessayer ultérieurement."
"Échec du chargement des messages"
@@ -240,6 +248,14 @@
"Échec de la sélection du média, veuillez réessayer."
"Échec du traitement des médias à télécharger, veuillez réessayer."
"Échec du téléchargement du média, veuillez réessayer."
+ "Échec du traitement des médias à télécharger, veuillez réessayer."
+ "Impossible de récupérer les détails de l’utilisateur"
+ "Bloquer"
+ "Les utilisateurs bloqués ne pourront pas vous envoyer de messages et tous leurs messages seront masqués. Vous pouvez les débloquer à tout moment."
+ "Bloquer l’utilisateur"
+ "Débloquer"
+ "Vous pourrez à nouveau voir tous ses messages."
+ "Débloquer l’utilisateur"
"Partage de position"
"Partager ma position"
"Ouvrir dans Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-hu/translations.xml b/libraries/ui-strings/src/main/res/values-hu/translations.xml
index 8753c6f387..c97fb6c14e 100644
--- a/libraries/ui-strings/src/main/res/values-hu/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-hu/translations.xml
@@ -239,6 +239,14 @@
"Nem sikerült kiválasztani a médiát, próbálja újra."
"Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra."
"Nem sikerült a média feltöltése, próbálja újra."
+ "Nem sikerült feldolgozni a feltöltendő médiát, próbálja újra."
+ "Nem sikerült letölteni a felhasználói adatokat"
+ "Letiltás"
+ "A letiltott felhasználók nem fognak tudni üzeneteket küldeni, és az összes üzenetük rejtve lesz. Bármikor feloldhatja a letiltásukat."
+ "Felhasználó letiltása"
+ "Letiltás feloldása"
+ "Újra láthatja az összes üzenetét."
+ "Felhasználó kitiltásának feloldása"
"Hely megosztása"
"Saját hely megosztása"
"Megnyitás az Apple Mapsben"
diff --git a/libraries/ui-strings/src/main/res/values-in/translations.xml b/libraries/ui-strings/src/main/res/values-in/translations.xml
index 63ad840fed..52fe6cbbbd 100644
--- a/libraries/ui-strings/src/main/res/values-in/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-in/translations.xml
@@ -230,6 +230,14 @@
"Gagal memilih media, silakan coba lagi."
"Gagal memproses media untuk diunggah, silakan coba lagi."
"Gagal mengunggah media, silakan coba lagi."
+ "Gagal memproses media untuk diunggah, silakan coba lagi."
+ "Tidak dapat mengambil detail pengguna"
+ "Blokir"
+ "Pengguna yang diblokir tidak akan dapat mengirim Anda pesan dan semua pesan mereka akan disembunyikan. Anda dapat membuka blokirnya kapan saja."
+ "Blokir pengguna"
+ "Buka blokir"
+ "Anda akan dapat melihat semua pesan dari mereka lagi."
+ "Buka blokir pengguna"
"Bagikan lokasi"
"Bagikan lokasi saya"
"Buka di Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-it/translations.xml b/libraries/ui-strings/src/main/res/values-it/translations.xml
index 752f126dd2..d7160c4e3f 100644
--- a/libraries/ui-strings/src/main/res/values-it/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-it/translations.xml
@@ -17,22 +17,22 @@
"Sondaggio terminato"
"Reagisci con %1$s"
"Reagisci con altri emoji"
- "Letto da %1$s e %2$s"
+ "Visualizzato da %1$s e %2$s"
- - "Letto da %1$s e %2$d altro"
- - "Letto da %1$s e altri %2$d"
+ - "Visualizzato da %1$s e %2$d altro"
+ - "Visualizzato da %1$s e altri %2$d"
- "Letto da %1$s"
+ "Visualizzato da %1$s"
"Tocca per mostrare tutti"
"Rimuovi la reazione con %1$s"
"Invia file"
"Mostra password"
- "Inizia una chiamata"
+ "Avvia una chiamata"
"Menu utente"
"Registra un messaggio vocale."
"Ferma la registrazione"
"Accetta"
- "Aggiungi alla timeline"
+ "Aggiungi alla conversazione"
"Indietro"
"Annulla"
"Scegli foto"
@@ -43,7 +43,7 @@
"Continua"
"Copia"
"Copia collegamento"
- "Copia link nel messaggio"
+ "Copia collegamento al messaggio"
"Crea"
"Crea una stanza"
"Rifiuta"
@@ -57,6 +57,7 @@
"Inserisci PIN"
"Password dimenticata?"
"Inoltra"
+ "Indietro"
"Invita"
"Invita persone"
"Invita persone su %1$s"
@@ -67,7 +68,7 @@
"Esci"
"Abbandona la conversazione"
"Esci dalla stanza"
- "Carica di più"
+ "Carica altro"
"Gestisci account"
"Gestisci dispositivi"
"Avanti"
@@ -81,9 +82,10 @@
"Reagisci"
"Rimuovi"
"Rispondi"
- "Rispondi nella conversazione"
+ "Rispondi nella discussione"
"Segnala un problema"
- "Segnala Contenuto"
+ "Segnala contenuto"
+ "Reimposta"
"Riprova"
"Riprova la decrittazione"
"Salva"
@@ -103,15 +105,17 @@
"Scatta foto"
"Tocca per le opzioni"
"Riprova"
- "Vedi Sorgente"
+ "Vedi codice sorgente"
"Sì"
"Informazioni"
"Regole sull\'utilizzo consentito"
"Impostazioni avanzate"
- "Statistiche"
+ "Statistiche di utilizzo"
"Aspetto"
"Audio"
+ "Utenti bloccati"
"Fumetti"
+ "Chiamata in corso (non supportata)"
"Backup della chat"
"Copyright"
"Creazione stanza…"
@@ -119,7 +123,7 @@
"Scuro"
"Errore di decrittazione"
"Opzioni sviluppatore"
- "Chat diretta"
+ "Conversazione diretta"
"(modificato)"
"Modifica in corso"
"* %1$s %2$s"
@@ -127,9 +131,11 @@
"Inserisci il PIN"
"Errore"
"Tutti"
+ "Fallito"
"Preferiti"
+ "Preferita"
"File"
- "File salvato in Download"
+ "File salvato"
"Inoltra messaggio"
"GIF"
"Immagine"
@@ -145,13 +151,14 @@
- "%1$d membri"
"Messaggio"
- "Azioni del messaggio"
+ "Azioni messaggio"
"Impaginazione del messaggio"
"Messaggio rimosso"
"Moderno"
"Silenzia"
"Nessun risultato"
"Non in linea"
+ "o"
"Password"
"Persone"
"Collegamento permanente"
@@ -173,10 +180,12 @@
"Segnala un problema"
"Segnala un problema"
"Segnalazione inviata"
- "Editor in rich text"
+ "Editor di testo avanzato"
"Stanza"
"Nome stanza"
"ad es. il nome del tuo progetto"
+ "Modifiche salvate"
+ "Salvataggio"
"Blocco schermo"
"Cerca qualcuno"
"Risultati di ricerca"
@@ -190,7 +199,7 @@
"Impostazioni"
"Posizione condivisa"
"Disconnessione"
- "Avvio della chat…"
+ "Avvio della conversazione…"
"Adesivo"
"Operazione riuscita"
"Suggerimenti"
@@ -198,8 +207,8 @@
"Sistema"
"Testo"
"Comunicazioni di terze parti"
- "Conversazione"
- "Oggetto"
+ "Discussione"
+ "Argomento"
"Di cosa parla questa stanza?"
"Impossibile decrittografare"
"Non è stato possibile spedire inviti a uno o più utenti."
@@ -214,11 +223,13 @@
"Video"
"Messaggio vocale"
"In attesa…"
- "In attesa di questo messaggio"
+ "In attesa del messaggio"
"Conferma"
"Errore"
"Operazione riuscita"
"Attenzione"
+ "Le modifiche non sono state salvate. Vuoi davvero tornare indietro?"
+ "Salvare le modifiche?"
"Impossibile creare il collegamento permanente"
"%1$s non è riuscito a caricare la mappa. Riprova più tardi."
"Caricamento dei messaggi non riuscito"
@@ -230,12 +241,20 @@
"Alcuni messaggi non sono stati inviati"
"Siamo spiacenti, si è verificato un errore"
"🔐️ Unisciti a me su %1$s"
- "Ehi, parlami su %1$s: %2$s"
+ "Ehi, parliamo su %1$s: %2$s"
"%1$s Android"
"Scuoti per segnalare un problema"
"Selezione del file multimediale fallita, riprova."
"Elaborazione del file multimediale da caricare fallita, riprova."
"Caricamento del file multimediale fallito, riprova."
+ "Elaborazione del file multimediale da caricare fallita, riprova."
+ "Impossibile recuperare i dettagli dell\'utente"
+ "Blocca"
+ "Gli utenti bloccati non saranno in grado di inviarti messaggi e tutti quelli già ricevuti saranno nascosti. Puoi sbloccarli in qualsiasi momento."
+ "Blocca utente"
+ "Sblocca"
+ "Potrai vedere di nuovo tutti i suoi messaggi."
+ "Sblocca utente"
"Condividi posizione"
"Condividi la mia posizione"
"Apri in Apple Maps"
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 838b6d15cc..073dd20f4b 100644
--- a/libraries/ui-strings/src/main/res/values-ro/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ro/translations.xml
@@ -241,6 +241,14 @@
"Selectarea fișierelor media a eșuat, încercați din nou."
"Procesarea datelor media a eșuat, vă rugăm să încercați din nou."
"Încărcarea fișierelor media a eșuat, încercați din nou."
+ "Procesarea datelor media a eșuat, vă rugăm să încercați din nou."
+ "Nu am putut găsi detaliile utilizatorului"
+ "Blocați"
+ "Utilizatorii blocați nu vă vor putea trimite mesaje și toate mesajele lor vor fi ascunse. Puteți anula această acțiune oricând."
+ "Blocați utilizatorul"
+ "Deblocați"
+ "La deblocarea utilizatorului, veți putea vedea din nou toate mesajele de la acesta."
+ "Deblocați utilizatorul"
"Partajați locația"
"Distribuiți locația mea"
"Deschideți în Apple Maps"
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 8465a74262..384a9355f4 100644
--- a/libraries/ui-strings/src/main/res/values-ru/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-ru/translations.xml
@@ -251,6 +251,14 @@
"Не удалось выбрать носитель, попробуйте еще раз."
"Не удалось обработать медиафайл для загрузки, попробуйте еще раз."
"Не удалось загрузить медиафайлы, попробуйте еще раз."
+ "Не удалось обработать медиафайл для загрузки, попробуйте еще раз."
+ "Не удалось получить данные о пользователе"
+ "Заблокировать"
+ "Заблокированные пользователи не смогут отправлять вам сообщения, а все их сообщения будут скрыты. Вы можете разблокировать их в любое время."
+ "Заблокировать пользователя"
+ "Разблокировать"
+ "Вы снова сможете увидеть все сообщения."
+ "Разблокировать пользователя"
"Поделиться местоположением"
"Поделиться моим местоположением"
"Открыть в Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-sk/translations.xml b/libraries/ui-strings/src/main/res/values-sk/translations.xml
index cbfe343e42..a670ad6150 100644
--- a/libraries/ui-strings/src/main/res/values-sk/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-sk/translations.xml
@@ -51,6 +51,7 @@
"Odmietnuť"
"Odstrániť anketu"
"Vypnúť"
+ "Zahodiť"
"Hotovo"
"Upraviť"
"Upraviť anketu"
@@ -250,6 +251,14 @@
"Nepodarilo sa vybrať médium, skúste to prosím znova."
"Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova."
"Nepodarilo sa nahrať médiá, skúste to prosím znova."
+ "Nepodarilo sa spracovať médiá na odoslanie, skúste to prosím znova."
+ "Nepodarilo sa získať údaje o používateľovi"
+ "Zablokovať"
+ "Blokovaní používatelia vám nebudú môcť posielať správy a všetky ich správy budú skryté. Môžete ich kedykoľvek odblokovať."
+ "Zablokovať používateľa"
+ "Odblokovať"
+ "Všetky správy od nich budete môcť opäť vidieť."
+ "Odblokovať používateľa"
"Zdieľať polohu"
"Zdieľať moju polohu"
"Otvoriť v Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-sv/translations.xml b/libraries/ui-strings/src/main/res/values-sv/translations.xml
index 011350a682..dd9d302794 100644
--- a/libraries/ui-strings/src/main/res/values-sv/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-sv/translations.xml
@@ -190,6 +190,14 @@
"Misslyckades att välja media, vänligen pröva igen."
"Misslyckades att bearbeta media för uppladdning, vänligen pröva igen."
"Misslyckades att ladda upp media, vänligen pröva igen."
+ "Misslyckades att bearbeta media för uppladdning, vänligen pröva igen."
+ "Kunde inte hämta användarinformation"
+ "Blockera"
+ "Blockerade användare kommer inte att kunna skicka meddelanden till dig och alla deras meddelanden kommer att döljas. Du kan avblockera dem när som helst."
+ "Blockera användare"
+ "Avblockera"
+ "Du kommer att kunna se alla meddelanden från dem igen."
+ "Avblockera användare"
"Dela plats"
"Dela min plats"
"Öppna i Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-uk/translations.xml b/libraries/ui-strings/src/main/res/values-uk/translations.xml
index 1a9a70e647..cc2bc86ea1 100644
--- a/libraries/ui-strings/src/main/res/values-uk/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-uk/translations.xml
@@ -86,6 +86,7 @@
"Відповісти в темі"
"Повідомити про помилку"
"Повідомити про вміст"
+ "Скинути"
"Спробувати ще раз"
"Повторити спробу розшифрування"
"Зберегти"
@@ -115,6 +116,7 @@
"Аудіо"
"Заблоковані користувачі"
"Бульбашки"
+ "Триває виклик (не підтримується)"
"Резервне копіювання чату"
"Авторське право"
"Створення кімнати…"
@@ -185,6 +187,7 @@
"Кімната"
"Назва кімнати"
"напр., назва вашого проєкту"
+ "Збережені зміни"
"Збереження"
"Блокування екрану"
"Пошук когось"
@@ -228,6 +231,8 @@
"Помилка"
"Успіх"
"Попередження"
+ "Внесені зміни не збережено. Ви впевнені, що хочете повернутися?"
+ "Зберегти зміни?"
"Не вдалося створити постійне посилання"
"%1$s Не вдалося завантажити карту. Будь ласка, спробуйте ще раз пізніше."
"Не вдалося завантажити повідомлення"
@@ -245,6 +250,14 @@
"Не вдалося вибрати медіафайл, спробуйте ще раз."
"Не вдалося обробити медіафайл для завантаження, спробуйте ще раз."
"Не вдалося завантажити медіафайл, спробуйте ще раз."
+ "Не вдалося обробити медіафайл для завантаження, спробуйте ще раз."
+ "Не вдалося отримати дані користувача"
+ "Заблокувати"
+ "Заблоковані користувачі не зможуть надсилати Вам повідомлення, і всі їхні повідомлення будуть приховані. Ви можете розблокувати їх у будь-який час."
+ "Заблокувати користувача"
+ "Розблокувати"
+ "Ви знову зможете бачити всі повідомлення від них."
+ "Розблокувати користувача"
"Поділитися розташуванням"
"Поділитися моїм розташуванням"
"Відкрити в Apple Maps"
diff --git a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml
index 6a3e2ca28d..d354cc2b1b 100644
--- a/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml
+++ b/libraries/ui-strings/src/main/res/values-zh-rTW/translations.xml
@@ -218,6 +218,10 @@
"嘿,來 %1$s 和我聊天:%2$s"
"%1$s Android"
"無法上傳媒體檔案,請稍後再試。"
+ "封鎖"
+ "封鎖使用者"
+ "解除封鎖"
+ "解除封鎖使用者"
"分享位置"
"分享我的位置"
"在 Apple Maps 中開啟"
diff --git a/libraries/ui-strings/src/main/res/values/localazy.xml b/libraries/ui-strings/src/main/res/values/localazy.xml
index c8ee3c3d08..f807fc3094 100644
--- a/libraries/ui-strings/src/main/res/values/localazy.xml
+++ b/libraries/ui-strings/src/main/res/values/localazy.xml
@@ -248,6 +248,14 @@
"Failed selecting media, please try again."
"Failed processing media to upload, please try again."
"Failed uploading media, please try again."
+ "Failed processing media to upload, please try again."
+ "Could not retrieve user details"
+ "Block"
+ "Blocked users won\'t be able to send you messages and all their messages will be hidden. You can unblock them anytime."
+ "Block user"
+ "Unblock"
+ "You\'ll be able to see all messages from them again."
+ "Unblock user"
"Share location"
"Share my location"
"Open in Apple Maps"
diff --git a/screenshots/de/ui_T_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,de].png
new file mode 100644
index 0000000000..a2af7c82b9
--- /dev/null
+++ b/screenshots/de/ui_T_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,de].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49eca75c8fb1773618751900a23f4bfa78d38ecf6b60f94d0210c8fc4dafdc58
+size 19888
diff --git a/screenshots/de/ui_T_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,de].png
new file mode 100644
index 0000000000..51749041f2
--- /dev/null
+++ b/screenshots/de/ui_T_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,de].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:525279e314d18b3189b8c7d9a1deed153075397a39def012fb8e13ef77cd2caf
+size 20510
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-4_5_null_7,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-4_5_null_7,NEXUS_5,1.0,de].png
index b8e2c29504..34350d26a1 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-4_5_null_7,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.members.moderation_RoomMembersModerationView_null_RoomMembersModerationView-Day-4_5_null_7,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ae084602ca07cfa05072f0b3b837dc1958cf5ab24f3db73df2ff759f2eb65ff5
-size 31091
+oid sha256:ddc02d664bee1fe541ea0e0fb6edb8a035b0ea7d6799d52b78f6ae3a2ec71a73
+size 39777
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_0,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_0,NEXUS_5,1.0,de].png
index 5d9d8b9ca4..9214219bc4 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_0,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_0,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4a70b4c8ad68721a68ab7dd56b487b6fe3000e29e7e15d391ea4c11f38382c00
-size 19391
+oid sha256:14b5f48b528b083d9e6cda0ddf9cfbe867a879e4f421634bdfff982202c10e45
+size 21230
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_1,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_1,NEXUS_5,1.0,de].png
index c5c5a09141..34106fd24c 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_1,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_1,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8fcaa6108d4a4459d651649360ef81b4f0216fc8891fb1b4ad53f80e0ca489e9
-size 20839
+oid sha256:3b61fd9886f100b06e8e055f2d6df48efb46197bc7d91296c88244bb640facb7
+size 22992
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_10,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_10,NEXUS_5,1.0,de].png
index 426b72b1ef..acbd7d5594 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_10,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_10,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:eba562fdd10dd069ecadf12fad2e2436beeba6857239868fea4d7c1db2c7da3e
-size 57646
+oid sha256:978f8d20f848aa640b876658a1ddb6470dcb361aa5c714fa62ac59284c86e5f6
+size 59009
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_2,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_2,NEXUS_5,1.0,de].png
index 1682408a0b..bec09545dc 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_2,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_2,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0a22a4f812af1a1ae3c78a07c9ed85c75c97fc4eb93412f6e0da1fd92cc89ca8
-size 67120
+oid sha256:51fd05f8c1fca35f9f3f787c62e653a49bdd3d61f6fe1ef222b3d3aee2e65f22
+size 68802
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_3,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_3,NEXUS_5,1.0,de].png
index a7238adc09..2fe73c000a 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_3,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_3,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:da75c3f89c6da14b3cc7859f56050d0cbd19bb603ead0b1a335afc7abe6f70ee
-size 67040
+oid sha256:b0b7731493a2f517d79552fafae4747545646d84d3c5cb28d20239b5e68b0d84
+size 68581
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_4,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_4,NEXUS_5,1.0,de].png
index f19c31a16a..ec57faca00 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_4,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_4,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f6f38536125d5f4d795f5e94a6619b46595729095a19ad96d77b7e3bd27f4da8
-size 61024
+oid sha256:7396130d5c5ff31d2f219d382dbd6ae96c9ae0087ef85271b845e2f39ebf0a73
+size 62565
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_6,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_6,NEXUS_5,1.0,de].png
index 743e21191b..98fff0f2ba 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_6,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_6,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d68071f4c0adde3a63164c773e877be0351a928edc34b08ac8f8a77329566fba
-size 66586
+oid sha256:7fccf9edbcb4fcb825ad0b89ed229b134951c9eda940f7be89e3c4fa147d5a51
+size 69887
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_7,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_7,NEXUS_5,1.0,de].png
index 6dab55abbc..4cb6e2ccf9 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_7,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_7,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:36c26b380757361e6b30c79e2c76a82ffb685cb2e80f9338e6514557834b220f
-size 71690
+oid sha256:cc8d93d943628b01996913f9286bbc742f3d3ad33a1642289e588caef7c1bac7
+size 72956
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_8,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_8,NEXUS_5,1.0,de].png
index 6beef6d425..b28495d05f 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_8,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_8,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4d3047b1a8ffcd59e9c3b4b14bca533b161db8307b041f31d8a7817aa1637cd7
-size 59831
+oid sha256:75af0f62d57347a3cd5bd3350f08eb8d99a5cc57ef6598057d6b709aaf5899f5
+size 61252
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_9,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_9,NEXUS_5,1.0,de].png
index da730e3c30..bbc57cf00d 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_9,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions.changeroles_ChangeRolesView_null_ChangeRolesView-Day-9_10_null_9,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8735330572f24a7d0597a9273ea47c4d2e9485e8ce1acb365989ac0601f5da85
-size 70959
+oid sha256:15d5ca56d3ba6c4394c44bd623feda6737ec758d98d37ee5697bb0d70eb682be
+size 71213
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_0,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_0,NEXUS_5,1.0,de].png
index 364d5d7bea..01da819452 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_0,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_0,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:075166ea041f43a5718311519cc009b1a5164e9cbbcc166c1ce4545bc40ff7c4
-size 24793
+oid sha256:84eabb6c962ed72609837f679afd83fdff695cfdcb7793f7600d4c146968fd8e
+size 25174
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_1,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_1,NEXUS_5,1.0,de].png
index f4b467cf81..9066b7e5a3 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_1,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_1,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7bdaabcb50125f8a8cb1079964c58091067625cd4bd98285eb9ef953e44839d4
-size 24527
+oid sha256:bd2c3e163d0b43b96fdfda4bedb81320a48d2700cfdb4aff762755d16931459a
+size 24908
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_2,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_2,NEXUS_5,1.0,de].png
index a32df55994..d8a464105a 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_2,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_2,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:feae53102cfbfe66ed036b8bb0397f677b71fc37b5eeade7898d210113ac43e8
-size 51168
+oid sha256:e195974bdfa6f8bb9dbced18882732c464a9d52595c74226381aad2dd8c65bdd
+size 53220
diff --git a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_3,NEXUS_5,1.0,de].png b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_3,NEXUS_5,1.0,de].png
index 0fd5f9eba6..e917e5854e 100644
--- a/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_3,NEXUS_5,1.0,de].png
+++ b/screenshots/de/ui_T_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_3,NEXUS_5,1.0,de].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3e991910af1e0830397f9455e7416633949bc6a5980e73f60d32ebecfd1c8d0f
-size 26637
+oid sha256:efa3f7a00ae90fb7c4ba1d1cfc91baa00659d12e222a452de625daa9f5eebc72
+size 26920
diff --git a/screenshots/html/data.js b/screenshots/html/data.js
index 07bc6c7289..11dcaea1f7 100644
--- a/screenshots/html/data.js
+++ b/screenshots/html/data.js
@@ -465,6 +465,8 @@ export const screenshots = [
["ui_S_t[f.poll.api.pollcontent_PollContentUndisclosed_null_PollContentUndisclosed-Day-7_8_null,NEXUS_5,1.0,en]","ui_S_t[f.poll.api.pollcontent_PollContentUndisclosed_null_PollContentUndisclosed-Night-7_9_null,NEXUS_5,1.0,en]",1,],
["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_0,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_0,NEXUS_5,1.0,en]",1,],
["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_1,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_1,NEXUS_5,1.0,en]",1,],
+["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_2,NEXUS_5,1.0,en]",1,],
+["ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,en]","ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_3,NEXUS_5,1.0,en]",1,],
["ui_S_t[l.designsystem.components.preferences_PreferenceCategory_null_Preferences_PreferenceCategory_0_null,NEXUS_5,1.0,en]","",0,],
["ui_S_t[l.designsystem.components.preferences_PreferenceCheckbox_null_Preferences_PreferenceCheckbox_0_null,NEXUS_5,1.0,en]","",0,],
["ui_S_t[l.designsystem.components.preferences_PreferenceDivider_null_Preferences_PreferenceDivider_0_null,NEXUS_5,1.0,en]","",0,],
diff --git a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/EnsureCalledOnce.kt b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/EnsureCalledOnce.kt
index 9789aff870..ba0b2dbf88 100644
--- a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/EnsureCalledOnce.kt
+++ b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/EnsureCalledOnce.kt
@@ -29,12 +29,31 @@ class EnsureCalledOnce : () -> Unit {
}
}
+class EnsureCalledTimes(val times: Int) : () -> Unit {
+ private var counter = 0
+ override fun invoke() {
+ counter++
+ }
+
+ fun assertSuccess() {
+ if (counter != times) {
+ throw AssertionError("Expected to be called $times, but was called $counter times")
+ }
+ }
+}
+
fun ensureCalledOnce(block: (callback: () -> Unit) -> Unit) {
val callback = EnsureCalledOnce()
block(callback)
callback.assertSuccess()
}
+fun ensureCalledTimes(times: Int, block: (callback: () -> Unit) -> Unit) {
+ val callback = EnsureCalledTimes(times)
+ block(callback)
+ callback.assertSuccess()
+}
+
class EnsureCalledOnceWithParam(
private val expectedParam: T,
private val result: R,
diff --git a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt
index 1ebbd80acf..da6e67a91d 100644
--- a/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt
+++ b/tests/testutils/src/main/kotlin/io/element/android/tests/testutils/SemanticsNodeInteractionsProviderExtensions.kt
@@ -24,6 +24,7 @@ import androidx.compose.ui.test.hasContentDescription
import androidx.compose.ui.test.hasTestTag
import androidx.compose.ui.test.hasText
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
+import androidx.compose.ui.test.onFirst
import androidx.compose.ui.test.performClick
import io.element.android.libraries.ui.strings.CommonStrings
import org.junit.rules.TestRule
@@ -34,6 +35,16 @@ fun AndroidComposeTestRule.clickOn(@StringR
.performClick()
}
+fun AndroidComposeTestRule.clickOnFirst(@StringRes res: Int) {
+ val text = activity.getString(res)
+ onAllNodes(hasText(text) and hasClickAction()).onFirst().performClick()
+}
+
+fun AndroidComposeTestRule.clickOnLast(@StringRes res: Int) {
+ val text = activity.getString(res)
+ onAllNodes(hasText(text) and hasClickAction()).onFirst().performClick()
+}
+
/**
* Press the back button in the app bar.
*/
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,en].png
index 4e4f13e198..57defae9ba 100644
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,en].png
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_2,NEXUS_5,1.0,en].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:240ae2c6b7efac68c972049db5234f71813885ab7f3a93b22db8735e650b78cc
-size 16621
+oid sha256:e73c55b17bf0f0c7f9e398e08471e778ce91145a63410b728a33b0ad1d521a52
+size 16586
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,en].png
index 7cfbf4e018..cba5a1fac6 100644
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,en].png
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Day-1_2_null_3,NEXUS_5,1.0,en].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3ebe36dfe126b2d71254116b0ac4c3aec05dca5862f4f134d8f4a5fb179eba61
-size 16085
+oid sha256:2540819ea467d626deab3d29b4e1fcfb385c389b3a22b43308d9974478884c66
+size 16065
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_2,NEXUS_5,1.0,en].png
index db6496d300..41327dee0f 100644
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_2,NEXUS_5,1.0,en].png
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_2,NEXUS_5,1.0,en].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7a2a347e2b10c3e914c36e33e273e58c8263e6c48417b338390efe877494cb5e
-size 15824
+oid sha256:836f4eac4edb453b851c16050db187ce29fe90fb651c60900d41437acd794895
+size 15796
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_3,NEXUS_5,1.0,en].png
index 778cb42ff1..aa921af6dc 100644
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_3,NEXUS_5,1.0,en].png
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.poll.impl.history_PollHistoryView_null_PollHistoryView-Night-1_3_null_3,NEXUS_5,1.0,en].png
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:980630d02716dbc61840c14d839d6d3a2eac99c85adc78547a2c7f9cf920bf4a
-size 15308
+oid sha256:ebd21ad1a1de06c7de5d13134913785557fc743770202292630c20a85875208e
+size 15300
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_0,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..c1fa064495
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_0,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cce394023e7c5bac40bcf234f9073196b1eb424893760f29d609eb329f62817f
+size 42587
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_1,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..308abc0e92
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_1,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:97eaf8930ebc7c127dddb12a1002161aa10b120f87ce88779ea96ff35790e344
+size 38372
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_2,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..8428ee7714
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_2,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2d6818023d37493825ba7b929470152847c397b5f19a5bd8ee862fc900dee690
+size 40755
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_3,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..52135a6c75
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_3,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:86aa47d55841e5041bf56534852dd716b4546cc3657a30133b88c0c87998f16c
+size 42464
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_4,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..d7bdf55419
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_4,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:237125629b6449d6898391235b625248b71629b4d96415b80fb7ef5e773e86b2
+size 40484
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_5,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..6c7a7c2b33
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_5,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:753eecb930bf0659671f2f1ecb2a64ae226aac96c5365ed549c635fd90c8c729
+size 40951
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_6,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..bca446759d
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Day-10_11_null_6,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d0b37566f62e30fcb4f16364a9ac2c008a98a5429c3fa5724d7ef6455e79cf34
+size 47995
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_0,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..35d6c4ad87
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_0,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dff4c4a80156b2977da007d6258d1cd6cefc93bc709ec33bff0e1b484604cf0a
+size 38506
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_1,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..3e0e7b54fd
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_1,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:635c8d6bdaafb07706d95d5a9cb9a4e828ef312c31b33a80f6deff1a1c3b206f
+size 34554
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_2,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..97de47b574
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_2,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:af5a843cc9cd5a51d986ba7dae7d2c6a088f862f46bac961667a1fb1d62b8a20
+size 36966
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_3,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..e7363aa84b
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_3,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:059e598dc973e8c01dba4ef49accf47ea2bd74377dfbfb441c3c213fc77a1cee
+size 38158
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_4,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..7f5fe9dbc4
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_4,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c34415877b279b2018d02667cc98b4857f4ae5bfa68d169f3226a0c99ed4620b
+size 36699
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_5,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..17ca2569d6
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_5,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dc02c16667b78ca5a9985da6816f17bbd0f7bb2307569aacaf3391ccd8431bd5
+size 36567
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_6,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..9d7aa5c1be
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions.permissions_ChangeRoomPermissionsView_null_ChangeRoomPermissionsView-Night-10_12_null_6,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4faece23a4780f5465abe42587f56933ecded55bf3ae966a9e6b634e7df1e049
+size 42845
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_0,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..6b04a5962e
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_0,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ee5c36535582ecb91b7315afa70bae38db2c7287760071293dbf5fac2b8000b4
+size 43609
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_1,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..0676dcd329
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_1,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4c5d2d8a8e672c19e1ed9cd37291a6355f815fcd55157fca7a5966bba0baa830
+size 43303
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_2,NEXUS_5,1.0,en].png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_2,NEXUS_5,1.0,en].png
rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_2,NEXUS_5,1.0,en].png
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_3,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..ba495911fc
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_3,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c63e9045666c863d13865f4d40563a57ee7ec2110de023455a16d400eb67d26
+size 41977
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_4,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..598e940ff8
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_4,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:905960605341e3cf5987025bdc560e0141f1b5f1ff5e5b114d3f698712e3428d
+size 39869
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_5,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..c4eb3d509f
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_5,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7cd6b2f0b51fe273ee5479e77a4762d4addb8e59560edbbb4a3ce4520ceb4a75
+size 51493
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_6,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..ba495911fc
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_6,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c63e9045666c863d13865f4d40563a57ee7ec2110de023455a16d400eb67d26
+size 41977
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_7,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..d3cc403fb5
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Day-8_9_null_7,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8c25b6b3d2699895a4b34a61864d2b57aad9f44d5488830f5f2e061fddf42e32
+size 40355
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_0,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..3e3bf2effa
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_0,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09a844501c3aea35d5ec151415b25c5be8960b98697a99dba450c8a25fb69c8b
+size 39847
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_1,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..9d78e2116d
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_1,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5d262c2c0681ea12ce6920af395bd56aa58a97448ade03997cd22e921d1e2f77
+size 39564
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_2,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_2,NEXUS_5,1.0,en].png
similarity index 100%
rename from tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_2,NEXUS_5,1.0,en].png
rename to tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_2,NEXUS_5,1.0,en].png
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_3,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..c11f365339
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_3,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1e7414cc8c9412c45e55ea77842b908a1979aa680a66609cbdfa6f5a91d87c9
+size 37925
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_4,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..bc035365a5
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_4,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a08860391a1f9854c2354ede0236e0ea78bd1242b134121e2e6a1903e7b8a6b2
+size 35378
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_5,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_5,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..32e6921e00
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_5,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:865c6148937271e08a14f4820652b9c9109b81eca71b715711460c8fe14fcc97
+size 45654
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_6,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_6,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..c11f365339
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_6,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1e7414cc8c9412c45e55ea77842b908a1979aa680a66609cbdfa6f5a91d87c9
+size 37925
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_7,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_7,NEXUS_5,1.0,en].png
new file mode 100644
index 0000000000..5159dcd623
--- /dev/null
+++ b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RolesAndPermissionView_null_RolesAndPermissionView-Night-8_10_null_7,NEXUS_5,1.0,en].png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b9d5ca3bccf0fbca3ced8392f2ca42dd448c032d97d81291357dc3a1bb33ea2
+size 35806
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_0,NEXUS_5,1.0,en].png
deleted file mode 100644
index 3c15ca411d..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_0,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:5c6410198fc2f7e74279e21013718bf8326bfd871fa7ffa244470725f7bf3ae5
-size 23045
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_1,NEXUS_5,1.0,en].png
deleted file mode 100644
index a4329e47f8..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_1,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3d6fce3b7fa9ac12e25f135ddeabb96dad4bba9422926e5451647255a712e481
-size 22772
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_3,NEXUS_5,1.0,en].png
deleted file mode 100644
index 944ddb606f..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_3,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:c788eab0495478d8253cbd11970c57c83670e2b761a675b413642db3c6ee57fa
-size 25095
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_4,NEXUS_5,1.0,en].png
deleted file mode 100644
index e3cefb87a5..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Day-8_9_null_4,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:98f81fcfa9cb5c7c02f8322ca4e444df32e81acb5f0d79f39841f9b71c436594
-size 26376
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_0,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_0,NEXUS_5,1.0,en].png
deleted file mode 100644
index f6fa9fb31f..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_0,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:dbc67150e8d533fd473204fbf4c9360751b8498831c435a06e9ed1525dfa1d7b
-size 21637
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_1,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_1,NEXUS_5,1.0,en].png
deleted file mode 100644
index 16255be86e..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_1,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:09b42b37d3e05cfe60187512403139b305c39d4d3ff59d122d73762a548d01fa
-size 21364
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_3,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_3,NEXUS_5,1.0,en].png
deleted file mode 100644
index 4426f04cce..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_3,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:50b1f5c23b436ca2f6045c4d2a6d14c7902a5f10646ce59522a02c2edc297374
-size 22310
diff --git a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_4,NEXUS_5,1.0,en].png b/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_4,NEXUS_5,1.0,en].png
deleted file mode 100644
index 06fd4deac9..0000000000
--- a/tests/uitests/src/test/snapshots/images/ui_S_t[f.roomdetails.impl.rolesandpermissions_RoomDetailsAdminSettingsView_null_RoomDetailsAdminSettingsView-Night-8_10_null_4,NEXUS_5,1.0,en].png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:1b7f91366d3576553c7dd2bc469290fa094dc4095510bb5e841fa0a9b179e85d
-size 23085
diff --git a/tools/localazy/config.json b/tools/localazy/config.json
index 96f39967a5..b3ad636c86 100644
--- a/tools/localazy/config.json
+++ b/tools/localazy/config.json
@@ -128,17 +128,16 @@
{
"name" : ":features:messages:impl",
"includeRegex" : [
- "room_timeline_.*",
- "screen_room_.*",
- "screen\\.room\\..*",
- "screen_dm_details_.*",
"emoji_picker_category_.*",
- ".*report_content_.*"
- ],
- "excludeRegex" : [
- "screen_room_details_.*",
- "screen_room_member.*",
- "screen_dm_.*"
+ "screen_report_content_.*",
+ "screen_room_attachment.*",
+ "screen_room_encrypted.*",
+ "screen_room_invite.*",
+ "screen\\.room\\.mention.*",
+ "screen_room_message.*",
+ "screen_room_retry.*",
+ "screen_room_timeline.*",
+ "screen_room_typing.*"
]
},
{
diff --git a/tools/localazy/downloadStrings.sh b/tools/localazy/downloadStrings.sh
index 71f103c801..43e916a8a4 100755
--- a/tools/localazy/downloadStrings.sh
+++ b/tools/localazy/downloadStrings.sh
@@ -51,7 +51,7 @@ echo "Moving files from values-id to values-in..."
find . -type d -name 'values-id' -execdir mv {}/translations.xml {}/../values-in/translations.xml \;
echo "Deleting all the folders values-id..."
-find . -type d -name 'values-id' -exec rm -rf {} \;
+find . -type d -name 'values-id' -exec rm -rf {} 2> /dev/null \;
set -e
echo "Removing the generated config"