From c0cf534845d55ca1572d95ee67f0a23ff17c3d84 Mon Sep 17 00:00:00 2001 From: Constantin Wartenburger Date: Sat, 10 Oct 2020 16:36:04 +0200 Subject: [PATCH 001/350] Added commands from element web --- .../im/vector/app/features/command/Command.kt | 7 +- .../app/features/command/CommandParser.kt | 79 ++++++++++++++++--- .../app/features/command/ParsedCommand.kt | 7 +- .../home/room/detail/RoomDetailFragment.kt | 1 + .../home/room/detail/RoomDetailViewEvents.kt | 12 +-- .../home/room/detail/RoomDetailViewModel.kt | 68 +++++++++++++--- vector/src/main/res/values/strings.xml | 5 ++ 7 files changed, 149 insertions(+), 30 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/command/Command.kt b/vector/src/main/java/im/vector/app/features/command/Command.kt index db429f9e586..c1b30b2744c 100644 --- a/vector/src/main/java/im/vector/app/features/command/Command.kt +++ b/vector/src/main/java/im/vector/app/features/command/Command.kt @@ -28,8 +28,11 @@ enum class Command(val command: String, val parameters: String, @StringRes val d EMOTE("/me", "", R.string.command_description_emote), BAN_USER("/ban", " [reason]", R.string.command_description_ban_user), UNBAN_USER("/unban", " [reason]", R.string.command_description_unban_user), + IGNORE_USER("/ignore", " [reason]", R.string.command_description_ignore_user), + UNIGNORE_USER("/unignore", "", R.string.command_description_unignore_user), SET_USER_POWER_LEVEL("/op", " []", R.string.command_description_op_user), RESET_USER_POWER_LEVEL("/deop", "", R.string.command_description_deop_user), + ROOM_NAME("/roomname", " [reason]", R.string.command_description_room_name), INVITE("/invite", " [reason]", R.string.command_description_invite_user), JOIN_ROOM("/join", " [reason]", R.string.command_description_join_room), PART("/part", " [reason]", R.string.command_description_part_room), @@ -42,8 +45,10 @@ enum class Command(val command: String, val parameters: String, @StringRes val d CLEAR_SCALAR_TOKEN("/clear_scalar_token", "", R.string.command_description_clear_scalar_token), SPOILER("/spoiler", "", R.string.command_description_spoiler), POLL("/poll", "Question | Option 1 | Option 2 ...", R.string.command_description_poll), - SHRUG("/shrug", "", R.string.command_description_shrug), + SHRUG("/shrug", "[]", R.string.command_description_shrug), + LENNY("/lenny", "[]", R.string.command_description_lenny), PLAIN("/plain", "", R.string.command_description_plain), + WHOIS("/whois", "", R.string.command_description_whois), DISCARD_SESSION("/discardsession", "", R.string.command_description_discard_session); val length diff --git a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt index 94de6bf2656..fd7d587c1cd 100644 --- a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt +++ b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt @@ -102,7 +102,7 @@ object CommandParser { ParsedCommand.SendRainbowEmote(message) } - Command.JOIN_ROOM.command -> { + Command.JOIN_ROOM.command -> { if (messageParts.size >= 2) { val roomAlias = messageParts[1] @@ -120,7 +120,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.JOIN_ROOM) } } - Command.PART.command -> { + Command.PART.command -> { if (messageParts.size >= 2) { val roomAlias = messageParts[1] @@ -138,7 +138,16 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.PART) } } - Command.INVITE.command -> { + Command.ROOM_NAME.command -> { + val newRoomName = textMessage.substring(Command.ROOM_NAME.command.length).trim() + + if (newRoomName.isNotEmpty()) { + ParsedCommand.ChangeRoomName(newRoomName) + } else { + ParsedCommand.ErrorSyntax(Command.ROOM_NAME) + } + } + Command.INVITE.command -> { if (messageParts.size >= 2) { val userId = messageParts[1] @@ -183,7 +192,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.KICK_USER) } } - Command.BAN_USER.command -> { + Command.BAN_USER.command -> { if (messageParts.size >= 2) { val userId = messageParts[1] @@ -201,7 +210,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.BAN_USER) } } - Command.UNBAN_USER.command -> { + Command.UNBAN_USER.command -> { if (messageParts.size >= 2) { val userId = messageParts[1] @@ -219,7 +228,33 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.UNBAN_USER) } } - Command.SET_USER_POWER_LEVEL.command -> { + Command.IGNORE_USER.command -> { + if (messageParts.size == 2) { + val userId = messageParts[1] + + if (MatrixPatterns.isUserId(userId)) { + ParsedCommand.IgnoreUser(userId) + } else { + ParsedCommand.ErrorSyntax(Command.IGNORE_USER) + } + } else { + ParsedCommand.ErrorSyntax(Command.IGNORE_USER) + } + } + Command.UNIGNORE_USER.command -> { + if (messageParts.size == 2) { + val userId = messageParts[1] + + if (MatrixPatterns.isUserId(userId)) { + ParsedCommand.UnignoreUser(userId) + } else { + ParsedCommand.ErrorSyntax(Command.UNIGNORE_USER) + } + } else { + ParsedCommand.ErrorSyntax(Command.UNIGNORE_USER) + } + } + Command.SET_USER_POWER_LEVEL.command -> { if (messageParts.size == 3) { val userId = messageParts[1] if (MatrixPatterns.isUserId(userId)) { @@ -252,7 +287,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.SET_USER_POWER_LEVEL) } } - Command.MARKDOWN.command -> { + Command.MARKDOWN.command -> { if (messageParts.size == 2) { when { "on".equals(messageParts[1], true) -> ParsedCommand.SetMarkdown(true) @@ -263,23 +298,28 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.MARKDOWN) } } - Command.CLEAR_SCALAR_TOKEN.command -> { + Command.CLEAR_SCALAR_TOKEN.command -> { if (messageParts.size == 1) { ParsedCommand.ClearScalarToken } else { ParsedCommand.ErrorSyntax(Command.CLEAR_SCALAR_TOKEN) } } - Command.SPOILER.command -> { + Command.SPOILER.command -> { val message = textMessage.substring(Command.SPOILER.command.length).trim() ParsedCommand.SendSpoiler(message) } - Command.SHRUG.command -> { + Command.SHRUG.command -> { val message = textMessage.substring(Command.SHRUG.command.length).trim() ParsedCommand.SendShrug(message) } - Command.POLL.command -> { + Command.LENNY.command -> { + val message = textMessage.substring(Command.LENNY.command.length).trim() + + ParsedCommand.SendLenny(message) + } + Command.POLL.command -> { val rawCommand = textMessage.substring(Command.POLL.command.length).trim() val split = rawCommand.split("|").map { it.trim() } if (split.size > 2) { @@ -288,10 +328,23 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.POLL) } } - Command.DISCARD_SESSION.command -> { + Command.DISCARD_SESSION.command -> { ParsedCommand.DiscardSession } - else -> { + Command.WHOIS.command -> { + if (messageParts.size == 2) { + val userId = messageParts[1] + + if (MatrixPatterns.isUserId(userId)) { + ParsedCommand.ShowUser(userId) + } else { + ParsedCommand.ErrorSyntax(Command.WHOIS) + } + } else { + ParsedCommand.ErrorSyntax(Command.WHOIS) + } + } + else -> { // Unknown command ParsedCommand.ErrorUnknownSlashCommand(slashCommand) } diff --git a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt index bdfa7779fbf..54043f343a7 100644 --- a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt +++ b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt @@ -41,7 +41,10 @@ sealed class ParsedCommand { class SendRainbowEmote(val message: CharSequence) : ParsedCommand() class BanUser(val userId: String, val reason: String?) : ParsedCommand() class UnbanUser(val userId: String, val reason: String?) : ParsedCommand() + class IgnoreUser(val userId: String) : ParsedCommand() + class UnignoreUser(val userId: String) : ParsedCommand() class SetUserPowerLevel(val userId: String, val powerLevel: Int?) : ParsedCommand() + class ChangeRoomName(val name: String) : ParsedCommand() class Invite(val userId: String, val reason: String?) : ParsedCommand() class Invite3Pid(val threePid: ThreePid) : ParsedCommand() class JoinRoom(val roomAlias: String, val reason: String?) : ParsedCommand() @@ -53,6 +56,8 @@ sealed class ParsedCommand { object ClearScalarToken : ParsedCommand() class SendSpoiler(val message: String) : ParsedCommand() class SendShrug(val message: CharSequence) : ParsedCommand() + class SendLenny(val message: CharSequence) : ParsedCommand() class SendPoll(val question: String, val options: List) : ParsedCommand() - object DiscardSession: ParsedCommand() + object DiscardSession : ParsedCommand() + class ShowUser(val userId: String) : ParsedCommand() } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt index 51aeda2aab7..a9c23075665 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailFragment.kt @@ -359,6 +359,7 @@ class RoomDetailFragment @Inject constructor( is RoomDetailViewEvents.SendMessageResult -> renderSendMessageResult(it) is RoomDetailViewEvents.ShowE2EErrorMessage -> displayE2eError(it.withHeldCode) RoomDetailViewEvents.DisplayPromptForIntegrationManager -> displayPromptForIntegrationManager() + is RoomDetailViewEvents.OpenRoomMemberProfile -> openRoomMemberProfile(it.userId) is RoomDetailViewEvents.OpenStickerPicker -> openStickerPicker(it) is RoomDetailViewEvents.DisplayEnableIntegrationsWarning -> displayDisabledIntegrationDialog() is RoomDetailViewEvents.OpenIntegrationManager -> openIntegrationManager() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewEvents.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewEvents.kt index 29ed43f17da..b7470756226 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewEvents.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewEvents.kt @@ -64,14 +64,16 @@ sealed class RoomDetailViewEvents : VectorViewEvents { abstract class SendMessageResult : RoomDetailViewEvents() - object DisplayPromptForIntegrationManager: RoomDetailViewEvents() + object DisplayPromptForIntegrationManager : RoomDetailViewEvents() - object DisplayEnableIntegrationsWarning: RoomDetailViewEvents() + object DisplayEnableIntegrationsWarning : RoomDetailViewEvents() - data class OpenStickerPicker(val widget: Widget): RoomDetailViewEvents() + data class OpenRoomMemberProfile(val userId: String) : RoomDetailViewEvents() - object OpenIntegrationManager: RoomDetailViewEvents() - object OpenActiveWidgetBottomSheet: RoomDetailViewEvents() + data class OpenStickerPicker(val widget: Widget) : RoomDetailViewEvents() + + object OpenIntegrationManager : RoomDetailViewEvents() + object OpenActiveWidgetBottomSheet : RoomDetailViewEvents() data class RequestNativeWidgetPermission(val widget: Widget, val domain: String, val grantedEvents: RoomDetailViewEvents) : RoomDetailViewEvents() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 1b5e9288436..2e7109b5e77 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -571,6 +571,10 @@ class RoomDetailViewModel @AssistedInject constructor( _viewEvents.post(RoomDetailViewEvents.MessageSent) popDraft() } + is ParsedCommand.ChangeRoomName -> { + handleChangeRoomNameSlashCommand(slashCommandResult) + popDraft() + } is ParsedCommand.Invite -> { handleInviteSlashCommand(slashCommandResult) popDraft() @@ -593,12 +597,20 @@ class RoomDetailViewModel @AssistedInject constructor( if (slashCommandResult.enable) R.string.markdown_has_been_enabled else R.string.markdown_has_been_disabled)) popDraft() } + is ParsedCommand.BanUser -> { + handleBanSlashCommand(slashCommandResult) + popDraft() + } is ParsedCommand.UnbanUser -> { handleUnbanSlashCommand(slashCommandResult) popDraft() } - is ParsedCommand.BanUser -> { - handleBanSlashCommand(slashCommandResult) + is ParsedCommand.IgnoreUser -> { + handleIgnoreSlashCommand(slashCommandResult) + popDraft() + } + is ParsedCommand.UnignoreUser -> { + handleUnignoreSlashCommand(slashCommandResult) popDraft() } is ParsedCommand.KickUser -> { @@ -641,14 +653,12 @@ class RoomDetailViewModel @AssistedInject constructor( popDraft() } is ParsedCommand.SendShrug -> { - val sequence = buildString { - append("¯\\_(ツ)_/¯") - if (slashCommandResult.message.isNotEmpty()) { - append(" ") - append(slashCommandResult.message) - } - } - room.sendTextMessage(sequence) + sendPrefixedMessage("¯\\_(ツ)_/¯", slashCommandResult.message) + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) + popDraft() + } + is ParsedCommand.SendLenny -> { + sendPrefixedMessage("( ͡° ͜ʖ ͡°)", slashCommandResult.message) _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) popDraft() } @@ -665,6 +675,11 @@ class RoomDetailViewModel @AssistedInject constructor( handleChangeDisplayNameSlashCommand(slashCommandResult) popDraft() } + is ParsedCommand.ShowUser -> { + _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) + handleWhoisSlashCommand(slashCommandResult) + popDraft() + } is ParsedCommand.DiscardSession -> { if (room.isEncrypted()) { session.cryptoService().discardOutboundSession(room.roomId) @@ -786,6 +801,12 @@ class RoomDetailViewModel @AssistedInject constructor( } } + private fun handleChangeRoomNameSlashCommand(changeRoomName: ParsedCommand.ChangeRoomName) { + launchSlashCommandFlow { + room.updateName(changeRoomName.name, it) + } + } + private fun handleInviteSlashCommand(invite: ParsedCommand.Invite) { launchSlashCommandFlow { room.invite(invite.userId, invite.reason, it) @@ -833,6 +854,33 @@ class RoomDetailViewModel @AssistedInject constructor( } } + private fun handleIgnoreSlashCommand(ignore: ParsedCommand.IgnoreUser) { + launchSlashCommandFlow { + session.ignoreUserIds(listOf(ignore.userId), it) + } + } + + private fun handleUnignoreSlashCommand(unignore: ParsedCommand.UnignoreUser) { + launchSlashCommandFlow { + session.unIgnoreUserIds(listOf(unignore.userId), it) + } + } + + private fun handleWhoisSlashCommand(whois: ParsedCommand.ShowUser) { + _viewEvents.post(RoomDetailViewEvents.OpenRoomMemberProfile(whois.userId)) + } + + private fun sendPrefixedMessage(prefix: String, message: CharSequence) { + val sequence = buildString { + append(prefix) + if (message.isNotEmpty()) { + append(" ") + append(message) + } + } + room.sendTextMessage(sequence) + } + private fun launchSlashCommandFlow(lambda: (MatrixCallback) -> Unit) { _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) val matrixCallback = object : MatrixCallback { diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index c025054f980..f87b45cd054 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1287,8 +1287,11 @@ Displays action Bans user with given id Unbans user with given id + Ignores a user, hiding their messages from you + Stops ignoring a user, showing their messages going forward Define the power level of a user Deops user with given id + Sets the room name Invites user with given id to current room Joins room with given alias Leave room @@ -1297,6 +1300,7 @@ Changes your display nickname On/Off markdown To fix Matrix Apps management + Displays information about a user Markdown has been enabled. Markdown has been disabled. @@ -2063,6 +2067,7 @@ Element may crash more often when an unexpected error occurs Prepends ¯\\_(ツ)_/¯ to a plain-text message + Prepends ( ͡° ͜ʖ ͡°) to a plain-text message "Enable encryption" "Once enabled, encryption cannot be disabled." From 13960561c00d6a44d8e44d7f8586be66075aeeb5 Mon Sep 17 00:00:00 2001 From: Constantin Wartenburger Date: Sat, 10 Oct 2020 18:34:31 +0200 Subject: [PATCH 002/350] Added /myroomnick command --- .../im/vector/app/features/command/Command.kt | 1 + .../app/features/command/CommandParser.kt | 23 +++++++++++++------ .../app/features/command/ParsedCommand.kt | 1 + .../home/room/detail/RoomDetailViewModel.kt | 15 ++++++++++++ vector/src/main/res/values/strings.xml | 1 + 5 files changed, 34 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/command/Command.kt b/vector/src/main/java/im/vector/app/features/command/Command.kt index c1b30b2744c..1db1639b1d4 100644 --- a/vector/src/main/java/im/vector/app/features/command/Command.kt +++ b/vector/src/main/java/im/vector/app/features/command/Command.kt @@ -39,6 +39,7 @@ enum class Command(val command: String, val parameters: String, @StringRes val d TOPIC("/topic", "", R.string.command_description_topic), KICK_USER("/kick", " [reason]", R.string.command_description_kick_user), CHANGE_DISPLAY_NAME("/nick", "", R.string.command_description_nick), + CHANGE_DISPLAY_NAME_FOR_ROOM("/myroomnick", "", R.string.command_description_room_nick), MARKDOWN("/markdown", "", R.string.command_description_markdown), RAINBOW("/rainbow", "", R.string.command_description_rainbow), RAINBOW_EMOTE("/rainbowme", "", R.string.command_description_rainbow_emote), diff --git a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt index fd7d587c1cd..e09b6a842df 100644 --- a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt +++ b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt @@ -60,7 +60,7 @@ object CommandParser { } return when (val slashCommand = messageParts.first()) { - Command.PLAIN.command -> { + Command.PLAIN.command -> { val text = textMessage.substring(Command.PLAIN.command.length).trim() if (text.isNotEmpty()) { @@ -69,7 +69,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.PLAIN) } } - Command.CHANGE_DISPLAY_NAME.command -> { + Command.CHANGE_DISPLAY_NAME.command -> { val newDisplayName = textMessage.substring(Command.CHANGE_DISPLAY_NAME.command.length).trim() if (newDisplayName.isNotEmpty()) { @@ -78,7 +78,16 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.CHANGE_DISPLAY_NAME) } } - Command.TOPIC.command -> { + Command.CHANGE_DISPLAY_NAME_FOR_ROOM.command -> { + val newDisplayName = textMessage.substring(Command.CHANGE_DISPLAY_NAME_FOR_ROOM.command.length).trim() + + if (newDisplayName.isNotEmpty()) { + ParsedCommand.ChangeDisplayNameForRoom(newDisplayName) + } else { + ParsedCommand.ErrorSyntax(Command.CHANGE_DISPLAY_NAME_FOR_ROOM) + } + } + Command.TOPIC.command -> { val newTopic = textMessage.substring(Command.TOPIC.command.length).trim() if (newTopic.isNotEmpty()) { @@ -87,22 +96,22 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.TOPIC) } } - Command.EMOTE.command -> { + Command.EMOTE.command -> { val message = textMessage.subSequence(Command.EMOTE.command.length, textMessage.length).trim() ParsedCommand.SendEmote(message) } - Command.RAINBOW.command -> { + Command.RAINBOW.command -> { val message = textMessage.subSequence(Command.RAINBOW.command.length, textMessage.length).trim() ParsedCommand.SendRainbow(message) } - Command.RAINBOW_EMOTE.command -> { + Command.RAINBOW_EMOTE.command -> { val message = textMessage.subSequence(Command.RAINBOW_EMOTE.command.length, textMessage.length).trim() ParsedCommand.SendRainbowEmote(message) } - Command.JOIN_ROOM.command -> { + Command.JOIN_ROOM.command -> { if (messageParts.size >= 2) { val roomAlias = messageParts[1] diff --git a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt index 54043f343a7..60b4e1c3a21 100644 --- a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt +++ b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt @@ -52,6 +52,7 @@ sealed class ParsedCommand { class ChangeTopic(val topic: String) : ParsedCommand() class KickUser(val userId: String, val reason: String?) : ParsedCommand() class ChangeDisplayName(val displayName: String) : ParsedCommand() + class ChangeDisplayNameForRoom(val displayName: String) : ParsedCommand() class SetMarkdown(val enable: Boolean) : ParsedCommand() object ClearScalarToken : ParsedCommand() class SendSpoiler(val message: String) : ParsedCommand() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 2e7109b5e77..10942f17bf4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -74,6 +74,7 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent +import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary import org.matrix.android.sdk.api.session.room.model.message.MessageContent @@ -675,6 +676,10 @@ class RoomDetailViewModel @AssistedInject constructor( handleChangeDisplayNameSlashCommand(slashCommandResult) popDraft() } + is ParsedCommand.ChangeDisplayNameForRoom -> { + handleChangeDisplayNameForRoomSlashCommand(slashCommandResult) + popDraft() + } is ParsedCommand.ShowUser -> { _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) handleWhoisSlashCommand(slashCommandResult) @@ -836,6 +841,16 @@ class RoomDetailViewModel @AssistedInject constructor( } } + private fun handleChangeDisplayNameForRoomSlashCommand(changeDisplayName: ParsedCommand.ChangeDisplayNameForRoom) { + val content = room.getStateEvent(EventType.STATE_ROOM_MEMBER, QueryStringValue.Equals(session.myUserId)) + ?.content?.toModel() + ?: RoomMemberContent(membership = Membership.JOIN) + + launchSlashCommandFlow { + room.sendStateEvent(EventType.STATE_ROOM_MEMBER, session.myUserId, content.copy(displayName = changeDisplayName.displayName).toContent(), it) + } + } + private fun handleKickSlashCommand(kick: ParsedCommand.KickUser) { launchSlashCommandFlow { room.kick(kick.userId, kick.reason, it) diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index f87b45cd054..33c648d647d 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1298,6 +1298,7 @@ Set the room topic Kicks user with given id Changes your display nickname + Changes your display nickname On/Off markdown To fix Matrix Apps management Displays information about a user From 1a40b65b53677b79b3d6beb34335fdd9d3dab80a Mon Sep 17 00:00:00 2001 From: Constantin Wartenburger Date: Sun, 11 Oct 2020 18:56:13 +0200 Subject: [PATCH 003/350] Added /myroomavatar command (without upload) --- .../im/vector/app/features/command/Command.kt | 3 +- .../app/features/command/CommandParser.kt | 51 ++++++++++++------- .../app/features/command/ParsedCommand.kt | 1 + .../home/room/detail/RoomDetailViewModel.kt | 18 +++++-- vector/src/main/res/values/strings.xml | 3 +- 5 files changed, 52 insertions(+), 24 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/command/Command.kt b/vector/src/main/java/im/vector/app/features/command/Command.kt index 1db1639b1d4..fd0623dc05e 100644 --- a/vector/src/main/java/im/vector/app/features/command/Command.kt +++ b/vector/src/main/java/im/vector/app/features/command/Command.kt @@ -39,7 +39,8 @@ enum class Command(val command: String, val parameters: String, @StringRes val d TOPIC("/topic", "", R.string.command_description_topic), KICK_USER("/kick", " [reason]", R.string.command_description_kick_user), CHANGE_DISPLAY_NAME("/nick", "", R.string.command_description_nick), - CHANGE_DISPLAY_NAME_FOR_ROOM("/myroomnick", "", R.string.command_description_room_nick), + CHANGE_DISPLAY_NAME_FOR_ROOM("/myroomnick", "", R.string.command_description_nick_for_room), + CHANGE_AVATAR_FOR_ROOM("/myroomavatar", "", R.string.command_description_avatar_for_room), MARKDOWN("/markdown", "", R.string.command_description_markdown), RAINBOW("/rainbow", "", R.string.command_description_rainbow), RAINBOW_EMOTE("/rainbowme", "", R.string.command_description_rainbow_emote), diff --git a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt index e09b6a842df..d5fb9a41b65 100644 --- a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt +++ b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt @@ -87,6 +87,19 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.CHANGE_DISPLAY_NAME_FOR_ROOM) } } + Command.CHANGE_AVATAR_FOR_ROOM.command -> { + if (messageParts.size == 2) { + val url = messageParts[1] + + if (url.isNotEmpty()) { + ParsedCommand.ChangeAvatarForRoom(url) + } else { + ParsedCommand.ErrorSyntax(Command.CHANGE_AVATAR_FOR_ROOM) + } + } else { + ParsedCommand.ErrorSyntax(Command.CHANGE_AVATAR_FOR_ROOM) + } + } Command.TOPIC.command -> { val newTopic = textMessage.substring(Command.TOPIC.command.length).trim() @@ -129,7 +142,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.JOIN_ROOM) } } - Command.PART.command -> { + Command.PART.command -> { if (messageParts.size >= 2) { val roomAlias = messageParts[1] @@ -147,7 +160,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.PART) } } - Command.ROOM_NAME.command -> { + Command.ROOM_NAME.command -> { val newRoomName = textMessage.substring(Command.ROOM_NAME.command.length).trim() if (newRoomName.isNotEmpty()) { @@ -156,7 +169,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.ROOM_NAME) } } - Command.INVITE.command -> { + Command.INVITE.command -> { if (messageParts.size >= 2) { val userId = messageParts[1] @@ -183,7 +196,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.INVITE) } } - Command.KICK_USER.command -> { + Command.KICK_USER.command -> { if (messageParts.size >= 2) { val userId = messageParts[1] @@ -201,7 +214,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.KICK_USER) } } - Command.BAN_USER.command -> { + Command.BAN_USER.command -> { if (messageParts.size >= 2) { val userId = messageParts[1] @@ -219,7 +232,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.BAN_USER) } } - Command.UNBAN_USER.command -> { + Command.UNBAN_USER.command -> { if (messageParts.size >= 2) { val userId = messageParts[1] @@ -237,7 +250,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.UNBAN_USER) } } - Command.IGNORE_USER.command -> { + Command.IGNORE_USER.command -> { if (messageParts.size == 2) { val userId = messageParts[1] @@ -250,7 +263,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.IGNORE_USER) } } - Command.UNIGNORE_USER.command -> { + Command.UNIGNORE_USER.command -> { if (messageParts.size == 2) { val userId = messageParts[1] @@ -263,7 +276,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.UNIGNORE_USER) } } - Command.SET_USER_POWER_LEVEL.command -> { + Command.SET_USER_POWER_LEVEL.command -> { if (messageParts.size == 3) { val userId = messageParts[1] if (MatrixPatterns.isUserId(userId)) { @@ -283,7 +296,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.SET_USER_POWER_LEVEL) } } - Command.RESET_USER_POWER_LEVEL.command -> { + Command.RESET_USER_POWER_LEVEL.command -> { if (messageParts.size == 2) { val userId = messageParts[1] @@ -296,7 +309,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.SET_USER_POWER_LEVEL) } } - Command.MARKDOWN.command -> { + Command.MARKDOWN.command -> { if (messageParts.size == 2) { when { "on".equals(messageParts[1], true) -> ParsedCommand.SetMarkdown(true) @@ -307,28 +320,28 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.MARKDOWN) } } - Command.CLEAR_SCALAR_TOKEN.command -> { + Command.CLEAR_SCALAR_TOKEN.command -> { if (messageParts.size == 1) { ParsedCommand.ClearScalarToken } else { ParsedCommand.ErrorSyntax(Command.CLEAR_SCALAR_TOKEN) } } - Command.SPOILER.command -> { + Command.SPOILER.command -> { val message = textMessage.substring(Command.SPOILER.command.length).trim() ParsedCommand.SendSpoiler(message) } - Command.SHRUG.command -> { + Command.SHRUG.command -> { val message = textMessage.substring(Command.SHRUG.command.length).trim() ParsedCommand.SendShrug(message) } - Command.LENNY.command -> { + Command.LENNY.command -> { val message = textMessage.substring(Command.LENNY.command.length).trim() ParsedCommand.SendLenny(message) } - Command.POLL.command -> { + Command.POLL.command -> { val rawCommand = textMessage.substring(Command.POLL.command.length).trim() val split = rawCommand.split("|").map { it.trim() } if (split.size > 2) { @@ -337,10 +350,10 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.POLL) } } - Command.DISCARD_SESSION.command -> { + Command.DISCARD_SESSION.command -> { ParsedCommand.DiscardSession } - Command.WHOIS.command -> { + Command.WHOIS.command -> { if (messageParts.size == 2) { val userId = messageParts[1] @@ -353,7 +366,7 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.WHOIS) } } - else -> { + else -> { // Unknown command ParsedCommand.ErrorUnknownSlashCommand(slashCommand) } diff --git a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt index 60b4e1c3a21..f0dcbc96630 100644 --- a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt +++ b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt @@ -53,6 +53,7 @@ sealed class ParsedCommand { class KickUser(val userId: String, val reason: String?) : ParsedCommand() class ChangeDisplayName(val displayName: String) : ParsedCommand() class ChangeDisplayNameForRoom(val displayName: String) : ParsedCommand() + class ChangeAvatarForRoom(val url: String) : ParsedCommand() class SetMarkdown(val enable: Boolean) : ParsedCommand() object ClearScalarToken : ParsedCommand() class SendSpoiler(val message: String) : ParsedCommand() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index 10942f17bf4..e84eb5520c0 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -680,6 +680,10 @@ class RoomDetailViewModel @AssistedInject constructor( handleChangeDisplayNameForRoomSlashCommand(slashCommandResult) popDraft() } + is ParsedCommand.ChangeAvatarForRoom -> { + handleChangeAvatarForRoomSlashCommand(slashCommandResult) + popDraft() + } is ParsedCommand.ShowUser -> { _viewEvents.post(RoomDetailViewEvents.SlashCommandHandled()) handleWhoisSlashCommand(slashCommandResult) @@ -841,13 +845,21 @@ class RoomDetailViewModel @AssistedInject constructor( } } - private fun handleChangeDisplayNameForRoomSlashCommand(changeDisplayName: ParsedCommand.ChangeDisplayNameForRoom) { - val content = room.getStateEvent(EventType.STATE_ROOM_MEMBER, QueryStringValue.Equals(session.myUserId)) + private fun getLastMemberEvent(): RoomMemberContent { + return room.getStateEvent(EventType.STATE_ROOM_MEMBER, QueryStringValue.Equals(session.myUserId)) ?.content?.toModel() ?: RoomMemberContent(membership = Membership.JOIN) + } + + private fun handleChangeDisplayNameForRoomSlashCommand(changeDisplayName: ParsedCommand.ChangeDisplayNameForRoom) { + launchSlashCommandFlow { + room.sendStateEvent(EventType.STATE_ROOM_MEMBER, session.myUserId, getLastMemberEvent().copy(displayName = changeDisplayName.displayName).toContent(), it) + } + } + private fun handleChangeAvatarForRoomSlashCommand(changeAvatar: ParsedCommand.ChangeAvatarForRoom) { launchSlashCommandFlow { - room.sendStateEvent(EventType.STATE_ROOM_MEMBER, session.myUserId, content.copy(displayName = changeDisplayName.displayName).toContent(), it) + room.sendStateEvent(EventType.STATE_ROOM_MEMBER, session.myUserId, getLastMemberEvent().copy(avatarUrl = changeAvatar.url).toContent(), it) } } diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 33c648d647d..823d567f204 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1298,7 +1298,8 @@ Set the room topic Kicks user with given id Changes your display nickname - Changes your display nickname + Changes your display nickname in the current room only + Changes your avatar in this current room only On/Off markdown To fix Matrix Apps management Displays information about a user From 24c67660c12d8ac402e50dee16a2c2f6ea94dae1 Mon Sep 17 00:00:00 2001 From: Constantin Wartenburger Date: Mon, 12 Oct 2020 17:43:07 +0200 Subject: [PATCH 004/350] Added /roomavatar command (not upload) --- .../im/vector/app/features/command/Command.kt | 3 ++- .../vector/app/features/command/CommandParser.kt | 15 ++++++++++++++- .../vector/app/features/command/ParsedCommand.kt | 1 + .../home/room/detail/RoomDetailViewModel.kt | 11 +++++++++++ vector/src/main/res/values/strings.xml | 1 + 5 files changed, 29 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/command/Command.kt b/vector/src/main/java/im/vector/app/features/command/Command.kt index fd0623dc05e..b74b608e32a 100644 --- a/vector/src/main/java/im/vector/app/features/command/Command.kt +++ b/vector/src/main/java/im/vector/app/features/command/Command.kt @@ -32,7 +32,7 @@ enum class Command(val command: String, val parameters: String, @StringRes val d UNIGNORE_USER("/unignore", "", R.string.command_description_unignore_user), SET_USER_POWER_LEVEL("/op", " []", R.string.command_description_op_user), RESET_USER_POWER_LEVEL("/deop", "", R.string.command_description_deop_user), - ROOM_NAME("/roomname", " [reason]", R.string.command_description_room_name), + ROOM_NAME("/roomname", "", R.string.command_description_room_name), INVITE("/invite", " [reason]", R.string.command_description_invite_user), JOIN_ROOM("/join", " [reason]", R.string.command_description_join_room), PART("/part", " [reason]", R.string.command_description_part_room), @@ -40,6 +40,7 @@ enum class Command(val command: String, val parameters: String, @StringRes val d KICK_USER("/kick", " [reason]", R.string.command_description_kick_user), CHANGE_DISPLAY_NAME("/nick", "", R.string.command_description_nick), CHANGE_DISPLAY_NAME_FOR_ROOM("/myroomnick", "", R.string.command_description_nick_for_room), + ROOM_AVATAR("/roomavatar", "", R.string.command_description_room_avatar), CHANGE_AVATAR_FOR_ROOM("/myroomavatar", "", R.string.command_description_avatar_for_room), MARKDOWN("/markdown", "", R.string.command_description_markdown), RAINBOW("/rainbow", "", R.string.command_description_rainbow), diff --git a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt index d5fb9a41b65..41961c209ad 100644 --- a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt +++ b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt @@ -87,11 +87,24 @@ object CommandParser { ParsedCommand.ErrorSyntax(Command.CHANGE_DISPLAY_NAME_FOR_ROOM) } } + Command.ROOM_AVATAR.command -> { + if (messageParts.size == 2) { + val url = messageParts[1] + + if (url.isNotEmpty() && url.startsWith("mxc://")) { + ParsedCommand.ChangeRoomAvatar(url) + } else { + ParsedCommand.ErrorSyntax(Command.ROOM_AVATAR) + } + } else { + ParsedCommand.ErrorSyntax(Command.ROOM_AVATAR) + } + } Command.CHANGE_AVATAR_FOR_ROOM.command -> { if (messageParts.size == 2) { val url = messageParts[1] - if (url.isNotEmpty()) { + if (url.isNotEmpty() && url.startsWith("mxc://")) { ParsedCommand.ChangeAvatarForRoom(url) } else { ParsedCommand.ErrorSyntax(Command.CHANGE_AVATAR_FOR_ROOM) diff --git a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt index f0dcbc96630..16f2eaac291 100644 --- a/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt +++ b/vector/src/main/java/im/vector/app/features/command/ParsedCommand.kt @@ -53,6 +53,7 @@ sealed class ParsedCommand { class KickUser(val userId: String, val reason: String?) : ParsedCommand() class ChangeDisplayName(val displayName: String) : ParsedCommand() class ChangeDisplayNameForRoom(val displayName: String) : ParsedCommand() + class ChangeRoomAvatar(val url: String) : ParsedCommand() class ChangeAvatarForRoom(val url: String) : ParsedCommand() class SetMarkdown(val enable: Boolean) : ParsedCommand() object ClearScalarToken : ParsedCommand() diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt index e84eb5520c0..737cdf61b04 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/RoomDetailViewModel.kt @@ -74,6 +74,7 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent +import org.matrix.android.sdk.api.session.room.model.RoomAvatarContent import org.matrix.android.sdk.api.session.room.model.RoomMemberContent import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary import org.matrix.android.sdk.api.session.room.model.RoomSummary @@ -680,6 +681,10 @@ class RoomDetailViewModel @AssistedInject constructor( handleChangeDisplayNameForRoomSlashCommand(slashCommandResult) popDraft() } + is ParsedCommand.ChangeRoomAvatar -> { + handleChangeRoomAvatarSlashCommand(slashCommandResult) + popDraft() + } is ParsedCommand.ChangeAvatarForRoom -> { handleChangeAvatarForRoomSlashCommand(slashCommandResult) popDraft() @@ -857,6 +862,12 @@ class RoomDetailViewModel @AssistedInject constructor( } } + private fun handleChangeRoomAvatarSlashCommand(changeAvatar: ParsedCommand.ChangeRoomAvatar) { + launchSlashCommandFlow { + room.sendStateEvent(EventType.STATE_ROOM_AVATAR, null, RoomAvatarContent(changeAvatar.url).toContent(), it) + } + } + private fun handleChangeAvatarForRoomSlashCommand(changeAvatar: ParsedCommand.ChangeAvatarForRoom) { launchSlashCommandFlow { room.sendStateEvent(EventType.STATE_ROOM_MEMBER, session.myUserId, getLastMemberEvent().copy(avatarUrl = changeAvatar.url).toContent(), it) diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 823d567f204..909ef01b4cc 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1299,6 +1299,7 @@ Kicks user with given id Changes your display nickname Changes your display nickname in the current room only + Changes the avatar of the current room Changes your avatar in this current room only On/Off markdown To fix Matrix Apps management From 5b6727408b5498aa553f7781ecb63d2b2863066b Mon Sep 17 00:00:00 2001 From: Constantin Wartenburger Date: Tue, 13 Oct 2020 15:10:57 +0200 Subject: [PATCH 005/350] Fix wrong parameter name --- .../src/main/java/im/vector/app/features/command/Command.kt | 2 +- .../main/java/im/vector/app/features/command/CommandParser.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/command/Command.kt b/vector/src/main/java/im/vector/app/features/command/Command.kt index b74b608e32a..81bbf8177d6 100644 --- a/vector/src/main/java/im/vector/app/features/command/Command.kt +++ b/vector/src/main/java/im/vector/app/features/command/Command.kt @@ -32,7 +32,7 @@ enum class Command(val command: String, val parameters: String, @StringRes val d UNIGNORE_USER("/unignore", "", R.string.command_description_unignore_user), SET_USER_POWER_LEVEL("/op", " []", R.string.command_description_op_user), RESET_USER_POWER_LEVEL("/deop", "", R.string.command_description_deop_user), - ROOM_NAME("/roomname", "", R.string.command_description_room_name), + ROOM_NAME("/roomname", "", R.string.command_description_room_name), INVITE("/invite", " [reason]", R.string.command_description_invite_user), JOIN_ROOM("/join", " [reason]", R.string.command_description_join_room), PART("/part", " [reason]", R.string.command_description_part_room), diff --git a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt index 41961c209ad..29eba004906 100644 --- a/vector/src/main/java/im/vector/app/features/command/CommandParser.kt +++ b/vector/src/main/java/im/vector/app/features/command/CommandParser.kt @@ -91,7 +91,7 @@ object CommandParser { if (messageParts.size == 2) { val url = messageParts[1] - if (url.isNotEmpty() && url.startsWith("mxc://")) { + if (url.startsWith("mxc://")) { ParsedCommand.ChangeRoomAvatar(url) } else { ParsedCommand.ErrorSyntax(Command.ROOM_AVATAR) @@ -104,7 +104,7 @@ object CommandParser { if (messageParts.size == 2) { val url = messageParts[1] - if (url.isNotEmpty() && url.startsWith("mxc://")) { + if (url.startsWith("mxc://")) { ParsedCommand.ChangeAvatarForRoom(url) } else { ParsedCommand.ErrorSyntax(Command.CHANGE_AVATAR_FOR_ROOM) From 451c2379ec3b9ca4430eff872d48d2287871a931 Mon Sep 17 00:00:00 2001 From: SpiritCroc Date: Fri, 28 May 2021 15:16:04 +0200 Subject: [PATCH 006/350] Do not notify again for old events Resending the notification here can trigger other system components or apps that listen to new notifications, such as connected smart watches or automation tools. Fixes https://github.com/vector-im/element-android/issues/1673 --- changelog.d/1673.bugfix | 1 + .../app/features/notifications/NotificationDrawerManager.kt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/1673.bugfix diff --git a/changelog.d/1673.bugfix b/changelog.d/1673.bugfix new file mode 100644 index 00000000000..b0459f34b85 --- /dev/null +++ b/changelog.d/1673.bugfix @@ -0,0 +1 @@ +Avoid resending notifications that are already shown diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt index 37ed1e654ad..fd15455391a 100644 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationDrawerManager.kt @@ -457,7 +457,7 @@ class NotificationDrawerManager @Inject constructor(private val context: Context if (eventList.isEmpty() || eventList.all { it.isRedacted }) { notificationUtils.cancelNotificationMessage(null, SUMMARY_NOTIFICATION_ID) - } else { + } else if (hasNewEvent) { // FIXME roomIdToEventMap.size is not correct, this is the number of rooms val nbEvents = roomIdToEventMap.size + simpleEvents.size val sumTitle = stringProvider.getQuantityString(R.plurals.notification_compat_summary_title, nbEvents, nbEvents) From 8c590b50e3938abadc506bbdeb36ffccc32f4f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Sun, 1 Aug 2021 14:51:00 +0200 Subject: [PATCH 007/350] Improve accessibility of voice messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- .../home/room/detail/composer/VoiceMessageRecorderView.kt | 5 +++++ .../home/room/detail/timeline/item/MessageVoiceItem.kt | 3 +++ .../src/main/res/layout/item_timeline_event_voice_stub.xml | 3 ++- vector/src/main/res/layout/view_voice_message_recorder.xml | 7 +++++-- vector/src/main/res/values/strings.xml | 6 +++--- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt index ba6e0fbae7c..a90c1c4d3a4 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt @@ -20,6 +20,7 @@ import android.content.Context import android.text.format.DateUtils import android.util.AttributeSet import android.view.MotionEvent +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isInvisible import androidx.core.view.isVisible @@ -476,12 +477,14 @@ class VoiceMessageRecorderView @JvmOverloads constructor( views.voiceMessagePlaybackTimerIndicator.isVisible = true views.voicePlaybackControlButton.isVisible = false views.voiceMessageSendButton.isVisible = true + views.voicePlaybackWaveform.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES renderToast(context.getString(R.string.voice_message_tap_to_stop_toast)) } private fun showPlaybackViews() { views.voiceMessagePlaybackTimerIndicator.isVisible = false views.voicePlaybackControlButton.isVisible = true + views.voicePlaybackWaveform.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_NO callback?.onVoiceRecordingPlaybackModeOn() } @@ -507,12 +510,14 @@ class VoiceMessageRecorderView @JvmOverloads constructor( } is VoiceMessagePlaybackTracker.Listener.State.Playing -> { views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause) + views.voicePlaybackControlButton.contentDescription = resources.getString(R.string.a11y_pause_voice_message) val formattedTimerText = DateUtils.formatElapsedTime((state.playbackTime / 1000).toLong()) views.voicePlaybackTime.text = formattedTimerText } is VoiceMessagePlaybackTracker.Listener.State.Paused, is VoiceMessagePlaybackTracker.Listener.State.Idle -> { views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) + views.voicePlaybackControlButton.contentDescription = resources.getString(R.string.a11y_play_voice_message) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt index dc204da2910..fce2db2bfda 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt @@ -98,16 +98,19 @@ abstract class MessageVoiceItem : AbsMessageItem() { private fun renderIdleState(holder: Holder) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) + holder.voicePlaybackControlButton.contentDescription = holder.view.context.resources.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(duration) } private fun renderPlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause) + holder.voicePlaybackControlButton.contentDescription = holder.view.context.resources.getString(R.string.a11y_pause_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) } private fun renderPausedState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Paused) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) + holder.voicePlaybackControlButton.contentDescription = holder.view.context.resources.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) } diff --git a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml index 21705566e94..2c8ade173aa 100644 --- a/vector/src/main/res/layout/item_timeline_event_voice_stub.xml +++ b/vector/src/main/res/layout/item_timeline_event_voice_stub.xml @@ -53,6 +53,7 @@ android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" + android:importantForAccessibility="no" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/voicePlaybackTime" @@ -77,4 +78,4 @@ app:layout_constraintTop_toBottomOf="@+id/voicePlaybackLayout" tools:visibility="visible" /> - \ No newline at end of file + diff --git a/vector/src/main/res/layout/view_voice_message_recorder.xml b/vector/src/main/res/layout/view_voice_message_recorder.xml index d309761815d..051928b73d4 100644 --- a/vector/src/main/res/layout/view_voice_message_recorder.xml +++ b/vector/src/main/res/layout/view_voice_message_recorder.xml @@ -107,7 +107,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="28dp" - android:contentDescription="@string/a11y_lock_voice_message" + android:importantForAccessibility="no" android:src="@drawable/ic_voice_message_unlocked" android:visibility="gone" app:layout_constraintEnd_toEndOf="@id/voiceMessageMicButton" @@ -215,6 +215,8 @@ android:layout_height="0dp" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" + android:contentDescription="@string/a11y_stop_voice_message" + android:importantForAccessibility="no" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toEndOf="@id/voicePlaybackTime" @@ -231,10 +233,11 @@ android:layout_height="wrap_content" android:layout_marginBottom="84dp" android:visibility="gone" + android:accessibilityLiveRegion="polite" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" tools:text="@string/voice_message_release_to_send_toast" tools:visibility="visible" /> - \ No newline at end of file + diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 8e6bf85eae9..468c51bac83 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -3460,13 +3460,13 @@ Sorry, an error occurred while trying to join: %s - Start Voice Message + Record Voice Message Slide to cancel - Voice Message Lock Play Voice Message Pause Voice Message + Stop Recording Recording voice message - Delete recorded voice message + Delete recording Hold to record, release to send %1$ds left Tap on your recording to stop or listen From ebe1e28689604b7bf25f04dc20c2ec9cbdf7805c Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 23 Aug 2021 16:46:13 +0200 Subject: [PATCH 008/350] Sync: makes SyncResponse in public API --- .../session/sync/model/DeviceListResponse.kt | 5 +++-- .../sync/model/DeviceOneTimeKeysCountSyncResponse.kt | 4 ++-- .../session/sync/model/GroupSyncProfile.kt | 4 ++-- .../session/sync/model/GroupsSyncResponse.kt | 4 ++-- .../session/sync/model/InvitedGroupSync.kt | 4 ++-- .../session/sync/model/InvitedRoomSync.kt | 5 +++-- .../session/sync/model/LazyRoomSyncEphemeral.kt | 8 ++++---- .../session/sync/model/PresenceSyncResponse.kt | 4 ++-- .../session/sync/model/RoomInviteState.kt | 5 +++-- .../sdk/{internal => api}/session/sync/model/RoomSync.kt | 5 +++-- .../session/sync/model/RoomSyncAccountData.kt | 4 ++-- .../session/sync/model/RoomSyncEphemeral.kt | 4 ++-- .../{internal => api}/session/sync/model/RoomSyncState.kt | 4 ++-- .../session/sync/model/RoomSyncSummary.kt | 4 ++-- .../session/sync/model/RoomSyncTimeline.kt | 4 ++-- .../session/sync/model/RoomSyncUnreadNotifications.kt | 4 ++-- .../session/sync/model/RoomsSyncResponse.kt | 5 +++-- .../{internal => api}/session/sync/model/SyncResponse.kt | 4 ++-- .../session/sync/model/ToDeviceSyncResponse.kt | 4 ++-- .../android/sdk/internal/crypto/DefaultCryptoService.kt | 2 +- .../session/notification/ProcessEventForPushTask.kt | 2 +- .../internal/session/room/summary/RoomSummaryUpdater.kt | 4 ++-- .../sdk/internal/session/sync/CryptoSyncHandler.kt | 4 ++-- .../android/sdk/internal/session/sync/GroupSyncHandler.kt | 4 ++-- .../session/sync/RoomSyncEphemeralTemporaryStore.kt | 2 +- .../android/sdk/internal/session/sync/RoomSyncHandler.kt | 8 ++++---- .../matrix/android/sdk/internal/session/sync/SyncAPI.kt | 2 +- .../sdk/internal/session/sync/SyncResponseHandler.kt | 6 +++--- .../matrix/android/sdk/internal/session/sync/SyncTask.kt | 3 ++- .../internal/session/sync/UserAccountDataSyncHandler.kt | 2 +- .../session/sync/model/accountdata/UserAccountDataSync.kt | 2 +- .../parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt | 4 ++-- .../session/sync/parsing/InitialSyncResponseParser.kt | 2 +- .../session/sync/parsing/RoomSyncAccountDataHandler.kt | 2 +- 34 files changed, 70 insertions(+), 64 deletions(-) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/DeviceListResponse.kt (90%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/DeviceOneTimeKeysCountSyncResponse.kt (87%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/GroupSyncProfile.kt (91%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/GroupsSyncResponse.kt (92%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/InvitedGroupSync.kt (90%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/InvitedRoomSync.kt (93%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/LazyRoomSyncEphemeral.kt (77%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/PresenceSyncResponse.kt (90%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomInviteState.kt (91%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomSync.kt (95%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomSyncAccountData.kt (90%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomSyncEphemeral.kt (91%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomSyncState.kt (91%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomSyncSummary.kt (95%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomSyncTimeline.kt (93%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomSyncUnreadNotifications.kt (92%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/RoomsSyncResponse.kt (93%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/SyncResponse.kt (95%) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/{internal => api}/session/sync/model/ToDeviceSyncResponse.kt (90%) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/DeviceListResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/DeviceListResponse.kt similarity index 90% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/DeviceListResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/DeviceListResponse.kt index bfa8c342b6f..c05e1e51878 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/DeviceListResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/DeviceListResponse.kt @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model + +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.JsonClass @@ -21,7 +22,7 @@ import com.squareup.moshi.JsonClass * This class describes the device list response from a sync request */ @JsonClass(generateAdapter = true) -internal data class DeviceListResponse( +data class DeviceListResponse( // user ids list which have new crypto devices val changed: List = emptyList(), // List of user ids who are no more tracked. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/DeviceOneTimeKeysCountSyncResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/DeviceOneTimeKeysCountSyncResponse.kt similarity index 87% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/DeviceOneTimeKeysCountSyncResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/DeviceOneTimeKeysCountSyncResponse.kt index d5b435ac275..930cfb153ff 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/DeviceOneTimeKeysCountSyncResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/DeviceOneTimeKeysCountSyncResponse.kt @@ -14,12 +14,12 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -internal data class DeviceOneTimeKeysCountSyncResponse( +data class DeviceOneTimeKeysCountSyncResponse( @Json(name = "signed_curve25519") val signedCurve25519: Int? = null ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/GroupSyncProfile.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/GroupSyncProfile.kt similarity index 91% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/GroupSyncProfile.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/GroupSyncProfile.kt index ee6aabb0a99..581e6824ee5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/GroupSyncProfile.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/GroupSyncProfile.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -internal data class GroupSyncProfile( +data class GroupSyncProfile( /** * The name of the group, if any. May be nil. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/GroupsSyncResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/GroupsSyncResponse.kt similarity index 92% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/GroupsSyncResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/GroupsSyncResponse.kt index 4c2dce3ba81..fd8710bbda4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/GroupsSyncResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/GroupsSyncResponse.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -internal data class GroupsSyncResponse( +data class GroupsSyncResponse( /** * Joined groups: An array of groups ids. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/InvitedGroupSync.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/InvitedGroupSync.kt similarity index 90% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/InvitedGroupSync.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/InvitedGroupSync.kt index 148c2aeab92..d41df9f0f62 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/InvitedGroupSync.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/InvitedGroupSync.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -internal data class InvitedGroupSync( +data class InvitedGroupSync( /** * The identifier of the inviter. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/InvitedRoomSync.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/InvitedRoomSync.kt similarity index 93% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/InvitedRoomSync.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/InvitedRoomSync.kt index c21a73abc2a..dc63c5ba078 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/InvitedRoomSync.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/InvitedRoomSync.kt @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model + +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass // InvitedRoomSync represents a room invitation during server sync v2. @JsonClass(generateAdapter = true) -internal data class InvitedRoomSync( +data class InvitedRoomSync( /** * The state of a room that the user has been invited to. These state events may only have the 'sender', 'type', 'state_key' diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/LazyRoomSyncEphemeral.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/LazyRoomSyncEphemeral.kt similarity index 77% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/LazyRoomSyncEphemeral.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/LazyRoomSyncEphemeral.kt index 83006c646b2..087a5f52dc5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/LazyRoomSyncEphemeral.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/LazyRoomSyncEphemeral.kt @@ -1,11 +1,11 @@ /* - * Copyright (c) 2021 The Matrix.org Foundation C.I.C. + * Copyright 2020 The Matrix.org Foundation C.I.C. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -14,12 +14,12 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = false) -internal sealed class LazyRoomSyncEphemeral { +sealed class LazyRoomSyncEphemeral { data class Parsed(val _roomSyncEphemeral: RoomSyncEphemeral) : LazyRoomSyncEphemeral() object Stored : LazyRoomSyncEphemeral() } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/PresenceSyncResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/PresenceSyncResponse.kt similarity index 90% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/PresenceSyncResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/PresenceSyncResponse.kt index 92d09aa4f50..d632552888f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/PresenceSyncResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/PresenceSyncResponse.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.JsonClass import org.matrix.android.sdk.api.session.events.model.Event // PresenceSyncResponse represents the updates to the presence status of other users during server sync v2. @JsonClass(generateAdapter = true) -internal data class PresenceSyncResponse( +data class PresenceSyncResponse( /** * List of presence events (array of Event with type m.presence). diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomInviteState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomInviteState.kt similarity index 91% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomInviteState.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomInviteState.kt index ded9e2a3508..59b4b4fc327 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomInviteState.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomInviteState.kt @@ -13,7 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model + +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -21,7 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Event // RoomInviteState represents the state of a room that the user has been invited to. @JsonClass(generateAdapter = true) -internal data class RoomInviteState( +data class RoomInviteState( /** * List of state events (array of MXEvent). diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt similarity index 95% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt index 9aed0d37d68..e3d07602c79 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSync.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSync.kt @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model + +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass // RoomSync represents the response for a room during server sync v2. @JsonClass(generateAdapter = true) -internal data class RoomSync( +data class RoomSync( /** * The state updates for the room. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncAccountData.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncAccountData.kt similarity index 90% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncAccountData.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncAccountData.kt index a2375507d8b..f2c4ed551c8 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncAccountData.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncAccountData.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass import org.matrix.android.sdk.api.session.events.model.Event @JsonClass(generateAdapter = true) -internal data class RoomSyncAccountData( +data class RoomSyncAccountData( /** * List of account data events (array of Event). */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncEphemeral.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncEphemeral.kt similarity index 91% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncEphemeral.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncEphemeral.kt index f2135db6b7f..f4d831c16ff 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncEphemeral.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncEphemeral.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -22,7 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Event // RoomSyncEphemeral represents the ephemeral events in the room that aren't recorded in the timeline or state of the room (e.g. typing). @JsonClass(generateAdapter = true) -internal data class RoomSyncEphemeral( +data class RoomSyncEphemeral( /** * List of ephemeral events (array of Event). */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncState.kt similarity index 91% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncState.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncState.kt index f86f05d0003..78224675648 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncState.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncState.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -22,7 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Event // RoomSyncState represents the state updates for a room during server sync v2. @JsonClass(generateAdapter = true) -internal data class RoomSyncState( +data class RoomSyncState( /** * List of state events (array of Event). The resulting state corresponds to the *start* of the timeline. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncSummary.kt similarity index 95% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncSummary.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncSummary.kt index 228a71ec281..7216a0c992f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncSummary.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncSummary.kt @@ -14,13 +14,13 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -internal data class RoomSyncSummary( +data class RoomSyncSummary( /** * Present only if the room has no m.room.name or m.room.canonical_alias. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncTimeline.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncTimeline.kt similarity index 93% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncTimeline.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncTimeline.kt index 27bbc4343f7..82d29a52e2f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncTimeline.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncTimeline.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -22,7 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Event // RoomSyncTimeline represents the timeline of messages and state changes for a room during server sync v2. @JsonClass(generateAdapter = true) -internal data class RoomSyncTimeline( +data class RoomSyncTimeline( /** * List of events (array of Event). diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncUnreadNotifications.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncUnreadNotifications.kt similarity index 92% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncUnreadNotifications.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncUnreadNotifications.kt index f01534b884d..6618bceacd9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomSyncUnreadNotifications.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomSyncUnreadNotifications.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -24,7 +24,7 @@ import org.matrix.android.sdk.api.session.events.model.Event * `MXRoomSyncUnreadNotifications` represents the unread counts for a room. */ @JsonClass(generateAdapter = true) -internal data class RoomSyncUnreadNotifications( +data class RoomSyncUnreadNotifications( /** * List of account data events (array of Event). */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomsSyncResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomsSyncResponse.kt similarity index 93% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomsSyncResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomsSyncResponse.kt index dd2f96c9882..ff3ed542640 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/RoomsSyncResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/RoomsSyncResponse.kt @@ -13,14 +13,15 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model + +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass // RoomsSyncResponse represents the rooms list in server sync v2 response. @JsonClass(generateAdapter = true) -internal data class RoomsSyncResponse( +data class RoomsSyncResponse( /** * Joined rooms: keys are rooms ids. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/SyncResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/SyncResponse.kt similarity index 95% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/SyncResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/SyncResponse.kt index f2b2fb7e8f6..e9863e1cd1a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/SyncResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/SyncResponse.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @@ -22,7 +22,7 @@ import org.matrix.android.sdk.internal.session.sync.model.accountdata.UserAccoun // SyncResponse represents the request response for server sync v2. @JsonClass(generateAdapter = true) -internal data class SyncResponse( +data class SyncResponse( /** * The user private data. */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/ToDeviceSyncResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/ToDeviceSyncResponse.kt similarity index 90% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/ToDeviceSyncResponse.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/ToDeviceSyncResponse.kt index 8f3af56cde1..082460cc2d6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/ToDeviceSyncResponse.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/model/ToDeviceSyncResponse.kt @@ -14,14 +14,14 @@ * limitations under the License. */ -package org.matrix.android.sdk.internal.session.sync.model +package org.matrix.android.sdk.api.session.sync.model import com.squareup.moshi.JsonClass import org.matrix.android.sdk.api.session.events.model.Event // ToDeviceSyncResponse represents the data directly sent to one of user's devices. @JsonClass(generateAdapter = true) -internal data class ToDeviceSyncResponse( +data class ToDeviceSyncResponse( /** * List of direct-to-device events. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt index 563c8909504..c28ccda00ac 100755 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt @@ -87,7 +87,7 @@ import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.extensions.foldToCallback import org.matrix.android.sdk.internal.session.SessionScope import org.matrix.android.sdk.internal.session.room.membership.LoadRoomMembersTask -import org.matrix.android.sdk.internal.session.sync.model.SyncResponse +import org.matrix.android.sdk.api.session.sync.model.SyncResponse import org.matrix.android.sdk.internal.task.TaskExecutor import org.matrix.android.sdk.internal.task.TaskThread import org.matrix.android.sdk.internal.task.configureWith diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt index 0ece07fc157..be89554f2f4 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/notification/ProcessEventForPushTask.kt @@ -19,7 +19,7 @@ package org.matrix.android.sdk.internal.session.notification import org.matrix.android.sdk.api.pushrules.rest.PushRule import org.matrix.android.sdk.api.session.events.model.EventType import org.matrix.android.sdk.internal.di.UserId -import org.matrix.android.sdk.internal.session.sync.model.RoomsSyncResponse +import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse import org.matrix.android.sdk.internal.task.Task import timber.log.Timber import javax.inject.Inject diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt index 842c9d3abad..c626e472e68 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/summary/RoomSummaryUpdater.kt @@ -61,8 +61,8 @@ import org.matrix.android.sdk.internal.session.room.accountdata.RoomAccountDataD import org.matrix.android.sdk.internal.session.room.membership.RoomDisplayNameResolver import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper import org.matrix.android.sdk.internal.session.room.relationship.RoomChildRelationInfo -import org.matrix.android.sdk.internal.session.sync.model.RoomSyncSummary -import org.matrix.android.sdk.internal.session.sync.model.RoomSyncUnreadNotifications +import org.matrix.android.sdk.api.session.sync.model.RoomSyncSummary +import org.matrix.android.sdk.api.session.sync.model.RoomSyncUnreadNotifications import timber.log.Timber import javax.inject.Inject import kotlin.system.measureTimeMillis diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt index 411a9c5c065..a81a7d681ee 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/CryptoSyncHandler.kt @@ -27,8 +27,8 @@ import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult import org.matrix.android.sdk.internal.crypto.model.event.OlmEventContent import org.matrix.android.sdk.internal.crypto.verification.DefaultVerificationService import org.matrix.android.sdk.internal.session.initsync.ProgressReporter -import org.matrix.android.sdk.internal.session.sync.model.SyncResponse -import org.matrix.android.sdk.internal.session.sync.model.ToDeviceSyncResponse +import org.matrix.android.sdk.api.session.sync.model.SyncResponse +import org.matrix.android.sdk.api.session.sync.model.ToDeviceSyncResponse import timber.log.Timber import javax.inject.Inject diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt index 02362bf050e..701f6314ab5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/GroupSyncHandler.kt @@ -25,8 +25,8 @@ import org.matrix.android.sdk.internal.database.query.getOrCreate import org.matrix.android.sdk.internal.database.query.where import org.matrix.android.sdk.internal.session.initsync.ProgressReporter import org.matrix.android.sdk.internal.session.initsync.mapWithProgress -import org.matrix.android.sdk.internal.session.sync.model.GroupsSyncResponse -import org.matrix.android.sdk.internal.session.sync.model.InvitedGroupSync +import org.matrix.android.sdk.api.session.sync.model.GroupsSyncResponse +import org.matrix.android.sdk.api.session.sync.model.InvitedGroupSync import javax.inject.Inject internal class GroupSyncHandler @Inject constructor() { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncEphemeralTemporaryStore.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncEphemeralTemporaryStore.kt index c6ff71cfcfd..038b92d729a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncEphemeralTemporaryStore.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncEphemeralTemporaryStore.kt @@ -21,7 +21,7 @@ import com.squareup.moshi.Moshi import okio.buffer import okio.source import org.matrix.android.sdk.internal.di.SessionFilesDirectory -import org.matrix.android.sdk.internal.session.sync.model.RoomSyncEphemeral +import org.matrix.android.sdk.api.session.sync.model.RoomSyncEphemeral import org.matrix.android.sdk.internal.util.md5 import timber.log.Timber import java.io.File diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt index c3586bcea7a..487ccbbfc3f 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/RoomSyncHandler.kt @@ -58,10 +58,10 @@ import org.matrix.android.sdk.internal.session.room.summary.RoomSummaryUpdater import org.matrix.android.sdk.internal.session.room.timeline.PaginationDirection import org.matrix.android.sdk.internal.session.room.timeline.TimelineInput import org.matrix.android.sdk.internal.session.room.typing.TypingEventContent -import org.matrix.android.sdk.internal.session.sync.model.InvitedRoomSync -import org.matrix.android.sdk.internal.session.sync.model.LazyRoomSyncEphemeral -import org.matrix.android.sdk.internal.session.sync.model.RoomSync -import org.matrix.android.sdk.internal.session.sync.model.RoomsSyncResponse +import org.matrix.android.sdk.api.session.sync.model.InvitedRoomSync +import org.matrix.android.sdk.api.session.sync.model.LazyRoomSyncEphemeral +import org.matrix.android.sdk.api.session.sync.model.RoomSync +import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse import org.matrix.android.sdk.internal.session.sync.parsing.RoomSyncAccountDataHandler import org.matrix.android.sdk.internal.util.computeBestChunkSize import timber.log.Timber diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt index 2616803463a..86ecdf8b562 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncAPI.kt @@ -19,7 +19,7 @@ package org.matrix.android.sdk.internal.session.sync import okhttp3.ResponseBody import org.matrix.android.sdk.internal.network.NetworkConstants import org.matrix.android.sdk.internal.network.TimeOutInterceptor -import org.matrix.android.sdk.internal.session.sync.model.SyncResponse +import org.matrix.android.sdk.api.session.sync.model.SyncResponse import retrofit2.Call import retrofit2.http.GET import retrofit2.http.Header diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt index a4468a96c97..cf50f89f541 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncResponseHandler.kt @@ -30,9 +30,9 @@ import org.matrix.android.sdk.internal.session.group.GetGroupDataWorker import org.matrix.android.sdk.internal.session.initsync.ProgressReporter import org.matrix.android.sdk.internal.session.initsync.reportSubtask import org.matrix.android.sdk.internal.session.notification.ProcessEventForPushTask -import org.matrix.android.sdk.internal.session.sync.model.GroupsSyncResponse -import org.matrix.android.sdk.internal.session.sync.model.RoomsSyncResponse -import org.matrix.android.sdk.internal.session.sync.model.SyncResponse +import org.matrix.android.sdk.api.session.sync.model.GroupsSyncResponse +import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse +import org.matrix.android.sdk.api.session.sync.model.SyncResponse import org.matrix.android.sdk.internal.util.awaitTransaction import org.matrix.android.sdk.internal.worker.WorkerParamsFactory import timber.log.Timber diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt index c80fbe60c1b..f033fe31d78 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt @@ -28,7 +28,8 @@ import org.matrix.android.sdk.internal.session.filter.FilterRepository import org.matrix.android.sdk.internal.session.homeserver.GetHomeServerCapabilitiesTask import org.matrix.android.sdk.internal.session.initsync.DefaultInitialSyncProgressService import org.matrix.android.sdk.internal.session.initsync.reportSubtask -import org.matrix.android.sdk.internal.session.sync.model.LazyRoomSyncEphemeral +import org.matrix.android.sdk.api.session.sync.model.LazyRoomSyncEphemeral +import org.matrix.android.sdk.api.session.sync.model.SyncResponse import org.matrix.android.sdk.internal.session.sync.parsing.InitialSyncResponseParser import org.matrix.android.sdk.internal.session.user.UserStore import org.matrix.android.sdk.internal.task.Task diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt index b8d987d5009..d4be345b757 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/UserAccountDataSyncHandler.kt @@ -48,7 +48,7 @@ import org.matrix.android.sdk.internal.di.UserId import org.matrix.android.sdk.internal.session.room.RoomAvatarResolver import org.matrix.android.sdk.internal.session.room.membership.RoomDisplayNameResolver import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper -import org.matrix.android.sdk.internal.session.sync.model.InvitedRoomSync +import org.matrix.android.sdk.api.session.sync.model.InvitedRoomSync import org.matrix.android.sdk.internal.session.sync.model.accountdata.BreadcrumbsContent import org.matrix.android.sdk.internal.session.sync.model.accountdata.DirectMessagesContent import org.matrix.android.sdk.internal.session.sync.model.accountdata.IgnoredUsersContent diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/accountdata/UserAccountDataSync.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/accountdata/UserAccountDataSync.kt index 05b50ab2c5e..ffa9db06ffd 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/accountdata/UserAccountDataSync.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/model/accountdata/UserAccountDataSync.kt @@ -21,6 +21,6 @@ import com.squareup.moshi.JsonClass import org.matrix.android.sdk.api.session.accountdata.UserAccountDataEvent @JsonClass(generateAdapter = true) -internal data class UserAccountDataSync( +data class UserAccountDataSync( @Json(name = "events") val list: List = emptyList() ) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt index 940ea219fb6..62c71d9e218 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/DefaultLazyRoomSyncEphemeralJsonAdapter.kt @@ -23,8 +23,8 @@ import com.squareup.moshi.JsonWriter import com.squareup.moshi.ToJson import org.matrix.android.sdk.internal.session.sync.InitialSyncStrategy import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore -import org.matrix.android.sdk.internal.session.sync.model.LazyRoomSyncEphemeral -import org.matrix.android.sdk.internal.session.sync.model.RoomSyncEphemeral +import org.matrix.android.sdk.api.session.sync.model.LazyRoomSyncEphemeral +import org.matrix.android.sdk.api.session.sync.model.RoomSyncEphemeral import timber.log.Timber internal class DefaultLazyRoomSyncEphemeralJsonAdapter { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/InitialSyncResponseParser.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/InitialSyncResponseParser.kt index 0b44887aedc..331d4cc3fd3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/InitialSyncResponseParser.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/InitialSyncResponseParser.kt @@ -21,7 +21,7 @@ import okio.buffer import okio.source import org.matrix.android.sdk.internal.session.sync.InitialSyncStrategy import org.matrix.android.sdk.internal.session.sync.RoomSyncEphemeralTemporaryStore -import org.matrix.android.sdk.internal.session.sync.model.SyncResponse +import org.matrix.android.sdk.api.session.sync.model.SyncResponse import timber.log.Timber import java.io.File import javax.inject.Inject diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/RoomSyncAccountDataHandler.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/RoomSyncAccountDataHandler.kt index 8bf9ad5b908..60bc68faccc 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/RoomSyncAccountDataHandler.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/parsing/RoomSyncAccountDataHandler.kt @@ -29,7 +29,7 @@ import org.matrix.android.sdk.internal.database.query.getOrCreate import org.matrix.android.sdk.internal.session.room.read.FullyReadContent import org.matrix.android.sdk.internal.session.sync.RoomFullyReadHandler import org.matrix.android.sdk.internal.session.sync.RoomTagHandler -import org.matrix.android.sdk.internal.session.sync.model.RoomSyncAccountData +import org.matrix.android.sdk.api.session.sync.model.RoomSyncAccountData import javax.inject.Inject internal class RoomSyncAccountDataHandler @Inject constructor(private val roomTagHandler: RoomTagHandler, From a968a848b0cf7ac9c0d740f9a18115c937125bfa Mon Sep 17 00:00:00 2001 From: ganfra Date: Mon, 23 Aug 2021 16:46:37 +0200 Subject: [PATCH 009/350] Sync: exposes ShareFlow from the SyncThread --- .../matrix/android/sdk/api/session/Session.kt | 7 +++++++ .../sdk/internal/session/DefaultSession.kt | 2 ++ .../sdk/internal/session/sync/SyncTask.kt | 21 ++++++++++++------- .../internal/session/sync/job/SyncThread.kt | 10 ++++++++- 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt index 2f981ffbbed..e0b48f1e079 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt @@ -18,6 +18,7 @@ package org.matrix.android.sdk.api.session import androidx.annotation.MainThread import androidx.lifecycle.LiveData +import kotlinx.coroutines.flow.SharedFlow import okhttp3.OkHttpClient import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.failure.GlobalError @@ -57,6 +58,7 @@ import org.matrix.android.sdk.api.session.thirdparty.ThirdPartyService import org.matrix.android.sdk.api.session.typing.TypingUsersTracker import org.matrix.android.sdk.api.session.user.UserService import org.matrix.android.sdk.api.session.widgets.WidgetService +import org.matrix.android.sdk.api.session.sync.model.SyncResponse /** * This interface defines interactions with a session. @@ -143,6 +145,11 @@ interface Session : */ fun getSyncState(): SyncState + /** + * This method returns a flow of SyncResponse. New value will be pushed through the sync thread. + */ + fun syncFlow(): SharedFlow + /** * This methods return true if an initial sync has been processed */ diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index c2bd1e24ede..2975cc7ad01 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -223,6 +223,8 @@ internal class DefaultSession @Inject constructor( override fun getSyncStateLive() = getSyncThread().liveState() + override fun syncFlow() = getSyncThread().syncFlow() + override fun getSyncState() = getSyncThread().currentState() override fun hasAlreadySynced(): Boolean { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt index f033fe31d78..5684c2b1d6d 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/SyncTask.kt @@ -41,7 +41,7 @@ import java.io.File import java.net.SocketTimeoutException import javax.inject.Inject -internal interface SyncTask : Task { +internal interface SyncTask : Task { data class Params( val timeout: Long, @@ -69,13 +69,13 @@ internal class DefaultSyncTask @Inject constructor( private val workingDir = File(fileDirectory, "is") private val initialSyncStatusRepository: InitialSyncStatusRepository = FileInitialSyncStatusRepository(workingDir) - override suspend fun execute(params: SyncTask.Params) { - syncTaskSequencer.post { + override suspend fun execute(params: SyncTask.Params) : SyncResponse { + return syncTaskSequencer.post { doSync(params) } } - private suspend fun doSync(params: SyncTask.Params) { + private suspend fun doSync(params: SyncTask.Params): SyncResponse { Timber.v("Sync task started on Thread: ${Thread.currentThread().name}") val requestParams = HashMap() @@ -100,6 +100,7 @@ internal class DefaultSyncTask @Inject constructor( val readTimeOut = (params.timeout + TIMEOUT_MARGIN).coerceAtLeast(TimeOutInterceptor.DEFAULT_LONG_TIMEOUT) + var syncResponseToReturn: SyncResponse? = null if (isInitialSync) { Timber.d("INIT_SYNC with filter: ${requestParams["filter"]}") val initSyncStrategy = initialSyncStrategy @@ -108,7 +109,7 @@ internal class DefaultSyncTask @Inject constructor( roomSyncEphemeralTemporaryStore.reset() workingDir.mkdirs() val file = downloadInitSyncResponse(requestParams) - reportSubtask(initialSyncProgressService, InitSyncStep.ImportingAccount, 1, 0.7F) { + syncResponseToReturn = reportSubtask(initialSyncProgressService, InitSyncStep.ImportingAccount, 1, 0.7F) { handleSyncFile(file, initSyncStrategy) } // Delete all files @@ -122,10 +123,10 @@ internal class DefaultSyncTask @Inject constructor( ) } } - logDuration("INIT_SYNC Database insertion") { syncResponseHandler.handleResponse(syncResponse, token, initialSyncProgressService) } + syncResponseToReturn = syncResponse } } initialSyncProgressService.endAll() @@ -137,8 +138,11 @@ internal class DefaultSyncTask @Inject constructor( ) } syncResponseHandler.handleResponse(syncResponse, token, null) + syncResponseToReturn = syncResponse } Timber.v("Sync task finished on Thread: ${Thread.currentThread().name}") + // Should throw if null as it's a mandatory value. + return syncResponseToReturn!! } private suspend fun downloadInitSyncResponse(requestParams: Map): File { @@ -195,8 +199,8 @@ internal class DefaultSyncTask @Inject constructor( } } - private suspend fun handleSyncFile(workingFile: File, initSyncStrategy: InitialSyncStrategy.Optimized) { - logDuration("INIT_SYNC handleSyncFile()") { + private suspend fun handleSyncFile(workingFile: File, initSyncStrategy: InitialSyncStrategy.Optimized): SyncResponse { + return logDuration("INIT_SYNC handleSyncFile()") { val syncResponse = logDuration("INIT_SYNC Read file and parse") { syncResponseParser.parse(initSyncStrategy, workingFile) } @@ -210,6 +214,7 @@ internal class DefaultSyncTask @Inject constructor( syncResponseHandler.handleResponse(syncResponse, null, initialSyncProgressService) } initialSyncStatusRepository.setStep(InitialSyncStatus.STEP_SUCCESS) + syncResponse } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt index de8d009892f..1b34b625ff3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/sync/job/SyncThread.kt @@ -34,11 +34,14 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancelChildren import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.matrix.android.sdk.api.session.call.MxCall import org.matrix.android.sdk.internal.session.call.ActiveCallHandler import org.matrix.android.sdk.internal.session.sync.SyncPresence +import org.matrix.android.sdk.api.session.sync.model.SyncResponse import timber.log.Timber import java.net.SocketTimeoutException import java.util.Timer @@ -72,6 +75,8 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask, } } + private val _syncFlow = MutableSharedFlow() + init { updateStateTo(SyncState.Idle) } @@ -115,6 +120,8 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask, return liveState } + fun syncFlow(): SharedFlow = _syncFlow + override fun onConnectivityChanged() { retryNoNetworkTask?.cancel() synchronized(lock) { @@ -192,7 +199,8 @@ internal class SyncThread @Inject constructor(private val syncTask: SyncTask, private suspend fun doSync(params: SyncTask.Params) { try { - syncTask.execute(params) + val syncResponse = syncTask.execute(params) + _syncFlow.emit(syncResponse) } catch (failure: Throwable) { if (failure is Failure.NetworkConnection) { canReachServer = false From 9bc173e2fdcaa8bbf4793aaa880f6c046f158315 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 31 Aug 2021 05:57:57 +0000 Subject: [PATCH 010/350] Translated using Weblate (Czech) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/ --- vector/src/main/res/values-cs/strings.xml | 67 +++++++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index 4d5ed184086..432e968702e 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -2647,7 +2647,7 @@ Zavolat zpět Tento hovor skončil %1$s odmítl tento hovor - Odmítli jste tento hovor %1$s + Odmítli jste tento hovor %s Aktuálně jste v tomto hovoru %1$s zahájil hovor Zahájili jste hovor @@ -2687,7 +2687,7 @@ Výchozí úroveň důvěryhodnosti Vybrané Video - Tato místnost má neodeslaný koncept + má neodeslaný koncept Některé zprávy nebyly odeslány Smazat avatar Změnit avatar @@ -2812,7 +2812,7 @@ Správa místností Hledáte někoho, kdo není v %s\? %s Vás zve - Tato místnosti je veřejná + Veřejná místnost Poslat media v původní velikosti Poslat video v původní velikosti @@ -2849,7 +2849,7 @@ Nepojmenovaná místnost Soukromý prostor Veřejný prostor - Tento Prostor je veřejný + Veřejný prostor Neznámá osoba Převod na %1$s Konzultace s %1$s @@ -2941,10 +2941,65 @@ Skupinové zprávy Šifrované přímé zprávy Přímé zprávy - Zprávy obsahující mé uživatelské jméno - Zprávy obsahující mé zobrazované jméno + Mé uživatelské jméno + Mé zobrazované jméno Upozorněte mě na Další Zmínky a klíčová slova Výchozí oznámení + %s v Nastavení pro příjem pozvánek přímo v Elementu. + Propojte tento e-mail se svým účtem + Pozvánka do této místnosti byla odeslána na adresu %s, která není spojena s vaším účtem + Pozvánka do tohoto prostoru byla odeslána na adresu %s, která není spojena s vaším účtem + Chcete-li členům prostoru pomoci najít soukromou místnost a připojit se k ní, přejděte do nastavení dané místnosti klepnutím na avatar. + Pomozte členům prostoru najít soukromé místnosti + Díky tomu mohou místnosti zůstat soukromé a zároveň je mohou lidé v prostoru najít a připojit se k nim. Všechny nové místnosti v prostoru budou mít tuto možnost k dispozici. + Pomozte lidem v prostorech, aby sami našli soukromé místnosti a připojili se k nim, není třeba všechny zvát ručně. + Novinka: Nechat lidi v prostorech najít a připojit se k soukromým místnostem + Skupinový hovor zahájen + Všechny místnosti, ve kterých se nacházíte, se zobrazí v domovském zobrazení. + Zobrazit všechny místnosti v domovském zobrazení + Posunutím ukončíte hovor + %1$s Klepněte pro návrat + Probíhající hovor (%1$s) · + + Probíhající hovor · + %1$d probíhající hovory · + %1$d probíhajících hovorů · + + Připojení se nezdařilo + Žádná odpověď + Zmeškaný videohovor + Zmeškaný hlasový hovor + Videohovor odmítnut + Hlasový hovor odmítnut + Videohovor ukončen • %1$s + Hlasový hovor ukončen • %1$s + Probíhající videohovor + Probíhající hlasový hovor + Příchozí videohovor + Příchozí hlasový hovor + Tento hovor jste odmítli + Nastavení účtu + Oznámení můžete spravovat v %1$s. + Upozorňujeme, že upozornění na zmínky a klíčová slova nejsou v zašifrovaných místnostech k dispozici na mobilním zařízení. + Upozorněte mě na + Na mobilním zařízení nedostanete upozornění na zmínky a klíčová slova v zašifrovaných místnostech. + Klíčová slova + \@místnost + Klíčová slova nemohou obsahovat \'%s\' + Klíčová slova nemohou začínat znakem \'.\' + Přidat nové klíčové slovo + Vaše klíčová slova + Žádné + Pouze zmínky a klíčová slova + Ukončení hovoru… + Žádná odpověď + Volaný uživatel je zaneprázdněn. + Uživatel zaneprázdněn + Hlasový hovor s %s + Videohovor s %s + Vyzvánění… + Prostory + Dozvědět se více \ No newline at end of file From 2155533b1beead3ce8e386e5396ac2be8a38f742 Mon Sep 17 00:00:00 2001 From: jannikac Date: Tue, 31 Aug 2021 13:32:03 +0000 Subject: [PATCH 011/350] Translated using Weblate (German) Currently translated at 97.7% (2555 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/de/ --- vector/src/main/res/values-de/strings.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/vector/src/main/res/values-de/strings.xml b/vector/src/main/res/values-de/strings.xml index a61fcf5b5d3..bfa44cf467c 100644 --- a/vector/src/main/res/values-de/strings.xml +++ b/vector/src/main/res/values-de/strings.xml @@ -2953,4 +2953,9 @@ Allen in %s Zugriff erlauben. Du auch mehrere Spaces auswählen. Andere Spaces oder Räume die du kennst Spaces mit diesem Raum und dir als Mitglied + Nur Erwähnungen & Schlüsselwörter + Auflegen… + Sprachanruf mit %s + Videoanruf mit %s + Mehr erfahren \ No newline at end of file From 000b2d97986a1b990facf1cda60a99bbd004dcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 31 Aug 2021 20:17:53 +0000 Subject: [PATCH 012/350] Translated using Weblate (Estonian) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/et/ --- vector/src/main/res/values-et/strings.xml | 74 ++++++++++++++++++++--- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index 0b9562114bb..4413737c236 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -2597,7 +2597,7 @@ Helista tagasi See kõne on lõppenud %1$s keeldus kõnest - Sa keeldusid %1$s kõnest + Sa keeldusid %s kõnest Sul on parasjagu see kõne pooleli %1$s alustas kõnet Sa alustasid kõnet @@ -2635,7 +2635,7 @@ Vaikmisi usaldusmäär Valitud Video - Selles jututoas on ärasaatmata sõnumimustand + ärasaatmata sõnumimustand Mõned sõnumid on saatmata Kustuta tunnuspilt Muuda tunnuspilti @@ -2760,7 +2760,7 @@ Halda jututubasid Kas sa otsid kedagi, kes ei leidu %s kogukonnas\? %s kutsus sind - See jututuba on avalik + Avalik jututuba Saada meedia algses suuruses Saada videofail algses suuruses @@ -2796,7 +2796,7 @@ Nimetu jututuba Privaatne kogukonnakeskus Avalik kogukonnakeskus - See kogukonnakeskus on avalik + Avalik kogukonnakeskus Tundmatu isik Suuna kasutajale %1$s Pean nõu kasutajaga %1$s @@ -2876,20 +2876,74 @@ Häälsõnum (%1$s) Palun arvesta, et uuendusega tehakse jututoast uus variant. Kõik senised sõnumid jäävad sellesse jututuppa arhiveeritud olekus. Häälkõne - Jututoa versiooniuuendus + Jututubade versiooniuuendused Robotite saadetud sõnumid Kutsed jututubadesse Krüptitud rühmavestlused Rühmavestlused Krüptitud otsevestlused - Otsevestlus - Sõnumid, mis sisaldavad minu kasutajatunnust - Sõnumid, mis sisaldavad minu kuvatavat nime + Otsevestlused + Minu kasutajatunnus + Minu kuvatav nimi Teavita mind Muud - Mainimised ja võtmesõnad - Vaikimisi teaveitused + Mainimised ja märksõnad + Vaikimisi teavitused Kõik %s kogukonna liikmed saavad antud jututuba leida ja sellega liituda. Sa võid lisada ka teisi kogukondi. Kõik hõlmava kogukonna liikmed saavad antud jututuba leida ja sellega liituda - sa ei pea kedagi ükshaaval kutsuma. Neid jututoa seadistusi saad igal hetkel muuta. Kõik %s jututoa liikmed saavad antud jututuba leida ja sellega liituda - sa ei pea kedagi ükshaaval kutsuma. Neid jututoa seadistusi saad igal hetkel muuta. + %1$s - tagasipöördumiseks klõpsi + %s ja saa kutsed otse Element\'i. + Seo see e-posti aadress oma kasutajakontoga + See kutse siia kogukonnakeskusesse saadeti aadressile %s, mis ei ole seotud sinu kontoga + See kutse siia jututuppa saadeti aadressile %s, mis ei ole seotud sinu kontoga + Selleks, et kogukonnakeskuse liikmed saaks privaatseid jututube leida ning nendega liituda ava tunnuspildile klõpsides jututoa seadistused. + Aita kogukonnakeskuse liitmetel leida privaatseid jututube + See muudab lihtsaks, et jututoad jääksid kogukonnakeskuse piires privaatseks, kuid lasevad kogukonnakeskuses viibivatel inimestel need üles leida ja nendega liituda. Kõik kogukonnakeskuse uued jututoad on selle võimalusega. + Aita kogukonnakeskuse liikmetel endil leida privaatseid jututube ning nendega liituda nii et sa ei pea kõigile eraldi kutset saatma. + Uus funktsionaalsus: Võimalda kogukonnakeskuse liikmetel leida privaatseid jututube ning nendega liituda + Rühmakõne algas + Kõik sinu jututoad on nähtavad avalehel. + Näita kõiki jututubasid avalehel + Kõne lõpetamiseks viipa + Kõne on pooleli (%1$s) · + + Kõne on pooleli · + %1$d kõnet on pooleli · + + Ühendus ebaõnnestus + Keegi ei vasta kõnele + Vastamata videokõne + Vastamata kõne + Loobusid videokõnest + Loobusid kõnest + Videokõne lõppes • %1$s + Kõne lõppes • %1$s + Pooleliolev videokõne + Pooleliolev kõne + Saabuv videokõne + Saabuv häälkõne + Sa keeldusid sellest kõnest + Kasutajakonto seadistused + Sa võid hallata teavitusi %1$s jututoas. + Teavitused mainimiste ja märksõnade esinemise puhul pole mobiilirakenduses krüptitud jututoas saadaval. + Kõne lõpp… + Keegi ei vasta kõnele + Häälkõne kasutajaga %s + Videokõne kasutajaga %s + Sulle on kõne… + Teavita mind + Mobiilseadmes ei toimi krüptitud jututubades mainimiste ja märksõnade alusel tehtavad teavitused. + Märksõnad + \@jututuba + „%s“ ei tohi sisalduda märksõnas + Märksõna alguses ei saa olla punkt „.“ + Lisa uus märksõna + Sinu märksõnad + Ei midagi + Vaid mainimised ja märksõnad + Kasutaja, kellele sa helistasid, on hõivatud. + Kasutaja on hõivatud + Kogukonnakeskused + Lisateave \ No newline at end of file From 9721af241e886833ba6d50feae73369c4d1a18d9 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 30 Aug 2021 22:34:38 +0000 Subject: [PATCH 013/350] Translated using Weblate (Persian) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/ --- vector/src/main/res/values-fa/strings.xml | 67 +++++++++++++++++++++-- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index 4f80a6cd2f3..ec45a40abfa 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -2549,7 +2549,7 @@ تماس بگیرید این تماس پایان یافته است %1$s تماس را رد کرد - شما این تماس را رد کردید %1$s + این تماس را رد کردید %s شما در حال حاضر در این تماس هستید خطا در تنظیم امضای متقابل %1$s یک تماس را شروع کرد @@ -2590,7 +2590,7 @@ گزیده تصویر ویدیو - این اتاق پیش‌نویس‌هایی نفرستاده دارد + پیش‌نویسی نفرستاده دارد برخی پیام‌ها ارسال نشده‌اند حذف چهرک تغییر چهرک @@ -2760,7 +2760,7 @@ مدیریت اتاق‌ها دنبال کسی هستید که در %s نیست؟ %s دعوتتان می‌کند - این اتاق عمومی است + اتاق عمومی رسانه را با اندازه اصلی ارسال کن ارسال فیلم با اندازه اصلی @@ -2834,7 +2834,7 @@ فضای خصوصی فضای عمومی اتاقی را به نگارشی جدید ارتقا می‌دهد - این فضا عمومی است + فضای عمومی حس آزمایش دارید؟ \nمی‌توانید فضاهای موجود را به فضایی بیفزایید. مشاوره با %1$s @@ -2885,10 +2885,65 @@ پیام‌های گروهی رمزنگاشته پیام‌های گروهی پیام‌های مستقیم - پیام‌هایی که دارای نام کاربریم هستند - پیام‌هایی که دارای نام نمایشیم هستند + نام کاربریم + نام نمایشیم آگاهم کن از دیگر اشاره‌ها و کلیدواژگان آگاهی‌های پیش‌گزیده + %s در تنظیمات برای دریافت مستقیم دعوت‌ها در المنت. + این رایانامه را به حسابتان پیوند دهید + این دعوت به این فضا به %s فرستاده شده که با حسابتان در ارتباط نیست + این دعوت به این اتاق به %s فرستاده شده که با حسابتان در ارتباط نیست + برای کمک به اعضای فضا برای یافتن و پیوستن به یک اتاق خصوصی، با زدن روی چهرک، به تنظیمات اتاق بروید. + کمک به اعضای فضا برای یافتن اتاق‌های خصوصی + این کار، خصوصی ماندن اتاق‌ها در فضا را، در عین اجازه به افراد داخل فضا برای یافتن و پیوستن، آسان می‌کند. تمامی اتاق‌های جدید در یک فضا، این گزینه را موجود دارند. + به افراد کمک‌کنید خودشان اتاق‌های خصوصی را یافته و بپیوندند. نیازی به دعوت دستی همه نیست. + جدید: بکذارید افراد در فضا، اتاق‌های خصوصی را یافته و بپیوندند + تماس گروهی آغاز شد + این اتاق را از %1$s به %2$s ارتقا خواهید داد. + تمام اتاق‌هایی که‌در آن‌هایید، در خانه نشان داده خواهند شد. + نمایش تمامی اتاق‌ها در خانه + برای پایان تماس، بکشید + %1$s برای بازگشت بزنید + تماس فعّال (%1$s) · + + تماس فعّال · + %1$d تماس فعّال · + + اتصال شکست خورد + بدون پاسخ + تماس تصویری از دست رفته + تماس صوتی از دست رفته + تماس تصویری رد شد + تماس صوتی رد شد + تماس تصویری پایان یافت • %1$s + تماس صوتی پایان یافت • %1$s + فعّال کردن تماس تصویری + فعّال کردن تماس صوتی + تماس تصویری ورودی + تماس صوتی ورودی + این تماس را رد کردید + تنظیمات حساب + می‌توانید آگاهی‌ها را در %1$s مدیریت کنید. + لطفاً به خاطر داشته باشید که آگاهی‌های کلیدواژگان و اشاره در اتاق‌های رمزشده روی تلفن همراه، در دسترس نیست. + آگاهم کن برای + روی تلفن همراه، از اشاره‌ها و کلیدواژگان در اتاق‌های رمزشده آگاه نخواهید شد. + کلیدواژگان + \@room + کلیدواژگان نمی‌توانند شامل «%s» باشند + کلیدواژگان نمی‌توانند با «.» آغاز شوند + افزودن کلیدواژهٔ جدید + کلیدواژگانتان + هیچ‌کدام + فقط اشاره‌ها و کلیدواژگان + پایان دادن به تماس… + بدون پاسخ + کاربری که با او تماس گرفته‌اید، مشغول است. + کاربر مشغول + تماس صوتی با %s + تماس تصویری با %s + زنگ خوردن تماس… + فضاها + بیش‌تر بدانید \ No newline at end of file From 866f56392e0b5ab41f5b9af7024e2a26eb71353f Mon Sep 17 00:00:00 2001 From: Fjoerfoks Date: Tue, 31 Aug 2021 12:21:35 +0000 Subject: [PATCH 014/350] Translated using Weblate (Frisian) Currently translated at 36.3% (950 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/fy/ --- vector/src/main/res/values-fy/strings.xml | 84 +++++++++++------------ 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/vector/src/main/res/values-fy/strings.xml b/vector/src/main/res/values-fy/strings.xml index 3623725612b..637cd7ef8ae 100644 --- a/vector/src/main/res/values-fy/strings.xml +++ b/vector/src/main/res/values-fy/strings.xml @@ -168,30 +168,30 @@ \nMienskippen Binnenhelje Inisjele Syngronisaasje: \nOerblieuwne Keamers Binnenhelje - Inisjele Syngronisaasje: -\nKeamers Werst Foar Útnûge Binst Binnenhelje - Inisjele Syngronisaasje: -\nKeamers wer ast yn kaam binst binnenhelje - Inisjele Syngronisaasje: -\nKeamers binnenhelje - Inisjele Syngronisaasje: -\nAkkount importearje… - Inisjele Syngronisaasje: -\nData binnenhelje… - Inisjele Syngronisaasje: -\nWachtsjend op reaksje fan tsjinner… + Inisjele syngronisaasje: +\nKeamers dêr\'t jo foar útnûge binne ymportearje + Inisjele syngronisaasje: +\nKeamers wer ast yn kaam bist ymportearje + Inisjele syngronisaasje: +\nKeamers ymportearje + Inisjele syngronisaasje: +\nAccount ymportearje… + Inisjele syngronisaasje: +\nData downloade… + Inisjele syngronisaasje: +\nWachtsjend op reaksje fan server… Lege keamer (wie %s) Lege keamer - Email adres - Útnûging fan %s - Tillefoan nûmer - Upload fan ôfbylding mislearre + E-mailadres + Utnûging fan %s + Telefoannûmer + Opladen fan ôfbylding mislearre ** Koe %s net ûntsiferje ** Koe net ynlûke Oanpast Oanpast (%1$d) Standert - Do hast de fideo konferînsje oanpast + Do hast de fideokonferinsje oanpast Behearder Berjocht fuortsmiten troch %1$s [reden: %2$s] Berjocht fuortsmiten [reden: %1$s] @@ -388,8 +388,8 @@ Tafoegje Notifikaasjes Olgemien - Matrix flater - Netwurk flater + Matrix-flater + Netwurkflater Kin it berjocht net ferstjoere Berjocht fuortsmiten Waskôging hat ûndersteuning fan\'e tsjinner en in eksperimintele keamer nedich @@ -481,10 +481,10 @@ Brûkers Aksje sjen litte Do hast neat feroare - Do hast it keamer ûnderwerp fuortsmiten - %1$s hat it keamer ûnderwerp fuortsmiten - Do hast de keamer namme fuortsmiten - %1$s hat de keamer namme fuortsmiten + Do hast it keamerûnderwerp fuortsmiten + %1$s hat it keamerûnderwerp fuortsmiten + Do hast de keamernamme fuortsmiten + %1$s hat de keamernamme fuortsmiten %1$s hat %2$s der út skopt. Reden: %3$s Do hast %1$s fuortskopt. Reden: %2$s Do hast hjir fernijd. @@ -663,7 +663,7 @@ Ynstellingen feroarje Keamer rjochten Do hast de tsjinner ACLs foar dizze keamer feroare. - %s hat de tsjinner ACLs foar dizze keamer feroare. + %s hat de server-ACL\'s foar dizze keamer feroare. Do hast dyn profyl ôfbylding feroare Koe de suggestje net ferstjoere (%s) Dankewol, it ferstjoeren fan de suggestje is slagge @@ -1005,24 +1005,24 @@ %1$s, %2$s, %3$s en %4$s %1$s, %2$s en %3$s %1$s en %2$s - Keamer Útnoeging + Keamerútnûging It is no net mooglik om in lege keamer wer binnen te gean. - Jo hawwe de útnoeging nei %1$s oannaam - %1$s hat de útnoeging nei %2$s oannaam - Jo hawwe de útnoeging nei %1$s ynlutsen - %1$s hat de útnoeging nei %2$s wer ynlutsen - Jo hawwe de útnoeging nei %1$s om de keamer binnen te gean wer ynlutsen - %1$s hat de útnoeging nei %2$s om de keamer binnen te gean wer ynlutsen - Jo hawwe %1$s útnoege - %1$s hat %2$s útnoege - Jo hawwe in útnoeging om de keamer binnen te gean nei %1$s stjoerd - %1$s hat in útnoeging om de keamer binnen te gean nei %2$s stjoerd - %1$s hat de keamer ôfbylding fuortsmiten - VoIP konferinsje ôfrûn - VoIP konferinsje begûn - Jo hawwe in VoIP konferinsje oanfrege - %1$s hat in VoIP konferinsje oanfrege - 🎉 Alle tsjinners bin ferballe fan it meidwaan! Dizze keamer kin net mear brûkt wurde. + Jo hawwe de útnûging nei %1$s oannaam + %1$s hat de útnûging nei %2$s oannaam + Jo hawwe de útnûging nei %1$s ynlutsen + %1$s hat de útnûging nei %2$s wer ynlutsen + Jo hawwe de útnûging nei %1$s om de keamer binnen te gean wer ynlutsen + %1$s hat de útnûging nei %2$s om de keamer binnen te gean wer ynlutsen + Jo hawwe %1$s útnûge + %1$s hat %2$s útnûge + Jo hawwe in útnûging nei %1$s stjoerd om de keamer binnen te gean + %1$s hat in útnûging nei %2$s stjoerd om de keamer binnen te gean + %1$s hat de keamerôfbylding fuortsmiten + VoIP-konferinsje ôfrûn + VoIP-konferinsje begûn + Jo hawwe in VoIP-konferinsje oanfrege + %1$s hat in VoIP-konferinsje oanfrege + 🎉 Alle servers bin ferballe fan it meidwaan! Dizze keamer kin net mear brûkt wurde. • Tsjinners dy oerien komme mei IP adressen binne no ferballe. • Tsjinners dy oerien komme mei IP adressen binne no tastien. • Tsjinners dy oerien komme mei %s binne út de list mei tastiene tsjinners wei helle. @@ -1032,7 +1032,7 @@ • Tsjinners dy oerien komme mei IP adressen binne ferballe. • Tsjinners dy oerien komme mei IP adressen binne tastien. • Tsjinners dy oerien komme mei %s binne ferballe. - Jo hawwe de keamer ôfbylding fuortsmiten + Jo hawwe de keamerôfbylding fuortsmiten Jo hawwe de keamer ôfbylding feroare %1$s hat de keamer ôfbylding feroare %1$s hat syn profylfoto feroare From 563c66faddc07b3fbd0bb099ca5878876a4af30c Mon Sep 17 00:00:00 2001 From: Szimszon Date: Tue, 31 Aug 2021 06:24:43 +0000 Subject: [PATCH 015/350] Translated using Weblate (Hungarian) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/hu/ --- vector/src/main/res/values-hu/strings.xml | 66 ++++++++++++++++++++--- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 66fe80b5bb7..4113f38efed 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -2575,7 +2575,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Egyéni esemény elküldése Szoba állapot felderítése Fejlesztői Eszközök - Ez egy nyilvános szoba + Nyilvános szoba Olvasás visszajelzés megjelenítése Nincs értesítés Értesítés hang nélkül @@ -2590,7 +2590,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Alapértelmezett megbízhatósági szint Kiválasztott Videó - Ebben a szobába küldetlen piszkozat van + küldetlen piszkozat van Néhány üzenet nem lett elküldve Profilkép törlése Profilkép megváltoztatása @@ -2628,7 +2628,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Visszahívás Hívás befejeződött %1$s elutasította a hívást - Elutasítottad ezt a hívást: %1$s + Elutasítottad ezt a hívást: %s Jelenleg ebben a hívásban van %1$s hívást kezdeményezett Hívást kezdeményeztél @@ -2802,7 +2802,7 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Névtelen szoba Privát tér Nyilvános tér - Ez a Tér nyilvános + Nyilvános Tér Ismeretlen személy Konzultáció vele: %1$s Ez a szerver már szerepel a listában @@ -2871,8 +2871,8 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Csoport üzenetek Titkosított közvetlen beszélgetések Közvetlen beszélgetések - Üzenetek amik a nevemet tartalmazzák - A profilnevemet tartalmazó üzenetek + Felhasználói nevem + Megjelenítési nevem Értesítés ezért: Más Megemlítések és kulcsszavak @@ -2897,4 +2897,58 @@ Ha nem te állítottad be a visszaállítási metódust, akkor egy támadó pró Elhúzás a megszakításhoz Hang üzenet indítása %s tér tagság megtalálhatja és hozzáférhet. Más tereket is beállíthatsz. + %s a Beállításokba a közvetlen meghívások fogadásához az Elemenetben. + Ehhez a térhez a meghívó ide lett elküldve: %s, ami nincs összefüggésben a fiókoddal + Ehhez a szobához a meghívó ide lett elküldve: %s, ami nincs összefüggésben a fiókoddal + A Tér tagságnak privát szoba megtalálásában és belépésben való segítséghez menj a szoba beállításaiba a profilképre való koppintással. + Ennek az e-mailnek a fiókhoz való kötése + Segíts a tér tagságának privát szobák megtalálásában + A szobák egyszerűbben maradhatnak privátok a téren kívül, amíg a tér tagsága megtalálhatja és beléphet oda. Minden új szoba a téren rendelkezik ezzel a beállítási lehetőséggel. + Segíts a téren az embereknek privát szobák megtalálásába és a belépésben, nem szükséges a személyes meghívó. + Új: Engedd az embereknek a privát szobák megtalálását és a belépést + Csoportos hívás elkezdődött + Minden szoba amibe beléptél megjelenik a Kezdő téren. + Minden szoba megjelenítése a Kezdő téren + A hívás befejezéséhez oldalra húzni + %1$s koppintás a visszatéréshez + Aktív hívás (%1$s) · + + Aktív hívás · + %1$d aktív hívás · + + Kapcsolódás sikertelen + Nincs válasz + Nem fogadott videóhívás + Nem fogadott hanghívás + Videóhívás elutasítva + Hanghívás elutasítva + Videóhívás befejeződött • %1$s + Videóhívás befejeződött • %1$s + Videó hívás folyamatban + Hanghívás folyamatban + Bejövő videó hívás + Bejövő hanghívás + Elutasítottad a hívást + Fiók beállítások + Értesítések kezelése itt: %1$s. + Megjegyzendő, hogy titkosított szobákban a megemlítésekre és kulcsszavakra való értesítés mobil eszközökön nem érhető el. + Értesítés ezért: + Titkosított szobákból mobiltelefonon nem kapsz értesítést megemlítésekről és kulcsszavakról. + Kulcsszavak + \@room + Kulcsszavak nem tartalmazhatják ezt: „%s” + Kulcsszó nem kezdődhet „.”-tal + Kulcsszó hozzáadása + Kulcsszavak + Nincs + Csak megemlítések és kulcsszavak + Hívás vége… + Nincs válasz + A hívott felhasználó foglalt. + Felhasználó foglalt + Hanghívás vele: %s + Videóhívás vele: %s + Hívás kicseng… + Terek + Tudj meg többet \ No newline at end of file From 04f8c42f1b8cc2675516a75e91d6c34b896b0f3e Mon Sep 17 00:00:00 2001 From: random Date: Mon, 30 Aug 2021 12:40:32 +0000 Subject: [PATCH 016/350] Translated using Weblate (Italian) Currently translated at 99.8% (2612 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/it/ --- vector/src/main/res/values-it/strings.xml | 66 ++++++++++++++++++++--- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 24c49aec9bc..8d69b4ded94 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -2648,7 +2648,7 @@ Richiama Questa chiamata è terminata %1$s ha rifiutato questa chiamata - Hai rifiutato questa chiamata %1$s + Hai rifiutato questa chiamata %s Stai partecipando a questa chiamata %1$s ha iniziato una chiamata Hai iniziato una chiamata @@ -2696,7 +2696,7 @@ Livello di fiducia predefinito Selezionato Video - Questa stanza ha una bozza non inviata + ha una bozza non inviata Alcuni messaggi non sono stati inviati Elimina immagine profilo Cambia immagine profilo @@ -2813,7 +2813,7 @@ Gestisci stanze Cerchi qualcuno che non è in %s\? %s ti ha invitato - Questa stanza è pubblica + Stanza pubblica Invia i file multimediali nella dimensione originale Invia il video nella dimensione originale @@ -2849,7 +2849,7 @@ Stanza senza nome Spazio privato Spazio pubblico - Questo spazio è pubblico + Spazio pubblico Persona sconosciuta Trasferisci a %1$s Consultazione con %1$s @@ -2939,10 +2939,64 @@ Messaggi di gruppo Messaggi diretti cifrati Messaggi diretti - Messaggi contenenti il mio nome utente - Messaggi contenenti il mio nome mostrato + Il mio nome utente + Il mio nome visibile Notificami per Altro Menzioni e parole chiave Notifiche predefinite + %s nella impostazioni per ricevere inviti direttamente in Element. + Collega questa email con il tuo account + Questo invito per questo spazio è stato inviato a %s, la quale non è associata al tuo account + Questo invito per questa stanza è stato inviato a %s, la quale non è associata al tuo account + Per aiutare i membri dello spazio a trovare ed entrare in una stanza privata, vai nelle impostazioni di quella stanza toccando il suo avatar. + Aiuta i membri dello spazio a trovare stanze private + Ciò rende facile mantenere private le stanze in uno spazio, mentre le persone potranno trovarle ed unirsi. Tutte le stanze nuove in uno spazio avranno questa opzione disponibile. + Aiuta le persone negli spazi a trovare ed entrare nelle stanze private da sole, non c\'è bisogno di invitarle a mano. + Novità: consenti alle persone negli spazi di trovare ed entrare nelle stanze private + Chiamata di gruppo iniziata + Tutte le stanze in cui sei appariranno nella pagina principale. + Mostra tutte le stanze nella pagina principale + Scorri per terminare la chiamata + %1$s Tocca per tornare + Chiamata attiva (%1$s) · + + Chiamata attiva · + %1$d chiamate attive · + + Connessione fallita + Nessuna risposta + Videochiamata persa + Telefonata persa + Videochiamata rifiutata + Telefonata rifiutata + Videochiamata terminata • %1$s + Telefonata terminata • %1$s + Videochiamata attiva + Telefonata attiva + Videochiamata in arrivo + Telefonata in arrivo + Hai rifiutato questa chiamata + Impostazioni dell\'account + Puoi gestire le notifiche nelle %1$s. + Nota che le notifiche per menzioni e parole chiave non sono disponibili nelle stanze cifrate su mobile. + Notificami per + Non riceverai notifiche per menzioni e parole chiave in stanze cifrate su mobile. + Parole chiave + \@stanza + Le parole chiave non possono contenere \'%s\' + Le parole chiave non possono iniziare con \'.\' + Aggiungi nuova parola chiave + Le tue parole chiave + Nessuno + Solo menzioni e parole chiave + Chiusura chiamata… + Nessuna risposta + L\'utente che hai chiamato è occupato. + Utente occupato + Telefonata con %s + Videochiamata con %s + Sta squillando… + Spazi + Maggiori informazioni \ No newline at end of file From 504437a1e1a8c7e89ca8ad2607ecd185c80ce7b3 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Mon, 30 Aug 2021 14:04:23 +0000 Subject: [PATCH 017/350] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/pt_BR/ --- vector/src/main/res/values-pt-rBR/strings.xml | 86 +++++++++++++++---- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index c7e6d580fe5..0cec8007b55 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -369,7 +369,7 @@ O aplicativo tem crashado da última vez. Você gostaria de abrir a tela de reporte de crash\? Enviar para Lida - Juntar-se a Sala + Juntar-Se a Sala Nome de Usuária(o) Criar Conta Fazer Login @@ -517,8 +517,8 @@ Pular para não-lida(s) - Você tem sido convidada(o) a juntar-se a esta sala por %s - Este convite foi enviado para %s, que não está associada(o) a esta conta. + Você tem sido convidada(o) para se juntar a esta sala por %s + Este convite foi enviado para %s, que não está associada(o) com esta conta. \nVocê pode desejar fazer login com uma conta diferente, ou adicionar este email a sua conta. Você está tentando acessar %s. Você gostaria de se juntar a fim de participar na discussão\? uma sala @@ -656,7 +656,7 @@ Ligar a tela por 3 segundos Mnsgns em chats um-a-um Mnsgns em chats de grupo - Quando eu sou convidada(o) a uma sala + Quando eu sou convidada(o) para uma sala Convites de chamada Mensagens enviadas por bot Sincronização no background @@ -1845,7 +1845,7 @@ Assim como email, contas têm uma casa, embora você pode falar com qualquer pessoa Junte-se a milhões de graça no maior servidor público Hospedagem premium para organizações - Saiba mais + Saber mais Outro Configurações personalizadas & avançadas Continuar @@ -1869,7 +1869,7 @@ O aplicativo não é capaz de criar uma conta neste servidorcasa. \n \nVocê quer fazer signup usando um cliente web\? - Este email não está associado a nenhuma conta. + Este email não está associado com nenhuma conta. Resettar senha em %1$s Um email de verificação vai ser enviado para sua inbox para confirmar definição de sua nova senha. Próximo @@ -2038,7 +2038,7 @@ \n \nSuas mensagens são asseguradas com cadeados e somente você e a/o recipente têm as chaves únicas para as destrancar. Segurança - Saiba mais + Saber mais Mais Ações de Admin Configurações de sala @@ -2666,7 +2666,7 @@ Chamar de volta Esta chamada tem terminado %1$s declinou esta chamada - Você declinou esta chamada %1$s + Você declinou esta chamada %s Você está atualmente nesta chamada %1$s começou uma chamada Você começou uma chamada @@ -2736,7 +2736,7 @@ Checado Fechar Seletor de Emoji Abrir seletor de Emoji - Esta sala tem rascunho não-enviado + tem rascunho não-enviado %d entrada %d entradas @@ -2771,7 +2771,7 @@ Feedback de espaços Desculpe, um erro ocorreu enquanto tentando se juntar à conferência Juntar-se ao Espaço com a dada id - Esta sala é pública + Sala pública Não-checado Pessoa desconhecida Transferir para %1$s @@ -2827,10 +2827,10 @@ Criar Espaço Junte-se a meu espaço %1$s %2$s Elas vão ser capazes de explorar %s - Convidar a %s + Convidar para %s É só você no momento. %s vai ser ainda melhor com outras(os). - Convidar a %s - Convidar pessoas a seu espaço + Convidar para %s + Convidar pessoas para seu espaço Descrição Criando Espaço… Aleatório @@ -2863,7 +2863,7 @@ Espaço privado Espaço público Criar um Espaço - Este Espaço é público + Espaço público Sair de sala com dada id (ou sala atual se nula) Este servidor já está presente na lista Não dá para encontrar este servidor ou sua lista de salas @@ -2957,9 +2957,63 @@ Mensagens de grupo Mensagens diretas encriptadas Mensagens diretas - Mensagens contendo meu nome de usuária(o) - Mensagens contendo meu nome de exibição + Meu nome de usuária(o) + Meu nome de exibição Outras Menções e Palavrachaves Notificações Default + %s em Configurações para receber convites diretamente em Element. + Linkar este email com sua conta + Este convite para este espaço foi enviado para %s que não está associado com sua conta + Este convite para esta sala foi enviado para %s que não está associado com sua conta + Para ajudar membros de espaço encontrarem e se juntarem uma sala privada, vá para as configurações dessa sala ao tocar no avatar. + Ajude membros de espaço encontrarem salas privadas + Isto facilita salas ficarem privadas a um espaço, enquanto deixa pessoas no espaço encontrarem e se juntarem a elas. Todas as salas novas em um espaço vão ter esta opção disponível. + Ajude pessoas em espaços a elas mesmas encontrarem e se juntarem a salas privadas, sem necessidade de manualmente convidar todo mundo. + Novo: Deixe pessoas em espaços encontrarem e se juntarem a salas privadas + Chamada de grupo começada + Todas as salas em que você está vão ser mostradas em Home. + Mostrar todas as salas em Home + Deslize para terminar a chamada + %1$s Toque para retornar + Chamada ativa (%1$s) · + + Chamada ativa · + %1$d chamadas ativas · + + Conexão falhou + Sem resposta + Chamada de vídeo perdida + Chamada de voz perdida + Chamada de vídeo declinada + Chamada de voz declinada + Chamada de vídeo terminada • %1$s + Chamada de voz terminada • %1$s + Chamada de vídeo ativa + Chamada de voz ativa + Chamada de vídeo entrante + Chamada de voz entrante + Você declinou esta chamada + Configurações de conta + Você pode gerenciar notificações em %1$s. + Por favor note que notificações de menções & palavrachave não estão disponíveis em salas encriptadas no celular. + Notifique-me por + Você não vai ter notificações para menções & palavrachaves em salas encriptadas no celular. + Palavrachaves + \@room + Palavrachaves não podem conter \'%s\' + Palavrachaves não podem começar com \'.\' + Adicionar nova palavrachave + Suas palavachaves + Nenhuma + Menções & Palavrachaves somente + Terminando chamada… + Sem resposta + A/o usuária(o) que você chamou está ocupada(o). + Usuária(o) ocupada(o) + Chamada de áudio com %s + Chamada de vídeo com %s + Chamada tocando… + Espaços + Saber Mais \ No newline at end of file From 7c9b0e77a15ae0db45f5c2410900efc6f015f4bf Mon Sep 17 00:00:00 2001 From: Besnik Bleta Date: Wed, 1 Sep 2021 09:19:46 +0000 Subject: [PATCH 018/350] Translated using Weblate (Albanian) Currently translated at 99.5% (2603 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sq/ --- vector/src/main/res/values-sq/strings.xml | 65 ++++++++++++++++++++--- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index e3f2afadc4c..f8d08d2c6a3 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -2545,7 +2545,7 @@ Ktheji thirrjen Kjo thirrje ka përfunduar %1$s hodhi poshtë këtë thirrje - Hodhët poshtë këtë thirrje %1$s + Hodhët poshtë këtë thirrje %s Gjendeni në këtë thirrje %1$s nisi një thirrje Filluat një thirrje @@ -2631,7 +2631,7 @@ Shkallë besimi parazgjedhje Të përzgjedhura Video - Kjo dhomë ka skicë të padërguar + ka skicë të padërguar Disa nga mesazhet s’janë dërguar Fshije avatarin Ndërroni avatarin @@ -2748,7 +2748,7 @@ Administroni dhoma Po kërkoni për dikë jo në %s\? %s ju fton - Kjo dhomë është publike + Dhomë publike E pakontrolluar U kontrollua Dërgoje median në madhësinë origjinale @@ -2786,7 +2786,7 @@ Dhomë e Paemërtuar Hapësirë private Hapësirë publike - Kjo Hapësirë është publike + Hapësirë publike Person i panjohur Shpërngule te %1$s Po konsultohet me %1$s @@ -2876,10 +2876,63 @@ Mesazhe grupi Mesazhe të drejtpërdrejtë të fshehtëzuar Mesazhe të drejtpërdrejtë - Mesazhe që përmbajnë emrin tim të përdoruesit - Mesazhe që përmbajnë emrin tim të ekranit + Emri im i përdoruesit + Emri im në ekran Njoftomë për Tjetër Përmendje dhe Fjalëkyçe Njoftime Parazgjedhje + %s te Rregullimet, që të merrni ftesa drejt e në Element. + Lidheni këtë email me llogarinë tuaj + Kjo ftesë për te kjo hapësirë u dërgua te %s që s’është i përshoqëruar me llogarinë tuaj + Kjo ftesë për te kjo dhomë qe dërguar për %s që s’është i përshoqëruar me llogarinë tuaj + Për t’i ndihmuar anëtarët të gjejnë dhe hyjnë në një dhomë private, kaloni te rregullimet e asaj dhome duke prekur mbi avatarin. + Ndihmoni anëtarë hapësirash të gjejnë dhoma private + Kjo e bën të lehtë mbajtjen private të dhomave në një hapësirë, ndërkohë që u lejon njerëzve në hapësirë të gjejnë dhe hyjnë në të tilla. Krejt dhomat e reja në një hapësirë do ta ofrojnë këtë mundësi. + Ndihmojini njerëzit në hapësira të gjejnë dhe hyjnë vetë në dhoma private, pa pasur nevojë për ftesë dorazi të gjithkujt. + E re: Lejoni persona në hapësira të gjejnë dhe hyjnë në dhoma private + U fillua thirrje grupi + Krejt dhomat ku gjendeni do të shfaqen te Home. + Shfaq krejt dhomat te Home + Rrëshqiteni, që të përfundohet thirrja + %1$s Prekeni që të kthehet + Thirrje aktive (%1$s) · + + Thirrje aktive + %1$d thirrje aktive + + Lidhja dështoi + S’ka përgjigje + Thirrje video e humbur + Thirrje zanore e humbur + Thirrja video u hodh poshtë + U hodh poshtë thirrje zanore + Thirrja video përfundoi • %1$s + Thirrja zanore përfundoi • %1$s + Thirrje video aktive + Thirrje zanore aktive + Thirrje video ardhëse + Thirrje zanore ardhëse + Hodhët poshtë këtë thirrje + Rregullime llogarie + Njoftimet mund t’i administroni te %1$s. + Ju lutemi, kini parasysh se në celular njoftimet për përmendje & fjalëkyçe nuk funksionojnë për dhoma të fshehtëzuara. + Njoftomë për + Në celular s’do të merrni njoftime për përmendje & fjalëkyçe në dhoma të fshehtëzuara. + Fjalëkyçe + Fjalëkyçet s’mund të përmbajnë \'%s\' + Fjalëkyçet s’mund të fillojnë me \'.\' + Shtoni fjalëkyç të ri + Fjalëkyçet tuaja + Asnjë + Vetëm Përmendje & Fjalëkyçe + Po përfundohet thirrja… + S’ka përgjigje + Përdoruesi që thirrët është i zënë. + Përdoruesi është i zënë + Thirrje audio me %s + Thirrje video me %s + Po i bihet ziles… + Hapësira + Mësoni Më Tepër \ No newline at end of file From 48cc481850dd69f371f3c62683343280aa3d3807 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 31 Aug 2021 07:22:55 +0000 Subject: [PATCH 019/350] Translated using Weblate (Swedish) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/sv/ --- vector/src/main/res/values-sv/strings.xml | 66 ++++++++++++++++++++--- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 73d71eebfb8..9a560e56116 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -2597,7 +2597,7 @@ Ring tillbaka Det här samtalet har avslutats %1$s avböjde det här samtalet - Du avböjde det här samtalet %1$s + Du avböjde det här samtalet %s Du är för närvarande i det här samtalet %1$s startade ett samtal Du startade ett samtal @@ -2637,7 +2637,7 @@ Förvald förtroendenivå Vald Video - Det här rummet har oskickade utkast + har oskickade utkast Vissa meddelanden har inte skickats Radera avatar Byt avatar @@ -2760,7 +2760,7 @@ Hantera rum Letar du efter någon inte i %s\? %s bjuder in dig - Det här rummet är offentligt + Offentligt rum Skicka media med originalstorlek Skicka video med originalstorlek @@ -2796,7 +2796,7 @@ Namnlöst rum Privat utrymme Offentligt utrymme - Det här utrymmet är offentligt + Offentligt utrymme Ökänd person Överför till %1$s Rådfrågar %1$s @@ -2875,8 +2875,8 @@ Gruppmeddelanden Krypterade direktmeddelanden Direktmeddelanden - Meddelanden som innehåller mitt användarnamn - Meddelanden som innehåller mitt visningsnamn + Mitt användarnamn + Mitt visningsnamn Avisera mig för Andra Omnämnanden och nyckelord @@ -2892,4 +2892,58 @@ Hemserver-API-URL Saknar behörighet För att skicka röstmeddelanden, vänligen ge mikrofonåtkomst. + %s i inställningar för att ta emot inbjudningar direkt i Element. + Länka den här e-postadressen med ditt konto + Denna inbjudan till det här utrymmet skickades till %s, vilket inte är associerat med ditt konto + Denna inbjudan till det här rummet skickades till %s, vilket inte är associerat med ditt konto + För att hjälpa utrymmesmedlemmar att hitta och gå med i ett privat rum, gå till rummets inställningar genom att trycka på avataren. + Hjälp utrymmesmedlemmar att hitta privata rum + Detta gör det enklare för rum att hållas privata till ett utrymme, medans personer i utrymmet kan hitta och gå med i dem. Alla nya rum i ett utrymme kommer ha det här alternativet tillgängligt. + Hjälp personer i utrymmen att hitta och gå med i privata rum själva, utan behov av att manuellt bjuda in alla. + Nytt: Låt personer i utrymmen hitta och gå med i privata rum + Gruppsamtal påbörjat + Visa alla rum i Hem + Alla rum du är i kommer att visas i Hem. + Svep för att avsluta samtalet + %1$s Tryck för att återgå + Aktivt samtal (%1$s) · + + Aktivt samtal · + %1$d aktiva samtal · + + Anslutning misslyckades + Inget svar + Missat videosamtal + Missat röstsamtal + Videosamtal avböjt + Röstsamtal avböjt + Videosamtal avslutat • %1$s + Röstsamtal avslutat • %1$s + Aktivt videosamtal + Aktivt röstsamtal + Inkommande videosamtal + Inkommande röstsamtal + Du avböjde det här samtalet + Kontoinställningar + Du kan hantera aviseringar i %1$s. + Observera att aviseringar för omnämnanden och nyckelord inte är tillgängliga i krypterade rum på mobilen. + Avisera mig för + Du kommer inte att får aviseringar för omnämnanden och nyckelord i krypterade rum på mobilen. + Nyckelord + \@rum + Nyckelord kan inte innehålla \'%s\' + Nyckelord kan inte börja med \'.\' + Lägg till nytt nyckelord + Dina nyckelord + Inga + Endast omnämnanden och nyckelord + Avslutar samtal… + Inget svar + Användaren du ringde är upptagen. + Användare upptagen + Ljudsamtal med %s + Videosamtal med %s + Samtal ringer… + Utrymmen + Lär dig mer \ No newline at end of file From ca7f7945f15affc097908a8b9d0a419168da4959 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 30 Aug 2021 12:19:42 +0000 Subject: [PATCH 020/350] Translated using Weblate (Ukrainian) Currently translated at 67.7% (1772 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 02399321062..888382efa13 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -1884,7 +1884,7 @@ \nВаші повідомлення захищені замками, тож лише ви та отримувачі мають унікальні ключі для їхнього відмикання. Це початок %s. %1$s відхиляє цей виклик - Ви відхилили цей виклик %1$s + Ви відхилили цей виклик %s %1$s розпочинає виклик Ви розпочали виклик Швидкі реакції From 4c40a8138ed74b9ec6f9a7428f71d77d9f13d3d1 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Mon, 30 Aug 2021 12:50:56 +0000 Subject: [PATCH 021/350] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hans/ --- vector/src/main/res/values-zh-rCN/strings.xml | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index 5716b89925f..3e6451b3c79 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -2570,7 +2570,7 @@ 关闭通知 无声通知 有声通知 - 此聊天室有未发送的草稿 + 有未发送的草稿 有些消息未被发送 从文件中导入密钥 发生错误,消息未能发送 @@ -2660,7 +2660,7 @@ 离开指定 id 的聊天室(如果为空值则为当前所处的聊天室) 使用指定的 id 加入空间 创建空间 - 此聊天室为公开聊天室 + 公开聊天室 未检查 开启挂件 屏幕截图 @@ -2673,7 +2673,7 @@ 查找电话号码时发生了错误 此通话已结束 %1$s 拒绝了此通话 - 你拒绝了此通话 %1$s + 你拒绝了此通话 %s 你当前正处于此通话中 有未保存的更改。要放弃更改吗? 聊天室尚未创建。取消创建聊天室? @@ -2753,7 +2753,7 @@ 未命名的聊天室 私有空间 公开空间 - 此空间为公开空间 + 公开空间 陌生人 转移给 %1$s 与 %1$s 商量 @@ -2841,10 +2841,63 @@ 群组消息 加密的私信 私信 - 包含我的用户名的消息 - 包含我的显示名称的消息 + 我的用户名 + 我的显示名称 通知事项 其他 提及和关键词 默认通知 + 活跃视频通话 + 活跃语音通话 + 在 Element 中直接接收邀请的设置 %s。 + 将此邮箱与您的账户相链接 + 加入这个空间的邀请被发送至 %s,此邮箱未与您的账户相关联 + 加入这个聊天室的邀请被发送至 %s,此邮箱未与您的账户相关联 + 要帮助空间成员找到并加入一个私人聊天室,只需点击头像进入聊天室设置。 + 帮助空间成员找到私人聊天室 + 这使聊天室很容易在空间中保持私密性,同时让空间中的人们找到并加入它们。空间中的所有新聊天室都有这个选项。 + 帮助空间里的人们自己找到和加入私人房间,不需要手动邀请每个人。 + 新:让人们在空间中找到并加入私人聊天室 + 群通话已启动 + 你所在的全部聊天室将显示在主页上。 + 在主页上显示所有聊天室 + 滑动结束通话 + %1$s 轻按返回 + 活跃通话 (%1$s) · + + %1$d 个活跃通话· + + 连接失败 + 无应答 + 未接视频通话 + 未接语音通话 + 视频通话被拒绝 + 语音通话被拒绝 + 视频通话结束了 • %1$s + 语音通话结束了 • %1$s + 视频来电 + 语音来电 + 你拒绝了此通话 + 账户设置 + 你可以管理 %1$s 中的通知。 + 请注意,提及和关键字通知在移动端的加密聊天室中不可用。 + 通知事项 + 在移动端的加密房间里,你不会收到提及和关键字的通知。 + 关键词 + \@聊天室 + 关键词不能包含 \'%s\' + 关键词不能以 \'.\' 开头 + 添加新关键词 + 你的关键词 + + 仅提及 & 关键词 + 正结束通话… + 无应答 + 你呼叫的用户正忙。 + 用户忙 + 与 %s 音频通话 + 和 %s 视频通话 + 来电响铃中… + 空间 + 了解更多 \ No newline at end of file From 341e2388a8645b9017178f92141d71e082a25ed1 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 31 Aug 2021 03:28:37 +0000 Subject: [PATCH 022/350] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (2615 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/zh_Hant/ --- vector/src/main/res/values-zh-rTW/strings.xml | 65 +++++++++++++++++-- 1 file changed, 59 insertions(+), 6 deletions(-) diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index d2129f96d51..e05a234dea2 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -2547,7 +2547,7 @@ 回撥 此通話已結束 %1$s 婉拒了此通話 - 您婉拒了此通話 %1$s + 您婉拒了此通話 %s 您目前在此通話中 %1$s 開始了通話 您開始了通話 @@ -2585,7 +2585,7 @@ 預設信任等級 已選取 視訊 - 此聊天室有未傳送的草稿 + 有未傳送的草稿 部份訊息未傳送 刪除大頭照 變更大頭照 @@ -2708,7 +2708,7 @@ 管理聊天室 正在尋找不在 %s 中的人? %s 邀請您 - 此聊天室是公開的 + 公開聊天室 傳送原始大小的媒體 傳送原始大小的影片 @@ -2743,7 +2743,7 @@ 未命名聊天室 私人空間 公開空間 - 此空間是公開的 + 公開空間 未知的人 轉移至 %1$s 與 %1$s 進行諮詢 @@ -2831,10 +2831,63 @@ 群組訊息 已加密的直接訊息 直接訊息 - 訊息包含了我的使用者名稱 - 訊息包含了我的顯示名稱 + 我的使用者名稱 + 我的顯示名稱 通知我 其他 提及與關鍵字 預設通知 + 設定中的 %s 可直接在 Element 中接收邀請。 + 將此電子郵件與您的帳號連結 + 此空間的邀請已傳送給與您的帳號無關的 %s + 此聊天室的邀請已傳送給與您的帳號無關的 %s + 要協助空間成員尋找並加入私人聊天室,請點擊大頭照進入該聊天是的設定中。 + 協助空間成員尋找私人聊天室 + 這讓聊天室可以輕鬆地對空間維持隱密,同時讓空間中的夥伴找到並加入它們。空間中的所有新的聊天室都將提供此選項。 + 協助空間內的夥伴自己尋找私人聊天室,不需要手動邀請所有人。 + 新功能:讓空間中的人尋找並加入私人聊天室 + 群組通話開始 + 您所在的所有聊天室都會顯示在 Home 中。 + 顯示 Home 中的所有聊天室 + 滑動結束通話 + %1$s 點擊返回 + 作用中的通話 (%1$s)。 + + %1$d 作用中的通話。 + + 連線失敗 + 無回應 + 未接聽的視訊通話 + 未接聽的語音通話 + 視訊通話已回絕 + 視訊通話已回絕 + 視訊通話已結束 • %1$s + 語音通話已結束 • %1$s + 作用中的視訊通話 + 作用中的語音通話 + 來電視訊通話 + 來電語音通話 + 您回絕了此通話 + 帳號設定 + 您可以管理 %1$s 中的通知。 + 請注意,行動裝置上的加密聊天室並不提供提及與關鍵字通知。 + 通知我 + 您不會在行動裝置上收到在加密聊天室中的提及與關鍵字通知。 + 關鍵字 + \@room + 關鍵字不能包含「%s」 + 關鍵字不能以 \'.\' 開頭 + 新增新的關鍵字 + 您的關鍵字 + + 僅提及與關鍵字 + 結束通話…… + 無回應 + 您要通話的使用者忙碌中。 + 使用者忙碌 + 使用 %s 音訊通話 + 使用 %s 視訊通話 + 通話響鈴中…… + 空間 + 取得更多資訊 \ No newline at end of file From 3ddfc3e1cc97690e0926afa22d97c9972d4bff1f Mon Sep 17 00:00:00 2001 From: Szimszon Date: Mon, 30 Aug 2021 14:38:41 +0000 Subject: [PATCH 023/350] Translated using Weblate (Hungarian) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/ --- fastlane/metadata/android/hu-HU/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/hu-HU/changelogs/40102000.txt diff --git a/fastlane/metadata/android/hu-HU/changelogs/40102000.txt b/fastlane/metadata/android/hu-HU/changelogs/40102000.txt new file mode 100644 index 00000000000..1e708b1c7bd --- /dev/null +++ b/fastlane/metadata/android/hu-HU/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Fő változás ebben a verzióban: Hangüzenetek alapértelmezetten engedélyezettek. +Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.16 From e1c095d479a98ee5c3a0c5538e99633680658c20 Mon Sep 17 00:00:00 2001 From: lvre <7uu3qrbvm@relay.firefox.com> Date: Mon, 30 Aug 2021 13:25:58 +0000 Subject: [PATCH 024/350] Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/pt_BR/ --- fastlane/metadata/android/pt-BR/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/pt-BR/changelogs/40102000.txt diff --git a/fastlane/metadata/android/pt-BR/changelogs/40102000.txt b/fastlane/metadata/android/pt-BR/changelogs/40102000.txt new file mode 100644 index 00000000000..3c600baeedf --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: Mensagem de Voz está habilitada por default. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.16 From 3fd906fcb84949f9036d8e19ad5634df1c4d2500 Mon Sep 17 00:00:00 2001 From: LinAGKar Date: Tue, 31 Aug 2021 07:00:58 +0000 Subject: [PATCH 025/350] Translated using Weblate (Swedish) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/ --- fastlane/metadata/android/sv-SE/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/sv-SE/changelogs/40102000.txt diff --git a/fastlane/metadata/android/sv-SE/changelogs/40102000.txt b/fastlane/metadata/android/sv-SE/changelogs/40102000.txt new file mode 100644 index 00000000000..c31355dc09c --- /dev/null +++ b/fastlane/metadata/android/sv-SE/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: Röstmeddelanden är aktiverade som förval. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.2.0 From b102f5e333615d0bc2c1ce1ab89d0be3fa0fb0cd Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Mon, 30 Aug 2021 12:19:16 +0000 Subject: [PATCH 026/350] Translated using Weblate (Ukrainian) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/ --- fastlane/metadata/android/uk/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/uk/changelogs/40102000.txt diff --git a/fastlane/metadata/android/uk/changelogs/40102000.txt b/fastlane/metadata/android/uk/changelogs/40102000.txt new file mode 100644 index 00000000000..07defcbb57f --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Основні зміни в цій версії: голосові повідомлення типово увімкнено. +Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.16 From 69eb59888fdac2ca9ed4f31d728bdf334c748569 Mon Sep 17 00:00:00 2001 From: sr093906 Date: Mon, 30 Aug 2021 12:52:17 +0000 Subject: [PATCH 027/350] Translated using Weblate (Chinese (Simplified)) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hans/ --- fastlane/metadata/android/zh-CN/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/zh-CN/changelogs/40102000.txt diff --git a/fastlane/metadata/android/zh-CN/changelogs/40102000.txt b/fastlane/metadata/android/zh-CN/changelogs/40102000.txt new file mode 100644 index 00000000000..eedbe81bacc --- /dev/null +++ b/fastlane/metadata/android/zh-CN/changelogs/40102000.txt @@ -0,0 +1,2 @@ +此版本中的主要更改:默认启用语音消息。 +完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.16 From e655fd498cf5b952278211e61692b865b52b3997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Priit=20J=C3=B5er=C3=BC=C3=BCt?= Date: Tue, 31 Aug 2021 16:21:43 +0000 Subject: [PATCH 028/350] Translated using Weblate (Estonian) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/et/ --- fastlane/metadata/android/et/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/et/changelogs/40102000.txt diff --git a/fastlane/metadata/android/et/changelogs/40102000.txt b/fastlane/metadata/android/et/changelogs/40102000.txt new file mode 100644 index 00000000000..678ad05309b --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: häälsõnumid on nüüd vaikimisi kasutusel. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.16 From b4d6773f462e120ffc7e82871c555472f04ceeca Mon Sep 17 00:00:00 2001 From: random Date: Mon, 30 Aug 2021 12:41:25 +0000 Subject: [PATCH 029/350] Translated using Weblate (Italian) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/it/ --- fastlane/metadata/android/it-IT/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/it-IT/changelogs/40102000.txt diff --git a/fastlane/metadata/android/it-IT/changelogs/40102000.txt b/fastlane/metadata/android/it-IT/changelogs/40102000.txt new file mode 100644 index 00000000000..3ba7f8ceb33 --- /dev/null +++ b/fastlane/metadata/android/it-IT/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: i messaggi vocali sono attivi in modo predefinito. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.16 From aa30c1f97e51e0fc839557c4c54e888e67a04fc7 Mon Sep 17 00:00:00 2001 From: Danial Behzadi Date: Mon, 30 Aug 2021 22:35:47 +0000 Subject: [PATCH 030/350] Translated using Weblate (Persian) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/ --- fastlane/metadata/android/fa/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/fa/changelogs/40102000.txt diff --git a/fastlane/metadata/android/fa/changelogs/40102000.txt b/fastlane/metadata/android/fa/changelogs/40102000.txt new file mode 100644 index 00000000000..c7e159bf2b0 --- /dev/null +++ b/fastlane/metadata/android/fa/changelogs/40102000.txt @@ -0,0 +1,2 @@ +تغییرهای اصلی در این نگارش: پیام صوتی به صورت پیش‌گزیده به کار افتاده. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.1.16 From 4523f986f73da3b9f5dab49d8a8f4f362f0822c6 Mon Sep 17 00:00:00 2001 From: Jeff Huang Date: Tue, 31 Aug 2021 02:50:50 +0000 Subject: [PATCH 031/350] Translated using Weblate (Chinese (Traditional)) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/ --- fastlane/metadata/android/zh-TW/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/zh-TW/changelogs/40102000.txt diff --git a/fastlane/metadata/android/zh-TW/changelogs/40102000.txt b/fastlane/metadata/android/zh-TW/changelogs/40102000.txt new file mode 100644 index 00000000000..993a59c825e --- /dev/null +++ b/fastlane/metadata/android/zh-TW/changelogs/40102000.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:語音訊息預設啟用。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.2.0 From 429cd8a526d89f668e449ff60f0ec32bddee92a8 Mon Sep 17 00:00:00 2001 From: waclaw66 Date: Tue, 31 Aug 2021 06:00:54 +0000 Subject: [PATCH 032/350] Translated using Weblate (Czech) Currently translated at 100.0% (29 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/ --- fastlane/metadata/android/cs-CZ/changelogs/40102000.txt | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 fastlane/metadata/android/cs-CZ/changelogs/40102000.txt diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40102000.txt b/fastlane/metadata/android/cs-CZ/changelogs/40102000.txt new file mode 100644 index 00000000000..929281c3888 --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: Hlasové zprávy jsou povoleny ve výchozím nastavení. +Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.2.0 From d3bdf999722975bd352adccabb5b487428e1d6ba Mon Sep 17 00:00:00 2001 From: Fjoerfoks Date: Tue, 31 Aug 2021 11:58:20 +0000 Subject: [PATCH 033/350] Translated using Weblate (Frisian) Currently translated at 58.6% (17 of 29 strings) Translation: Element Android/Element Android Store Translate-URL: https://translate.element.io/projects/element-android/element-store/fy/ --- fastlane/metadata/android/fy/changelogs/40101060.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastlane/metadata/android/fy/changelogs/40101060.txt b/fastlane/metadata/android/fy/changelogs/40101060.txt index 47ac5692d55..34b367f6a13 100644 --- a/fastlane/metadata/android/fy/changelogs/40101060.txt +++ b/fastlane/metadata/android/fy/changelogs/40101060.txt @@ -1,2 +1,2 @@ -Haadferoaring yn disse ferzje: feroaringen foar 1.1.5 -Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.6 +Haadwiziging yn dizze ferzje: feroaringen foar 1.1.5 +Folsleine wizigingslist: https://github.com/vector-im/element-android/releases/tag/v1.1.6 From fac9a19c017a8df3724803b057a6f333d228ac2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20V=C3=A1gner?= Date: Fri, 3 Sep 2021 12:34:13 +0200 Subject: [PATCH 034/350] Add back a string that has been removed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Peter Vágner --- vector/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index e9b07763d41..0431b3dd8de 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -3477,6 +3477,7 @@ Record Voice Message Slide to cancel + Voice Message Lock Play Voice Message Pause Voice Message Stop Recording From b2a31c62f16904fd648f4fb8400f0e0c66526ea6 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 7 Sep 2021 11:35:14 +0200 Subject: [PATCH 035/350] Move files to the correct folder. The changelog will be a bit wrong, but this is not a big deal. --- {newsfragment => changelog.d}/3207.bugfix | 0 {newsfragment => changelog.d}/3520.misc | 0 {newsfragment => changelog.d}/3531.feature | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {newsfragment => changelog.d}/3207.bugfix (100%) rename {newsfragment => changelog.d}/3520.misc (100%) rename {newsfragment => changelog.d}/3531.feature (100%) diff --git a/newsfragment/3207.bugfix b/changelog.d/3207.bugfix similarity index 100% rename from newsfragment/3207.bugfix rename to changelog.d/3207.bugfix diff --git a/newsfragment/3520.misc b/changelog.d/3520.misc similarity index 100% rename from newsfragment/3520.misc rename to changelog.d/3520.misc diff --git a/newsfragment/3531.feature b/changelog.d/3531.feature similarity index 100% rename from newsfragment/3531.feature rename to changelog.d/3531.feature From 24e2f1a8e0e4e0005c395b5fed0d301d94e82a71 Mon Sep 17 00:00:00 2001 From: Florian Renaud Date: Mon, 6 Sep 2021 15:58:18 +0200 Subject: [PATCH 036/350] Room details: Check power level before showing topic hint --- .../home/room/detail/timeline/item/MergedRoomCreationItem.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt index 43a9618a06f..1044cd7d443 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt @@ -143,7 +143,8 @@ abstract class MergedRoomCreationItem : BasedMergedItem Date: Mon, 6 Sep 2021 16:23:40 +0200 Subject: [PATCH 037/350] Room details: Check power level before showing add people button --- .../room/detail/timeline/factory/MergedHeaderItemFactory.kt | 1 + .../room/detail/timeline/item/MergedRoomCreationItem.kt | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MergedHeaderItemFactory.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MergedHeaderItemFactory.kt index f552266a1c7..25b5dc34d6b 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MergedHeaderItemFactory.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/factory/MergedHeaderItemFactory.kt @@ -206,6 +206,7 @@ class MergedHeaderItemFactory @Inject constructor(private val activeSessionHolde callback = callback, currentUserId = currentUserId, roomSummary = partialState.roomSummary, + canInvite = powerLevelsHelper?.isUserAbleToInvite(currentUserId) ?: false, canChangeAvatar = powerLevelsHelper?.isUserAllowedToSend(currentUserId, true, EventType.STATE_ROOM_AVATAR) ?: false, canChangeTopic = powerLevelsHelper?.isUserAllowedToSend(currentUserId, true, EventType.STATE_ROOM_TOPIC) ?: false, canChangeName = powerLevelsHelper?.isUserAllowedToSend(currentUserId, true, EventType.STATE_ROOM_NAME) ?: false diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt index 1044cd7d443..2305cc37547 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MergedRoomCreationItem.kt @@ -190,8 +190,9 @@ abstract class MergedRoomCreationItem : BasedMergedItem Date: Mon, 6 Sep 2021 16:37:40 +0200 Subject: [PATCH 038/350] towncrier --- changelog.d/3959.feature | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog.d/3959.feature diff --git a/changelog.d/3959.feature b/changelog.d/3959.feature new file mode 100644 index 00000000000..ac1116dad95 --- /dev/null +++ b/changelog.d/3959.feature @@ -0,0 +1 @@ +Check power level before displaying actions in the room details' timeline \ No newline at end of file From 18ddf649ba1c89a1027a198f34d9856a9a564c95 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Tue, 7 Sep 2021 12:01:46 +0000 Subject: [PATCH 039/350] Translated using Weblate (Ukrainian) Currently translated at 78.6% (2056 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 888382efa13..228d1f9bb7b 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -445,7 +445,7 @@ Зробити модератором Зробити адміністратором Нехтувати - Перестати ігнорувати + Рознехтувати ID користувача, ім\'я або email Згадати Показати Список Пристроїв From a9f345b69495d6603232db6d7e5c523d21378e05 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 7 Sep 2021 10:15:23 +0000 Subject: [PATCH 040/350] Translated using Weblate (Ukrainian) Currently translated at 78.6% (2056 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 581 +++++++++++++++++----- 1 file changed, 465 insertions(+), 116 deletions(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 228d1f9bb7b..2c66484c84c 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -79,10 +79,10 @@ Ви змінили рівень доступу на %1$s. Ви змінили серверні списки контролю доступу для цієї кімнати. Ви змінили назву кімнати на: %1$s - Ви змінили світлину кімнати + Ви змінили аватар кімнати Ви змінили тему на: %1$s Ви змінили показуване ім\'я з %1$s на %2$s - Ви змінили світлину профілю + Ви змінили свій аватар %1$s, %2$s, %3$s та %4$d інший %1$s, %2$s, %3$s та %4$d інші @@ -94,10 +94,10 @@ Типовий Модератор Адміністратор - Ви вилучили %1$s знадіб - %1$s вилучає %2$s знадіб - Ви додали %1$s знадіб - %1$s додає %2$s знадіб + Ви вилучили %1$s віджет + %1$s вилучає %2$s віджет + Ви додали %1$s віджет + %1$s додає %2$s віджет Ви прийняли запрошення до %1$s Ви надіслали запрошення для %1$s приєднатися до кімнати Ви оновили свій профіль %1$s @@ -158,8 +158,8 @@ Порожня кімната (була %s) Не типовий Не типовий (%1$d) - Ви змінили знадіб %1$s - %1$s змінює знадіб %2$s + Ви змінили віджет %1$s + %1$s змінює віджет %2$s Ви оновили кімнату. Ви зробили майбутню історію кімнати видимою для %1$s Ви зробили майбутні повідомлення видимими для %1$s @@ -187,7 +187,7 @@ Історія Сповістити про помилку - OK + Гаразд Скасувати Зберегти Залишити @@ -344,7 +344,7 @@ Збій реєстрації Збій реєстрації: не вдалося перевірити email Введіть дійсний URL - Неправильне ім\'я користувача або пароль + Хибне ім\'я користувача або пароль Вказаний токен доступу не розпізнано Викривлений JSON Не є JSON @@ -434,7 +434,7 @@ Перестій АДМІНІСТРУВАННЯ ВИКЛИК - ПРЯМІ ЧАТИ + Особисті повідомлення СЕАНСИ Запросити Залишити цю кімнату @@ -472,7 +472,7 @@ Повторити надсилання скасувати все Надіслати ненадіслані повідомлення знову - Видалити ненадіслані повідомлення + Видалити не надіслані повідомлення Файл не знайдено Ви не маєте дозволу писати повідомлення у цій кімнаті. @@ -528,17 +528,17 @@ Обране Не терміново - Прямий Чат + Особиста бесіда Залишити бесіду Забути Повідомлення Налаштування Версія - Умови & положення + Умови й положення Примітки третіх сторін Copyright - Політика конфіденційності + Політика приватності Аватар Показуване ім\'я @@ -566,10 +566,10 @@ Інтервал між запитами синхронізації Версія Версія OLM - Умови & положення + Умови й положення Примітки третіх сторін Copyright - Політика конфіденційності + Політика приватності Очистити кеш Очистити медіа кеш Зберігати медіа @@ -653,14 +653,14 @@ Жодного Доступ та видимість - Показувати кімнату при пошуку + Показувати кімнату в каталозі Доступ Прочитність історії Хто може читати історію повідомлень? Хто має доступ до кімнати? Будь-хто - Лише учасники (з моменту обрання цієї опції) + Лише учасники (з моменту вибору цієї опції) Лише учасники (з моменту запрошення) Лише учасники (з моменту вступу) @@ -669,13 +669,13 @@ Будь-хто з посиланням, окрім гостів Будь-хто з посиланням, включно з гостями - Забанені користувачі + Заблоковані користувачі Розширені Внутрішній ID кімнати Адреси Експериментальні - Це експериментальні функції, що можуть несподівано ламатись. Використовуйте з обережністю. + Це експериментальні можливості, що можуть несподівано виходити з ладу. Користуйтесь обережно. Наскрізне шифрування Наскрізне шифрування увімкнено Вийдіть з облікового запису, щоб отримати змогу увімкнути шифрування. @@ -683,11 +683,11 @@ Ніколи не надсилати зашифровані повідомлення з цього сеансу незвіреним сеансам у цій кімнаті. Кімната не має локальної адреси - Нова адреса (e.g #foo:matrix.org") - Недійсний формат псевдоніму - \'%s\' не є дійсним форматом псевдоніму + Нова адреса (наприклад #foo:matrix.org) + Хибний формат псевдоніма + «%s» хибний формат псевдоніма Основну адресу для цієї кімнати не вказано. - Попередження про адресу + Попередження основної адреси Встановити основною адресою Зробити не основною адресою Копіювати ID кімнати @@ -704,17 +704,17 @@ Інформація про подію ID користувача Ключ ідентичності Curve25519 - Заявлений ключ відбитка пальця Ed25519 + Необхідний ключ відбитка Ed25519 Алгоритм ID сеансу Помилка розшифрування - Інформація про пристрій відправника - Назва пристрою + Інформація про сеанс відправника + Загальнодоступна назва Загальнодоступна назва ID сеансу Ключ сеансу Перевірка - Відбиток пальця Ed25519 + Відбиток Ed25519 Експортувати E2E ключі кімнати Експортувати ключі кімнати Експортувати ключі до локального файлу @@ -771,12 +771,12 @@ Найбільший Величезний - Для керування знадобами у цій кімнаті потрібен дозвіл - Помилка створення знадобу + Для керування віджетами у цій кімнаті потрібен дозвіл + Помилка створення віджета Здійснювати конференц дзвінки через Jitsi - Ви впевнені, що бажаєте видалити знадіб з цієї кімнати\? + Ви впевнені, що бажаєте видалити віджет з цієї кімнати\? - Не вдалося створити знадіб. + Не вдалося створити віджет. Не вдалося надіслати запит. Рівень доступу має бути більше 0. Ви не перебуваєте в цій кімнаті. @@ -785,8 +785,8 @@ У запиті відсутній user_id. Кімната %s невидима. Додати застосунки Matrix - Гучне повідомлення - Тихі повідомлення + Гучні повідомлення + Тихі сповіщення Зробити фото Записати відео Виклик @@ -829,8 +829,8 @@ Список учасників Відкрити заголовок Синхронізація… - Всі повідомлення (гучно) - Всі повідомлення + Усі повідомлення (гучно) + Усі повідомлення Лише згадки Без звуку Додати ярлик на головний екран @@ -860,7 +860,7 @@ %d нових повідомлень - Обмежена конфіденційність + Обмежена приватність Програма потребує дозвіл на роботу у фоновому режимі • Сповіщення надсилаються через Google Cloud Messaging • Сповіщення містять лише метадані @@ -870,21 +870,21 @@ Говорити Очистити Вдруге запитати ключі шифрування з інших ваших сеансів. - Запит ключа відправлений. - Запит відправлений + Запит ключа надіслано. + Запит надіслано Вібрація при згадуванні користувача Деактивація облікового запису Деактивувати мій обліковий запис - Конфіденційність сповіщень + Приваиність сповіщень Надати дозвіл Вибрати другий варіант - Відправлення аналітичних даних + Надсилання аналітичних даних Так, я бажаю помогти! Настрій Сповіщення - Для відправлення ключа на цей пристрій, запустіть ${app_name} на іншому пристрої, що може дешифрувати повідомлення. - Вибачте, жодного стороннього застосунку не знайдено для завершення цієї дії. - Відправити голосове повідомлення + Щоб надіслати ключ на цей пристрій, запустіть ${app_name} на іншому пристрої, що може розшифрувати повідомлення. + Вибачте, жодного зовнішнього застосунку не знайдено для виконання цієї дії. + Надіслати голосове повідомлення Ця дія неможлива через відсутність дозволів. Помилка Системні сповіщення @@ -943,15 +943,15 @@ • Сповіщення містять метадані та дані повідомлення • Сповіщення не будуть показувати вміст повідомлень Попередній перегляд посилань - Попередній перегляд медіа перед відправкою + Попередній перегляд медіа перед надсиланням ${app_name} може працювати у фоновому режимі для керування безпекою та конфіденційністю ваших сповіщень. Це може вплинути на час роботи батареї. ${app_name} збирає анонімну аналітику, щоб ми могли вдосконалювати цей додаток. Будь ласка, увімкніть аналітику, щоб допомагати нам вдосконалювати ${app_name}. Ви наразі не є учасником жодної спільноти. Ця кімната не показує настрій для спільнот Новий ID спільноти (наприклад, +foo:matrix.org) - Недопустимий ID спільноти - \'%s\' недійсний ID спільноти + Хибний ID спільноти + «%s» хибний ID спільноти Будь ласка, створіть пароль для шифрування ключів що експортуються. Вам знадобиться ввести такий самий пароль для імпорту цих ключів. Створіть пароль Паролі мають збігатися @@ -976,14 +976,14 @@ %1$s у %2$s - %d активний знадіб - %d активні знадоби - %d активних знадобів - %d активних знадобів + %d активний віджет + %d активні віджети + %d активних віджетів + %d активних віджетів Пропущено обов’язковий параметр. Недійсний параметр. - Відправляти повідомлення клавішею Enter + Надсилати повідомлення клавішею Enter Надсилати голосові повідомлення Конференц-зв’язок перебуває в розробці та може бути ненадійним. Відобразити дію @@ -1028,12 +1028,12 @@ Адміністратор спільноти не вказав для неї детальної інформації. %2$s Вас викинув з %1$s - %2$s Вас забанив у %1$s + %2$s блокує вас у %1$s Причина: %1$s Приєднатися знову Забути кімнату Отримати аватар - Нотатка аватару + Примітка аватара Аватар Щоб продовжити користуватися домашнім сервером %1$s Вам слід ознайомитись та прийняти Умови використання. Ознайомитись зараз @@ -1081,11 +1081,11 @@ Надсилати сповіщення про набір повідомлення Дозволити іншим користувачам бачити коли Ви набираєте повідомлення. Форматування Markdown - Форматувати повідомлення з використанням синтаксису Markdown перед відправкою. Це дає можливість розгорнутого форматування, такого як використання зірочок для відображення курсивного тексту. + Форматувати повідомлення з використанням синтаксису Markdown перед надсиланням. Це дає можливість розгорнутого форматування, як-от використання зірочок для показу курсивного тексту. Показувати підтвердження прочитання Натискати на підтвердження прочитання для детального переліку. Показувати події приєднання та виходу - Це не стосується запрошень, копняків та блокувань. + Це не стосується запрошень, викидань і блокувань. Показувати події облікових записів Містить зміни аватарів та імен. Пароль @@ -1104,16 +1104,16 @@ Запуск сервісу Резервна копія ключа Використати резервну копію ключа - Тут з\'явиться список ваших прямих бесід. Торкніться + внизу праворуч щоб почати бесіду. + Тут з\'явиться список бесід з вашими особистими повідомленнями. Торкніться + внизу праворуч щоб розпочати бесіду. Повідомлення видалено - Прямі чати - Прямі чати - Відправити нове пряме повідомлення + Особисті повідомлення + Особисті повідомлення + Надіслати нове особисте повідомлення Додає ¯\\_(ツ)_/¯ перед текстовим повідомленням ${app_name} не підтримує повідомлення типу \'%1$s\' Надсилає повідомлення розмальоване веселково Редактор повідомлень - Відправляє повідомлення як текст без інтерпретації його як Markdown + Надсилає повідомлення як текст без інтерпретації його як Markdown Повідомлення… Ви не маєте доступу до цього повідомлення Очікуємо повідомлення, це може тривати певний час @@ -1150,8 +1150,8 @@ Перервати Готово Пропустити - Не вдалося видалити знадіб - Не вдалося додати знадіб + Не вдалося видалити віджет + Не вдалося додати віджет Ви не можете здійснити дзвінок із самим собою Почати аудіо-зустріч Почати відеозустріч @@ -1181,7 +1181,7 @@ Аудіо Створити нову кімнату Кімнати - Пошук в зашифрованих кімнатах не підтримується на даний момент. + Пошук у зашифрованих кімнатах не наразі не підтримується. Запитувати підтвердження перед початком виклику Запобігати випадковим викликам Мені не потрібні мої зашифровані повідомлення @@ -1189,14 +1189,14 @@ Помилка SSL. Ви не можете здійснити дзвінок із самим собою, дочекайтесь, доки інші учасники приймуть ваше запрошення ФАЙЛИ - В цій кімнаті немає медіа + У цій кімнаті немає медіа МЕДІА Завантаження Підтримується тільки в зашифрованих кімнатах Інші кімнати Нова кімната Створити нову кімнату - Запропонувати + Надати пропозицію Режим розробника Додаткові налаштування Розширені налаштування сповіщень @@ -1233,11 +1233,11 @@ Опишіть вашу пропозицію тут Залиште вашу пропозицію внизу. Показувати видалені повідомлення - Натискання Enter на програмній клавіатурі буде відправляти повідомлення замість додавання переносу рядку - Відправляти повідомлення натисканням Enter + Натискання Enter на програмній клавіатурі надсилатиме повідомлення замість додавання перенесення рядка + Надсилати повідомлення натисканням Enter Налаштування кімнати - Дізнатись більше - В цій кімнаті немає файлів + Докладніше + У цій кімнаті немає файлів %1$s о %2$s Жодного номера телефону не додано до вашого облікового запису У ваш обліковий запис не додано жодної електронної адреси @@ -1290,7 +1290,7 @@ Довідка та опис Налаштування Виберіть колір світлодіода, вібрацію, звук… - Налаштування приглушених сповіщень + Налаштування тихих сповіщень Налаштування сповіщень викликів Налаштування гучних сповіщень Початкова синхронізація… @@ -1317,9 +1317,9 @@ Доступне оновлення шифрування Довершити налаштування безпеки Інше - Дізнатись більше + Докладніше Безпека - Безпека та приватність + Безпека й приватність Ми раді повідомити вас, що ми змінили назву! Ваш застосунок оновлено й ви увійшли у свій обліковий запис. Зміну параля ще не завершено. \n @@ -1359,7 +1359,7 @@ \nДля максимальної безпеки він повинен відрізнятися від пароля вашого облікового запису. Захистіть свою резервну копію за допомогою парольної фрази. Експорт ключів вручну - Почніть використовувати резервне копіювання ключів + Почати використовувати резервне копіювання ключів Повідомлення в зашифрованих кімнатах захищено наскрізним шифруванням. Тільки ви та одержувачі маєте ключі для читання цих повідомлень. \n \nБезпечно створюйте резервні копії ключів, щоб не втратити їх. @@ -1384,7 +1384,7 @@ \nОстанні відвідини: %2$s \nЯкщо ви не ввійшли в інший сеанс, знехтуйте цим запитом. Для продовження потрібно прийняти Умови користування цією службою. - Немає активних знадобів + Немає активних віджетів Керувати інтеграціями Менеджер інтеграції не налаштовано. Читати медіа захищені DRM @@ -1392,25 +1392,25 @@ Використовувати камеру Заблокувати все Дозволити - Цей знадіб хоче використовувати такі ресурси: + Цей віджет хоче використовувати такі ресурси: На жаль, конференц-дзвінки з Jitsi не підтримуються на старих пристроях (пристрої з ОС Android нижче 6.0) Ідентифікатор кімнати - Ідентифікатор знадобу + Ідентифікатор віджета Ваша тема Ваш ідентифікатор користувача - URL-адреса зображення профілю - Ваше видиме ім\'я + URL-адреса аватара + Ваше показуване ім\'я Скасувати доступ для мене - Відкрити в браузері - Перезавантажити знадіб - Не вдалося завантажити знадіб. + Відкрити в переглядачі + Перезавантажити віджет + Не вдалося завантажити віджет. \n%s Використання може спричинити обмін даними з %s: За його використання може бути встановлено файли cookie та відбуватися обмін даними з %s: - Цей знадіб додав: - Завантажити знадіб - Знадіб - Активні знадоби + Цей віджет додав: + Завантажити віджет + Віджет + Активні віджети ПОДАННЯ %1$s: %2$s %3$s %1$s: %2$s @@ -1453,10 +1453,10 @@ Загальнодоступну назву сеансу бачать люди, з якими ви спілкуєтесь Загальнодоступна назва (видима людям, з якими спілкуєтесь) - %d заборонений користувач - %d заборонені користувачі - %d заборонених користувачів - %d заборонених користувачів + %d заблокований користувач + %d заблоковані користувачі + %d заблокованих користувачів + %d заблокованих користувачів Не вдалося отримати поточну видимість каталогу кімнат (%1$s). Опублікувати цю кімнату для всіх у каталозі кімнат %1$s\? @@ -1470,8 +1470,8 @@ Інших опублікованих адрес поки що немає. Інших опублікованих адрес поки що немає, додайте якусь внизу. Опублікувати цю кімнату для всіх у каталозі кімнат %1$s\? - Видалити адресу \"%1$s\"\? - Скасувати публікацію адреси \"%1$s\"\? + Видалити адресу «%1$s»\? + Скасувати публікацію адреси «%1$s»\? Опублікувати Опублікувати нову адресу вручну Інші опубліковані адреси: @@ -1480,7 +1480,7 @@ Загальнодоступні адреси може використовувати будь-хто на будь-якому сервері для приєднання до вашої кімнати. Щоб опублікувати адресу спочатку встановіть її локальною адресою. Загальнодоступні адреси Адреси кімнат - Перегляньте адреси цієї кімнати та керовані ними, а також їх видимість у каталозі кімнати. + Перегляньте та керуйте адресами цієї кімнати та їхньою видимістю у каталозі кімнат. Адреси кімнат Доступ до кімнати Зміни щодо тих, хто може читати історію, стосуватимуться лише майбутніх повідомлень у цій кімнаті. Видимість наявної історії залишиться незмінною. @@ -1496,7 +1496,7 @@ Пароль не дійсний Оновити пароль Під час підтвердження вашої адреси електронної пошти сталася помилка. - Увімкніть для цього параметр \"Дозволити інтеграцію\" у налаштуваннях. + Увімкніть для цього параметр «Дозволити інтеграції» у налаштуваннях. Інтеграцію вимкнено Керування інтеграцією Дозволити інтеграції @@ -1507,17 +1507,17 @@ Фонове з’єднання Це замінить ваш поточний ключ або фразу. Створіть новий ключ безпеки або встановіть нову фразу безпеки для наявної резервної копії. - Захистіться від втрати доступу до зашифрованих повідомлень та даних створенням резервної копії ключів шифрування на своєму сервері. + Захистіться від втрати доступу до зашифрованих повідомлень і даних створенням резервної копії ключів шифрування на своєму сервері. Налаштувати на цьому пристрої Скинути безпечне резервне копіювання Налаштувати безпечне резервне копіювання Керувати Безпечне резервне копіювання - Включає події запрошення/приєднання/виходу/видалення/заборони та зміни зображень профілю/видимих імен. + Включає події запрошення/приєднання/виходу/викидання/блокування та зміни аватарів/показуваних імен. Показати стан подій учасників кімнати Керування криптографічними ключами - Використовуйте менеджер інтеграції для керування ботами, мостами, знадобами та пакунками наліпок. -\nМенеджери інтеграції отримують дані конфігурації та можуть змінювати знадоби, надсилати запрошення до кімнати та надавати права від вашого імені. + Використовуйте менеджер інтеграції для керування ботами, мостами, віджетами та пакунками наліпок. +\nМенеджери інтеграції отримують дані конфігурації та можуть змінювати віджети, надсилати запрошення до кімнати та надавати права від вашого імені. Інтеграції %d секунда @@ -1601,7 +1601,7 @@ Потрібна автентифікація Це неможливо зробити за допомогою ${app_name} mobile Підтвердити пароль - Фільтрувати заборонених користувачів + Фільтрувати заблокованих користувачів Скасування блокування користувача дозволить їм знову приєднатися до кімнати. Розблокувати користувача Причина блокування @@ -1639,8 +1639,8 @@ Номер телефону Без звуку Лише згадки - Всі повідомлення - Всі повідомлення (гучно) + Усі повідомлення + Усі повідомлення (гучно) Нехтувати користувача Не нехтувати Підпис @@ -1649,7 +1649,7 @@ Налаштувати безпечне резервне копіювання Використати ключ безпеки Налаштувати - Захистіться від втрати доступу до зашифрованих повідомлень та даних створенням резервної копії ключів шифрування на своєму сервері. + Захистіться від втрати доступу до зашифрованих повідомлень і даних створенням резервної копії ключів шифрування на своєму сервері. Новий пароль Увага! Адреса @@ -1700,7 +1700,7 @@ Повідомлення в цій кімнаті не захищено наскрізним шифруванням. Повідомлення тут не захищено наскрізним шифруванням. Увімкнути наскрізне шифрування… - Повідомлення в цій кімнаті наскрізно зашифровані. + Повідомлення в цій кімнаті захищені наскрізним шифруванням. Звірити цей сеанс Перевірте цей сеанс, підтвердивши, що на екрані партнера з’являються такі цифри Перевірте цей сеанс, підтвердивши, що на екрані партнера з’являються ці емоджі @@ -1743,7 +1743,7 @@ Більше ДОКЛАДНІШЕ - Повідомлення в цій кімнаті захищені наскрізним шифруванням. Дізнайтеся більше та підтвердьте користувачів у їхньому профілі. + Повідомлення в цій кімнаті захищені наскрізним шифруванням. Дізнайтеся більше та підтвердіть користувачів у їхньому профілі. Змінювати тему Оновлювати кімнату Надсилати події m.room.server_acl @@ -1753,7 +1753,7 @@ Вмикати шифрування кімнати Змінювати основну адресу кімнати Змінювати аватар кімнати - Змінювати знадоби + Змінити віджети Сповіщати всіх Вилучати повідомлення, надіслані іншими Блокувати користувачів @@ -1781,7 +1781,7 @@ Ви вийшли Вилучити… Наліпка - Використовувати ботів, мости, знадоби та пакунки наліпок + Використовувати ботів, мости, віджети та пакунки наліпок Зв\'язок із сервером втрачено Не знайдено жодної правки Історія правок @@ -1875,11 +1875,11 @@ Ви викинули %1$s. Причина: %2$s %1$s викидає %2$s. Причина: %3$s Ви берете участь в цьому виклику зараз - Це початок вашої історії листування з %s. - Повідомлення тут є наскрізно зашифрованими. + Це початок історії вашого особистого спілкування з %s. + Повідомлення тут захищені наскрізним шифруванням. \n \nВаші повідомлення захищені замками, тож лише ви та отримувачі мають унікальні ключі для їхнього відмикання. - Повідомлення тут є наскрізно зашифрованими. + Повідомлення тут захищені наскрізним шифруванням. \n \nВаші повідомлення захищені замками, тож лише ви та отримувачі мають унікальні ключі для їхнього відмикання. Це початок %s. @@ -1904,12 +1904,12 @@ %1$d призупинених викликів %1$d призупинених викликів - Поточний виклик (%1$s) + Активний виклик (%1$s) - 1 поточний виклик (%1$s) · 1 призупинений виклик - 1 поточний виклик (%1$s) · %2$d призупинені виклики - 1 поточний виклик (%1$s) · %2$d призупинених викликів - 1 поточний виклик (%1$s) · %2$d призупинених викликів + 1 активний виклик (%1$s) · 1 призупинений виклик + 1 активний виклик (%1$s) · %2$d призупинені виклики + 1 активний виклик (%1$s) · %2$d призупинених викликів + 1 активний виклик (%1$s) · %2$d призупинених викликів Змінити мережу Змінити @@ -2065,7 +2065,7 @@ Після увімкнення, шифрування не може бути вимкнено. Надсилає емоджі розмальоване веселково Недавні кімнати - Безпосереднє повідомлення + Особисте повідомлення Не типовий (%1$d) у %2$s Не типовий %1$s з %2$s до %3$s @@ -2086,4 +2086,353 @@ Адміністратор у %1$s Користувачі Запрошення + Керування резервним копіюванням ключів + Нові захищені ключі повідомлень + Використати резервну копію ключа + Безпечне резервне копіювання + Почати використовувати резервне копіювання ключів + Ніколи не втрачайте зашифровані повідомлення + Ніколи не втрачайте зашифровані повідомлення + Так, це я + Нова резервна копія ключа + Видалити резервні копії ключів шифрування з сервера\? Ви більше не зможете використовувати ключ відновлення для читання зашифрованої історії повідомлень. + Щоб використовувати резервну копії ключів у цьому сеансі, відновіть її за допомогою парольної фрази або ключа відновлення зараз. + Не вдалося отримати інформацію про довіру для резервної копії (%s). + Резервна копія має чинний підпис цього сеансу. + Резервна копія містить підпис невідомого сеансу з ID %s. + Для цього сеансу не створюється резервна копія ваших ключів. + Резервне копіювання ключів не активне у цьому сеансі. + Резервну копію ключів було правильно налаштовано для цього сеансу. + Захистіться від втрати доступу до зашифрованих повідомлень і даних + Налаштувати безпечне резервне копіювання + Безпечне резервне копіювання + Простори — це новий спосіб згуртувати кімнати та людей. + Простори — це новий спосіб згуртувати кімнати та людей + Надіслати відгук + Можете зв’язатися зі мною, якщо у вас виникнуть додаткові запитання + Лише запрошені, найкраще для себе та команд + Спілкуйтеся з людьми безпосередньо або в групах + Налаштування сповіщень + Перевірка стану резервного копіювання + Не вдалося видалити резервну копію (%s) + Видалення резервної копії… + Видалити резервну копію + Видалити резервну копію + Відновити з резервної копії + Шифрування сеансу не активовано + Не вдалося отримати останню версію ключів відновлення (%s). + + До цього сеансу додано %d новий ключ. + До цього сеансу додано %d нові ключі. + До цього сеансу додано %d нових ключів. + До цього сеансу додано %d нових ключів. + + + Відновлено резервну копію з %d ключем. + Відновлено резервну копію з %d ключами. + Відновлено резервну копію з %d ключами. + Відновлено резервну копію з %d ключами. + + Резервну копію відновлено %s! + Не вдалося розшифрувати резервну копію за допомогою цього ключа відновлення: переконайтеся, що ви ввели правильний ключ відновлення. + • Сервери з відповідними літералам IP тепер заблоковано. + • Відповідні сервери %s було вилучено зі списку блокування. + • Відповідні сервери %s тепер заблоковано. + • Сервери, що з відповідними літералам IP заблоковано. + • Відповідні сервери %s заблоковано. + Неможливо відкрити кімнату, у якій вас заблоковано. + Опублікувати цю кімнату в каталозі кімнат + Каталог кімнат + Переглянути каталог кімнат + Створення кімнати… + Створення кімнати… + Адміністратор вашого сервера вимкнув автоматичне наскрізне шифрування для приватних кімнат та особистих повідомлень. + %s у налаштуваннях, щоб отримувати запрошення безпосередньо в Element. + Зашифровані особисті повідомлення + Особисті повідомлення + Введіть ключ відновлення + Введіть ключ відновлення + Імпортування ключів… + Завантаження ключів… + Обчислення ключа відновлення… + Відновлення резервної копії: + Помилка мережі: перевірте з’єднання та повторіть спробу. + Втратили ключ відновлення\? Ви можете налаштувати новий у налаштуваннях. + Відновлення повідомлень + Введіть ключ відновлення + Використайте ключ відновлення, щоб розблокувати історію зашифрованих повідомлень + використайте свій ключ відновлення + Отримання резервної версії… + Перепрошуємо, під час спроби приєднатися до конференції сталася помилка + Цей сервер уже є у списку + Не вдалося знайти цей сервер або його список кімнат + Введіть назву нового сервера, який потрібно дослідити. + Додати новий сервер + Ваш сервер + Інші простори чи кімнати, про які ви могли б не знати + Ви знаєте простір, що містить цю кімнату + Визначте, хто може знайти та приєднатися до цієї кімнати. + Визначте, з яких просторів можна отримати доступ до цієї кімнати. Якщо вибрано простір, його учасники зможуть знайти та приєднатися до вказаної кімнати. + Простори з доступом + Дозволити учасникам простору знаходити та отримувати доступ. + Учасники Простору %s можуть знаходити, переглядати та приєднуватися. + Будь-хто у просторі з цією кімнатою може знайти та приєднатися до неї. Додати учасників до простору можуть лише адміністратори цієї кімнати. + Лише учасники простору + Кожен може знайти кімнату та приєднатися + Налаштування кімнати + Відкритий для всіх, найкраще для спільнот + Кімнати + Загальнодоступна + Загальнодоступний + Загальнодоступна + Лише запрошені люди можуть знайти та приєднатися + Приватна (лише за запрошенням) + Приватна + Приватний + Невідоме налаштування доступу (%s) + Будь-хто може попроситися до кімнати, учасники можуть прийняти або відхилити + Вітаємо в %1$s, %2$s. + Все одно приєднатися + Створити Простір + Приєднатися до Простору + Поділитися посиланням + Запросити за користувацьким іменем + Запросити електронним листом + Проведіть пальцем, щоб скасувати + Розпочати голосове повідомлення + Розпочато груповий виклик + Ви впевнені, що хочете залишити простір\? + Залишити простір + Керувати кімнатами + %s запрошує вас + Вас запрошено + Вітаємо у Просторах! + Додати кімнати + Додати кімнати + Запросити до %s + Запросити до %s + Запросити людей + Запрошуйте людей до свого простору + Опис + Створення простору… + Ваш приватний простір + Ваш загальнодоступний простір + Додати простір + Приватний простір + Видалити не надіслані повідомлення + Бажаєте скасувати надсилання повідомлення\? + Видалити повідомлення, які не вдалося надіслати + Не вдалося + Надіслано + Надсилання + Подію надіслано! + Інструменти розробника + Версія кімнати + Торкніться, щоб редагувати простори + Вибрати простори + Додати кнопку до редактора повідомлень, щоб відкрити клавіатуру емоджі + Показати клавіатуру емоджі + Скористайтеся командою /confetti або надсилайте повідомлення, що містить ❄️ або 🎉 + Показувати ефекти бесіди + Загальнодоступний простір + Загальнодоступний простір + Загальнодоступна кімната + Не сповіщати + Сповіщати без звуку + Сповіщати зі звуком + Повідомлення не надіслано через помилку + Закрити панель емоджі + Відкрити панель емоджі + Типовий рівень довіри + Вибрано + Відео + має не надіслану чернетку + Деякі повідомлення не було надіслано + Щоб допомогти учасникам простору знайти та приєднатися до приватної кімнати, перейдіть до її налаштувань, торкнувшись аватара. + Видалити аватар + Установити аватар + Змінити аватар + Зображення + Імпортувати ключі з файлу + Знімок екрана + Проведіть пальцем, щоб завершити виклик + Невідома особа + Переадресувати на %1$s + %1$s торкніться, щоб повернутися + Активний виклик (%1$s) · + + Активний виклик · + %1$d активні виклики · + %1$d активних викликів · + %1$d активних викликів · + + Пропущений відеовиклик + Пропущений голосовий виклик + Відеовиклик відхилено + Голосовий виклик відхилено + Відеовиклик завершено • %1$s + Голосовий виклик завершено • %1$s + Ви не отримуватимете сповіщення про згадки та ключові слова в зашифрованих кімнатах на мобільних пристроях. + Оновлення кімнати + Повідомлення бота + Запрошення до кімнати + Ключові слова + \@room + Зашифровані групові повідомлення + Групові повідомлення + Моє користувацьке ім\'я + Моє показуване ім\'я + Повідомлення, які містять @room + Коли кімнати оновлено + Зашифровані повідомлення в групових бесідах + Зашифровані повідомлення в індивідуальних бесідах + Ключові слова не можуть містити «%s» + Ключові слова не можуть починатися з «.» + Додати нове ключове слово + Ваші ключові слова + Активний голосовий виклик + Активний відеовиклик + Вхідний відеовиклик + Вхідний голосовий виклик + Переглянути й керувати адресами цього простору. + Адреси просторів + Дозволити гостям приєднуватися + Налаштування облікового запису + Ви можете керувати сповіщеннями у %1$s. + Зауважте, що згадки та сповіщення про ключові слова недоступні в зашифрованих кімнатах на мобільних пристроях. + Сповіщати мене про + Сповіщати мене про + Інше + Згадки та ключові слова + Типові сповіщення + Жодного + Лише згадки та ключові слова + Усе одно продовжити + Не відповідає + Не відповідає + Користувач, якого ви викликали, зайнятий. + Користувач зайнятий + Аудіовиклик з %s + Відеовиклик з %s + + Пропущений відеовиклик + %d пропущені відеовиклики + %d пропущених відеовикликів + %d пропущених відеовикликів + + + Пропущено аудіовиклик + %d пропущених аудіовиклики + %d пропущених аудіовикликів + %d пропущених аудіовикликів + + Викликається… + Не авторизовано, відсутні дійсні облікові дані для автентифікації + Застосувати типовим і більше не запитувати + Завжди запитувати + URL-адреса API домашнього сервера + Показати всі кімнати в каталозі кімнат, включно з кімнатами з делікатним вмістом. + Показати кімнати з делікатним вмістом + Каталог кімнат + Пропоновані кімнати + Нове значення + Повернутись + Перемкнути + Відсутні дозволи + Щоб виконати цю дію, надайте дозвіл камери у налаштуваннях системи. + Щоб надсилати голосові повідомлення, надайте дозвіл на мікрофон. + Бракує деяких дозволів для виконання цієї дії. Будь ласка, надайте дозволи у налаштуваннях системи. + Простори + Простори + Докладніше + Системна + Ви увімкнули наскрізне шифрування (нерозпізнаний алгоритм %1$s). + %1$s вмикає наскрізне шифрування (нерозпізнаний алгоритм %2$s). + Ви увімкнули наскрізне шифрування. + %1$s вмикає наскрізне шифрування. + Ви заборонили гостям приєднуватися до кімнати. + %1$s забороняє гостям приєднуватися до кімнати. + Ви заборонили гостям приєднуватися до кімнати. + %1$s забороняє гостям приєднуватися до кімнати. + Ви дозволили гостям приєднуватися сюди. + %1$s дозволяє гостям приєднуватися сюди. + Ви дозволили гостям приєднуватися до кімнати. + %1$s дозволяє гостям приєднуватися до кімнати. + %1$s змінює адреси для цієї кімнати. + %1$s змінює основну й альтернативні адреси для цієї кімнати. + %1$s змінює альтернативні адреси для цієї кімнати. + + Ви вилучили альтернативну адресу %1$s для цієї кімнати. + Ви вилучили альтернативні адреси %1$s для цієї кімнати. + Ви вилучили альтернативні адреси %1$s для цієї кімнати. + Ви вилучили альтернативні адреси %1$s для цієї кімнати. + + + %1$s вилучає альтернативну адресу %2$s для цієї кімнати. + %1$s вилучає альтернативні адреси %2$s для цієї кімнати. + %1$s вилучає альтернативні адреси %2$s для цієї кімнати. + %1$s вилучає альтернативні адреси %2$s для цієї кімнати. + + + Ви додаєте альтернативну адресу %1$s для цієї кімнати. + Ви додаєте альтернативні адреси %1$s для цієї кімнати. + Ви додаєте альтернативні адреси %1$s для цієї кімнати. + Ви додаєте альтернативні адреси %1$s для цієї кімнати. + + + %1$s додає альтернативну адресу %2$s для цієї кімнати. + %1$s додає альтернативні адреси %2$s для цієї кімнати. + %1$s додає альтернативні адреси %2$s для цієї кімнати. + %1$s додає альтернативні адреси %2$s для цієї кімнати. + + Ви вилучили основну адресу цієї кімнати. + %1$s вилучає основну адресу цієї кімнати. + Ви встановили %1$s основною адресою цієї кімнати. + %1$s встановлює %2$s основною адресою цієї кімнати. + Ви додали %1$s й вилучили адреси цієї кімнати %2$s. + %1$s додає %2$s й вилучає адреси цієї кімнати %3$s. + + Ви вилучили адресу кімнати %1$s. + Ви вилучили адреси кімнати %1$s. + Ви вилучили адреси кімнати %1$s. + Ви вилучили адреси кімнати %1$s. + + + %1$s вилучає адресу кімнати %2$s. + %1$s вилучає адреси кімнати %2$s. + %1$s вилучає адреси кімнати %2$s. + %1$s вилучає адреси кімнати %2$s. + + + Ви додали %1$s адресою кімнати. + Ви додали %1$s адресами кімнати. + Ви додали %1$s адресами кімнати. + Ви додали %1$s адресами кімнати. + + + %1$s додає %2$s адресою кімнати. + %1$s додає %2$s адресами кімнати. + %1$s додає %2$s адресами кімнати. + %1$s додає %2$s адресами кімнати. + + Ви відкликали запрошення для %1$s. Причина: %2$s + %1$s відкликає запрошення для %2$s. Причина: %3$s + Повідомлення надіслано + Ви відкликали запрошення для %1$s + %1$s відкликає запрошення для %2$s + Ви відкликали запрошення приєднатися до кімнати для %1$s + %1$s відкликає запрошення приєднатися до кімнати для %2$s + Ви подали запит на конференцію VoIP + 🎉 Усім серверам заборонено долучатися! Цією кімнатою більше не можна користуватися. + Без змін. + • Сервери з відповідними літералам IP тепер дозволено. + • Відповідні сервери %s було вилучено зі списку дозволених. + • Відповідні сервери %s тепер дозволено. + Відкрити віджети + %s змінює ACL сервера для цієї кімнати. + Завершення виклику… + • Сервери, що з відповідними літералам IP дозволено. + • Відповідні сервери %s дозволено. + Ви встановили ACL сервера для цієї кімнати. + %s встановлює ACL сервера для цієї кімнати. \ No newline at end of file From ce5a45ea31cbd7027d0744f22b3bcd8aa3a2e811 Mon Sep 17 00:00:00 2001 From: strix aluco Date: Tue, 7 Sep 2021 12:03:17 +0000 Subject: [PATCH 041/350] Translated using Weblate (Ukrainian) Currently translated at 78.6% (2056 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 2c66484c84c..87b3e6f4d84 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -1613,7 +1613,7 @@ Викинути користувача Ви впевнені, що бажаєте скасувати запрошення для цього користувача\? Скасувати запрошення - Зняття ігнорування з цього користувача знову покаже всі повідомлення від нього. + Рознехтування цього користувача знову покаже всі повідомлення від нього. Рознехтувати користувача Нехтування цього користувача призведе до видалення його повідомлень з усіх кімнат, де ви обидва є учасниками. \n From a139eb71e1ed62324367c3888215cb2fdf2efea7 Mon Sep 17 00:00:00 2001 From: Ihor Hordiichuk Date: Tue, 7 Sep 2021 12:02:30 +0000 Subject: [PATCH 042/350] Translated using Weblate (Ukrainian) Currently translated at 78.6% (2056 of 2615 strings) Translation: Element Android/Element Android App Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/ --- vector/src/main/res/values-uk/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vector/src/main/res/values-uk/strings.xml b/vector/src/main/res/values-uk/strings.xml index 87b3e6f4d84..fddab55ca32 100644 --- a/vector/src/main/res/values-uk/strings.xml +++ b/vector/src/main/res/values-uk/strings.xml @@ -445,7 +445,7 @@ Зробити модератором Зробити адміністратором Нехтувати - Рознехтувати + Не нехтувати ID користувача, ім\'я або email Згадати Показати Список Пристроїв From 99123bf0cc72b9c9da82af45da431c8d2c0323a5 Mon Sep 17 00:00:00 2001 From: Valere Date: Tue, 7 Sep 2021 14:10:22 +0200 Subject: [PATCH 043/350] Add invite by email screen in create space flow --- changelog.d/3678.feature | 1 + changelog.d/3945.bugfix | 1 + .../im/vector/app/core/di/FragmentModule.kt | 6 + .../features/spaces/SpaceCreationActivity.kt | 5 + .../spaces/create/BetaWarningBottomSheet.kt | 46 ------- .../create/ChoosePrivateSpaceTypeFragment.kt | 10 +- .../spaces/create/CreateSpaceAction.kt | 2 + .../CreateSpaceAdd3pidInvitesFragment.kt | 86 ++++++++++++ .../spaces/create/CreateSpaceEvents.kt | 1 + .../spaces/create/CreateSpaceState.kt | 8 +- .../spaces/create/CreateSpaceViewModel.kt | 126 +++++++++++++++--- .../spaces/create/CreateSpaceViewModelTask.kt | 37 +++-- .../create/SpaceAdd3pidEpoxyController.kt | 99 ++++++++++++++ ...tom_sheet_space_create_private_warning.xml | 46 ------- vector/src/main/res/values/strings.xml | 7 + 15 files changed, 348 insertions(+), 133 deletions(-) create mode 100644 changelog.d/3678.feature create mode 100644 changelog.d/3945.bugfix delete mode 100644 vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt create mode 100644 vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAdd3pidInvitesFragment.kt create mode 100644 vector/src/main/java/im/vector/app/features/spaces/create/SpaceAdd3pidEpoxyController.kt delete mode 100644 vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml diff --git a/changelog.d/3678.feature b/changelog.d/3678.feature new file mode 100644 index 00000000000..7889cafd7d7 --- /dev/null +++ b/changelog.d/3678.feature @@ -0,0 +1 @@ +Spaces | M3.23 Invite by email in create private space flow \ No newline at end of file diff --git a/changelog.d/3945.bugfix b/changelog.d/3945.bugfix new file mode 100644 index 00000000000..caedcc9cba2 --- /dev/null +++ b/changelog.d/3945.bugfix @@ -0,0 +1 @@ +Remove the "Teammate spaces aren't quite ready" bottom sheet \ No newline at end of file diff --git a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt index 6b42f1e428a..ede5a8d5f31 100644 --- a/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt +++ b/vector/src/main/java/im/vector/app/core/di/FragmentModule.kt @@ -142,6 +142,7 @@ import im.vector.app.features.signout.soft.SoftLogoutFragment import im.vector.app.features.spaces.SpaceListFragment import im.vector.app.features.spaces.create.ChoosePrivateSpaceTypeFragment import im.vector.app.features.spaces.create.ChooseSpaceTypeFragment +import im.vector.app.features.spaces.create.CreateSpaceAdd3pidInvitesFragment import im.vector.app.features.spaces.create.CreateSpaceDefaultRoomsFragment import im.vector.app.features.spaces.create.CreateSpaceDetailsFragment import im.vector.app.features.spaces.explore.SpaceDirectoryFragment @@ -793,6 +794,11 @@ interface FragmentModule { @FragmentKey(ChoosePrivateSpaceTypeFragment::class) fun bindChoosePrivateSpaceTypeFragment(fragment: ChoosePrivateSpaceTypeFragment): Fragment + @Binds + @IntoMap + @FragmentKey(CreateSpaceAdd3pidInvitesFragment::class) + fun bindCreateSpaceAdd3pidInvitesFragment(fragment: CreateSpaceAdd3pidInvitesFragment): Fragment + @Binds @IntoMap @FragmentKey(SpaceAddRoomFragment::class) diff --git a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt index a02755a1551..1aae661d51a 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/SpaceCreationActivity.kt @@ -31,6 +31,7 @@ import im.vector.app.core.platform.SimpleFragmentActivity import im.vector.app.features.spaces.create.ChoosePrivateSpaceTypeFragment import im.vector.app.features.spaces.create.ChooseSpaceTypeFragment import im.vector.app.features.spaces.create.CreateSpaceAction +import im.vector.app.features.spaces.create.CreateSpaceAdd3pidInvitesFragment import im.vector.app.features.spaces.create.CreateSpaceDefaultRoomsFragment import im.vector.app.features.spaces.create.CreateSpaceDetailsFragment import im.vector.app.features.spaces.create.CreateSpaceEvents @@ -92,6 +93,9 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac CreateSpaceEvents.NavigateToAddRooms -> { navigateToFragment(CreateSpaceDefaultRoomsFragment::class.java) } + CreateSpaceEvents.NavigateToAdd3Pid -> { + navigateToFragment(CreateSpaceAdd3pidInvitesFragment::class.java) + } CreateSpaceEvents.NavigateToChoosePrivateType -> { navigateToFragment(ChoosePrivateSpaceTypeFragment::class.java) } @@ -143,6 +147,7 @@ class SpaceCreationActivity : SimpleFragmentActivity(), CreateSpaceViewModel.Fac if (state.spaceType == SpaceType.Public) R.string.your_public_space else R.string.your_private_space } + CreateSpaceState.Step.AddEmailsOrInvites, CreateSpaceState.Step.ChoosePrivateType -> R.string.your_private_space } supportActionBar?.let { diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt b/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt deleted file mode 100644 index fc3d98e6b86..00000000000 --- a/vector/src/main/java/im/vector/app/features/spaces/create/BetaWarningBottomSheet.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2021 New Vector Ltd - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package im.vector.app.features.spaces.create - -import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.fragment.app.setFragmentResult -import im.vector.app.core.platform.VectorBaseBottomSheetDialogFragment -import im.vector.app.databinding.BottomSheetSpaceCreatePrivateWarningBinding - -class BetaWarningBottomSheet : VectorBaseBottomSheetDialogFragment() { - - override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = - BottomSheetSpaceCreatePrivateWarningBinding.inflate(inflater, container, false) - - override val showExpanded = true - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - - views.continueButton.debouncedClicks { - setFragmentResult(REQUEST_KEY, Bundle.EMPTY) - dismiss() - } - } - - companion object { - const val REQUEST_KEY = "BetaWarningBottomSheet" - } -} diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt index 4031b56c1d8..4f079551eb9 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/ChoosePrivateSpaceTypeFragment.kt @@ -20,7 +20,6 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.fragment.app.setFragmentResultListener import com.airbnb.mvrx.activityViewModel import im.vector.app.R import im.vector.app.core.epoxy.onClick @@ -39,13 +38,6 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor( override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = FragmentSpaceCreateChoosePrivateModelBinding.inflate(layoutInflater, container, false) - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setFragmentResultListener(BetaWarningBottomSheet.REQUEST_KEY) { _, _ -> - sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates)) - } - } - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) @@ -54,7 +46,7 @@ class ChoosePrivateSpaceTypeFragment @Inject constructor( } views.teammatesButton.onClick { - BetaWarningBottomSheet().show(parentFragmentManager, "warning") + sharedViewModel.handle(CreateSpaceAction.SetSpaceTopology(SpaceTopology.MeAndTeammates)) } sharedViewModel.subscribe { state -> diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt index 1f0ed6428fb..e2eaa5784fd 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAction.kt @@ -28,6 +28,8 @@ sealed class CreateSpaceAction : VectorViewModelAction { object OnBackPressed : CreateSpaceAction() object NextFromDetails : CreateSpaceAction() object NextFromDefaultRooms : CreateSpaceAction() + object NextFromAdd3pid : CreateSpaceAction() data class DefaultRoomNameChanged(val index: Int, val name: String) : CreateSpaceAction() + data class DefaultInvite3pidChanged(val index: Int, val email: String) : CreateSpaceAction() data class SetSpaceTopology(val topology: SpaceTopology) : CreateSpaceAction() } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAdd3pidInvitesFragment.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAdd3pidInvitesFragment.kt new file mode 100644 index 00000000000..98b04dde7c4 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceAdd3pidInvitesFragment.kt @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.spaces.create + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import com.airbnb.mvrx.activityViewModel +import im.vector.app.R +import im.vector.app.core.extensions.configureWith +import im.vector.app.core.extensions.hideKeyboard +import im.vector.app.core.platform.OnBackPressed +import im.vector.app.core.platform.VectorBaseFragment +import im.vector.app.databinding.FragmentSpaceCreateGenericEpoxyFormBinding +import im.vector.app.features.settings.VectorSettingsActivity +import javax.inject.Inject + +class CreateSpaceAdd3pidInvitesFragment @Inject constructor( + private val epoxyController: SpaceAdd3pidEpoxyController +) : VectorBaseFragment(), + SpaceAdd3pidEpoxyController.Listener, + OnBackPressed { + + private val sharedViewModel: CreateSpaceViewModel by activityViewModel() + + override fun onBackPressed(toolbarButton: Boolean): Boolean { + sharedViewModel.handle(CreateSpaceAction.OnBackPressed) + return true + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + views.recyclerView.configureWith(epoxyController) + epoxyController.listener = this + + sharedViewModel.subscribe(this) { + invalidateState(it) + } + + views.nextButton.setText(R.string.next_pf) + views.nextButton.debouncedClicks { + view.hideKeyboard() + sharedViewModel.handle(CreateSpaceAction.NextFromAdd3pid) + } + } + + private fun invalidateState(it: CreateSpaceState) { + epoxyController.setData(it) + val noEmails = it.default3pidInvite?.all { it.value.isNullOrBlank() } ?: true + views.nextButton.text = if (noEmails) { + getString(R.string.skip_for_now) + } else { + getString(R.string.next_pf) + } + } + + override fun getBinding(inflater: LayoutInflater, container: ViewGroup?) = + FragmentSpaceCreateGenericEpoxyFormBinding.inflate(layoutInflater, container, false) + + override fun on3pidChange(index: Int, newName: String) { + sharedViewModel.handle(CreateSpaceAction.DefaultInvite3pidChanged(index, newName)) + } + + override fun onNoIdentityServer() { + navigator.openSettings( + requireContext(), + VectorSettingsActivity.EXTRA_DIRECT_ACCESS_DISCOVERY_SETTINGS + ) + } +} diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt index 073531353fa..eeb2ca30fff 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceEvents.kt @@ -22,6 +22,7 @@ sealed class CreateSpaceEvents : VectorViewEvents { object NavigateToDetails : CreateSpaceEvents() object NavigateToChooseType : CreateSpaceEvents() object NavigateToAddRooms : CreateSpaceEvents() + object NavigateToAdd3Pid : CreateSpaceEvents() object NavigateToChoosePrivateType : CreateSpaceEvents() object Dismiss : CreateSpaceEvents() data class FinishSuccess(val spaceId: String, val defaultRoomId: String?, val topology: SpaceTopology?) : CreateSpaceEvents() diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt index 39a69e837b6..6fb58532691 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceState.kt @@ -34,13 +34,17 @@ data class CreateSpaceState( val aliasVerificationTask: Async = Uninitialized, val nameInlineError: String? = null, val defaultRooms: Map? = null, - val creationResult: Async = Uninitialized + val default3pidInvite: Map? = null, + val emailValidationResult: Map? = null, + val creationResult: Async = Uninitialized, + val canInviteByMail: Boolean = false ) : MvRxState { enum class Step { ChooseType, SetDetails, AddRooms, - ChoosePrivateType + ChoosePrivateType, + AddEmailsOrInvites } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt index 2537a3a5926..b2334693836 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt @@ -31,6 +31,7 @@ import dagger.assisted.AssistedInject import im.vector.app.R import im.vector.app.core.error.ErrorFormatter import im.vector.app.core.extensions.exhaustive +import im.vector.app.core.extensions.isEmail import im.vector.app.core.platform.VectorViewModel import im.vector.app.core.resources.StringProvider import kotlinx.coroutines.Dispatchers @@ -38,6 +39,7 @@ import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.session.Session +import org.matrix.android.sdk.api.session.identity.IdentityServiceListener import org.matrix.android.sdk.api.session.room.AliasAvailabilityResult import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure @@ -49,12 +51,28 @@ class CreateSpaceViewModel @AssistedInject constructor( private val errorFormatter: ErrorFormatter ) : VectorViewModel(initialState) { + private val identityService = session.identityService() + + private val identityServerManagerListener = object : IdentityServiceListener { + override fun onIdentityServerChange() { + val identityServerUrl = identityService.getCurrentIdentityServerUrl() + setState { + copy( + canInviteByMail = identityServerUrl != null + ) + } + } + } + init { + val identityServerUrl = identityService.getCurrentIdentityServerUrl() setState { copy( - homeServerName = session.myUserId.getDomain() + homeServerName = session.myUserId.getDomain(), + canInviteByMail = identityServerUrl != null ) } + startListenToIdentityManager() } @AssistedFactory @@ -62,6 +80,19 @@ class CreateSpaceViewModel @AssistedInject constructor( fun create(initialState: CreateSpaceState): CreateSpaceViewModel } + private fun startListenToIdentityManager() { + identityService.addListener(identityServerManagerListener) + } + + private fun stopListenToIdentityManager() { + identityService.addListener(identityServerManagerListener) + } + + override fun onCleared() { + stopListenToIdentityManager() + super.onCleared() + } + companion object : MvRxViewModelFactory { override fun create(viewModelContext: ViewModelContext, state: CreateSpaceState): CreateSpaceViewModel? { @@ -84,7 +115,7 @@ class CreateSpaceViewModel @AssistedInject constructor( override fun handle(action: CreateSpaceAction) { when (action) { - is CreateSpaceAction.SetRoomType -> { + is CreateSpaceAction.SetRoomType -> { setState { copy( step = CreateSpaceState.Step.SetDetails, @@ -93,7 +124,7 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToDetails) } - is CreateSpaceAction.NameChanged -> { + is CreateSpaceAction.NameChanged -> { setState { if (aliasManuallyModified) { copy( @@ -113,14 +144,14 @@ class CreateSpaceViewModel @AssistedInject constructor( } } } - is CreateSpaceAction.TopicChanged -> { + is CreateSpaceAction.TopicChanged -> { setState { copy( topic = action.topic ) } } - is CreateSpaceAction.SpaceAliasChanged -> { + is CreateSpaceAction.SpaceAliasChanged -> { // This called only when the alias is change manually // not when programmatically changed via a change on name setState { @@ -131,28 +162,43 @@ class CreateSpaceViewModel @AssistedInject constructor( ) } } - CreateSpaceAction.OnBackPressed -> { + CreateSpaceAction.OnBackPressed -> { handleBackNavigation() } - CreateSpaceAction.NextFromDetails -> { + CreateSpaceAction.NextFromDetails -> { handleNextFromDetails() } - CreateSpaceAction.NextFromDefaultRooms -> { + CreateSpaceAction.NextFromDefaultRooms -> { handleNextFromDefaultRooms() } - is CreateSpaceAction.DefaultRoomNameChanged -> { + CreateSpaceAction.NextFromAdd3pid -> { + handleNextFrom3pid() + } + is CreateSpaceAction.DefaultRoomNameChanged -> { setState { copy( - defaultRooms = (defaultRooms ?: emptyMap()).toMutableMap().apply { + defaultRooms = defaultRooms.orEmpty().toMutableMap().apply { this[action.index] = action.name } ) } } - is CreateSpaceAction.SetAvatar -> { + is CreateSpaceAction.DefaultInvite3pidChanged -> { + setState { + copy( + default3pidInvite = default3pidInvite.orEmpty().toMutableMap().apply { + this[action.index] = action.email + }, + emailValidationResult = emailValidationResult.orEmpty().toMutableMap().apply { + this.remove(action.index) + } + ) + } + } + is CreateSpaceAction.SetAvatar -> { setState { copy(avatarUri = action.uri) } } - is CreateSpaceAction.SetSpaceTopology -> { + is CreateSpaceAction.SetSpaceTopology -> { handleSetTopology(action) } }.exhaustive @@ -173,20 +219,20 @@ class CreateSpaceViewModel @AssistedInject constructor( setState { copy( spaceTopology = SpaceTopology.MeAndTeammates, - step = CreateSpaceState.Step.AddRooms + step = CreateSpaceState.Step.AddEmailsOrInvites ) } - _viewEvents.post(CreateSpaceEvents.NavigateToAddRooms) + _viewEvents.post(CreateSpaceEvents.NavigateToAdd3Pid) } } } private fun handleBackNavigation() = withState { state -> when (state.step) { - CreateSpaceState.Step.ChooseType -> { + CreateSpaceState.Step.ChooseType -> { _viewEvents.post(CreateSpaceEvents.Dismiss) } - CreateSpaceState.Step.SetDetails -> { + CreateSpaceState.Step.SetDetails -> { setState { copy( step = CreateSpaceState.Step.ChooseType, @@ -196,15 +242,15 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToChooseType) } - CreateSpaceState.Step.AddRooms -> { + CreateSpaceState.Step.AddRooms -> { if (state.spaceType == SpaceType.Private && state.spaceTopology == SpaceTopology.MeAndTeammates) { setState { copy( spaceTopology = null, - step = CreateSpaceState.Step.ChoosePrivateType + step = CreateSpaceState.Step.AddEmailsOrInvites ) } - _viewEvents.post(CreateSpaceEvents.NavigateToChoosePrivateType) + _viewEvents.post(CreateSpaceEvents.NavigateToAdd3Pid) } else { setState { copy( @@ -214,7 +260,7 @@ class CreateSpaceViewModel @AssistedInject constructor( _viewEvents.post(CreateSpaceEvents.NavigateToDetails) } } - CreateSpaceState.Step.ChoosePrivateType -> { + CreateSpaceState.Step.ChoosePrivateType -> { setState { copy( step = CreateSpaceState.Step.SetDetails @@ -222,6 +268,36 @@ class CreateSpaceViewModel @AssistedInject constructor( } _viewEvents.post(CreateSpaceEvents.NavigateToDetails) } + CreateSpaceState.Step.AddEmailsOrInvites -> { + setState { + copy( + step = CreateSpaceState.Step.ChoosePrivateType + ) + } + _viewEvents.post(CreateSpaceEvents.NavigateToChoosePrivateType) + } + } + } + + private fun handleNextFrom3pid() = withState { state -> + // check if emails are valid + val emailValidation = state.default3pidInvite?.mapValues { + val email = it.value + email.isNullOrEmpty() || email.isEmail() + } + if (emailValidation?.all { it.value } != false) { + setState { + copy( + step = CreateSpaceState.Step.AddRooms + ) + } + _viewEvents.post(CreateSpaceEvents.NavigateToAddRooms) + } else { + setState { + copy( + emailValidationResult = emailValidation + ) + } } } @@ -296,8 +372,14 @@ class CreateSpaceViewModel @AssistedInject constructor( defaultRooms = state.defaultRooms ?.entries ?.sortedBy { it.key } - ?.mapNotNull { it.value } ?: emptyList(), - spaceAlias = alias + ?.mapNotNull { it.value } + .orEmpty(), + spaceAlias = alias, + defaultEmailToInvite = state.default3pidInvite + ?.values + ?.mapNotNull { it.takeIf { it?.isEmail() == true } } + ?.takeIf { state.spaceTopology == SpaceTopology.MeAndTeammates } + .orEmpty() ) ) when (result) { diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt index c68b8a0b9ba..41a85d3f308 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt @@ -25,12 +25,17 @@ import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities +import org.matrix.android.sdk.api.session.identity.ThreePid import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure +import org.matrix.android.sdk.api.session.room.model.GuestAccess +import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility +import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams import org.matrix.android.sdk.api.session.room.model.create.CreateRoomPreset import org.matrix.android.sdk.api.session.room.model.create.RestrictedRoomPreset +import org.matrix.android.sdk.api.session.space.CreateSpaceParams import timber.log.Timber import javax.inject.Inject @@ -49,7 +54,8 @@ data class CreateSpaceTaskParams( val spaceAvatar: Uri? = null, val spaceAlias: String? = null, val isPublic: Boolean, - val defaultRooms: List = emptyList() + val defaultRooms: List = emptyList(), + val defaultEmailToInvite: List = emptyList() ) class CreateSpaceViewModelTask @Inject constructor( @@ -60,13 +66,28 @@ class CreateSpaceViewModelTask @Inject constructor( override suspend fun execute(params: CreateSpaceTaskParams): CreateSpaceTaskResult { val spaceID = try { - session.spaceService().createSpace( - params.spaceName, - params.spaceTopic, - params.spaceAvatar, - params.isPublic, - params.spaceAlias - ) + session.spaceService().createSpace(CreateSpaceParams().apply { + this.name = params.spaceName + this.topic = params.spaceTopic + this.avatarUri = params.spaceAvatar + if (params.isPublic) { + this.roomAliasName = params.spaceAlias + this.powerLevelContentOverride = (powerLevelContentOverride ?: PowerLevelsContent()).copy( + invite = 0 + ) + this.preset = CreateRoomPreset.PRESET_PUBLIC_CHAT + this.historyVisibility = RoomHistoryVisibility.WORLD_READABLE + this.guestAccess = GuestAccess.CanJoin + } else { + this.preset = CreateRoomPreset.PRESET_PRIVATE_CHAT + visibility = RoomDirectoryVisibility.PRIVATE + this.invite3pids.addAll( + params.defaultEmailToInvite.map { + ThreePid.Email(it) + } + ) + } + }) } catch (failure: Throwable) { return CreateSpaceTaskResult.FailedToCreateSpace(failure) } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/SpaceAdd3pidEpoxyController.kt b/vector/src/main/java/im/vector/app/features/spaces/create/SpaceAdd3pidEpoxyController.kt new file mode 100644 index 00000000000..05d8a78b300 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/spaces/create/SpaceAdd3pidEpoxyController.kt @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.spaces.create + +import android.text.InputType +import com.airbnb.epoxy.TypedEpoxyController +import com.google.android.material.textfield.TextInputLayout +import im.vector.app.R +import im.vector.app.core.resources.ColorProvider +import im.vector.app.core.resources.StringProvider +import im.vector.app.core.ui.list.ItemStyle +import im.vector.app.core.ui.list.genericButtonItem +import im.vector.app.core.ui.list.genericFooterItem +import im.vector.app.core.ui.list.genericPillItem +import im.vector.app.features.form.formEditTextItem +import javax.inject.Inject + +class SpaceAdd3pidEpoxyController @Inject constructor( + private val stringProvider: StringProvider, + private val colorProvider: ColorProvider +) : TypedEpoxyController() { + + var listener: Listener? = null + + override fun buildModels(data: CreateSpaceState?) { + val host = this + data ?: return + genericFooterItem { + id("info_help_header") + style(ItemStyle.TITLE) + text(host.stringProvider.getString(R.string.create_spaces_invite_public_header)) + textColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_primary)) + } + genericFooterItem { + id("info_help_desc") + text(host.stringProvider.getString(R.string.create_spaces_invite_public_header_desc, data.name ?: "")) + textColor(host.colorProvider.getColorFromAttribute(R.attr.vctr_content_secondary)) + } + + if (data.canInviteByMail) { + buildEmailFields(data, host) + } else { + genericPillItem { + id("no_IDS") + imageRes(R.drawable.ic_baseline_perm_contact_calendar_24) + text(host.stringProvider.getString(R.string.create_space_identity_server_info_none)) + } + genericButtonItem { + id("Discover_Settings") + text(host.stringProvider.getString(R.string.open_discovery_settings)) + textColor(host.colorProvider.getColorFromAttribute(R.attr.colorPrimary)) + buttonClickAction { + host.listener?.onNoIdentityServer() + } + } + } + } + + private fun buildEmailFields(data: CreateSpaceState, host: SpaceAdd3pidEpoxyController) { + for (index in 0..2) { + val mail = data.default3pidInvite?.get(index) + formEditTextItem { + id("3pid$index") + enabled(true) + value(mail) + hint(host.stringProvider.getString(R.string.medium_email)) + inputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS) + endIconMode(TextInputLayout.END_ICON_CLEAR_TEXT) + errorMessage( + if (data.emailValidationResult?.get(index) == false) { + host.stringProvider.getString(R.string.does_not_look_like_valid_email) + } else null + ) + onTextChange { text -> + host.listener?.on3pidChange(index, text) + } + } + } + } + + interface Listener { + fun on3pidChange(index: Int, newName: String) + fun onNoIdentityServer() + } +} diff --git a/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml b/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml deleted file mode 100644 index 6e46c875486..00000000000 --- a/vector/src/main/res/layout/bottom_sheet_space_create_private_warning.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - -