diff --git a/CHANGES.md b/CHANGES.md index 8de71eae62..d3bc0cc414 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -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 🐛 ---------- diff --git a/fastlane/metadata/android/en-US/changelogs/40103040.txt b/fastlane/metadata/android/en-US/changelogs/40103040.txt index 06b32c8dff..a6af2efe00 100644 --- a/fastlane/metadata/android/en-US/changelogs/40103040.txt +++ b/fastlane/metadata/android/en-US/changelogs/40103040.txt @@ -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 \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/40103050.txt b/fastlane/metadata/android/en-US/changelogs/40103050.txt new file mode 100644 index 0000000000..93227f1a6d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/40103050.txt @@ -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 \ No newline at end of file diff --git a/fastlane/metadata/android/fr-FR/changelogs/40103030.txt b/fastlane/metadata/android/fr-FR/changelogs/40103030.txt new file mode 100644 index 0000000000..0130080ca7 --- /dev/null +++ b/fastlane/metadata/android/fr-FR/changelogs/40103030.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : Affiche le(s) politique(s) des serveurs d’identité dans les réglages. Retrait temporaire du support d’Android Auto +Liste de tous les changements : https ://github.com/vector-im/element-android/releases/tag/v1.3.3 diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt index 78fcdf5617..7ffdb6cb9d 100644 --- a/fastlane/metadata/android/fr-FR/full_description.txt +++ b/fastlane/metadata/android/fr-FR/full_description.txt @@ -37,3 +37,6 @@ Messagerie instantannée, appels audio et vidéo, partage de fichier, partage d Reprenez où vous vous êtes arrêté Restez en contact où que vous soyez grâce à l’historique des messages synchronisé entre tous vos appareils et sur le web sur https://app.element.io + +Open source +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 diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle index b547ae037a..c92d735fac 100644 --- a/matrix-sdk-android/build.gradle +++ b/matrix-sdk-android/build.gradle @@ -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()}\"" diff --git a/newsfragment/3313.feature b/newsfragment/3313.feature deleted file mode 100644 index 3d243fa1ef..0000000000 --- a/newsfragment/3313.feature +++ /dev/null @@ -1 +0,0 @@ -Priority conversations for Android 11+ diff --git a/vector/build.gradle b/vector/build.gradle index 31a4f1639c..254bf3873c 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -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 diff --git a/vector/src/main/java/im/vector/app/core/extensions/UriExtensions.kt b/vector/src/main/java/im/vector/app/core/extensions/UriExtensions.kt new file mode 100644 index 0000000000..ec7a03bdbb --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/extensions/UriExtensions.kt @@ -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") diff --git a/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt b/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt index cda1623c88..7b7896316b 100644 --- a/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt +++ b/vector/src/main/java/im/vector/app/features/form/FormEditTextItem.kt @@ -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() { } 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() { } } + /** + * 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 } 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 7461b89001..fa0ca24289 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 @@ -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 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 0c0e5ee6cd..f4f2def028 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 @@ -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) { - timelineEvents.tryEmit(snapshot) - + viewModelScope.launch { + // tryEmit doesn't work with SharedFlow without cache + timelineEvents.emit(snapshot) + } // PreviewUrl if (vectorPreferences.showUrlPreviews()) { withState { state -> diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerViewState.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerViewState.kt index 3110aa8dc3..199fb1b82d 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerViewState.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/TextComposerViewState.kt @@ -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) } diff --git a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt index 92feb3d038..f3b34e1269 100755 --- a/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt +++ b/vector/src/main/java/im/vector/app/features/notifications/NotificationUtils.kt @@ -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) } diff --git a/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt b/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt index a02cfe7517..90bcee3d04 100644 --- a/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt +++ b/vector/src/main/java/im/vector/app/features/permalink/PermalinkHandler.kt @@ -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? { diff --git a/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt index 9b9f3fe490..92af25994a 100644 --- a/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/workers/signout/ServerBackupStatusViewModel.kt @@ -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 } diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index c6b57e47ff..42e1e3963f 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -335,7 +335,7 @@ Vyřadit Potvrzení Varování - Domů + Úvod Oblíbené Lidé Místnosti @@ -1297,7 +1297,7 @@ Zruší zákaz uživateli s daným id Určit úroveň pokročilosti uživatele Pozve uživatele s daným id do této místnosti - Vstoupí do místnosti s daným aliasem + Vstoupí do místnosti s danou adresou Opustit místnost Určit téma místnosti Nakopne uživatele s daným id @@ -1316,7 +1316,7 @@ Příklad Id komunity příklad - Doma + Úvod Lidé Místnosti Žádní uživatelé @@ -2725,16 +2725,16 @@ Zpráva odeslána Neoznačeno Experimentální, prostor - omezená místnost. - Spaces představují nový způsob seskupování místností a osob. + Prostory představují nový způsob seskupování místností a osob. Založme pro každé místnost. Později můžete přidat i další, včetně již existujících. Na jakých tématech pracujete\? Založíme pro ně místnosti. Můžete přidat další později. Doplňte nějaké podrobnosti, aby jej lidé mohli identifikovat. Můžete je kdykoli změnit. - Spaces jsou nový způsob organizace místností a lidí - Spaces + Prostory jsou nový způsob organizace místností a lidí + Prostory Varování, nutná podpora serveru a experimentální verze místnosti Jste zváni - Vítejte ve Spaces! + Vítejte v prostorech! Přidat existující místnosti a prostor Opustit prostor Přidat místnosti @@ -2764,7 +2764,7 @@ Pozvat lidi Pozvěte do svého prostoru lidi Popis - Zakládám Space… + Vytvářím prostor… Nahodilé Obecné Jaké diskuse si přejete vést v %s\? @@ -2775,15 +2775,15 @@ Privátní Otevřený pro všechny, nejlepší pro komunity Veřejný - Privátní Space pro Vás a Vaše kolegy + Privátní prostor pro Vás a Vaše kolegy Já a kolegové - Privátní Space k organizaci Vašich místností + Privátní prostor k organizaci Vašich místností Jen já Ujistěte se, že ti správní lidé mají přístup do %s. Můžete změnit později. S kým pracujete\? - K vstupu do existujícího Space potřebujete pozvání. + Ke vstupu do existujícího prostoru potřebujete pozvání. Můžete změnit později - Jaký typ Space chcete založit\? + Jaký typ prostoru chcete založit\? Váš privátní prostor Váš veřejný prostor Přidat prostor @@ -2802,7 +2802,7 @@ Dovolit hostům vstoupit Pozvání Doporučené místnosti - Správa místností a Spaces + Správa místností a prostorů Označit za nikoli doporučené Označit za doporučené Doporučeno @@ -2827,9 +2827,9 @@ \nK přidávání místností nemáte oprávnění. Tento prostor nemá žádné místnosti Další informace získáte od správce domovského serveru - Vypadá to, že váš domovský server zatím Spaces nepodporuje + Vypadá to, že váš domovský server zatím Prostory nepodporuje Chcete experimentovat\? -\nDo Spaceu můžete přidat existující Spaces. +\nDo prostoru můžete přidat existující prostory. Přidat místnosti Jste jediným správcem tohoto prostoru. Jeho opuštění bude znamenat, že nad ním nebude mít nikdo kontrolu. Pokud nebudete znovu pozváni, nebudete se moci připojit. @@ -2840,9 +2840,9 @@ Zpětnou vazbu se nepodařilo odeslat (%s) Děkujeme, vaše zpětná vazba byla úspěšně odeslána V případě dalších dotazů se na mě můžete obrátit - 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. + 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. Zpětná vazba - Feedback na Spaces + Zpětná vazba prostorů Omlouváme se, při pokusu o připojení ke konferenci došlo k chybě Nepojmenovaná místnost Soukromý prostor @@ -2860,7 +2860,7 @@ 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. - Spaces pro spolupracovníky nejsou ještě zcela připravené, ale přesto je můžete vyzkoušet + Prostory pro spolupracovníky nejsou ještě zcela připravené, ale přesto je můžete vyzkoušet Omlouváme se, došlo k chybě během pokusu o přistoupení: %s Adresa prostoru Prohlédnout a spravovat adresy tohoto prostoru. @@ -2900,17 +2900,17 @@ %d zmeškané hlasové hovory %d zmeškaných hlasových hovorů - 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í. - Další Spaces nebo místnosti, které možná neznáte + 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í. + Další prostory nebo místnosti, které možná neznáte Prostor, o kterém víte, že obsahuje tuto místnost Rozhodněte, kdo může tuto místnost najít a připojit se k ní. - Klepnutím upravíte Spaces - Povolit vyhledání a přístup komukoli v %s. Můžete vybrat i další Spaces. + Klepnutím upravíte prostory + Povolit vyhledání a přístup komukoli v %s. Můžete vybrat i další prostory. Vyžadována aktualizace 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. 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. Klepnutím na nahrávku ji zastavíte nebo posloucháte - Vybrat Spaces + Vybrat prostory Upozorňujeme, že aktualizací vznikne nová verze místnosti. Všechny aktuální zprávy zůstanou v této archivované místnosti. Hlasová zpráva (%1$s) Nelze odpovídat ani upravovat, když je hlasová zpráva aktivní @@ -2927,7 +2927,7 @@ Posunutím zrušíte Nahrát hlasovou zprávu Hlasová zpráva - Spaces, které mají přístup + Prostory, které mají přístup Umožněte členům prostoru ho najít a zpřístupnit. Členové prostoru %s mohou vyhledávat, prohlížet a připojovat se. Soukromé (pouze pro pozvané) @@ -2952,8 +2952,8 @@ 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 ve Spaces, 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 Spaces vyhledat a připojit se k soukromým místnostem + 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 vyhledat 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í @@ -2998,7 +2998,7 @@ Hlasový hovor s %s Videohovor s %s Vyzvánění… - Spaces + Prostory Dozvědět se více Přidejte prostor do jakéhokoli prostoru, který spravujete. Přidat stávající prostory diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index 27c332b605..2585eaa15a 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -1556,7 +1556,7 @@ Määra kasutaja õigused Eemalda antud tunnusega kasutajalt haldusõigused selles jututoas Kutsub nimetatud kasutajatunnusega kasutaja sellesse jututuppa - Liitu antud aadressiga jututoaga + Liitu sellise aadressiga jututoaga Lahku jututoast Määra jututoa teema Müksa selle tunnusega kasutaja jututoast välja diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 483b433ecc..12eca6b823 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -984,7 +984,7 @@ Définit le rang d’un utilisateur Rétrograde l’utilisateur avec l’identifiant fourni Invite l’utilisateur avec l’identifiant fourni dans le salon actuel - Rejoint le salon avec l’alias fourni + Rejoint le salon avec l’adresse fournie Quitte le salon Définit le sujet du salon Expulse l’utilisateur avec l’identifiant fourni @@ -3009,4 +3009,7 @@ L’expulsion des utilisateurs va les supprimer de cet espace \n \nPour les empêcher de revenir, vous devriez les exclure. + Indisponible + Hors ligne + En ligne \ No newline at end of file diff --git a/vector/src/main/res/values-hu/strings.xml b/vector/src/main/res/values-hu/strings.xml index 1926a40115..1d9214f926 100644 --- a/vector/src/main/res/values-hu/strings.xml +++ b/vector/src/main/res/values-hu/strings.xml @@ -942,7 +942,7 @@ Matrixban az üzenetek láthatósága hasonlít az e-mailre. Az üzenet törlés Felhasználó hozzáférési szintjének meghatározása Meghatározott azonosítójú felhasználó hozzáférési szintjének visszaállítása Megadott azonosítójú felhasználó meghívása a szobába - Megadott becenévvel csatlakozik a szobához + Megadott címmel csatlakozik a szobához Kilépés a szobából A szoba témájának beállítása Megadott azonosítójú felhasználó kirúgása diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index f899be6bff..8b9016b6c3 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -525,7 +525,7 @@ Ijinkan akses lewat halaman selanjutnya untuk menemukan pengguna ${app_name} yan Cabut larangan pengguna dengan id berikut Tentukan tingkat kuasa seorang pengguna Undang pengguna dengan id berikut bergabung ke ruang ini - Gabung ke ruang dengan alias berikut + Gabung ke ruangan dengan alamat berikut Tinggalkan ruang Tentukan topik ruang Keluarkan pengguna dengan id berikut diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index ff824445eb..8ef17a33d9 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -1094,7 +1094,7 @@ Define nível de poder de um/uma usuário(a) Desopa usuária(o) com id dada Convida usuária(o) com id dada para esta sala - Junta-se a sala com alias dado + Junta-se a sala com endereço dado Sair de sala Definir o tópico da sala Expulsa a(o) usuária(o) com id dada diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 5ff62fa1eb..0ec5b0d820 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -1785,7 +1785,7 @@ Definiera behörighetsnivå för en användare Avoppar användaren med det angivna ID:t Bjuder in användaren med det angivna ID:t till det nuvarande rummet - Går med i rummet med det angivna aliaset + Går med i rummet med den angivna adressen Sätt ett rumsämne Sparkar ut användaren med det angivna ID:t Ändrar ditt visningsnamn diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index 28d2c8e250..feff737e27 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -948,7 +948,7 @@ 设置用户的权限等级 按照 ID 取消用户管理员权限 按照 ID 邀请用户进入当前聊天室 - 按照别名加入聊天室 + 用给定地址加入聊天室 离开聊天室 设置聊天室主题 按照 ID 踢出用户 diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index 66120d9429..df611eceb7 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -988,7 +988,7 @@ 定義使用者的權限等級 取消指定 id 的使用者的管理權 邀請指定 id 的使用者到目前的聊天室 - 加入指定別名的聊天室 + 加入指定地址的聊天室 離開聊天室 設定聊天室主題 踢除指定 id 的使用者