diff --git a/CHANGES.md b/CHANGES.md index ece2a87304..640d56a9fd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,17 @@ +Changes in Element v1.2.0 (2021-08-12) +====================================== + +Features ✨ +---------- + - Reorganise Advanced Notifications in to Default Notifications, Keywords and Mentions, Other (This feature is hidden in the release ui until a future release date.) ([#3646](https://github.com/vector-im/element-android/issues/3646)) + - Voice Message - Enable by default, remove from labs ([#3817](https://github.com/vector-im/element-android/issues/3817)) + +Bugfixes 🐛 +---------- + - Voice Message - UI Improvements ([#3798](https://github.com/vector-im/element-android/issues/3798)) + - Stop VMs playing in the timeline if a new VM recording is started ([#3802](https://github.com/vector-im/element-android/issues/3802)) + + Changes in Element v1.1.16 (2021-08-09) ======================================= diff --git a/upstream_fastlane/metadata/android/cs-CZ/changelogs/40101150.txt b/upstream_fastlane/metadata/android/cs-CZ/changelogs/40101150.txt new file mode 100644 index 0000000000..e82655d352 --- /dev/null +++ b/upstream_fastlane/metadata/android/cs-CZ/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Hlavní změny v této verzi: implementace hlasových zpráv dosupných v rámci laboratoře. +Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/en-US/changelogs/40102000.txt b/upstream_fastlane/metadata/android/en-US/changelogs/40102000.txt new file mode 100644 index 0000000000..46d9b07809 --- /dev/null +++ b/upstream_fastlane/metadata/android/en-US/changelogs/40102000.txt @@ -0,0 +1,2 @@ +Main changes in this version: Voice Message is enabled by default. +Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.16 \ No newline at end of file diff --git a/upstream_fastlane/metadata/android/et/changelogs/40101150.txt b/upstream_fastlane/metadata/android/et/changelogs/40101150.txt new file mode 100644 index 0000000000..caab68c89f --- /dev/null +++ b/upstream_fastlane/metadata/android/et/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Põhilised muutused selles versioonis: häälsõnumid katsete all. +Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/fa/changelogs/40101150.txt b/upstream_fastlane/metadata/android/fa/changelogs/40101150.txt new file mode 100644 index 0000000000..46677551ef --- /dev/null +++ b/upstream_fastlane/metadata/android/fa/changelogs/40101150.txt @@ -0,0 +1,2 @@ +تغییرات اصلی در این نگارش: پیاده‌سازی پیام صوتی در تنظیمات آزمایشگاه‌ها. +گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/fa/short_description.txt b/upstream_fastlane/metadata/android/fa/short_description.txt index aba229f959..2925db47b7 100644 --- a/upstream_fastlane/metadata/android/fa/short_description.txt +++ b/upstream_fastlane/metadata/android/fa/short_description.txt @@ -1 +1 @@ -گپ و تماس نامتمرکز امن. داده‌هایتان را از اشخاص سوم امن نگه دارید. +پیام‌رسان گروهی - پیام‌رسانی رمزنگاشته، گپ گروهی و تماس‌های ویدیویی diff --git a/upstream_fastlane/metadata/android/fr-FR/changelogs/40101100.txt b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101100.txt new file mode 100644 index 0000000000..610f7765d6 --- /dev/null +++ b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101100.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : rafraîchissement des styles et des thèmes, et nouvelles fonctionnalités pour les espaces. +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.10 diff --git a/upstream_fastlane/metadata/android/fr-FR/changelogs/40101110.txt b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101110.txt new file mode 100644 index 0000000000..5a5db82f07 --- /dev/null +++ b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101110.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : rafraîchissement des styles et des thèmes, et nouvelles fonctionnalités pour les espaces (correction for 1.1.10). +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.11 diff --git a/upstream_fastlane/metadata/android/fr-FR/changelogs/40101120.txt b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101120.txt new file mode 100644 index 0000000000..b75ec7d3fe --- /dev/null +++ b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101120.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : rafraîchissement des styles et des thèmes, et correction d’un plantage après un appel vidéo. +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.12 diff --git a/upstream_fastlane/metadata/android/fr-FR/changelogs/40101130.txt b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101130.txt new file mode 100644 index 0000000000..7190eede74 --- /dev/null +++ b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101130.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : principalement des corrections de bogues et de stabilité. +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.13 diff --git a/upstream_fastlane/metadata/android/fr-FR/changelogs/40101140.txt b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101140.txt new file mode 100644 index 0000000000..ba1784b5fd --- /dev/null +++ b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101140.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : correction d’un problème concernant les messages chiffrés. +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.14 diff --git a/upstream_fastlane/metadata/android/fr-FR/changelogs/40101150.txt b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101150.txt new file mode 100644 index 0000000000..559dcc1f6a --- /dev/null +++ b/upstream_fastlane/metadata/android/fr-FR/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Principaux changements pour cette version : ajout des messages vocaux dans les expérimentations. +Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/id/changelogs/40101150.txt b/upstream_fastlane/metadata/android/id/changelogs/40101150.txt new file mode 100644 index 0000000000..f3aec557d0 --- /dev/null +++ b/upstream_fastlane/metadata/android/id/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Perubahan utama dalam versi ini: implementasi pesan suara dalam pengaturan labs. +Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/it-IT/changelogs/40101150.txt b/upstream_fastlane/metadata/android/it-IT/changelogs/40101150.txt new file mode 100644 index 0000000000..7a7eef5757 --- /dev/null +++ b/upstream_fastlane/metadata/android/it-IT/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Modifiche principali in questa versione: implementazione messaggi vocali nelle impostazioni Laboratori. +Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/pt-BR/changelogs/40101150.txt b/upstream_fastlane/metadata/android/pt-BR/changelogs/40101150.txt new file mode 100644 index 0000000000..3be1d63d46 --- /dev/null +++ b/upstream_fastlane/metadata/android/pt-BR/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Principais mudanças nesta versão: implementação de mensagem de voz em configurações labs. +Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/sv-SE/changelogs/40101100.txt b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101100.txt new file mode 100644 index 0000000000..bc7a6de663 --- /dev/null +++ b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101100.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: tema- och stiluppdatering och nya funktioner för utrymmen. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.10 diff --git a/upstream_fastlane/metadata/android/sv-SE/changelogs/40101110.txt b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101110.txt new file mode 100644 index 0000000000..176fd38769 --- /dev/null +++ b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101110.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: tema- och stiluppdatering och nya funktioner för utrymmen (buggfix för 1.1.10). +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.11 diff --git a/upstream_fastlane/metadata/android/sv-SE/changelogs/40101120.txt b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101120.txt new file mode 100644 index 0000000000..aeef7814ee --- /dev/null +++ b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101120.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: tema- och stiluppdatering och fixa en krasch efter videosamtal. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.12 diff --git a/upstream_fastlane/metadata/android/sv-SE/changelogs/40101130.txt b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101130.txt new file mode 100644 index 0000000000..def96d7315 --- /dev/null +++ b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101130.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: huvudsakligen stabilitets- och buggfixuppdatering. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.13 diff --git a/upstream_fastlane/metadata/android/sv-SE/changelogs/40101140.txt b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101140.txt new file mode 100644 index 0000000000..96203647b9 --- /dev/null +++ b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101140.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: fixa ett problem med krypterade meddelanden. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.14 diff --git a/upstream_fastlane/metadata/android/sv-SE/changelogs/40101150.txt b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101150.txt new file mode 100644 index 0000000000..db74658651 --- /dev/null +++ b/upstream_fastlane/metadata/android/sv-SE/changelogs/40101150.txt @@ -0,0 +1,2 @@ +Huvudsakliga ändringar i den här versionen: röstmeddelandeimplementation under experimentinställningar. +Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/upstream_fastlane/metadata/android/zh-TW/changelogs/40101150.txt b/upstream_fastlane/metadata/android/zh-TW/changelogs/40101150.txt new file mode 100644 index 0000000000..c730151fe7 --- /dev/null +++ b/upstream_fastlane/metadata/android/zh-TW/changelogs/40101150.txt @@ -0,0 +1,2 @@ +此版本中的主要變動:實驗室設定下,語音訊息的實作。 +完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.15 diff --git a/vector/build.gradle b/vector/build.gradle index 51f5b2c544..c1306290c7 100644 --- a/vector/build.gradle +++ b/vector/build.gradle @@ -13,8 +13,8 @@ kapt { // Note: 2 digits max for each value ext.versionMajor = 1 -ext.versionMinor = 1 -ext.versionPatch = 16 +ext.versionMinor = 2 +ext.versionPatch = 0 ext.scVersion = 39 @@ -144,6 +144,10 @@ android { resValue "bool", "useLoginV1", "true" resValue "bool", "useLoginV2", "false" + // NotificationSettingsV2 is disabled. To be released in conjunction with iOS/Web + resValue "bool", "useNotificationSettingsV1", "true" + resValue "bool", "useNotificationSettingsV2", "false" + buildConfigField "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy", "outboundSessionKeySharingStrategy", "im.vector.app.features.crypto.keysrequest.OutboundSessionKeySharingStrategy.WhenTyping" buildConfigField "Long", "VOICE_MESSAGE_DURATION_LIMIT_MS", "120_000L" diff --git a/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt b/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt old mode 100755 new mode 100644 index 2471c5f66c..1a7a79ed8c --- a/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt +++ b/vector/src/main/java/im/vector/app/core/preference/PushRulePreference.kt @@ -22,19 +22,10 @@ import android.view.View import android.widget.RadioGroup import androidx.preference.PreferenceViewHolder import im.vector.app.R +import im.vector.app.features.settings.notifications.NotificationIndex class PushRulePreference : VectorPreference { - enum class NotificationIndex(val index: Int) { - OFF(0), - SILENT(1), - NOISY(2); - - companion object { - fun fromInt(index: Int) = values().first { it.index == index } - } - } - /** * @return the selected push rule index */ @@ -66,7 +57,7 @@ class PushRulePreference : VectorPreference { */ private fun refreshSummary() { summary = context.getString(when (index) { - NotificationIndex.OFF -> R.string.notification_off + NotificationIndex.OFF -> R.string.notification_off NotificationIndex.SILENT -> R.string.notification_silent NotificationIndex.NOISY, null -> R.string.notification_noisy }) @@ -83,7 +74,7 @@ class PushRulePreference : VectorPreference { radioGroup?.setOnCheckedChangeListener(null) when (index) { - NotificationIndex.OFF -> { + NotificationIndex.OFF -> { radioGroup?.check(R.id.bingPreferenceRadioBingRuleOff) } NotificationIndex.SILENT -> { diff --git a/vector/src/main/java/im/vector/app/core/preference/VectorCheckboxPreference.kt b/vector/src/main/java/im/vector/app/core/preference/VectorCheckboxPreference.kt new file mode 100644 index 0000000000..13b65e11b4 --- /dev/null +++ b/vector/src/main/java/im/vector/app/core/preference/VectorCheckboxPreference.kt @@ -0,0 +1,45 @@ +/* + * 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.preference + +import android.content.Context +import android.util.AttributeSet +import android.widget.TextView +import androidx.preference.CheckBoxPreference +import androidx.preference.PreferenceViewHolder + +class VectorCheckboxPreference : CheckBoxPreference { + // Note: @JvmOverload does not work here... + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes) + + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) + + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + + constructor(context: Context) : super(context) + + init { + // Set to false to remove the space when there is no icon + isIconSpaceReserved = true + } + + override fun onBindViewHolder(holder: PreferenceViewHolder) { + // display the title in multi-line to avoid ellipsis. + (holder.findViewById(android.R.id.title) as? TextView)?.isSingleLine = false + super.onBindViewHolder(holder) + } +} 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 81fe75f646..c7c5511b96 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 @@ -989,7 +989,7 @@ class RoomDetailFragment @Inject constructor( autoCompleter.exitSpecialMode() views.composerLayout.collapse() - views.voiceMessageRecorderView.isVisible = text.isBlank() && vectorPreferences.labsUseVoiceMessage() + views.voiceMessageRecorderView.isVisible = text.isBlank() && vectorPreferences.useVoiceMessage() updateComposerText(text) views.composerLayout.views.sendButton.contentDescription = getString(R.string.send) @@ -1062,6 +1062,9 @@ class RoomDetailFragment @Inject constructor( notificationDrawerManager.setCurrentRoom(roomDetailArgs.roomId) roomDetailPendingActionStore.data?.let { handlePendingAction(it) } roomDetailPendingActionStore.data = null + + // Removed listeners should be set again + setupVoiceMessageView() } private fun handlePendingAction(roomDetailPendingAction: RoomDetailPendingAction) { @@ -1327,7 +1330,7 @@ class RoomDetailFragment @Inject constructor( } override fun onTextBlankStateChanged(isBlank: Boolean) { - if (!views.composerLayout.views.sendButton.isVisible && vectorPreferences.labsUseVoiceMessage()) { + if (!views.composerLayout.views.sendButton.isVisible && vectorPreferences.useVoiceMessage()) { // Animate alpha to prevent overlapping with the animation of the send button views.voiceMessageRecorderView.alpha = 0f views.voiceMessageRecorderView.isVisible = true @@ -1347,7 +1350,6 @@ class RoomDetailFragment @Inject constructor( if (text.isNotBlank()) { // We collapse ASAP, if not there will be a slight annoying delay views.composerLayout.collapse(true) - views.voiceMessageRecorderView.isVisible = vectorPreferences.labsUseVoiceMessage() lockSendButton = true roomDetailViewModel.handle(RoomDetailAction.SendMessage(text, vectorPreferences.isMarkdownEnabled())) emojiPopup.dismiss() @@ -1401,10 +1403,10 @@ class RoomDetailFragment @Inject constructor( if (state.canSendMessage) { if (!views.voiceMessageRecorderView.isActive()) { views.composerLayout.isVisible = true - views.voiceMessageRecorderView.isVisible = vectorPreferences.labsUseVoiceMessage() && views.composerLayout.text?.isBlank().orFalse() + views.voiceMessageRecorderView.isVisible = vectorPreferences.useVoiceMessage() && views.composerLayout.text?.isBlank().orFalse() views.composerLayout.setRoomEncrypted(summary.isEncrypted) views.notificationAreaView.render(NotificationAreaView.State.Hidden) - views.composerLayout.alwaysShowSendButton = !vectorPreferences.labsUseVoiceMessage() + views.composerLayout.alwaysShowSendButton = !vectorPreferences.useVoiceMessage() } } else { views.composerLayout.isVisible = false diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt index 6826ae6afd..7f1c4f0759 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/composer/VoiceMessageRecorderView.kt @@ -20,6 +20,7 @@ import android.content.Context import android.text.format.DateUtils import android.util.AttributeSet import android.view.MotionEvent +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isInvisible import androidx.core.view.isVisible @@ -87,6 +88,15 @@ class VoiceMessageRecorderView @JvmOverloads constructor( initListeners() } + override fun onVisibilityChanged(changedView: View, visibility: Int) { + super.onVisibilityChanged(changedView, visibility) + if (changedView == this && visibility == VISIBLE) { + views.voiceMessageMicButton.contentDescription = context.getString(R.string.a11y_start_voice_message) + } else { + views.voiceMessageMicButton.contentDescription = "" + } + } + fun initVoiceRecordingViews() { recordingState = RecordingState.NONE @@ -211,6 +221,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor( } RecordingState.CANCELLED -> { hideRecordingViews(isCancelled = true) + vibrate(context) } RecordingState.LOCKED -> { if (isRecordingStateChanged) { // Do not update views if it was already in locked state. @@ -222,6 +233,9 @@ class VoiceMessageRecorderView @JvmOverloads constructor( } RecordingState.STARTED -> { showRecordingViews() + val translationAmount = distanceX.coerceAtMost(distanceToCancel) + views.voiceMessageMicButton.translationX = -translationAmount * rtlXMultiplier + views.voiceMessageSlideToCancel.translationX = -translationAmount / 2 * rtlXMultiplier } RecordingState.NONE -> Timber.d("VoiceMessageRecorderView shouldn't be in NONE state while moving.") RecordingState.PLAYBACK -> Timber.d("VoiceMessageRecorderView shouldn't be in PLAYBACK state while moving.") @@ -237,9 +251,9 @@ class VoiceMessageRecorderView @JvmOverloads constructor( if (recordingState == RecordingState.STARTED) { // Determine if cancelling or locking for the first move action. if (((currentX < firstX && rtlXMultiplier == 1) || (currentX > firstX && rtlXMultiplier == -1)) - && distanceX > distanceY) { + && distanceX > distanceY && distanceX > lastDistanceX) { recordingState = RecordingState.CANCELLING - } else if (currentY < firstY && distanceY > distanceX) { + } else if (currentY < firstY && distanceY > distanceX && distanceY > lastDistanceY) { recordingState = RecordingState.LOCKING } } else if (recordingState == RecordingState.CANCELLING) { @@ -518,12 +532,14 @@ class VoiceMessageRecorderView @JvmOverloads constructor( } is VoiceMessagePlaybackTracker.Listener.State.Playing -> { views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause) + views.voicePlaybackControlButton.contentDescription = context.getString(R.string.a11y_pause_voice_message) val formattedTimerText = DateUtils.formatElapsedTime((state.playbackTime / 1000).toLong()) views.voicePlaybackTime.text = formattedTimerText } is VoiceMessagePlaybackTracker.Listener.State.Paused, is VoiceMessagePlaybackTracker.Listener.State.Idle -> { views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) + views.voicePlaybackControlButton.contentDescription = context.getString(R.string.a11y_play_voice_message) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt index 1196a845e3..446d4161e3 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/VoiceMessagePlaybackTracker.kt @@ -68,7 +68,8 @@ class VoiceMessagePlaybackTracker @Inject constructor() { .forEach { key -> val state = states[key] if (state is Listener.State.Playing) { - setState(key, Listener.State.Paused(state.playbackTime)) + // Paused(state.playbackTime) state should also be considered later. + setState(key, Listener.State.Idle) } } } diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt index d733085e70..76cb9d1c25 100644 --- a/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt +++ b/vector/src/main/java/im/vector/app/features/home/room/detail/timeline/item/MessageVoiceItem.kt @@ -74,6 +74,7 @@ abstract class MessageVoiceItem : AbsMessageItem() { contentUploadStateTrackerBinder.bind(attributes.informationData.eventId, izLocalFile, holder.progressLayout) } else { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_cross) + holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.error_voice_message_unable_to_play) holder.progressLayout.isVisible = false } @@ -101,16 +102,19 @@ abstract class MessageVoiceItem : AbsMessageItem() { private fun renderIdleState(holder: Holder) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) + holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(duration) } private fun renderPlayingState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Playing) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause) + holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_pause_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) } private fun renderPausedState(holder: Holder, state: VoiceMessagePlaybackTracker.Listener.State.Paused) { holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play) + holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message) holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime) } diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt index 07253658c8..b1b9ccfa70 100755 --- a/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorPreferences.kt @@ -156,8 +156,6 @@ class VectorPreferences @Inject constructor(private val context: Context) { const val SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE = "SETTINGS_LABS_USE_RESTRICTED_JOIN_RULE" const val SETTINGS_LABS_SPACES_HOME_AS_ORPHAN = "SETTINGS_LABS_SPACES_HOME_AS_ORPHAN" - const val SETTINGS_LABS_VOICE_MESSAGE = "SETTINGS_LABS_VOICE_MESSAGE" - private const val SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY = "SETTINGS_DEVELOPER_MODE_PREFERENCE_KEY" private const val SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY = "SETTINGS_LABS_SHOW_HIDDEN_EVENTS_PREFERENCE_KEY" private const val SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY = "SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY" @@ -204,6 +202,7 @@ class VectorPreferences @Inject constructor(private val context: Context) { private const val SETTINGS_USER_COLOR_MODE_DEFAULT = "SETTINGS_USER_COLOR_MODE_DEFAULT" private const val SETTINGS_USER_COLOR_MODE_PUBLIC_ROOM = "SETTINGS_USER_COLOR_MODE_PUBLIC_ROOM" private const val SETTINGS_OPEN_CHATS_AT_FIRST_UNREAD = "SETTINGS_OPEN_CHATS_AT_FIRST_UNREAD" + private const val SETTINGS_VOICE_MESSAGE = "SETTINGS_VOICE_MESSAGE" private const val DID_ASK_TO_ENABLE_SESSION_PUSH = "DID_ASK_TO_ENABLE_SESSION_PUSH" @@ -1003,6 +1002,11 @@ class VectorPreferences @Inject constructor(private val context: Context) { return defaultPrefs.getBoolean(SETTINGS_OPEN_CHATS_AT_FIRST_UNREAD, false) } + // Element removed this, SC added it back (but this time, default to true) + fun useVoiceMessage(): Boolean { + return defaultPrefs.getBoolean(SETTINGS_VOICE_MESSAGE, true) + } + /** * The user enable protecting app access with pin code. * Currently we use the pin code store to know if the pin is enabled, so this is not used @@ -1100,8 +1104,4 @@ class VectorPreferences @Inject constructor(private val context: Context) { putInt(TAKE_PHOTO_VIDEO_MODE, mode) } } - - fun labsUseVoiceMessage(): Boolean { - return defaultPrefs.getBoolean(SETTINGS_LABS_VOICE_MESSAGE, false) - } } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/NotificationIndex.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/NotificationIndex.kt new file mode 100644 index 0000000000..29d316bb76 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/NotificationIndex.kt @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.notifications + +import org.matrix.android.sdk.api.pushrules.rest.PushRule +import org.matrix.android.sdk.api.pushrules.toJson + +enum class NotificationIndex { + OFF, + SILENT, + NOISY; +} + +/** + * Given a push rule determine the NotificationIndex by comparing it to the static push rule definitions. + * Used when determining the selected state of the PushRulePreference. + */ +val PushRule.notificationIndex: NotificationIndex? get() = + NotificationIndex.values().firstOrNull { + // Get the actions for the index + val standardAction = getStandardAction(this.ruleId, it) ?: return@firstOrNull false + val indexActions = standardAction.actions ?: listOf() + // Check if the input rule matches a rule generated from the static rule definitions + val targetRule = this.copy(enabled = standardAction != StandardActions.Disabled, actions = indexActions.toJson()) + ruleMatches(this, targetRule) + } + +/** + * A check to determine if two push rules should be considered a match. + */ +private fun ruleMatches(rule: PushRule, targetRule: PushRule): Boolean { + // Rules match if both are disabled, or if both are enabled and their highlight/sound/notify actions match up. + return (!rule.enabled && !targetRule.enabled) + || (rule.enabled + && targetRule.enabled + && rule.getHighlight() == targetRule.getHighlight() + && rule.getNotificationSound() == targetRule.getNotificationSound() + && rule.shouldNotify() == targetRule.shouldNotify() + && rule.shouldNotNotify() == targetRule.shouldNotNotify()) +} diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt index 2d1bd4d5e5..dd9077508e 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/PushRuleDefinitions.kt @@ -16,76 +16,75 @@ package im.vector.app.features.settings.notifications -import im.vector.app.core.preference.PushRulePreference import org.matrix.android.sdk.api.pushrules.RuleIds -fun getStandardAction(ruleId: String, index: PushRulePreference.NotificationIndex): StandardActions? { +fun getStandardAction(ruleId: String, index: NotificationIndex): StandardActions? { return when (ruleId) { RuleIds.RULE_ID_CONTAIN_DISPLAY_NAME -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.Disabled - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.HighlightDefaultSound + NotificationIndex.OFF -> StandardActions.Disabled + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.HighlightDefaultSound } RuleIds.RULE_ID_CONTAIN_USER_NAME -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.Disabled - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.HighlightDefaultSound + NotificationIndex.OFF -> StandardActions.Disabled + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.HighlightDefaultSound } RuleIds.RULE_ID_ROOM_NOTIF -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.Disabled - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.Highlight + NotificationIndex.OFF -> StandardActions.Disabled + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.Highlight } RuleIds.RULE_ID_ONE_TO_ONE_ROOM -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.DontNotify - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound + NotificationIndex.OFF -> StandardActions.DontNotify + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound } RuleIds.RULE_ID_ONE_TO_ONE_ENCRYPTED_ROOM -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.DontNotify - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound + NotificationIndex.OFF -> StandardActions.DontNotify + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound } RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.DontNotify - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound + NotificationIndex.OFF -> StandardActions.DontNotify + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound } RuleIds.RULE_ID_ENCRYPTED -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.DontNotify - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound + NotificationIndex.OFF -> StandardActions.DontNotify + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound } RuleIds.RULE_ID_INVITE_ME -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.Disabled - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound + NotificationIndex.OFF -> StandardActions.Disabled + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound } RuleIds.RULE_ID_CALL -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.Disabled - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.NotifyRingSound + NotificationIndex.OFF -> StandardActions.Disabled + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.NotifyRingSound } RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.DontNotify - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Disabled - PushRulePreference.NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound + NotificationIndex.OFF -> StandardActions.DontNotify + NotificationIndex.SILENT -> StandardActions.Disabled + NotificationIndex.NOISY -> StandardActions.NotifyDefaultSound } RuleIds.RULE_ID_TOMBSTONE -> when (index) { - PushRulePreference.NotificationIndex.OFF -> StandardActions.Disabled - PushRulePreference.NotificationIndex.SILENT -> StandardActions.Notify - PushRulePreference.NotificationIndex.NOISY -> StandardActions.Highlight + NotificationIndex.OFF -> StandardActions.Disabled + NotificationIndex.SILENT -> StandardActions.Notify + NotificationIndex.NOISY -> StandardActions.Highlight } else -> null } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsAdvancedNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsAdvancedNotificationPreferenceFragment.kt index c6f7e5db89..93a788f528 100644 --- a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsAdvancedNotificationPreferenceFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsAdvancedNotificationPreferenceFragment.kt @@ -18,16 +18,13 @@ package im.vector.app.features.settings.notifications import androidx.lifecycle.lifecycleScope import androidx.preference.Preference import im.vector.app.R -import im.vector.app.core.preference.PushRulePreference.NotificationIndex import im.vector.app.core.preference.PushRulePreference import im.vector.app.core.preference.VectorPreference import im.vector.app.core.utils.toast import im.vector.app.features.settings.VectorSettingsBaseFragment import kotlinx.coroutines.launch import org.matrix.android.sdk.api.pushrules.RuleIds -import org.matrix.android.sdk.api.pushrules.rest.PushRule import org.matrix.android.sdk.api.pushrules.rest.PushRuleAndKind -import org.matrix.android.sdk.api.pushrules.toJson import javax.inject.Inject class VectorSettingsAdvancedNotificationPreferenceFragment @Inject constructor() @@ -41,7 +38,6 @@ class VectorSettingsAdvancedNotificationPreferenceFragment @Inject constructor() for (preferenceKey in prefKeyToPushRuleId.keys) { val preference = findPreference(preferenceKey) if (preference is PushRulePreference) { - // preference.isEnabled = null != rules && isConnected && pushManager.areDeviceNotificationsAllowed() val ruleAndKind: PushRuleAndKind? = session.getPushRules().findDefaultRule(prefKeyToPushRuleId[preferenceKey]) if (ruleAndKind == null) { @@ -49,7 +45,7 @@ class VectorSettingsAdvancedNotificationPreferenceFragment @Inject constructor() preference.isVisible = false } else { preference.isVisible = true - val initialIndex = getNotificationIndexForRule(ruleAndKind.pushRule) + val initialIndex = ruleAndKind.pushRule.notificationIndex preference.setIndex(initialIndex) preference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> val newIndex = newValue as NotificationIndex @@ -87,28 +83,6 @@ class VectorSettingsAdvancedNotificationPreferenceFragment @Inject constructor() } } - private fun getNotificationIndexForRule(rule: PushRule): NotificationIndex? { - return NotificationIndex.values().firstOrNull { - // Get the actions for the index - val standardAction = getStandardAction(rule.ruleId, it) ?: return@firstOrNull false - val indexActions = standardAction.actions ?: listOf() - // Check if the input rule matches a rule generated from the static rule definitions - val targetRule = rule.copy(enabled = standardAction != StandardActions.Disabled, actions = indexActions.toJson()) - ruleMatches(rule, targetRule) - } - } - - private fun ruleMatches(rule: PushRule, targetRule: PushRule): Boolean { - // Rules match if both are disabled, or if both are enabled and their highlight/sound/notify actions match up. - return (!rule.enabled && !targetRule.enabled) - || (rule.enabled - && targetRule.enabled - && rule.getHighlight() == targetRule.getHighlight() - && rule.getNotificationSound() == targetRule.getNotificationSound() - && rule.shouldNotify() == targetRule.shouldNotify() - && rule.shouldNotNotify() == targetRule.shouldNotNotify()) - } - private fun refreshDisplay() { listView?.adapter?.notifyDataSetChanged() } diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsDefaultNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsDefaultNotificationPreferenceFragment.kt new file mode 100644 index 0000000000..7d6b74b093 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsDefaultNotificationPreferenceFragment.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.notifications + +import im.vector.app.R +import org.matrix.android.sdk.api.pushrules.RuleIds + +class VectorSettingsDefaultNotificationPreferenceFragment + : VectorSettingsPushRuleNotificationPreferenceFragment() { + + override var titleRes: Int = R.string.settings_notification_default + + override val preferenceXmlRes = R.xml.vector_settings_notification_default + + override val prefKeyToPushRuleId = mapOf( + "SETTINGS_PUSH_RULE_MESSAGES_IN_ONE_TO_ONE_PREFERENCE_KEY" to RuleIds.RULE_ID_ONE_TO_ONE_ROOM, + "SETTINGS_PUSH_RULE_MESSAGES_IN_GROUP_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS, + "SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_ONE_ONE_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ONE_TO_ONE_ENCRYPTED_ROOM, + "SETTINGS_PUSH_RULE_MESSAGES_IN_E2E_GROUP_CHAT_PREFERENCE_KEY" to RuleIds.RULE_ID_ENCRYPTED + ) +} diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsKeywordAndMentionsNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsKeywordAndMentionsNotificationPreferenceFragment.kt new file mode 100644 index 0000000000..37acc1d898 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsKeywordAndMentionsNotificationPreferenceFragment.kt @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.notifications + +import im.vector.app.R +import org.matrix.android.sdk.api.pushrules.RuleIds + +class VectorSettingsKeywordAndMentionsNotificationPreferenceFragment + : VectorSettingsPushRuleNotificationPreferenceFragment() { + + override var titleRes: Int = R.string.settings_notification_mentions_and_keywords + + override val preferenceXmlRes = R.xml.vector_settings_notification_mentions_and_keywords + + override val prefKeyToPushRuleId = mapOf( + "SETTINGS_PUSH_RULE_CONTAINING_MY_DISPLAY_NAME_PREFERENCE_KEY" to RuleIds.RULE_ID_CONTAIN_DISPLAY_NAME, + "SETTINGS_PUSH_RULE_CONTAINING_MY_USER_NAME_PREFERENCE_KEY" to RuleIds.RULE_ID_CONTAIN_USER_NAME, + "SETTINGS_PUSH_RULE_MESSAGES_CONTAINING_AT_ROOM_PREFERENCE_KEY" to RuleIds.RULE_ID_ROOM_NOTIF + ) +} diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsOtherNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsOtherNotificationPreferenceFragment.kt new file mode 100644 index 0000000000..42203fb613 --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsOtherNotificationPreferenceFragment.kt @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.notifications + +import im.vector.app.R +import org.matrix.android.sdk.api.pushrules.RuleIds + +class VectorSettingsOtherNotificationPreferenceFragment + : VectorSettingsPushRuleNotificationPreferenceFragment() { + + override var titleRes: Int = R.string.settings_notification_other + + override val preferenceXmlRes = R.xml.vector_settings_notification_other + + override val prefKeyToPushRuleId = mapOf( + "SETTINGS_PUSH_RULE_INVITED_TO_ROOM_PREFERENCE_KEY" to RuleIds.RULE_ID_INVITE_ME, + "SETTINGS_PUSH_RULE_CALL_INVITATIONS_PREFERENCE_KEY" to RuleIds.RULE_ID_CALL, + "SETTINGS_PUSH_RULE_MESSAGES_SENT_BY_BOT_PREFERENCE_KEY" to RuleIds.RULE_ID_SUPPRESS_BOTS_NOTIFICATIONS, + "SETTINGS_PUSH_RULE_ROOMS_UPGRADED_KEY" to RuleIds.RULE_ID_TOMBSTONE + ) +} diff --git a/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationPreferenceFragment.kt b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationPreferenceFragment.kt new file mode 100644 index 0000000000..6f28876e1d --- /dev/null +++ b/vector/src/main/java/im/vector/app/features/settings/notifications/VectorSettingsPushRuleNotificationPreferenceFragment.kt @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2021 New Vector Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package im.vector.app.features.settings.notifications + +import androidx.lifecycle.lifecycleScope +import androidx.preference.Preference +import im.vector.app.core.preference.VectorCheckboxPreference +import im.vector.app.core.utils.toast +import im.vector.app.features.settings.VectorSettingsBaseFragment +import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.pushrules.rest.PushRuleAndKind + +abstract class VectorSettingsPushRuleNotificationPreferenceFragment + : VectorSettingsBaseFragment() { + + abstract val prefKeyToPushRuleId: Map + + override fun bindPref() { + for (preferenceKey in prefKeyToPushRuleId.keys) { + val preference = findPreference(preferenceKey)!! + val ruleAndKind: PushRuleAndKind? = session.getPushRules().findDefaultRule(prefKeyToPushRuleId[preferenceKey]) + if (ruleAndKind == null) { + // The rule is not defined, hide the preference + preference.isVisible = false + } else { + preference.isVisible = true + val initialIndex = ruleAndKind.pushRule.notificationIndex + preference.isChecked = initialIndex != NotificationIndex.OFF + preference.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { _, newValue -> + val newIndex = if (newValue as Boolean) NotificationIndex.NOISY else NotificationIndex.OFF + val standardAction = getStandardAction(ruleAndKind.pushRule.ruleId, newIndex) ?: return@OnPreferenceChangeListener false + val enabled = standardAction != StandardActions.Disabled + val newActions = standardAction.actions + displayLoadingView() + + lifecycleScope.launch { + val result = runCatching { + session.updatePushRuleActions(ruleAndKind.kind, + ruleAndKind.pushRule.ruleId, + enabled, + newActions) + } + if (!isAdded) { + return@launch + } + hideLoadingView() + result.onSuccess { + preference.isChecked = newValue + } + result.onFailure { failure -> + // Restore the previous value + refreshDisplay() + activity?.toast(errorFormatter.toHumanReadable(failure)) + } + } + + false + } + } + } + } + + private fun refreshDisplay() { + listView?.adapter?.notifyDataSetChanged() + } +} diff --git a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestPushRulesSettings.kt b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestPushRulesSettings.kt index 8dcf9ab6ce..eea5705b7a 100644 --- a/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestPushRulesSettings.kt +++ b/vector/src/main/java/im/vector/app/features/settings/troubleshoot/TestPushRulesSettings.kt @@ -35,11 +35,6 @@ class TestPushRulesSettings @Inject constructor(private val activeSessionHolder: RuleIds.RULE_ID_ONE_TO_ONE_ROOM, RuleIds.RULE_ID_ALL_OTHER_MESSAGES_ROOMS) - val ruleSettingsName = arrayOf(R.string.settings_containing_my_display_name, - R.string.settings_containing_my_user_name, - R.string.settings_messages_in_one_to_one, - R.string.settings_messages_in_group_chat) - override fun perform(activityResultLauncher: ActivityResultLauncher) { val session = activeSessionHolder.getSafeActiveSession() ?: return val pushRules = session.getPushRules().getAllRules() diff --git a/vector/src/main/res/layout/vector_preference_push_rule.xml b/vector/src/main/res/layout/vector_preference_push_rule.xml index 5242bfdf85..3da5c81410 100644 --- a/vector/src/main/res/layout/vector_preference_push_rule.xml +++ b/vector/src/main/res/layout/vector_preference_push_rule.xml @@ -76,4 +76,3 @@ - diff --git a/vector/src/main/res/layout/view_voice_message_recorder.xml b/vector/src/main/res/layout/view_voice_message_recorder.xml index ceb16eb071..75196865bd 100644 --- a/vector/src/main/res/layout/view_voice_message_recorder.xml +++ b/vector/src/main/res/layout/view_voice_message_recorder.xml @@ -40,7 +40,7 @@ android:scaleType="center" android:src="@drawable/ic_send" android:visibility="gone" - app:tint="?android:textColorHint" + app:tint="?android:colorPrimary" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" tools:ignore="MissingPrefix" diff --git a/vector/src/main/res/values-cs/strings.xml b/vector/src/main/res/values-cs/strings.xml index eb789fc158..2c7d6133b8 100644 --- a/vector/src/main/res/values-cs/strings.xml +++ b/vector/src/main/res/values-cs/strings.xml @@ -2794,7 +2794,7 @@ Založit prostor Hledat jméno Kdokoli v prostoru s touto místností ji může nalézt a vstoupit. Jen správci místnosti ji mohou připojit k prostoru. - Prostory + Pouze členové prostoru Kdokoli může místnost nalézt a vstoupit Veřejná Pouze pozvaní mohou místnost nalézt a vstoupit @@ -2903,4 +2903,36 @@ %d zmeškané hlasové hovory %d zmeškaných hlasových hovorů + 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 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 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í + Nelze nahrát hlasovou zprávu + Nelze přehrát tuto hlasovou zprávu + Povolit hlasovou zprávu + %1$ds zbývá + Podržením nahrajte, uvolněním odešlete + Odstranit nahranou hlasovou zprávu + Nahrát hlasovou zprávu + Pozastavit hlasovou zprávu + Přehrát hlasovou zprávu + Zámek hlasové zprávy + Posunutím zrušíte + Zahájení hlasové zprávy + Hlasová zpráva + 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é) + Chcete-li odesílat hlasové zprávy, povolte oprávnění mikrofonu. \ No newline at end of file diff --git a/vector/src/main/res/values-et/strings.xml b/vector/src/main/res/values-et/strings.xml index c1c412b6ba..34ab82acd2 100644 --- a/vector/src/main/res/values-et/strings.xml +++ b/vector/src/main/res/values-et/strings.xml @@ -2741,7 +2741,7 @@ Pole kontrollitud Otsi nime alusel Kõik sellise kogukonnakeskuse liikmed, kuhu see jututuba kuulub, võivad seda leida ja temaga liituda. Ainult selle jututoa haldajad võivad teda kogukonnakeskusesse liita. - Kogukonnakeskused + Vaid kogukonna liikmetele Kõik võivad jututuba leida ja sellega liituda Avalik Jututuba saab leida ja sellega liituda vaid kutsete alusel @@ -2848,4 +2848,16 @@ Vastamata kõne %d vastamata kõnet + Vajalik on uuendus + Muud kogukonnad ja jututoad, mida sa ei pruugi teada + Sulle teadaolevad kogukonnad, milles osaleb see jututuba + %s kogukonna liikmed saavad leida, vaadata eelvaadet ja liituda. + Vali kes saavad seda kogukonda leida ja võivad temaga liituda. + Kogukondade muutmiseks klõpsi + Vali kogukonnad + Vali mis kogukonnad pääsevad ligi sellele jututoale. Valitud kogukonna liikmed saavad seda jututuba leida ja temaga liituda. + Kogukonnad, mis pääsevad ligi + Luba kogukonna liikmetel leida ja vaadata. + Privaatne (vaid kutse alusel) + Häälsõnumite saatmiseks palun anna rakendusele õigus mikrofoni kasutada. \ No newline at end of file diff --git a/vector/src/main/res/values-fa/strings.xml b/vector/src/main/res/values-fa/strings.xml index 0e3a186ff6..a085d4c08e 100644 --- a/vector/src/main/res/values-fa/strings.xml +++ b/vector/src/main/res/values-fa/strings.xml @@ -990,7 +990,7 @@ عادی محرمانگی کاهش‌یافته کاره برای اجرا در پس‌زمینه نیاز به اجازه دارد - کاره در پس‌زمینه، به وصل شدن به کارساز خانگی نیاز ندارد. این کار نصرف باتری را کاهش می‌دهد + کاره در پس‌زمینه، به وصل شدن به کارساز خانگی نیاز ندارد. این کار مصرف باتری را کاهش می‌دهد صدای آگاهی گزینش رنگ چراغ، لرزش، صدا و… پیام‌های شامل نام نمایشی @@ -1476,7 +1476,7 @@ ورود جدید. خودتان بودید؟ برای بازبینی و تأیید بزنید من نبودم - تأیید افزاره‌هایتان از تنظیمات. + تأیید لغو شد. می‌توانید تأیید را دوباره آغاز کنید. تأیید لغو شد عبارت عبور بازیابی کلید پیام @@ -1726,9 +1726,9 @@ برنامه Push دریافت کرد برنامه منتظر دریافت Push است تست ‌Push - ثبت توکن FCM در سرور موفقیت آمیز نبود: + شکست در ثبت ژتون FCM در کارساز خانگی: \n%1$s - توکن FCM با موفقیت در سرور ثبت شد. + ژتون FCM با موفقیت در کارساز خانگی ثبت شد. ثبت توکن افزودن حساب کاربری [%1$s] @@ -2100,7 +2100,7 @@ پیام پاک شد به نظر در تلاش برای وصل شدن به کارساز خانگی دیگری هستید. می‌خواهید خارج شوید؟ برای بازنشانی گذرواژه‌ی خود نیاز به پیکربندی سرور هویت‌سنجی دارید. - شما از سرور هویت‌سنجی استفاده نمی‌کنید + از هیچ کارساز هویتی استفاده نمی‌کنید خطای نامشخص عدم تطابق کاربر عدم تطابق کلید @@ -2200,7 +2200,7 @@ کلیدهای رمزگذاری شما اکنون در پس زمینه در حال پشتیبان‌گیری بر روی سرور است. تهیه نسخه‌ی پشتیبان اولیه ممکن است چند دقیقه طول بکشد. در حال تولید کلید پشتیبان با استفاده از کلید امنیتی، این ممکن است چند ثانیه زمان ببرد. به نظر می‌رسد شما در یک نشست دیگر کلید پشتیبان تهیه کرده‌اید. آیا می‌خواهید آن را با موردی که ایجاد می‌کنید جایگزین کنید؟ - یک نسخه‌ی پشتیبان از قبل در سرور وجود دارد + از پیش، پشتیبانی روی کارساز خانگیتان وجود دارد کلید بازیابی ذخیره شد. کلید بازیابی در \\\'%s\\\' ذخیره شده است. \n @@ -2443,9 +2443,9 @@ آغاز به گپ برون‌ریزی بازرسی اگر اتاق فقط برای تعامل با افراد داخل سرور خانه شما می‌باشد، این قابلیت را فعال کنید. این تنظیم را بعدا نمی‌توانید تغییر دهید. - آیا می‌خواهید جهت کشف مخاطبینی که می شناسید، داده های مخاطب خود را (شماره تلفن و ایمیل) به سرور هویت‌سنجی(%1$s) ارسال کنید؟ + با فرستادن داده‌های آشنایانتان (شماره‌های تلفن و/یا رایانامه‌ها) به کارساز هویت پیکربندی شده (%1$s) برای کشف آشنایان موجود، موافقت می‌کنید؟ \n -\nبرای حفظ حریم خصوصی بیشتر، داده‌ها قبل از ارسال هش می‌شوند. +\nبرای محرمانگی بیش‌تر، داده‌ها پیش از ارسال، درهم ریخته می‌شوند. یک کلید امنیتی ایجاد کنید تا در مکانی امن مانند سامانه مدیریت رمز عبور یا گاوصندوق آن را ذخیره کنید. در حال حاضر هیچ ارتباطی با این شناسه وجود ندارد. هویت خود را تأیید کنید تا به پیام‌های رمز شده دسترسی پیدا کنید. @@ -2650,16 +2650,16 @@ لیترال‌های آی‌پی برای تطبیق سرور هم‌اکنون ممنوع شد. لیترال‌های آی‌پی برای تطبیق سرور هم‌اکنون اجازه داده‌شد. تطبیق سرور %s از لیست موارد مجاز حذف گردید. - تطبیق سرور %s هم‌اکنون اجازه داده‌شد. + • اکنون‌کارسازهای مطابق با %s مجاز شده‌اند. تطبیق سرور %s از لیست ممنوعیت‌ها حذف شد. - تطبیق سرور %s هم‌اکنون ممنوع شد. + • اکنون کارسازهای مطابق با %s تحریم شده‌اند. شما سطح کنترل دسترسی این اتاق را تغییر دادید. لیترال‌های آی‌پی برای تطبیق سرور اجازه داده شده‌است. %s سطح کنترل دسترسی‌ها برای این اتاق را بر روی سرور تنظیم کرد. %s سطح کنترل دسترسی برای این اتاق را تغییر داد. لیترال‌های آی‌پی برای تطبیق سرور ممنوع است. - تطبیق سرور %s اجازه داده شده‌است. - تطبیق سرور %s ممنوع شده‌است. + • کارسازهای مطابق با %s مجازند. + • کارسازهای مطابق با %s تحریم شده‌اند. شما ACL های سرور را برای این اتاق تنظیم کردید. مطمئنید که می‌خواهید تمام پیام‌های فرستاده نشده در این اتاق را حذف کنید؟ حذف پیام‌های فرستاده نشده @@ -2729,7 +2729,7 @@ مطمئن شوید که افراد درست به %s دسترسی دارند. می‌توانید بعدها این را تغییر دهید. ساخت یک فضا هر کسی در فضای این اتاق، می‌تواند اتاق را یافته و به آن بپیوندد. فقط مدیران این اتاق می توانند آن را به فضایی بیفزایند. - فضا‌ها + فقط اعضای فضا فضا‌ها با چه کسانی کار می‌کنی؟ برای پیوستن به یک فضای موجود، نیاز به دعوت دارید. @@ -2840,4 +2840,40 @@ \nمی‌توانید فضاهای موجود را به فضایی بیفزایید. فضای آزمایشی - فقط نمایش یتسم‌ها در خانه مشاوره با %1$s + پیام صوتی (%1$s) + نمی‌توان هنگام فعّال بودن پیام صوتی، پاسخ داد یا ویراست + نمی‌توان پیام صوتی ضبط کرد + نمی‌توان این پیام صوتی را پخش کرد + به کار انداختن پیام صوتی + برای توقّف یا شمیدن، روی ضبطتان بزنید + %1$dث مانده + برای ضبط نگه دارید. برای فرستادن رها کنید + حذف پیام صوتی ضبط‌شده + ضبط کردن پیام صوتی + مکث پیام صوتی + پخش پیام صوتی + قفل پیام صوتی + برای لغو، بکشید + آغاز پیام صوتی + نیازمند ارتقا + صدا + دیگر فضاها یا اتاق‌هایی که ممکن است نشناسید + فضاهایی که می‌دانید شامل این اتاقند + تصمیم بگیرید چه کسانی می‌توانند این اتاق را یافته و به آن بپیوندند. + برای ویرایش فضاها، ضربه بزنید + گزینش فضاها + تصمیم بگیرید چه فضاهایی می‌توانند به این اتاق دسترسی داشته باشند.اگر فضایی گزیده سود، اعضایش قادر خواهند بود نام اتاق را یافته و به آن بپیوندند. + فضاهایی که می‌توانند دسترسی داشته باشند + اجازه به اعضای فضا برای یافتن و دسترسی. + اعضای فضای %s می‌توانند یافته، دیده و بپیوندند. + خصوصی (فقط با دعوت) + + تماس تصویری بی‌پاسخ + %d تماس تصویری بی‌پاسخ + + + تماس صوتی بی‌پاسخ + %d تماس صوتی بی‌پاسخ + + لطفاً برای فرستادن پیام صوتی، اجازهٔ میکروفون را اعطا کنید. \ No newline at end of file diff --git a/vector/src/main/res/values-fr/strings.xml b/vector/src/main/res/values-fr/strings.xml index 30e4866f27..801015fdc8 100644 --- a/vector/src/main/res/values-fr/strings.xml +++ b/vector/src/main/res/values-fr/strings.xml @@ -2692,7 +2692,7 @@ Décoché Rechercher par nom Tout membre d’un espace contenant ce salon peut le trouver et le rejoindre. Seuls les administrateurs de ce salon peuvent l’ajouter à un espace. - Espaces + Seulement pour les membres de l\'espace Tout le monde peut trouver ce salon et le rejoindre Public Seules les personnes invitées peuvent le trouver et le rejoindre @@ -2855,4 +2855,36 @@ Permissions manquantes Pour effectuer cette action, veuillez autoriser la permission Caméra depuis les réglages système. Certaines permissions manquent pour effectuer cette action, veuillez autoriser ces permissions depuis les réglages système. + Veuillez noter que la mise-à-jour créera une nouvelle version de ce salon. Tous les messages existants seront conservés dans ce salon archivé. + Quiconque dans l’espace parent pourra trouver et rejoindre ce salon – pas besoin d’inviter les gens un par un. Vous pourrez changer cela à n’importe quel moment dans les réglages du salon. + Quiconque dans %s pourra trouver et rejoindre ce salon – pas besoin d’inviter les gens un par un. Vous pourrez changer cela à n’importe quel moment dans les réglages du salon. + Message vocal (%1$s) + Impossible de répondre ou d’éditer tant qu’un message vocal est actif + Impossible d’enregistrer un message vocal + Impossible de lire ce message vocal + Activer les messages vocaux + Touchez l’enregistrement pour l’arrêter ou l’écouter + %1$ds restant + Maintenir pour enregistrer, relâcher pour envoyer + Supprimer l’enregistrement du message vocal + Enregistrement du message vocal + Mettre en pause le message vocal + Lire le message vocal + Verrou de message vocal + Glisser pour annuler + Démarrer un message vocal + Autoriser quiconque dans %s à trouver et venir. Vous pouvez également sélectionner d’autres espaces. + Mise-à-jour nécessaire + Vocal + Autres espaces ou salons que vous ne connaissez peut-être pas + Espace que vous connaissez dont ce salon fait partie + Choisir qui peut trouver et rejoindre ce salon. + Toucher pour modifier les espaces + Sélectionner des espaces + Choisir les espaces pouvant accéder à ce salon. Si un espace est sélectionné, ces membres pourront trouver et rejoindre le salon. + Espaces pouvant accéder + Autoriser les membres de l’espace à trouver et venir. + Les membres de l’espace %s peuvent trouver, prévisualiser et venir. + Privé (seulement sur invitation) + Pour envoyer des messages vocaux, veuillez accorder la permission Microphone. \ No newline at end of file diff --git a/vector/src/main/res/values-in/strings.xml b/vector/src/main/res/values-in/strings.xml index 1f2b5cfe81..c0d421f493 100644 --- a/vector/src/main/res/values-in/strings.xml +++ b/vector/src/main/res/values-in/strings.xml @@ -983,4 +983,356 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan. Anda mengirim gambar. %1$s mengirim gambar. %1$s: %2$s + Dioptimalkan untuk real-time + ${app_name} akan mengsinkron di latar belakang dengan cara yang akan mempertahankan sumber daya (baterai) yang terbatas. +\nTergantung pada keadaan sumber daya perangkat Anda, sinkronisasi dapat ditangguhkan oleh operasi sistem. + Dioptimalkan untuk baterai + Mode Sinkronisasi Latar Belakang + Aplikasinya tidak perlu menghubung ke homeserver di latar belakang, itu seharusnya akan mengurangi penggunaan baterai + Pemberitahuannya telah ditekan! + Silakan tekan notifikasinya. Jika Anda tidak melihat notifikasinya, silakan periksa pengaturan sistem. + Tampilan Pemberitahuan + Anda melihat pemberitahuan ini! Tekan saya! + Aplikasi ini sedang menunggu push + Aplikasi ini menerima push + Gagal menerima push. Solusinya adalah untuk menginstal ulang aplikasi. + Percobaan Push + Pastikan Anda mengklik tautan di email yang telah kami kirimkan kepada Anda. + Hapus %s\? + Diperlukan otentikasi + Anda tidak dapat melakukan ini dari ponsel ${app_name} + Konfirmasi password Anda + Tidak ada nomor telepon yang ditambahkan ke akun Anda + Pencarian di ruangan terenkripsi belum didukung. + Meng-filter pengguna yang dicekal + Mengubah topik + Meng-upgrade ruangan ini + Mengirim event m.room.server_acl + Mengirim pesan + Mengundang pengguna + Meng-kick pengguna + Mencekal pengguna + Mengubah izin + Mengubah nama ruangan + Mengubah visibilitas sejarah + Mengaktifkan enkripsi ruangan + Mengubah alamat utama untuk ruangan ini + Mengubah avatar ruangan + Mengubah widget + Beritahu semuanya + Menghapus pesan yang dikirim dari yang lain + Mengubah pengaturan + Role bawaan + Anda tidak diizinkan untuk memperbarui peran yang diperlukan untuk mengubah berbagai bagian ruangan + Pilih role yang diperlukan untuk mengubah berbagai bagian ruangan + Izin + Lihat dan perbarui role yang diperlukan untuk mengubah berbagai bagian ruangan. + Izin ruangan + Membatalkan pencekalan pengguna akan mengizinkan mereka untuk bergabung ke ruangan. + Batalkan pencekalan pengguna + Alasan untuk mencekal + Cekal pengguna + Pengguna yang di-kick akan menghilangkannya dari ruangan ini. +\n +\nUntuk mencegah mereka bergabung lagi, Anda seharusnya mencekalnya. + Alasan untuk meng-kick + Kick user + Apakah Anda yakin ingin membatalkan undangan untuk pengguna ini\? + Batalkan undangan + Membatalkan abaian pengguna ini akan menampilkan semua pesan dari mereka. + Batal pengabaian pengguna + Mengabaikan pengguna ini akan menghilangkan pesan mereka dari ruangan yang Anda bagikan. +\n +\nAnda dapat membalikkan tindakan ini kapan saja dalam pengaturan umum. + Abaikan pengguna + Turunkan + Anda tidak akan dapat membatalkan perubahan ini karena Anda menurunkan diri sendiri, jika Anda adalah pengguna istimewa terakhir di ruangan itu akan tidak mungkin untuk mendapatkan kembali hak istimewa. + Turunkan dirimu\? + Batalkan undangan + Ruangan ini tidak umum. Anda tidak akan dapat bergabung kembali tanpa undangan. + Tambahkan server identitas dalam pengaturan Anda untuk melakukan tindakan ini. + Lanjutkan + Izinkan untuk mengakses kontak. + Untuk dapat meng-scan kode QR, Anda harus mengizinkan akses kamera. + Anda menjeda panggilan + %s menjeda panggilan + Jeda + Lanjut + Kembali ke panggilan + Panggilan Aktif (%s) + + %d panggilan video yang terjawab + + + %d panggilan audio yang terjawab + + Akan menggunakan %s sebagai bantuan ketika homeserver Anda tidak menawarkannya (alamat IP Anda akan dibagikan selama panggilan) + Izinkan menggunakan server bantuan panggilan sebagai fallback + Meminta untuk konfirmasi sebelum memulai panggilan + Cegah panggilan tidak disengaja + Tidak sah, tidak ada kredensial otentikasi yang valid + Perangkat Anda menggunakan protokol keamanan TLS yang sudah usang, yang rentan terhadap serangan, untuk keamanan Anda tidak akan dapat menghubung + Kesalahan SSL. + Kesalahan SSL: identitas peer belum diverifikasi. + Tidak dapat mencapai homeserver pada URL ini, silakan periksa + Ini bukan alamat server Matrix yang valid + URL ini tidak dapat dijangkau, silakan periksa + Nomor telepon ini sudah ditentukan. + Tetapkan surel untuk pemulihan akun. Gunakan surel atau nomor telepon nanti untuk dapat ditemukan oleh orang-orang yang mengenal Anda secara opsional. + Tetapkan surel untuk pemulihan akun. Gunakan surel atau nomor telepon nanti untuk dapat ditemukan oleh orang-orang yang mengenal Anda secara opsional. + Tetapkan nomor telepon, dan nanti dapat ditemukan oleh orang-orang yang mengenal Anda secara opsional. + Tetapkan surel untuk pemulihan akun, dan nanti dapat ditemukan oleh orang-orang yang mengenal Anda secara opsional. + Masuk dengan single sign-on + Gunakan sebagai bawaan dan jangan tanya lagi + Selalu tanya + Nyalakan HD + Matikan HD + Belakang + Depan + Ganti Kamera + Headset Wireless + Headset + Speaker + Ponsel + Pilih Perangkat Suara + Gagal membangun koneksi real-time. +\nSilakan minta administrator homeserver Anda untuk mengkonfigurasi server TURN agar panggilan untuk bekerja dengan andal. + ${app_name} Panggilan Gagal + Jangan tanya saya lagi + Coba menggunakan %s + Silakan minta administrator homeserver Anda (%1$s) untuk mengkonfigurasi server TURN agar panggilan dapat bekerja dengan andal. +\n +\nAtau, Anda dapat mencoba menggunakan server publik di %2$s, tetapi ini tidak akan dapat diandalkan, dan itu akan membagikan alamat IP Anda dengan server itu. Anda juga dapat mengelola ini dalam Pengaturan. + Panggilan gagal karena konfigurasi server yang salah + URL API homeserver + Kirim sejarah permintaan pemberian kunci + Spaces + Undangan + Tampilkan semua ruangan di direktori ruangan, termasuk ruangan dengan konten eksplisit. + Tampilkan ruangan dengan konten eksplisit + Direktori ruangan + Tidak ada server identitas yang dikonfigurasi. + Tidak ada hasil lainnya + Ruangan yang Disarankan + Notifikasi + Nilai baru + Sukses + Kembali + Tidak Dipublikasikan + Ganti + Tambah + Salin + Tandai sebagai terbaca + Tutup Telepon + Tolak + Terima + Tolak + Tinjauan + Abaikan + Gagal menghapus widget + Gagal menambahkan widget + Anda tidak dapat melakukan panggilan dengan diri sendiri, tunggu untuk peserta untuk menerima undangan + Anda tidak dapat melakukan panggilan dengan diri sendiri + Pertemuan menggunakan kebijakan keamanan dan izin Jitsi. Semua orang saat ini berada di ruangan akan melihat undangan untuk bergabung saat pertemuan Anda sedang berlangsung. + Mulai rapat video + Mulai rapat audio + Konferensi sudah berlangsung! + Anda tidak memiliki izin untuk memulai panggilan + Anda tidak memiliki izin untuk memulai panggilan di ruangan ini + Anda tidak memiliki izin untuk memulai panggilan konferensi + Anda tidak memiliki izin untuk memulai panggilan konferensi di ruangan ini + Tidak ada izin + Untuk mengirim pesan suara, silakan berikan izin Mikrofon. + Untuk melakukan tindakan ini, silakan berikan izin Kamera dari pengaturan sistem. + Beberapa izin hilang untuk melakukan tindakan ini, mohon berikan izin dari pengaturan sistem. + Mulai Mengobrol + Atur Ulang + Hilangkan + Jeda + Mainkan + Putuskan + Batalkan + Tidak Ada + Tetap + Verifikasi sesi + Inisialisasi layanan + Standar Sistem + Anda mengaktifkan enkripsi ujung-ke-ujung. (algoritma tidak dikenali %1$s). + %1$s mengaktifkan enkripsi ujung-ke-ujung. (algoritma tidak dikenali %2$s). + Anda mengaktifkan enkripsi ujung-ke-ujung. + %1$s mengaktifkan enkripsi ujung-ke-ujung. + Anda telah mencegah para tamu untuk bergabung ruangan. + %1$s telah mencegah para tamu untuk bergabung ruangan. + Anda telah mencegah para tamu untuk bergabung ruangan. + %1$s telah mencegah para tamu untuk bergabung ruangan. + %1$s telah mengizinkan para tamu untuk bergabung ruangan. + Anda telah mengizinkan para tamu untuk bergabung ruangan. + Anda telah mengizinkan para tamu untuk bergabung disini. + %1$s telah mengizinkan para tamu untuk bergabung disini. + Anda mengubah alamat untuk ruangan ini. + %1$s mengubah alamat untuk ruangan ini. + Anda mengubah alamat utama dan alamat alternatif untuk ruangan ini. + %1$s mengubah alamat utama dan alamat alternatif untuk ruangan ini. + Anda mengubah alamat alternatif untuk ruangan ini. + %1$s mengubah alamat alternatif untuk ruangan ini. + + Anda menghapus alamat alternatif %1$s untuk ruangan ini. + + + %1$s menghapus alamat alternatif %2$s untuk ruangan ini. + + + Anda menambahkan alamat alternatif %1$s untuk ruangan ini. + + + %1$s menambahkan alamat alternatif %2$s untuk ruangan ini. + + Anda menghapus alamat utama untuk ruangan ini. + %1$s menghapus alamat utama untuk ruangan ini. + Anda menetapkan alamat utama untuk ruangan ini sebagai %1$s. + %1$s menetapkan alamat utama untuk ruangan ini sebagai %2$s. + Anda menambahkan %1$s dan menghapus %2$s sebagai alamat untuk ruangan ini. + %1$s menambahkan %2$s dan menghapus %3$s sebagai alamat untuk ruangan ini. + + Anda menghapus %2$s sebagai alamat untuk ruangan ini. + + + %1$s menghapus %2$s sebagai alamat untuk ruangan ini. + + + Anda menambahkan %1$s sebagai alamat untuk ruangan ini. + + + %1$s menambahkan %2$s sebagai alamat untuk ruangan ini. + + Anda menarik undangan %1$s. Alasan: %2$s + %1$s menarik undangan %2$s. Alasan: %3$s + Anda menerima undangan untuk %1$s. Alasan: %2$s + %1$s menerima undangan untuk %2$s. Alasan: %3$s + Anda membatalkan undangan untuk %1$s untuk bergabung ruangan. Alasan: %2$s + %1$s membatalkan undangan untuk %2$s untuk bergabung ruangan. Alasan: %3$s + Anda mengirim undangan ke %1$s untuk bergabung ruangan. Alasan: %2$s + %1$s mengirim undangan ke %2$s untuk bergabung ruangan. Alasan: %3$s + Anda mencekal %1$s. Alasan: %2$s + %1$s mencekal %2$s. Alasan: %3$s + %1$s membatalkan pencekalan %2$s. Alasan: %3$s + Anda membatalkan pencekalan %1$s. Alasan: %2$s + Anda meng-kick %1$s. Alasan: %2$s + %1$s meng-kick %2$s. Alasan: %3$s + Anda menolak undangan. Alasan: %1$s + %1$s menolak undangan. Alasan: %2$s + Anda meninggalkan ruangan. Alasan: %1$s + %1$s meninggalkan ruangan. Alasan: %2$s + Anda meninggalkan ruangan. Alasan: %1$s + %1$s meninggalkan ruangan. Alasan: %2$s + Anda bergabung. Alasan %1$s + %1$s bergabung. Alasan %2$s + %1$s bergabung ruangan. Alasan: %2$s + %1$s mengundang Anda. Alasan: %2$s + Anda mengundang %1$s. Alasan: %2$s + Anda bergabung ruangan. Alasan %1$s + %1$s mengundang %2$s. Alasan: %3$s + Undangan Anda. Alasan: %1$s + Undangan %1$s. Alasan: %2$s + Bersihkan antrian kiriman + Mengirim pesan… + Pesan terkirim + Sinkronisasi Awal: +\nMengimpor Data Akun + Sinkronisasi Awal: +\nMengimpor Komunitas + Sinkronisasi Awal: +\nMengimpor Ruangan yang Ditinggalkan + Sinkronisasi Awal: +\nMengimpor Ruangan yang Diundang + Sinkronisasi Awal: +\nMengimpor Ruangan Tergabung + Sinkronisasi Awal: +\nMengimpor Ruangan + Sinkronisasi awal: +\nMengimpor crypto + %1$s mengubah tingkat daya %2$s. + Sinkronisasi Awal: +\nMengimpor akun… + Sinkronisasi Awal: +\nMengunduh data… + Sinkronisasi Awal: +\nMenunggu respons server… + Ruangan kosong (tadi adalah %s) + + %1$s, %2$s, %3$s, dan %4$d lainnya + + %1$s, %2$s, %3$s, dan %4$s + %1$s, %2$s, dan %3$s + Nomor telepon + Surel + Saat ini tidak mungkin untuk bergabung kembali ke ruangan kosong. + Kesalahan Matrix + Kesalahan jaringan + Tidak dapat mengunggah gambar + Tidak dapat dihapus + Tidak dapat mengirim pesan + Perangkat pengirim belum mengirimi kami kunci untuk pesan ini. + ** Tidak dapat mendekripsi: %s ** + %1$s dari %2$s ke %3$s + Anda mengubah tingkat daya %1$s. + Kustom + Kustom (%1$d) + Standar + Moderator + Admin + Anda mengubah konferensi video + Konferensi video diubah oleh %1$s + Anda mengakhiri konferensi video + Konferensi video diakhiri oleh %1$s + Anda memulai konferensi video + Konferensi video dimulai oleh %1$s + Anda mengubah widget %1$s + %1$s mengubah widget %2$s + Anda menghapus widget %1$s + %1$s menghapus widget %2$s + Anda menambahkan widget %1$s + %1$s menambahkan widget %2$s + Anda menerima undangan untuk %1$s + %1$s menerima undangan untuk %2$s + Anda membatalkan undangan untuk %1$s + %1$s membatalkan undangan untuk %2$s + Anda membatalkan undangan untuk %1$s untuk bergabung ruangan + %1$s membatalkan undangan untuk %2$s untuk bergabung ruangan + Anda mengundang %1$s + %1$s mengundang %2$s + Anda mengirimkan undangan ke %1$s untuk bergabung ruangan + %1$s mengirimkan undangan ke %2$s untuk bergabung ruangan + Anda memperbarui profil Anda %1$s + %1$s memperbarui profil mereka %2$s + Pesan dihapus oleh %1$s [alasan: %2$s] + Pesan dihapus [alasan: %1$s] + Pesan dihapus oleh %1$s + Pesan dihapus + Anda menghapus avatar ruangan + %1$s menghapus avatar ruangan + Anda menghapus topik ruangan + %1$s menghapus topik ruangan + Anda menghapus nama ruangan + %1$s menghapus nama ruangan + (avatar juga diubah) + VoIP conference selesai + Konferensi VoIP dimulai + Anda meminta konferensi VoIP + %1$s meminta konferensi VoIP + 🎉 Semua server dilarang untuk berpartisipasi! Ruangan ini tidak lagi bisa digunakan. + Tidak ada berubahan. + Nomor telepon + Tidak ada surel yang ditambahkan ke akun Anda + Surel + • Server yang cocok dengan literal IP sekarang dilarang. + • Server yang cocok dengan %s sekarang dilarang. + • Server yang cocok dengan literal IP dilarang. + • Server yang cocok dengan IP literal sekarang diizinkan. + • Server yang cocok dengan %s telah dihapus dari daftar izin. + • Server yang cocok dengan %s sekarang telah diizinkan. + • Server yang cocok dengan %s dihapus dari daftar larangan. + Anda mengubah ACL server untuk ruangan ini. + %s mengubah ACL server untuk ruangan ini. + • Server yang cocok dengan IP literal diizinkan. \ No newline at end of file diff --git a/vector/src/main/res/values-it/strings.xml b/vector/src/main/res/values-it/strings.xml index 2412655b91..542c66210f 100644 --- a/vector/src/main/res/values-it/strings.xml +++ b/vector/src/main/res/values-it/strings.xml @@ -2795,7 +2795,7 @@ Deselezionato Cerca nome Chiunque in uno Spazio con questa stanza può trovarla ed entrarci. Solo gli amministratori della stanza possono aggiungerla ad uno Spazio. - Spazi + Spazio solo per membri Chiunque può trovarla ed entrare Pubblica Solo le persone invitate possono trovarla ed entrare @@ -2902,4 +2902,36 @@ Telefonata persa %d telefonate perse + Nota che aggiornare creerà una nuova versione della stanza. Tutti i messaggi attuali resteranno in questa stanza archiviata. + Chiunque in uno spazio superiore potrà trovare ed entrare in questa stanza - non serve invitare a mano tutti. Potrai cambiare questa cosa nelle impostazioni della stanza in qualsiasi momento. + Chiunque in %s potrà trovare ed entrare in questa stanza - non serve invitare a mano tutti. Potrai cambiare questa cosa nelle impostazioni della stanza in qualsiasi momento. + Messaggio vocale (%1$s) + Impossibile rispondere o modificare mentre un messaggio vocale è attivo + Impossibile registrare un messaggio vocale + Impossibile riprodurre questo messaggio vocale + Attiva messaggio vocale + Tocca la registrazione per fermare o ascoltare + %1$ds rimasti + Tieni premuto per registrare, rilascia per inviare + Elimina messaggio vocale registrato + Registrazione messaggio vocale + Pausa messaggio vocale + Inizia messaggio vocale + Riproduci messaggio vocale + Blocco messaggio vocale + Scorri per annullare + Permetti a chiunque in %s di trovare ed accedere. Puoi selezionare anche altri spazi. + Aggiornamento necessario + Vocale + Altri spazi o stanze che potresti non conoscere + Spazi di cui sai che contengono questa stanza + Decidi chi può trovare ed entrare in questa stanza. + Tocca per modificare gli spazi + Seleziona spazi + Decidi quali spazi possono accedere a questa stanza. Se uno spazio è selezionato, i suoi membri potranno trovare ed entrare nella stanza. + Spazi che possono accedere + Permetti ai membri dello spazio di trovare ed accedere. + I membri dello spazio %s possono trovare, vedere l\'anteprima ed entrare. + Privata (solo a invito) + Per inviare messaggi vocali, consenti l\'autorizzazione del microfono. \ No newline at end of file diff --git a/vector/src/main/res/values-pt-rBR/strings.xml b/vector/src/main/res/values-pt-rBR/strings.xml index baa83642f6..5f48b464ac 100644 --- a/vector/src/main/res/values-pt-rBR/strings.xml +++ b/vector/src/main/res/values-pt-rBR/strings.xml @@ -2743,7 +2743,7 @@ Limite de upload de arquivo do servidor Qualquer pessoa num espaço com esta sala pode encontrá-la e juntar-se a ela. Somente admins desta sala podem adicioná-la a um espaço. - Espaços + Membros de espaço somente Qualquer pessoa pode encontrar a sala e juntar-se Pública Somente pessoas convidadas podem encontrar e juntar-se @@ -2918,4 +2918,36 @@ Chamadad de áudio perdida %d chamadas de áudio perdidas + Por favor note que fazer upgrade vai fazer uma nova versão da sala. Todas as mensagens atuais vão permanecer nesta sala arquivada. + Qualquer pessoa em um espaço pai vai ser capaz de encontrar e juntar-se a esta sala - não precisa convidar manualmente todo mundo. Você vai ser capaz de mudar isto em configurações de sala a qualquer hora. + Qualquer pessoa em %s vai ser capaz de encontrar e juntar-se a esta sala - não precisa convidar todo mundo. Você vai ser capaz de mudar isto em configurações de sala a qualquer hora. + Mensagem de Voz (%1$s) + Não dá para responder ou editar enquanto mensagem de voz está ativa + Não dá para gravar uma mensagem de voz + Não dá para tocar esta mensagem de voz + Habilitar mensagem de voz + Toque em sua gravação para parar ou escutar + %1$ds restando + Segure para gravar, solte para enviar + Deletar mensagem de voz gravada + Gravando mensagem de voz + Pausar Mensagem de Voz + Tocar Mensagem de Voz + Cadeado de Mensagem de Voz + Deslize para cancelar + Começar Mensagem de Voz + Permitir qualquer pessoa em %s a encontrar e acessar. Você pode selecionar outros espaços também. + Upgrade Requerido + Voz + Outros espaços ou salas que você poderia não saber + Espaço que você sabe que contém esta sala + Decida quem pode encontrar e juntar-se a esta sala. + Toque para editar espaços + Selecionar espaços + Decida que espaços podem acessar esta sala. Se um espaço é selecionado seus membros vão ser capazes de encontrar e juntar-se a Nome de sala. + Espaços que podem acessar + Permitir membros de espaço a encontrar e acessar. + Membros de Escpaço %s podem encontrar, previsualizar e juntar-se. + Privada (Convite Somente) + Para enviar mensagens de voz, por favor conceda a permissão Microfone. \ No newline at end of file diff --git a/vector/src/main/res/values-sq/strings.xml b/vector/src/main/res/values-sq/strings.xml index c8f0c7e676..de8fe29d7e 100644 --- a/vector/src/main/res/values-sq/strings.xml +++ b/vector/src/main/res/values-sq/strings.xml @@ -2729,7 +2729,7 @@ Krijoni një Hapësirë Kërko Për Emër Cilido në një hapësirë me këtë dhomë mund ta kërkojë dhe hyjë në të. Vetëm përgjegjësit e kësaj dhome mund ta shtojnë te një hapësirë. - Hapësira + Vetëm anëtarë të hapësirës Kushdo mund ta gjejë dhomën dhe të hyjë në të Publike Vetëm personat e ftuar mund ta gjejnë dhe hyjnë në të @@ -2838,4 +2838,36 @@ Thirrje audio e humbur %d thirrje audio të humbura + Ju lutemi, kini parasysh se përmirësimi do të prodhojë një version të ri të dhomës. Krejt mesazhet e tanishëm do të mbeten në këtë dhomë të arkivuar. + Cilido në një hapësirë mëmë do të jetë në gjendje ta gjejë dhe hyjë në këtë dhomë - s’ka nevojë të ftohen dorazi një e nga një. Do të jeni në gjendje ta ndryshoni këtë te rregullimet e dhomës, në çfarëdo kohe. + Cilido te %s do të jetë në gjendje të gjejë dhe hyjë në këtë dhomë - s’ka nevojë të ftohen dorazi një e nga një. Do të jeni në gjendje ta ndryshoni këtë te rregullimet e kësaj dhome, në çfarëdo kohe. + Mesazh Zanor (%1$s) + S’mund të përgjigjet ose përpunohet, ndërkohë që mesazhi zanor është aktiv + S’incizohet dot një mesazh zanor + Ky mesazh zanor s’mund të luhet + Aktivizo mesazh zanor + Që ta ndalni ose ta dëgjoni, prekni mbi incizimin tuaj + Edhe %1$ds + Mbajeni, që të incizojë, lëshojeni që të dërgohet + Fshije mesazhin zanor të incizuar + Po incizohet mesazh zanor + Ndalni Mesazh Zanor + Luani Mesazh Zanor + Kyçje Mesazhi Zanor + Rrëshqiteni që të anulohet + Nisni Mesazh Zanor + Lejo cilindo te %s ta gjejë dhe hyjë. Mund të përzgjidhni edhe hapësira të tjera. + Lypset Domosdo Përmirësim + + Hapësira ose dhoma të tjera që mund të mos i dini + Hapësirë që e dini se përmban këtë dhomë + Vendosni se cilët mund të gjejnë dhe hyjnë në këtë dhomë. + Që të përpunoni hapësira, prekeni + Përzgjidhni hapësira + Vendosni se prej cilave hapësira mund të hyhet në këtë dhomë. Nëse përzgjidhet një hapësirë, anëtarët e saj do të mund ta gjejnë dhe hyjnë te emër Dhome. + Hapësira nga të cilat mund të hyhet + Lejo anëtarë hapësirash ta gjejnë dhe hyjnë. + Anëtarë të Hapësirës %s mund ta gjejnë, parashohin dhe hyjnë në të. + Private (Vetëm Me Ftesa) + Për të dërguar mesazhe zanorë, ju lutemi, akordoni leje Mikrofoni. \ No newline at end of file diff --git a/vector/src/main/res/values-sv/strings.xml b/vector/src/main/res/values-sv/strings.xml index 6e8ef5fad5..4d7326ee83 100644 --- a/vector/src/main/res/values-sv/strings.xml +++ b/vector/src/main/res/values-sv/strings.xml @@ -2811,4 +2811,6 @@ \nVi kommer att förbättra detta som en del av betan, men ville låta dig veta. Lagkamratsutrymmen är inte riktigt färdiga men du kan ändå testa dem Fortsätt ändå + För att utföra detta, vänligen ge kameraåtkomst från systeminställningarna. + Vissa behörigheter saknas för att utföra detta, vänligen ge behörighet från systeminställningarna. \ No newline at end of file diff --git a/vector/src/main/res/values-zh-rCN/strings.xml b/vector/src/main/res/values-zh-rCN/strings.xml index 4240546c3b..bec726a7f8 100644 --- a/vector/src/main/res/values-zh-rCN/strings.xml +++ b/vector/src/main/res/values-zh-rCN/strings.xml @@ -2708,7 +2708,7 @@ 离开当前的回忆并切换至其他会议? 抱歉,在尝试加入会议时发生了错误 所有在此空间中的人都可以找到并加入它。仅有此聊天室的管理员可以将其添加到空间中。 - 空间 + 仅空间成员 任何人都能找到聊天室并加入 公开 仅有被邀请的人才能找到并加入 @@ -2803,4 +2803,36 @@ %d 个未接音频电话 + 请注意,升级将使聊天室焕然一新。 所有当前消息都将保留在此存档的聊天室中。 + 主空间中的任何人都可以找到并加入此房间 - 无需手动邀请所有人。 您可以随时在聊天室设置中更改此设置。 + %s 中的任何人将可以查找并加入此房间 - 无需手动邀请所有人。 您可以随时在聊天室设置中更改此设置。 + 语音消息 (%1$s) + 语音消息处于活动状态时无法回复或编辑 + 无法录制语音消息 + 无法播放此语音消息 + 启用语音消息 + 点按您的录音以停止或收听 + 剩余 %1$d秒 + 按住录音,松开发送 + 删除录制的语音消息 + 录制语音消息 + 暂停语音消息 + 播放语音消息 + 语音消息锁 + 滑动取消 + 开始语音消息 + 允许 %s 中的任何人查找和访问。 您也可以选择其他空间。 + 需要升级 + 语音 + 您可能不知道的其他空间或聊天室 + 你知道的包含这个聊天室的空间 + 决定谁能找到并加入这个聊天室。 + 点按即可编辑空间 + 选择空间 + 决定哪些空间可以进入这个房间。 如果选择了一个空间,其成员将能够找到并加入房间名称。 + 可访问的空间 + 允许空间成员查找和访问。 + %s 空间的成员可找到、预览和加入。 + 私人(仅限邀请) + 要发送语音消息,请授予麦克风权限。 \ No newline at end of file diff --git a/vector/src/main/res/values-zh-rTW/strings.xml b/vector/src/main/res/values-zh-rTW/strings.xml index e8b056fd66..693250c153 100644 --- a/vector/src/main/res/values-zh-rTW/strings.xml +++ b/vector/src/main/res/values-zh-rTW/strings.xml @@ -2689,7 +2689,7 @@ 未檢查 搜尋名稱 擁有此聊天室空間中的任何人都可以尋找並加入。僅此聊天室的管理員可以將其新增到空間中。 - 空間 + 僅空間成員 任何人都可以尋找聊天室並加入 公開 僅被邀請的夥伴可以尋找並加入 @@ -2793,4 +2793,36 @@ %d 通未接聽通話 + 請注意,升級會讓聊天室變為新的版本。目前的所有訊息都將保留在此被封存的聊天室中。 + 上層空間中的任何人都可以找到並加入此聊天室,不需要手動邀請所有人。您隨時都可以在聊天室設定中變更此設定。 + 任何在 %s 中的人都可以找到並加入此聊天室,不需要手動邀請所有人。您隨時都可以在聊天室設定中變更此設定。 + 語音訊息 (%1$s) + 語音訊息作用中時無法回覆或編輯 + 無法錄製語音訊息 + 無法播放此語音訊息 + 啟用語音訊息 + 點擊您的錄音以停止或收聽 + 剩下%1$d秒 + 按住以錄製,放開以傳送 + 刪除已錄製的語音訊息 + 正在錄製語音訊息 + 暫停語音訊息 + 播放語音訊息 + 語音訊息鎖定 + 滑動以取消 + 開始語音訊息 + 允許任何在 %s 中的人都可以找到並存取。您也可以選取其他空間。 + 必須升級 + 語音 + 您可能不知道的其他空間或聊天室 + 您所知的包含此聊天是的空間 + 決定誰可以找到並加入此聊天室。 + 點擊以編輯空間 + 選取空間 + 決定哪些空間可以存取此聊天室。若選取了某個空間,其成員就可以找到並加入此聊天室。 + 可以存取的空間 + 允許空間成員尋找並存取。 + 空間 %s 的成員可以找到、預覽並加入。 + 私人(僅邀請) + 要傳送語音訊息,請授予「麥克風」權限。 \ No newline at end of file diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 5999ac74ab..7d873f3e3a 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -1088,6 +1088,12 @@ Advanced Notification Settings Notification importance by event + Default Notifications + Mentions and Keywords + Other + + Notify me for + Notification privacy Troubleshoot Notifications Troubleshooting diagnostics @@ -1212,15 +1218,28 @@ Configure Silent Notifications Choose LED color, vibration, sound… - + Encrypted messages in one-to-one chats + Encrypted messages in group chats + When rooms are upgraded Msgs containing my display name Msgs containing my user name Msgs in one-to-one chats Msgs in group chats When I’m invited to a room - Call invitations Messages sent by bot + Messages containing my display name + Messages containing my username + Direct messages + Encrypted direct messages + Group messages + Encrypted group messages + Messages containing @room + Room invitations + Call invitations + Messages by bot + Room upgrades + Background synchronization Background Sync Mode Optimized for battery @@ -2982,10 +3001,6 @@ Failed to import keys Notifications configuration - Messages containing @room - Encrypted messages in one-to-one chats - Encrypted messages in group chats - When rooms are upgraded Troubleshoot Set notification importance by event diff --git a/vector/src/main/res/values/strings_sc.xml b/vector/src/main/res/values/strings_sc.xml index e5de7cee99..d11b50ad0e 100644 --- a/vector/src/main/res/values/strings_sc.xml +++ b/vector/src/main/res/values/strings_sc.xml @@ -87,6 +87,9 @@ Open at first unread Open chats at the first unread message instead of at the bottom. + Voice messages + Show a button to record voice messages + Light green Dark green diff --git a/vector/src/main/res/xml/vector_settings_labs.xml b/vector/src/main/res/xml/vector_settings_labs.xml index acb85022fd..c3c1142c99 100644 --- a/vector/src/main/res/xml/vector_settings_labs.xml +++ b/vector/src/main/res/xml/vector_settings_labs.xml @@ -63,6 +63,12 @@ android:key="SETTINGS_LABS_ENABLE_SWIPE_TO_REPLY" android:title="@string/labs_swipe_to_reply_in_timeline" /> + + - - diff --git a/vector/src/main/res/xml/vector_settings_notification_advanced_preferences.xml b/vector/src/main/res/xml/vector_settings_notification_advanced_preferences.xml index 4e9a9b07bf..436858ac05 100644 --- a/vector/src/main/res/xml/vector_settings_notification_advanced_preferences.xml +++ b/vector/src/main/res/xml/vector_settings_notification_advanced_preferences.xml @@ -64,4 +64,4 @@ - + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_notification_default.xml b/vector/src/main/res/xml/vector_settings_notification_default.xml new file mode 100644 index 0000000000..fb565d2230 --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_notification_default.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_notification_mentions_and_keywords.xml b/vector/src/main/res/xml/vector_settings_notification_mentions_and_keywords.xml new file mode 100644 index 0000000000..be89c86cb1 --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_notification_mentions_and_keywords.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_notification_other.xml b/vector/src/main/res/xml/vector_settings_notification_other.xml new file mode 100644 index 0000000000..b15329635c --- /dev/null +++ b/vector/src/main/res/xml/vector_settings_notification_other.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/vector/src/main/res/xml/vector_settings_notifications.xml b/vector/src/main/res/xml/vector_settings_notifications.xml index bacf323b76..33581105e1 100644 --- a/vector/src/main/res/xml/vector_settings_notifications.xml +++ b/vector/src/main/res/xml/vector_settings_notifications.xml @@ -26,7 +26,32 @@ android:persistent="false" android:summary="@string/settings_notification_advanced_summary" android:title="@string/settings_notification_advanced" - app:fragment="im.vector.app.features.settings.notifications.VectorSettingsAdvancedNotificationPreferenceFragment" /> + app:fragment="im.vector.app.features.settings.notifications.VectorSettingsAdvancedNotificationPreferenceFragment" + app:isPreferenceVisible="@bool/useNotificationSettingsV1" /> + + + + + +