mirror of
https://github.com/element-hq/element-android
synced 2024-11-28 21:48:50 +03:00
[issue-2610-override-nick-color-via-user-account-data] Merge branch 'develop' of github.com:mitchnull/element-android into feature/issue-2610-override-nick-color-via-user-account-data
This commit is contained in:
commit
40d48cc3ff
555 changed files with 24559 additions and 2389 deletions
54
CHANGES.md
54
CHANGES.md
|
@ -1,29 +1,69 @@
|
|||
Changes in Element 1.1.5 (2021-XX-XX)
|
||||
Changes in Element 1.1.7 (2021-XX-XX)
|
||||
===================================================
|
||||
|
||||
Features ✨:
|
||||
- Allow changing nick colors (#2610)
|
||||
|
||||
- Spaces beta
|
||||
|
||||
Improvements 🙌:
|
||||
-
|
||||
- Add ability to install APK from directly from Element (#2381)
|
||||
- Delete and react to stickers (#3250)
|
||||
- Compress video before sending (#442)
|
||||
- Improve file too big error detection (#3245)
|
||||
- User can now select video when selecting Gallery to send attachments to a room
|
||||
- Add option to record a video from the camera
|
||||
|
||||
Bugfix 🐛:
|
||||
-
|
||||
- Message states cosmetic changes (#3007)
|
||||
- Fix exception in rxSingle (#3180)
|
||||
- Do not invite the current user when creating a room (#3123)
|
||||
- Fix color issues when the system theme is changed (#2738)
|
||||
- Fix issues on Android 11 (#3067)
|
||||
- Fix issue when opening encrypted files (#3186)
|
||||
- Fix wording issue (#3242)
|
||||
- Fix missing sender information after edits (#3184)
|
||||
- Fix read marker not updating automatically (#3267)
|
||||
- Sent video does not contains duration (#3272)
|
||||
- Properly clean the back stack if the user cancel registration when waiting for email validation
|
||||
|
||||
Translations 🗣:
|
||||
-
|
||||
|
||||
SDK API changes ⚠️:
|
||||
-
|
||||
- RegistrationWizard.createAccount() parameters are now all optional, following Matrix spec (#3205)
|
||||
|
||||
Build 🧱:
|
||||
-
|
||||
- Upgrade to gradle 7
|
||||
- https://github.com/Piasy/BigImageViewer is now hosted on mavenCentral()
|
||||
|
||||
Test:
|
||||
-
|
||||
|
||||
Other changes:
|
||||
-
|
||||
- New store descriptions
|
||||
- `master` branch has been renamed to `main`. To apply change to your dev environment, run:
|
||||
```sh
|
||||
git branch -m master main
|
||||
git fetch origin
|
||||
git branch -u origin/main main
|
||||
# And optionally
|
||||
git remote prune origin
|
||||
```
|
||||
- Allow cleartext (non-SSL) connections to Matrix servers on LAN hosts (#3166)
|
||||
|
||||
Changes in Element 1.1.6 (2021-04-16)
|
||||
===================================================
|
||||
|
||||
Bugfix 🐛:
|
||||
- Fix crash on the timeline
|
||||
- App crashes on "troubleshoot notifications" button (#3187)
|
||||
|
||||
Changes in Element 1.1.5 (2021-04-15)
|
||||
===================================================
|
||||
|
||||
Bugfix 🐛:
|
||||
- Fix crash during Realm migration
|
||||
- Fix crash when playing video (#3179)
|
||||
|
||||
Changes in Element 1.1.4 (2021-04-09)
|
||||
===================================================
|
||||
|
|
|
@ -17,20 +17,6 @@
|
|||
apply plugin: 'com.android.library'
|
||||
apply plugin: 'kotlin-android'
|
||||
|
||||
buildscript {
|
||||
repositories {
|
||||
maven {
|
||||
url 'https://jitpack.io'
|
||||
content {
|
||||
// PhotoView
|
||||
includeGroupByRegex 'com\\.github\\.chrisbanes'
|
||||
}
|
||||
}
|
||||
jcenter()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 30
|
||||
|
||||
|
|
15
build.gradle
15
build.gradle
|
@ -16,8 +16,8 @@ buildscript {
|
|||
classpath 'com.google.gms:google-services:4.3.5'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.1.1'
|
||||
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.3'
|
||||
classpath "com.likethesalad.android:string-reference:1.2.1"
|
||||
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.4'
|
||||
classpath "com.likethesalad.android:string-reference:1.2.2"
|
||||
|
||||
// NOTE: Do not place your application dependencies here; they belong
|
||||
// in the individual module build.gradle files
|
||||
|
@ -45,25 +45,20 @@ allprojects {
|
|||
// PFLockScreen-Android
|
||||
includeGroupByRegex 'com\\.github\\.vector-im'
|
||||
|
||||
//Chat effects
|
||||
// Chat effects
|
||||
includeGroupByRegex 'com\\.github\\.jetradarmobile'
|
||||
includeGroupByRegex 'nl\\.dionsegijn'
|
||||
}
|
||||
}
|
||||
maven {
|
||||
url "http://dl.bintray.com/piasy/maven"
|
||||
content {
|
||||
includeGroupByRegex "com\\.github\\.piasy"
|
||||
}
|
||||
}
|
||||
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
|
||||
// Jitsi repo
|
||||
maven {
|
||||
url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.1.0"
|
||||
url "https://github.com/vector-im/jitsi_libre_maven/raw/main/android-sdk-3.1.0"
|
||||
// Note: to test Jitsi release you can use a local file like this:
|
||||
// url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-3.1.0"
|
||||
}
|
||||
google()
|
||||
mavenCentral()
|
||||
jcenter()
|
||||
}
|
||||
|
||||
|
|
2
fastlane/metadata/android/ca/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/ca/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Canvis principals d'aquesta versió: millora de rendiment i correcció d'errors!
|
||||
Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/ca/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/ca/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Canvis principals d'aquesta versió: millora de rendiment i correcció d'errors!
|
||||
Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
2
fastlane/metadata/android/de/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/de/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hauptänderungen in dieser Version: Leistungsverbesserung und Fehlerbehebungen!
|
||||
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/de/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/de/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hauptänderungen in dieser Version: Leistungsverbesserung und Fehlerbehebungen!
|
||||
Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
2
fastlane/metadata/android/en-US/changelogs/40101050.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40101050.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Main changes in this version: hot fixes for 1.1.4
|
||||
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.5
|
2
fastlane/metadata/android/en-US/changelogs/40101060.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40101060.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Main changes in this version: hot fixes for 1.1.5
|
||||
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.6
|
|
@ -1,30 +1,39 @@
|
|||
Element is a new type of messenger and collaboration app that:
|
||||
Element is both a secure messenger and a productivity team collaboration app that is ideal for group chats while remote working. This chat app uses end-to-end encryption to provide powerful video conferencing, file sharing and voice calls.
|
||||
|
||||
1. Puts you in control to preserve your privacy
|
||||
2. Lets you communicate with anyone in the Matrix network, and even beyond by integrating with apps such as Slack
|
||||
3. Protects you from advertising, datamining and walled gardens
|
||||
4. Secures you through end-to-end encryption, with cross-signing to verify others
|
||||
<b>Element’s features include:</b>
|
||||
- Advanced online communication tools
|
||||
- Fully encrypted messages to allow safer corporate communication, even for remote workers
|
||||
- Decentralized chat based on the Matrix open source framework
|
||||
- File sharing securely with encrypted data while managing projects
|
||||
- Video chats with Voice over IP and screen sharing
|
||||
- Easy integration with your favourite online collaboration tools, project management tools, VoIP services and other team messaging apps
|
||||
|
||||
Element is completely different from other messaging and collaboration apps because it is decentralised and open source.
|
||||
Element is completely different from other messaging and collaboration apps. It operates on Matrix, an open network for secure messaging and decentralized communication. It allows self-hosting to give users maximum ownership and control of their data and messages.
|
||||
|
||||
Element lets you self-host - or choose a host - so that you have privacy, ownership and control of your data and conversations. It gives you access to an open network; so you’re not just stuck speaking to other Element users only. And it is very secure.
|
||||
<b>Privacy and encrypted messaging</b>
|
||||
Element protects you from unwanted ads, data mining and walled gardens. It also secures all your data, one-to-one video and voice communication through end-to-end encryption and cross-signed device verification.
|
||||
|
||||
Element is able to do all this because it operates on Matrix - the standard for open, decentralised communication.
|
||||
Element gives you control over your privacy while allowing you to communicate securely with anyone on the Matrix network, or other business collaboration tools by integrating with apps such as Slack.
|
||||
|
||||
Element puts you in control by letting you choose who hosts your conversations. From the Element app, you can choose to host in different ways:
|
||||
<b>Element can be self-hosted</b>
|
||||
To allow more control of your sensitive data and conversations, Element can be self-hosted or you can choose any Matrix-based host - the standard for open source, decentralized communication. Element gives you privacy, security compliance and integration flexibility.
|
||||
|
||||
<b>Own your data</b>
|
||||
You decide where to keep your data and messages. Without the risk of data mining or access from third parties.
|
||||
|
||||
Element puts you in control in different ways:
|
||||
1. Get a free account on the matrix.org public server hosted by the Matrix developers, or choose from thousands of public servers hosted by volunteers
|
||||
2. Self-host your account by running a server on your own hardware
|
||||
2. Self-host your account by running a server on your own IT infrastructure
|
||||
3. Sign up for an account on a custom server by simply subscribing to the Element Matrix Services hosting platform
|
||||
|
||||
<b>Why choose Element?</b>
|
||||
<b>Open messaging and collaboration</b>
|
||||
You can chat with anyone on the Matrix network, whether they’re using Element, another Matrix app or even if they are using a different messaging app.
|
||||
|
||||
<b>OWN YOUR DATA</b>: You decide where to keep your data and messages. You own it and control it, not some MEGACORP that mines your data or gives access to third parties.
|
||||
<b>Super secure</b>
|
||||
Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signed device verification.
|
||||
|
||||
<b>OPEN MESSAGING AND COLLABORATION</b>: You can chat with anyone else in the Matrix network, whether they’re using Element or another Matrix app, and even if they are using a different messaging system of the likes of Slack, IRC or XMPP.
|
||||
<b>Complete communication and integration</b>
|
||||
Messaging, voice and video calls, file sharing, screen sharing and a whole bunch of integrations, bots and widgets. Build rooms, communities, stay in touch and get things done.
|
||||
|
||||
<b>SUPER-SECURE</b>: Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signing to verify the devices of conversation participants.
|
||||
|
||||
<b>COMPLETE COMMUNICATION</b>: Messaging, voice and video calls, file sharing, screen sharing and a whole bunch of integrations, bots and widgets. Build rooms, communities, stay in touch and get things done.
|
||||
|
||||
<b>EVERYWHERE YOU ARE</b>: Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io.
|
||||
<b>Pick up where you left off</b>
|
||||
Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io
|
|
@ -1 +1 @@
|
|||
Secure decentralised chat & VoIP. Keep your data safe from third parties.
|
||||
Group messenger - encrypted messaging, group chat and video calls
|
|
@ -1 +1 @@
|
|||
Element (previously Riot.im)
|
||||
Element - Secure Messenger
|
2
fastlane/metadata/android/et/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/et/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Põhilised muutused selles versioonis: jõudluse parandused ja pisikohendused.
|
||||
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/et/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/et/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Põhilised muutused selles versioonis: jõudluse parandused ja pisikohendused.
|
||||
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
2
fastlane/metadata/android/fr/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/fr/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Principaux changements pour cette version : amélioration des performances et corrections de bugs !
|
||||
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/fr/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/fr/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Principaux changements pour cette version : amélioration des performances et corrections de bugs !
|
||||
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
|
@ -1,30 +1,30 @@
|
|||
Element est une nouvelle application de messagerie et de collaboration qui :
|
||||
Element est une nouvelle application de messagerie et de collaboration qui :
|
||||
|
||||
1) Vous place aux commandes de votre vie privée
|
||||
2) Vous permet de communiquer avec n'importe qui du réseau Matrix, et plus encore par des intégrations d'autres applications comme Slack ou Discord
|
||||
3) Vous protège de la publicité et de la collecte de données
|
||||
4) Vous sécurise grâce à du chiffrement bout-à-bout, avec de la signature croisée pour authentifier les autres utilisateurs
|
||||
1. Vous permet de préserver votre vie privée
|
||||
2. Vous permet de communiquer avec n’importe qui sur réseau Matrix, et plus encore grâce aux intégrations d’autres applications telles que Slack ou Discord
|
||||
3. Vous protège de la publicité et de la collecte de données
|
||||
4. Vous protège grâce au chiffrement de bout-à-bout et à la signature croisée pour authentifier les autres utilisateurs
|
||||
|
||||
Element est complètement différent des autres applications de messagerie et de collaboration puisque l'application est décentralisée et open-source.
|
||||
Element est complètement différente des autres applications de messagerie et de collaboration puisque l’application est décentralisée et open-source.
|
||||
|
||||
Element vous permet d'héberger vous-même -ou de choisir un hôte- vous permettant d'assurer votre vie privée, la propriété et le contrôle de vos données et de vos conversations. Cela vous offre l'accès à un réseau ouvert, vous n'êtes donc pas condamné à parler à d'autres utilisateurs d'Element seulement. Et c'est très sécurisé.
|
||||
Element vous permet d’héberger vous-même ou de choisir un hôte vous permettant d’assurer votre vie privée, la propriété et le contrôle de vos données et de vos conversations. Cela vous donne accès à un réseau ouvert. Vous n’êtes donc pas condamné à parler à d’autres utilisateurs d’Element seulement. Et c'est très sécurisé.
|
||||
|
||||
Element peut faire tout ça car il est basé sur Matrix, le protocole standard pour la communication ouverte et décentralisée.
|
||||
Element peut faire tout ça car elle est basée sur Matrix, le protocole standard pour la communication ouverte et décentralisée.
|
||||
|
||||
Element vous donne le contrôle en vous laissant choisir qui héberge vos conversations. Depuis l'application Element, vous pouvez choisir votre hôte de différentes manières :
|
||||
Element vous donne le contrôle en vous laissant choisir qui héberge vos conversations. Depuis l'application Element, vous pouvez choisir votre hôte de différentes manières :
|
||||
|
||||
1) Créer un compte gratuit sur le serveur public matrix.org hébergé par les développeurs de Matrix, ou choisir parler les milliers de serveurs public hébergés par des bénévoles
|
||||
2) Héberger vous-même votre compte en installant un serveur sur votre propre machine
|
||||
3) Créer un compte sur un serveur personnalisé en souscrivant sur la plateforme d'hébergement « Element Matrix Services » (EMS)
|
||||
1. Créer un compte gratuit sur le serveur public matrix.org hébergé par les développeurs de Matrix, ou choisir parmi les milliers de serveurs public hébergés par des bénévoles
|
||||
2. Héberger vous-même votre compte en installant un serveur sur votre propre machine
|
||||
3. Créer un compte sur un serveur personnalisé en souscrivant sur la plateforme d'hébergement « Element Matrix Services » (EMS)
|
||||
|
||||
<b>Pourquoi choisir Element ?</b>
|
||||
|
||||
<b>POSSÉDEZ VOS DONNÉES</b> : Vous décidez où conserver vos données et vos messages. Vous les possédez et vous les contrôlez, et non une MEGACORP qui mine vos données ou les donnent à des tiers
|
||||
<b>VOS DONNÉES VOUS APPARTIENNENT</b> : vous décidez où stocker vos données et messages. Ils vous appartiennent et vous les maîtrisez. Aucune multinationale ne viendra extraire vos données pour les envoyer au plus offrant.
|
||||
|
||||
<b>UNE MESSAGERIE OUVERTE ET COLLABORATIVE</b> : Vous pouvez discuter avec n'importe qui sur le réseau Matrix, qu'ils utilisent Element ou une autre application basée sur Matrix, et même s'ils utilisent un système de messagerie différent comment Slack, Discord, IRC ou XMPP.
|
||||
<b>MESSAGERIE ET COLLABORATION OUVERTES</b> : vous pouvez discuter avec tout le réseau Matrix, qu’ils utilisent Element ou une autre application Matrix, même s’ils utilisent une autre plateforme de messagerie telle que Slack, IRC ou XMPP.
|
||||
|
||||
<b>SUPER SÉCURISÉ</b> : Un réel chiffrement bout-à-bout (seulement ceux deux la conversation peuvent déchiffrer les messages), et une signature croisée pour vérifier les appareils des participants de la conversation.
|
||||
<b>ULTRA SÉCURISÉ</b> : chiffrement de bout en bout (seuls les membres d’une conversation peuvent déchiffrer les messages), et signature croisée pour vérifier les appareils de vos interlocuteurs.
|
||||
|
||||
<b>COMMUNICATION COMPLÈTE</b> : Messagerie, appels vocaux et vidéo, transfert de fichiers, partage d'écran et un tas d'intégrations, robots et widgets. Construisez des salons, des communautés, restez en contact et accomplissez de grandes choses.
|
||||
<b>TOUTES VOS COMMUNICATIONS</b> : messagerie, appels audio et vidéo, partage de fichier, partage d’écran et un grand nombre d’intégrations, robots et widgets. Participez à des salons, des communautés, restez en contact et faites avancer vos projets.
|
||||
|
||||
<b>PARTOUT OÙ VOUS ÊTES</b> : Restez connectés peu import où vous êtes avec la synchronisation complète de l'historique des messages sur tous vos appareils et sur le web sur https://app.element.io.
|
||||
<b>PARTOUT AVEC VOUS</b> : votre historique reste synchronisé entre tous vos appareils et sur le web sur https://element.io/app.
|
||||
|
|
2
fastlane/metadata/android/it/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/it/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Modifiche principali in questa versione: prestazioni migliorate e correzione di errori!
|
||||
Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/it/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/it/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Modifiche principali in questa versione: prestazioni migliorate e correzioni di errori!
|
||||
Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
2
fastlane/metadata/android/ja/changelogs/40100100.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
今回の新バージョンでは、主にバグの修正と改善が行われています。メッセージの送信がより速くなりました。
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.10
|
2
fastlane/metadata/android/ja/changelogs/40100110.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
今回の新バージョンでは、主にUI(ユーザーインターフェース)とUX(ユーザーエクスペリエンス)の向上が図られています。友達を招待したり、QRコードを読み取って素早くDMを作成できるようになりました。
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.11
|
2
fastlane/metadata/android/ja/changelogs/40100120.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100120.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.12
|
2
fastlane/metadata/android/ja/changelogs/40100130.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100130.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.13
|
2
fastlane/metadata/android/ja/changelogs/40100140.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100140.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: 部屋の許可、自動のテーマ切替、そして多くのバグを修正しました。
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.14
|
2
fastlane/metadata/android/ja/changelogs/40100150.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100150.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: ソーシャルログインに対応しました。
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15
|
2
fastlane/metadata/android/ja/changelogs/40100160.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100160.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
|
2
fastlane/metadata/android/ja/changelogs/40100170.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40100170.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: バグの修正!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.17
|
2
fastlane/metadata/android/ja/changelogs/40101000.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40101000.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.0
|
2
fastlane/metadata/android/ja/changelogs/40101010.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40101010.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.1
|
2
fastlane/metadata/android/ja/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/ja/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/ja/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
|
||||
すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
30
fastlane/metadata/android/ja/full_description.txt
Normal file
30
fastlane/metadata/android/ja/full_description.txt
Normal file
|
@ -0,0 +1,30 @@
|
|||
Elementはまったく新しいタイプのメッセンジャーアプリです。
|
||||
|
||||
1. あなた自身がプライバシーをコントロールすることを可能にします。
|
||||
2. Matrixネットワークにいる誰とでも通信できることはもちろん、Slackなどのアプリとの連携によって他のネットワークとも通信ができます。
|
||||
3. 広告、データ収集、バックドア、ユーザーの囲い込みから逃れることができます。
|
||||
4. エンドツーエンド暗号化とクロス署名によってあなたを保護します。
|
||||
|
||||
Elementは非中央集権型でオープンソースであるため、他のメッセンジャーアプリとは完全に異なっています。
|
||||
|
||||
Elementはあなた自身でサーバーをホストすることも、サーバーを選ぶこともできます。これによってあなたのデータと会話に関するプライバシーや所有権はあなた自身で管理できるようになります。さらに、あなたは他のElementユーザーと話せるだけでなくオープンネットワークへのアクセスも可能です。とてもセキュアです。
|
||||
|
||||
Elementは、オープンな分散型通信の標準規格であるMatrixで動作するため、これらすべてを実現することができています。
|
||||
|
||||
Elementではあなたの会話をどのサーバーでホストするか決めることができます。アプリでは、さまざまな方法で選択できます。
|
||||
|
||||
1. matrix.orgの公開サーバーで無料のアカウントを取得します。
|
||||
2. あなた自身のハードウェアでサーバーを動かし、アカウントを管理します。
|
||||
3. Element Matrix Servicesのホスティングプラットフォームに登録することで、カスタムサーバー上のアカウントを取得できます。
|
||||
|
||||
<b>なぜElementを選ぶべきなのか?</b>
|
||||
|
||||
<b>データの所有権</b>: 自分でデータやメッセージを保管する場所を決めることができます。あなたが所有権を持ってコントロールすることで、第三者にあなたのデータを渡したり、ビッグデータを収集する巨大テック企業に依存する必要がなくなります。
|
||||
|
||||
<b>開かれたネットワークと共同作業</b>: Matrixネットワーク内の他の誰とでも、あるいはElementや他のMatrixアプリを使っているかどうかに関わらず、またSlack、IRC、XMPPのような他のメッセージングシステムを使っているかどうかに関わらず、チャットすることができます。
|
||||
|
||||
<b>はるかに安全</b>: 本物のエンドツーエンド暗号化(会話に参加している者のみがメッセージを読める)と会話参加者の真正性を確認するためクロス署名によって。
|
||||
|
||||
<b>完全なるコミュニケーションの訪れ</b>: テキスト、音声通話、ビデオ通話、ファイル共有、画面共有、連携機能、ボット、ウィジェットなどのコミュニケーションに必要な機能の全てが実装されています。ルームやコミュニティを立ち上げて連絡を取り合い、物事をスムーズに成し遂げることができます。
|
||||
|
||||
<b>いつでもどこでも!</b>: すべてのデバイスとウェブ(https://app.element.io)でメッセージの履歴が完全に同期されるため、どこにいても連絡を取ることができます。
|
1
fastlane/metadata/android/ja/short_description.txt
Normal file
1
fastlane/metadata/android/ja/short_description.txt
Normal file
|
@ -0,0 +1 @@
|
|||
安全な分散型チャットとVoIP。あなたの情報が第三者から守られます。
|
1
fastlane/metadata/android/ja/title.txt
Normal file
1
fastlane/metadata/android/ja/title.txt
Normal file
|
@ -0,0 +1 @@
|
|||
Element(エレメントメッセンジャー)
|
2
fastlane/metadata/android/nb-NO/changelogs/40100120.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40100120.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: URL-forhåndsvisning, nytt Emoji-tastatur, nye rominnstillingsmuligheter og snø til jul!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.12
|
2
fastlane/metadata/android/nb-NO/changelogs/40100130.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40100130.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: URL-forhåndsvisning, nytt Emoji-tastatur, nye rominnstillingsmuligheter og snø til jul!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.13
|
2
fastlane/metadata/android/nb-NO/changelogs/40100140.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40100140.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: Rediger romtillatelser, automatisk lys/mørkt tema og en haug med feilrettinger.
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.14
|
2
fastlane/metadata/android/nb-NO/changelogs/40100150.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40100150.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: Sosial innloggingsstøtte.
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.15
|
2
fastlane/metadata/android/nb-NO/changelogs/40100160.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40100160.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: Sosial innloggingsstøtte.
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.15 og https://github.com/vector-im/element-android/releases/tag/v1.0.16
|
2
fastlane/metadata/android/nb-NO/changelogs/40100170.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40100170.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: Feilrettinger!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.17
|
2
fastlane/metadata/android/nb-NO/changelogs/40101000.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40101000.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: forbedring av VoIP (lyd og videosamtaler i DM) og feilrettinger!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.0
|
2
fastlane/metadata/android/nb-NO/changelogs/40101010.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40101010.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: forbedring av ytelsen og feilrettinger!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.1
|
2
fastlane/metadata/android/nb-NO/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: forbedring av ytelsen og feilrettinger!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/nb-NO/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/nb-NO/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: forbedring av ytelsen og feilrettinger!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
30
fastlane/metadata/android/nb-NO/full_description.txt
Normal file
30
fastlane/metadata/android/nb-NO/full_description.txt
Normal file
|
@ -0,0 +1,30 @@
|
|||
Element er en ny type messenger og samarbeidsapp som:
|
||||
|
||||
1. Gir deg kontrollen for å bevare personvernet ditt
|
||||
2. Lar deg kommunisere med hvem som helst i Matrix-nettverket, og til og med ved å integrere med apper som Slack
|
||||
3. Beskytter deg mot reklame, datamining og inngjerdede hager
|
||||
4. Sikrer deg gjennom end-to-end-kryptering, med kryssignering for å bekrefte andre
|
||||
|
||||
Element er helt forskjellig fra andre meldings- og samarbeidsapper fordi det er desentralisert og åpen kildekode.
|
||||
|
||||
Element lar deg selv være vert - eller velge en vert - slik at du har personvern, eierskap og kontroll over dataene og samtalene dine. Det gir deg tilgang til et åpent nettverk; slik at du ikke bare holder på å snakke med bare andre Element-brukere. Og det er veldig sikkert.
|
||||
|
||||
Element er i stand til å gjøre alt dette fordi det opererer på Matrix - standarden for åpen, desentralisert kommunikasjon.
|
||||
|
||||
Element setter deg i kontroll ved å la deg velge hvem som er vert for samtalene dine. Fra Element-appen kan du velge å være vert på forskjellige måter:
|
||||
|
||||
1. Få en gratis konto på matrix.org-serveren som er vert for Matrix-utviklerne, eller velg blant tusenvis av offentlige servere som er vert for frivillige
|
||||
2. Vær vert for kontoen din ved å kjøre en server på din egen maskinvare
|
||||
3. Registrer deg for en konto på en tilpasset server ved å bare abonnere på Hosting Matrix Services-vertsplattformen
|
||||
|
||||
<b> Hvorfor velge Element? </b>
|
||||
|
||||
<b> EGNE DATA DINE </b>: Du bestemmer hvor du vil oppbevare dataene og meldingene dine. Du eier den og kontrollerer den, ikke noe MEGACORP som utvinner dataene dine eller gir tilgang til tredjeparter.
|
||||
|
||||
<b> ÅPEN MELDING OG SAMARBEID </b>: Du kan chatte med alle andre i Matrix-nettverket, enten de bruker Element eller en annen Matrix-app, og selv om de bruker et annet meldingssystem som Slack, IRC eller XMPP.
|
||||
|
||||
<b> SUPER-SECURE </b>: Ekte end-to-end-kryptering (bare de i samtalen kan dekryptere meldinger), og kryssignering for å verifisere enhetene til samtaledeltakerne.
|
||||
|
||||
<b> KOMPLETT KOMMUNIKASJON </b>: Meldinger, tale- og videosamtaler, fildeling, skjermdeling og en hel haug med integrasjoner, bots og widgets. Bygg rom, lokalsamfunn, hold kontakten og få ting gjort.
|
||||
|
||||
<b> ALT DER DU ER </b>: Hold kontakten uansett hvor du er med fullt synkronisert meldingslogg på alle enhetene dine og på nettet på https://app.element.io.
|
2
fastlane/metadata/android/nb/changelogs/40100170.txt
Normal file
2
fastlane/metadata/android/nb/changelogs/40100170.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: Bugfikser!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.17
|
2
fastlane/metadata/android/nb/changelogs/40101010.txt
Normal file
2
fastlane/metadata/android/nb/changelogs/40101010.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hovedendringene i denne versjonen: Forbedringer i ytelse og bugfikser!
|
||||
Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.1
|
2
fastlane/metadata/android/ru/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/ru/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Основные изменения в этой версии: улучшение производительности и исправления ошибок!
|
||||
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/ru/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/ru/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Основные изменения в этой версии: улучшение производительности и исправления ошибок!
|
||||
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
2
fastlane/metadata/android/sv/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/sv/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Huvudsakliga ändringar i den här versionen: prestandaförbättringar och buggfixar!
|
||||
Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/sv/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/sv/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Huvudsakliga ändringar i den här versionen: prestandaförbättringar och buggfixar!
|
||||
Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
2
fastlane/metadata/android/uk/changelogs/40101020.txt
Normal file
2
fastlane/metadata/android/uk/changelogs/40101020.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Основні зміни в цій версії: поліпшення продуктивності та виправлення помилок!
|
||||
Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
2
fastlane/metadata/android/uk/changelogs/40101030.txt
Normal file
2
fastlane/metadata/android/uk/changelogs/40101030.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Основні зміни в цій версії: поліпшення продуктивності та виправлення помилок!
|
||||
Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
|
@ -0,0 +1,2 @@
|
|||
此版本中的主要變更:效能改進與錯誤修復!
|
||||
完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.2
|
|
@ -0,0 +1,2 @@
|
|||
此版本中的主要變更:效能改進與錯誤修復!
|
||||
完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.3
|
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
|
@ -1,6 +1,6 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionSha256Sum=9af5c8e7e2cd1a3b0f694a4ac262b9f38c75262e74a9e8b5101af302a6beadd7
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip
|
||||
distributionSha256Sum=81003f83b0056d20eedf48cddd4f52a9813163d4ba185bcf8abd34b8eeea4cbd
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
|
@ -1,2 +1 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="org.matrix.android.sdk.rx" />
|
||||
<manifest package="org.matrix.android.sdk.rx" />
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
/*
|
||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.rx
|
||||
|
||||
import org.matrix.android.sdk.api.MatrixCallback
|
||||
import org.matrix.android.sdk.api.util.Cancelable
|
||||
import io.reactivex.Completable
|
||||
import io.reactivex.Single
|
||||
|
||||
fun <T> singleBuilder(builder: (MatrixCallback<T>) -> Cancelable): Single<T> = Single.create { emitter ->
|
||||
val callback = object : MatrixCallback<T> {
|
||||
override fun onSuccess(data: T) {
|
||||
// Add `!!` to fix the warning:
|
||||
// "Type mismatch: type parameter with nullable bounds is used T is used where T was expected. This warning will become an error soon"
|
||||
emitter.onSuccess(data!!)
|
||||
}
|
||||
|
||||
override fun onFailure(failure: Throwable) {
|
||||
emitter.tryOnError(failure)
|
||||
}
|
||||
}
|
||||
val cancelable = builder(callback)
|
||||
emitter.setCancellable {
|
||||
cancelable.cancel()
|
||||
}
|
||||
}
|
||||
|
||||
fun <T> completableBuilder(builder: (MatrixCallback<T>) -> Cancelable): Completable = Completable.create { emitter ->
|
||||
val callback = object : MatrixCallback<T> {
|
||||
override fun onSuccess(data: T) {
|
||||
emitter.onComplete()
|
||||
}
|
||||
|
||||
override fun onFailure(failure: Throwable) {
|
||||
emitter.tryOnError(failure)
|
||||
}
|
||||
}
|
||||
val cancelable = builder(callback)
|
||||
emitter.setCancellable {
|
||||
cancelable.cancel()
|
||||
}
|
||||
}
|
|
@ -39,6 +39,7 @@ import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
|||
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
||||
import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams
|
||||
import org.matrix.android.sdk.api.session.sync.SyncState
|
||||
import org.matrix.android.sdk.api.session.user.model.User
|
||||
import org.matrix.android.sdk.api.session.widgets.model.Widget
|
||||
|
@ -66,6 +67,13 @@ class RxSession(private val session: Session) {
|
|||
}
|
||||
}
|
||||
|
||||
fun liveSpaceSummaries(queryParams: SpaceSummaryQueryParams): Observable<List<RoomSummary>> {
|
||||
return session.spaceService().getSpaceSummariesLive(queryParams).asObservable()
|
||||
.startWithCallable {
|
||||
session.spaceService().getSpaceSummaries(queryParams)
|
||||
}
|
||||
}
|
||||
|
||||
fun liveBreadcrumbs(queryParams: RoomSummaryQueryParams): Observable<List<RoomSummary>> {
|
||||
return session.getBreadcrumbsLive(queryParams).asObservable()
|
||||
.startWithCallable {
|
||||
|
|
|
@ -6,10 +6,13 @@ apply plugin: 'realm-android'
|
|||
|
||||
buildscript {
|
||||
repositories {
|
||||
mavenCentral()
|
||||
// mavenCentral()
|
||||
//noinspection GrDeprecatedAPIUsage
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath "io.realm:realm-gradle-plugin:10.4.0"
|
||||
// Stick to this version until https://github.com/realm/realm-java/issues/7402 is fixed
|
||||
classpath "io.realm:realm-gradle-plugin:10.3.1"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -112,7 +115,7 @@ dependencies {
|
|||
def lifecycle_version = '2.2.0'
|
||||
def arch_version = '2.1.0'
|
||||
def markwon_version = '3.1.0'
|
||||
def daggerVersion = '2.34'
|
||||
def daggerVersion = '2.35'
|
||||
def work_version = '2.5.0'
|
||||
def retrofit_version = '2.9.0'
|
||||
|
||||
|
@ -165,8 +168,11 @@ dependencies {
|
|||
implementation 'com.jakewharton.timber:timber:4.7.1'
|
||||
implementation 'com.facebook.stetho:stetho-okhttp3:1.6.0'
|
||||
|
||||
// Video compression
|
||||
implementation 'com.otaliastudios:transcoder:0.10.3'
|
||||
|
||||
// Phone number https://github.com/google/libphonenumber
|
||||
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.21'
|
||||
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.22'
|
||||
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.robolectric:robolectric:4.5.1'
|
||||
|
@ -184,7 +190,7 @@ dependencies {
|
|||
androidTestImplementation 'androidx.test:rules:1.3.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
|
||||
androidTestImplementation 'org.amshove.kluent:kluent-android:1.61'
|
||||
androidTestImplementation 'org.amshove.kluent:kluent-android:1.65'
|
||||
androidTestImplementation 'io.mockk:mockk-android:1.11.0'
|
||||
androidTestImplementation "androidx.arch.core:core-testing:$arch_version"
|
||||
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
|
||||
|
|
|
@ -18,6 +18,8 @@ package org.matrix.android.sdk.internal.crypto
|
|||
|
||||
import android.util.Log
|
||||
import androidx.test.ext.junit.runners.AndroidJUnit4
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertNotNull
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
@ -29,8 +31,6 @@ import org.matrix.android.sdk.common.CommonTestHelper
|
|||
import org.matrix.android.sdk.common.CryptoTestHelper
|
||||
import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
|
||||
import org.matrix.android.sdk.internal.crypto.model.event.RoomKeyContent
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertNotNull
|
||||
|
||||
@RunWith(AndroidJUnit4::class)
|
||||
@FixMethodOrder(MethodSorters.JVM)
|
||||
|
@ -54,7 +54,7 @@ class PreShareKeysTest : InstrumentedTest {
|
|||
&& it.getClearType() == EventType.ROOM_KEY
|
||||
}
|
||||
|
||||
assertEquals(0, preShareCount, "Bob should not have receive any key from alice at this point")
|
||||
assertEquals("Bob should not have receive any key from alice at this point", 0, preShareCount)
|
||||
Log.d("#Test", "Room Key Received from alice $preShareCount")
|
||||
|
||||
// Force presharing of new outbound key
|
||||
|
@ -78,14 +78,14 @@ class PreShareKeysTest : InstrumentedTest {
|
|||
}
|
||||
|
||||
val content = latest?.getClearContent().toModel<RoomKeyContent>()
|
||||
assertNotNull(content, "Bob should have received and decrypted a room key event from alice")
|
||||
assertEquals(e2eRoomID, content.roomId, "Wrong room")
|
||||
assertNotNull("Bob should have received and decrypted a room key event from alice", content)
|
||||
assertEquals("Wrong room", e2eRoomID, content!!.roomId)
|
||||
val megolmSessionId = content.sessionId!!
|
||||
|
||||
val sharedIndex = aliceSession.cryptoService().getSharedWithInfo(e2eRoomID, megolmSessionId)
|
||||
.getObject(bobSession.myUserId, bobSession.sessionParams.deviceId)
|
||||
|
||||
assertEquals(0, sharedIndex, "The session received by bob should match what alice sent")
|
||||
assertEquals("The session received by bob should match what alice sent", 0, sharedIndex)
|
||||
|
||||
// Just send a real message as test
|
||||
val sentEvent = mTestHelper.sendTextMessage(aliceSession.getRoom(e2eRoomID)!!, "Allo", 1).first()
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package org.matrix.android.sdk.session.room.timeline
|
||||
|
||||
import org.junit.Assert.fail
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
@ -29,7 +30,6 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
|
|||
import org.matrix.android.sdk.common.CommonTestHelper
|
||||
import org.matrix.android.sdk.common.CryptoTestHelper
|
||||
import java.util.concurrent.CountDownLatch
|
||||
import kotlin.test.fail
|
||||
|
||||
@RunWith(JUnit4::class)
|
||||
@FixMethodOrder(MethodSorters.JVM)
|
||||
|
@ -80,6 +80,7 @@ class TimelineWithManyMembersTest : InstrumentedTest {
|
|||
return@createEventListener true
|
||||
} else {
|
||||
fail("User " + session.myUserId + " decrypted as " + body + " CryptoError: " + it.root.mCryptoError)
|
||||
false
|
||||
}
|
||||
} ?: return@createEventListener false
|
||||
}
|
||||
|
|
|
@ -0,0 +1,222 @@
|
|||
/*
|
||||
* Copyright 2021 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.session.space
|
||||
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertNotNull
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.JUnit4
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.matrix.android.sdk.InstrumentedTest
|
||||
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
|
||||
import org.matrix.android.sdk.api.session.events.model.EventType
|
||||
import org.matrix.android.sdk.api.session.events.model.toModel
|
||||
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||
import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomGuestAccessContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomType
|
||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomPreset
|
||||
import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent
|
||||
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
|
||||
import org.matrix.android.sdk.api.session.space.JoinSpaceResult
|
||||
import org.matrix.android.sdk.common.CommonTestHelper
|
||||
import org.matrix.android.sdk.common.SessionTestParams
|
||||
|
||||
@RunWith(JUnit4::class)
|
||||
@FixMethodOrder(MethodSorters.JVM)
|
||||
class SpaceCreationTest : InstrumentedTest {
|
||||
|
||||
private val commonTestHelper = CommonTestHelper(context())
|
||||
|
||||
@Test
|
||||
fun createSimplePublicSpace() {
|
||||
val session = commonTestHelper.createAccount("Hubble", SessionTestParams(true))
|
||||
val roomName = "My Space"
|
||||
val topic = "A public space for test"
|
||||
var spaceId: String = ""
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
spaceId = session.spaceService().createSpace(roomName, topic, null, true)
|
||||
// wait a bit to let the summary update it self :/
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
val syncedSpace = session.spaceService().getSpace(spaceId)
|
||||
commonTestHelper.waitWithLatch {
|
||||
commonTestHelper.retryPeriodicallyWithLatch(it) {
|
||||
syncedSpace?.asRoom()?.roomSummary()?.name != null
|
||||
}
|
||||
}
|
||||
assertEquals("Room name should be set", roomName, syncedSpace?.asRoom()?.roomSummary()?.name)
|
||||
assertEquals("Room topic should be set", topic, syncedSpace?.asRoom()?.roomSummary()?.topic)
|
||||
// assertEquals(topic, syncedSpace.asRoom().roomSummary()?., "Room topic should be set")
|
||||
|
||||
assertNotNull("Space should be found by Id", syncedSpace)
|
||||
val creationEvent = syncedSpace!!.asRoom().getStateEvent(EventType.STATE_ROOM_CREATE)
|
||||
val createContent = creationEvent?.content.toModel<RoomCreateContent>()
|
||||
assertEquals("Room type should be space", RoomType.SPACE, createContent?.type)
|
||||
|
||||
var powerLevelsContent: PowerLevelsContent? = null
|
||||
commonTestHelper.waitWithLatch { latch ->
|
||||
commonTestHelper.retryPeriodicallyWithLatch(latch) {
|
||||
val toModel = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_POWER_LEVELS)?.content.toModel<PowerLevelsContent>()
|
||||
powerLevelsContent = toModel
|
||||
toModel != null
|
||||
}
|
||||
}
|
||||
assertEquals("Space-rooms should be created with a power level for events_default of 100", 100, powerLevelsContent?.eventsDefault)
|
||||
|
||||
val guestAccess = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_GUEST_ACCESS)?.content
|
||||
?.toModel<RoomGuestAccessContent>()?.guestAccess
|
||||
|
||||
assertEquals("Public space room should be peekable by guest", GuestAccess.CanJoin, guestAccess)
|
||||
|
||||
val historyVisibility = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_HISTORY_VISIBILITY)?.content
|
||||
?.toModel<RoomHistoryVisibilityContent>()?.historyVisibility
|
||||
|
||||
assertEquals("Public space room should be world readable", RoomHistoryVisibility.WORLD_READABLE, historyVisibility)
|
||||
|
||||
commonTestHelper.signOutAndClose(session)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testJoinSimplePublicSpace() {
|
||||
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
|
||||
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
|
||||
|
||||
val roomName = "My Space"
|
||||
val topic = "A public space for test"
|
||||
val spaceId: String
|
||||
runBlocking {
|
||||
spaceId = aliceSession.spaceService().createSpace(roomName, topic, null, true)
|
||||
// wait a bit to let the summary update it self :/
|
||||
delay(400)
|
||||
}
|
||||
|
||||
// Try to join from bob, it's a public space no need to invite
|
||||
|
||||
val joinResult: JoinSpaceResult
|
||||
runBlocking {
|
||||
joinResult = bobSession.spaceService().joinSpace(spaceId)
|
||||
}
|
||||
|
||||
assertEquals(JoinSpaceResult.Success, joinResult)
|
||||
|
||||
val spaceBobPov = bobSession.spaceService().getSpace(spaceId)
|
||||
assertEquals("Room name should be set", roomName, spaceBobPov?.asRoom()?.roomSummary()?.name)
|
||||
assertEquals("Room topic should be set", topic, spaceBobPov?.asRoom()?.roomSummary()?.topic)
|
||||
|
||||
commonTestHelper.signOutAndClose(aliceSession)
|
||||
commonTestHelper.signOutAndClose(bobSession)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testSimplePublicSpaceWithChildren() {
|
||||
val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
|
||||
val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
|
||||
|
||||
val roomName = "My Space"
|
||||
val topic = "A public space for test"
|
||||
|
||||
val spaceId: String = runBlocking { aliceSession.spaceService().createSpace(roomName, topic, null, true) }
|
||||
val syncedSpace = aliceSession.spaceService().getSpace(spaceId)
|
||||
|
||||
// create a room
|
||||
var firstChild: String? = null
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
firstChild = aliceSession.createRoom(CreateRoomParams().apply {
|
||||
this.name = "FirstRoom"
|
||||
this.topic = "Description of first room"
|
||||
this.preset = CreateRoomPreset.PRESET_PUBLIC_CHAT
|
||||
})
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
syncedSpace?.addChildren(firstChild!!, listOf(aliceSession.sessionParams.homeServerHost ?: ""), "a", true, suggested = true)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
var secondChild: String? = null
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
secondChild = aliceSession.createRoom(CreateRoomParams().apply {
|
||||
this.name = "SecondRoom"
|
||||
this.topic = "Description of second room"
|
||||
this.preset = CreateRoomPreset.PRESET_PUBLIC_CHAT
|
||||
})
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
syncedSpace?.addChildren(secondChild!!, listOf(aliceSession.sessionParams.homeServerHost ?: ""), "b", false, suggested = true)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
// Try to join from bob, it's a public space no need to invite
|
||||
var joinResult: JoinSpaceResult? = null
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
joinResult = bobSession.spaceService().joinSpace(spaceId)
|
||||
// wait a bit to let the summary update it self :/
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
assertEquals(JoinSpaceResult.Success, joinResult)
|
||||
|
||||
val spaceBobPov = bobSession.spaceService().getSpace(spaceId)
|
||||
assertEquals("Room name should be set", roomName, spaceBobPov?.asRoom()?.roomSummary()?.name)
|
||||
assertEquals("Room topic should be set", topic, spaceBobPov?.asRoom()?.roomSummary()?.topic)
|
||||
|
||||
// check if bob has joined automatically the first room
|
||||
|
||||
val bobMembershipFirstRoom = bobSession.getRoomSummary(firstChild!!)?.membership
|
||||
assertEquals("Bob should have joined this room", Membership.JOIN, bobMembershipFirstRoom)
|
||||
RoomSummaryQueryParams.Builder()
|
||||
|
||||
val childCount = bobSession.getRoomSummaries(
|
||||
roomSummaryQueryParams {
|
||||
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(spaceId)
|
||||
}
|
||||
).size
|
||||
|
||||
assertEquals("Unexpected number of joined children", 1, childCount)
|
||||
|
||||
commonTestHelper.signOutAndClose(aliceSession)
|
||||
commonTestHelper.signOutAndClose(bobSession)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,472 @@
|
|||
/*
|
||||
* Copyright 2021 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.session.space
|
||||
|
||||
import android.util.Log
|
||||
import androidx.lifecycle.Observer
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertNotNull
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.FixMethodOrder
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
import org.junit.runners.JUnit4
|
||||
import org.junit.runners.MethodSorters
|
||||
import org.matrix.android.sdk.InstrumentedTest
|
||||
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomType
|
||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
||||
import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
|
||||
import org.matrix.android.sdk.common.CommonTestHelper
|
||||
import org.matrix.android.sdk.common.SessionTestParams
|
||||
|
||||
@RunWith(JUnit4::class)
|
||||
@FixMethodOrder(MethodSorters.JVM)
|
||||
class SpaceHierarchyTest : InstrumentedTest {
|
||||
|
||||
private val commonTestHelper = CommonTestHelper(context())
|
||||
|
||||
@Test
|
||||
fun createCanonicalChildRelation() {
|
||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||
val spaceName = "My Space"
|
||||
val topic = "A public space for test"
|
||||
var spaceId: String = ""
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
spaceId = session.spaceService().createSpace(spaceName, topic, null, true)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
val syncedSpace = session.spaceService().getSpace(spaceId)
|
||||
|
||||
var roomId: String = ""
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
roomId = session.createRoom(CreateRoomParams().apply { name = "General" })
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
|
||||
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
syncedSpace!!.addChildren(roomId, viaServers, null, true)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
session.spaceService().setSpaceParent(roomId, spaceId, true, viaServers)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
Thread.sleep(9000)
|
||||
|
||||
val parents = session.getRoom(roomId)?.roomSummary()?.spaceParents
|
||||
val canonicalParents = session.getRoom(roomId)?.roomSummary()?.spaceParents?.filter { it.canonical == true }
|
||||
|
||||
parents?.forEach {
|
||||
Log.d("## TEST", "parent : $it")
|
||||
}
|
||||
|
||||
assertNotNull(parents)
|
||||
assertEquals(1, parents!!.size)
|
||||
assertEquals(spaceName, parents.first().roomSummary?.name)
|
||||
|
||||
assertNotNull(canonicalParents)
|
||||
assertEquals(1, canonicalParents!!.size)
|
||||
assertEquals(spaceName, canonicalParents.first().roomSummary?.name)
|
||||
}
|
||||
|
||||
// @Test
|
||||
// fun testCreateChildRelations() {
|
||||
// val session = commonTestHelper.createAccount("Jhon", SessionTestParams(true))
|
||||
// val spaceName = "My Space"
|
||||
// val topic = "A public space for test"
|
||||
// Log.d("## TEST", "Before")
|
||||
//
|
||||
// var spaceId = ""
|
||||
// commonTestHelper.waitWithLatch {
|
||||
// GlobalScope.launch {
|
||||
// spaceId = session.spaceService().createSpace(spaceName, topic, null, true)
|
||||
// it.countDown()
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// Log.d("## TEST", "created space $spaceId ${Thread.currentThread()}")
|
||||
// val syncedSpace = session.spaceService().getSpace(spaceId)
|
||||
//
|
||||
// val children = listOf("General" to true /*canonical*/, "Random" to false)
|
||||
//
|
||||
// // val roomIdList = children.map {
|
||||
// // runBlocking {
|
||||
// // session.createRoom(CreateRoomParams().apply { name = it.first })
|
||||
// // } to it.second
|
||||
// // }
|
||||
// val roomIdList = mutableListOf<Pair<String, Boolean>>()
|
||||
// commonTestHelper.waitWithLatch {
|
||||
// GlobalScope.launch {
|
||||
// children.forEach {
|
||||
// val rID = session.createRoom(CreateRoomParams().apply { name = it.first })
|
||||
// roomIdList.add(rID to it.second)
|
||||
// }
|
||||
// it.countDown()
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
|
||||
//
|
||||
// commonTestHelper.waitWithLatch {
|
||||
// GlobalScope.launch {
|
||||
// roomIdList.forEach { entry ->
|
||||
// syncedSpace!!.addChildren(entry.first, viaServers, null, true)
|
||||
// }
|
||||
// it.countDown()
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// commonTestHelper.waitWithLatch {
|
||||
// GlobalScope.launch {
|
||||
// roomIdList.forEach {
|
||||
// session.spaceService().setSpaceParent(it.first, spaceId, it.second, viaServers)
|
||||
// }
|
||||
// it.countDown()
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// roomIdList.forEach {
|
||||
// val parents = session.getRoom(it.first)?.roomSummary()?.spaceParents
|
||||
// val canonicalParents = session.getRoom(it.first)?.roomSummary()?.spaceParents?.filter { it.canonical == true }
|
||||
//
|
||||
// assertNotNull(parents)
|
||||
// assertEquals("Unexpected number of parent", 1, parents!!.size)
|
||||
// assertEquals("Unexpected parent name", spaceName, parents.first().roomSummary?.name)
|
||||
// assertEquals("Parent of ${it.first} should be canonical ${it.second}", if (it.second) 1 else 0, canonicalParents?.size ?: 0)
|
||||
// }
|
||||
// }
|
||||
|
||||
@Test
|
||||
fun testFilteringBySpace() {
|
||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||
|
||||
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
||||
Triple("A1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("A2", true, true)
|
||||
))
|
||||
|
||||
val spaceBInfo = createPublicSpace(session, "SpaceB", listOf(
|
||||
Triple("B1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("B2", true, true),
|
||||
Triple("B3", true, true)
|
||||
))
|
||||
|
||||
val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
|
||||
Triple("C1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("C2", true, true)
|
||||
))
|
||||
|
||||
// add C as a subspace of A
|
||||
val spaceA = session.spaceService().getSpace(spaceAInfo.spaceId)
|
||||
val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
spaceA!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
|
||||
session.spaceService().setSpaceParent(spaceCInfo.spaceId, spaceAInfo.spaceId, true, viaServers)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
// Create orphan rooms
|
||||
|
||||
var orphan1 = ""
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
orphan1 = session.createRoom(CreateRoomParams().apply { name = "O1" })
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
var orphan2 = ""
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
orphan2 = session.createRoom(CreateRoomParams().apply { name = "O2" })
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
val allRooms = session.getRoomSummaries(roomSummaryQueryParams { excludeType = listOf(RoomType.SPACE) })
|
||||
|
||||
assertEquals("Unexpected number of rooms", 9, allRooms.size)
|
||||
|
||||
val orphans = session.getFlattenRoomSummaryChildrenOf(null)
|
||||
|
||||
assertEquals("Unexpected number of orphan rooms", 2, orphans.size)
|
||||
assertTrue("O1 should be an orphan", orphans.any { it.roomId == orphan1 })
|
||||
assertTrue("O2 should be an orphan ${orphans.map { it.name }}", orphans.any { it.roomId == orphan2 })
|
||||
|
||||
val aChildren = session.getFlattenRoomSummaryChildrenOf(spaceAInfo.spaceId)
|
||||
|
||||
assertEquals("Unexpected number of flatten child rooms", 4, aChildren.size)
|
||||
assertTrue("A1 should be a child of A", aChildren.any { it.name == "A1" })
|
||||
assertTrue("A2 should be a child of A", aChildren.any { it.name == "A2" })
|
||||
assertTrue("CA should be a grand child of A", aChildren.any { it.name == "C1" })
|
||||
assertTrue("A1 should be a grand child of A", aChildren.any { it.name == "C2" })
|
||||
|
||||
// Add a non canonical child and check that it does not appear as orphan
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
val a3 = session.createRoom(CreateRoomParams().apply { name = "A3" })
|
||||
spaceA!!.addChildren(a3, viaServers, null, false)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
Thread.sleep(2_000)
|
||||
val orphansUpdate = session.getRoomSummaries(roomSummaryQueryParams {
|
||||
activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null)
|
||||
})
|
||||
assertEquals("Unexpected number of orphan rooms ${orphansUpdate.map { it.name }}", 2, orphansUpdate.size)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testBreakCycle() {
|
||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||
|
||||
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
||||
Triple("A1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("A2", true, true)
|
||||
))
|
||||
|
||||
val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
|
||||
Triple("C1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("C2", true, true)
|
||||
))
|
||||
|
||||
// add C as a subspace of A
|
||||
val spaceA = session.spaceService().getSpace(spaceAInfo.spaceId)
|
||||
val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
spaceA!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
|
||||
session.spaceService().setSpaceParent(spaceCInfo.spaceId, spaceAInfo.spaceId, true, viaServers)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
// add back A as subspace of C
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
val spaceC = session.spaceService().getSpace(spaceCInfo.spaceId)
|
||||
spaceC!!.addChildren(spaceAInfo.spaceId, viaServers, null, true)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
Thread.sleep(1000)
|
||||
|
||||
// A -> C -> A
|
||||
|
||||
val aChildren = session.getFlattenRoomSummaryChildrenOf(spaceAInfo.spaceId)
|
||||
|
||||
assertEquals("Unexpected number of flatten child rooms ${aChildren.map { it.name }}", 4, aChildren.size)
|
||||
assertTrue("A1 should be a child of A", aChildren.any { it.name == "A1" })
|
||||
assertTrue("A2 should be a child of A", aChildren.any { it.name == "A2" })
|
||||
assertTrue("CA should be a grand child of A", aChildren.any { it.name == "C1" })
|
||||
assertTrue("A1 should be a grand child of A", aChildren.any { it.name == "C2" })
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testLiveFlatChildren() {
|
||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||
|
||||
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
||||
Triple("A1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("A2", true, true)
|
||||
))
|
||||
|
||||
val spaceBInfo = createPublicSpace(session, "SpaceB", listOf(
|
||||
Triple("B1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("B2", true, true),
|
||||
Triple("B3", true, true)
|
||||
))
|
||||
|
||||
// add B as a subspace of A
|
||||
val spaceA = session.spaceService().getSpace(spaceAInfo.spaceId)
|
||||
val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
|
||||
runBlocking {
|
||||
spaceA!!.addChildren(spaceBInfo.spaceId, viaServers, null, true)
|
||||
session.spaceService().setSpaceParent(spaceBInfo.spaceId, spaceAInfo.spaceId, true, viaServers)
|
||||
}
|
||||
|
||||
val flatAChildren = runBlocking(Dispatchers.Main) {
|
||||
session.getFlattenRoomSummaryChildrenOfLive(spaceAInfo.spaceId)
|
||||
}
|
||||
|
||||
commonTestHelper.waitWithLatch { latch ->
|
||||
|
||||
val childObserver = object : Observer<List<RoomSummary>> {
|
||||
override fun onChanged(children: List<RoomSummary>?) {
|
||||
// Log.d("## TEST", "Space A flat children update : ${children?.map { it.name }}")
|
||||
System.out.println("## TEST | Space A flat children update : ${children?.map { it.name }}")
|
||||
if (children?.any { it.name == "C1" } == true && children.any { it.name == "C2" }) {
|
||||
// B1 has been added live!
|
||||
latch.countDown()
|
||||
flatAChildren.removeObserver(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
|
||||
Triple("C1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("C2", true, true)
|
||||
))
|
||||
|
||||
// add C as subspace of B
|
||||
runBlocking {
|
||||
val spaceB = session.spaceService().getSpace(spaceBInfo.spaceId)
|
||||
spaceB!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
|
||||
}
|
||||
|
||||
// C1 and C2 should be in flatten child of A now
|
||||
|
||||
GlobalScope.launch(Dispatchers.Main) { flatAChildren.observeForever(childObserver) }
|
||||
}
|
||||
|
||||
// Test part one of the rooms
|
||||
|
||||
val bRoomId = spaceBInfo.roomIds.first()
|
||||
val bRoom = session.getRoom(bRoomId)
|
||||
|
||||
commonTestHelper.waitWithLatch { latch ->
|
||||
|
||||
val childObserver = object : Observer<List<RoomSummary>> {
|
||||
override fun onChanged(children: List<RoomSummary>?) {
|
||||
System.out.println("## TEST | Space A flat children update : ${children?.map { it.name }}")
|
||||
if (children?.any { it.roomId == bRoomId } == false) {
|
||||
// B1 has been added live!
|
||||
latch.countDown()
|
||||
flatAChildren.removeObserver(this)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// part from b room
|
||||
runBlocking {
|
||||
bRoom!!.leave(null)
|
||||
}
|
||||
// The room should have disapear from flat children
|
||||
GlobalScope.launch(Dispatchers.Main) { flatAChildren.observeForever(childObserver) }
|
||||
}
|
||||
}
|
||||
|
||||
data class TestSpaceCreationResult(
|
||||
val spaceId: String,
|
||||
val roomIds: List<String>
|
||||
)
|
||||
|
||||
private fun createPublicSpace(session: Session,
|
||||
spaceName: String,
|
||||
childInfo: List<Triple<String, Boolean, Boolean?>>
|
||||
/** Name, auto-join, canonical*/
|
||||
): TestSpaceCreationResult {
|
||||
var spaceId = ""
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
spaceId = session.spaceService().createSpace(spaceName, "Test Topic", null, true)
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
|
||||
val syncedSpace = session.spaceService().getSpace(spaceId)
|
||||
val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
|
||||
|
||||
val roomIds =
|
||||
childInfo.map { entry ->
|
||||
var roomId = ""
|
||||
commonTestHelper.waitWithLatch {
|
||||
GlobalScope.launch {
|
||||
roomId = session.createRoom(CreateRoomParams().apply { name = entry.first })
|
||||
it.countDown()
|
||||
}
|
||||
}
|
||||
roomId
|
||||
}
|
||||
|
||||
roomIds.forEachIndexed { index, roomId ->
|
||||
runBlocking {
|
||||
syncedSpace!!.addChildren(roomId, viaServers, null, childInfo[index].second)
|
||||
val canonical = childInfo[index].third
|
||||
if (canonical != null) {
|
||||
session.spaceService().setSpaceParent(roomId, spaceId, canonical, viaServers)
|
||||
}
|
||||
}
|
||||
}
|
||||
return TestSpaceCreationResult(spaceId, roomIds)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testRootSpaces() {
|
||||
val session = commonTestHelper.createAccount("John", SessionTestParams(true))
|
||||
|
||||
val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
|
||||
Triple("A1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("A2", true, true)
|
||||
))
|
||||
|
||||
val spaceBInfo = createPublicSpace(session, "SpaceB", listOf(
|
||||
Triple("B1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("B2", true, true),
|
||||
Triple("B3", true, true)
|
||||
))
|
||||
|
||||
val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
|
||||
Triple("C1", true /*auto-join*/, true/*canonical*/),
|
||||
Triple("C2", true, true)
|
||||
))
|
||||
|
||||
val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
|
||||
|
||||
// add C as subspace of B
|
||||
runBlocking {
|
||||
val spaceB = session.spaceService().getSpace(spaceBInfo.spaceId)
|
||||
spaceB!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
|
||||
}
|
||||
|
||||
Thread.sleep(2000)
|
||||
// + A
|
||||
// a1, a2
|
||||
// + B
|
||||
// b1, b2, b3
|
||||
// + C
|
||||
// + c1, c2
|
||||
|
||||
val rootSpaces = session.spaceService().getRootSpaceSummaries()
|
||||
|
||||
assertEquals("Unexpected number of root spaces ${rootSpaces.map { it.name }}", 2, rootSpaces.size)
|
||||
}
|
||||
}
|
|
@ -16,12 +16,10 @@
|
|||
|
||||
package org.matrix.android.sdk.api.auth.data
|
||||
|
||||
sealed class LoginFlowResult {
|
||||
data class Success(
|
||||
val supportedLoginTypes: List<String>,
|
||||
val ssoIdentityProviders: List<SsoIdentityProvider>?,
|
||||
val isLoginAndRegistrationSupported: Boolean,
|
||||
val homeServerUrl: String,
|
||||
val isOutdatedHomeserver: Boolean
|
||||
) : LoginFlowResult()
|
||||
}
|
||||
data class LoginFlowResult(
|
||||
val supportedLoginTypes: List<String>,
|
||||
val ssoIdentityProviders: List<SsoIdentityProvider>?,
|
||||
val isLoginAndRegistrationSupported: Boolean,
|
||||
val homeServerUrl: String,
|
||||
val isOutdatedHomeserver: Boolean
|
||||
)
|
||||
|
|
|
@ -20,7 +20,9 @@ interface RegistrationWizard {
|
|||
|
||||
suspend fun getRegistrationFlow(): RegistrationResult
|
||||
|
||||
suspend fun createAccount(userName: String, password: String, initialDeviceDisplayName: String?): RegistrationResult
|
||||
suspend fun createAccount(userName: String?,
|
||||
password: String?,
|
||||
initialDeviceDisplayName: String?): RegistrationResult
|
||||
|
||||
suspend fun performReCaptcha(response: String): RegistrationResult
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@ import java.io.IOException
|
|||
*/
|
||||
sealed class Failure(cause: Throwable? = null) : Throwable(cause = cause) {
|
||||
data class Unknown(val throwable: Throwable? = null) : Failure(throwable)
|
||||
data class Cancelled(val throwable: Throwable? = null) : Failure(throwable)
|
||||
data class UnrecognizedCertificateFailure(val url: String, val fingerprint: Fingerprint) : Failure()
|
||||
data class NetworkConnection(val ioException: IOException? = null) : Failure(ioException)
|
||||
data class ServerError(val error: MatrixError, val httpCode: Int) : Failure(RuntimeException(error.toString()))
|
||||
|
|
|
@ -41,7 +41,7 @@ data class MatrixError(
|
|||
// For M_LIMIT_EXCEEDED
|
||||
@Json(name = "retry_after_ms") val retryAfterMillis: Long? = null,
|
||||
// For M_UNKNOWN_TOKEN
|
||||
@Json(name = "soft_logout") val isSoftLogout: Boolean = false,
|
||||
@Json(name = "soft_logout") val isSoftLogout: Boolean? = null,
|
||||
// For M_INVALID_PEPPER
|
||||
// {"error": "pepper does not match 'erZvr'", "lookup_pepper": "pQgMS", "algorithm": "sha256", "errcode": "M_INVALID_PEPPER"}
|
||||
@Json(name = "lookup_pepper") val newLookupPepper: String? = null,
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Copyright (c) 2021 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.api.query
|
||||
|
||||
sealed class ActiveSpaceFilter {
|
||||
object None : ActiveSpaceFilter()
|
||||
data class ActiveSpace(val currentSpaceId: String?) : ActiveSpaceFilter()
|
||||
data class ExcludeSpace(val spaceId: String) : ActiveSpaceFilter()
|
||||
}
|
|
@ -48,6 +48,7 @@ import org.matrix.android.sdk.api.session.search.SearchService
|
|||
import org.matrix.android.sdk.api.session.securestorage.SecureStorageService
|
||||
import org.matrix.android.sdk.api.session.securestorage.SharedSecretStorageService
|
||||
import org.matrix.android.sdk.api.session.signout.SignOutService
|
||||
import org.matrix.android.sdk.api.session.space.SpaceService
|
||||
import org.matrix.android.sdk.api.session.sync.FilterService
|
||||
import org.matrix.android.sdk.api.session.sync.SyncState
|
||||
import org.matrix.android.sdk.api.session.terms.TermsService
|
||||
|
@ -227,6 +228,11 @@ interface Session :
|
|||
*/
|
||||
fun thirdPartyService(): ThirdPartyService
|
||||
|
||||
/**
|
||||
* Returns the space service associated with the session
|
||||
*/
|
||||
fun spaceService(): SpaceService
|
||||
|
||||
/**
|
||||
* Add a listener to the session.
|
||||
* @param listener the listener to add.
|
||||
|
@ -249,13 +255,13 @@ interface Session :
|
|||
/**
|
||||
* A global session listener to get notified for some events.
|
||||
*/
|
||||
interface Listener {
|
||||
interface Listener : SessionLifecycleObserver {
|
||||
/**
|
||||
* Possible cases:
|
||||
* - The access token is not valid anymore,
|
||||
* - a M_CONSENT_NOT_GIVEN error has been received from the homeserver
|
||||
*/
|
||||
fun onGlobalError(globalError: GlobalError)
|
||||
fun onGlobalError(session: Session, globalError: GlobalError)
|
||||
}
|
||||
|
||||
val sharedSecretStorageService: SharedSecretStorageService
|
||||
|
|
|
@ -14,20 +14,19 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.matrix.android.sdk.internal.session
|
||||
package org.matrix.android.sdk.api.session
|
||||
|
||||
import androidx.annotation.MainThread
|
||||
|
||||
/**
|
||||
* This defines methods associated with some lifecycle events of a session.
|
||||
* A list of SessionLifecycle will be injected into [DefaultSession]
|
||||
*/
|
||||
internal interface SessionLifecycleObserver {
|
||||
interface SessionLifecycleObserver {
|
||||
/*
|
||||
Called when the session is opened
|
||||
*/
|
||||
@MainThread
|
||||
fun onSessionStarted() {
|
||||
fun onSessionStarted(session: Session) {
|
||||
// noop
|
||||
}
|
||||
|
||||
|
@ -35,7 +34,7 @@ internal interface SessionLifecycleObserver {
|
|||
Called when the session is cleared
|
||||
*/
|
||||
@MainThread
|
||||
fun onClearCache() {
|
||||
fun onClearCache(session: Session) {
|
||||
// noop
|
||||
}
|
||||
|
||||
|
@ -43,7 +42,7 @@ internal interface SessionLifecycleObserver {
|
|||
Called when the session is closed
|
||||
*/
|
||||
@MainThread
|
||||
fun onSessionStopped() {
|
||||
fun onSessionStopped(session: Session) {
|
||||
// noop
|
||||
}
|
||||
}
|
|
@ -31,6 +31,8 @@ interface ContentUploadStateTracker {
|
|||
sealed class State {
|
||||
object Idle : State()
|
||||
object EncryptingThumbnail : State()
|
||||
object CompressingImage : State()
|
||||
data class CompressingVideo(val percent: Float) : State()
|
||||
data class UploadingThumbnail(val current: Long, val total: Long) : State()
|
||||
data class Encrypting(val current: Long, val total: Long) : State()
|
||||
data class Uploading(val current: Long, val total: Long) : State()
|
||||
|
|
|
@ -28,6 +28,8 @@ import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult
|
|||
import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
|
||||
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||
import org.json.JSONObject
|
||||
import org.matrix.android.sdk.api.extensions.tryOrNull
|
||||
import org.matrix.android.sdk.api.failure.MatrixError
|
||||
import timber.log.Timber
|
||||
|
||||
typealias Content = JsonDict
|
||||
|
@ -90,6 +92,16 @@ data class Event(
|
|||
@Transient
|
||||
var sendState: SendState = SendState.UNKNOWN
|
||||
|
||||
@Transient
|
||||
var sendStateDetails: String? = null
|
||||
|
||||
fun sendStateError(): MatrixError? {
|
||||
return sendStateDetails?.let {
|
||||
val matrixErrorAdapter = MoshiProvider.providesMoshi().adapter(MatrixError::class.java)
|
||||
tryOrNull { matrixErrorAdapter.fromJson(it) }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The `age` value transcoded in a timestamp based on the device clock when the SDK received
|
||||
* the event from the home server.
|
||||
|
|
|
@ -52,6 +52,10 @@ object EventType {
|
|||
const val STATE_ROOM_GUEST_ACCESS = "m.room.guest_access"
|
||||
const val STATE_ROOM_POWER_LEVELS = "m.room.power_levels"
|
||||
|
||||
const val STATE_SPACE_CHILD = "m.space.child"
|
||||
|
||||
const val STATE_SPACE_PARENT = "m.space.parent"
|
||||
|
||||
/**
|
||||
* Note that this Event has been deprecated, see
|
||||
* - https://matrix.org/docs/spec/client_server/r0.6.1#historical-events
|
||||
|
@ -74,6 +78,7 @@ object EventType {
|
|||
const val CALL_NEGOTIATE = "m.call.negotiate"
|
||||
const val CALL_REJECT = "m.call.reject"
|
||||
const val CALL_HANGUP = "m.call.hangup"
|
||||
|
||||
// This type is not processed by the client, just sent to the server
|
||||
const val CALL_REPLACES = "m.call.replaces"
|
||||
|
||||
|
|
|
@ -29,14 +29,19 @@ import java.io.File
|
|||
*/
|
||||
interface FileService {
|
||||
|
||||
enum class FileState {
|
||||
IN_CACHE,
|
||||
DOWNLOADING,
|
||||
UNKNOWN
|
||||
sealed class FileState {
|
||||
/**
|
||||
* The original file is in cache, but the decrypted files can be deleted for security reason.
|
||||
* To decrypt the file again, call [downloadFile], the encrypted file will not be downloaded again
|
||||
* @param decryptedFileInCache true if the decrypted file is available. Always true for clear files.
|
||||
*/
|
||||
data class InCache(val decryptedFileInCache: Boolean) : FileState()
|
||||
object Downloading : FileState()
|
||||
object Unknown : FileState()
|
||||
}
|
||||
|
||||
/**
|
||||
* Download a file.
|
||||
* Download a file if necessary and ensure that if the file is encrypted, the file is decrypted.
|
||||
* Result will be a decrypted file, stored in the cache folder. url parameter will be used to create unique filename to avoid name collision.
|
||||
*/
|
||||
suspend fun downloadFile(fileName: String,
|
||||
|
|
|
@ -66,12 +66,13 @@ interface PushersService {
|
|||
|
||||
/**
|
||||
* Directly ask the push gateway to send a push to this device
|
||||
* If successful, the push gateway has accepted the request. In this case, the app should receive a Push with the provided eventId.
|
||||
* In case of error, PusherRejected will be thrown. In this case it means that the pushkey is not valid.
|
||||
*
|
||||
* @param url the push gateway url (full path)
|
||||
* @param appId the application id
|
||||
* @param pushkey the FCM token
|
||||
* @param eventId the eventId which will be sent in the Push message. Use a fake eventId.
|
||||
* @param callback callback to know if the push gateway has accepted the request. In this case, the app should receive a Push with the provided eventId.
|
||||
* In case of error, PusherRejected failure can happen. In this case it means that the pushkey is not valid.
|
||||
*/
|
||||
suspend fun testPush(url: String,
|
||||
appId: String,
|
||||
|
|
|
@ -34,6 +34,7 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineService
|
|||
import org.matrix.android.sdk.api.session.room.typing.TypingService
|
||||
import org.matrix.android.sdk.api.session.room.uploads.UploadsService
|
||||
import org.matrix.android.sdk.api.session.search.SearchResult
|
||||
import org.matrix.android.sdk.api.session.space.Space
|
||||
import org.matrix.android.sdk.api.util.Optional
|
||||
|
||||
/**
|
||||
|
@ -91,4 +92,9 @@ interface Room :
|
|||
beforeLimit: Int,
|
||||
afterLimit: Int,
|
||||
includeProfile: Boolean): SearchResult
|
||||
|
||||
/**
|
||||
* Use this room as a Space, if the type is correct.
|
||||
*/
|
||||
fun asSpace(): Space?
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ import androidx.lifecycle.LiveData
|
|||
import androidx.paging.PagedList
|
||||
import org.matrix.android.sdk.api.session.events.model.Event
|
||||
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
|
||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
|
||||
|
@ -177,13 +178,15 @@ interface RoomService {
|
|||
* TODO Doc
|
||||
*/
|
||||
fun getPagedRoomSummariesLive(queryParams: RoomSummaryQueryParams,
|
||||
pagedListConfig: PagedList.Config = defaultPagedListConfig): LiveData<PagedList<RoomSummary>>
|
||||
pagedListConfig: PagedList.Config = defaultPagedListConfig,
|
||||
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): LiveData<PagedList<RoomSummary>>
|
||||
|
||||
/**
|
||||
* TODO Doc
|
||||
*/
|
||||
fun getFilteredPagedRoomSummariesLive(queryParams: RoomSummaryQueryParams,
|
||||
pagedListConfig: PagedList.Config = defaultPagedListConfig): UpdatableFilterLivePageResult
|
||||
pagedListConfig: PagedList.Config = defaultPagedListConfig,
|
||||
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): UpdatableLivePageResult
|
||||
|
||||
/**
|
||||
* TODO Doc
|
||||
|
@ -197,4 +200,12 @@ interface RoomService {
|
|||
.setEnablePlaceholders(false)
|
||||
.setPrefetchDistance(10)
|
||||
.build()
|
||||
|
||||
fun getFlattenRoomSummaryChildrenOf(spaceId: String?, memberships: List<Membership> = Membership.activeMemberships()) : List<RoomSummary>
|
||||
|
||||
/**
|
||||
* Returns all the children of this space, as LiveData
|
||||
*/
|
||||
fun getFlattenRoomSummaryChildrenOfLive(spaceId: String?,
|
||||
memberships: List<Membership> = Membership.activeMemberships()): LiveData<List<RoomSummary>>
|
||||
}
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
/*
|
||||
* Copyright 2021 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.api.session.room
|
||||
|
||||
enum class RoomSortOrder {
|
||||
NAME,
|
||||
ACTIVITY,
|
||||
NONE
|
||||
}
|
|
@ -16,15 +16,35 @@
|
|||
|
||||
package org.matrix.android.sdk.api.session.room
|
||||
|
||||
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
|
||||
import org.matrix.android.sdk.api.query.QueryStringValue
|
||||
import org.matrix.android.sdk.api.query.RoomCategoryFilter
|
||||
import org.matrix.android.sdk.api.query.RoomTagQueryFilter
|
||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomType
|
||||
import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams
|
||||
|
||||
fun roomSummaryQueryParams(init: (RoomSummaryQueryParams.Builder.() -> Unit) = {}): RoomSummaryQueryParams {
|
||||
return RoomSummaryQueryParams.Builder().apply(init).build()
|
||||
}
|
||||
|
||||
fun spaceSummaryQueryParams(init: (RoomSummaryQueryParams.Builder.() -> Unit) = {}): SpaceSummaryQueryParams {
|
||||
return RoomSummaryQueryParams.Builder()
|
||||
.apply(init)
|
||||
.apply {
|
||||
includeType = listOf(RoomType.SPACE)
|
||||
excludeType = null
|
||||
roomCategoryFilter = RoomCategoryFilter.ONLY_ROOMS
|
||||
}
|
||||
.build()
|
||||
}
|
||||
|
||||
enum class RoomCategoryFilter {
|
||||
ONLY_DM,
|
||||
ONLY_ROOMS,
|
||||
ALL
|
||||
}
|
||||
|
||||
/**
|
||||
* This class can be used to filter room summaries to use with:
|
||||
* [org.matrix.android.sdk.api.session.room.Room] and [org.matrix.android.sdk.api.session.room.RoomService]
|
||||
|
@ -35,7 +55,11 @@ data class RoomSummaryQueryParams(
|
|||
val canonicalAlias: QueryStringValue,
|
||||
val memberships: List<Membership>,
|
||||
val roomCategoryFilter: RoomCategoryFilter?,
|
||||
val roomTagQueryFilter: RoomTagQueryFilter?
|
||||
val roomTagQueryFilter: RoomTagQueryFilter?,
|
||||
val excludeType: List<String?>?,
|
||||
val includeType: List<String?>?,
|
||||
val activeSpaceFilter: ActiveSpaceFilter?,
|
||||
var activeGroupId: String? = null
|
||||
) {
|
||||
|
||||
class Builder {
|
||||
|
@ -46,6 +70,10 @@ data class RoomSummaryQueryParams(
|
|||
var memberships: List<Membership> = Membership.all()
|
||||
var roomCategoryFilter: RoomCategoryFilter? = RoomCategoryFilter.ALL
|
||||
var roomTagQueryFilter: RoomTagQueryFilter? = null
|
||||
var excludeType: List<String?>? = listOf(RoomType.SPACE)
|
||||
var includeType: List<String?>? = null
|
||||
var activeSpaceFilter: ActiveSpaceFilter = ActiveSpaceFilter.None
|
||||
var activeGroupId: String? = null
|
||||
|
||||
fun build() = RoomSummaryQueryParams(
|
||||
roomId = roomId,
|
||||
|
@ -53,7 +81,11 @@ data class RoomSummaryQueryParams(
|
|||
canonicalAlias = canonicalAlias,
|
||||
memberships = memberships,
|
||||
roomCategoryFilter = roomCategoryFilter,
|
||||
roomTagQueryFilter = roomTagQueryFilter
|
||||
roomTagQueryFilter = roomTagQueryFilter,
|
||||
excludeType = excludeType,
|
||||
includeType = includeType,
|
||||
activeSpaceFilter = activeSpaceFilter,
|
||||
activeGroupId = activeGroupId
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,8 +20,16 @@ import androidx.lifecycle.LiveData
|
|||
import androidx.paging.PagedList
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
|
||||
interface UpdatableFilterLivePageResult {
|
||||
interface UpdatableLivePageResult {
|
||||
val livePagedList: LiveData<PagedList<RoomSummary>>
|
||||
|
||||
fun updateQuery(queryParams: RoomSummaryQueryParams)
|
||||
fun updateQuery(builder: (RoomSummaryQueryParams) -> RoomSummaryQueryParams)
|
||||
|
||||
val liveBoundaries: LiveData<ResultBoundaries>
|
||||
}
|
||||
|
||||
data class ResultBoundaries(
|
||||
val frontLoaded: Boolean = false,
|
||||
val endLoaded: Boolean = false,
|
||||
val zeroItemLoaded: Boolean = false
|
||||
)
|
|
@ -17,7 +17,7 @@
|
|||
package org.matrix.android.sdk.api.session.room.alias
|
||||
|
||||
sealed class RoomAliasError : Throwable() {
|
||||
object AliasEmpty : RoomAliasError()
|
||||
object AliasIsBlank : RoomAliasError()
|
||||
object AliasNotAvailable : RoomAliasError()
|
||||
object AliasInvalid : RoomAliasError()
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ import org.matrix.android.sdk.api.failure.MatrixError
|
|||
import org.matrix.android.sdk.api.session.room.alias.RoomAliasError
|
||||
|
||||
sealed class CreateRoomFailure : Failure.FeatureFailure() {
|
||||
object CreatedWithTimeout : CreateRoomFailure()
|
||||
data class CreatedWithTimeout(val roomID: String) : CreateRoomFailure()
|
||||
data class CreatedWithFederationFailure(val matrixError: MatrixError) : CreateRoomFailure()
|
||||
data class AliasError(val aliasError: RoomAliasError) : CreateRoomFailure()
|
||||
}
|
||||
|
|
|
@ -28,43 +28,43 @@ data class PowerLevelsContent(
|
|||
/**
|
||||
* The level required to ban a user. Defaults to 50 if unspecified.
|
||||
*/
|
||||
@Json(name = "ban") val ban: Int = Role.Moderator.value,
|
||||
@Json(name = "ban") val ban: Int? = null,
|
||||
/**
|
||||
* The level required to kick a user. Defaults to 50 if unspecified.
|
||||
*/
|
||||
@Json(name = "kick") val kick: Int = Role.Moderator.value,
|
||||
@Json(name = "kick") val kick: Int? = null,
|
||||
/**
|
||||
* The level required to invite a user. Defaults to 50 if unspecified.
|
||||
*/
|
||||
@Json(name = "invite") val invite: Int = Role.Moderator.value,
|
||||
@Json(name = "invite") val invite: Int? = null,
|
||||
/**
|
||||
* The level required to redact an event. Defaults to 50 if unspecified.
|
||||
*/
|
||||
@Json(name = "redact") val redact: Int = Role.Moderator.value,
|
||||
@Json(name = "redact") val redact: Int? = null,
|
||||
/**
|
||||
* The default level required to send message events. Can be overridden by the events key. Defaults to 0 if unspecified.
|
||||
*/
|
||||
@Json(name = "events_default") val eventsDefault: Int = Role.Default.value,
|
||||
@Json(name = "events_default") val eventsDefault: Int? = null,
|
||||
/**
|
||||
* The level required to send specific event types. This is a mapping from event type to power level required.
|
||||
*/
|
||||
@Json(name = "events") val events: Map<String, Int> = emptyMap(),
|
||||
@Json(name = "events") val events: Map<String, Int>? = null,
|
||||
/**
|
||||
* The default power level for every user in the room, unless their user_id is mentioned in the users key. Defaults to 0 if unspecified.
|
||||
*/
|
||||
@Json(name = "users_default") val usersDefault: Int = Role.Default.value,
|
||||
@Json(name = "users_default") val usersDefault: Int? = null,
|
||||
/**
|
||||
* The power levels for specific users. This is a mapping from user_id to power level for that user.
|
||||
*/
|
||||
@Json(name = "users") val users: Map<String, Int> = emptyMap(),
|
||||
@Json(name = "users") val users: Map<String, Int>? = null,
|
||||
/**
|
||||
* The default level required to send state events. Can be overridden by the events key. Defaults to 50 if unspecified.
|
||||
*/
|
||||
@Json(name = "state_default") val stateDefault: Int = Role.Moderator.value,
|
||||
@Json(name = "state_default") val stateDefault: Int? = null,
|
||||
/**
|
||||
* The power level requirements for specific notification types. This is a mapping from key to power level for that notifications key.
|
||||
*/
|
||||
@Json(name = "notifications") val notifications: Map<String, Any> = emptyMap()
|
||||
@Json(name = "notifications") val notifications: Map<String, Any>? = null
|
||||
) {
|
||||
/**
|
||||
* Return a copy of this content with a new power level for the specified user
|
||||
|
@ -74,7 +74,7 @@ data class PowerLevelsContent(
|
|||
*/
|
||||
fun setUserPowerLevel(userId: String, powerLevel: Int?): PowerLevelsContent {
|
||||
return copy(
|
||||
users = users.toMutableMap().apply {
|
||||
users = users.orEmpty().toMutableMap().apply {
|
||||
if (powerLevel == null || powerLevel == usersDefault) {
|
||||
remove(userId)
|
||||
} else {
|
||||
|
@ -91,7 +91,7 @@ data class PowerLevelsContent(
|
|||
* @return the level, default to Moderator if the key is not found
|
||||
*/
|
||||
fun notificationLevel(key: String): Int {
|
||||
return when (val value = notifications[key]) {
|
||||
return when (val value = notifications.orEmpty()[key]) {
|
||||
// the first implementation was a string value
|
||||
is String -> value.toInt()
|
||||
is Double -> value.toInt()
|
||||
|
@ -107,3 +107,12 @@ data class PowerLevelsContent(
|
|||
const val NOTIFICATIONS_ROOM_KEY = "room"
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback to default value, defined in the Matrix specification
|
||||
fun PowerLevelsContent.banOrDefault() = ban ?: Role.Moderator.value
|
||||
fun PowerLevelsContent.kickOrDefault() = kick ?: Role.Moderator.value
|
||||
fun PowerLevelsContent.inviteOrDefault() = invite ?: Role.Moderator.value
|
||||
fun PowerLevelsContent.redactOrDefault() = redact ?: Role.Moderator.value
|
||||
fun PowerLevelsContent.eventsDefaultOrDefault() = eventsDefault ?: Role.Default.value
|
||||
fun PowerLevelsContent.usersDefaultOrDefault() = usersDefault ?: Role.Default.value
|
||||
fun PowerLevelsContent.stateDefaultOrDefault() = stateDefault ?: Role.Moderator.value
|
||||
|
|
|
@ -40,7 +40,7 @@ data class RoomGuestAccessContent(
|
|||
}
|
||||
|
||||
@JsonClass(generateAdapter = false)
|
||||
enum class GuestAccess {
|
||||
@Json(name = "can_join") CanJoin,
|
||||
@Json(name = "forbidden") Forbidden
|
||||
enum class GuestAccess(val value: String) {
|
||||
@Json(name = "can_join") CanJoin("can_join"),
|
||||
@Json(name = "forbidden") Forbidden("forbidden")
|
||||
}
|
||||
|
|
|
@ -24,9 +24,10 @@ import com.squareup.moshi.JsonClass
|
|||
* Enum for [RoomJoinRulesContent] : https://matrix.org/docs/spec/client_server/r0.4.0#m-room-join-rules
|
||||
*/
|
||||
@JsonClass(generateAdapter = false)
|
||||
enum class RoomJoinRules {
|
||||
@Json(name = "public") PUBLIC,
|
||||
@Json(name = "invite") INVITE,
|
||||
@Json(name = "knock") KNOCK,
|
||||
@Json(name = "private") PRIVATE
|
||||
enum class RoomJoinRules(val value: String) {
|
||||
@Json(name = "public") PUBLIC("public"),
|
||||
@Json(name = "invite") INVITE("invite"),
|
||||
@Json(name = "knock") KNOCK("knock"),
|
||||
@Json(name = "private") PRIVATE("private"),
|
||||
@Json(name = "restricted") RESTRICTED("restricted")
|
||||
}
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright 2021 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.api.session.room.model
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class RoomJoinRulesAllowEntry(
|
||||
/**
|
||||
* space: The room ID of the space to check the membership of.
|
||||
*/
|
||||
@Json(name = "space") val spaceID: String,
|
||||
/**
|
||||
* via: A list of servers which may be used to peek for membership of the space.
|
||||
*/
|
||||
@Json(name = "via") val via: List<String>
|
||||
)
|
|
@ -1,5 +1,6 @@
|
|||
/*
|
||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||
* Copyright 2021 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
|
@ -26,14 +27,19 @@ import timber.log.Timber
|
|||
*/
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class RoomJoinRulesContent(
|
||||
@Json(name = "join_rule") val _joinRules: String? = null
|
||||
@Json(name = "join_rule") val _joinRules: String? = null,
|
||||
/**
|
||||
* If the allow key is an empty list (or not a list at all), then the room reverts to standard public join rules
|
||||
*/
|
||||
@Json(name = "allow") val allowList: List<RoomJoinRulesAllowEntry>? = null
|
||||
) {
|
||||
val joinRules: RoomJoinRules? = when (_joinRules) {
|
||||
"public" -> RoomJoinRules.PUBLIC
|
||||
"invite" -> RoomJoinRules.INVITE
|
||||
"knock" -> RoomJoinRules.KNOCK
|
||||
"public" -> RoomJoinRules.PUBLIC
|
||||
"invite" -> RoomJoinRules.INVITE
|
||||
"knock" -> RoomJoinRules.KNOCK
|
||||
"private" -> RoomJoinRules.PRIVATE
|
||||
else -> {
|
||||
"restricted" -> RoomJoinRules.RESTRICTED
|
||||
else -> {
|
||||
Timber.w("Invalid value for RoomJoinRules: `$_joinRules`")
|
||||
null
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ data class RoomSummary constructor(
|
|||
val canonicalAlias: String? = null,
|
||||
val aliases: List<String> = emptyList(),
|
||||
val isDirect: Boolean = false,
|
||||
val directUserId: String? = null,
|
||||
val joinedMembersCount: Int? = 0,
|
||||
val invitedMembersCount: Int? = 0,
|
||||
val latestPreviewableEvent: TimelineEvent? = null,
|
||||
|
@ -54,7 +55,11 @@ data class RoomSummary constructor(
|
|||
val inviterId: String? = null,
|
||||
val breadcrumbsIndex: Int = NOT_IN_BREADCRUMBS,
|
||||
val roomEncryptionTrustLevel: RoomEncryptionTrustLevel? = null,
|
||||
val hasFailedSending: Boolean = false
|
||||
val hasFailedSending: Boolean = false,
|
||||
val roomType: String? = null,
|
||||
val spaceParents: List<SpaceParentInfo>? = null,
|
||||
val spaceChildren: List<SpaceChildInfo>? = null,
|
||||
val flattenParentIds: List<String> = emptyList()
|
||||
) {
|
||||
|
||||
val isVersioned: Boolean
|
||||
|
|
|
@ -47,7 +47,7 @@ data class RoomThirdPartyInviteContent(
|
|||
/**
|
||||
* Keys with which the token may be signed.
|
||||
*/
|
||||
@Json(name = "public_keys") val publicKeys: List<PublicKeys>? = emptyList()
|
||||
@Json(name = "public_keys") val publicKeys: List<PublicKeys>?
|
||||
)
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
/*
|
||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.api.session.room.model
|
||||
|
||||
object RoomType {
|
||||
|
||||
const val SPACE = "m.space"
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.api.session.room.model
|
||||
|
||||
data class SpaceChildInfo(
|
||||
val childRoomId: String,
|
||||
// We might not know this child at all,
|
||||
// i.e we just know it exists but no info on type/name/etc..
|
||||
val isKnown: Boolean,
|
||||
val roomType: String?,
|
||||
val name: String?,
|
||||
val topic: String?,
|
||||
val avatarUrl: String?,
|
||||
val order: String?,
|
||||
val activeMemberCount: Int?,
|
||||
val autoJoin: Boolean,
|
||||
val viaServers: List<String>,
|
||||
val parentRoomId: String?
|
||||
)
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Copyright 2020 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* 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 org.matrix.android.sdk.api.session.room.model
|
||||
|
||||
data class SpaceParentInfo(
|
||||
val parentId: String?,
|
||||
val roomSummary: RoomSummary?,
|
||||
val canonical: Boolean?,
|
||||
val viaServers: List<String>
|
||||
)
|
|
@ -18,13 +18,15 @@ package org.matrix.android.sdk.api.session.room.model.create
|
|||
|
||||
import android.net.Uri
|
||||
import org.matrix.android.sdk.api.session.identity.ThreePid
|
||||
import org.matrix.android.sdk.api.session.room.model.GuestAccess
|
||||
import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomJoinRulesAllowEntry
|
||||
import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
|
||||
|
||||
// TODO Give a way to include other initial states
|
||||
class CreateRoomParams {
|
||||
open class CreateRoomParams {
|
||||
/**
|
||||
* A public visibility indicates that the room will be shown in the published room list.
|
||||
* A private visibility will hide the room from the published room list.
|
||||
|
@ -68,6 +70,11 @@ class CreateRoomParams {
|
|||
*/
|
||||
val invite3pids = mutableListOf<ThreePid>()
|
||||
|
||||
/**
|
||||
* Initial Guest Access
|
||||
*/
|
||||
var guestAccess: GuestAccess? = null
|
||||
|
||||
/**
|
||||
* If set to true, when the room will be created, if cross-signing is enabled and we can get keys for every invited users,
|
||||
* the encryption will be enabled on the created room
|
||||
|
@ -111,6 +118,17 @@ class CreateRoomParams {
|
|||
}
|
||||
}
|
||||
|
||||
var roomType: String? = null // RoomType.MESSAGING
|
||||
set(value) {
|
||||
field = value
|
||||
if (value != null) {
|
||||
creationContent[CREATION_CONTENT_KEY_ROOM_TYPE] = value
|
||||
} else {
|
||||
// This is the default value, we remove the field
|
||||
creationContent.remove(CREATION_CONTENT_KEY_ROOM_TYPE)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The power level content to override in the default power level event
|
||||
*/
|
||||
|
@ -136,7 +154,12 @@ class CreateRoomParams {
|
|||
algorithm = MXCRYPTO_ALGORITHM_MEGOLM
|
||||
}
|
||||
|
||||
var roomVersion: String? = null
|
||||
|
||||
var joinRuleRestricted: List<RoomJoinRulesAllowEntry>? = null
|
||||
|
||||
companion object {
|
||||
private const val CREATION_CONTENT_KEY_M_FEDERATE = "m.federate"
|
||||
private const val CREATION_CONTENT_KEY_ROOM_TYPE = "type"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,5 +26,7 @@ import com.squareup.moshi.JsonClass
|
|||
data class RoomCreateContent(
|
||||
@Json(name = "creator") val creator: String? = null,
|
||||
@Json(name = "room_version") val roomVersion: String? = null,
|
||||
@Json(name = "predecessor") val predecessor: Predecessor? = null
|
||||
@Json(name = "predecessor") val predecessor: Predecessor? = null,
|
||||
// Defines the room type, see #RoomType (user extensible)
|
||||
@Json(name = "type") val type: String? = null
|
||||
)
|
||||
|
|
|
@ -47,3 +47,10 @@ data class FileInfo(
|
|||
*/
|
||||
@Json(name = "thumbnail_file") val thumbnailFile: EncryptedFileInfo? = null
|
||||
)
|
||||
|
||||
/**
|
||||
* Get the url of the encrypted thumbnail or of the thumbnail
|
||||
*/
|
||||
fun FileInfo.getThumbnailUrl(): String? {
|
||||
return thumbnailFile?.url ?: thumbnailUrl
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ data class ImageInfo(
|
|||
/**
|
||||
* Size of the image in bytes.
|
||||
*/
|
||||
@Json(name = "size") val size: Int = 0,
|
||||
@Json(name = "size") val size: Long = 0,
|
||||
|
||||
/**
|
||||
* Metadata about the image referred to in thumbnail_url.
|
||||
|
@ -57,3 +57,10 @@ data class ImageInfo(
|
|||
*/
|
||||
@Json(name = "thumbnail_file") val thumbnailFile: EncryptedFileInfo? = null
|
||||
)
|
||||
|
||||
/**
|
||||
* Get the url of the encrypted thumbnail or of the thumbnail
|
||||
*/
|
||||
fun ImageInfo.getThumbnailUrl(): String? {
|
||||
return thumbnailFile?.url ?: thumbnailUrl
|
||||
}
|
||||
|
|
|
@ -37,3 +37,10 @@ data class LocationInfo(
|
|||
*/
|
||||
@Json(name = "thumbnail_file") val thumbnailFile: EncryptedFileInfo? = null
|
||||
)
|
||||
|
||||
/**
|
||||
* Get the url of the encrypted thumbnail or of the thumbnail
|
||||
*/
|
||||
fun LocationInfo.getThumbnailUrl(): String? {
|
||||
return thumbnailFile?.url ?: thumbnailUrl
|
||||
}
|
||||
|
|
|
@ -62,3 +62,10 @@ data class VideoInfo(
|
|||
*/
|
||||
@Json(name = "thumbnail_file") val thumbnailFile: EncryptedFileInfo? = null
|
||||
)
|
||||
|
||||
/**
|
||||
* Get the url of the encrypted thumbnail or of the thumbnail
|
||||
*/
|
||||
fun VideoInfo.getThumbnailUrl(): String? {
|
||||
return thumbnailFile?.url ?: thumbnailUrl
|
||||
}
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
package org.matrix.android.sdk.api.session.room.peeking
|
||||
|
||||
import org.matrix.android.sdk.api.util.MatrixItem
|
||||
|
||||
sealed class PeekResult {
|
||||
data class Success(
|
||||
val roomId: String,
|
||||
|
@ -24,7 +26,9 @@ sealed class PeekResult {
|
|||
val topic: String?,
|
||||
val avatarUrl: String?,
|
||||
val numJoinedMembers: Int?,
|
||||
val viaServers: List<String>
|
||||
val roomType: String?,
|
||||
val viaServers: List<String>,
|
||||
val someMembers: List<MatrixItem.UserItem>?
|
||||
) : PeekResult()
|
||||
|
||||
data class PeekingNotAllowed(
|
||||
|
@ -34,4 +38,6 @@ sealed class PeekResult {
|
|||
) : PeekResult()
|
||||
|
||||
object UnknownAlias : PeekResult()
|
||||
|
||||
fun isSuccess() = this is Success
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue