Merge remote-tracking branch 'origin/develop' into feature/fga/pinned_message_banner_ui
This commit is contained in:
commit
56e1957d3d
193 changed files with 4546 additions and 1696 deletions
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="error_no_compatible_app_found">"Nie znaleziono kompatybilnej aplikacji do obsługi tej akcji."</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="error_no_compatible_app_found">"Nenhum aplicativo compatível foi encontrado para lidar com essa ação."</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="state_event_avatar_changed_too">"(zdjęcie profilowe też zostało zmienione)"</string>
|
||||
<string name="state_event_avatar_url_changed">"%1$s zmienił swoje zdjęcie profilowe"</string>
|
||||
<string name="state_event_avatar_url_changed_by_you">"Zmieniłeś swoje zdjęcie profilowe"</string>
|
||||
<string name="state_event_display_name_changed_from">"%1$s zmienił swoją wyświetlaną nazwę z %2$s na %3$s"</string>
|
||||
<string name="state_event_display_name_changed_from_by_you">"Zmieniłeś swoją wyświetlaną nazwę z %1$s na %2$s"</string>
|
||||
<string name="state_event_display_name_removed">"%1$s usunął swoją wyświetlaną nazwę (byo to %2$s)"</string>
|
||||
<string name="state_event_display_name_removed_by_you">"Usunąłeś swoją wyświetlaną nazwę (było to %1$s)"</string>
|
||||
<string name="state_event_display_name_set">"%1$s ustawił swoją wyświetlaną nazwę na %2$s"</string>
|
||||
<string name="state_event_display_name_set_by_you">"Ustawiłeś swoją wyświetlaną nazwę na %1$s"</string>
|
||||
<string name="state_event_room_avatar_changed">"%1$s zmienił zdjęcie profilowe pokoju"</string>
|
||||
<string name="state_event_room_avatar_changed_by_you">"Zmieniłeś zdjęcie profilowe pokoju"</string>
|
||||
<string name="state_event_room_avatar_removed">"%1$s usunął zdjęcie profilowe pokoju"</string>
|
||||
<string name="state_event_room_avatar_removed_by_you">"Usunąłeś zdjęcie profilowe pokoju"</string>
|
||||
<string name="state_event_room_ban">"%1$s zbanował %2$s"</string>
|
||||
<string name="state_event_room_ban_by_you">"Zbanowałeś %1$s"</string>
|
||||
<string name="state_event_room_created">"%1$s stworzył pokój"</string>
|
||||
<string name="state_event_room_created_by_you">"Stworzyłeś pokój"</string>
|
||||
<string name="state_event_room_invite">"%1$s zaprosił %2$s"</string>
|
||||
<string name="state_event_room_invite_accepted">"%1$s zaakceptował zaproszenie"</string>
|
||||
<string name="state_event_room_invite_accepted_by_you">"Zaakceptowałeś zaproszenie"</string>
|
||||
<string name="state_event_room_invite_by_you">"Zaprosiłeś %1$s"</string>
|
||||
<string name="state_event_room_invite_you">"%1$s zaprosił Cię"</string>
|
||||
<string name="state_event_room_join">"%1$s dołączył do pokoju"</string>
|
||||
<string name="state_event_room_join_by_you">"Dołączyłeś(aś) do pokoju"</string>
|
||||
<string name="state_event_room_knock">"%1$s prosi o możliwość dołączenia"</string>
|
||||
<string name="state_event_room_knock_accepted">"%1$s zezwolił %2$s na dołączenie"</string>
|
||||
<string name="state_event_room_knock_accepted_by_you">"Zezwoliłeś %1$s na dołączenie"</string>
|
||||
<string name="state_event_room_knock_by_you">"Poprosiłeś o możliwość dołączenia"</string>
|
||||
<string name="state_event_room_knock_denied">"%1$s odrzucił prośbę %2$s o dołączenie"</string>
|
||||
<string name="state_event_room_knock_denied_by_you">"Odrzuciłeś prośbę %1$s o dołączenie"</string>
|
||||
<string name="state_event_room_knock_denied_you">"%1$s odrzucił Twoją prośbę o dołączenie"</string>
|
||||
<string name="state_event_room_knock_retracted">"%1$s nie jest już zainteresowany dołączeniem"</string>
|
||||
<string name="state_event_room_knock_retracted_by_you">"Anulowałeś prośbę o dołączenie"</string>
|
||||
<string name="state_event_room_leave">"%1$s opuścił pokój"</string>
|
||||
<string name="state_event_room_leave_by_you">"Opuściłeś pokój"</string>
|
||||
<string name="state_event_room_name_changed">"%1$s zmienił nazwę pokoju na: %2$s"</string>
|
||||
<string name="state_event_room_name_changed_by_you">"Zmieniłeś nazwę pokoju na: %1$s"</string>
|
||||
<string name="state_event_room_name_removed">"%1$s usunął nazwę pokoju"</string>
|
||||
<string name="state_event_room_name_removed_by_you">"Usunąłeś nazwę pokoju"</string>
|
||||
<string name="state_event_room_none">"%1$s nie wprowadził żadnych zmian"</string>
|
||||
<string name="state_event_room_none_by_you">"Nie wprowadzono żadnych zmian"</string>
|
||||
<string name="state_event_room_reject">"%1$s odrzucił zaproszenie"</string>
|
||||
<string name="state_event_room_reject_by_you">"Odrzuciłeś(aś) zaproszenie"</string>
|
||||
<string name="state_event_room_remove">"%1$s usunął %2$s"</string>
|
||||
<string name="state_event_room_remove_by_you">"Usunąłeś %1$s"</string>
|
||||
<string name="state_event_room_third_party_invite">"%1$s wysłał zaproszenie do %2$s, aby dołączył do pokoju"</string>
|
||||
<string name="state_event_room_third_party_invite_by_you">"Wysłano zaproszenie do %1$s, aby dołączył do pokoju"</string>
|
||||
<string name="state_event_room_third_party_revoked_invite">"%1$s cofnął zaproszenie dla %2$s do tego pokoju"</string>
|
||||
<string name="state_event_room_third_party_revoked_invite_by_you">"Odwołano zaproszenie %1$s, aby dołączył do pokoju"</string>
|
||||
<string name="state_event_room_topic_changed">"%1$s zmienił temat na: %2$s"</string>
|
||||
<string name="state_event_room_topic_changed_by_you">"Zmieniłeś temat na: %1$s"</string>
|
||||
<string name="state_event_room_topic_removed">"%1$s usunął temat pokoju"</string>
|
||||
<string name="state_event_room_topic_removed_by_you">"Usunąłeś temat pokoju"</string>
|
||||
<string name="state_event_room_unban">"%1$s odbanował %2$s"</string>
|
||||
<string name="state_event_room_unban_by_you">"Odbanowałeś %1$s"</string>
|
||||
<string name="state_event_room_unknown_membership_change">"%1$s dokonał nieznanej zmiany w swoim członkostwie"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="state_event_avatar_changed_too">"(o avatar também foi alterado)"</string>
|
||||
<string name="state_event_avatar_url_changed">"%1$s mudou seu avatar"</string>
|
||||
<string name="state_event_avatar_url_changed_by_you">"Você mudou seu avatar"</string>
|
||||
<string name="state_event_display_name_changed_from">"%1$s mudou seu nome de exibição de %2$s para %3$s"</string>
|
||||
<string name="state_event_display_name_changed_from_by_you">"Você alterou seu nome de exibição de %1$s para %2$s"</string>
|
||||
<string name="state_event_display_name_removed">"%1$s removeu seu nome de exibição (era %2$s)"</string>
|
||||
<string name="state_event_display_name_removed_by_you">"Você removeu seu nome de exibição (era %1$s)"</string>
|
||||
<string name="state_event_display_name_set">"%1$s definiu seu nome de exibição como %2$s"</string>
|
||||
<string name="state_event_display_name_set_by_you">"Você definiu seu nome de exibição como %1$s"</string>
|
||||
<string name="state_event_room_avatar_changed">"%1$s mudou o avatar da sala"</string>
|
||||
<string name="state_event_room_avatar_changed_by_you">"Você mudou o avatar da sala"</string>
|
||||
<string name="state_event_room_avatar_removed">"%1$s removeu o avatar da sala"</string>
|
||||
<string name="state_event_room_avatar_removed_by_you">"Você removeu o avatar da sala"</string>
|
||||
<string name="state_event_room_ban">"%1$s baniu %2$s"</string>
|
||||
<string name="state_event_room_ban_by_you">"Você baniu %1$s"</string>
|
||||
<string name="state_event_room_created">"%1$s criou a sala"</string>
|
||||
<string name="state_event_room_created_by_you">"Você criou a sala"</string>
|
||||
<string name="state_event_room_invite">"%1$s convidou %2$s"</string>
|
||||
<string name="state_event_room_invite_accepted">"%1$s aceitou o convite"</string>
|
||||
<string name="state_event_room_invite_accepted_by_you">"Você aceitou o convite"</string>
|
||||
<string name="state_event_room_invite_by_you">"Você convidou %1$s"</string>
|
||||
<string name="state_event_room_invite_you">"%1$s convidou você"</string>
|
||||
<string name="state_event_room_join">"%1$s entrou na sala"</string>
|
||||
<string name="state_event_room_join_by_you">"Você entrou na sala"</string>
|
||||
<string name="state_event_room_knock">"%1$s solicitou entrada"</string>
|
||||
<string name="state_event_room_knock_accepted">"%1$s permitiu que o %2$s entrar"</string>
|
||||
<string name="state_event_room_knock_accepted_by_you">"Você permitiu que o %1$s entrasse"</string>
|
||||
<string name="state_event_room_knock_by_you">"Você solicitou entrada"</string>
|
||||
<string name="state_event_room_knock_denied">"%1$s rejeitou a solicitação de %2$s para entrar"</string>
|
||||
<string name="state_event_room_knock_denied_by_you">"Você rejeitou a solicitação de %1$s para entrar"</string>
|
||||
<string name="state_event_room_knock_denied_you">"%1$s rejeitou sua solicitação para entrar"</string>
|
||||
<string name="state_event_room_knock_retracted">"%1$s não está mais interessado em entrar"</string>
|
||||
<string name="state_event_room_knock_retracted_by_you">"Você cancelou seu pedido para entrar"</string>
|
||||
<string name="state_event_room_leave">"%1$s saiu da sala"</string>
|
||||
<string name="state_event_room_leave_by_you">"Você saiu da sala"</string>
|
||||
<string name="state_event_room_name_changed">"%1$s mudou o nome da sala para: %2$s"</string>
|
||||
<string name="state_event_room_name_changed_by_you">"Você mudou o nome da sala para: %1$s"</string>
|
||||
<string name="state_event_room_name_removed">"%1$s removeu o nome da sala"</string>
|
||||
<string name="state_event_room_name_removed_by_you">"Você removeu o nome da sala"</string>
|
||||
<string name="state_event_room_reject">"%1$s rejeitou o convite"</string>
|
||||
<string name="state_event_room_reject_by_you">"Você rejeitou o convite"</string>
|
||||
<string name="state_event_room_remove">"%1$s removido %2$s"</string>
|
||||
<string name="state_event_room_remove_by_you">"Você removeu %1$s"</string>
|
||||
<string name="state_event_room_third_party_invite">"%1$s enviou um convite para %2$s para entrar na sala"</string>
|
||||
<string name="state_event_room_third_party_invite_by_you">"Você enviou um convite para %1$s para entrar na sala"</string>
|
||||
<string name="state_event_room_third_party_revoked_invite">"%1$s revogou o convite para %2$s para entrar na sala"</string>
|
||||
<string name="state_event_room_third_party_revoked_invite_by_you">"Você revogou o convite para %1$s para entrar na sala"</string>
|
||||
<string name="state_event_room_topic_changed">"%1$s mudou o tópico para: %2$s"</string>
|
||||
<string name="state_event_room_topic_changed_by_you">"Você mudou o tópico para: %1$s"</string>
|
||||
<string name="state_event_room_topic_removed">"%1$s removeu o tópico da sala"</string>
|
||||
<string name="state_event_room_topic_removed_by_you">"Você removeu o tópico da sala"</string>
|
||||
<string name="state_event_room_unban">"%1$s desbaniu %2$s"</string>
|
||||
<string name="state_event_room_unban_by_you">"Você desbaniu %1$s"</string>
|
||||
<string name="state_event_room_unknown_membership_change">"%1$s fez uma alteração desconhecida em sua associação"</string>
|
||||
</resources>
|
||||
|
|
@ -19,6 +19,7 @@ package io.element.android.libraries.matrix.api
|
|||
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.core.SessionId
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters
|
||||
|
|
@ -35,6 +36,7 @@ import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
|
|||
import io.element.android.libraries.matrix.api.room.preview.RoomPreview
|
||||
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryService
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||
import io.element.android.libraries.matrix.api.sync.SyncService
|
||||
import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults
|
||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
|
|
@ -65,8 +67,8 @@ interface MatrixClient : Closeable {
|
|||
suspend fun setDisplayName(displayName: String): Result<Unit>
|
||||
suspend fun uploadAvatar(mimeType: String, data: ByteArray): Result<Unit>
|
||||
suspend fun removeAvatar(): Result<Unit>
|
||||
suspend fun joinRoom(roomId: RoomId): Result<Unit>
|
||||
suspend fun joinRoomByIdOrAlias(roomId: RoomId, serverNames: List<String>): Result<Unit>
|
||||
suspend fun joinRoom(roomId: RoomId): Result<RoomSummary?>
|
||||
suspend fun joinRoomByIdOrAlias(roomIdOrAlias: RoomIdOrAlias, serverNames: List<String>): Result<RoomSummary?>
|
||||
suspend fun knockRoom(roomId: RoomId): Result<Unit>
|
||||
fun syncService(): SyncService
|
||||
fun sessionVerificationService(): SessionVerificationService
|
||||
|
|
@ -104,7 +106,6 @@ interface MatrixClient : Closeable {
|
|||
suspend fun trackRecentlyVisitedRoom(roomId: RoomId): Result<Unit>
|
||||
suspend fun getRecentlyVisitedRooms(): Result<List<RoomId>>
|
||||
suspend fun resolveRoomAlias(roomAlias: RoomAlias): Result<ResolvedRoomAlias>
|
||||
suspend fun getRoomPreviewFromRoomId(roomId: RoomId, serverNames: List<String>): Result<RoomPreview>
|
||||
|
||||
/**
|
||||
* Enables or disables the sending queue, according to the given parameter.
|
||||
|
|
@ -132,4 +133,5 @@ interface MatrixClient : Closeable {
|
|||
* Execute generic GET requests through the SDKs internal HTTP client.
|
||||
*/
|
||||
suspend fun getUrl(url: String): Result<String>
|
||||
suspend fun getRoomPreview(roomIdOrAlias: RoomIdOrAlias, serverNames: List<String>): Result<RoomPreview>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -126,6 +126,8 @@ interface MatrixRoom : Closeable {
|
|||
|
||||
suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit>
|
||||
|
||||
suspend fun editMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit>
|
||||
|
||||
suspend fun sendImage(
|
||||
file: File,
|
||||
thumbnailFile: File?,
|
||||
|
|
|
|||
|
|
@ -17,11 +17,11 @@
|
|||
package io.element.android.libraries.matrix.api.room.join
|
||||
|
||||
import im.vector.app.features.analytics.plan.JoinedRoom
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||
|
||||
interface JoinRoom {
|
||||
suspend operator fun invoke(
|
||||
roomId: RoomId,
|
||||
roomIdOrAlias: RoomIdOrAlias,
|
||||
serverNames: List<String>,
|
||||
trigger: JoinedRoom.Trigger,
|
||||
): Result<Unit>
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ data class RoomSummary(
|
|||
val roomId: RoomId,
|
||||
val name: String?,
|
||||
val canonicalAlias: RoomAlias?,
|
||||
val alternativeAliases: List<RoomAlias>,
|
||||
val isDirect: Boolean,
|
||||
val avatarUrl: String?,
|
||||
val lastMessage: RoomMessage?,
|
||||
|
|
@ -44,4 +45,6 @@ data class RoomSummary(
|
|||
val heroes: List<MatrixUser>,
|
||||
) {
|
||||
val lastMessageTimestamp = lastMessage?.originServerTs
|
||||
val aliases: List<RoomAlias>
|
||||
get() = listOfNotNull(canonicalAlias) + alternativeAliases
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,4 +18,5 @@ package io.element.android.libraries.matrix.api.timeline
|
|||
|
||||
sealed class TimelineException : Exception() {
|
||||
data object CannotPaginate : TimelineException()
|
||||
data object EventNotFound : TimelineException()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,12 +37,13 @@ dependencies {
|
|||
debugImplementation(libs.matrix.sdk)
|
||||
}
|
||||
implementation(projects.appconfig)
|
||||
implementation(projects.libraries.di)
|
||||
implementation(projects.libraries.androidutils)
|
||||
implementation(projects.libraries.di)
|
||||
implementation(projects.libraries.featureflag.api)
|
||||
implementation(projects.libraries.network)
|
||||
implementation(projects.libraries.preferences.api)
|
||||
implementation(projects.services.analytics.api)
|
||||
implementation(projects.services.toolbox.api)
|
||||
implementation(projects.libraries.featureflag.api)
|
||||
api(projects.libraries.matrix.api)
|
||||
implementation(libs.dagger)
|
||||
implementation(projects.libraries.core)
|
||||
|
|
|
|||
|
|
@ -24,7 +24,9 @@ import io.element.android.libraries.matrix.api.MatrixClient
|
|||
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters
|
||||
import io.element.android.libraries.matrix.api.createroom.RoomPreset
|
||||
import io.element.android.libraries.matrix.api.createroom.RoomVisibility
|
||||
|
|
@ -41,6 +43,7 @@ import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
|
|||
import io.element.android.libraries.matrix.api.room.preview.RoomPreview
|
||||
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryService
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||
import io.element.android.libraries.matrix.api.sync.SyncService
|
||||
import io.element.android.libraries.matrix.api.sync.SyncState
|
||||
import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults
|
||||
|
|
@ -175,7 +178,7 @@ class RustMatrixClient(
|
|||
val (anonymizedAccessToken, anonymizedRefreshToken) = existingData.anonymizedTokens()
|
||||
clientLog.d(
|
||||
"Removing session data with access token '$anonymizedAccessToken' " +
|
||||
"and refresh token '$anonymizedRefreshToken'."
|
||||
"and refresh token '$anonymizedRefreshToken'."
|
||||
)
|
||||
if (existingData != null) {
|
||||
// Set isTokenValid to false
|
||||
|
|
@ -320,16 +323,23 @@ class RustMatrixClient(
|
|||
|
||||
/**
|
||||
* Wait for the room to be available in the room list.
|
||||
* @param roomId the room id to wait for
|
||||
* @param roomIdOrAlias the room id or alias to wait for
|
||||
* @param timeout the timeout to wait for the room to be available
|
||||
* @throws TimeoutCancellationException if the room is not available after the timeout
|
||||
*/
|
||||
private suspend fun awaitRoom(roomId: RoomId, timeout: Duration) {
|
||||
withTimeout(timeout) {
|
||||
private suspend fun awaitRoom(roomIdOrAlias: RoomIdOrAlias, timeout: Duration): RoomSummary {
|
||||
val predicate: (List<RoomSummary>) -> Boolean = when (roomIdOrAlias) {
|
||||
is RoomIdOrAlias.Alias -> { roomSummaries: List<RoomSummary> ->
|
||||
roomSummaries.flatMap { it.aliases }.contains(roomIdOrAlias.roomAlias)
|
||||
}
|
||||
is RoomIdOrAlias.Id -> { roomSummaries: List<RoomSummary> ->
|
||||
roomSummaries.map { it.roomId }.contains(roomIdOrAlias.roomId)
|
||||
}
|
||||
}
|
||||
return withTimeout(timeout) {
|
||||
roomListService.allRooms.summaries
|
||||
.filter { roomSummaries ->
|
||||
roomSummaries.map { it.roomId }.contains(roomId)
|
||||
}
|
||||
.filter(predicate)
|
||||
.first()
|
||||
.first()
|
||||
}
|
||||
}
|
||||
|
|
@ -373,7 +383,7 @@ class RustMatrixClient(
|
|||
val roomId = RoomId(client.createRoom(rustParams))
|
||||
// Wait to receive the room back from the sync but do not returns failure if it fails.
|
||||
try {
|
||||
awaitRoom(roomId, 30.seconds)
|
||||
awaitRoom(roomId.toRoomIdOrAlias(), 30.seconds)
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "Timeout waiting for the room to be available in the room list")
|
||||
}
|
||||
|
|
@ -424,30 +434,29 @@ class RustMatrixClient(
|
|||
runCatching { client.removeAvatar() }
|
||||
}
|
||||
|
||||
override suspend fun joinRoom(roomId: RoomId): Result<Unit> = withContext(sessionDispatcher) {
|
||||
override suspend fun joinRoom(roomId: RoomId): Result<RoomSummary?> = withContext(sessionDispatcher) {
|
||||
runCatching {
|
||||
client.joinRoomById(roomId.value).destroy()
|
||||
try {
|
||||
awaitRoom(roomId, 10.seconds)
|
||||
awaitRoom(roomId.toRoomIdOrAlias(), 10.seconds)
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "Timeout waiting for the room to be available in the room list")
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun joinRoomByIdOrAlias(
|
||||
roomId: RoomId,
|
||||
serverNames: List<String>,
|
||||
): Result<Unit> = withContext(sessionDispatcher) {
|
||||
override suspend fun joinRoomByIdOrAlias(roomIdOrAlias: RoomIdOrAlias, serverNames: List<String>): Result<RoomSummary?> = withContext(sessionDispatcher) {
|
||||
runCatching {
|
||||
client.joinRoomByIdOrAlias(
|
||||
roomIdOrAlias = roomId.value,
|
||||
roomIdOrAlias = roomIdOrAlias.identifier,
|
||||
serverNames = serverNames,
|
||||
).destroy()
|
||||
try {
|
||||
awaitRoom(roomId, 10.seconds)
|
||||
awaitRoom(roomIdOrAlias, 10.seconds)
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "Timeout waiting for the room to be available in the room list")
|
||||
null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -478,12 +487,12 @@ class RustMatrixClient(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun getRoomPreviewFromRoomId(roomId: RoomId, serverNames: List<String>): Result<RoomPreview> = withContext(sessionDispatcher) {
|
||||
override suspend fun getRoomPreview(roomIdOrAlias: RoomIdOrAlias, serverNames: List<String>): Result<RoomPreview> = withContext(sessionDispatcher) {
|
||||
runCatching {
|
||||
client.getRoomPreviewFromRoomId(
|
||||
roomId = roomId.value,
|
||||
viaServers = serverNames,
|
||||
).let(RoomPreviewMapper::map)
|
||||
when (roomIdOrAlias) {
|
||||
is RoomIdOrAlias.Alias -> client.getRoomPreviewFromRoomAlias(roomIdOrAlias.roomAlias.value)
|
||||
is RoomIdOrAlias.Id -> client.getRoomPreviewFromRoomId(roomIdOrAlias.roomId.value, serverNames)
|
||||
}.let(RoomPreviewMapper::map)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -581,7 +590,7 @@ class RustMatrixClient(
|
|||
var room = getRoom(roomId)
|
||||
if (room == null) {
|
||||
emit(Optional.empty())
|
||||
awaitRoom(roomId, INFINITE)
|
||||
awaitRoom(roomId.toRoomIdOrAlias(), INFINITE)
|
||||
room = getRoom(roomId)
|
||||
}
|
||||
room?.use {
|
||||
|
|
|
|||
|
|
@ -23,10 +23,12 @@ import io.element.android.libraries.matrix.impl.certificates.UserCertificatesPro
|
|||
import io.element.android.libraries.matrix.impl.proxy.ProxyProvider
|
||||
import io.element.android.libraries.matrix.impl.util.anonymizedTokens
|
||||
import io.element.android.libraries.network.useragent.UserAgentProvider
|
||||
import io.element.android.libraries.preferences.api.store.AppPreferencesStore
|
||||
import io.element.android.libraries.sessionstorage.api.SessionData
|
||||
import io.element.android.libraries.sessionstorage.api.SessionStore
|
||||
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.matrix.rustcomponents.sdk.ClientBuilder
|
||||
import org.matrix.rustcomponents.sdk.Session
|
||||
|
|
@ -46,9 +48,18 @@ class RustMatrixClientFactory @Inject constructor(
|
|||
private val proxyProvider: ProxyProvider,
|
||||
private val clock: SystemClock,
|
||||
private val utdTracker: UtdTracker,
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
) {
|
||||
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
|
||||
val client = getBaseClientBuilder(sessionData.sessionPath, sessionData.passphrase)
|
||||
val client = getBaseClientBuilder(
|
||||
sessionPath = sessionData.sessionPath,
|
||||
passphrase = sessionData.passphrase,
|
||||
slidingSync = if (appPreferencesStore.isSimplifiedSlidingSyncEnabledFlow().first()) {
|
||||
ClientBuilderSlidingSync.Simplified
|
||||
} else {
|
||||
ClientBuilderSlidingSync.Restored
|
||||
},
|
||||
)
|
||||
.homeserverUrl(sessionData.homeserverUrl)
|
||||
.username(sessionData.userId)
|
||||
.use { it.build() }
|
||||
|
|
@ -79,6 +90,7 @@ class RustMatrixClientFactory @Inject constructor(
|
|||
sessionPath: String,
|
||||
passphrase: String?,
|
||||
slidingSyncProxy: String? = null,
|
||||
slidingSync: ClientBuilderSlidingSync,
|
||||
): ClientBuilder {
|
||||
return ClientBuilder()
|
||||
.sessionPath(sessionPath)
|
||||
|
|
@ -88,6 +100,13 @@ class RustMatrixClientFactory @Inject constructor(
|
|||
.addRootCertificates(userCertificatesProvider.provides())
|
||||
.autoEnableBackups(true)
|
||||
.autoEnableCrossSigning(true)
|
||||
.run {
|
||||
when (slidingSync) {
|
||||
ClientBuilderSlidingSync.Restored -> this
|
||||
ClientBuilderSlidingSync.Discovered -> requiresSlidingSync()
|
||||
ClientBuilderSlidingSync.Simplified -> simplifiedSlidingSync(true)
|
||||
}
|
||||
}
|
||||
.run {
|
||||
// Workaround for non-nullable proxy parameter in the SDK, since each call to the ClientBuilder returns a new reference we need to keep
|
||||
proxyProvider.provides()?.let { proxy(it) } ?: this
|
||||
|
|
@ -95,6 +114,17 @@ class RustMatrixClientFactory @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
enum class ClientBuilderSlidingSync {
|
||||
// The proxy will be supplied when restoring the Session.
|
||||
Restored,
|
||||
|
||||
// A proxy must be discovered whilst building the session.
|
||||
Discovered,
|
||||
|
||||
// Use Simplified Sliding Sync (discovery isn't a thing yet).
|
||||
Simplified,
|
||||
}
|
||||
|
||||
private fun SessionData.toSession() = Session(
|
||||
accessToken = accessToken,
|
||||
refreshToken = refreshToken,
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ import io.element.android.libraries.matrix.api.auth.OidcDetails
|
|||
import io.element.android.libraries.matrix.api.auth.qrlogin.MatrixQrCodeLoginData
|
||||
import io.element.android.libraries.matrix.api.auth.qrlogin.QrCodeLoginStep
|
||||
import io.element.android.libraries.matrix.api.core.SessionId
|
||||
import io.element.android.libraries.matrix.impl.ClientBuilderSlidingSync
|
||||
import io.element.android.libraries.matrix.impl.RustMatrixClientFactory
|
||||
import io.element.android.libraries.matrix.impl.auth.qrlogin.QrErrorMapper
|
||||
import io.element.android.libraries.matrix.impl.auth.qrlogin.SdkQrCodeLoginData
|
||||
|
|
@ -210,6 +211,7 @@ class RustMatrixAuthenticationService @Inject constructor(
|
|||
sessionPath = sessionPath,
|
||||
passphrase = pendingPassphrase,
|
||||
slidingSyncProxy = AuthenticationConfig.SLIDING_SYNC_PROXY_URL,
|
||||
slidingSync = ClientBuilderSlidingSync.Discovered,
|
||||
)
|
||||
.buildWithQrCode(
|
||||
qrCodeData = (qrCodeData as SdkQrCodeLoginData).rustQrCodeData,
|
||||
|
|
@ -251,8 +253,8 @@ class RustMatrixAuthenticationService @Inject constructor(
|
|||
sessionPath = sessionPath,
|
||||
passphrase = pendingPassphrase,
|
||||
slidingSyncProxy = AuthenticationConfig.SLIDING_SYNC_PROXY_URL,
|
||||
slidingSync = ClientBuilderSlidingSync.Discovered,
|
||||
)
|
||||
.requiresSlidingSync()
|
||||
|
||||
private fun clear() {
|
||||
currentClient?.close()
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ 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.RustTimeline
|
||||
import io.element.android.libraries.matrix.impl.timeline.toRustReceiptType
|
||||
import io.element.android.libraries.matrix.impl.util.MessageEventContent
|
||||
import io.element.android.libraries.matrix.impl.util.mxCallbackFlow
|
||||
import io.element.android.libraries.matrix.impl.widget.RustWidgetDriver
|
||||
import io.element.android.libraries.matrix.impl.widget.generateWidgetWebViewUrl
|
||||
|
|
@ -324,6 +325,14 @@ class RustMatrixRoom(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun editMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> = withContext(roomDispatcher) {
|
||||
runCatching {
|
||||
MessageEventContent.from(body, htmlBody, mentions).use { newContent ->
|
||||
innerRoom.edit(eventId.value, newContent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> {
|
||||
return liveTimeline.sendMessage(body, htmlBody, mentions)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,8 +20,9 @@ import com.squareup.anvil.annotations.ContributesBinding
|
|||
import im.vector.app.features.analytics.plan.JoinedRoom
|
||||
import io.element.android.libraries.di.SessionScope
|
||||
import io.element.android.libraries.matrix.api.MatrixClient
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.room.join.JoinRoom
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||
import io.element.android.libraries.matrix.impl.analytics.toAnalyticsJoinedRoom
|
||||
import io.element.android.services.analytics.api.AnalyticsService
|
||||
import javax.inject.Inject
|
||||
|
|
@ -32,18 +33,30 @@ class DefaultJoinRoom @Inject constructor(
|
|||
private val analyticsService: AnalyticsService,
|
||||
) : JoinRoom {
|
||||
override suspend fun invoke(
|
||||
roomId: RoomId,
|
||||
roomIdOrAlias: RoomIdOrAlias,
|
||||
serverNames: List<String>,
|
||||
trigger: JoinedRoom.Trigger,
|
||||
trigger: JoinedRoom.Trigger
|
||||
): Result<Unit> {
|
||||
return if (serverNames.isEmpty()) {
|
||||
client.joinRoom(roomId)
|
||||
} else {
|
||||
client.joinRoomByIdOrAlias(roomId, serverNames)
|
||||
}.onSuccess {
|
||||
client.getRoom(roomId)?.use { room ->
|
||||
analyticsService.capture(room.toAnalyticsJoinedRoom(trigger))
|
||||
return when (roomIdOrAlias) {
|
||||
is RoomIdOrAlias.Id -> {
|
||||
if (serverNames.isEmpty()) {
|
||||
client.joinRoom(roomIdOrAlias.roomId)
|
||||
} else {
|
||||
client.joinRoomByIdOrAlias(roomIdOrAlias, serverNames)
|
||||
}
|
||||
}
|
||||
is RoomIdOrAlias.Alias -> {
|
||||
client.joinRoomByIdOrAlias(roomIdOrAlias, serverNames = emptyList())
|
||||
}
|
||||
}.onSuccess { roomSummary ->
|
||||
client.captureJoinedRoomAnalytics(roomSummary, trigger)
|
||||
}.map { }
|
||||
}
|
||||
|
||||
private suspend fun MatrixClient.captureJoinedRoomAnalytics(roomSummary: RoomSummary?, trigger: JoinedRoom.Trigger) {
|
||||
if (roomSummary == null) return
|
||||
getRoom(roomSummary.roomId)?.use { room ->
|
||||
analyticsService.capture(room.toAnalyticsJoinedRoom(trigger))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ class RoomSummaryDetailsFactory(private val roomMessageFactory: RoomMessageFacto
|
|||
roomId = RoomId(roomInfo.id),
|
||||
name = roomInfo.displayName,
|
||||
canonicalAlias = roomInfo.canonicalAlias?.let(::RoomAlias),
|
||||
alternativeAliases = roomInfo.alternativeAliases.map(::RoomAlias),
|
||||
isDirect = roomInfo.isDirect,
|
||||
avatarUrl = roomInfo.avatarUrl,
|
||||
numUnreadMentions = roomInfo.numUnreadMentions.toInt(),
|
||||
|
|
|
|||
|
|
@ -42,7 +42,6 @@ import io.element.android.libraries.matrix.impl.media.toMSC3246range
|
|||
import io.element.android.libraries.matrix.impl.poll.toInner
|
||||
import io.element.android.libraries.matrix.impl.room.RoomContentForwarder
|
||||
import io.element.android.libraries.matrix.impl.room.location.toInner
|
||||
import io.element.android.libraries.matrix.impl.room.map
|
||||
import io.element.android.libraries.matrix.impl.timeline.item.event.EventTimelineItemMapper
|
||||
import io.element.android.libraries.matrix.impl.timeline.item.event.TimelineEventContentMapper
|
||||
import io.element.android.libraries.matrix.impl.timeline.item.virtual.VirtualTimelineItemMapper
|
||||
|
|
@ -51,6 +50,7 @@ import io.element.android.libraries.matrix.impl.timeline.postprocessor.LoadingIn
|
|||
import io.element.android.libraries.matrix.impl.timeline.postprocessor.RoomBeginningPostProcessor
|
||||
import io.element.android.libraries.matrix.impl.timeline.postprocessor.TimelineEncryptedHistoryPostProcessor
|
||||
import io.element.android.libraries.matrix.impl.timeline.reply.InReplyToMapper
|
||||
import io.element.android.libraries.matrix.impl.util.MessageEventContent
|
||||
import io.element.android.services.toolbox.api.systemclock.SystemClock
|
||||
import kotlinx.coroutines.CompletableDeferred
|
||||
import kotlinx.coroutines.CoroutineDispatcher
|
||||
|
|
@ -70,12 +70,10 @@ import kotlinx.coroutines.flow.onEach
|
|||
import kotlinx.coroutines.flow.onStart
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.matrix.rustcomponents.sdk.EventTimelineItem
|
||||
import org.matrix.rustcomponents.sdk.FormattedBody
|
||||
import org.matrix.rustcomponents.sdk.MessageFormat
|
||||
import org.matrix.rustcomponents.sdk.RoomMessageEventContentWithoutRelation
|
||||
import org.matrix.rustcomponents.sdk.SendAttachmentJoinHandle
|
||||
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_ui.LiveBackPaginationStatus
|
||||
|
|
@ -266,7 +264,7 @@ class RustTimeline(
|
|||
}
|
||||
|
||||
override suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> = withContext(dispatcher) {
|
||||
messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()).use { content ->
|
||||
MessageEventContent.from(body, htmlBody, mentions).use { content ->
|
||||
runCatching<Unit> {
|
||||
inner.send(content)
|
||||
}
|
||||
|
|
@ -275,20 +273,8 @@ class RustTimeline(
|
|||
|
||||
override suspend fun redactEvent(eventId: EventId?, transactionId: TransactionId?, reason: String?): Result<Boolean> = withContext(dispatcher) {
|
||||
runCatching {
|
||||
when {
|
||||
eventId != null -> {
|
||||
inner.getEventTimelineItemByEventId(eventId.value).use {
|
||||
inner.redactEvent(item = it, reason = reason)
|
||||
}
|
||||
}
|
||||
transactionId != null -> {
|
||||
inner.getEventTimelineItemByTransactionId(transactionId.value).use {
|
||||
inner.redactEvent(item = it, reason = reason)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
error("Either eventId or transactionId must be non-null")
|
||||
}
|
||||
getEventTimelineItem(eventId, transactionId).use { item ->
|
||||
inner.redactEvent(item = item, reason = reason)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -302,26 +288,11 @@ class RustTimeline(
|
|||
): Result<Unit> =
|
||||
withContext(dispatcher) {
|
||||
runCatching<Unit> {
|
||||
when {
|
||||
originalEventId != null -> {
|
||||
inner.getEventTimelineItemByEventId(originalEventId.value).use {
|
||||
inner.edit(
|
||||
newContent = messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()),
|
||||
item = it,
|
||||
)
|
||||
}
|
||||
}
|
||||
transactionId != null -> {
|
||||
inner.getEventTimelineItemByTransactionId(transactionId.value).use {
|
||||
inner.edit(
|
||||
newContent = messageEventContentFromParts(body, htmlBody).withMentions(mentions.map()),
|
||||
item = it,
|
||||
)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
error("Either originalEventId or transactionId must be non null")
|
||||
}
|
||||
getEventTimelineItem(originalEventId, transactionId).use { item ->
|
||||
inner.edit(
|
||||
newContent = MessageEventContent.from(body, htmlBody, mentions),
|
||||
item = item,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -334,7 +305,7 @@ class RustTimeline(
|
|||
fromNotification: Boolean,
|
||||
): Result<Unit> = withContext(dispatcher) {
|
||||
runCatching {
|
||||
val msg = messageEventContentFromParts(body, htmlBody).withMentions(mentions.map())
|
||||
val msg = MessageEventContent.from(body, htmlBody, mentions)
|
||||
inner.sendReply(msg, eventId.value)
|
||||
}
|
||||
}
|
||||
|
|
@ -361,6 +332,20 @@ class RustTimeline(
|
|||
}
|
||||
}
|
||||
|
||||
@Throws
|
||||
private suspend fun getEventTimelineItem(eventId: EventId?, transactionId: TransactionId?): EventTimelineItem {
|
||||
return try {
|
||||
when {
|
||||
eventId != null -> inner.getEventTimelineItemByEventId(eventId.value)
|
||||
transactionId != null -> inner.getEventTimelineItemByTransactionId(transactionId.value)
|
||||
else -> error("Either eventId or transactionId must be non-null")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
Timber.e(e, "Failed to get event timeline item")
|
||||
throw TimelineException.EventNotFound
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun sendVideo(
|
||||
file: File,
|
||||
thumbnailFile: File?,
|
||||
|
|
@ -517,13 +502,6 @@ class RustTimeline(
|
|||
)
|
||||
}
|
||||
|
||||
private fun messageEventContentFromParts(body: String, htmlBody: String?): RoomMessageEventContentWithoutRelation =
|
||||
if (htmlBody != null) {
|
||||
messageEventContentFromHtml(body, htmlBody)
|
||||
} else {
|
||||
messageEventContentFromMarkdown(body)
|
||||
}
|
||||
|
||||
private fun sendAttachment(files: List<File>, handle: () -> SendAttachmentJoinHandle): Result<MediaUploadHandler> {
|
||||
return runCatching {
|
||||
MediaUploadHandlerImpl(files, handle())
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* 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
|
||||
*
|
||||
* https://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.util
|
||||
|
||||
import io.element.android.libraries.matrix.api.room.Mention
|
||||
import io.element.android.libraries.matrix.impl.room.map
|
||||
import org.matrix.rustcomponents.sdk.RoomMessageEventContentWithoutRelation
|
||||
import org.matrix.rustcomponents.sdk.messageEventContentFromHtml
|
||||
import org.matrix.rustcomponents.sdk.messageEventContentFromMarkdown
|
||||
|
||||
/**
|
||||
* Creates a [RoomMessageEventContentWithoutRelation] from a body, an html body and a list of mentions.
|
||||
*/
|
||||
object MessageEventContent {
|
||||
fun from(body: String, htmlBody: String?, mentions: List<Mention>): RoomMessageEventContentWithoutRelation {
|
||||
return if (htmlBody != null) {
|
||||
messageEventContentFromHtml(body, htmlBody)
|
||||
} else {
|
||||
messageEventContentFromMarkdown(body)
|
||||
}.withMentions(mentions.map())
|
||||
}
|
||||
}
|
||||
|
|
@ -20,11 +20,15 @@ import com.google.common.truth.Truth.assertThat
|
|||
import im.vector.app.features.analytics.plan.JoinedRoom
|
||||
import io.element.android.libraries.matrix.api.MatrixClient
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.impl.analytics.toAnalyticsJoinedRoom
|
||||
import io.element.android.libraries.matrix.test.A_ROOM_ALIAS
|
||||
import io.element.android.libraries.matrix.test.A_ROOM_ID
|
||||
import io.element.android.libraries.matrix.test.A_SERVER_LIST
|
||||
import io.element.android.libraries.matrix.test.FakeMatrixClient
|
||||
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||
import io.element.android.libraries.matrix.test.room.aRoomSummaryFilled
|
||||
import io.element.android.services.analytics.test.FakeAnalyticsService
|
||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||
import io.element.android.tests.testutils.lambda.value
|
||||
|
|
@ -33,9 +37,10 @@ import org.junit.Test
|
|||
|
||||
class DefaultJoinRoomTest {
|
||||
@Test
|
||||
fun `when there is no server names, the classic join room API is used`() = runTest {
|
||||
val joinRoomLambda = lambdaRecorder { _: RoomId -> Result.success(Unit) }
|
||||
val joinRoomByIdOrAliasLambda = lambdaRecorder { _: RoomId, _: List<String> -> Result.success(Unit) }
|
||||
fun `when using roomId and there is no server names, the classic join room API is used`() = runTest {
|
||||
val roomSummary = aRoomSummaryFilled()
|
||||
val joinRoomLambda = lambdaRecorder { _: RoomId -> Result.success(roomSummary) }
|
||||
val joinRoomByIdOrAliasLambda = lambdaRecorder { _: RoomIdOrAlias, _: List<String> -> Result.success(roomSummary) }
|
||||
val roomResult = FakeMatrixRoom()
|
||||
val aTrigger = JoinedRoom.Trigger.MobilePermalink
|
||||
val client: MatrixClient = FakeMatrixClient().also {
|
||||
|
|
@ -51,7 +56,7 @@ class DefaultJoinRoomTest {
|
|||
client = client,
|
||||
analyticsService = analyticsService,
|
||||
)
|
||||
sut.invoke(A_ROOM_ID, emptyList(), aTrigger)
|
||||
sut.invoke(A_ROOM_ID.toRoomIdOrAlias(), emptyList(), aTrigger)
|
||||
joinRoomByIdOrAliasLambda
|
||||
.assertions()
|
||||
.isNeverCalled()
|
||||
|
|
@ -67,9 +72,10 @@ class DefaultJoinRoomTest {
|
|||
}
|
||||
|
||||
@Test
|
||||
fun `when server names are available, joinRoomByIdOrAlias API is used`() = runTest {
|
||||
val joinRoomLambda = lambdaRecorder { _: RoomId -> Result.success(Unit) }
|
||||
val joinRoomByIdOrAliasLambda = lambdaRecorder { _: RoomId, _: List<String> -> Result.success(Unit) }
|
||||
fun `when using roomId and server names are available, joinRoomByIdOrAlias API is used`() = runTest {
|
||||
val roomSummary = aRoomSummaryFilled()
|
||||
val joinRoomLambda = lambdaRecorder { _: RoomId -> Result.success(roomSummary) }
|
||||
val joinRoomByIdOrAliasLambda = lambdaRecorder { _: RoomIdOrAlias, _: List<String> -> Result.success(roomSummary) }
|
||||
val roomResult = FakeMatrixRoom()
|
||||
val aTrigger = JoinedRoom.Trigger.MobilePermalink
|
||||
val client: MatrixClient = FakeMatrixClient().also {
|
||||
|
|
@ -85,12 +91,12 @@ class DefaultJoinRoomTest {
|
|||
client = client,
|
||||
analyticsService = analyticsService,
|
||||
)
|
||||
sut.invoke(A_ROOM_ID, A_SERVER_LIST, aTrigger)
|
||||
sut.invoke(A_ROOM_ID.toRoomIdOrAlias(), A_SERVER_LIST, aTrigger)
|
||||
joinRoomByIdOrAliasLambda
|
||||
.assertions()
|
||||
.isCalledOnce()
|
||||
.with(
|
||||
value(A_ROOM_ID),
|
||||
value(A_ROOM_ID.toRoomIdOrAlias()),
|
||||
value(A_SERVER_LIST)
|
||||
)
|
||||
joinRoomLambda
|
||||
|
|
@ -100,4 +106,40 @@ class DefaultJoinRoomTest {
|
|||
roomResult.toAnalyticsJoinedRoom(aTrigger)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `when using roomAlias, joinRoomByIdOrAlias API is used`() = runTest {
|
||||
val roomSummary = aRoomSummaryFilled()
|
||||
val joinRoomLambda = lambdaRecorder { _: RoomId -> Result.success(roomSummary) }
|
||||
val joinRoomByIdOrAliasLambda = lambdaRecorder { _: RoomIdOrAlias, _: List<String> -> Result.success(roomSummary) }
|
||||
val roomResult = FakeMatrixRoom()
|
||||
val aTrigger = JoinedRoom.Trigger.MobilePermalink
|
||||
val client: MatrixClient = FakeMatrixClient().also {
|
||||
it.joinRoomLambda = joinRoomLambda
|
||||
it.joinRoomByIdOrAliasLambda = joinRoomByIdOrAliasLambda
|
||||
it.givenGetRoomResult(
|
||||
roomId = A_ROOM_ID,
|
||||
result = roomResult
|
||||
)
|
||||
}
|
||||
val analyticsService = FakeAnalyticsService()
|
||||
val sut = DefaultJoinRoom(
|
||||
client = client,
|
||||
analyticsService = analyticsService,
|
||||
)
|
||||
sut.invoke(A_ROOM_ALIAS.toRoomIdOrAlias(), A_SERVER_LIST, aTrigger)
|
||||
joinRoomByIdOrAliasLambda
|
||||
.assertions()
|
||||
.isCalledOnce()
|
||||
.with(
|
||||
value(A_ROOM_ALIAS.toRoomIdOrAlias()),
|
||||
value(emptyList<String>())
|
||||
)
|
||||
joinRoomLambda
|
||||
.assertions()
|
||||
.isNeverCalled()
|
||||
assertThat(analyticsService.capturedEvents).containsExactly(
|
||||
roomResult.toAnalyticsJoinedRoom(aTrigger)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ import io.element.android.libraries.matrix.api.MatrixClient
|
|||
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
||||
import io.element.android.libraries.matrix.api.core.RoomAlias
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.core.SessionId
|
||||
import io.element.android.libraries.matrix.api.core.UserId
|
||||
import io.element.android.libraries.matrix.api.createroom.CreateRoomParameters
|
||||
|
|
@ -36,6 +37,7 @@ import io.element.android.libraries.matrix.api.room.alias.ResolvedRoomAlias
|
|||
import io.element.android.libraries.matrix.api.room.preview.RoomPreview
|
||||
import io.element.android.libraries.matrix.api.roomdirectory.RoomDirectoryService
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomListService
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||
import io.element.android.libraries.matrix.api.user.MatrixSearchUserResults
|
||||
import io.element.android.libraries.matrix.api.user.MatrixUser
|
||||
import io.element.android.libraries.matrix.api.verification.SessionVerificationService
|
||||
|
|
@ -80,7 +82,7 @@ class FakeMatrixClient(
|
|||
private val roomDirectoryService: RoomDirectoryService = FakeRoomDirectoryService(),
|
||||
private val accountManagementUrlString: Result<String?> = Result.success(null),
|
||||
private val resolveRoomAliasResult: (RoomAlias) -> Result<ResolvedRoomAlias> = { Result.success(ResolvedRoomAlias(A_ROOM_ID, emptyList())) },
|
||||
private val getRoomPreviewFromRoomIdResult: (RoomId, List<String>) -> Result<RoomPreview> = { _, _ -> Result.failure(AN_EXCEPTION) },
|
||||
private val getRoomPreviewResult: (RoomIdOrAlias, List<String>) -> Result<RoomPreview> = { _, _ -> Result.failure(AN_EXCEPTION) },
|
||||
private val clearCacheLambda: () -> Unit = { lambdaError() },
|
||||
private val userIdServerNameLambda: () -> String = { lambdaError() },
|
||||
private val getUrlLambda: (String) -> Result<String> = { lambdaError() },
|
||||
|
|
@ -108,11 +110,11 @@ class FakeMatrixClient(
|
|||
private var setDisplayNameResult: Result<Unit> = Result.success(Unit)
|
||||
private var uploadAvatarResult: Result<Unit> = Result.success(Unit)
|
||||
private var removeAvatarResult: Result<Unit> = Result.success(Unit)
|
||||
var joinRoomLambda: (RoomId) -> Result<Unit> = {
|
||||
Result.success(Unit)
|
||||
var joinRoomLambda: (RoomId) -> Result<RoomSummary?> = {
|
||||
Result.success(null)
|
||||
}
|
||||
var joinRoomByIdOrAliasLambda: (RoomId, List<String>) -> Result<Unit> = { _, _ ->
|
||||
Result.success(Unit)
|
||||
var joinRoomByIdOrAliasLambda: (RoomIdOrAlias, List<String>) -> Result<RoomSummary?> = { _, _ ->
|
||||
Result.success(null)
|
||||
}
|
||||
var knockRoomLambda: (RoomId) -> Result<Unit> = {
|
||||
Result.success(Unit)
|
||||
|
|
@ -207,10 +209,10 @@ class FakeMatrixClient(
|
|||
return removeAvatarResult
|
||||
}
|
||||
|
||||
override suspend fun joinRoom(roomId: RoomId): Result<Unit> = joinRoomLambda(roomId)
|
||||
override suspend fun joinRoom(roomId: RoomId): Result<RoomSummary?> = joinRoomLambda(roomId)
|
||||
|
||||
override suspend fun joinRoomByIdOrAlias(roomId: RoomId, serverNames: List<String>): Result<Unit> {
|
||||
return joinRoomByIdOrAliasLambda(roomId, serverNames)
|
||||
override suspend fun joinRoomByIdOrAlias(roomIdOrAlias: RoomIdOrAlias, serverNames: List<String>): Result<RoomSummary?> {
|
||||
return joinRoomByIdOrAliasLambda(roomIdOrAlias, serverNames)
|
||||
}
|
||||
|
||||
override suspend fun knockRoom(roomId: RoomId): Result<Unit> = knockRoomLambda(roomId)
|
||||
|
|
@ -297,8 +299,8 @@ class FakeMatrixClient(
|
|||
resolveRoomAliasResult(roomAlias)
|
||||
}
|
||||
|
||||
override suspend fun getRoomPreviewFromRoomId(roomId: RoomId, serverNames: List<String>) = simulateLongTask {
|
||||
getRoomPreviewFromRoomIdResult(roomId, serverNames)
|
||||
override suspend fun getRoomPreview(roomIdOrAlias: RoomIdOrAlias, serverNames: List<String>): Result<RoomPreview> = simulateLongTask {
|
||||
getRoomPreviewResult(roomIdOrAlias, serverNames)
|
||||
}
|
||||
|
||||
override suspend fun getRecentlyVisitedRooms(): Result<List<RoomId>> {
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ import io.element.android.libraries.matrix.test.A_SESSION_ID
|
|||
import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler
|
||||
import io.element.android.libraries.matrix.test.notificationsettings.FakeNotificationSettingsService
|
||||
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
|
||||
import io.element.android.libraries.matrix.test.widget.FakeMatrixWidgetDriver
|
||||
import io.element.android.tests.testutils.lambda.lambdaError
|
||||
import io.element.android.tests.testutils.simulateLongTask
|
||||
import kotlinx.collections.immutable.ImmutableMap
|
||||
import kotlinx.collections.immutable.persistentMapOf
|
||||
|
|
@ -84,126 +84,88 @@ class FakeMatrixRoom(
|
|||
override val activeMemberCount: Long = 234L,
|
||||
val notificationSettingsService: NotificationSettingsService = FakeNotificationSettingsService(),
|
||||
override val liveTimeline: Timeline = FakeTimeline(),
|
||||
private var roomPermalinkResult: () -> Result<String> = { Result.success("room link") },
|
||||
private var eventPermalinkResult: (EventId) -> Result<String> = { Result.success("event link") },
|
||||
var sendCallNotificationIfNeededResult: () -> Result<Unit> = { Result.success(Unit) },
|
||||
canRedactOwn: Boolean = false,
|
||||
canRedactOther: Boolean = false,
|
||||
private var roomPermalinkResult: () -> Result<String> = { lambdaError() },
|
||||
private var eventPermalinkResult: (EventId) -> Result<String> = { lambdaError() },
|
||||
private val sendCallNotificationIfNeededResult: () -> Result<Unit> = { lambdaError() },
|
||||
private val userDisplayNameResult: () -> Result<String?> = { lambdaError() },
|
||||
private val userAvatarUrlResult: () -> Result<String?> = { lambdaError() },
|
||||
private val userRoleResult: () -> Result<RoomMember.Role> = { lambdaError() },
|
||||
private val getUpdatedMemberResult: (UserId) -> Result<RoomMember> = { lambdaError() },
|
||||
private val joinRoomResult: () -> Result<Unit> = { lambdaError() },
|
||||
private val inviteUserResult: (UserId) -> Result<Unit> = { lambdaError() },
|
||||
private val canInviteResult: (UserId) -> Result<Boolean> = { lambdaError() },
|
||||
private val canKickResult: (UserId) -> Result<Boolean> = { lambdaError() },
|
||||
private val canBanResult: (UserId) -> Result<Boolean> = { lambdaError() },
|
||||
private val canRedactOwnResult: (UserId) -> Result<Boolean> = { lambdaError() },
|
||||
private val canRedactOtherResult: (UserId) -> Result<Boolean> = { lambdaError() },
|
||||
private val canSendStateResult: (UserId, StateEventType) -> Result<Boolean> = { _, _ -> lambdaError() },
|
||||
private val canUserSendMessageResult: (UserId, MessageEventType) -> Result<Boolean> = { _, _ -> lambdaError() },
|
||||
private val sendMediaResult: (ProgressCallback?) -> Result<FakeMediaUploadHandler> = { lambdaError() },
|
||||
private val setNameResult: (String) -> Result<Unit> = { lambdaError() },
|
||||
private val setTopicResult: (String) -> Result<Unit> = { lambdaError() },
|
||||
private val updateAvatarResult: (String, ByteArray) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val removeAvatarResult: () -> Result<Unit> = { lambdaError() },
|
||||
private val sendMessageResult: (String, String?, List<Mention>) -> Result<Unit> = { _, _, _ -> lambdaError() },
|
||||
private val updateUserRoleResult: () -> Result<Unit> = { lambdaError() },
|
||||
private val toggleReactionResult: (String, EventId) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val retrySendMessageResult: (TransactionId) -> Result<Unit> = { lambdaError() },
|
||||
private val cancelSendResult: (TransactionId) -> Result<Boolean> = { lambdaError() },
|
||||
private val forwardEventResult: (EventId, List<RoomId>) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val reportContentResult: (EventId, String, UserId?) -> Result<Unit> = { _, _, _ -> lambdaError() },
|
||||
private val kickUserResult: (UserId, String?) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val banUserResult: (UserId, String?) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val unBanUserResult: (UserId, String?) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val sendLocationResult: (String, String, String?, Int?, AssetType?) -> Result<Unit> = { _, _, _, _, _ -> lambdaError() },
|
||||
private val createPollResult: (String, List<String>, Int, PollKind) -> Result<Unit> = { _, _, _, _ -> lambdaError() },
|
||||
private val editPollResult: (EventId, String, List<String>, Int, PollKind) -> Result<Unit> = { _, _, _, _, _ -> lambdaError() },
|
||||
private val sendPollResponseResult: (EventId, List<String>) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val endPollResult: (EventId, String) -> Result<Unit> = { _, _ -> lambdaError() },
|
||||
private val progressCallbackValues: List<Pair<Long, Long>> = emptyList(),
|
||||
private val generateWidgetWebViewUrlResult: (MatrixWidgetSettings, String, String?, String?) -> Result<String> = { _, _, _, _ -> lambdaError() },
|
||||
private val getWidgetDriverResult: (MatrixWidgetSettings) -> Result<MatrixWidgetDriver> = { lambdaError() },
|
||||
private val canUserTriggerRoomNotificationResult: (UserId) -> Result<Boolean> = { lambdaError() },
|
||||
private val canUserJoinCallResult: (UserId) -> Result<Boolean> = { lambdaError() },
|
||||
private val setIsFavoriteResult: (Boolean) -> Result<Unit> = { lambdaError() },
|
||||
private val powerLevelsResult: () -> Result<MatrixRoomPowerLevels> = { lambdaError() },
|
||||
private val updatePowerLevelsResult: () -> Result<Unit> = { lambdaError() },
|
||||
private val resetPowerLevelsResult: () -> Result<MatrixRoomPowerLevels> = { lambdaError() },
|
||||
private val typingNoticeResult: (Boolean) -> Result<Unit> = { lambdaError() },
|
||||
private val leaveRoomLambda: () -> Result<Unit> = { lambdaError() },
|
||||
private val updateMembersResult: () -> Unit = { lambdaError() },
|
||||
private val getMembersResult: (Int) -> Result<List<RoomMember>> = { lambdaError() },
|
||||
private val timelineFocusedOnEventResult: (EventId) -> Result<Timeline> = { lambdaError() },
|
||||
private val setSendQueueEnabledLambda: (Boolean) -> Unit = { _: Boolean -> },
|
||||
private val saveComposerDraftLambda: (ComposerDraft) -> Result<Unit> = { _: ComposerDraft -> Result.success(Unit) },
|
||||
private val loadComposerDraftLambda: () -> Result<ComposerDraft?> = { Result.success<ComposerDraft?>(null) },
|
||||
private val clearComposerDraftLambda: () -> Result<Unit> = { Result.success(Unit) },
|
||||
) : MatrixRoom {
|
||||
private var ignoreResult: Result<Unit> = Result.success(Unit)
|
||||
private var unignoreResult: Result<Unit> = Result.success(Unit)
|
||||
private var userDisplayNameResult = Result.success<String?>(null)
|
||||
private var userAvatarUrlResult = Result.success<String?>(null)
|
||||
private var userRoleResult = Result.success(RoomMember.Role.USER)
|
||||
private var getRoomMemberResult = Result.failure<RoomMember>(IllegalStateException("Member not found"))
|
||||
private var joinRoomResult = Result.success(Unit)
|
||||
private var inviteUserResult = Result.success(Unit)
|
||||
private var canInviteResult = Result.success(true)
|
||||
private var canKickResult = Result.success(false)
|
||||
private var canBanResult = Result.success(false)
|
||||
private var canRedactOwnResult = Result.success(canRedactOwn)
|
||||
private var canRedactOtherResult = Result.success(canRedactOther)
|
||||
private val canSendStateResults = mutableMapOf<StateEventType, Result<Boolean>>()
|
||||
private val canSendEventResults = mutableMapOf<MessageEventType, Result<Boolean>>()
|
||||
private var sendMediaResult = Result.success(FakeMediaUploadHandler())
|
||||
private var setNameResult = Result.success(Unit)
|
||||
private var setTopicResult = Result.success(Unit)
|
||||
private var updateAvatarResult = Result.success(Unit)
|
||||
private var removeAvatarResult = Result.success(Unit)
|
||||
private var updateUserRoleResult = Result.success(Unit)
|
||||
private var toggleReactionResult = Result.success(Unit)
|
||||
private var retrySendMessageResult = Result.success(Unit)
|
||||
private var cancelSendResult = Result.success(true)
|
||||
private var forwardEventResult = Result.success(Unit)
|
||||
private var reportContentResult = Result.success(Unit)
|
||||
private var kickUserResult = Result.success(Unit)
|
||||
private var banUserResult = Result.success(Unit)
|
||||
private var unBanUserResult = Result.success(Unit)
|
||||
private var sendLocationResult = Result.success(Unit)
|
||||
private var createPollResult = Result.success(Unit)
|
||||
private var editPollResult = Result.success(Unit)
|
||||
private var sendPollResponseResult = Result.success(Unit)
|
||||
private var endPollResult = Result.success(Unit)
|
||||
private var progressCallbackValues = emptyList<Pair<Long, Long>>()
|
||||
private var generateWidgetWebViewUrlResult = Result.success("https://call.element.io")
|
||||
private var getWidgetDriverResult: Result<MatrixWidgetDriver> = Result.success(FakeMatrixWidgetDriver())
|
||||
private var canUserTriggerRoomNotificationResult: Result<Boolean> = Result.success(true)
|
||||
private var canUserJoinCallResult: Result<Boolean> = 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<Mention>()
|
||||
private val _typingRecord = mutableListOf<Boolean>()
|
||||
val typingRecord: List<Boolean>
|
||||
get() = _typingRecord
|
||||
|
||||
var sendMediaCount = 0
|
||||
private set
|
||||
|
||||
private val _myReactions = mutableSetOf<String>()
|
||||
val myReactions: Set<String> = _myReactions
|
||||
|
||||
var retrySendMessageCount: Int = 0
|
||||
private set
|
||||
|
||||
var cancelSendCount: Int = 0
|
||||
private set
|
||||
|
||||
var reportedContentCount: Int = 0
|
||||
private set
|
||||
|
||||
private val _sentLocations = mutableListOf<SendLocationInvocation>()
|
||||
val sentLocations: List<SendLocationInvocation> = _sentLocations
|
||||
|
||||
private val _createPollInvocations = mutableListOf<SavePollInvocation>()
|
||||
val createPollInvocations: List<SavePollInvocation> = _createPollInvocations
|
||||
|
||||
private val _editPollInvocations = mutableListOf<SavePollInvocation>()
|
||||
val editPollInvocations: List<SavePollInvocation> = _editPollInvocations
|
||||
|
||||
private val _sendPollResponseInvocations = mutableListOf<SendPollResponseInvocation>()
|
||||
val sendPollResponseInvocations: List<SendPollResponseInvocation> = _sendPollResponseInvocations
|
||||
|
||||
private val _endPollInvocations = mutableListOf<EndPollInvocation>()
|
||||
val endPollInvocations: List<EndPollInvocation> = _endPollInvocations
|
||||
|
||||
var invitedUserId: UserId? = null
|
||||
private set
|
||||
|
||||
var newTopic: String? = null
|
||||
private set
|
||||
|
||||
var newName: String? = null
|
||||
private set
|
||||
|
||||
var newAvatarData: ByteArray? = null
|
||||
private set
|
||||
|
||||
var removedAvatar: Boolean = false
|
||||
private set
|
||||
|
||||
var leaveRoomLambda: (() -> Result<Unit>) = { Result.success(Unit) }
|
||||
|
||||
private val _roomInfoFlow: MutableSharedFlow<MatrixRoomInfo> = MutableSharedFlow(replay = 1)
|
||||
override val roomInfoFlow: Flow<MatrixRoomInfo> = _roomInfoFlow
|
||||
|
||||
fun givenRoomInfo(roomInfo: MatrixRoomInfo) {
|
||||
_roomInfoFlow.tryEmit(roomInfo)
|
||||
}
|
||||
|
||||
private val _roomTypingMembersFlow: MutableSharedFlow<List<UserId>> = MutableSharedFlow(replay = 1)
|
||||
override val roomTypingMembersFlow: Flow<List<UserId>> = _roomTypingMembersFlow
|
||||
|
||||
fun givenRoomTypingMembers(typingMembers: List<UserId>) {
|
||||
_roomTypingMembersFlow.tryEmit(typingMembers)
|
||||
}
|
||||
|
||||
override val membersStateFlow: MutableStateFlow<MatrixRoomMembersState> = MutableStateFlow(MatrixRoomMembersState.Unknown)
|
||||
|
||||
override val roomNotificationSettingsStateFlow: MutableStateFlow<MatrixRoomNotificationSettingsState> =
|
||||
MutableStateFlow(MatrixRoomNotificationSettingsState.Unknown)
|
||||
|
||||
override suspend fun updateMembers() = Unit
|
||||
override suspend fun updateMembers() = updateMembersResult()
|
||||
|
||||
override suspend fun getUpdatedMember(userId: UserId): Result<RoomMember> {
|
||||
return getRoomMemberResult
|
||||
return getUpdatedMemberResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun getMembers(limit: Int): Result<List<RoomMember>> {
|
||||
return Result.success(emptyList())
|
||||
return getMembersResult(limit)
|
||||
}
|
||||
|
||||
override suspend fun updateRoomNotificationSettings(): Result<Unit> = simulateLongTask {
|
||||
|
|
@ -214,76 +176,61 @@ class FakeMatrixRoom(
|
|||
|
||||
override val syncUpdateFlow: StateFlow<Long> = MutableStateFlow(0L)
|
||||
|
||||
private var timelineFocusedOnEventResult: Result<Timeline> = Result.success(FakeTimeline())
|
||||
|
||||
fun givenTimelineFocusedOnEventResult(result: Result<Timeline>) {
|
||||
timelineFocusedOnEventResult = result
|
||||
}
|
||||
|
||||
override suspend fun timelineFocusedOnEvent(eventId: EventId): Result<Timeline> = simulateLongTask {
|
||||
timelineFocusedOnEventResult
|
||||
timelineFocusedOnEventResult(eventId)
|
||||
}
|
||||
|
||||
override suspend fun subscribeToSync() = Unit
|
||||
|
||||
override suspend fun powerLevels(): Result<MatrixRoomPowerLevels> {
|
||||
return powerLevelsResult
|
||||
return powerLevelsResult()
|
||||
}
|
||||
|
||||
override suspend fun updatePowerLevels(matrixRoomPowerLevels: MatrixRoomPowerLevels): Result<Unit> = simulateLongTask {
|
||||
updatePowerLevelsResult
|
||||
updatePowerLevelsResult()
|
||||
}
|
||||
|
||||
override suspend fun resetPowerLevels(): Result<MatrixRoomPowerLevels> = simulateLongTask {
|
||||
resetPowerLevelsResult
|
||||
resetPowerLevelsResult()
|
||||
}
|
||||
|
||||
override fun destroy() = Unit
|
||||
|
||||
override suspend fun userDisplayName(userId: UserId): Result<String?> = simulateLongTask {
|
||||
userDisplayNameResult
|
||||
userDisplayNameResult()
|
||||
}
|
||||
|
||||
override suspend fun userAvatarUrl(userId: UserId): Result<String?> = simulateLongTask {
|
||||
userAvatarUrlResult
|
||||
userAvatarUrlResult()
|
||||
}
|
||||
|
||||
override suspend fun userRole(userId: UserId): Result<RoomMember.Role> {
|
||||
return userRoleResult
|
||||
return userRoleResult()
|
||||
}
|
||||
|
||||
override suspend fun updateUsersRoles(changes: List<UserRoleChange>): Result<Unit> {
|
||||
return updateUserRoleResult
|
||||
return updateUserRoleResult()
|
||||
}
|
||||
|
||||
var editMessageLambda: (EventId, String, String?, List<Mention>) -> Result<Unit> = { _, _, _, _ -> lambdaError() }
|
||||
override suspend fun editMessage(eventId: EventId, body: String, htmlBody: String?, mentions: List<Mention>): Result<Unit> {
|
||||
return editMessageLambda(eventId, body, htmlBody, mentions)
|
||||
}
|
||||
|
||||
override suspend fun sendMessage(body: String, htmlBody: String?, mentions: List<Mention>) = simulateLongTask {
|
||||
sendMessageMentions = mentions
|
||||
Result.success(Unit)
|
||||
sendMessageResult(body, htmlBody, mentions)
|
||||
}
|
||||
|
||||
override suspend fun toggleReaction(emoji: String, eventId: EventId): Result<Unit> {
|
||||
if (toggleReactionResult.isFailure) {
|
||||
// Don't do the toggle if we failed
|
||||
return toggleReactionResult
|
||||
}
|
||||
|
||||
if (_myReactions.contains(emoji)) {
|
||||
_myReactions.remove(emoji)
|
||||
} else {
|
||||
_myReactions.add(emoji)
|
||||
}
|
||||
|
||||
return toggleReactionResult
|
||||
return toggleReactionResult(emoji, eventId)
|
||||
}
|
||||
|
||||
override suspend fun retrySendMessage(transactionId: TransactionId): Result<Unit> {
|
||||
retrySendMessageCount++
|
||||
return retrySendMessageResult
|
||||
return retrySendMessageResult(transactionId)
|
||||
}
|
||||
|
||||
override suspend fun cancelSend(transactionId: TransactionId): Result<Boolean> {
|
||||
cancelSendCount++
|
||||
return cancelSendResult
|
||||
return cancelSendResult(transactionId)
|
||||
}
|
||||
|
||||
override suspend fun getPermalink(): Result<String> {
|
||||
|
|
@ -299,48 +246,47 @@ class FakeMatrixRoom(
|
|||
}
|
||||
|
||||
override suspend fun join(): Result<Unit> {
|
||||
return joinRoomResult
|
||||
return joinRoomResult()
|
||||
}
|
||||
|
||||
override suspend fun inviteUserById(id: UserId): Result<Unit> = simulateLongTask {
|
||||
invitedUserId = id
|
||||
inviteUserResult
|
||||
inviteUserResult(id)
|
||||
}
|
||||
|
||||
override suspend fun canUserBan(userId: UserId): Result<Boolean> {
|
||||
return canBanResult
|
||||
return canBanResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun canUserKick(userId: UserId): Result<Boolean> {
|
||||
return canKickResult
|
||||
return canKickResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun canUserInvite(userId: UserId): Result<Boolean> {
|
||||
return canInviteResult
|
||||
return canInviteResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun canUserRedactOwn(userId: UserId): Result<Boolean> {
|
||||
return canRedactOwnResult
|
||||
return canRedactOwnResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun canUserRedactOther(userId: UserId): Result<Boolean> {
|
||||
return canRedactOtherResult
|
||||
return canRedactOtherResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun canUserSendState(userId: UserId, type: StateEventType): Result<Boolean> {
|
||||
return canSendStateResults[type] ?: Result.failure(IllegalStateException("No fake answer"))
|
||||
return canSendStateResult(userId, type)
|
||||
}
|
||||
|
||||
override suspend fun canUserSendMessage(userId: UserId, type: MessageEventType): Result<Boolean> {
|
||||
return canSendEventResults[type] ?: Result.failure(IllegalStateException("No fake answer"))
|
||||
return canUserSendMessageResult(userId, type)
|
||||
}
|
||||
|
||||
override suspend fun canUserTriggerRoomNotification(userId: UserId): Result<Boolean> {
|
||||
return canUserTriggerRoomNotificationResult
|
||||
return canUserTriggerRoomNotificationResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun canUserJoinCall(userId: UserId): Result<Boolean> {
|
||||
return canUserJoinCallResult
|
||||
return canUserJoinCallResult(userId)
|
||||
}
|
||||
|
||||
override suspend fun sendImage(
|
||||
|
|
@ -376,37 +322,31 @@ class FakeMatrixRoom(
|
|||
): Result<MediaUploadHandler> = fakeSendMedia(progressCallback)
|
||||
|
||||
override suspend fun forwardEvent(eventId: EventId, roomIds: List<RoomId>): Result<Unit> = simulateLongTask {
|
||||
forwardEventResult
|
||||
forwardEventResult(eventId, roomIds)
|
||||
}
|
||||
|
||||
private suspend fun fakeSendMedia(progressCallback: ProgressCallback?): Result<MediaUploadHandler> = simulateLongTask {
|
||||
sendMediaResult.onSuccess {
|
||||
progressCallbackValues.forEach { (current, total) ->
|
||||
progressCallback?.onProgress(current, total)
|
||||
delay(1)
|
||||
}
|
||||
sendMediaCount++
|
||||
progressCallbackValues.forEach { (current, total) ->
|
||||
progressCallback?.onProgress(current, total)
|
||||
delay(1)
|
||||
}
|
||||
sendMediaResult(progressCallback)
|
||||
}
|
||||
|
||||
override suspend fun updateAvatar(mimeType: String, data: ByteArray): Result<Unit> = simulateLongTask {
|
||||
newAvatarData = data
|
||||
updateAvatarResult
|
||||
updateAvatarResult(mimeType, data)
|
||||
}
|
||||
|
||||
override suspend fun removeAvatar(): Result<Unit> = simulateLongTask {
|
||||
removedAvatar = true
|
||||
removeAvatarResult
|
||||
removeAvatarResult()
|
||||
}
|
||||
|
||||
override suspend fun setName(name: String): Result<Unit> = simulateLongTask {
|
||||
newName = name
|
||||
setNameResult
|
||||
setNameResult(name)
|
||||
}
|
||||
|
||||
override suspend fun setTopic(topic: String): Result<Unit> = simulateLongTask {
|
||||
newTopic = topic
|
||||
setTopicResult
|
||||
setTopicResult(topic)
|
||||
}
|
||||
|
||||
override suspend fun reportContent(
|
||||
|
|
@ -414,28 +354,23 @@ class FakeMatrixRoom(
|
|||
reason: String,
|
||||
blockUserId: UserId?
|
||||
): Result<Unit> = simulateLongTask {
|
||||
reportedContentCount++
|
||||
return reportContentResult
|
||||
return reportContentResult(eventId, reason, blockUserId)
|
||||
}
|
||||
|
||||
override suspend fun kickUser(userId: UserId, reason: String?): Result<Unit> {
|
||||
return kickUserResult
|
||||
return kickUserResult(userId, reason)
|
||||
}
|
||||
|
||||
override suspend fun banUser(userId: UserId, reason: String?): Result<Unit> {
|
||||
return banUserResult
|
||||
return banUserResult(userId, reason)
|
||||
}
|
||||
|
||||
override suspend fun unbanUser(userId: UserId, reason: String?): Result<Unit> {
|
||||
return unBanUserResult
|
||||
return unBanUserResult(userId, reason)
|
||||
}
|
||||
|
||||
val setIsFavoriteCalls = mutableListOf<Boolean>()
|
||||
|
||||
override suspend fun setIsFavorite(isFavorite: Boolean): Result<Unit> {
|
||||
return setIsFavoriteResult.also {
|
||||
setIsFavoriteCalls.add(isFavorite)
|
||||
}
|
||||
return setIsFavoriteResult(isFavorite)
|
||||
}
|
||||
|
||||
val markAsReadCalls = mutableListOf<ReceiptType>()
|
||||
|
|
@ -460,8 +395,13 @@ class FakeMatrixRoom(
|
|||
zoomLevel: Int?,
|
||||
assetType: AssetType?,
|
||||
): Result<Unit> = simulateLongTask {
|
||||
_sentLocations.add(SendLocationInvocation(body, geoUri, description, zoomLevel, assetType))
|
||||
return sendLocationResult
|
||||
return sendLocationResult(
|
||||
body,
|
||||
geoUri,
|
||||
description,
|
||||
zoomLevel,
|
||||
assetType,
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun createPoll(
|
||||
|
|
@ -470,8 +410,12 @@ class FakeMatrixRoom(
|
|||
maxSelections: Int,
|
||||
pollKind: PollKind
|
||||
): Result<Unit> = simulateLongTask {
|
||||
_createPollInvocations.add(SavePollInvocation(question, answers, maxSelections, pollKind))
|
||||
return createPollResult
|
||||
return createPollResult(
|
||||
question,
|
||||
answers,
|
||||
maxSelections,
|
||||
pollKind,
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun editPoll(
|
||||
|
|
@ -481,24 +425,27 @@ class FakeMatrixRoom(
|
|||
maxSelections: Int,
|
||||
pollKind: PollKind
|
||||
): Result<Unit> = simulateLongTask {
|
||||
_editPollInvocations.add(SavePollInvocation(question, answers, maxSelections, pollKind))
|
||||
return editPollResult
|
||||
return editPollResult(
|
||||
pollStartId,
|
||||
question,
|
||||
answers,
|
||||
maxSelections,
|
||||
pollKind,
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun sendPollResponse(
|
||||
pollStartId: EventId,
|
||||
answers: List<String>
|
||||
): Result<Unit> = simulateLongTask {
|
||||
_sendPollResponseInvocations.add(SendPollResponseInvocation(pollStartId, answers))
|
||||
return sendPollResponseResult
|
||||
return sendPollResponseResult(pollStartId, answers)
|
||||
}
|
||||
|
||||
override suspend fun endPoll(
|
||||
pollStartId: EventId,
|
||||
text: String
|
||||
): Result<Unit> = simulateLongTask {
|
||||
_endPollInvocations.add(EndPollInvocation(pollStartId, text))
|
||||
return endPollResult
|
||||
return endPollResult(pollStartId, text)
|
||||
}
|
||||
|
||||
override suspend fun sendVoiceMessage(
|
||||
|
|
@ -509,8 +456,7 @@ class FakeMatrixRoom(
|
|||
): Result<MediaUploadHandler> = fakeSendMedia(progressCallback)
|
||||
|
||||
override suspend fun typingNotice(isTyping: Boolean): Result<Unit> {
|
||||
_typingRecord += isTyping
|
||||
return Result.success(Unit)
|
||||
return typingNoticeResult(isTyping)
|
||||
}
|
||||
|
||||
override suspend fun generateWidgetWebViewUrl(
|
||||
|
|
@ -518,228 +464,34 @@ class FakeMatrixRoom(
|
|||
clientId: String,
|
||||
languageTag: String?,
|
||||
theme: String?,
|
||||
): Result<String> = generateWidgetWebViewUrlResult
|
||||
): Result<String> = generateWidgetWebViewUrlResult(
|
||||
widgetSettings,
|
||||
clientId,
|
||||
languageTag,
|
||||
theme,
|
||||
)
|
||||
|
||||
override suspend fun sendCallNotificationIfNeeded(): Result<Unit> {
|
||||
return sendCallNotificationIfNeededResult()
|
||||
}
|
||||
|
||||
var setSendQueueEnabledLambda = { _: Boolean -> }
|
||||
override suspend fun setSendQueueEnabled(enabled: Boolean) = setSendQueueEnabledLambda(enabled)
|
||||
|
||||
var saveComposerDraftLambda = { _: ComposerDraft -> Result.success(Unit) }
|
||||
override suspend fun saveComposerDraft(composerDraft: ComposerDraft) = saveComposerDraftLambda(composerDraft)
|
||||
|
||||
var loadComposerDraftLambda = { Result.success<ComposerDraft?>(null) }
|
||||
override suspend fun loadComposerDraft() = loadComposerDraftLambda()
|
||||
|
||||
var clearComposerDraftLambda = { Result.success(Unit) }
|
||||
override suspend fun clearComposerDraft() = clearComposerDraftLambda()
|
||||
|
||||
override fun getWidgetDriver(widgetSettings: MatrixWidgetSettings): Result<MatrixWidgetDriver> = getWidgetDriverResult
|
||||
override fun getWidgetDriver(widgetSettings: MatrixWidgetSettings): Result<MatrixWidgetDriver> {
|
||||
return getWidgetDriverResult(widgetSettings)
|
||||
}
|
||||
|
||||
fun givenRoomMembersState(state: MatrixRoomMembersState) {
|
||||
membersStateFlow.value = state
|
||||
}
|
||||
|
||||
fun givenGetRoomMemberResult(result: Result<RoomMember>) {
|
||||
getRoomMemberResult = result
|
||||
}
|
||||
|
||||
fun givenUserDisplayNameResult(displayName: Result<String?>) {
|
||||
userDisplayNameResult = displayName
|
||||
}
|
||||
|
||||
fun givenUserAvatarUrlResult(avatarUrl: Result<String?>) {
|
||||
userAvatarUrlResult = avatarUrl
|
||||
}
|
||||
|
||||
fun givenUserRoleResult(role: Result<RoomMember.Role>) {
|
||||
userRoleResult = role
|
||||
}
|
||||
|
||||
fun givenUpdateUserRoleResult(result: Result<Unit>) {
|
||||
updateUserRoleResult = result
|
||||
}
|
||||
|
||||
fun givenJoinRoomResult(result: Result<Unit>) {
|
||||
joinRoomResult = result
|
||||
}
|
||||
|
||||
fun givenCanKickResult(result: Result<Boolean>) {
|
||||
canKickResult = result
|
||||
}
|
||||
|
||||
fun givenCanBanResult(result: Result<Boolean>) {
|
||||
canBanResult = result
|
||||
}
|
||||
|
||||
fun givenInviteUserResult(result: Result<Unit>) {
|
||||
inviteUserResult = result
|
||||
}
|
||||
|
||||
fun givenCanInviteResult(result: Result<Boolean>) {
|
||||
canInviteResult = result
|
||||
}
|
||||
|
||||
fun givenCanSendStateResult(type: StateEventType, result: Result<Boolean>) {
|
||||
canSendStateResults[type] = result
|
||||
}
|
||||
|
||||
fun givenCanSendEventResult(type: MessageEventType, result: Result<Boolean>) {
|
||||
canSendEventResults[type] = result
|
||||
}
|
||||
|
||||
fun givenCanTriggerRoomNotification(result: Result<Boolean>) {
|
||||
canUserTriggerRoomNotificationResult = result
|
||||
}
|
||||
|
||||
fun givenCanUserJoinCall(result: Result<Boolean>) {
|
||||
canUserJoinCallResult = result
|
||||
}
|
||||
|
||||
fun givenIgnoreResult(result: Result<Unit>) {
|
||||
ignoreResult = result
|
||||
}
|
||||
|
||||
fun givenUnIgnoreResult(result: Result<Unit>) {
|
||||
unignoreResult = result
|
||||
}
|
||||
|
||||
fun givenSendMediaResult(result: Result<FakeMediaUploadHandler>) {
|
||||
sendMediaResult = result
|
||||
}
|
||||
|
||||
fun givenUpdateAvatarResult(result: Result<Unit>) {
|
||||
updateAvatarResult = result
|
||||
}
|
||||
|
||||
fun givenRemoveAvatarResult(result: Result<Unit>) {
|
||||
removeAvatarResult = result
|
||||
}
|
||||
|
||||
fun givenSetNameResult(result: Result<Unit>) {
|
||||
setNameResult = result
|
||||
}
|
||||
|
||||
fun givenSetTopicResult(result: Result<Unit>) {
|
||||
setTopicResult = result
|
||||
}
|
||||
|
||||
fun givenToggleReactionResult(result: Result<Unit>) {
|
||||
toggleReactionResult = result
|
||||
}
|
||||
|
||||
fun givenRetrySendMessageResult(result: Result<Unit>) {
|
||||
retrySendMessageResult = result
|
||||
}
|
||||
|
||||
fun givenCancelSendResult(result: Result<Boolean>) {
|
||||
cancelSendResult = result
|
||||
}
|
||||
|
||||
fun givenForwardEventResult(result: Result<Unit>) {
|
||||
forwardEventResult = result
|
||||
}
|
||||
|
||||
fun givenReportContentResult(result: Result<Unit>) {
|
||||
reportContentResult = result
|
||||
}
|
||||
|
||||
fun givenKickUserResult(result: Result<Unit>) {
|
||||
kickUserResult = result
|
||||
}
|
||||
|
||||
fun givenBanUserResult(result: Result<Unit>) {
|
||||
banUserResult = result
|
||||
}
|
||||
|
||||
fun givenUnbanUserResult(result: Result<Unit>) {
|
||||
unBanUserResult = result
|
||||
}
|
||||
|
||||
fun givenSendLocationResult(result: Result<Unit>) {
|
||||
sendLocationResult = result
|
||||
}
|
||||
|
||||
fun givenCreatePollResult(result: Result<Unit>) {
|
||||
createPollResult = result
|
||||
}
|
||||
|
||||
fun givenEditPollResult(result: Result<Unit>) {
|
||||
editPollResult = result
|
||||
}
|
||||
|
||||
fun givenSendPollResponseResult(result: Result<Unit>) {
|
||||
sendPollResponseResult = result
|
||||
}
|
||||
|
||||
fun givenEndPollResult(result: Result<Unit>) {
|
||||
endPollResult = result
|
||||
}
|
||||
|
||||
fun givenProgressCallbackValues(values: List<Pair<Long, Long>>) {
|
||||
progressCallbackValues = values
|
||||
}
|
||||
|
||||
fun givenGenerateWidgetWebViewUrlResult(result: Result<String>) {
|
||||
generateWidgetWebViewUrlResult = result
|
||||
}
|
||||
|
||||
fun givenGetWidgetDriverResult(result: Result<MatrixWidgetDriver>) {
|
||||
getWidgetDriverResult = result
|
||||
}
|
||||
|
||||
fun givenSetIsFavoriteResult(result: Result<Unit>) {
|
||||
setIsFavoriteResult = result
|
||||
}
|
||||
|
||||
fun givenRoomInfo(roomInfo: MatrixRoomInfo) {
|
||||
_roomInfoFlow.tryEmit(roomInfo)
|
||||
}
|
||||
|
||||
fun givenRoomTypingMembers(typingMembers: List<UserId>) {
|
||||
_roomTypingMembersFlow.tryEmit(typingMembers)
|
||||
}
|
||||
|
||||
fun givenPowerLevelsResult(result: Result<MatrixRoomPowerLevels>) {
|
||||
powerLevelsResult = result
|
||||
}
|
||||
|
||||
fun givenUpdatePowerLevelsResult(result: Result<Unit>) {
|
||||
updatePowerLevelsResult = result
|
||||
}
|
||||
|
||||
fun givenResetPowerLevelsResult(result: Result<MatrixRoomPowerLevels>) {
|
||||
resetPowerLevelsResult = result
|
||||
}
|
||||
}
|
||||
|
||||
data class SendLocationInvocation(
|
||||
val body: String,
|
||||
val geoUri: String,
|
||||
val description: String?,
|
||||
val zoomLevel: Int?,
|
||||
val assetType: AssetType?,
|
||||
)
|
||||
|
||||
data class SavePollInvocation(
|
||||
val question: String,
|
||||
val answers: List<String>,
|
||||
val maxSelections: Int,
|
||||
val pollKind: PollKind,
|
||||
)
|
||||
|
||||
data class SendPollResponseInvocation(
|
||||
val pollStartId: EventId,
|
||||
val answers: List<String>,
|
||||
)
|
||||
|
||||
data class EndPollInvocation(
|
||||
val pollStartId: EventId,
|
||||
val text: String,
|
||||
)
|
||||
|
||||
fun aRoomInfo(
|
||||
id: RoomId = A_ROOM_ID,
|
||||
name: String? = A_ROOM_NAME,
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ fun aRoomSummary(
|
|||
notificationMode: RoomNotificationMode? = null,
|
||||
inviter: RoomMember? = null,
|
||||
canonicalAlias: RoomAlias? = null,
|
||||
alternativeAliases: List<RoomAlias> = emptyList(),
|
||||
hasRoomCall: Boolean = false,
|
||||
isDm: Boolean = false,
|
||||
isFavorite: Boolean = false,
|
||||
|
|
@ -86,6 +87,7 @@ fun aRoomSummary(
|
|||
userDefinedNotificationMode = notificationMode,
|
||||
inviter = inviter,
|
||||
canonicalAlias = canonicalAlias,
|
||||
alternativeAliases = alternativeAliases,
|
||||
hasRoomCall = hasRoomCall,
|
||||
isDm = isDm,
|
||||
isFavorite = isFavorite,
|
||||
|
|
|
|||
|
|
@ -17,18 +17,18 @@
|
|||
package io.element.android.libraries.matrix.test.room.join
|
||||
|
||||
import im.vector.app.features.analytics.plan.JoinedRoom
|
||||
import io.element.android.libraries.matrix.api.core.RoomId
|
||||
import io.element.android.libraries.matrix.api.core.RoomIdOrAlias
|
||||
import io.element.android.libraries.matrix.api.room.join.JoinRoom
|
||||
import io.element.android.tests.testutils.simulateLongTask
|
||||
|
||||
class FakeJoinRoom(
|
||||
var lambda: (RoomId, List<String>, JoinedRoom.Trigger) -> Result<Unit>
|
||||
var lambda: (RoomIdOrAlias, List<String>, JoinedRoom.Trigger) -> Result<Unit>
|
||||
) : JoinRoom {
|
||||
override suspend fun invoke(
|
||||
roomId: RoomId,
|
||||
roomIdOrAlias: RoomIdOrAlias,
|
||||
serverNames: List<String>,
|
||||
trigger: JoinedRoom.Trigger,
|
||||
): Result<Unit> = simulateLongTask {
|
||||
lambda(roomId, serverNames, trigger)
|
||||
lambda(roomIdOrAlias, serverNames, trigger)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ fun aRoomSummaryDetails(
|
|||
roomId: RoomId = RoomId("!room:domain"),
|
||||
name: String? = "roomName",
|
||||
canonicalAlias: RoomAlias? = null,
|
||||
alternativeAliases: List<RoomAlias> = emptyList(),
|
||||
isDirect: Boolean = true,
|
||||
avatarUrl: String? = null,
|
||||
lastMessage: RoomMessage? = null,
|
||||
|
|
@ -56,6 +57,7 @@ fun aRoomSummaryDetails(
|
|||
roomId = roomId,
|
||||
name = name,
|
||||
canonicalAlias = canonicalAlias,
|
||||
alternativeAliases = alternativeAliases,
|
||||
isDirect = isDirect,
|
||||
avatarUrl = avatarUrl,
|
||||
lastMessage = lastMessage,
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_invites_invited_you">"%1$s (%2$s) zaprosił Cię"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="screen_invites_invited_you">"%1$s(%2$s) convidou você"</string>
|
||||
</resources>
|
||||
|
|
@ -40,6 +40,7 @@ android {
|
|||
|
||||
testImplementation(projects.libraries.matrix.test)
|
||||
testImplementation(projects.libraries.mediaupload.test)
|
||||
testImplementation(projects.tests.testutils)
|
||||
testImplementation(libs.test.junit)
|
||||
testImplementation(libs.test.truth)
|
||||
testImplementation(libs.coroutines.test)
|
||||
|
|
|
|||
|
|
@ -19,9 +19,12 @@ package io.element.android.libraries.mediaupload.api
|
|||
import android.net.Uri
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import io.element.android.libraries.core.mimetype.MimeTypes
|
||||
import io.element.android.libraries.matrix.api.core.ProgressCallback
|
||||
import io.element.android.libraries.matrix.api.room.MatrixRoom
|
||||
import io.element.android.libraries.matrix.test.media.FakeMediaUploadHandler
|
||||
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||
import io.element.android.libraries.mediaupload.test.FakeMediaPreProcessor
|
||||
import io.element.android.tests.testutils.lambda.lambdaRecorder
|
||||
import kotlinx.coroutines.ExperimentalCoroutinesApi
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.test.StandardTestDispatcher
|
||||
|
|
@ -46,13 +49,17 @@ class MediaSenderTest {
|
|||
|
||||
@Test
|
||||
fun `given an attachment when sending it the MatrixRoom will call sendMedia`() = runTest {
|
||||
val room = FakeMatrixRoom()
|
||||
val sendMediaResult = lambdaRecorder<ProgressCallback?, Result<FakeMediaUploadHandler>> {
|
||||
Result.success(FakeMediaUploadHandler())
|
||||
}
|
||||
val room = FakeMatrixRoom(
|
||||
sendMediaResult = sendMediaResult
|
||||
)
|
||||
val sender = aMediaSender(room = room)
|
||||
|
||||
val uri = Uri.parse("content://image.jpg")
|
||||
sender.sendMedia(uri = uri, mimeType = MimeTypes.Jpeg, compressIfPossible = true)
|
||||
|
||||
assertThat(room.sendMediaCount).isEqualTo(1)
|
||||
sendMediaResult.assertions().isCalledOnce()
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -70,9 +77,9 @@ class MediaSenderTest {
|
|||
|
||||
@Test
|
||||
fun `given a failure in the media upload when sending the whole process fails`() = runTest {
|
||||
val room = FakeMatrixRoom().apply {
|
||||
givenSendMediaResult(Result.failure(Exception()))
|
||||
}
|
||||
val room = FakeMatrixRoom(
|
||||
sendMediaResult = { Result.failure(Exception()) }
|
||||
)
|
||||
val sender = aMediaSender(room = room)
|
||||
|
||||
val uri = Uri.parse("content://image.jpg")
|
||||
|
|
@ -84,7 +91,9 @@ class MediaSenderTest {
|
|||
@OptIn(ExperimentalCoroutinesApi::class)
|
||||
@Test
|
||||
fun `given a cancellation in the media upload when sending the job is cancelled`() = runTest(StandardTestDispatcher()) {
|
||||
val room = FakeMatrixRoom()
|
||||
val room = FakeMatrixRoom(
|
||||
sendMediaResult = { Result.success(FakeMediaUploadHandler()) }
|
||||
)
|
||||
val sender = aMediaSender(room = room)
|
||||
val sendJob = launch {
|
||||
val uri = Uri.parse("content://image.jpg")
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="dialog_permission_camera">"Aby umożliwić aplikacji korzystanie z aparatu, prosimy o udzielenie zezwolenia w ustawieniach systemowych."</string>
|
||||
<string name="dialog_permission_generic">"Proszę nadać uprawnienia w ustawieniach systemowych."</string>
|
||||
<string name="dialog_permission_microphone">"Aby umożliwić aplikacji korzystanie z mikrofonu, prosimy o udzielenie zezwolenia w ustawieniach systemowych."</string>
|
||||
<string name="dialog_permission_notification">"Aby aplikacja mogła wyświetlać powiadomienia, udziel uprawnienia w ustawieniach systemowych."</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="dialog_permission_camera">"Para permitir que o aplicativo use a câmera, conceda a permissão nas configurações do sistema."</string>
|
||||
<string name="dialog_permission_generic">"Por favor, conceda a permissão nas configurações do sistema."</string>
|
||||
<string name="dialog_permission_microphone">"Para permitir que o aplicativo use o microfone, conceda a permissão nas configurações do sistema."</string>
|
||||
<string name="dialog_permission_notification">"Para permitir que o aplicativo exiba notificações, conceda a permissão nas configurações do sistema."</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="troubleshoot_notifications_test_check_permission_title">"Verifique as permissões"</string>
|
||||
</resources>
|
||||
|
|
@ -28,5 +28,8 @@ interface AppPreferencesStore {
|
|||
suspend fun setTheme(theme: String)
|
||||
fun getThemeFlow(): Flow<String?>
|
||||
|
||||
suspend fun setSimplifiedSlidingSyncEnabled(enabled: Boolean)
|
||||
fun isSimplifiedSlidingSyncEnabledFlow(): Flow<Boolean>
|
||||
|
||||
suspend fun reset()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(na
|
|||
private val developerModeKey = booleanPreferencesKey("developerMode")
|
||||
private val customElementCallBaseUrlKey = stringPreferencesKey("elementCallBaseUrl")
|
||||
private val themeKey = stringPreferencesKey("theme")
|
||||
private val simplifiedSlidingSyncKey = booleanPreferencesKey("useSimplifiedSlidingSync")
|
||||
|
||||
@ContributesBinding(AppScope::class)
|
||||
class DefaultAppPreferencesStore @Inject constructor(
|
||||
|
|
@ -87,6 +88,18 @@ class DefaultAppPreferencesStore @Inject constructor(
|
|||
}
|
||||
}
|
||||
|
||||
override suspend fun setSimplifiedSlidingSyncEnabled(enabled: Boolean) {
|
||||
store.edit { prefs ->
|
||||
prefs[simplifiedSlidingSyncKey] = enabled
|
||||
}
|
||||
}
|
||||
|
||||
override fun isSimplifiedSlidingSyncEnabledFlow(): Flow<Boolean> {
|
||||
return store.data.map { prefs ->
|
||||
prefs[simplifiedSlidingSyncKey] ?: false
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun reset() {
|
||||
store.edit { it.clear() }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,10 +24,12 @@ class InMemoryAppPreferencesStore(
|
|||
isDeveloperModeEnabled: Boolean = false,
|
||||
customElementCallBaseUrl: String? = null,
|
||||
theme: String? = null,
|
||||
simplifiedSlidingSyncEnabled: Boolean = false
|
||||
) : AppPreferencesStore {
|
||||
private val isDeveloperModeEnabled = MutableStateFlow(isDeveloperModeEnabled)
|
||||
private val customElementCallBaseUrl = MutableStateFlow(customElementCallBaseUrl)
|
||||
private val theme = MutableStateFlow(theme)
|
||||
private val simplifiedSlidingSyncEnabled = MutableStateFlow(simplifiedSlidingSyncEnabled)
|
||||
|
||||
override suspend fun setDeveloperModeEnabled(enabled: Boolean) {
|
||||
isDeveloperModeEnabled.value = enabled
|
||||
|
|
@ -53,6 +55,14 @@ class InMemoryAppPreferencesStore(
|
|||
return theme
|
||||
}
|
||||
|
||||
override suspend fun setSimplifiedSlidingSyncEnabled(enabled: Boolean) {
|
||||
simplifiedSlidingSyncEnabled.value = enabled
|
||||
}
|
||||
|
||||
override fun isSimplifiedSlidingSyncEnabledFlow(): Flow<Boolean> {
|
||||
return simplifiedSlidingSyncEnabled
|
||||
}
|
||||
|
||||
override suspend fun reset() {
|
||||
// No op
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
<item quantity="other">"%d მოწვევები"</item>
|
||||
</plurals>
|
||||
<string name="notification_invite_body">"მოგიწვიათ ჩატში"</string>
|
||||
<string name="notification_mentioned_you_body">"მოგახსენათ: %1$s"</string>
|
||||
<string name="notification_new_messages">"ახალი შეტყობინებები"</string>
|
||||
<plurals name="notification_new_messages_for_room">
|
||||
<item quantity="one">"%d ახალი მესიჯი"</item>
|
||||
|
|
|
|||
59
libraries/push/impl/src/main/res/values-pl/translations.xml
Normal file
59
libraries/push/impl/src/main/res/values-pl/translations.xml
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="notification_channel_call">"Zadzwoń"</string>
|
||||
<string name="notification_channel_listening_for_events">"Nasłuchiwanie wydarzeń"</string>
|
||||
<string name="notification_channel_noisy">"Głośne powiadomienia"</string>
|
||||
<string name="notification_channel_ringing_calls">"Dzwoniące połączenia"</string>
|
||||
<string name="notification_channel_silent">"Ciche powiadomienia"</string>
|
||||
<plurals name="notification_compat_summary_line_for_room">
|
||||
<item quantity="one">"%1$s: %2$d wiadomość"</item>
|
||||
<item quantity="few">"%1$s: %2$d wiadomości"</item>
|
||||
<item quantity="many">"%1$s: %2$d wiadomości"</item>
|
||||
</plurals>
|
||||
<plurals name="notification_compat_summary_title">
|
||||
<item quantity="one">"%d powiadomienie"</item>
|
||||
<item quantity="few">"%d powiadomienia"</item>
|
||||
<item quantity="many">"%d powiadomień"</item>
|
||||
</plurals>
|
||||
<string name="notification_fallback_content">"Powiadomienie"</string>
|
||||
<string name="notification_incoming_call">"Przychodzące połączenie"</string>
|
||||
<string name="notification_inline_reply_failed">"** Nie udało się wysłać - proszę otworzyć pokój"</string>
|
||||
<string name="notification_invitation_action_join">"Dołącz"</string>
|
||||
<string name="notification_invitation_action_reject">"Odrzuć"</string>
|
||||
<plurals name="notification_invitations">
|
||||
<item quantity="one">"%d zaproszenie"</item>
|
||||
<item quantity="few">"%d zaproszenia"</item>
|
||||
<item quantity="many">"%d zaproszeń"</item>
|
||||
</plurals>
|
||||
<string name="notification_invite_body">"Zaprosił(a) cię do czatu"</string>
|
||||
<string name="notification_mentioned_you_body">"Wspomniano o Tobie: %1$s"</string>
|
||||
<string name="notification_new_messages">"Nowe wiadomości"</string>
|
||||
<plurals name="notification_new_messages_for_room">
|
||||
<item quantity="one">"%d nowa wiadomość"</item>
|
||||
<item quantity="few">"%d nowe wiadomości"</item>
|
||||
<item quantity="many">"%d nowych wiadomości"</item>
|
||||
</plurals>
|
||||
<string name="notification_reaction_body">"Zareagował z %1$s"</string>
|
||||
<string name="notification_room_action_quick_reply">"Szybka odpowiedź"</string>
|
||||
<string name="notification_room_invite_body">"Zaprosił Cię do dołączenia do pokoju"</string>
|
||||
<string name="notification_sender_me">"Ja"</string>
|
||||
<string name="notification_test_push_notification_content">"Wyświetlasz powiadomienie! Kliknij mnie!"</string>
|
||||
<string name="notification_ticker_text_dm">"%1$s: %2$s"</string>
|
||||
<string name="notification_ticker_text_group">"%1$s: %2$s %3$s"</string>
|
||||
<plurals name="notification_unread_notified_messages">
|
||||
<item quantity="one">"%d nieprzeczytana wiadomość"</item>
|
||||
<item quantity="few">"%d nieprzeczytane wiadomość"</item>
|
||||
<item quantity="many">"%d nieprzeczytanych wiadomości"</item>
|
||||
</plurals>
|
||||
<string name="notification_unread_notified_messages_and_invitation">"%1$s i %2$s"</string>
|
||||
<string name="notification_unread_notified_messages_in_room">"%1$s w %2$s"</string>
|
||||
<string name="notification_unread_notified_messages_in_room_and_invitation">"%1$s w %2$s i %3$s"</string>
|
||||
<plurals name="notification_unread_notified_messages_in_room_rooms">
|
||||
<item quantity="one">"%d pokój"</item>
|
||||
<item quantity="few">"%d pokoje"</item>
|
||||
<item quantity="many">"%d pokoi"</item>
|
||||
</plurals>
|
||||
<string name="push_distributor_background_sync_android">"Synchronizacja w tle"</string>
|
||||
<string name="push_distributor_firebase_android">"Usługi Google"</string>
|
||||
<string name="push_no_valid_google_play_services_apk_android">"Nie znaleziono usług Google Play. Powiadomienia mogą nie działać prawidłowo."</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="notification_channel_call">"Chamada"</string>
|
||||
<string name="notification_channel_listening_for_events">"Ouvindo eventos"</string>
|
||||
<string name="notification_channel_noisy">"Notificações barulhentas"</string>
|
||||
<string name="notification_channel_silent">"Notificações silenciosas"</string>
|
||||
<plurals name="notification_compat_summary_line_for_room">
|
||||
<item quantity="one">"%1$s: %2$d mensagem"</item>
|
||||
<item quantity="other">"%1$s: %2$d mensagens"</item>
|
||||
</plurals>
|
||||
<plurals name="notification_compat_summary_title">
|
||||
<item quantity="one">"%d notificação"</item>
|
||||
<item quantity="other">"%d notificações"</item>
|
||||
</plurals>
|
||||
<string name="notification_fallback_content">"Notificação"</string>
|
||||
<string name="notification_inline_reply_failed">"** Falha ao enviar - por favor, abra a sala"</string>
|
||||
<string name="notification_invitation_action_join">"Entrar"</string>
|
||||
<string name="notification_invitation_action_reject">"Rejeitar"</string>
|
||||
<plurals name="notification_invitations">
|
||||
<item quantity="one">"%d convite"</item>
|
||||
<item quantity="other">"%d convites"</item>
|
||||
</plurals>
|
||||
<string name="notification_invite_body">"Convidou você para conversar"</string>
|
||||
<string name="notification_new_messages">"Novas mensagens"</string>
|
||||
<plurals name="notification_new_messages_for_room">
|
||||
<item quantity="one">"%d nova mensagem"</item>
|
||||
<item quantity="other">"%d novas mensagens"</item>
|
||||
</plurals>
|
||||
<string name="notification_reaction_body">"Reagiu com %1$s"</string>
|
||||
<string name="notification_room_action_quick_reply">"Resposta rápida"</string>
|
||||
<string name="notification_room_invite_body">"Convidou você para entrar na sala"</string>
|
||||
<string name="notification_sender_me">"Eu"</string>
|
||||
<string name="notification_test_push_notification_content">"Você está visualizando a notificação! Clique em mim!"</string>
|
||||
<string name="notification_ticker_text_dm">"%1$s: %2$s"</string>
|
||||
<string name="notification_ticker_text_group">"%1$s: %2$s %3$s"</string>
|
||||
<plurals name="notification_unread_notified_messages">
|
||||
<item quantity="one">"%d mensagem notificada não lida"</item>
|
||||
<item quantity="other">"%d mensagens notificadas não lidas"</item>
|
||||
</plurals>
|
||||
<string name="notification_unread_notified_messages_and_invitation">"%1$s e %2$s"</string>
|
||||
<string name="notification_unread_notified_messages_in_room">"%1$s em %2$s"</string>
|
||||
<string name="notification_unread_notified_messages_in_room_and_invitation">"%1$s em %2$s e %3$s"</string>
|
||||
<plurals name="notification_unread_notified_messages_in_room_rooms">
|
||||
<item quantity="one">"%d sala"</item>
|
||||
<item quantity="other">"%d salas"</item>
|
||||
</plurals>
|
||||
<string name="push_distributor_background_sync_android">"Sincronização em segundo plano"</string>
|
||||
<string name="push_distributor_firebase_android">"Serviços do Google"</string>
|
||||
<string name="push_no_valid_google_play_services_apk_android">"O Google Play Services não foi encontrado. As notificações podem não funcionar corretamente."</string>
|
||||
<string name="troubleshoot_notifications_test_push_loop_back_failure_2">"Erro: %1$s."</string>
|
||||
</resources>
|
||||
|
|
@ -25,6 +25,7 @@ import io.element.android.libraries.matrix.api.core.SessionId
|
|||
import io.element.android.libraries.matrix.api.core.ThreadId
|
||||
import io.element.android.libraries.matrix.api.core.asEventId
|
||||
import io.element.android.libraries.matrix.api.room.Mention
|
||||
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
|
||||
import io.element.android.libraries.matrix.api.timeline.ReceiptType
|
||||
import io.element.android.libraries.matrix.test.AN_EVENT_ID
|
||||
import io.element.android.libraries.matrix.test.A_MESSAGE
|
||||
|
|
@ -35,6 +36,7 @@ import io.element.android.libraries.matrix.test.FakeMatrixClient
|
|||
import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
|
||||
import io.element.android.libraries.matrix.test.core.aBuildMeta
|
||||
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
|
||||
import io.element.android.libraries.matrix.test.room.aRoomMember
|
||||
import io.element.android.libraries.matrix.test.timeline.FakeTimeline
|
||||
import io.element.android.libraries.preferences.api.store.SessionPreferencesStore
|
||||
import io.element.android.libraries.preferences.api.store.SessionPreferencesStoreFactory
|
||||
|
|
@ -260,7 +262,7 @@ class NotificationBroadcastReceiverHandlerTest {
|
|||
|
||||
@Test
|
||||
fun `Test join room`() = runTest {
|
||||
val joinRoom = lambdaRecorder<RoomId, Result<Unit>> { _ -> Result.success(Unit) }
|
||||
val joinRoom = lambdaRecorder<RoomId, Result<RoomSummary?>> { _ -> Result.success(null) }
|
||||
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
||||
|
|
@ -297,9 +299,9 @@ class NotificationBroadcastReceiverHandlerTest {
|
|||
@Test
|
||||
fun `Test reject room`() = runTest {
|
||||
val leaveRoom = lambdaRecorder<Result<Unit>> { Result.success(Unit) }
|
||||
val matrixRoom = FakeMatrixRoom().apply {
|
||||
val matrixRoom = FakeMatrixRoom(
|
||||
leaveRoomLambda = leaveRoom
|
||||
}
|
||||
)
|
||||
val clearMembershipNotificationForRoomLambda = lambdaRecorder<SessionId, RoomId, Unit> { _, _ -> }
|
||||
val fakeNotificationCleaner = FakeNotificationCleaner(
|
||||
clearMembershipNotificationForRoomLambda = clearMembershipNotificationForRoomLambda,
|
||||
|
|
@ -342,7 +344,8 @@ class NotificationBroadcastReceiverHandlerTest {
|
|||
replyMessageLambda = replyMessage
|
||||
}
|
||||
val matrixRoom = FakeMatrixRoom(
|
||||
liveTimeline = liveTimeline
|
||||
liveTimeline = liveTimeline,
|
||||
getUpdatedMemberResult = { Result.success(aRoomMember()) },
|
||||
)
|
||||
val onNotifiableEventReceivedResult = lambdaRecorder<NotifiableEvent, Unit> { _ -> }
|
||||
val onNotifiableEventReceived = FakeOnNotifiableEventReceived(onNotifiableEventReceivedResult = onNotifiableEventReceivedResult)
|
||||
|
|
@ -400,7 +403,8 @@ class NotificationBroadcastReceiverHandlerTest {
|
|||
replyMessageLambda = replyMessage
|
||||
}
|
||||
val matrixRoom = FakeMatrixRoom(
|
||||
liveTimeline = liveTimeline
|
||||
liveTimeline = liveTimeline,
|
||||
getUpdatedMemberResult = { Result.success(aRoomMember()) },
|
||||
)
|
||||
val onNotifiableEventReceivedResult = lambdaRecorder<NotifiableEvent, Unit> { _ -> }
|
||||
val onNotifiableEventReceived = FakeOnNotifiableEventReceived(onNotifiableEventReceivedResult = onNotifiableEventReceivedResult)
|
||||
|
|
@ -441,7 +445,7 @@ class NotificationBroadcastReceiverHandlerTest {
|
|||
|
||||
private fun TestScope.createNotificationBroadcastReceiverHandler(
|
||||
matrixRoom: FakeMatrixRoom? = FakeMatrixRoom(),
|
||||
joinRoom: (RoomId) -> Result<Unit> = { lambdaError() },
|
||||
joinRoom: (RoomId) -> Result<RoomSummary?> = { lambdaError() },
|
||||
matrixClient: MatrixClient? = FakeMatrixClient().apply {
|
||||
givenGetRoomResult(A_ROOM_ID, matrixRoom)
|
||||
joinRoomLambda = joinRoom
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="rich_text_editor_a11y_add_attachment">"Dodaj załącznik"</string>
|
||||
<string name="rich_text_editor_bullet_list">"Przełącz listę punktową"</string>
|
||||
<string name="rich_text_editor_close_formatting_options">"Zamknij opcje formatowania"</string>
|
||||
<string name="rich_text_editor_code_block">"Przełącz blok kodu"</string>
|
||||
<string name="rich_text_editor_composer_placeholder">"Wiadomość…"</string>
|
||||
<string name="rich_text_editor_create_link">"Utwórz link"</string>
|
||||
<string name="rich_text_editor_edit_link">"Edytuj link"</string>
|
||||
<string name="rich_text_editor_format_bold">"Zastosuj pogrubiony format"</string>
|
||||
<string name="rich_text_editor_format_italic">"Zastosuj format kursywy"</string>
|
||||
<string name="rich_text_editor_format_strikethrough">"Zastosuj format przekreślenia"</string>
|
||||
<string name="rich_text_editor_format_underline">"Zastosuj format podkreślenia"</string>
|
||||
<string name="rich_text_editor_full_screen_toggle">"Przełącz tryb pełnoekranowy"</string>
|
||||
<string name="rich_text_editor_indent">"Wcięcie"</string>
|
||||
<string name="rich_text_editor_inline_code">"Zastosuj format kodu wbudowanego"</string>
|
||||
<string name="rich_text_editor_link">"Wstaw łącze"</string>
|
||||
<string name="rich_text_editor_numbered_list">"Przełącz listę numerowaną"</string>
|
||||
<string name="rich_text_editor_open_compose_options">"Otwórz opcje tworzenia"</string>
|
||||
<string name="rich_text_editor_quote">"Przełącz cytat"</string>
|
||||
<string name="rich_text_editor_remove_link">"Usuń link"</string>
|
||||
<string name="rich_text_editor_unindent">"Bez wcięcia"</string>
|
||||
<string name="rich_text_editor_url_placeholder">"Link"</string>
|
||||
<string name="screen_room_voice_message_tooltip">"Przytrzymaj, aby nagrywać"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="rich_text_editor_a11y_add_attachment">"Adicionar anexo"</string>
|
||||
<string name="rich_text_editor_bullet_list">"Alternar lista de marcadores"</string>
|
||||
<string name="rich_text_editor_close_formatting_options">"Fechar opções de formatação"</string>
|
||||
<string name="rich_text_editor_code_block">"Alternar bloco de código"</string>
|
||||
<string name="rich_text_editor_composer_placeholder">"Mensagem…"</string>
|
||||
<string name="rich_text_editor_create_link">"Criar um link"</string>
|
||||
<string name="rich_text_editor_edit_link">"Editar link"</string>
|
||||
<string name="rich_text_editor_format_bold">"Aplicar negrito"</string>
|
||||
<string name="rich_text_editor_format_italic">"Aplicar formato itálico"</string>
|
||||
<string name="rich_text_editor_format_strikethrough">"Aplicar formato tachado"</string>
|
||||
<string name="rich_text_editor_format_underline">"Aplicar sublinhado"</string>
|
||||
<string name="rich_text_editor_full_screen_toggle">"Alternar o modo de tela cheia"</string>
|
||||
<string name="rich_text_editor_inline_code">"Aplicar formato de código embutido"</string>
|
||||
<string name="rich_text_editor_link">"Definir link"</string>
|
||||
<string name="rich_text_editor_numbered_list">"Alternar lista numerada"</string>
|
||||
<string name="rich_text_editor_open_compose_options">"Abrir opções de composição"</string>
|
||||
<string name="rich_text_editor_quote">"Alternar citação"</string>
|
||||
<string name="rich_text_editor_remove_link">"Remover link"</string>
|
||||
<string name="rich_text_editor_url_placeholder">"Link"</string>
|
||||
<string name="screen_room_voice_message_tooltip">"Segure para gravar"</string>
|
||||
</resources>
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="troubleshoot_notifications_screen_action">"Execute testes"</string>
|
||||
</resources>
|
||||
|
|
@ -82,6 +82,7 @@
|
|||
<string name="action_ok">"Добра"</string>
|
||||
<string name="action_open_settings">"Налады"</string>
|
||||
<string name="action_open_with">"Адкрыць з дапамогай"</string>
|
||||
<string name="action_pin">"Замацаваць"</string>
|
||||
<string name="action_quick_reply">"Хуткі адказ"</string>
|
||||
<string name="action_quote">"Цытата"</string>
|
||||
<string name="action_react">"Рэакцыя"</string>
|
||||
|
|
@ -222,7 +223,7 @@
|
|||
<string name="common_success">"Поспех"</string>
|
||||
<string name="common_suggestions">"Прапановы"</string>
|
||||
<string name="common_syncing">"Сінхранізацыя"</string>
|
||||
<string name="common_system">"Сістэма"</string>
|
||||
<string name="common_system">"Сістэмная"</string>
|
||||
<string name="common_text">"Тэкст"</string>
|
||||
<string name="common_third_party_notices">"Паведамленні трэціх асоб"</string>
|
||||
<string name="common_thread">"Гутарка"</string>
|
||||
|
|
@ -260,6 +261,10 @@
|
|||
<string name="error_missing_microphone_voice_rationale_android">"%1$s не мае дазволу на доступ да вашага мікрафона. Дазвольце доступ да запісу галасавога паведамлення."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Некаторыя паведамленні не былі адпраўлены"</string>
|
||||
<string name="error_unknown">"Выбачце, адбылася памылка"</string>
|
||||
<string name="event_shield_reason_authenticity_not_guaranteed">"Сапраўднасць гэтага зашыфраванага паведамлення не можа быць гарантаваная на гэтай прыладзе."</string>
|
||||
<string name="event_shield_reason_unknown_device">"Зашыфравана невядомай ці выдаленай прыладай."</string>
|
||||
<string name="event_shield_reason_unsigned_device">"Зашыфравана прыладай, не пацверджанай яе ўладальнікам."</string>
|
||||
<string name="event_shield_reason_unverified_identity">"Зашыфравана неправераным карыстальнікам."</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Далучайцеся да мяне %1$s"</string>
|
||||
<string name="invite_friends_text">"Гэй, пагавары са мной у %1$s: %2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
|
|
|
|||
|
|
@ -83,6 +83,7 @@
|
|||
<string name="action_quick_reply">"Schnelle Antwort"</string>
|
||||
<string name="action_quote">"Zitat"</string>
|
||||
<string name="action_react">"Reagieren"</string>
|
||||
<string name="action_reject">"Ablehnen"</string>
|
||||
<string name="action_remove">"Entfernen"</string>
|
||||
<string name="action_reply">"Antworten"</string>
|
||||
<string name="action_reply_in_thread">"Im Thread antworten"</string>
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@
|
|||
<string name="action_ok">"OK"</string>
|
||||
<string name="action_open_settings">"Ρυθμίσεις"</string>
|
||||
<string name="action_open_with">"Άνοιγμα με"</string>
|
||||
<string name="action_pin">"Καρφίτσωμα"</string>
|
||||
<string name="action_quick_reply">"Γρήγορη απάντηση"</string>
|
||||
<string name="action_quote">"Παράθεση"</string>
|
||||
<string name="action_react">"Αντέδρασε"</string>
|
||||
|
|
@ -117,6 +118,7 @@
|
|||
<string name="common_analytics">"Στατιστικά στοιχεία"</string>
|
||||
<string name="common_appearance">"Εμφάνιση"</string>
|
||||
<string name="common_audio">"Ήχος"</string>
|
||||
<string name="common_blocked_users">"Αποκλεισμένοι χρήστες"</string>
|
||||
<string name="common_bubbles">"Φυσαλίδες"</string>
|
||||
<string name="common_call_invite">"Κλήση σε εξέλιξη (δεν υποστηρίζεται)"</string>
|
||||
<string name="common_call_started">"Η κλήση ξεκίνησε"</string>
|
||||
|
|
@ -255,6 +257,10 @@
|
|||
<string name="error_missing_microphone_voice_rationale_android">"Το %1$s δεν έχει άδεια πρόσβασης στο μικρόφωνό σου. Ενεργοποίησε την πρόσβαση για εγγραφή φωνητικού μηνύματος."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Ορισμένα μηνύματα δεν έχουν σταλεί"</string>
|
||||
<string name="error_unknown">"Λυπούμαστε, παρουσιάστηκε σφάλμα"</string>
|
||||
<string name="event_shield_reason_authenticity_not_guaranteed">"Η αυθεντικότητα αυτού του κρυπτογραφημένου μηνύματος δεν είναι εγγυημένη σε αυτήν τη συσκευή."</string>
|
||||
<string name="event_shield_reason_unknown_device">"Κρυπτογραφημένο από άγνωστη ή διαγεγραμμένη συσκευή."</string>
|
||||
<string name="event_shield_reason_unsigned_device">"Κρυπτογραφημένο από μια συσκευή που δεν έχει επαληθευτεί από τον ιδιοκτήτη της."</string>
|
||||
<string name="event_shield_reason_unverified_identity">"Κρυπτογραφημένο από μη επαληθευμένο χρήστη."</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Έλα μαζί μου στο %1$s"</string>
|
||||
<string name="invite_friends_text">"Γεια, μίλα μου στην εφαρμογή %1$s :%2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
|
|
@ -271,6 +277,9 @@
|
|||
<string name="screen_room_member_details_unblock_alert_action">"Άρση αποκλεισμού"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_description">"Θα μπορείς να δεις ξανά όλα τα μηνύματα του."</string>
|
||||
<string name="screen_room_member_details_unblock_user">"Κατάργηση αποκλεισμού χρήστη"</string>
|
||||
<string name="screen_room_pinned_banner_indicator">"%1$s από %2$s"</string>
|
||||
<string name="screen_room_pinned_banner_indicator_description">"%1$s Καρφιτσωμένα μηνύματα"</string>
|
||||
<string name="screen_room_pinned_banner_view_all_button_title">"Προβολή Όλων"</string>
|
||||
<string name="screen_room_title">"Συνομιλία"</string>
|
||||
<string name="screen_share_location_title">"Κοινή χρήση τοποθεσίας"</string>
|
||||
<string name="screen_share_my_location_action">"Κοινή χρήση της τοποθεσίας μου"</string>
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@
|
|||
<string name="action_ok">"OK"</string>
|
||||
<string name="action_open_settings">"Seadistused"</string>
|
||||
<string name="action_open_with">"Ava rakendusega"</string>
|
||||
<string name="action_pin">"Kinnita"</string>
|
||||
<string name="action_quick_reply">"Kiirvastus"</string>
|
||||
<string name="action_quote">"Tsiteeri"</string>
|
||||
<string name="action_react">"Reageeri"</string>
|
||||
|
|
@ -256,6 +257,10 @@ Põhjus: %1$s."</string>
|
|||
<string name="error_missing_microphone_voice_rationale_android">"Rakendusel %1$s puudub õigus sinu nutiseadme mikrofoni kasutada. Järgnevalt anna õigused heli salvestamiseks."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Mõned sõnumid on saatmata"</string>
|
||||
<string name="error_unknown">"Vabandust, ilmnes viga"</string>
|
||||
<string name="event_shield_reason_authenticity_not_guaranteed">"Selle krüptitud sõnumi tõepärasus pole selles seadmes tagatud."</string>
|
||||
<string name="event_shield_reason_unknown_device">"Krüptitud tundmatu või kustutatud seadme poolt."</string>
|
||||
<string name="event_shield_reason_unsigned_device">"Krüptitud seadme poolt, mida tema omanik pole verifitseerinud."</string>
|
||||
<string name="event_shield_reason_unverified_identity">"Krüptitud verifitseerimata kasutaja poolt."</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Liitu minuga rakenduses %1$s"</string>
|
||||
<string name="invite_friends_text">"Hei, suhtle minuga %1$s võrgus: %2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
|
|
@ -272,6 +277,9 @@ Põhjus: %1$s."</string>
|
|||
<string name="screen_room_member_details_unblock_alert_action">"Eemalda blokeering"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_description">"Nüüd näed sa jälle kõiki tema sõnumeid"</string>
|
||||
<string name="screen_room_member_details_unblock_user">"Eemalda kasutajalt blokeering"</string>
|
||||
<string name="screen_room_pinned_banner_indicator">"%1$s / %2$s"</string>
|
||||
<string name="screen_room_pinned_banner_indicator_description">"%1$s kinnitatud sõnumit"</string>
|
||||
<string name="screen_room_pinned_banner_view_all_button_title">"Näita kõiki"</string>
|
||||
<string name="screen_room_title">"Vestlus"</string>
|
||||
<string name="screen_share_location_title">"Jaga asukohta"</string>
|
||||
<string name="screen_share_my_location_action">"Jaga minu asukohta"</string>
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@
|
|||
<string name="action_ok">"Rendben"</string>
|
||||
<string name="action_open_settings">"Beállítások megnyitása"</string>
|
||||
<string name="action_open_with">"Megnyitás a következővel"</string>
|
||||
<string name="action_pin">"Kitűzés"</string>
|
||||
<string name="action_quick_reply">"Gyors válasz"</string>
|
||||
<string name="action_quote">"Idézet"</string>
|
||||
<string name="action_react">"Reakció"</string>
|
||||
|
|
@ -168,6 +169,7 @@ Ok: %1$s."</string>
|
|||
<string name="common_no_results">"Nincs találat"</string>
|
||||
<string name="common_no_room_name">"Nincs szobanév"</string>
|
||||
<string name="common_offline">"Kapcsolat nélkül"</string>
|
||||
<string name="common_open_source_licenses">"Nyílt forráskódú licencek"</string>
|
||||
<string name="common_or">"vagy"</string>
|
||||
<string name="common_password">"Jelszó"</string>
|
||||
<string name="common_people">"Emberek"</string>
|
||||
|
|
@ -255,6 +257,10 @@ Ok: %1$s."</string>
|
|||
<string name="error_missing_microphone_voice_rationale_android">"Az %1$snek nincs engedélye, hogy hozzáférjen a mikrofonhoz. Engedélyezze, hogy tudjon hangüzenetet felvenni."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Néhány üzenet nem került elküldésre"</string>
|
||||
<string name="error_unknown">"Elnézést, hiba történt"</string>
|
||||
<string name="event_shield_reason_authenticity_not_guaranteed">"A titkosított üzenetek valódiságát ezen az eszközön nem lehet garantálni."</string>
|
||||
<string name="event_shield_reason_unknown_device">"Ismeretlen vagy törölt eszköz által titkosítva."</string>
|
||||
<string name="event_shield_reason_unsigned_device">"A tulajdonos által nem ellenőrzött eszköz által titkosítva."</string>
|
||||
<string name="event_shield_reason_unverified_identity">"Nem ellenőrzött felhasználó által titkosítva."</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Csatlakozz hozzám itt: %1$s"</string>
|
||||
<string name="invite_friends_text">"Beszélgessünk itt: %1$s, %2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
|
|
|
|||
|
|
@ -6,17 +6,31 @@
|
|||
<item quantity="other">"%1$d ციფრი ჩაიწერა"</item>
|
||||
</plurals>
|
||||
<string name="a11y_hide_password">"პაროლის დამალვა"</string>
|
||||
<string name="a11y_jump_to_bottom">"ბოლოში გადასვლა"</string>
|
||||
<string name="a11y_notifications_mentions_only">"მხოლოდ მოხსენიებები"</string>
|
||||
<string name="a11y_notifications_muted">"დადუმებულია"</string>
|
||||
<string name="a11y_page_n">"გვერდი %1$d"</string>
|
||||
<string name="a11y_pause">"პაუზა"</string>
|
||||
<string name="a11y_pin_field">"PIN ველი"</string>
|
||||
<string name="a11y_play">"დაკვრა"</string>
|
||||
<string name="a11y_poll">"გამოკითხვა"</string>
|
||||
<string name="a11y_poll_end">"დასრულდა გამოკითხვა"</string>
|
||||
<string name="a11y_react_with">"რეაგირება %1$s-ით"</string>
|
||||
<string name="a11y_react_with_other_emojis">"რეაგირება სხვა ემოჯით"</string>
|
||||
<string name="a11y_read_receipts_multiple">"ნანახია %1$s-სა და %2$s-ს მიერ"</string>
|
||||
<plurals name="a11y_read_receipts_multiple_with_others">
|
||||
<item quantity="one">"წაკითხულია %1$s და %2$d-ს ადამიანის მიერ"</item>
|
||||
<item quantity="other">"წაკითხულია %1$s და %2$d-ს ადამიანის მიერ"</item>
|
||||
</plurals>
|
||||
<string name="a11y_read_receipts_single">"წაიკითხეს: %s"</string>
|
||||
<string name="a11y_read_receipts_tap_to_show_all">"შეეხეთ ყველაფრის საჩვენებლად"</string>
|
||||
<string name="a11y_remove_reaction_with">"%1$s რეაქციის წაშლა"</string>
|
||||
<string name="a11y_send_files">"ფაილების გაგზავნა"</string>
|
||||
<string name="a11y_show_password">"პაროლის ჩვენება"</string>
|
||||
<string name="a11y_start_call">"დარეკვა"</string>
|
||||
<string name="a11y_user_menu">"მომხმარებლის მენიუ"</string>
|
||||
<string name="a11y_voice_message_record">"ხმოვანი შეტყობინების ჩაწერა."</string>
|
||||
<string name="a11y_voice_message_stop_recording">"ჩაწერის შეწყვეტა"</string>
|
||||
<string name="action_accept">"მიღება"</string>
|
||||
<string name="action_add_to_timeline">"დამატება ქრონოლოგიაში"</string>
|
||||
<string name="action_back">"უკან"</string>
|
||||
|
|
@ -33,11 +47,14 @@
|
|||
<string name="action_create">"შექმნა"</string>
|
||||
<string name="action_create_a_room">"ოთახის შექმნა"</string>
|
||||
<string name="action_decline">"უარყოფა"</string>
|
||||
<string name="action_delete_poll">"გამოკითხვის წაშლა"</string>
|
||||
<string name="action_disable">"გამორთვა"</string>
|
||||
<string name="action_done">"მზადაა"</string>
|
||||
<string name="action_edit">"რედაქტირება"</string>
|
||||
<string name="action_edit_poll">"გამოკითხვის რედაქტირება"</string>
|
||||
<string name="action_enable">"ჩართვა"</string>
|
||||
<string name="action_end_poll">"გამოკითხვის დასრულება"</string>
|
||||
<string name="action_enter_pin">"შეიყვანეთ PIN"</string>
|
||||
<string name="action_forgot_password">"დაგავიწყდათ პაროლი?"</string>
|
||||
<string name="action_forward">"გადაგზავნა"</string>
|
||||
<string name="action_invite">"მოწვევა"</string>
|
||||
|
|
@ -49,6 +66,7 @@
|
|||
<string name="action_learn_more">"შეიტყვეთ მეტი"</string>
|
||||
<string name="action_leave">"დატოვება"</string>
|
||||
<string name="action_leave_room">"ოთახის დატოვება"</string>
|
||||
<string name="action_load_more">"მეტის ჩატვირთვა"</string>
|
||||
<string name="action_manage_account">"ანგარიშის მართვა"</string>
|
||||
<string name="action_manage_devices">"მოწყობილობების მართვა"</string>
|
||||
<string name="action_next">"შემდეგი"</string>
|
||||
|
|
@ -82,20 +100,25 @@
|
|||
<string name="action_start_verification">"დადასტურების დაწყება"</string>
|
||||
<string name="action_static_map_load">"დააწკაპუნეთ რუკის ჩასატვირთად"</string>
|
||||
<string name="action_take_photo">"ფოტოს გადაღება"</string>
|
||||
<string name="action_tap_for_options">"შეეხეთ ვარიანტების სანახავად"</string>
|
||||
<string name="action_try_again">"ხელახლა ცდა"</string>
|
||||
<string name="action_view_source">"წყაროს ნახვა"</string>
|
||||
<string name="action_yes">"დიახ"</string>
|
||||
<string name="common_about">"შესახებ"</string>
|
||||
<string name="common_acceptable_use_policy">"მისაღები გამოყენების პოლიტიკა"</string>
|
||||
<string name="common_advanced_settings">"გაფართოებული პარამეტრები"</string>
|
||||
<string name="common_analytics">"ანალიტიკა"</string>
|
||||
<string name="common_appearance">"გარეგნობა"</string>
|
||||
<string name="common_audio">"აუდიო"</string>
|
||||
<string name="common_bubbles">"ბუშტები"</string>
|
||||
<string name="common_chat_backup">"ჩატის სარეზერვო ასლი"</string>
|
||||
<string name="common_copyright">"საავტორო უფლება"</string>
|
||||
<string name="common_creating_room">"ოთახის შექმნა…"</string>
|
||||
<string name="common_current_user_left_room">"დატოვა ოთახი"</string>
|
||||
<string name="common_dark">"მუქი"</string>
|
||||
<string name="common_decryption_error">"გაშიფვრის შეცდომა"</string>
|
||||
<string name="common_developer_options">"დეველოპერის პარამეტრები"</string>
|
||||
<string name="common_direct_chat">"პირდაპირი ჩატი"</string>
|
||||
<string name="common_edited_suffix">"(რედაქტირებულია)"</string>
|
||||
<string name="common_editing">"რედაქტირება"</string>
|
||||
<string name="common_emote">"* %1$s %2$s"</string>
|
||||
|
|
@ -112,6 +135,7 @@
|
|||
<string name="common_install_apk_android">"დააინსტალირეთ APK"</string>
|
||||
<string name="common_invite_unknown_profile">"ეს Matrix ID ვერ მოიძებნა, ამიტომ მოწვევა შეიძლება არ იყოს მიღებული."</string>
|
||||
<string name="common_leaving_room">"ოთახის დატოვება"</string>
|
||||
<string name="common_light">"ღია"</string>
|
||||
<string name="common_link_copied_to_clipboard">"ბმული კოპირებულია გაცვლის ბუფერში"</string>
|
||||
<string name="common_loading">"იტვირთება…"</string>
|
||||
<plurals name="common_member_count">
|
||||
|
|
@ -119,6 +143,7 @@
|
|||
<item quantity="other">"%1$d წევრები"</item>
|
||||
</plurals>
|
||||
<string name="common_message">"შეტყობინება"</string>
|
||||
<string name="common_message_actions">"შეტყობინებაზე მოქმედებები"</string>
|
||||
<string name="common_message_layout">"შეტყობინებების ფორმა"</string>
|
||||
<string name="common_message_removed">"მესიჯი წაშლილია"</string>
|
||||
<string name="common_modern">"თანამედროვე"</string>
|
||||
|
|
@ -146,24 +171,31 @@
|
|||
<string name="common_refreshing">"განახლება…"</string>
|
||||
<string name="common_replying_to">"პასუხი %1$s-ს"</string>
|
||||
<string name="common_report_a_bug">"ხარვეზის შეტყობინება"</string>
|
||||
<string name="common_report_a_problem">"შეტყობინება პრობლემაზე"</string>
|
||||
<string name="common_report_submitted">"რეპორტი გაგზავნილია"</string>
|
||||
<string name="common_rich_text_editor">"მდიდარი ტექსტის რედაქტორი"</string>
|
||||
<string name="common_room">"ოთახი"</string>
|
||||
<string name="common_room_name">"ოთახის სახელი"</string>
|
||||
<string name="common_room_name_placeholder">"მაგ. თქვენი პროექტის სახელი"</string>
|
||||
<string name="common_screen_lock">"ეკრანის დაბლოკვა"</string>
|
||||
<string name="common_search_for_someone">"ვიღაცის ძებნა"</string>
|
||||
<string name="common_search_results">"ძიების შედეგები"</string>
|
||||
<string name="common_security">"უსაფრთხოება"</string>
|
||||
<string name="common_seen_by">"Ნანახი"</string>
|
||||
<string name="common_sending">"იგზავნება…"</string>
|
||||
<string name="common_sending_failed">"გაგზავნა ვერ მოხერხდა"</string>
|
||||
<string name="common_sent">"გაგზავნილი"</string>
|
||||
<string name="common_server_not_supported">"სერვერი არ არის მხარდაჭერილი"</string>
|
||||
<string name="common_server_url">"სერვერის ვებ-მისამართი"</string>
|
||||
<string name="common_settings">"პარამეტრები"</string>
|
||||
<string name="common_shared_location">"გაზიარებული მდებარეობა"</string>
|
||||
<string name="common_signing_out">"გასვლა…"</string>
|
||||
<string name="common_starting_chat">"ჩატის დაწყება…"</string>
|
||||
<string name="common_sticker">"სტიკერი"</string>
|
||||
<string name="common_success">"წარმატება"</string>
|
||||
<string name="common_suggestions">"შეთავაზებები"</string>
|
||||
<string name="common_syncing">"სინქრონიზაცია"</string>
|
||||
<string name="common_system">"სისტემა"</string>
|
||||
<string name="common_text">"ტექსტი"</string>
|
||||
<string name="common_third_party_notices">"მესამე პირის შენიშვნები"</string>
|
||||
<string name="common_thread">"თემა"</string>
|
||||
|
|
@ -178,9 +210,11 @@
|
|||
<string name="common_username">"მომხმარებლის სახელი"</string>
|
||||
<string name="common_verification_cancelled">"დადასტურება გაუქმდა"</string>
|
||||
<string name="common_verification_complete">"დადასტურება დასრულებულია"</string>
|
||||
<string name="common_verify_device">"დაადასტურეთ მოწყობილობა"</string>
|
||||
<string name="common_video">"ვიდეო"</string>
|
||||
<string name="common_voice_message">"ხმოვანი შეტყობინება"</string>
|
||||
<string name="common_waiting">"მოცდა…"</string>
|
||||
<string name="common_waiting_for_decryption_key">"ლოდინი ამ შეტყობინებისათვის"</string>
|
||||
<string name="dialog_title_confirmation">"დადასტურება"</string>
|
||||
<string name="dialog_title_error">"შეცდომა"</string>
|
||||
<string name="dialog_title_success">"წარმატება"</string>
|
||||
|
|
@ -189,6 +223,7 @@
|
|||
<string name="error_failed_loading_map">"ვერ გამოვიდა რუკის %1$s ჩატვირთვა. გთხოვთ, მოგვიანებით სცადოთ."</string>
|
||||
<string name="error_failed_loading_messages">"შეტყობინებების ჩატვირთვა ვერ მოხერხდა"</string>
|
||||
<string name="error_failed_locating_user">"%1$s ვერ მოახერხა თქვენი ადგილმდებარეობაზე წვდომა. გთხოვთ, მოგვიანებით სცადოთ."</string>
|
||||
<string name="error_failed_uploading_voice_message">"თქვენი ხმოვანი შეტყობინების ატვირთვა ვერ მოხერხდა."</string>
|
||||
<string name="error_missing_location_auth_android">"%1$s არ აქვს თქვენს ადგილმდებარეობაზე წვდომის ნებართვა. შეგიძლიათ ჩართოთ წვდომა პარამეტრებში."</string>
|
||||
<string name="error_missing_location_rationale_android">"%1$s არ აქვს თქვენს ადგილმდებარეობაზე წვდომის ნებართვა. ჩართეთ წვდომა ქვემოთ"</string>
|
||||
<string name="error_missing_microphone_voice_rationale_android">"%1$s არ აქვს თქვენს მიკროფონზე წვდომის ნებართვა. ჩართეთ წვდომა ხმოვანი შეტყობინების ჩასაწერად."</string>
|
||||
|
|
|
|||
287
libraries/ui-strings/src/main/res/values-pl/translations.xml
Normal file
287
libraries/ui-strings/src/main/res/values-pl/translations.xml
Normal file
|
|
@ -0,0 +1,287 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="a11y_delete">"Usuń"</string>
|
||||
<plurals name="a11y_digits_entered">
|
||||
<item quantity="one">"Wprowadzono %1$d cyfrę"</item>
|
||||
<item quantity="few">"Wprowadzono %1$d cyfry"</item>
|
||||
<item quantity="many">"Wprowadzono %1$d cyfr"</item>
|
||||
</plurals>
|
||||
<string name="a11y_hide_password">"Ukryj hasło"</string>
|
||||
<string name="a11y_jump_to_bottom">"Przejdź na dół"</string>
|
||||
<string name="a11y_notifications_mentions_only">"Tylko wzmianki"</string>
|
||||
<string name="a11y_notifications_muted">"Wyciszone"</string>
|
||||
<string name="a11y_page_n">"Strona %1$d"</string>
|
||||
<string name="a11y_pause">"Wstrzymaj"</string>
|
||||
<string name="a11y_pin_field">"Pole PIN"</string>
|
||||
<string name="a11y_play">"Odtwórz"</string>
|
||||
<string name="a11y_poll">"Ankieta"</string>
|
||||
<string name="a11y_poll_end">"Zakończona ankieta"</string>
|
||||
<string name="a11y_react_with">"Zareaguj z %1$s"</string>
|
||||
<string name="a11y_react_with_other_emojis">"Zareaguj innym emoji"</string>
|
||||
<string name="a11y_read_receipts_multiple">"Odczytane przez %1$s i %2$s"</string>
|
||||
<plurals name="a11y_read_receipts_multiple_with_others">
|
||||
<item quantity="one">"Odczytano przez %1$s i %2$d inną"</item>
|
||||
<item quantity="few">"Odczytano przez %1$s i %2$d innych"</item>
|
||||
<item quantity="many">"Odczytano przez %1$s i %2$d innych"</item>
|
||||
</plurals>
|
||||
<string name="a11y_read_receipts_single">"Odczytane przez %1$s"</string>
|
||||
<string name="a11y_read_receipts_tap_to_show_all">"Stuknij, aby pokazać wszystkich"</string>
|
||||
<string name="a11y_remove_reaction_with">"Usuń reakcję %1$s"</string>
|
||||
<string name="a11y_send_files">"Wyślij pliki"</string>
|
||||
<string name="a11y_show_password">"Pokaż hasło"</string>
|
||||
<string name="a11y_start_call">"Rozpocznij rozmowę"</string>
|
||||
<string name="a11y_user_menu">"Menu użytkownika"</string>
|
||||
<string name="a11y_voice_message_record">"Nagraj wiadomość głosową."</string>
|
||||
<string name="a11y_voice_message_stop_recording">"Zatrzymaj nagrywanie"</string>
|
||||
<string name="action_accept">"Akceptuj"</string>
|
||||
<string name="action_add_to_timeline">"Dodaj do osi czasu"</string>
|
||||
<string name="action_back">"Wróć"</string>
|
||||
<string name="action_call">"Zadzwoń"</string>
|
||||
<string name="action_cancel">"Anuluj"</string>
|
||||
<string name="action_choose_photo">"Wybierz zdjęcie"</string>
|
||||
<string name="action_clear">"Wyczyść"</string>
|
||||
<string name="action_close">"Zamknij"</string>
|
||||
<string name="action_complete_verification">"Dokończ weryfikację"</string>
|
||||
<string name="action_confirm">"Potwierdź"</string>
|
||||
<string name="action_continue">"Kontynuuj"</string>
|
||||
<string name="action_copy">"Kopiuj"</string>
|
||||
<string name="action_copy_link">"Kopiuj link"</string>
|
||||
<string name="action_copy_link_to_message">"Kopiuj link do wiadomości"</string>
|
||||
<string name="action_create">"Utwórz"</string>
|
||||
<string name="action_create_a_room">"Utwórz pokój"</string>
|
||||
<string name="action_decline">"Odrzuć"</string>
|
||||
<string name="action_delete_poll">"Usuń ankietę"</string>
|
||||
<string name="action_disable">"Wyłącz"</string>
|
||||
<string name="action_discard">"Odrzuć"</string>
|
||||
<string name="action_done">"Gotowe"</string>
|
||||
<string name="action_edit">"Edytuj"</string>
|
||||
<string name="action_edit_poll">"Edytuj ankietę"</string>
|
||||
<string name="action_enable">"Włącz"</string>
|
||||
<string name="action_end_poll">"Zakończ ankietę"</string>
|
||||
<string name="action_enter_pin">"Wprowadź PIN"</string>
|
||||
<string name="action_forgot_password">"Nie pamiętasz hasła?"</string>
|
||||
<string name="action_forward">"Dalej"</string>
|
||||
<string name="action_go_back">"Wróć"</string>
|
||||
<string name="action_invite">"Zaproś"</string>
|
||||
<string name="action_invite_friends">"Zaproś znajomych"</string>
|
||||
<string name="action_invite_friends_to_app">"Zaproś znajomych do %1$s"</string>
|
||||
<string name="action_invite_people_to_app">"Zaproś ludzi do %1$s"</string>
|
||||
<string name="action_invites_list">"Zaproszenia"</string>
|
||||
<string name="action_join">"Dołącz"</string>
|
||||
<string name="action_learn_more">"Dowiedz się więcej"</string>
|
||||
<string name="action_leave">"Opuść"</string>
|
||||
<string name="action_leave_conversation">"Opuść rozmowę"</string>
|
||||
<string name="action_leave_room">"Opuść pokój"</string>
|
||||
<string name="action_load_more">"Załaduj więcej"</string>
|
||||
<string name="action_manage_account">"Zarządzaj kontem"</string>
|
||||
<string name="action_manage_devices">"Zarządzaj urządzeniami"</string>
|
||||
<string name="action_message">"Wiadomość"</string>
|
||||
<string name="action_next">"Dalej"</string>
|
||||
<string name="action_no">"Nie"</string>
|
||||
<string name="action_not_now">"Nie teraz"</string>
|
||||
<string name="action_ok">"Ok"</string>
|
||||
<string name="action_open_settings">"Ustawienia"</string>
|
||||
<string name="action_open_with">"Otwórz za pomocą"</string>
|
||||
<string name="action_quick_reply">"Szybka odpowiedź"</string>
|
||||
<string name="action_quote">"Cytuj"</string>
|
||||
<string name="action_react">"Dodaj reakcję"</string>
|
||||
<string name="action_reject">"Odrzuć"</string>
|
||||
<string name="action_remove">"Usuń"</string>
|
||||
<string name="action_reply">"Odpowiedz"</string>
|
||||
<string name="action_reply_in_thread">"Odpowiedz w wątku"</string>
|
||||
<string name="action_report_bug">"Zgłoś błąd"</string>
|
||||
<string name="action_report_content">"Zgłoś treść"</string>
|
||||
<string name="action_reset">"Resetuj"</string>
|
||||
<string name="action_retry">"Spróbuj ponownie"</string>
|
||||
<string name="action_retry_decryption">"Ponów próbę odszyfrowania"</string>
|
||||
<string name="action_save">"Zapisz"</string>
|
||||
<string name="action_search">"Szukaj"</string>
|
||||
<string name="action_send">"Wyślij"</string>
|
||||
<string name="action_send_message">"Wyślij wiadomość"</string>
|
||||
<string name="action_share">"Udostępnij"</string>
|
||||
<string name="action_share_link">"Udostępnij link"</string>
|
||||
<string name="action_sign_in_again">"Zaloguj się ponownie"</string>
|
||||
<string name="action_signout">"Wyloguj się"</string>
|
||||
<string name="action_signout_anyway">"Wyloguj się mimo to"</string>
|
||||
<string name="action_skip">"Pomiń"</string>
|
||||
<string name="action_start">"Rozpocznij"</string>
|
||||
<string name="action_start_chat">"Rozpocznij chat"</string>
|
||||
<string name="action_start_verification">"Rozpocznij weryfikację"</string>
|
||||
<string name="action_static_map_load">"Stuknij, aby załadować mapę"</string>
|
||||
<string name="action_take_photo">"Zrób zdjęcie"</string>
|
||||
<string name="action_tap_for_options">"Stuknij, by wyświetlić opcje"</string>
|
||||
<string name="action_try_again">"Spróbuj ponownie"</string>
|
||||
<string name="action_view_source">"Wyświetl źródło"</string>
|
||||
<string name="action_yes">"Tak"</string>
|
||||
<string name="common_about">"O programie"</string>
|
||||
<string name="common_acceptable_use_policy">"Polityka użytkowania"</string>
|
||||
<string name="common_advanced_settings">"Ustawienia zaawansowane"</string>
|
||||
<string name="common_analytics">"Analityka"</string>
|
||||
<string name="common_appearance">"Wygląd"</string>
|
||||
<string name="common_audio">"Dźwięk"</string>
|
||||
<string name="common_blocked_users">"Zablokowani użytkownicy"</string>
|
||||
<string name="common_bubbles">"Bąbelki"</string>
|
||||
<string name="common_call_invite">"Rozmowa w trakcie (niewspierane)"</string>
|
||||
<string name="common_call_started">"Rozpoczęto rozmowę"</string>
|
||||
<string name="common_chat_backup">"Backup czatu"</string>
|
||||
<string name="common_copyright">"Copyright"</string>
|
||||
<string name="common_creating_room">"Tworzenie pokoju…"</string>
|
||||
<string name="common_current_user_left_room">"Opuścił pokój"</string>
|
||||
<string name="common_dark">"Ciemny"</string>
|
||||
<string name="common_decryption_error">"Błąd deszyfrowania"</string>
|
||||
<string name="common_developer_options">"Opcje programisty"</string>
|
||||
<string name="common_direct_chat">"Czat prywatny"</string>
|
||||
<string name="common_do_not_show_this_again">"Nie pokazuj ponownie"</string>
|
||||
<string name="common_edited_suffix">"(edytowane)"</string>
|
||||
<string name="common_editing">"Edytowanie"</string>
|
||||
<string name="common_emote">"* %1$s %2$s"</string>
|
||||
<string name="common_encryption_enabled">"Szyfrowanie włączone"</string>
|
||||
<string name="common_enter_your_pin">"Wprowadź kod PIN"</string>
|
||||
<string name="common_error">"Błąd"</string>
|
||||
<string name="common_error_registering_pusher_android">"Wystąpił błąd, możesz nie otrzymać powiadomień nowych wiadomości. Spróbuj naprawić powiadomienia w ustawieniach.
|
||||
|
||||
Powód: %1$s."</string>
|
||||
<string name="common_everyone">"Wszyscy"</string>
|
||||
<string name="common_failed">"Niepowodzenie"</string>
|
||||
<string name="common_favourite">"Ulubione"</string>
|
||||
<string name="common_favourited">"Ulubione"</string>
|
||||
<string name="common_file">"Plik"</string>
|
||||
<string name="common_file_saved_on_disk_android">"Plik zapisany do folderu Pobrane"</string>
|
||||
<string name="common_forward_message">"Przekaż wiadomość"</string>
|
||||
<string name="common_gif">"GIF"</string>
|
||||
<string name="common_image">"Zdjęcie"</string>
|
||||
<string name="common_in_reply_to">"W odpowiedzi do %1$s"</string>
|
||||
<string name="common_install_apk_android">"Zainstaluj APK"</string>
|
||||
<string name="common_invite_unknown_profile">"Nie można znaleźć identyfikatora Matrix ID, zaproszenie mogło nie dotrzeć."</string>
|
||||
<string name="common_leaving_room">"Opuszczanie pokoju"</string>
|
||||
<string name="common_light">"Jasny"</string>
|
||||
<string name="common_link_copied_to_clipboard">"Link został skopiowany do schowka"</string>
|
||||
<string name="common_loading">"Ładowanie…"</string>
|
||||
<plurals name="common_member_count">
|
||||
<item quantity="one">"%1$d członek"</item>
|
||||
<item quantity="few">"%1$d członki"</item>
|
||||
<item quantity="many">"%1$d członków"</item>
|
||||
</plurals>
|
||||
<string name="common_message">"Wiadomość"</string>
|
||||
<string name="common_message_actions">"Akcje wiadomości"</string>
|
||||
<string name="common_message_layout">"Układ wiadomości"</string>
|
||||
<string name="common_message_removed">"Wiadomość usunięta"</string>
|
||||
<string name="common_modern">"Nowoczesny"</string>
|
||||
<string name="common_mute">"Wycisz"</string>
|
||||
<string name="common_no_results">"Brak wyników"</string>
|
||||
<string name="common_no_room_name">"Brak nazwy pokoju"</string>
|
||||
<string name="common_offline">"Offline"</string>
|
||||
<string name="common_open_source_licenses">"Licencje open-source"</string>
|
||||
<string name="common_or">"lub"</string>
|
||||
<string name="common_password">"Hasło"</string>
|
||||
<string name="common_people">"Osoby"</string>
|
||||
<string name="common_permalink">"Link bezpośredni"</string>
|
||||
<string name="common_permission">"Uprawnienie"</string>
|
||||
<string name="common_please_wait">"Proszę czekać…"</string>
|
||||
<string name="common_poll_end_confirmation">"Jesteś pewien, że chcesz zakończyć tę ankietę?"</string>
|
||||
<string name="common_poll_summary">"Ankieta: %1$s"</string>
|
||||
<string name="common_poll_total_votes">"Łączna liczba głosów: %1$s"</string>
|
||||
<string name="common_poll_undisclosed_text">"Wyniki zostaną wyświetlone po zakończeniu ankiety"</string>
|
||||
<plurals name="common_poll_votes_count">
|
||||
<item quantity="one">"%d głos"</item>
|
||||
<item quantity="few">"%d głosy"</item>
|
||||
<item quantity="many">"%d głosów"</item>
|
||||
</plurals>
|
||||
<string name="common_privacy_policy">"Polityka prywatności"</string>
|
||||
<string name="common_reaction">"Reakcja"</string>
|
||||
<string name="common_reactions">"Reakcje"</string>
|
||||
<string name="common_recovery_key">"Klucz przywracania"</string>
|
||||
<string name="common_refreshing">"Odświeżanie…"</string>
|
||||
<string name="common_replying_to">"Odpowiadanie do %1$s"</string>
|
||||
<string name="common_report_a_bug">"Zgłoś błąd"</string>
|
||||
<string name="common_report_a_problem">"Zgłoś problem"</string>
|
||||
<string name="common_report_submitted">"Zgłoszenie wysłane"</string>
|
||||
<string name="common_rich_text_editor">"Bogaty edytor tekstu"</string>
|
||||
<string name="common_room">"Pokój"</string>
|
||||
<string name="common_room_name">"Nazwa pokoju"</string>
|
||||
<string name="common_room_name_placeholder">"np. nazwa projektu"</string>
|
||||
<string name="common_saved_changes">"Zapisano zmiany"</string>
|
||||
<string name="common_saving">"Zapisywanie"</string>
|
||||
<string name="common_screen_lock">"Blokada ekranu"</string>
|
||||
<string name="common_search_for_someone">"Wyszukaj kogoś"</string>
|
||||
<string name="common_search_results">"Wyniki wyszukiwania"</string>
|
||||
<string name="common_security">"Bezpieczeństwo"</string>
|
||||
<string name="common_seen_by">"Wyświetlone przez"</string>
|
||||
<string name="common_send_to">"Wyślij do"</string>
|
||||
<string name="common_sending">"Wysyłanie…"</string>
|
||||
<string name="common_sending_failed">"Błąd wysyłania"</string>
|
||||
<string name="common_sent">"Wysłano"</string>
|
||||
<string name="common_server_not_supported">"Serwer nie jest obsługiwany"</string>
|
||||
<string name="common_server_url">"Adres URL serwera"</string>
|
||||
<string name="common_settings">"Ustawienia"</string>
|
||||
<string name="common_shared_location">"Udostępniona lokalizacja"</string>
|
||||
<string name="common_signing_out">"Wylogowywanie"</string>
|
||||
<string name="common_something_went_wrong">"Coś poszło nie tak"</string>
|
||||
<string name="common_starting_chat">"Rozpoczynanie czatu…"</string>
|
||||
<string name="common_sticker">"Naklejka"</string>
|
||||
<string name="common_success">"Sukces"</string>
|
||||
<string name="common_suggestions">"Sugestie"</string>
|
||||
<string name="common_syncing">"Synchronizuję"</string>
|
||||
<string name="common_system">"System"</string>
|
||||
<string name="common_text">"Tekst"</string>
|
||||
<string name="common_third_party_notices">"Informacje stron trzecich"</string>
|
||||
<string name="common_thread">"Wątek"</string>
|
||||
<string name="common_topic">"Temat"</string>
|
||||
<string name="common_topic_placeholder">"O czym jest ten pokój?"</string>
|
||||
<string name="common_unable_to_decrypt">"Nie można odszyfrować"</string>
|
||||
<string name="common_unable_to_decrypt_no_access">"Nie masz uprawnień do tej wiadomości"</string>
|
||||
<string name="common_unable_to_invite_message">"Nie udało się wysłać zaproszenia do jednego lub więcej użytkowników."</string>
|
||||
<string name="common_unable_to_invite_title">"Nie można wysłać zaproszeń"</string>
|
||||
<string name="common_unlock">"Odblokuj"</string>
|
||||
<string name="common_unmute">"Wyłącz wyciszenie"</string>
|
||||
<string name="common_unsupported_event">"Nieobsługiwane zdarzenie"</string>
|
||||
<string name="common_username">"Nazwa użytkownika"</string>
|
||||
<string name="common_verification_cancelled">"Weryfikacja anulowana"</string>
|
||||
<string name="common_verification_complete">"Weryfikacja zakończona"</string>
|
||||
<string name="common_verify_device">"Weryfikuj urządzenie"</string>
|
||||
<string name="common_video">"Film"</string>
|
||||
<string name="common_voice_message">"Wiadomość głosowa"</string>
|
||||
<string name="common_waiting">"Oczekiwanie…"</string>
|
||||
<string name="common_waiting_for_decryption_key">"Oczekiwanie na tę wiadomość"</string>
|
||||
<string name="dialog_title_confirmation">"Potwierdzenie"</string>
|
||||
<string name="dialog_title_error">"Błąd"</string>
|
||||
<string name="dialog_title_success">"Sukces"</string>
|
||||
<string name="dialog_title_warning">"Ostrzeżenie"</string>
|
||||
<string name="dialog_unsaved_changes_description_android">"Zmiany nie zostały zapisane. Czy na pewno chcesz wrócić?"</string>
|
||||
<string name="dialog_unsaved_changes_title">"Zapisać zmiany?"</string>
|
||||
<string name="error_failed_creating_the_permalink">"Nie udało się utworzyć linku bezpośredniego"</string>
|
||||
<string name="error_failed_loading_map">"%1$s nie mogło wczytać mapy. Spróbuj ponownie później."</string>
|
||||
<string name="error_failed_loading_messages">"Nie udało się załadować wiadomości"</string>
|
||||
<string name="error_failed_locating_user">"%1$s nie mógł uzyskać dostępu do Twojej lokalizacji. Spróbuj ponownie później."</string>
|
||||
<string name="error_failed_uploading_voice_message">"Nie udało się przesłać Twojej wiadomości głosowej."</string>
|
||||
<string name="error_message_not_found">"Nie znaleziono wiadomości"</string>
|
||||
<string name="error_missing_location_auth_android">"%1$s nie uzyskało uprawnienia do dostępu do twojej lokalizacji. Możesz włączyć dostęp w Ustawieniach."</string>
|
||||
<string name="error_missing_location_rationale_android">"%1$s nie ma uprawnień dostępu do Twojej lokalizacji. Włącz dostęp poniżej."</string>
|
||||
<string name="error_missing_microphone_voice_rationale_android">"%1$s nie ma uprawnień dostępu do Twojego mikrofonu. Włącz dostęp, aby nagrać wiadomość głosową."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Niektóre wiadomości nie zostały wysłane"</string>
|
||||
<string name="error_unknown">"Przepraszamy, wystąpił błąd"</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Dołącz do mnie na %1$s"</string>
|
||||
<string name="invite_friends_text">"Hej, porozmawiajmy na %1$s: %2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
<string name="preference_rageshake">"Gniewne wstrząsanie, aby zgłosić błąd"</string>
|
||||
<string name="screen_media_picker_error_failed_selection">"Nie udało się wybrać multimediów. Spróbuj ponownie."</string>
|
||||
<string name="screen_media_upload_preview_error_failed_processing">"Przetwarzanie multimediów do przesłania nie powiodło się, spróbuj ponownie."</string>
|
||||
<string name="screen_media_upload_preview_error_failed_sending">"Przesyłanie multimediów nie powiodło się, spróbuj ponownie."</string>
|
||||
<string name="screen_room_error_failed_processing_media">"Przetwarzanie multimediów do przesłania nie powiodło się, spróbuj ponownie."</string>
|
||||
<string name="screen_room_error_failed_retrieving_user_details">"Nie można pobrać danych użytkownika"</string>
|
||||
<string name="screen_room_member_details_block_alert_action">"Zablokuj"</string>
|
||||
<string name="screen_room_member_details_block_alert_description">"Zablokowani użytkownicy nie będą mogli wysyłać Ci wiadomości, a wszystkie ich wiadomości zostaną ukryte. Możesz odblokować ich w dowolnym momencie."</string>
|
||||
<string name="screen_room_member_details_block_user">"Zablokuj użytkownika"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_action">"Odblokuj"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_description">"Będziesz mógł ponownie zobaczyć wszystkie wiadomości od tego użytkownika."</string>
|
||||
<string name="screen_room_member_details_unblock_user">"Odblokuj użytkownika"</string>
|
||||
<string name="screen_share_location_title">"Udostępnij lokalizację"</string>
|
||||
<string name="screen_share_my_location_action">"Udostępnij moją lokalizację"</string>
|
||||
<string name="screen_share_open_apple_maps">"Otwórz w Apple Maps"</string>
|
||||
<string name="screen_share_open_google_maps">"Otwórz w Google Maps"</string>
|
||||
<string name="screen_share_open_osm_maps">"Otwórz w OpenStreetMap"</string>
|
||||
<string name="screen_share_this_location_action">"Udostępnij tę lokalizację"</string>
|
||||
<string name="screen_view_location_title">"Lokalizacja"</string>
|
||||
<string name="settings_version_number">"Wersja: %1$s (%2$s)"</string>
|
||||
<string name="test_language_identifier">"pl"</string>
|
||||
</resources>
|
||||
275
libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml
Normal file
275
libraries/ui-strings/src/main/res/values-pt-rBR/translations.xml
Normal file
|
|
@ -0,0 +1,275 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
|
||||
<string name="a11y_delete">"Excluir"</string>
|
||||
<string name="a11y_hide_password">"Ocultar senha"</string>
|
||||
<string name="a11y_jump_to_bottom">"Ir para o final"</string>
|
||||
<string name="a11y_notifications_mentions_only">"Apenas menções"</string>
|
||||
<string name="a11y_notifications_muted">"Silenciado"</string>
|
||||
<string name="a11y_page_n">"Página %1$d"</string>
|
||||
<string name="a11y_pause">"Pausar"</string>
|
||||
<string name="a11y_pin_field">"Campo de PIN"</string>
|
||||
<string name="a11y_play">"Reproduzir"</string>
|
||||
<string name="a11y_poll">"Enquete"</string>
|
||||
<string name="a11y_poll_end">"Enquete encerrada"</string>
|
||||
<string name="a11y_react_with">"Reagir com %1$s"</string>
|
||||
<string name="a11y_react_with_other_emojis">"Reaja com outros emojis"</string>
|
||||
<string name="a11y_read_receipts_multiple">"Lido por %1$s e %2$s"</string>
|
||||
<string name="a11y_read_receipts_single">"Lido por %1$s"</string>
|
||||
<string name="a11y_read_receipts_tap_to_show_all">"Toque para mostrar tudo"</string>
|
||||
<string name="a11y_remove_reaction_with">"Remova a reação com %1$s"</string>
|
||||
<string name="a11y_send_files">"Enviar arquivos"</string>
|
||||
<string name="a11y_show_password">"Mostrar senha"</string>
|
||||
<string name="a11y_start_call">"Iniciar uma chamada"</string>
|
||||
<string name="a11y_user_menu">"Menu do usuário"</string>
|
||||
<string name="a11y_voice_message_record">"Gravar mensagem de voz."</string>
|
||||
<string name="a11y_voice_message_stop_recording">"Parar gravação"</string>
|
||||
<string name="action_accept">"Aceitar"</string>
|
||||
<string name="action_add_to_timeline">"Adicionar à linha do tempo"</string>
|
||||
<string name="action_back">"Voltar"</string>
|
||||
<string name="action_call">"Chamar"</string>
|
||||
<string name="action_cancel">"Cancelar"</string>
|
||||
<string name="action_choose_photo">"Escolher foto"</string>
|
||||
<string name="action_clear">"Limpar"</string>
|
||||
<string name="action_close">"Fechar"</string>
|
||||
<string name="action_complete_verification">"Verificação completa"</string>
|
||||
<string name="action_confirm">"Confirmar"</string>
|
||||
<string name="action_continue">"Continuar"</string>
|
||||
<string name="action_copy">"Copiar"</string>
|
||||
<string name="action_copy_link">"Copiar link"</string>
|
||||
<string name="action_copy_link_to_message">"Copiar link para a mensagem"</string>
|
||||
<string name="action_create">"Criar"</string>
|
||||
<string name="action_create_a_room">"Criar uma sala"</string>
|
||||
<string name="action_decline">"Recusar"</string>
|
||||
<string name="action_delete_poll">"Excluir Enquete"</string>
|
||||
<string name="action_disable">"Desabilitar"</string>
|
||||
<string name="action_discard">"Descartar"</string>
|
||||
<string name="action_done">"Concluído"</string>
|
||||
<string name="action_edit">"Editar"</string>
|
||||
<string name="action_edit_poll">"Editar enquete"</string>
|
||||
<string name="action_enable">"Habilitar"</string>
|
||||
<string name="action_end_poll">"Encerrar enquete"</string>
|
||||
<string name="action_enter_pin">"Inserir PIN"</string>
|
||||
<string name="action_forgot_password">"Esqueceu a senha?"</string>
|
||||
<string name="action_forward">"Encaminhar"</string>
|
||||
<string name="action_go_back">"Voltar"</string>
|
||||
<string name="action_invite">"Convidar"</string>
|
||||
<string name="action_invite_friends">"Convidar pessoas"</string>
|
||||
<string name="action_invite_friends_to_app">"Convidar pessoas para %1$s"</string>
|
||||
<string name="action_invite_people_to_app">"Convide pessoas para %1$s"</string>
|
||||
<string name="action_invites_list">"Convites"</string>
|
||||
<string name="action_join">"Entrar"</string>
|
||||
<string name="action_learn_more">"Saber mais"</string>
|
||||
<string name="action_leave">"Sair"</string>
|
||||
<string name="action_leave_conversation">"Sair da conversa"</string>
|
||||
<string name="action_leave_room">"Sair da sala"</string>
|
||||
<string name="action_load_more">"Carregar mais"</string>
|
||||
<string name="action_manage_account">"Gerenciar conta"</string>
|
||||
<string name="action_manage_devices">"Gerenciar dispositivos"</string>
|
||||
<string name="action_message">"Mensagem"</string>
|
||||
<string name="action_next">"Próximo"</string>
|
||||
<string name="action_no">"Não"</string>
|
||||
<string name="action_not_now">"Agora não"</string>
|
||||
<string name="action_ok">"OK"</string>
|
||||
<string name="action_open_settings">"Configurações"</string>
|
||||
<string name="action_open_with">"Abrir com"</string>
|
||||
<string name="action_pin">"Fixar"</string>
|
||||
<string name="action_quick_reply">"Resposta rápida"</string>
|
||||
<string name="action_quote">"Citação"</string>
|
||||
<string name="action_react">"Reagir"</string>
|
||||
<string name="action_reject">"Recusar"</string>
|
||||
<string name="action_remove">"Remover"</string>
|
||||
<string name="action_reply">"Responder"</string>
|
||||
<string name="action_reply_in_thread">"Responder no tópico"</string>
|
||||
<string name="action_report_bug">"Reportar erro"</string>
|
||||
<string name="action_report_content">"Denunciar conteúdo"</string>
|
||||
<string name="action_reset">"Redefinir"</string>
|
||||
<string name="action_retry">"Tentar novamente"</string>
|
||||
<string name="action_retry_decryption">"Tente descriptografar novamente"</string>
|
||||
<string name="action_save">"Salvar"</string>
|
||||
<string name="action_search">"Pesquisar"</string>
|
||||
<string name="action_send">"Enviar"</string>
|
||||
<string name="action_send_message">"Enviar mensagem"</string>
|
||||
<string name="action_share">"Compartilhar"</string>
|
||||
<string name="action_share_link">"Compartilhar link"</string>
|
||||
<string name="action_sign_in_again">"Iniciar sessão novamente"</string>
|
||||
<string name="action_signout">"Sair"</string>
|
||||
<string name="action_signout_anyway">"Sair mesmo assim"</string>
|
||||
<string name="action_skip">"Pular"</string>
|
||||
<string name="action_start">"Começar"</string>
|
||||
<string name="action_start_chat">"Iniciar bate-papo"</string>
|
||||
<string name="action_start_verification">"Iniciar verificação"</string>
|
||||
<string name="action_static_map_load">"Toque para carregar o mapa"</string>
|
||||
<string name="action_take_photo">"Tirar foto"</string>
|
||||
<string name="action_tap_for_options">"Toque para opções"</string>
|
||||
<string name="action_try_again">"Tente novamente"</string>
|
||||
<string name="action_view_source">"Ver fonte"</string>
|
||||
<string name="action_yes">"Sim"</string>
|
||||
<string name="common_about">"Sobre"</string>
|
||||
<string name="common_acceptable_use_policy">"Política de uso aceitável"</string>
|
||||
<string name="common_advanced_settings">"Configurações avançadas"</string>
|
||||
<string name="common_analytics">"Telemetria"</string>
|
||||
<string name="common_appearance">"Aparência"</string>
|
||||
<string name="common_audio">"Áudio"</string>
|
||||
<string name="common_blocked_users">"Usuários bloqueados"</string>
|
||||
<string name="common_bubbles">"Bolhas"</string>
|
||||
<string name="common_call_invite">"Chamada em progresso (sem suporte)"</string>
|
||||
<string name="common_call_started">"Chamada iniciada"</string>
|
||||
<string name="common_chat_backup">"Backup de conversas"</string>
|
||||
<string name="common_copyright">"Direitos autorais"</string>
|
||||
<string name="common_creating_room">"Criando sala…"</string>
|
||||
<string name="common_current_user_left_room">"Saiu da sala"</string>
|
||||
<string name="common_dark">"Escuro"</string>
|
||||
<string name="common_decryption_error">"Erro de descriptografia"</string>
|
||||
<string name="common_developer_options">"Opções do desenvolvedor"</string>
|
||||
<string name="common_direct_chat">"Conversa privada"</string>
|
||||
<string name="common_do_not_show_this_again">"Não mostrar isto novamente"</string>
|
||||
<string name="common_edited_suffix">"(editado)"</string>
|
||||
<string name="common_editing">"Editando"</string>
|
||||
<string name="common_emote">"* %1$s %2$s"</string>
|
||||
<string name="common_encryption_enabled">"Criptografia ativada"</string>
|
||||
<string name="common_enter_your_pin">"Insira seu PIN"</string>
|
||||
<string name="common_error">"Erro"</string>
|
||||
<string name="common_everyone">"Todos"</string>
|
||||
<string name="common_failed">"Falhou"</string>
|
||||
<string name="common_favourite">"Favorito"</string>
|
||||
<string name="common_favourited">"Favoritado"</string>
|
||||
<string name="common_file">"Arquivo"</string>
|
||||
<string name="common_file_saved_on_disk_android">"Arquivo salvo em Downloads"</string>
|
||||
<string name="common_forward_message">"Encaminhar mensagem"</string>
|
||||
<string name="common_gif">"GIF"</string>
|
||||
<string name="common_image">"Imagem"</string>
|
||||
<string name="common_in_reply_to">"Em resposta a %1$s"</string>
|
||||
<string name="common_install_apk_android">"Instalar APK"</string>
|
||||
<string name="common_invite_unknown_profile">"Este ID Matrix não foi encontrado, então o convite pode não ser recebido"</string>
|
||||
<string name="common_leaving_room">"Saindo da sala"</string>
|
||||
<string name="common_light">"Claro"</string>
|
||||
<string name="common_link_copied_to_clipboard">"Link copiado para área de transferência"</string>
|
||||
<string name="common_loading">"Carregando…"</string>
|
||||
<plurals name="common_member_count">
|
||||
<item quantity="one">"%1$d membro"</item>
|
||||
<item quantity="other">"%1$d membros"</item>
|
||||
</plurals>
|
||||
<string name="common_message">"Mensagem"</string>
|
||||
<string name="common_message_actions">"Ações de mensagem"</string>
|
||||
<string name="common_message_layout">"Layout da mensagem"</string>
|
||||
<string name="common_message_removed">"Mensagem removida"</string>
|
||||
<string name="common_modern">"Moderno"</string>
|
||||
<string name="common_mute">"Silenciar"</string>
|
||||
<string name="common_no_results">"Sem resultados"</string>
|
||||
<string name="common_no_room_name">"Sem nome de sala"</string>
|
||||
<string name="common_offline">"Offline"</string>
|
||||
<string name="common_open_source_licenses">"Licenças de código aberto"</string>
|
||||
<string name="common_or">"ou"</string>
|
||||
<string name="common_password">"Senha"</string>
|
||||
<string name="common_people">"Pessoas"</string>
|
||||
<string name="common_permalink">"Link permanente"</string>
|
||||
<string name="common_permission">"Permissão"</string>
|
||||
<string name="common_please_wait">"Por favor, aguarde…"</string>
|
||||
<string name="common_poll_end_confirmation">"Tem certeza de que deseja encerrar esta enquete?"</string>
|
||||
<string name="common_poll_summary">"Enquete: %1$s"</string>
|
||||
<string name="common_poll_total_votes">"Total de votos: %1$s"</string>
|
||||
<string name="common_poll_undisclosed_text">"Os resultados serão exibidos após o término da enquete"</string>
|
||||
<plurals name="common_poll_votes_count">
|
||||
<item quantity="one">"%d voto"</item>
|
||||
<item quantity="other">"%d votos"</item>
|
||||
</plurals>
|
||||
<string name="common_privacy_policy">"Política de Privacidade"</string>
|
||||
<string name="common_reaction">"Reação"</string>
|
||||
<string name="common_reactions">"Reações"</string>
|
||||
<string name="common_recovery_key">"Chave de recuperação"</string>
|
||||
<string name="common_refreshing">"Atualizando…"</string>
|
||||
<string name="common_replying_to">"Respondendo a %1$s"</string>
|
||||
<string name="common_report_a_bug">"Reportar um erro"</string>
|
||||
<string name="common_report_a_problem">"Reportar um problema"</string>
|
||||
<string name="common_report_submitted">"Relatório enviado"</string>
|
||||
<string name="common_rich_text_editor">"Editor de rich text"</string>
|
||||
<string name="common_room">"Sala"</string>
|
||||
<string name="common_room_name">"Nome da sala"</string>
|
||||
<string name="common_room_name_placeholder">"por exemplo, o nome do seu projeto"</string>
|
||||
<string name="common_saved_changes">"Mudanças salvas"</string>
|
||||
<string name="common_saving">"Salvando"</string>
|
||||
<string name="common_screen_lock">"Bloqueio de tela"</string>
|
||||
<string name="common_search_for_someone">"Procurar alguém"</string>
|
||||
<string name="common_search_results">"Resultados da busca"</string>
|
||||
<string name="common_security">"Segurança"</string>
|
||||
<string name="common_seen_by">"Visto por"</string>
|
||||
<string name="common_send_to">"Enviar para"</string>
|
||||
<string name="common_sending">"Enviando…"</string>
|
||||
<string name="common_sending_failed">"Envio falhou"</string>
|
||||
<string name="common_sent">"Enviado"</string>
|
||||
<string name="common_server_not_supported">"Servidor não suportado"</string>
|
||||
<string name="common_server_url">"URL do Servidor"</string>
|
||||
<string name="common_settings">"Configurações"</string>
|
||||
<string name="common_shared_location">"Localização compartilhada"</string>
|
||||
<string name="common_signing_out">"Saindo"</string>
|
||||
<string name="common_something_went_wrong">"Algo deu errado"</string>
|
||||
<string name="common_starting_chat">"Iniciando o chat…"</string>
|
||||
<string name="common_sticker">"Adesivo"</string>
|
||||
<string name="common_success">"Sucesso"</string>
|
||||
<string name="common_suggestions">"Sugestões"</string>
|
||||
<string name="common_syncing">"Sincronizando"</string>
|
||||
<string name="common_system">"Sistema"</string>
|
||||
<string name="common_text">"Texto"</string>
|
||||
<string name="common_third_party_notices">"Avisos de terceiros"</string>
|
||||
<string name="common_thread">"Tópico"</string>
|
||||
<string name="common_topic">"Tópico"</string>
|
||||
<string name="common_topic_placeholder">"Sobre o que é essa sala?"</string>
|
||||
<string name="common_unable_to_decrypt">"Não é possível descriptografar"</string>
|
||||
<string name="common_unable_to_decrypt_no_access">"Você não tem acesso a esta mensagem"</string>
|
||||
<string name="common_unable_to_invite_message">"Não foi possível enviar convites para um ou mais usuários."</string>
|
||||
<string name="common_unable_to_invite_title">"Não foi possível enviar o(s) convite(s)"</string>
|
||||
<string name="common_unlock">"Desbloquear"</string>
|
||||
<string name="common_unmute">"Desmutar"</string>
|
||||
<string name="common_unsupported_event">"Evento não suportado"</string>
|
||||
<string name="common_username">"Nome do usuário"</string>
|
||||
<string name="common_verification_cancelled">"Verificação cancelada"</string>
|
||||
<string name="common_verification_complete">"Verificação concluída"</string>
|
||||
<string name="common_verify_device">"Verificar dispositivo"</string>
|
||||
<string name="common_video">"Vídeo"</string>
|
||||
<string name="common_voice_message">"Mensagem de voz"</string>
|
||||
<string name="common_waiting">"Esperando…"</string>
|
||||
<string name="common_waiting_for_decryption_key">"Aguardando esta mensagem"</string>
|
||||
<string name="dialog_title_confirmation">"Confirmação"</string>
|
||||
<string name="dialog_title_error">"Erro"</string>
|
||||
<string name="dialog_title_success">"Sucesso"</string>
|
||||
<string name="dialog_title_warning">"Aviso"</string>
|
||||
<string name="dialog_unsaved_changes_description_android">"Suas mudanças não foram salvas. Tem certeza de que você quer voltar?"</string>
|
||||
<string name="dialog_unsaved_changes_title">"Salvar mudanças?"</string>
|
||||
<string name="error_failed_creating_the_permalink">"Falha ao criar o link permanente"</string>
|
||||
<string name="error_failed_loading_map">"%1$s não conseguiu carregar o mapa. Por favor, tente novamente mais tarde."</string>
|
||||
<string name="error_failed_loading_messages">"Falha ao carregar mensagens"</string>
|
||||
<string name="error_failed_locating_user">"%1$s não conseguiu acessar sua localização. Por favor, tente novamente mais tarde."</string>
|
||||
<string name="error_failed_uploading_voice_message">"Falha ao enviar sua mensagem de voz."</string>
|
||||
<string name="error_message_not_found">"Mensagem não encontrada"</string>
|
||||
<string name="error_missing_location_auth_android">"%1$s não tem permissão para acessar sua localização. Você pode ativar o acesso nas Configurações."</string>
|
||||
<string name="error_missing_location_rationale_android">"%1$s não tem permissão para acessar sua localização. Habilite o acesso abaixo."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Algumas mensagens não foram enviadas"</string>
|
||||
<string name="error_unknown">"Desculpe, ocorreu um erro"</string>
|
||||
<string name="event_shield_reason_unknown_device">"Criptografada por um dispositivo desconhecido ou apagado."</string>
|
||||
<string name="event_shield_reason_unsigned_device">"Criptografado por um dispositivo que não foi verificado pelo seu dono."</string>
|
||||
<string name="event_shield_reason_unverified_identity">"Criptografado por um usuário não verificado."</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Junte-se a mim no %1$s"</string>
|
||||
<string name="invite_friends_text">"Ei, fale comigo em %1$s: %2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
<string name="preference_rageshake">"Rageshake para relatar um bug"</string>
|
||||
<string name="screen_media_picker_error_failed_selection">"Falha ao selecionar a mídia, tente novamente."</string>
|
||||
<string name="screen_media_upload_preview_error_failed_processing">"Falha ao processar mídia para upload. Tente novamente."</string>
|
||||
<string name="screen_media_upload_preview_error_failed_sending">"Falha ao enviar mídia. Tente novamente."</string>
|
||||
<string name="screen_room_error_failed_processing_media">"Falha ao processar mídia para upload. Tente novamente."</string>
|
||||
<string name="screen_room_error_failed_retrieving_user_details">"Não foi possível recuperar os detalhes do usuário"</string>
|
||||
<string name="screen_room_member_details_block_alert_action">"Bloquear"</string>
|
||||
<string name="screen_room_member_details_block_alert_description">"Usuários bloqueados não poderão enviar mensagens para você e todas as mensagens deles serão ocultadas. Você pode desbloqueá-los a qualquer momento."</string>
|
||||
<string name="screen_room_member_details_block_user">"Bloquear usuário"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_action">"Desbloquear"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_description">"Você poderá ver todas as mensagens deles novamente."</string>
|
||||
<string name="screen_room_member_details_unblock_user">"Desbloquear usuário"</string>
|
||||
<string name="screen_share_location_title">"Compartilhar localização"</string>
|
||||
<string name="screen_share_my_location_action">"Compartilhar minha localização"</string>
|
||||
<string name="screen_share_open_apple_maps">"Abrir no Apple Maps"</string>
|
||||
<string name="screen_share_open_google_maps">"Abrir no Google Maps"</string>
|
||||
<string name="screen_share_open_osm_maps">"Abrir no OpenStreetMap"</string>
|
||||
<string name="screen_share_this_location_action">"Compartilhe esta localização"</string>
|
||||
<string name="screen_view_location_title">"Localização"</string>
|
||||
<string name="settings_version_number">"Versão: %1$s (%2$s)"</string>
|
||||
<string name="test_language_identifier">"pt-br"</string>
|
||||
</resources>
|
||||
|
|
@ -82,6 +82,7 @@
|
|||
<string name="action_ok">"OK"</string>
|
||||
<string name="action_open_settings">"Otvoriť nastavenia"</string>
|
||||
<string name="action_open_with">"Otvoriť pomocou"</string>
|
||||
<string name="action_pin">"Pripnúť"</string>
|
||||
<string name="action_quick_reply">"Rýchla odpoveď"</string>
|
||||
<string name="action_quote">"Citovať"</string>
|
||||
<string name="action_react">"Reagovať"</string>
|
||||
|
|
@ -260,6 +261,10 @@ Dôvod: %1$s."</string>
|
|||
<string name="error_missing_microphone_voice_rationale_android">"%1$s nemá povolenie na prístup k vášmu mikrofónu. Povoľte prístup na nahrávanie hlasovej správy."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Niektoré správy neboli odoslané"</string>
|
||||
<string name="error_unknown">"Prepáčte, vyskytla sa chyba"</string>
|
||||
<string name="event_shield_reason_authenticity_not_guaranteed">"Pravosť tejto šifrovanej správy nie je možné zaručiť na tomto zariadení."</string>
|
||||
<string name="event_shield_reason_unknown_device">"Zašifrované neznámym alebo odstráneným zariadením."</string>
|
||||
<string name="event_shield_reason_unsigned_device">"Šifrované zariadením, ktoré nie je overené jeho majiteľom."</string>
|
||||
<string name="event_shield_reason_unverified_identity">"Šifrované neovereným používateľom."</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Pripojte sa ku mne na %1$s"</string>
|
||||
<string name="invite_friends_text">"Ahoj, porozprávajte sa so mnou na %1$s: %2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
|
|
@ -276,6 +281,9 @@ Dôvod: %1$s."</string>
|
|||
<string name="screen_room_member_details_unblock_alert_action">"Odblokovať"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_description">"Všetky správy od nich budete môcť opäť vidieť."</string>
|
||||
<string name="screen_room_member_details_unblock_user">"Odblokovať používateľa"</string>
|
||||
<string name="screen_room_pinned_banner_indicator">"%1$s z %2$s"</string>
|
||||
<string name="screen_room_pinned_banner_indicator_description">"%1$s Pripnutých správ"</string>
|
||||
<string name="screen_room_pinned_banner_view_all_button_title">"Zobraziť všetko"</string>
|
||||
<string name="screen_room_title">"Konverzácia"</string>
|
||||
<string name="screen_share_location_title">"Zdieľať polohu"</string>
|
||||
<string name="screen_share_my_location_action">"Zdieľať moju polohu"</string>
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@
|
|||
<string name="action_ok">"OK"</string>
|
||||
<string name="action_open_settings">"Settings"</string>
|
||||
<string name="action_open_with">"Open with"</string>
|
||||
<string name="action_pin">"Pin"</string>
|
||||
<string name="action_quick_reply">"Quick reply"</string>
|
||||
<string name="action_quote">"Quote"</string>
|
||||
<string name="action_react">"React"</string>
|
||||
|
|
@ -256,6 +257,10 @@ Reason: %1$s."</string>
|
|||
<string name="error_missing_microphone_voice_rationale_android">"%1$s does not have permission to access your microphone. Enable access to record a voice message."</string>
|
||||
<string name="error_some_messages_have_not_been_sent">"Some messages have not been sent"</string>
|
||||
<string name="error_unknown">"Sorry, an error occurred"</string>
|
||||
<string name="event_shield_reason_authenticity_not_guaranteed">"The authenticity of this encrypted message can\'t be guaranteed on this device."</string>
|
||||
<string name="event_shield_reason_unknown_device">"Encrypted by an unknown or deleted device."</string>
|
||||
<string name="event_shield_reason_unsigned_device">"Encrypted by a device not verified by its owner."</string>
|
||||
<string name="event_shield_reason_unverified_identity">"Encrypted by an unverified user."</string>
|
||||
<string name="invite_friends_rich_title">"🔐️ Join me on %1$s"</string>
|
||||
<string name="invite_friends_text">"Hey, talk to me on %1$s: %2$s"</string>
|
||||
<string name="login_initial_device_name_android">"%1$s Android"</string>
|
||||
|
|
@ -272,6 +277,9 @@ Reason: %1$s."</string>
|
|||
<string name="screen_room_member_details_unblock_alert_action">"Unblock"</string>
|
||||
<string name="screen_room_member_details_unblock_alert_description">"You\'ll be able to see all messages from them again."</string>
|
||||
<string name="screen_room_member_details_unblock_user">"Unblock user"</string>
|
||||
<string name="screen_room_pinned_banner_indicator">"%1$s of %2$s"</string>
|
||||
<string name="screen_room_pinned_banner_indicator_description">"%1$s Pinned messages"</string>
|
||||
<string name="screen_room_pinned_banner_view_all_button_title">"View All"</string>
|
||||
<string name="screen_room_title">"Chat"</string>
|
||||
<string name="screen_share_location_title">"Share location"</string>
|
||||
<string name="screen_share_my_location_action">"Share my location"</string>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue