Merge branch 'develop' into voiceMessageA11Y

This commit is contained in:
Peter Vágner 2021-08-16 13:17:22 +02:00
commit a05859b54c
123 changed files with 1973 additions and 385 deletions

View File

@ -1,3 +1,32 @@
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)
=======================================
Features ✨
----------
- Spaces - Support Restricted Room via room capabilities API ([#3509](https://github.com/vector-im/element-android/issues/3509))
- Spaces | Support restricted room access in room settings ([#3665](https://github.com/vector-im/element-android/issues/3665))
Bugfixes 🐛
----------
- Fix crash when opening Troubleshoot Notifications ([#3778](https://github.com/vector-im/element-android/issues/3778))
- Fix error when sending encrypted message if someone in the room logs out. ([#3792](https://github.com/vector-im/element-android/issues/3792))
- Voice Message - Amplitude update java.util.ConcurrentModificationException ([#3796](https://github.com/vector-im/element-android/issues/3796))
Changes in Element v1.1.15 (2021-07-30)
=======================================

View File

@ -1 +0,0 @@
Spaces - Support Restricted Room via room capabilities API

View File

@ -1 +0,0 @@
Spaces | Support restricted room access in room settings

View File

@ -0,0 +1,2 @@
Hlavní změny v této verzi: aktualizace hlavně kvůli stabilitě a opravám chyb
Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Hlavní změny v této verzi: oprava chyby ohledně šifrovaných zpráv
Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -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

View File

@ -0,0 +1,2 @@
Hauptänderung dieser Version: Beheben eines Problems mit verschlüsselten Nachrichten.
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -0,0 +1,2 @@
Main changes in this version: Fix error when sending encrypted message if someone in the room logs out.
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.16

View File

@ -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

View File

@ -0,0 +1,2 @@
Põhilised muutused selles versioonis: üldiste vigade parandus.
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Põhilised muutused selles versioonis: krüptitud sõnumitega seotud vigade parandus
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -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

View File

@ -0,0 +1,2 @@
تغییرات اصلی در این نگارش: پیاده‌سازی پیام صوتی در تنظیمات آزمایشگاه‌ها.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.1.15

View File

@ -1 +1 @@
گپ و تماس نامتمرکز امن. داده‌هایتان را از اشخاص سوم امن نگه دارید.
پیام‌رسان گروهی - پیام‌رسانی رمزنگاشته، گپ گروهی و تماس‌های ویدیویی

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@
Principaux changements pour cette version : rafraîchissement des styles et des thèmes, et correction dun plantage après un appel vidéo.
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.12

View File

@ -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

View File

@ -0,0 +1,2 @@
Principaux changements pour cette version : correction dun problème concernant les messages chiffrés.
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -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

View File

@ -0,0 +1,2 @@
Fő változás ebben a verzióban: leginkább hibajavító és stabilitást növelő frissítés
Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Fő változás ebben a verzióban: titkosított üzenetekkel kapcsolatos hibajavítás
Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -0,0 +1,2 @@
Versi baru ini terutama berisi perbaikan bug dan peningkatan. Mengirim pesan sekarang jauh lebih cepat.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.10

View File

@ -0,0 +1,2 @@
Versi baru ini terutama berisi antarmuka pengguna dan peningkatan pengalaman pengguna. Sekarang Anda dapat mengundang teman, dan membuat sebuah DM sangat cepat dengan memindai kode QR.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.11

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Pratinjau URL, keyboard Emoji baru, kemampuan pengaturan ruangan baru, dan salju untuk Natal!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.12

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Pratinjau URL, keyboard Emoji baru, kemampuan pengaturan ruangan baru, dan salju untuk Natal!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.13

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Edit izin ruangan, tema cahaya/gelap otomatis, dan banyak perbaikan bug.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.14

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Dukungan login sosial.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.15

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: Dukungan login sosial.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.15 dan https://github.com/vector-im/element-android/releases/tag/v1.0.16

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: perbaikan bug!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.17

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: perbaikan VoIP (panggilan audio dan video dalam DM) dan perbaikan bug!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.0

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.1

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.2

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.3

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.4

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: perbaikan hot-fix untuk 1.1.4
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.5

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: perbaikan hot-fix untuk 1.1.5
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.6

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: dukungan beta untuk Spaces. Kompres video sebelum mengirim.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.7

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: perbaikan untuk Spaces.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.8

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: menambahkan dukungan untuk jaringan gitter.im.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.9

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: pembaruan tema dan gaya dan fitur-fitur baru untuk Spaces.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.10

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: pembaruan tema dan gaya dan fitur baru untuk spaces (perbaikan bug untuk 1.1.10)
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.11

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: pembaruan tema dan gaya dan perbaiki crash setelah panggilan video
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.12

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: terutama pembaruan stabilitas dan perbaikan bug.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Perubahan utama dalam versi ini: memperbaiki masalah tentang pesan terenkripsi.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -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

View File

@ -0,0 +1,39 @@
Element adalah perpesanan yang aman dan aplikasi kolaborasi tim produktivitas yang ideal untuk obrolan grup saat bekerja jarak jauh. Aplikasi obrolan ini menggunakan enkripsi ujung-ke-ujung untuk memberikan konferensi video, berbagi file, dan panggilan suara.
<b>Fitur Element termasuk:</b>
- Alat komunikasi online yang canggih
- Pesan terenkripsi sepenuhnya untuk memungkinkan komunikasi perusahaan yang lebih aman, bahkan untuk pekerja jarak jauh
- Obrolan terdesentralisasi berdasarkan framework sumber-terbuka Matrix
- Berbagi file dengan aman dengan data terenkripsi saat mengelola proyek
- Obrolan video dengan VoIP dan berbagi layar
- Integrasi yang mudah dengan alat kolaborasi online favorit Anda, alat manajemen proyek, layanan VoIP dan aplikasi perpesanan tim lainnya
Element benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lainnya. Ini beroperasi pada Matrix, jaringan terbuka untuk pengiriman pesan yang aman dan komunikasi terdesentralisasi. Ini memungkinkan hosting sendiri untuk memberi pengguna kepemilikan maksimum dan kontrol data dan pesan mereka.
<b>Pesan privasi dan terenkripsi</b>
Element melindungi Anda dari iklan yang tidak diinginkan, data penambangan dan taman berdinding. Ini juga mengamankan semua data Anda, komunikasi video dan suara satu-ke-satu melalui enkripsi ujung-ke-ujung dan verifikasi perangkat yang di-cross-signed.
Element memberi Anda kendali atas privasi Anda sambil memungkinkan Anda untuk berkomunikasi dengan aman dengan siapa pun di jaringan Matrix, atau alat kolaborasi bisnis lainnya dengan mengintegrasikan dengan aplikasi seperti Slack.
<b>Element dapat dihost sendiri</b>
Untuk memungkinkan lebih banyak kendali atas data dan percakapan sensitif Anda, Element bisa dihost sendiri atau Anda dapat memilih host berbasis Matrix - standar untuk komunikasi terdesentralisasi sumber-terbuka. Element memberi Anda privasi, kepatuhan keamanan, dan fleksibilitas integrasi.
<b>Miliki data Anda</b>
Anda memutuskan di mana menyimpan data dan pesan Anda. Tanpa risiko penambangan data atau akses dari pihak ketiga.
Element menempatkan Anda dalam kendali dengan cara yang berbeda:
1. Dapatkan akun gratis pada server publik matrix.org yang dihost oleh pengembang Matrix, atau memilih dari ribuan server publik yang dihost oleh sukarelawan
2. Host sendiri akun Anda dengan menjalankan server pada infrastruktur IT Anda sendiri
3. Daftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services
<b>Pesan terbuka dan kolaborasi</b>
Anda dapat mengobrol dengan siapa saja di jaringan Matrix, apakah mereka menggunakan Element, aplikasi Matrix lain atau bahkan jika mereka menggunakan aplikasi perpesanan yang berbeda.
<b>Sangat aman</b>
Enkripsi ujung-ke-ujung beneran (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan verifikasi perangkat yang di-cross-signed.
<b>Komunikasi dan integrasi lengkap</b>
Perpesanan, panggilan suara dan video, berbagi file, berbagi layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal.
<b>Ambil di mana Anda tinggalkan</b>
Tetap terhubung di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://app.element.io

View File

@ -0,0 +1 @@
Perpesanan grup - pesan terenkripsi, panggilan grup dan video

View File

@ -0,0 +1 @@
Element - Perpesanan Aman

View File

@ -0,0 +1,2 @@
Modifiche principali in questa versione: aggiornamento di stabilità e correzione errori.
Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Modifiche principali in questa versione: corretto un problema con i messaggi cifrati.
Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -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

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: principalmente atualização de estabilidade e consertos de bug.
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Principais mudanças nesta versão: consertar um problema sobre mensagens encriptadas.
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -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

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: улучшение и исправления ошибок!
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.4

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: исправление для 1.1.4
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.5

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: исправление для 1.1.5
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.6

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: бета-поддержка Пространств. Сжатие видео перед отправкой.
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.7

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: Усовершенствованы Пространства!
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.8

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: добавлена поддержка сети gitter.im.
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.9

View File

@ -0,0 +1,2 @@
Основные изменения этой версии: обновлен внешний вид и новые возможности для пространств
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.10

View File

@ -0,0 +1,2 @@
Основные изменения этой версии: обновлен внешний вид и новые возможности для пространств (bugfix для 1.1.10)
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.11

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: обновление темы и стиля и исправления сбоев после видеовызова
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.12

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: улучшение стабильности и исправления ошибок.
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Основные изменения в этой версии: исправление проблемы с зашифрованными сообщениями.
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -1,30 +1,39 @@
Element - это новый тип приложения для обмена сообщениями и совместной работы, которое:
Element - это одновременно безопасный мессенджер и приложение для совместной работы, которое идеально подходит для групповых чатов при удаленной работе. Это приложение для чатов использует сквозное шифрование для обеспечения мощных видеоконференций, обмена файлами и голосовых звонков.
1. Позволяет вам контролировать вашу конфиденциальность
2. Позволяет общаться с кем угодно в сети Matrix и даже за ее пределами за счет интеграции с такими приложениями, как Slack
3. Защищает вас от рекламы, данных и огороженных стеной садов
4. Обеспечивает безопасность с помощью сквозного шифрования с перекрестной подписью для проверки других пользователей
<b>Особенности Element включают:</b>
- Передовые средства онлайн-общения
- Полностью зашифрованные сообщения, обеспечивающие безопасное корпоративное общение даже для удаленных работников
- Децентрализованный чат на базе платформы Matrix с открытым исходным кодом
- Безопасный обмен файлами с зашифрованными данными при управлении проектами
- Видеочаты с VoIP и совместным использованием экрана
- Простая интеграция с вашими любимыми инструментами для совместной работы в Интернете, средствами управления проектами, VoIP-сервисами и другими приложениями для обмена сообщениями в команде.
Element полностью отличается от других приложений для обмена сообщениями и совместной работы, потому что он децентрализован и имеет открытый исходный код.
Element полностью отличается от других приложений для обмена сообщениями и совместной работы. Он работает на базе Matrix, открытой сети для безопасного обмена сообщениями и децентрализованного общения. Он позволяет самостоятельно размещать свои данные и сообщения, предоставляя пользователям максимальный контроль над ними.
Element позволяет вам самостоятельно размещать или выбирать хост-узел, чтобы у вас была конфиденциальность, право собственности и контроль над своими данными и разговорами. Он предоставляет вам доступ к открытой сети, поэтому вы не ограничены общением исключительно с пользователями Element. И он очень надежен и безопаснен.
<b>Приватность и зашифрованный обмен сообщениями</b>.
Element защищает вас от нежелательной рекламы, сбора данных и "садов". Он также защищает все ваши данные, видео- и голосовую связь один на один благодаря сквозному шифрованию и перекрестной проверке устройств.
Element может делать все это, потому что он работает на Matrix - стандарте открытого, децентрализованного общения.
Element дает вам контроль над вашей конфиденциальностью, позволяя безопасно общаться с любым человеком в сети Matrix или с другими инструментами совместной работы благодаря интеграции с такими приложениями, как Slack.
Element предоставляет вам полный контроль, позволяя выбрать поставщиков услуг, обслуживающих серверы с вашими беседами. Вы свободны выбрать любой способ размещения прямо из приложения Element:
<b>Element может быть размещен самостоятельно</b>.
Чтобы обеспечить больший контроль над конфиденциальными данными и разговорами, Element может быть размещен самостоятельно или вы можете выбрать любой хост на базе Matrix - стандарт децентрализованного общения с открытым исходным кодом. Element обеспечивает конфиденциальность, соответствие требованиям безопасности и гибкость интеграции.
1. Получить бесплатную учетную запись на общедоступном сервере matrix.org, размещенном разработчиками Matrix, или выберите один из тысяч общедоступных серверов, размещенных волонтерами.
2. Разместить свою учетную запись на собственном сервере
3. Зарегистрироваться на индивидуальном сервере, просто подписавшись на услуги платформы Element Matrix Services
<b>Владение своими данными</b>.
Вы сами решаете, где хранить свои данные и сообщения. Без риска добычи данных или доступа третьих лиц.
<b>Почему выбирают Element?</b>
Element дает вам возможность контролировать ситуацию различными способами:
1. Получить бесплатный аккаунт на публичном сервере matrix.org, размещенном разработчиками Matrix, или выбрать один из тысяч публичных серверов, размещенных добровольцами.
2. Самостоятельно разместить свою учетную запись, запустив сервер на собственной IT-инфраструктуре.
3. Зарегистрировать учетную запись на пользовательском сервере, просто подписавшись на хостинг-платформу Element Matrix Services.
<b>СОБСТВЕННЫЕ ДАННЫЕ</b>: Вы решаете, где хранить свои данные и сообщения. Вы владеете ими и контролируете их, а не какая-то мегакорпорация, что собирает ваши данные и предоставляет сторонним лицам доступ к ним.
<b>Открытый обмен сообщениями и сотрудничество</b>.
Вы можете общаться с любым человеком в сети Matrix, независимо от того, использует ли он Element, другое приложение Matrix или даже если он использует другое приложение для обмена сообщениями.
<b>ОТКРЫТОЕ ОБЩЕНИЕ И СОТРУДНИЧЕСТВО</b>: Вы можете общаться с кем угодно в сети Matrix, независимо от того, используют ли они приложение Element или другое приложение Matrix, и даже если они используют другую систему обмена сообщениями, такую как Slack, IRC или XMPP.
<b>Супербезопасно</b>
Настоящее сквозное шифрование (только участники разговора могут расшифровывать сообщения) и проверка устройств с перекрестной подписью.
<b>СУПЕР-БЕЗОПАСНОСТЬ</b>: Настоящее сквозное шифрование (только участники разговора могут расшифровывать сообщения) и перекрестная подпись для проверки устройств участников разговора.
<b>Полная коммуникация и интеграция</b>.
Обмен сообщениями, голосовые и видеозвонки, совместное использование файлов, совместное использование экрана и целый ряд интеграций, ботов и виджетов. Создавайте комнаты, сообщества, оставайтесь на связи и выполняйте задачи.
<b>ПОЛНАЯ КОММУНИКАЦИЯ</b>: Обмен сообщениями, голосовые и видеозвонки, совместное использование файлов, совместное использование экрана и целый ряд интеграций, ботов и виджетов. Создавайте комнаты, сообщества, оставайтесь на связи и добивайтесь результатов.
<b>ВЫ ВЕЗДЕ</b>: Оставайтесь на связи, где бы вы ни находились, благодаря полностью синхронизированной истории сообщений на всех ваших устройствах и в Интернете по адресу https://app.element.io.
<b>Восстанавливайте связь с того места, где остановились</b>.
Оставайтесь на связи, где бы вы ни находились, с полностью синхронизированной историей сообщений на всех ваших устройствах и в Интернете по адресу https://app.element.io

View File

@ -1 +1 @@
Защищённый децентрализованный чат и звонки. Держите ваши данные в безопасности.
Групповой мессенджер - зашифрованные сообщения, групповые беседы и видеовызовы

View File

@ -1 +1 @@
Element (ранее Riot.im)
Element - Безопасный мессенджер

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@
Основні зміни в цій версії: оновлення теми та стилю та виправлення збоїв після відеовиклику
Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.12

View File

@ -0,0 +1,2 @@
Основні зміни в цій версії: в поліпшення стабільності та виправлення помилок.
Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
Основні зміни у цій версії: виправлення проблеми із зашифрованими повідомленнями.
Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -0,0 +1,2 @@
此版本中的主要變動:主要是穩定性與臭蟲修復更新。
完整的變更紀錄https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@ -0,0 +1,2 @@
此版本中的主要變動:修復關於加密訊息的問題。
完整的變更紀錄https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@ -0,0 +1,2 @@
此版本中的主要變動:實驗室設定下,語音訊息的實作。
完整的變更紀錄https://github.com/vector-im/element-android/releases/tag/v1.1.15

View File

@ -286,10 +286,13 @@ internal class RealmCryptoStore @Inject constructor(
val userEntity = UserEntity.getOrCreate(realm, userId)
// First delete the removed devices
val deviceIds = devices.keys
userEntity.devices.iterator().forEach { deviceInfoEntity ->
if (deviceInfoEntity.deviceId !in deviceIds) {
Timber.d("Remove device ${deviceInfoEntity.deviceId} of user $userId")
deviceInfoEntity.deleteOnCascade()
userEntity.devices.toTypedArray().iterator().let {
while (it.hasNext()) {
val deviceInfoEntity = it.next()
if (deviceInfoEntity.deviceId !in deviceIds) {
Timber.d("Remove device ${deviceInfoEntity.deviceId} of user $userId")
deviceInfoEntity.deleteOnCascade()
}
}
}
// Then update existing devices or add new one

View File

@ -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 = 1
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
@ -142,6 +142,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"

View File

@ -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 -> {

View File

@ -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)
}
}

View File

@ -971,7 +971,7 @@ class RoomDetailFragment @Inject constructor(
autoCompleter.exitSpecialMode()
views.composerLayout.collapse()
views.voiceMessageRecorderView.isVisible = text.isBlank() && vectorPreferences.labsUseVoiceMessage()
views.voiceMessageRecorderView.isVisible = text.isBlank()
updateComposerText(text)
views.composerLayout.views.sendButton.contentDescription = getString(R.string.send)
@ -1044,6 +1044,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) {
@ -1298,7 +1301,7 @@ class RoomDetailFragment @Inject constructor(
}
override fun onTextBlankStateChanged(isBlank: Boolean) {
if (!views.composerLayout.views.sendButton.isVisible && vectorPreferences.labsUseVoiceMessage()) {
if (!views.composerLayout.views.sendButton.isVisible) {
// Animate alpha to prevent overlapping with the animation of the send button
views.voiceMessageRecorderView.alpha = 0f
views.voiceMessageRecorderView.isVisible = true
@ -1318,7 +1321,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()
@ -1372,10 +1374,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 = views.composerLayout.text?.isBlank().orFalse()
views.composerLayout.setRoomEncrypted(summary.isEncrypted)
views.notificationAreaView.render(NotificationAreaView.State.Hidden)
views.composerLayout.alwaysShowSendButton = !vectorPreferences.labsUseVoiceMessage()
views.composerLayout.alwaysShowSendButton = false
}
} else {
views.composerLayout.isVisible = false

View File

@ -88,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
@ -210,6 +219,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.
@ -221,6 +231,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.")
@ -236,9 +249,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) {
@ -327,11 +340,11 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
}
}
private fun renderRecordingWaveform(amplitudeList: List<Int>) {
views.voicePlaybackWaveform.apply {
post {
amplitudeList.forEach { amplitude ->
update(amplitude)
private fun renderRecordingWaveform(amplitudeList: Array<Int>) {
post {
views.voicePlaybackWaveform.apply {
amplitudeList.iterator().forEach {
update(it)
}
}
}
@ -405,7 +418,7 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
scaleX = 1f
scaleY = 1f
translationX = 0f
translationY = 0f
translationY = 0f
}
isCancelled?.let {
callback?.onVoiceRecordingEnded(it)
@ -506,18 +519,18 @@ class VoiceMessageRecorderView @JvmOverloads constructor(
override fun onUpdate(state: VoiceMessagePlaybackTracker.Listener.State) {
when (state) {
is VoiceMessagePlaybackTracker.Listener.State.Recording -> {
renderRecordingWaveform(state.amplitudeList)
renderRecordingWaveform(state.amplitudeList.toTypedArray())
}
is VoiceMessagePlaybackTracker.Listener.State.Playing -> {
views.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_pause)
views.voicePlaybackControlButton.contentDescription = resources.getString(R.string.a11y_pause_voice_message)
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 = resources.getString(R.string.a11y_play_voice_message)
views.voicePlaybackControlButton.contentDescription = context.getString(R.string.a11y_play_voice_message)
}
}
}

View File

@ -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)
}
}
}

View File

@ -71,6 +71,7 @@ abstract class MessageVoiceItem : AbsMessageItem<MessageVoiceItem.Holder>() {
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
}
@ -98,19 +99,19 @@ abstract class MessageVoiceItem : AbsMessageItem<MessageVoiceItem.Holder>() {
private fun renderIdleState(holder: Holder) {
holder.voicePlaybackControlButton.setImageResource(R.drawable.ic_play_pause_play)
holder.voicePlaybackControlButton.contentDescription = holder.view.context.resources.getString(R.string.a11y_play_voice_message)
holder.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.resources.getString(R.string.a11y_pause_voice_message)
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.resources.getString(R.string.a11y_play_voice_message)
holder.voicePlaybackControlButton.contentDescription = holder.view.context.getString(R.string.a11y_play_voice_message)
holder.voicePlaybackTime.text = formatPlaybackTime(state.playbackTime)
}

View File

@ -154,8 +154,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"
@ -989,8 +987,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)
}
}

View File

@ -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())
}

View File

@ -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
}

View File

@ -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<VectorPreference>(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()
}

View File

@ -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
)
}

View File

@ -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
)
}

View File

@ -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
)
}

View File

@ -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<String, String>
override fun bindPref() {
for (preferenceKey in prefKeyToPushRuleId.keys) {
val preference = findPreference<VectorCheckboxPreference>(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()
}
}

View File

@ -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<Intent>) {
val session = activeSessionHolder.getSafeActiveSession() ?: return
val pushRules = session.getPushRules().getAllRules()

View File

@ -76,4 +76,3 @@
</LinearLayout>

View File

@ -234,10 +234,10 @@
<string name="notice_room_server_acl_updated_banned">• Servery shodující se s %s jsou nyní zakázány.</string>
<string name="notice_room_server_acl_updated_title_by_you">Změnili jste ACL serveru pro tuto místnost.</string>
<string name="notice_room_server_acl_updated_title">%s změnil(a) ACL serveru pro tuto místnost.</string>
<string name="notice_room_server_acl_set_ip_literals_allowed">• Server shodující se doslovně s IP je povolen.</string>
<string name="notice_room_server_acl_set_ip_literals_not_allowed">• Server shodující se doslovně s IP je zakázán.</string>
<string name="notice_room_server_acl_set_allowed">• Server shodující se s %s je povolen.</string>
<string name="notice_room_server_acl_set_banned">• Server shodující se s %s je zakázán.</string>
<string name="notice_room_server_acl_set_ip_literals_allowed">• Servery shodující se doslovně s IP jsou povoleny.</string>
<string name="notice_room_server_acl_set_ip_literals_not_allowed">• Servery shodující se doslovně s IP jsou zakázány.</string>
<string name="notice_room_server_acl_set_allowed">• Servery shodující se s %s jsou povoleny.</string>
<string name="notice_room_server_acl_set_banned">• Servery shodující se s %s jsou zakázány.</string>
<string name="notice_room_server_acl_set_title_by_you">Nastavili jste ACL serveru pro tuto místnost.</string>
<string name="notice_room_server_acl_set_title">%s nastavili ACL serveru pro tuto místnost.</string>
<string name="notice_room_canonical_alias_no_change_by_you">Změnili jste adresy pro tuto místnost.</string>
@ -385,7 +385,7 @@
<string name="login">Přihlásit se</string>
<string name="logout">Odhlásit se</string>
<string name="hs_url">Adresa domovského serveru</string>
<string name="identity_url">Adresa URL serveru identit</string>
<string name="identity_url">URL serveru identit</string>
<string name="search">Hledat</string>
<string name="start_new_chat">Začít novou konverzaci</string>
<string name="start_voice_call">Zahájit hlasový hovor</string>
@ -870,7 +870,7 @@
<string name="settings_notification_privacy_normal">Normální</string>
<string name="settings_notification_privacy_reduced">Snížené soukromí</string>
<string name="settings_notification_privacy_need_permission">Aplikaci potřebuje svolení k chodu na pozadí</string>
<string name="settings_notification_privacy_no_background_sync">Aplikace na pozadí opravdu <b>nepotřebuje</b> spojení k domovskému serveru, to by mělo snížit spotřebu</string>
<string name="settings_notification_privacy_no_background_sync">Aplikace na pozadí opravdu <b>nepotřebuje</b> spojení k domovskému serveru, to by mělo snížit spotřebu energie</string>
<string name="settings_notification_privacy_fcm">• Oznámení se posílají pomocí Firebase Cloud Messaging</string>
<string name="settings_notification_privacy_metadata">• Oznámení pouze obsahují metadata</string>
<string name="settings_notification_privacy_secure_message_content">• Obsah oznámení je <b>bezpečně uložen přímo na domovském serveru Matrixu</b></string>
@ -1523,7 +1523,7 @@
<string name="sas_error_m_key_mismatch">Neshoda klíčů</string>
<string name="sas_error_m_user_error">Neshoda uživatelů</string>
<string name="sas_error_unknown">Neznámá chyba</string>
<string name="identity_server_not_defined">Nepoužíváte žádný server pro identity</string>
<string name="identity_server_not_defined">Nepoužíváte žádný server identit</string>
<string name="identity_server_not_defined_for_password_reset">Není konfigurován žádný server pro identity, musíte přenastavit heslo.</string>
<string name="error_user_already_logged_in">Vypadá to, že se chcete připojit k jinému domovskému serveru. Chcete se odhlásit\?</string>
<string name="edit">Upravit</string>
@ -2048,7 +2048,7 @@
\n- Spojení do internetu obou zařízení
\n
\nDoporučujeme, abyste okamžitě změnili heslo a klíč obnovy v nastavení.</string>
<string name="verify_cancelled_notice">Ověřit svá zařízení v nastavení.</string>
<string name="verify_cancelled_notice">Ověření bylo zrušeno. Můžete je znovu spustit.</string>
<string name="verification_cancelled">Ověření zrušeno</string>
<string name="recovery_passphrase">Přístupová fráze pro obnovu</string>
<string name="message_key">Klíč zpráv</string>
@ -2528,7 +2528,7 @@
<string name="attachment_viewer_item_x_of_y">%1$d z %2$d</string>
<string name="a11y_create_direct_message_by_mxid">Založit novou přímou konverzaci pomocí Matrix ID</string>
<string name="a11y_create_direct_message_by_qr_code">Založit novou přímou konverzaci pomocí skenu QR kódu</string>
<string name="identity_server_consent_dialog_content">Abyste nalezli existující kontakty, jež znáte, souhlasíte s odesláním svých kontaktních údajů (telefonní čísla nebo emailové adresy) na nastavený server pro identity (%1$s)\?
<string name="identity_server_consent_dialog_content">Abyste nalezli existující kontakty, jež znáte, souhlasíte s odesláním svých kontaktních údajů (telefonní čísla nebo emailové adresy) na nastavený server identit (%1$s)\?
\n
\nZa účelem soukromí budou data před odesláním hašována.</string>
<string name="identity_server_consent_dialog_title">Poslat emailové adresy a telefonní čísla</string>
@ -2794,7 +2794,7 @@
<string name="command_description_create_space">Založit prostor</string>
<string name="search_hint_room_name">Hledat jméno</string>
<string name="room_settings_room_access_restricted_description">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.</string>
<string name="room_settings_room_access_restricted_title">Prostory</string>
<string name="room_settings_room_access_restricted_title">Pouze členové prostoru</string>
<string name="room_settings_room_access_public_description">Kdokoli může místnost nalézt a vstoupit</string>
<string name="room_settings_room_access_public_title">Veřejná</string>
<string name="room_settings_room_access_private_description">Pouze pozvaní mohou místnost nalézt a vstoupit</string>
@ -2893,4 +2893,46 @@
<string name="missing_permissions_title">Chybějící oprávnění</string>
<string name="denied_permission_camera">Pro provedení této akce udělte, prosím, oprávnění Fotoaparát v systémových nastaveních.</string>
<string name="denied_permission_generic">Některá z oprávnění potřebných k provedení akce chybí, prosím, udělte oprávnění v systémových nastaveních.</string>
<plurals name="missed_video_call">
<item quantity="one">Zmeškaný video hovor</item>
<item quantity="few">%d zmeškané video hovory</item>
<item quantity="other">%d zmeškaných video hovorů</item>
</plurals>
<plurals name="missed_audio_call">
<item quantity="one">Zmeškaný hlasový hovor</item>
<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é 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 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 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>
<string name="error_voice_message_unable_to_record">Nelze nahrát hlasovou zprávu</string>
<string name="error_voice_message_unable_to_play">Nelze přehrát tuto hlasovou zprávu</string>
<string name="labs_use_voice_message">Povolit hlasovou zprávu</string>
<string name="voice_message_n_seconds_warning_toast">%1$ds zbývá</string>
<string name="voice_message_release_to_send_toast">Podržením nahrajte, uvolněním odešlete</string>
<string name="a11y_delete_recorded_voice_message">Odstranit nahranou hlasovou zprávu</string>
<string name="a11y_recording_voice_message">Nahrát hlasovou zprávu</string>
<string name="a11y_pause_voice_message">Pozastavit hlasovou zprávu</string>
<string name="a11y_play_voice_message">Přehrát hlasovou zprávu</string>
<string name="a11y_lock_voice_message">Zámek hlasové zprávy</string>
<string name="voice_message_slide_to_cancel">Posunutím zrušíte</string>
<string name="a11y_start_voice_message">Zahájení hlasové zprávy</string>
<string name="sent_a_voice_message">Hlasová zpráva</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>
<string name="denied_permission_voice_message">Chcete-li odesílat hlasové zprávy, povolte oprávnění mikrofonu.</string>
</resources>

Some files were not shown because too many files have changed in this diff Show More