Merge branch 'release/1.3.5' into main

This commit is contained in:
Benoit Marty 2021-10-25 12:39:11 +02:00
commit cabdec166f
25 changed files with 168 additions and 79 deletions

View file

@ -1,3 +1,15 @@
Changes in Element v1.3.5 (2021-10-25)
======================================
Bugfixes 🐛
----------
- Fixing malformed link pop up when tapping on notifications ([#4267](https://github.com/vector-im/element-android/issues/4267))
- Fix Broken EditText when using FromEditTextItem ([#4276](https://github.com/vector-im/element-android/issues/4276))
- Fix crash when clicking on ViewEvent source actions ([#4279](https://github.com/vector-im/element-android/issues/4279))
- Fix voice message record button wrong visibility ([#4283](https://github.com/vector-im/element-android/issues/4283))
- Fix unread marker not showing ([#4313](https://github.com/vector-im/element-android/issues/4313))
Changes in Element v1.3.4 (2021-10-20)
======================================
@ -5,6 +17,7 @@ Features ✨
----------
- Implement /part command, with or without parameter ([#2909](https://github.com/vector-im/element-android/issues/2909))
- Handle Presence support, for Direct Message room ([#4090](https://github.com/vector-im/element-android/issues/4090))
- Priority conversations for Android 11+ ([#3313](https://github.com/vector-im/element-android/issues/3313))
Bugfixes 🐛
----------

View file

@ -1,2 +1,2 @@
Main changes in this version: Add Presence support, for Direct Message room (note: presence is disabled on matrix.org. Add again Android Auto support.
Main changes in this version: Add Presence support, for Direct Message room (note: presence is disabled on matrix.org). Add again Android Auto support.
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View file

@ -0,0 +1,2 @@
Main changes in this version: Add Presence support, for Direct Message room (note: presence is disabled on matrix.org). Add again Android Auto support.
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.5

View file

@ -0,0 +1,2 @@
Principaux changements pour cette version: Affiche le(s) politique(s) des serveurs didentité dans les réglages. Retrait temporaire du support dAndroid Auto
Liste de tous les changements: https://github.com/vector-im/element-android/releases/tag/v1.3.3

View file

@ -37,3 +37,6 @@ Messagerie instantannée, appels audio et vidéo, partage de fichier, partage d
<b>Reprenez où vous vous êtes arrêté</b>
Restez en contact où que vous soyez grâce à lhistorique des messages synchronisé entre tous vos appareils et sur le web sur https://app.element.io
<b>Open source</b>
Element Adroid est un projet libre, hébergé par GitHub. Veuillez signaler tous les problèmes et / ou contribuer à son développement sur https://github.com/vector-im/element-android

View file

@ -31,7 +31,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
buildConfigField "String", "SDK_VERSION", "\"1.3.4\""
buildConfigField "String", "SDK_VERSION", "\"1.3.5\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""

View file

@ -1 +0,0 @@
Priority conversations for Android 11+

View file

@ -14,7 +14,7 @@ kapt {
// Note: 2 digits max for each value
ext.versionMajor = 1
ext.versionMinor = 3
ext.versionPatch = 4
ext.versionPatch = 5
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
@ -470,10 +470,7 @@ dependencies {
gplayImplementation 'com.google.android.gms:play-services-oss-licenses:17.0.0'
implementation "androidx.emoji:emoji-appcompat:1.1.0"
implementation ('com.github.BillCarsonFr:JsonViewer:0.6'){
exclude group: 'com.airbnb.android'
}
implementation ('com.github.BillCarsonFr:JsonViewer:0.7')
// WebRTC
// org.webrtc:google-webrtc is for development purposes only

View file

@ -0,0 +1,25 @@
/*
* 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.core.extensions
import android.net.Uri
const val IGNORED_SCHEMA = "ignored"
fun Uri.isIgnored() = scheme == IGNORED_SCHEMA
fun createIgnoredUri(path: String): Uri = Uri.parse("$IGNORED_SCHEMA://$path")

View file

@ -18,6 +18,7 @@ package im.vector.app.features.form
import android.text.Editable
import android.text.InputFilter
import android.text.InputType
import android.view.View
import android.view.inputmethod.EditorInfo
import android.widget.TextView
@ -106,9 +107,9 @@ abstract class FormEditTextItem : VectorEpoxyModel<FormEditTextItem.Holder>() {
}
holder.textInputEditText.isEnabled = enabled
inputType?.let { holder.textInputEditText.inputType = it }
holder.textInputEditText.isSingleLine = singleLine
holder.textInputEditText.imeOptions = imeOptions ?: EditorInfo.IME_ACTION_NONE
configureInputType(holder)
configureImeOptions(holder)
holder.textInputEditText.addTextChangedListenerOnce(onTextChangeListener)
holder.textInputEditText.setOnEditorActionListener(editorActionListener)
@ -124,6 +125,37 @@ abstract class FormEditTextItem : VectorEpoxyModel<FormEditTextItem.Holder>() {
}
}
/**
* Configure the inputType of the EditText, input type should be always defined
* especially when we want to use a single line, we set the InputType to InputType.TYPE_CLASS_TEXT
* while the default for the EditText is InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE
*/
private fun configureInputType(holder: Holder) {
val newInputType =
inputType ?: when (singleLine) {
true -> InputType.TYPE_CLASS_TEXT
false -> InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_MULTI_LINE
}
// This is a must in order to avoid extreme lag in some devices, on fast typing
if (holder.textInputEditText.inputType != newInputType) {
holder.textInputEditText.inputType = newInputType
}
}
/**
* Configure the imeOptions of the EditText, when imeOptions are not defined by the developer
* EditorInfo.IME_ACTION_NEXT will be used for singleLine EditTexts to disable "new line"
* while EditorInfo.IME_ACTION_NONE will be used for all the other cases
*/
private fun configureImeOptions(holder: Holder) {
holder.textInputEditText.imeOptions =
imeOptions ?: when (singleLine) {
true -> EditorInfo.IME_ACTION_NEXT
false -> EditorInfo.IME_ACTION_NONE
}
}
override fun shouldSaveViewState(): Boolean {
return false
}

View file

@ -1390,7 +1390,7 @@ class RoomDetailFragment @Inject constructor(
lazyLoadedViews.inviteView(false)?.isVisible = false
if (mainState.tombstoneEvent == null) {
views.composerLayout.isInvisible = !textComposerState.isComposerVisible
views.voiceMessageRecorderView.isVisible = !textComposerState.isSendButtonVisible
views.voiceMessageRecorderView.isVisible = textComposerState.isVoiceMessageRecorderVisible
views.composerLayout.views.sendButton.isInvisible = !textComposerState.isSendButtonVisible
views.composerLayout.setRoomEncrypted(summary.isEncrypted)
// views.composerLayout.alwaysShowSendButton = false

View file

@ -529,9 +529,9 @@ class RoomDetailViewModel @AssistedInject constructor(
val isAllowed = action.userJustAccepted || if (widget.type == WidgetType.Jitsi) {
widget.senderInfo?.userId == session.myUserId ||
session.integrationManagerService().isNativeWidgetDomainAllowed(
action.widget.type.preferred,
domain
)
action.widget.type.preferred,
domain
)
} else false
if (isAllowed) {
@ -1092,8 +1092,10 @@ class RoomDetailViewModel @AssistedInject constructor(
}
override fun onTimelineUpdated(snapshot: List<TimelineEvent>) {
timelineEvents.tryEmit(snapshot)
viewModelScope.launch {
// tryEmit doesn't work with SharedFlow without cache
timelineEvents.emit(snapshot)
}
// PreviewUrl
if (vectorPreferences.showUrlPreviews()) {
withState { state ->

View file

@ -49,8 +49,8 @@ data class TextComposerViewState(
val sendMode: SendMode = SendMode.REGULAR("", false)
) : MavericksState {
val isComposerVisible: Boolean
get() = canSendMessage && !isVoiceRecording
val isComposerVisible = canSendMessage && !isVoiceRecording
val isVoiceMessageRecorderVisible = canSendMessage && !isSendButtonVisible
constructor(args: RoomDetailArgs) : this(roomId = args.roomId)
}

View file

@ -47,6 +47,7 @@ import androidx.core.graphics.drawable.IconCompat
import androidx.fragment.app.Fragment
import im.vector.app.BuildConfig
import im.vector.app.R
import im.vector.app.core.extensions.createIgnoredUri
import im.vector.app.core.resources.StringProvider
import im.vector.app.core.services.CallService
import im.vector.app.core.utils.startNotificationChannelSettingsIntent
@ -317,7 +318,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
mode = VectorCallActivity.INCOMING_RINGING
).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
data = Uri.parse("foobar://${call.callId}")
data = createIgnoredUri(call.callId)
}
val contentPendingIntent = PendingIntent.getActivity(context, System.currentTimeMillis().toInt(), contentIntent, 0)
@ -378,7 +379,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
call = call,
mode = null).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
data = Uri.parse("foobar://$call.callId")
data = createIgnoredUri(call.callId)
}
val contentPendingIntent = PendingIntent.getActivity(context, System.currentTimeMillis().toInt(), contentIntent, 0)
@ -584,7 +585,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
// Mark room as read
val markRoomReadIntent = Intent(context, NotificationBroadcastReceiver::class.java)
markRoomReadIntent.action = MARK_ROOM_READ_ACTION
markRoomReadIntent.data = Uri.parse("foobar://${roomInfo.roomId}")
markRoomReadIntent.data = createIgnoredUri(roomInfo.roomId)
markRoomReadIntent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomInfo.roomId)
val markRoomReadPendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(), markRoomReadIntent,
PendingIntent.FLAG_UPDATE_CURRENT)
@ -652,7 +653,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
// offer to type a quick reject button
val rejectIntent = Intent(context, NotificationBroadcastReceiver::class.java)
rejectIntent.action = REJECT_ACTION
rejectIntent.data = Uri.parse("foobar://$roomId&$matrixId")
rejectIntent.data = createIgnoredUri("$roomId&$matrixId")
rejectIntent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId)
val rejectIntentPendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(), rejectIntent,
PendingIntent.FLAG_UPDATE_CURRENT)
@ -665,7 +666,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
// offer to type a quick accept button
val joinIntent = Intent(context, NotificationBroadcastReceiver::class.java)
joinIntent.action = JOIN_ACTION
joinIntent.data = Uri.parse("foobar://$roomId&$matrixId")
joinIntent.data = createIgnoredUri("$roomId&$matrixId")
joinIntent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId)
val joinIntentPendingIntent = PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(), joinIntent,
PendingIntent.FLAG_UPDATE_CURRENT)
@ -677,7 +678,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
val contentIntent = HomeActivity.newIntent(context, inviteNotificationRoomId = inviteNotifiableEvent.roomId)
contentIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
// pending intent get reused by system, this will mess up the extra params, so put unique info to avoid that
contentIntent.data = Uri.parse("foobar://" + inviteNotifiableEvent.eventId)
contentIntent.data = createIgnoredUri(inviteNotifiableEvent.eventId)
setContentIntent(PendingIntent.getActivity(context, 0, contentIntent, 0))
if (inviteNotifiableEvent.noisy) {
@ -716,7 +717,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
val contentIntent = HomeActivity.newIntent(context)
contentIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
// pending intent get reused by system, this will mess up the extra params, so put unique info to avoid that
contentIntent.data = Uri.parse("foobar://" + simpleNotifiableEvent.eventId)
contentIntent.data = createIgnoredUri(simpleNotifiableEvent.eventId)
setContentIntent(PendingIntent.getActivity(context, 0, contentIntent, 0))
if (simpleNotifiableEvent.noisy) {
@ -738,7 +739,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
val roomIntentTap = RoomDetailActivity.newIntent(context, RoomDetailArgs(roomId))
roomIntentTap.action = TAP_TO_VIEW_ACTION
// pending intent get reused by system, this will mess up the extra params, so put unique info to avoid that
roomIntentTap.data = Uri.parse("foobar://openRoom?$roomId")
roomIntentTap.data = createIgnoredUri("openRoom?$roomId")
// Recreate the back stack
return TaskStackBuilder.create(context)
@ -750,7 +751,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
private fun buildOpenHomePendingIntentForSummary(): PendingIntent {
val intent = HomeActivity.newIntent(context, clearNotification = true)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
intent.data = Uri.parse("foobar://tapSummary")
intent.data = createIgnoredUri("tapSummary")
return PendingIntent.getActivity(context, Random.nextInt(1000), intent, PendingIntent.FLAG_UPDATE_CURRENT)
}
@ -766,7 +767,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent = Intent(context, NotificationBroadcastReceiver::class.java)
intent.action = SMART_REPLY_ACTION
intent.data = Uri.parse("foobar://$roomId")
intent.data = createIgnoredUri(roomId)
intent.putExtra(NotificationBroadcastReceiver.KEY_ROOM_ID, roomId)
return PendingIntent.getBroadcast(context, System.currentTimeMillis().toInt(), intent,
PendingIntent.FLAG_UPDATE_CURRENT)
@ -781,7 +782,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
// the action must be unique else the parameters are ignored
quickReplyIntent.action = QUICK_LAUNCH_ACTION
quickReplyIntent.data = Uri.parse("foobar://$roomId")
quickReplyIntent.data = createIgnoredUri($roomId")
return PendingIntent.getActivity(context, 0, quickReplyIntent, 0)
}
*/
@ -835,7 +836,7 @@ class NotificationUtils @Inject constructor(private val context: Context,
private fun getDismissSummaryPendingIntent(): PendingIntent {
val intent = Intent(context, NotificationBroadcastReceiver::class.java)
intent.action = DISMISS_SUMMARY_ACTION
intent.data = Uri.parse("foobar://deleteSummary")
intent.data = createIgnoredUri("deleteSummary")
return PendingIntent.getBroadcast(context.applicationContext,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}

View file

@ -20,6 +20,7 @@ import android.content.Context
import android.net.Uri
import im.vector.app.R
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.extensions.isIgnored
import im.vector.app.core.utils.toast
import im.vector.app.features.navigation.Navigator
import im.vector.app.features.roomdirectory.roompreview.RoomPreviewData
@ -53,15 +54,19 @@ class PermalinkHandler @Inject constructor(private val activeSessionHolder: Acti
navigationInterceptor: NavigationInterceptor? = null,
buildTask: Boolean = false
): Boolean {
if (deepLink == null || !isPermalinkSupported(context, deepLink.toString())) {
return false
}
return tryOrNull {
withContext(Dispatchers.Default) {
val permalinkData = PermalinkParser.parse(deepLink)
handlePermalink(permalinkData, deepLink, context, navigationInterceptor, buildTask)
return when {
deepLink == null -> false
deepLink.isIgnored() -> true
!isPermalinkSupported(context, deepLink.toString()) -> false
else -> {
tryOrNull {
withContext(Dispatchers.Default) {
val permalinkData = PermalinkParser.parse(deepLink)
handlePermalink(permalinkData, deepLink, context, navigationInterceptor, buildTask)
}
} ?: false
}
} ?: false
}
}
private suspend fun handlePermalink(
@ -115,8 +120,8 @@ class PermalinkHandler @Inject constructor(private val activeSessionHolder: Acti
private fun isPermalinkSupported(context: Context, url: String): Boolean {
return url.startsWith(PermalinkService.MATRIX_TO_URL_BASE) ||
context.resources.getStringArray(R.array.permalink_supported_hosts).any {
url.startsWith(it)
}
url.startsWith(it)
}
}
private suspend fun PermalinkData.RoomLink.getRoomId(): String? {

View file

@ -34,6 +34,7 @@ import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.sample
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
@ -110,7 +111,7 @@ class ServerBackupStatusViewModel @AssistedInject constructor(@Assisted initialS
if (
crossSigningInfo.getOrNull() == null ||
(crossSigningInfo.getOrNull()?.isTrusted() == true &&
pInfo.getOrNull()?.allKnown().orFalse())
pInfo.getOrNull()?.allKnown().orFalse())
) {
// So 4S is not setup and we have local secrets,
return@combine BannerState.Setup(numberOfKeys = getNumberOfKeysToBackup())
@ -125,7 +126,9 @@ class ServerBackupStatusViewModel @AssistedInject constructor(@Assisted initialS
)
}
keyBackupFlow.tryEmit(session.cryptoService().keysBackupService().state)
viewModelScope.launch {
keyBackupFlow.tryEmit(session.cryptoService().keysBackupService().state)
}
}
/**
@ -155,7 +158,9 @@ class ServerBackupStatusViewModel @AssistedInject constructor(@Assisted initialS
}
override fun onStateChange(newState: KeysBackupState) {
keyBackupFlow.tryEmit(session.cryptoService().keysBackupService().state)
viewModelScope.launch {
keyBackupFlow.tryEmit(session.cryptoService().keysBackupService().state)
}
keysBackupState.value = newState
}

View file

@ -335,7 +335,7 @@
<string name="disable">Vyřadit</string>
<string name="dialog_title_confirmation">Potvrzení</string>
<string name="dialog_title_warning">Varování</string>
<string name="bottom_action_home">Domů</string>
<string name="bottom_action_home">Úvod</string>
<string name="bottom_action_favourites">Oblíbené</string>
<string name="bottom_action_people">Lidé</string>
<string name="bottom_action_rooms">Místnosti</string>
@ -1297,7 +1297,7 @@
<string name="command_description_unban_user">Zruší zákaz uživateli s daným id</string>
<string name="command_description_op_user">Určit úroveň pokročilosti uživatele</string>
<string name="command_description_invite_user">Pozve uživatele s daným id do této místnosti</string>
<string name="command_description_join_room">Vstoupí do místnosti s daným aliasem</string>
<string name="command_description_join_room">Vstoupí do místnosti s danou adresou</string>
<string name="command_description_part_room">Opustit místnost</string>
<string name="command_description_topic">Určit téma místnosti</string>
<string name="command_description_kick_user">Nakopne uživatele s daným id</string>
@ -1316,7 +1316,7 @@
<string name="community_name_hint">Příklad</string>
<string name="community_id">Id komunity</string>
<string name="community_id_hint">příklad</string>
<string name="group_details_home">Doma</string>
<string name="group_details_home">Úvod</string>
<string name="group_details_people">Lidé</string>
<string name="group_details_rooms">Místnosti</string>
<string name="no_users_placeholder">Žádní uživatelé</string>
@ -2725,16 +2725,16 @@
<string name="event_status_sent_message">Zpráva odeslána</string>
<string name="a11y_unchecked">Neoznačeno</string>
<string name="labs_use_restricted_join_rule">Experimentální, prostor - omezená místnost.</string>
<string name="spaces_beta_welcome_to_spaces_desc">Spaces představují nový způsob seskupování místností a osob.</string>
<string name="spaces_beta_welcome_to_spaces_desc">Prostory představují nový způsob seskupování místností a osob.</string>
<string name="create_spaces_room_private_header_desc">Založme pro každé místnost. Později můžete přidat i další, včetně již existujících.</string>
<string name="create_spaces_room_private_header">Na jakých tématech pracujete\?</string>
<string name="create_spaces_room_public_header_desc">Založíme pro ně místnosti. Můžete přidat další později.</string>
<string name="create_spaces_details_private_header">Doplňte nějaké podrobnosti, aby jej lidé mohli identifikovat. Můžete je kdykoli změnit.</string>
<string name="create_spaces_type_header">Spaces jsou nový způsob organizace místností a lidí</string>
<string name="spaces_header">Spaces</string>
<string name="create_spaces_type_header">Prostory jsou nový způsob organizace místností a lidí</string>
<string name="spaces_header">Prostory</string>
<string name="labs_use_restricted_join_rule_desc">Varování, nutná podpora serveru a experimentální verze místnosti</string>
<string name="you_are_invited">Jste zváni</string>
<string name="spaces_beta_welcome_to_spaces">Vítejte ve Spaces!</string>
<string name="spaces_beta_welcome_to_spaces">Vítejte v prostorech!</string>
<string name="space_add_existing_rooms">Přidat existující místnosti a prostor</string>
<string name="leave_space">Opustit prostor</string>
<string name="space_add_child_title">Přidat místnosti</string>
@ -2764,7 +2764,7 @@
<string name="invite_people_menu">Pozvat lidi</string>
<string name="invite_people_to_your_space">Pozvěte do svého prostoru lidi</string>
<string name="create_space_topic_hint">Popis</string>
<string name="create_spaces_loading_message">Zakládám Space</string>
<string name="create_spaces_loading_message">Vytvářím prostor</string>
<string name="create_spaces_default_public_random_room_name">Nahodilé</string>
<string name="create_spaces_default_public_room_name">Obecné</string>
<string name="create_spaces_room_public_header">Jaké diskuse si přejete vést v %s\?</string>
@ -2775,15 +2775,15 @@
<string name="space_type_private">Privátní</string>
<string name="space_type_public_desc">Otevřený pro všechny, nejlepší pro komunity</string>
<string name="space_type_public">Veřejný</string>
<string name="create_spaces_private_teammates">Privátní Space pro Vás a Vaše kolegy</string>
<string name="create_spaces_private_teammates">Privátní prostor pro Vás a Vaše kolegy</string>
<string name="create_spaces_me_and_teammates">Já a kolegové</string>
<string name="create_spaces_organise_rooms">Privátní Space k organizaci Vašich místností</string>
<string name="create_spaces_organise_rooms">Privátní prostor k organizaci Vašich místností</string>
<string name="create_spaces_just_me">Jen já</string>
<string name="create_spaces_make_sure_access">Ujistěte se, že ti správní lidé mají přístup do %s. Můžete změnit později.</string>
<string name="create_spaces_who_are_you_working_with">S kým pracujete\?</string>
<string name="create_spaces_join_info_help">K vstupu do existujícího Space potřebujete pozvání.</string>
<string name="create_spaces_join_info_help">Ke vstupu do existujícího prostoru potřebujete pozvání.</string>
<string name="create_spaces_you_can_change_later">Můžete změnit později</string>
<string name="create_spaces_choose_type_label">Jaký typ Space chcete založit\?</string>
<string name="create_spaces_choose_type_label">Jaký typ prostoru chcete založit\?</string>
<string name="your_private_space">Váš privátní prostor</string>
<string name="your_public_space">Váš veřejný prostor</string>
<string name="add_space">Přidat prostor</string>
@ -2802,7 +2802,7 @@
<string name="room_settings_guest_access_title">Dovolit hostům vstoupit</string>
<string name="spaces_invited_header">Pozvání</string>
<string name="suggested_header">Doporučené místnosti</string>
<string name="space_manage_rooms_and_spaces">Správa místností a Spaces</string>
<string name="space_manage_rooms_and_spaces">Správa místností a prostorů</string>
<string name="space_mark_as_not_suggested">Označit za nikoli doporučené</string>
<string name="space_mark_as_suggested">Označit za doporučené</string>
<string name="space_suggested">Doporučeno</string>
@ -2827,9 +2827,9 @@
\nK přidávání místností nemáte oprávnění.</string>
<string name="this_space_has_no_rooms">Tento prostor nemá žádné místnosti</string>
<string name="spaces_no_server_support_description">Další informace získáte od správce domovského serveru</string>
<string name="spaces_no_server_support_title">Vypadá to, že váš domovský server zatím Spaces nepodporuje</string>
<string name="spaces_no_server_support_title">Vypadá to, že váš domovský server zatím Prostory nepodporuje</string>
<string name="spaces_feeling_experimental_subspace">Chcete experimentovat\?
\nDo Spaceu můžete přidat existující Spaces.</string>
\nDo prostoru můžete přidat existující prostory.</string>
<string name="space_add_rooms">Přidat místnosti</string>
<string name="space_leave_prompt_msg_as_admin">Jste jediným správcem tohoto prostoru. Jeho opuštění bude znamenat, že nad ním nebude mít nikdo kontrolu.</string>
<string name="space_leave_prompt_msg_private">Pokud nebudete znovu pozváni, nebudete se moci připojit.</string>
@ -2840,9 +2840,9 @@
<string name="feedback_failed">Zpětnou vazbu se nepodařilo odeslat (%s)</string>
<string name="feedback_sent">Děkujeme, vaše zpětná vazba byla úspěšně odeslána</string>
<string name="you_may_contact_me">V případě dalších dotazů se na mě můžete obrátit</string>
<string name="send_feedback_space_info">Používáte beta verzi Spaces. Váš feedback pomůže při tvorbě dalších verzí. Vaše platforma a uživatelské jméno budou zaznamenány, abychom mohli Váš feedback co nejlépe využít.</string>
<string name="send_feedback_space_info">Používáte beta verzi prostorů. Vaše zpětná vazba pomůže při tvorbě dalších verzí. Vaše platforma a uživatelské jméno budou zaznamenány, abychom mohli vaši zpětnou vazbu co nejlépe využít.</string>
<string name="feedback">Zpětná vazba</string>
<string name="send_feedback_space_title">Feedback na Spaces</string>
<string name="send_feedback_space_title">Zpětná vazba prostorů</string>
<string name="error_jitsi_join_conf">Omlouváme se, při pokusu o připojení ke konferenci došlo k chybě</string>
<string name="unnamed_room">Nepojmenovaná místnost</string>
<string name="private_space">Soukromý prostor</string>
@ -2860,7 +2860,7 @@
<string name="teammate_spaces_might_not_join">V současné době se lidé nemohou připojit k soukromým místnostem, které jste vytvořili.
\n
\nV rámci beta verze to zlepšíme, ale jen jsme vás chtěli informovat.</string>
<string name="teammate_spaces_arent_quite_ready">Spaces pro spolupracovníky nejsou ještě zcela připravené, ale přesto je můžete vyzkoušet</string>
<string name="teammate_spaces_arent_quite_ready">Prostory pro spolupracovníky nejsou ještě zcela připravené, ale přesto je můžete vyzkoušet</string>
<string name="error_failed_to_join_room">Omlouváme se, došlo k chybě během pokusu o přistoupení: %s</string>
<string name="create_space_alias_hint">Adresa prostoru</string>
<string name="space_settings_alias_subtitle">Prohlédnout a spravovat adresy tohoto prostoru.</string>
@ -2900,17 +2900,17 @@
<item quantity="few">%d zmeškané hlasové hovory</item>
<item quantity="other">%d zmeškaných hlasových hovorů</item>
</plurals>
<string name="decide_which_spaces_can_access">Rozhodněte, které Spaces mají přístup do této místnosti. Pokud je vybrán prostor, jeho členové budou moci najít název místnosti a připojit se k ní.</string>
<string name="other_spaces_or_rooms_you_might_not_know">Další Spaces nebo místnosti, které možná neznáte</string>
<string name="decide_which_spaces_can_access">Rozhodněte, které prostory mají přístup do této místnosti. Pokud je vybrán prostor, jeho členové budou moci najít název místnosti a připojit se k ní.</string>
<string name="other_spaces_or_rooms_you_might_not_know">Další prostory nebo místnosti, které možná neznáte</string>
<string name="space_you_know_that_contains_this_room">Prostor, o kterém víte, že obsahuje tuto místnost</string>
<string name="decide_who_can_find_and_join">Rozhodněte, kdo může tuto místnost najít a připojit se k ní.</string>
<string name="tap_to_edit_spaces">Klepnutím upravíte Spaces</string>
<string name="allow_anyone_in_room_to_access">Povolit vyhledání a přístup komukoli v %s. Můžete vybrat i další Spaces.</string>
<string name="tap_to_edit_spaces">Klepnutím upravíte prostory</string>
<string name="allow_anyone_in_room_to_access">Povolit vyhledání a přístup komukoli v %s. Můžete vybrat i další prostory.</string>
<string name="upgrade_required">Vyžadována aktualizace</string>
<string name="upgrade_room_for_restricted_no_param">Každý, kdo se nachází v nadřazeném prostoru, bude moci tuto místnost najít a připojit se k ní - není třeba všechny zvát ručně. Tuto možnost budete moci kdykoli změnit v nastavení místnosti.</string>
<string name="upgrade_room_for_restricted">Kdokoli v %s bude moci tuto místnost najít a připojit se k ní - není třeba všechny zvát ručně. Toto nastavení budete moci kdykoli změnit v nastavení místnosti.</string>
<string name="voice_message_tap_to_stop_toast">Klepnutím na nahrávku ji zastavíte nebo posloucháte</string>
<string name="select_spaces">Vybrat Spaces</string>
<string name="select_spaces">Vybrat prostory</string>
<string name="upgrade_room_for_restricted_note">Upozorňujeme, že aktualizací vznikne nová verze místnosti. Všechny aktuální zprávy zůstanou v této archivované místnosti.</string>
<string name="voice_message_reply_content">Hlasová zpráva (%1$s)</string>
<string name="error_voice_message_cannot_reply_or_edit">Nelze odpovídat ani upravovat, když je hlasová zpráva aktivní</string>
@ -2927,7 +2927,7 @@
<string name="voice_message_slide_to_cancel">Posunutím zrušíte</string>
<string name="a11y_start_voice_message">Nahrát hlasovou zprávu</string>
<string name="sent_a_voice_message">Hlasová zpráva</string>
<string name="spaces_which_can_access">Spaces, které mají přístup</string>
<string name="spaces_which_can_access">Prostory, které mají přístup</string>
<string name="allow_space_member_to_find_and_access">Umožněte členům prostoru ho najít a zpřístupnit.</string>
<string name="room_create_member_of_space_name_can_join">Členové prostoru %s mohou vyhledávat, prohlížet a připojovat se.</string>
<string name="room_settings_room_access_private_invite_only_title">Soukromé (pouze pro pozvané)</string>
@ -2952,8 +2952,8 @@
<string name="to_help_space_members_find_and_join">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.</string>
<string name="help_space_members">Pomozte členům prostoru najít soukromé místnosti</string>
<string name="this_makes_it_easy_for_rooms_to_stay_private_to_a_space">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.</string>
<string name="help_people_in_spaces_find_and_join">Pomozte lidem ve Spaces, aby sami našli soukromé místnosti a připojili se k nim, není třeba všechny zvát ručně.</string>
<string name="new_let_people_in_spaces_find_and_join">Novinka: Nechat lidi v Spaces vyhledat a připojit se k soukromým místnostem</string>
<string name="help_people_in_spaces_find_and_join">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ě.</string>
<string name="new_let_people_in_spaces_find_and_join">Novinka: Nechat lidi v prostorech vyhledat a připojit se k soukromým místnostem</string>
<string name="call_jitsi_started">Skupinový hovor zahájen</string>
<string name="all_rooms_youre_in_will_be_shown_in_home">Všechny místnosti, ve kterých se nacházíte, se zobrazí v domovském zobrazení.</string>
<string name="preference_show_all_rooms_in_home">Zobrazit všechny místnosti v domovském zobrazení</string>
@ -2998,7 +2998,7 @@
<string name="audio_call_with_participant">Hlasový hovor s %s</string>
<string name="video_call_with_participant">Videohovor s %s</string>
<string name="call_ringing">Vyzvánění…</string>
<string name="spaces">Spaces</string>
<string name="spaces">Prostory</string>
<string name="learn_more">Dozvědět se více</string>
<string name="space_add_space_to_any_space_you_manage">Přidejte prostor do jakéhokoli prostoru, který spravujete.</string>
<string name="space_add_existing_spaces">Přidat stávající prostory</string>

View file

@ -1556,7 +1556,7 @@
<string name="command_description_op_user">Määra kasutaja õigused</string>
<string name="command_description_deop_user">Eemalda antud tunnusega kasutajalt haldusõigused selles jututoas</string>
<string name="command_description_invite_user">Kutsub nimetatud kasutajatunnusega kasutaja sellesse jututuppa</string>
<string name="command_description_join_room">Liitu antud aadressiga jututoaga</string>
<string name="command_description_join_room">Liitu sellise aadressiga jututoaga</string>
<string name="command_description_part_room">Lahku jututoast</string>
<string name="command_description_topic">Määra jututoa teema</string>
<string name="command_description_kick_user">Müksa selle tunnusega kasutaja jututoast välja</string>

View file

@ -984,7 +984,7 @@
<string name="command_description_op_user">Définit le rang dun utilisateur</string>
<string name="command_description_deop_user">Rétrograde lutilisateur avec lidentifiant fourni</string>
<string name="command_description_invite_user">Invite lutilisateur avec lidentifiant fourni dans le salon actuel</string>
<string name="command_description_join_room">Rejoint le salon avec lalias fourni</string>
<string name="command_description_join_room">Rejoint le salon avec ladresse fournie</string>
<string name="command_description_part_room">Quitte le salon</string>
<string name="command_description_topic">Définit le sujet du salon</string>
<string name="command_description_kick_user">Expulse lutilisateur avec lidentifiant fourni</string>
@ -3009,4 +3009,7 @@
<string name="space_participants_kick_prompt_msg">Lexpulsion des utilisateurs va les supprimer de cet espace
\n
\nPour les empêcher de revenir, vous devriez les exclure.</string>
<string name="a11y_presence_unavailable">Indisponible</string>
<string name="a11y_presence_offline">Hors ligne</string>
<string name="a11y_presence_online">En ligne</string>
</resources>

View file

@ -942,7 +942,7 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés
<string name="command_description_op_user">Felhasználó hozzáférési szintjének meghatározása</string>
<string name="command_description_deop_user">Meghatározott azonosítójú felhasználó hozzáférési szintjének visszaállítása</string>
<string name="command_description_invite_user">Megadott azonosítójú felhasználó meghívása a szobába</string>
<string name="command_description_join_room">Megadott becenévvel csatlakozik a szobához</string>
<string name="command_description_join_room">Megadott címmel csatlakozik a szobához</string>
<string name="command_description_part_room">Kilépés a szobából</string>
<string name="command_description_topic">A szoba témájának beállítása</string>
<string name="command_description_kick_user">Megadott azonosítójú felhasználó kirúgása</string>

View file

@ -525,7 +525,7 @@ Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna ${app_name} yan
<string name="command_description_unban_user">Cabut larangan pengguna dengan id berikut</string>
<string name="command_description_op_user">Tentukan tingkat kuasa seorang pengguna</string>
<string name="command_description_invite_user">Undang pengguna dengan id berikut bergabung ke ruang ini</string>
<string name="command_description_join_room">Gabung ke ruang dengan alias berikut</string>
<string name="command_description_join_room">Gabung ke ruangan dengan alamat berikut</string>
<string name="command_description_part_room">Tinggalkan ruang</string>
<string name="command_description_topic">Tentukan topik ruang</string>
<string name="command_description_kick_user">Keluarkan pengguna dengan id berikut</string>

View file

@ -1094,7 +1094,7 @@
<string name="command_description_op_user">Define nível de poder de um/uma usuário(a)</string>
<string name="command_description_deop_user">Desopa usuária(o) com id dada</string>
<string name="command_description_invite_user">Convida usuária(o) com id dada para esta sala</string>
<string name="command_description_join_room">Junta-se a sala com alias dado</string>
<string name="command_description_join_room">Junta-se a sala com endereço dado</string>
<string name="command_description_part_room">Sair de sala</string>
<string name="command_description_topic">Definir o tópico da sala</string>
<string name="command_description_kick_user">Expulsa a(o) usuária(o) com id dada</string>

View file

@ -1785,7 +1785,7 @@
<string name="command_description_op_user">Definiera behörighetsnivå för en användare</string>
<string name="command_description_deop_user">Avoppar användaren med det angivna ID:t</string>
<string name="command_description_invite_user">Bjuder in användaren med det angivna ID:t till det nuvarande rummet</string>
<string name="command_description_join_room">Går med i rummet med det angivna aliaset</string>
<string name="command_description_join_room">Går med i rummet med den angivna adressen</string>
<string name="command_description_topic">Sätt ett rumsämne</string>
<string name="command_description_kick_user">Sparkar ut användaren med det angivna ID:t</string>
<string name="command_description_nick">Ändrar ditt visningsnamn</string>

View file

@ -948,7 +948,7 @@
<string name="command_description_op_user">设置用户的权限等级</string>
<string name="command_description_deop_user">按照 ID 取消用户管理员权限</string>
<string name="command_description_invite_user">按照 ID 邀请用户进入当前聊天室</string>
<string name="command_description_join_room">按照别名加入聊天室</string>
<string name="command_description_join_room">用给定地址加入聊天室</string>
<string name="command_description_part_room">离开聊天室</string>
<string name="command_description_topic">设置聊天室主题</string>
<string name="command_description_kick_user">按照 ID 踢出用户</string>

View file

@ -988,7 +988,7 @@
<string name="command_description_op_user">定義使用者的權限等級</string>
<string name="command_description_deop_user">取消指定 id 的使用者的管理權</string>
<string name="command_description_invite_user">邀請指定 id 的使用者到目前的聊天室</string>
<string name="command_description_join_room">加入指定別名的聊天室</string>
<string name="command_description_join_room">加入指定地址的聊天室</string>
<string name="command_description_part_room">離開聊天室</string>
<string name="command_description_topic">設定聊天室主題</string>
<string name="command_description_kick_user">踢除指定 id 的使用者</string>