mirror of
https://github.com/vector-im/riotX-android
synced 2025-10-06 00:02:48 +02:00
Compare commits
43 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
042e91ee1c | ||
|
5279993995 | ||
|
edd29ec4ef | ||
|
093b5c76ab | ||
|
f2330903ae | ||
|
9f1efab18d | ||
|
dc5739c11d | ||
|
cabdec166f | ||
|
f877965550 | ||
|
201d558925 | ||
|
b892331e42 | ||
|
8b6e0187d6 | ||
|
55c00a0975 | ||
|
325e78106e | ||
|
06b3cc3f4b | ||
|
09fbd5fcf5 | ||
|
a82a5c9b32 | ||
|
0d1382ab01 | ||
|
f75de0b2b7 | ||
|
7aa860b1fa | ||
|
dcda43fc93 | ||
|
de320e671e | ||
|
5a3d1fb7ec | ||
|
2ddedf49d4 | ||
|
df5c05fc1f | ||
|
2b0933139a | ||
|
3993a45825 | ||
|
b83566c1c0 | ||
|
bc137af0e2 | ||
|
c212c2ec50 | ||
|
9d5f84b86a | ||
|
d6d46d1c21 | ||
|
a7d5c6a437 | ||
|
eb54eef595 | ||
|
beab9ab8f1 | ||
|
d41ff50097 | ||
|
dc230f1c30 | ||
|
486e769287 | ||
|
d33daaf799 | ||
|
3ea7b37df3 | ||
|
b3f6b5e142 | ||
|
7c9c4ecf5f | ||
|
86d4d13d50 |
22
CHANGES.md
22
CHANGES.md
@@ -1,3 +1,24 @@
|
||||
Changes in Element v1.3.6 (2021-10-26)
|
||||
======================================
|
||||
|
||||
Bugfixes 🐛
|
||||
----------
|
||||
- Correctly handle url of type https://mobile.element.io/?hs_url=…&is_url=…
|
||||
Skip the choose server screen when such URL are open when Element ([#2684](https://github.com/vector-im/element-android/issues/2684))
|
||||
|
||||
|
||||
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 +26,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 🐛
|
||||
----------
|
||||
|
@@ -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
|
2
fastlane/metadata/android/en-US/changelogs/40103050.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40103050.txt
Normal 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
|
2
fastlane/metadata/android/en-US/changelogs/40103060.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40103060.txt
Normal 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.6
|
2
fastlane/metadata/android/fr-FR/changelogs/40103030.txt
Normal file
2
fastlane/metadata/android/fr-FR/changelogs/40103030.txt
Normal file
@@ -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
|
@@ -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 à l’historique 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
|
||||
|
@@ -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.6\""
|
||||
|
||||
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
|
||||
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
|
||||
|
@@ -1 +0,0 @@
|
||||
Priority conversations for Android 11+
|
@@ -14,7 +14,7 @@ kapt {
|
||||
// Note: 2 digits max for each value
|
||||
ext.versionMajor = 1
|
||||
ext.versionMinor = 3
|
||||
ext.versionPatch = 4
|
||||
ext.versionPatch = 6
|
||||
|
||||
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
|
||||
|
@@ -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")
|
@@ -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
|
||||
}
|
||||
|
@@ -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
|
||||
|
@@ -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 ->
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -23,6 +23,8 @@ import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
|
||||
import org.matrix.android.sdk.internal.network.ssl.Fingerprint
|
||||
|
||||
sealed class LoginAction : VectorViewModelAction {
|
||||
data class OnGetStarted(val resetLoginConfig: Boolean) : LoginAction()
|
||||
|
||||
data class UpdateServerType(val serverType: ServerType) : LoginAction()
|
||||
data class UpdateHomeServer(val homeServerUrl: String) : LoginAction()
|
||||
data class UpdateSignMode(val signMode: SignMode) : LoginAction()
|
||||
|
@@ -103,7 +103,6 @@ open class LoginActivity : VectorBaseActivity<ActivityLoginBinding>(), ToolbarCo
|
||||
// Get config extra
|
||||
val loginConfig = intent.getParcelableExtra<LoginConfig?>(EXTRA_CONFIG)
|
||||
if (isFirstCreation()) {
|
||||
// TODO Check this
|
||||
loginViewModel.handle(LoginAction.InitWith(loginConfig))
|
||||
}
|
||||
}
|
||||
|
@@ -87,10 +87,5 @@ class LoginServerSelectionFragment @Inject constructor() : AbstractLoginFragment
|
||||
|
||||
override fun updateWithState(state: LoginViewState) {
|
||||
updateSelectedChoice(state)
|
||||
|
||||
if (state.loginMode != LoginMode.Unknown) {
|
||||
// LoginFlow for matrix.org has been retrieved
|
||||
loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OnLoginFlowRetrieved))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -156,10 +156,5 @@ class LoginServerUrlFormFragment @Inject constructor() : AbstractLoginFragment<F
|
||||
setupUi(state)
|
||||
|
||||
views.loginServerUrlFormClearHistory.isInvisible = state.knownCustomHomeServersUrls.isEmpty()
|
||||
|
||||
if (state.loginMode != LoginMode.Unknown) {
|
||||
// The homeserver url is valid
|
||||
loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OnLoginFlowRetrieved))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -22,9 +22,13 @@ import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.core.view.isVisible
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||
import im.vector.app.BuildConfig
|
||||
import im.vector.app.R
|
||||
import im.vector.app.databinding.FragmentLoginSplashBinding
|
||||
import im.vector.app.features.settings.VectorPreferences
|
||||
import org.matrix.android.sdk.api.failure.Failure
|
||||
import java.net.UnknownHostException
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
@@ -45,7 +49,7 @@ class LoginSplashFragment @Inject constructor(
|
||||
}
|
||||
|
||||
private fun setupViews() {
|
||||
views.loginSplashSubmit.setOnClickListener { getStarted() }
|
||||
views.loginSplashSubmit.debouncedClicks { getStarted() }
|
||||
|
||||
if (BuildConfig.DEBUG || vectorPreferences.developerMode()) {
|
||||
views.loginSplashVersion.isVisible = true
|
||||
@@ -57,10 +61,28 @@ class LoginSplashFragment @Inject constructor(
|
||||
}
|
||||
|
||||
private fun getStarted() {
|
||||
loginViewModel.handle(LoginAction.PostViewEvent(LoginViewEvents.OpenServerSelection))
|
||||
loginViewModel.handle(LoginAction.OnGetStarted(resetLoginConfig = false))
|
||||
}
|
||||
|
||||
override fun resetViewModel() {
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
override fun onError(throwable: Throwable) {
|
||||
if (throwable is Failure.NetworkConnection &&
|
||||
throwable.ioException is UnknownHostException) {
|
||||
// Invalid homeserver from URL config
|
||||
val url = loginViewModel.getInitialHomeServerUrl().orEmpty()
|
||||
MaterialAlertDialogBuilder(requireActivity())
|
||||
.setTitle(R.string.dialog_title_error)
|
||||
.setMessage(getString(R.string.login_error_homeserver_from_url_not_found, url))
|
||||
.setPositiveButton(R.string.login_error_homeserver_from_url_not_found_enter_manual) { _, _ ->
|
||||
loginViewModel.handle(LoginAction.OnGetStarted(resetLoginConfig = true))
|
||||
}
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
.show()
|
||||
} else {
|
||||
super.onError(throwable)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -19,7 +19,6 @@ package im.vector.app.features.login
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import com.airbnb.mvrx.ActivityViewModelContext
|
||||
import com.airbnb.mvrx.Fail
|
||||
import com.airbnb.mvrx.Loading
|
||||
@@ -128,6 +127,7 @@ class LoginViewModel @AssistedInject constructor(
|
||||
|
||||
override fun handle(action: LoginAction) {
|
||||
when (action) {
|
||||
is LoginAction.OnGetStarted -> handleOnGetStarted(action)
|
||||
is LoginAction.UpdateServerType -> handleUpdateServerType(action)
|
||||
is LoginAction.UpdateSignMode -> handleUpdateSignMode(action)
|
||||
is LoginAction.InitWith -> handleInitWith(action)
|
||||
@@ -146,6 +146,27 @@ class LoginViewModel @AssistedInject constructor(
|
||||
}.exhaustive
|
||||
}
|
||||
|
||||
private fun handleOnGetStarted(action: LoginAction.OnGetStarted) {
|
||||
if (action.resetLoginConfig) {
|
||||
loginConfig = null
|
||||
}
|
||||
|
||||
val configUrl = loginConfig?.homeServerUrl?.takeIf { it.isNotEmpty() }
|
||||
if (configUrl != null) {
|
||||
// Use config from uri
|
||||
val homeServerConnectionConfig = homeServerConnectionConfigFactory.create(configUrl)
|
||||
if (homeServerConnectionConfig == null) {
|
||||
// Url is invalid, in this case, just use the regular flow
|
||||
Timber.w("Url from config url was invalid: $configUrl")
|
||||
_viewEvents.post(LoginViewEvents.OpenServerSelection)
|
||||
} else {
|
||||
getLoginFlow(homeServerConnectionConfig, ServerType.Other)
|
||||
}
|
||||
} else {
|
||||
_viewEvents.post(LoginViewEvents.OpenServerSelection)
|
||||
}
|
||||
}
|
||||
|
||||
private fun handleUserAcceptCertificate(action: LoginAction.UserAcceptCertificate) {
|
||||
// It happens when we get the login flow, or during direct authentication.
|
||||
// So alter the homeserver config and retrieve again the login flow
|
||||
@@ -744,7 +765,8 @@ class LoginViewModel @AssistedInject constructor(
|
||||
}
|
||||
}
|
||||
|
||||
private fun getLoginFlow(homeServerConnectionConfig: HomeServerConnectionConfig) {
|
||||
private fun getLoginFlow(homeServerConnectionConfig: HomeServerConnectionConfig,
|
||||
serverTypeOverride: ServerType? = null) {
|
||||
currentHomeServerConnectionConfig = homeServerConnectionConfig
|
||||
|
||||
currentJob = viewModelScope.launch {
|
||||
@@ -755,7 +777,11 @@ class LoginViewModel @AssistedInject constructor(
|
||||
asyncHomeServerLoginFlowRequest = Loading(),
|
||||
// If user has entered https://matrix.org, ensure that server type is ServerType.MatrixOrg
|
||||
// It is also useful to set the value again in the case of a certificate error on matrix.org
|
||||
serverType = if (homeServerConnectionConfig.homeServerUri.toString() == matrixOrgUrl) ServerType.MatrixOrg else serverType
|
||||
serverType = if (homeServerConnectionConfig.homeServerUri.toString() == matrixOrgUrl) {
|
||||
ServerType.MatrixOrg
|
||||
} else {
|
||||
serverTypeOverride ?: serverType
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -788,7 +814,6 @@ class LoginViewModel @AssistedInject constructor(
|
||||
else -> LoginMode.Unsupported
|
||||
}
|
||||
|
||||
// FIXME We should post a view event here normally?
|
||||
setState {
|
||||
copy(
|
||||
asyncHomeServerLoginFlowRequest = Uninitialized,
|
||||
@@ -803,6 +828,7 @@ class LoginViewModel @AssistedInject constructor(
|
||||
// Notify the UI
|
||||
_viewEvents.post(LoginViewEvents.OutdatedHomeserver)
|
||||
}
|
||||
_viewEvents.post(LoginViewEvents.OnLoginFlowRetrieved)
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -53,7 +53,7 @@ data class LoginViewState(
|
||||
val loginMode: LoginMode = LoginMode.Unknown,
|
||||
// Supported types for the login. We cannot use a sealed class for LoginType because it is not serializable
|
||||
@PersistState
|
||||
val loginModeSupportedTypes: List<String> = emptyList(),
|
||||
val loginModeSupportedTypes: List<String> = emptyList(),
|
||||
val knownCustomHomeServersUrls: List<String> = emptyList()
|
||||
) : MavericksState {
|
||||
|
||||
|
@@ -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)
|
||||
}
|
||||
|
@@ -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? {
|
||||
|
@@ -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
|
||||
}
|
||||
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -984,7 +984,7 @@
|
||||
<string name="command_description_op_user">Définit le rang d’un utilisateur</string>
|
||||
<string name="command_description_deop_user">Rétrograde l’utilisateur avec l’identifiant fourni</string>
|
||||
<string name="command_description_invite_user">Invite l’utilisateur avec l’identifiant fourni dans le salon actuel</string>
|
||||
<string name="command_description_join_room">Rejoint le salon avec l’alias fourni</string>
|
||||
<string name="command_description_join_room">Rejoint le salon avec l’adresse 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 l’utilisateur avec l’identifiant fourni</string>
|
||||
@@ -3009,4 +3009,7 @@
|
||||
<string name="space_participants_kick_prompt_msg">L’expulsion 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>
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -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>
|
||||
|
@@ -657,6 +657,8 @@
|
||||
<string name="login_error_unknown_host">This URL is not reachable, please check it</string>
|
||||
<string name="login_error_no_homeserver_found">This is not a valid Matrix server address</string>
|
||||
<string name="login_error_homeserver_not_found">Cannot reach a homeserver at this URL, please check it</string>
|
||||
<string name="login_error_homeserver_from_url_not_found">Cannot reach a homeserver at the URL %s. Please check your link or choose a homeserver manually.</string>
|
||||
<string name="login_error_homeserver_from_url_not_found_enter_manual">Choose homeserver</string>
|
||||
<string name="login_error_ssl_peer_unverified">"SSL Error: the peer's identity has not been verified."</string>
|
||||
<string name="login_error_ssl_other">"SSL Error."</string>
|
||||
<string name="login_error_ssl_handshake">Your device is using an outdated TLS security protocol, vulnerable to attack, for your security you will not be able to connect</string>
|
||||
|
Reference in New Issue
Block a user