mirror of
https://github.com/SchildiChat/SchildiChat-android.git
synced 2024-11-24 02:15:46 +03:00
Merge tag 'v1.1.13' into sc
Change-Id: Icc97ef8699b1cc96447369121f3c88582ac651bc Conflicts: matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration.kt vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt vector/src/main/java/im/vector/app/features/home/room/detail/timeline/helper/TimelineControllerInterceptorHelper.kt vector/src/main/java/im/vector/app/features/home/room/filtered/FilteredRoomFooterItem.kt vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
This commit is contained in:
commit
8497a307a1
230 changed files with 2845 additions and 927 deletions
84
.github/ISSUE_TEMPLATE/release.md
vendored
Normal file
84
.github/ISSUE_TEMPLATE/release.md
vendored
Normal file
|
@ -0,0 +1,84 @@
|
|||
---
|
||||
name: Release
|
||||
about: Checklist for each release. To be used by the core team only.
|
||||
title: "[Release] Element Android v"
|
||||
labels: "\U0001F680 Release"
|
||||
assignees: bmarty
|
||||
|
||||
---
|
||||
|
||||
For the example, we are releasing the version 1.1.10. Delete this line and replace 1.1.10 with the version in the issue content.
|
||||
|
||||
### Before the release
|
||||
|
||||
- [ ] Weblate sync, fix lint issue if any (in a dedicated PR)
|
||||
- [ ] Check the update of the store descriptions (using Google Translate if necessary) to ensure that the changes are acceptable to be published to the stores.
|
||||
- [ ] Run the script `./tools/release/pushPlayStoreMetaData.sh`. You can check in the GooglePlay console the Activity log to check the effect.
|
||||
|
||||
### Do the release
|
||||
|
||||
- [ ] Create release with gitflow, branch name `release/1.1.10`
|
||||
- [ ] Run `./tools/import_emojis.py` and commit the change if any.
|
||||
- [ ] Run `./tools/import_sas_strings.py` and commit the change if any. If there is no change since a while, ping Travis
|
||||
- [ ] Check the crashes from the PlayStore
|
||||
- [ ] Check the rageshake with the current dev version: https://github.com/matrix-org/element-android-rageshakes/labels/1.1.10-dev
|
||||
- [ ] Run the integration test, and especially `UiAllScreensSanityTest.allScreensTest()`
|
||||
- [ ] Create an account on matrix.org
|
||||
- [ ] Run towncrier: `towncrier --version v1.1.10 --draft` (remove `--draft` do write the file CHANGES.md)
|
||||
- [ ] Add file for fastlane under ./fastlane/metadata/android/en-US/changelogs
|
||||
- [ ] Push the branch and start a draft PR (will not be merged), to check that the CI is happy with all the changes.
|
||||
- [ ] Finish release with gitflow, delete the draft PR
|
||||
- [ ] Push `main` and the new tag `v1.1.10` to origin
|
||||
- [ ] Checkout `develop`
|
||||
- [ ] Increase version in `./vector/build.gradle`
|
||||
- [ ] Commit and push `develop`
|
||||
- [ ] Wait for [Buildkite](https://buildkite.com/matrix-dot-org/element-android/builds?branch=main) to build the `main` branch.
|
||||
- [ ] Run the script `~/scripts/releaseElement.sh`. It will download the APKs from Buildkite check them and sign them.
|
||||
- [ ] Install the APK on your phone to check that the upgrade went well (no init sync, etc.)
|
||||
- [ ] Create a new beta release on the GooglePlay console and upload the 4 signed Apks.
|
||||
- [ ] Check that the version codes are correct
|
||||
- [ ] Copy the fastlane change to the GooglePlay console in the section en-GB.
|
||||
- [ ] Push to beta release to 100% of the users
|
||||
- [ ] Create the release on gitHub [from the tag](https://github.com/vector-im/element-android/tags), copy paste the block from the file CHANGES.md
|
||||
- [ ] Add the 4 signed APKs to the GitHub release
|
||||
- [ ] Ping the Android Internal room
|
||||
- [ ] Add an entry in the internal diary
|
||||
|
||||
### Once Live on PlayStore
|
||||
|
||||
- [ ] Ping the Android public room and update its topic
|
||||
|
||||
### After at least 2 days
|
||||
|
||||
- [ ] Check the [rageshakes](https://github.com/matrix-org/element-android-rageshakes/issues)
|
||||
- [ ] Check the crash reports on the GooglePlay console
|
||||
- [ ] Check the Android Element room for any reported issues on the new version
|
||||
- [ ] If all is OK, push to production and notify Markus (Bubu) to release the F-Droid version
|
||||
- [ ] Ping the Android public room and update its topic with the new available version
|
||||
|
||||
### Android SDK2
|
||||
|
||||
- [ ] Checkout the `main` branch on Element Android project
|
||||
|
||||
#### On the SDK2 project
|
||||
|
||||
https://github.com/matrix-org/matrix-android-sdk2
|
||||
|
||||
- [ ] Create a release with GitFlow
|
||||
- [ ] Update the files `./build.gradle` and `./gradle/gradle-wrapper.properties` manually, to use the latest version for the dependency. You can get inspired by the same files on Element Android project.
|
||||
- [ ] Run the script `./tools/import_from_element.sh`
|
||||
- [ ] Update the version in `./matrix-sdk-android/build.gradle` and let the script finish to build the library
|
||||
- [ ] Update the file `CHANGES.md`
|
||||
- [ ] Finish the release using GitFlow
|
||||
- [ ] Create the release on GitHub from [the tag](https://github.com/matrix-org/matrix-android-sdk2/tags)
|
||||
- [ ] Upload the AAR on the GitHub release
|
||||
|
||||
### Android SDK2 sample
|
||||
|
||||
https://github.com/matrix-org/matrix-android-sdk2-sample
|
||||
|
||||
- [ ] Update the dependency to the new version of the SDK2. Jitpack will have to build the AAR, it can take a few minutes. You can check status on https://jitpack.io/#matrix-org/matrix-android-sdk2
|
||||
- [ ] Build and run the sample, you may have to fix some API break
|
||||
- [ ] Commit and push directly on `main`
|
||||
|
||||
<!-- Note: some scripts are not public because they contain some private keys -->
|
|
@ -38,6 +38,7 @@
|
|||
<w>unpublish</w>
|
||||
<w>unwedging</w>
|
||||
<w>vctr</w>
|
||||
<w>wellknown</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
24
CHANGES.md
24
CHANGES.md
|
@ -1,3 +1,27 @@
|
|||
Changes in Element v1.1.13 (2021-07-19)
|
||||
=======================================
|
||||
|
||||
Features ✨
|
||||
----------
|
||||
- Remove redundant mimetype (vector-im/element-web#2547) ([#3273](https://github.com/vector-im/element-android/issues/3273))
|
||||
- Room version capabilities and room upgrade support, better error feedback ([#3551](https://github.com/vector-im/element-android/issues/3551))
|
||||
- Add retry support in room addresses screen ([#3635](https://github.com/vector-im/element-android/issues/3635))
|
||||
- Better management of permission requests ([#3667](https://github.com/vector-im/element-android/issues/3667))
|
||||
|
||||
Bugfixes 🐛
|
||||
----------
|
||||
- Standardise spelling and casing of homeserver, identity server, and integration manager. ([#491](https://github.com/vector-im/element-android/issues/491))
|
||||
- Perform .well-known request first, even if the entered URL is a valid homeserver base url ([#2843](https://github.com/vector-im/element-android/issues/2843))
|
||||
- Use different copy for self verification. ([#3624](https://github.com/vector-im/element-android/issues/3624))
|
||||
- Crash when opening room addresses screen with no internet connection ([#3634](https://github.com/vector-im/element-android/issues/3634))
|
||||
- Fix unread messages marker being hidden in collapsed membership item ([#3655](https://github.com/vector-im/element-android/issues/3655))
|
||||
- Ensure reaction emoji picker tabs look fine on small displays ([#3661](https://github.com/vector-im/element-android/issues/3661))
|
||||
|
||||
SDK API changes ⚠️
|
||||
------------------
|
||||
- RawService.getWellknown() now takes a domain instead of a matrixId as parameter ([#3572](https://github.com/vector-im/element-android/issues/3572))
|
||||
|
||||
|
||||
Changes in Element 1.1.12 (2021-07-05)
|
||||
======================================
|
||||
|
||||
|
|
68
Gemfile.lock
68
Gemfile.lock
|
@ -2,25 +2,25 @@ GEM
|
|||
remote: https://rubygems.org/
|
||||
specs:
|
||||
CFPropertyList (3.0.3)
|
||||
addressable (2.7.0)
|
||||
addressable (2.8.0)
|
||||
public_suffix (>= 2.0.2, < 5.0)
|
||||
artifactory (3.0.15)
|
||||
atomos (0.1.3)
|
||||
aws-eventstream (1.1.1)
|
||||
aws-partitions (1.462.0)
|
||||
aws-sdk-core (3.114.0)
|
||||
aws-partitions (1.479.0)
|
||||
aws-sdk-core (3.117.0)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.43.0)
|
||||
aws-sdk-kms (1.44.0)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.95.1)
|
||||
aws-sdk-s3 (1.96.1)
|
||||
aws-sdk-core (~> 3, >= 3.112.0)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.2.3)
|
||||
aws-sigv4 (1.2.4)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
babosa (1.0.4)
|
||||
claide (1.0.3)
|
||||
|
@ -35,13 +35,15 @@ GEM
|
|||
unf (>= 0.0.5, < 1.0.0)
|
||||
dotenv (2.7.6)
|
||||
emoji_regex (3.2.2)
|
||||
excon (0.81.0)
|
||||
faraday (1.4.2)
|
||||
excon (0.85.0)
|
||||
faraday (1.5.1)
|
||||
faraday-em_http (~> 1.0)
|
||||
faraday-em_synchrony (~> 1.0)
|
||||
faraday-excon (~> 1.1)
|
||||
faraday-httpclient (~> 1.0.1)
|
||||
faraday-net_http (~> 1.0)
|
||||
faraday-net_http_persistent (~> 1.1)
|
||||
faraday-patron (~> 1.0)
|
||||
multipart-post (>= 1.2, < 3)
|
||||
ruby2_keywords (>= 0.0.4)
|
||||
faraday-cookie_jar (0.0.7)
|
||||
|
@ -50,12 +52,14 @@ GEM
|
|||
faraday-em_http (1.0.0)
|
||||
faraday-em_synchrony (1.0.0)
|
||||
faraday-excon (1.1.0)
|
||||
faraday-httpclient (1.0.1)
|
||||
faraday-net_http (1.0.1)
|
||||
faraday-net_http_persistent (1.1.0)
|
||||
faraday-net_http_persistent (1.2.0)
|
||||
faraday-patron (1.0.0)
|
||||
faraday_middleware (1.0.0)
|
||||
faraday (~> 1.0)
|
||||
fastimage (2.2.3)
|
||||
fastlane (2.184.0)
|
||||
fastimage (2.2.4)
|
||||
fastlane (2.187.0)
|
||||
CFPropertyList (>= 2.3, < 4.0.0)
|
||||
addressable (>= 2.3, < 3.0.0)
|
||||
artifactory (~> 3.0)
|
||||
|
@ -94,37 +98,36 @@ GEM
|
|||
xcpretty (~> 0.3.0)
|
||||
xcpretty-travis-formatter (>= 0.0.3)
|
||||
gh_inspector (1.1.3)
|
||||
google-apis-androidpublisher_v3 (0.4.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-apis-core (0.3.0)
|
||||
google-apis-androidpublisher_v3 (0.8.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-core (0.4.0)
|
||||
addressable (~> 2.5, >= 2.5.1)
|
||||
googleauth (~> 0.14)
|
||||
httpclient (>= 2.8.1, < 3.0)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
httpclient (>= 2.8.1, < 3.a)
|
||||
mini_mime (~> 1.0)
|
||||
representable (~> 3.0)
|
||||
retriable (>= 2.0, < 4.0)
|
||||
retriable (>= 2.0, < 4.a)
|
||||
rexml
|
||||
signet (~> 0.14)
|
||||
webrick
|
||||
google-apis-iamcredentials_v1 (0.4.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-apis-playcustomapp_v1 (0.3.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-apis-storage_v1 (0.4.0)
|
||||
google-apis-core (~> 0.1)
|
||||
google-apis-iamcredentials_v1 (0.6.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-playcustomapp_v1 (0.5.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-apis-storage_v1 (0.6.0)
|
||||
google-apis-core (>= 0.4, < 2.a)
|
||||
google-cloud-core (1.6.0)
|
||||
google-cloud-env (~> 1.0)
|
||||
google-cloud-errors (~> 1.0)
|
||||
google-cloud-env (1.5.0)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
google-cloud-errors (1.1.0)
|
||||
google-cloud-storage (1.31.1)
|
||||
google-cloud-storage (1.34.1)
|
||||
addressable (~> 2.5)
|
||||
digest-crc (~> 0.4)
|
||||
google-apis-iamcredentials_v1 (~> 0.1)
|
||||
google-apis-storage_v1 (~> 0.1)
|
||||
google-cloud-core (~> 1.2)
|
||||
googleauth (~> 0.9)
|
||||
google-cloud-core (~> 1.6)
|
||||
googleauth (>= 0.16.2, < 2.a)
|
||||
mini_mime (~> 1.0)
|
||||
googleauth (0.16.2)
|
||||
faraday (>= 0.17.3, < 2.0)
|
||||
|
@ -134,7 +137,7 @@ GEM
|
|||
os (>= 0.9, < 2.0)
|
||||
signet (~> 0.14)
|
||||
highline (2.0.3)
|
||||
http-cookie (1.0.3)
|
||||
http-cookie (1.0.4)
|
||||
domain_name (~> 0.5)
|
||||
httpclient (2.8.3)
|
||||
jmespath (1.4.0)
|
||||
|
@ -150,7 +153,7 @@ GEM
|
|||
os (1.1.1)
|
||||
plist (3.6.0)
|
||||
public_suffix (4.0.6)
|
||||
rake (13.0.3)
|
||||
rake (13.0.6)
|
||||
representable (3.1.1)
|
||||
declarative (< 0.1.0)
|
||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||
|
@ -158,8 +161,8 @@ GEM
|
|||
retriable (3.1.2)
|
||||
rexml (3.2.5)
|
||||
rouge (2.0.7)
|
||||
ruby2_keywords (0.0.4)
|
||||
rubyzip (2.3.0)
|
||||
ruby2_keywords (0.0.5)
|
||||
rubyzip (2.3.2)
|
||||
security (0.1.3)
|
||||
signet (0.15.0)
|
||||
addressable (~> 2.3)
|
||||
|
@ -184,12 +187,13 @@ GEM
|
|||
unicode-display_width (1.7.0)
|
||||
webrick (1.7.0)
|
||||
word_wrap (1.0.0)
|
||||
xcodeproj (1.19.0)
|
||||
xcodeproj (1.20.0)
|
||||
CFPropertyList (>= 2.3.3, < 4.0)
|
||||
atomos (~> 0.1.3)
|
||||
claide (>= 1.0.2, < 2.0)
|
||||
colored2 (~> 3.1)
|
||||
nanaimo (~> 0.3.0)
|
||||
rexml (~> 3.2.4)
|
||||
xcpretty (0.3.0)
|
||||
rouge (~> 2.0.7)
|
||||
xcpretty-travis-formatter (1.0.1)
|
||||
|
|
|
@ -55,9 +55,9 @@ dependencies {
|
|||
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
|
||||
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
||||
implementation 'androidx.core:core-ktx:1.5.0'
|
||||
implementation 'androidx.core:core-ktx:1.6.0'
|
||||
implementation 'androidx.appcompat:appcompat:1.3.0'
|
||||
implementation "androidx.recyclerview:recyclerview:1.2.1"
|
||||
|
||||
implementation 'com.google.android.material:material:1.3.0'
|
||||
implementation 'com.google.android.material:material:1.4.0'
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
buildscript {
|
||||
// Ref: https://kotlinlang.org/releases.html
|
||||
ext.kotlin_version = '1.5.20'
|
||||
ext.kotlin_version = '1.5.21'
|
||||
ext.kotlin_coroutines_version = "1.5.0"
|
||||
repositories {
|
||||
google()
|
||||
|
@ -12,7 +12,7 @@ buildscript {
|
|||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:4.2.1'
|
||||
classpath 'com.android.tools.build:gradle:4.2.2'
|
||||
classpath 'com.google.gms:google-services:4.3.8'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3'
|
||||
|
|
|
@ -4,7 +4,7 @@ Issue: #607
|
|||
PR: #1354
|
||||
|
||||
## Introduction
|
||||
Identity Servers support contact discovery on Matrix by letting people look up Third Party Identifiers to see if the owner has publicly linked them with their Matrix ID.
|
||||
Identity servers support contact discovery on Matrix by letting people look up Third Party Identifiers to see if the owner has publicly linked them with their Matrix ID.
|
||||
|
||||
## Implementation
|
||||
|
||||
|
@ -87,6 +87,6 @@ This screen displays the identity server configuration and the binding of the us
|
|||
This screen is a form to set a new identity server URL
|
||||
|
||||
## Ref:
|
||||
- https://matrix.org/blog/2019/09/27/privacy-improvements-in-synapse-1-4-and-riot-1-4 is a good summary of the role of an Identity server and the proper way to configure and use it in respect to the privacy and the consent of the user.
|
||||
- https://matrix.org/blog/2019/09/27/privacy-improvements-in-synapse-1-4-and-riot-1-4 is a good summary of the role of an identity server and the proper way to configure and use it in respect to the privacy and the consent of the user.
|
||||
- API documentation: https://matrix.org/docs/spec/identity_service/latest
|
||||
- vector.im TOS: https://vector.im/identity-server-privacy-notice
|
||||
|
|
|
@ -2,11 +2,11 @@ This document aims to describe how Element android displays notifications to the
|
|||
|
||||
# Table of Contents
|
||||
1. [Prerequisites Knowledge](#prerequisites-knowledge)
|
||||
* [How does a matrix client get a message from a Home Server?](#how-does-a-matrix-client-get-a-message-from-a-home-server)
|
||||
* [How does a matrix client get a message from a homeserver?](#how-does-a-matrix-client-get-a-message-from-a-homeserver)
|
||||
* [How does a mobile app receives push notification?](#how-does-a-mobile-app-receives-push-notification)
|
||||
* [Push VS Notification](#push-vs-notification)
|
||||
* [Push in the matrix federated world](#push-in-the-matrix-federated-world)
|
||||
* [How does the Home Server knows when to notify a client?](#how-does-the-home-server-knows-when-to-notify-a-client)
|
||||
* [How does the homeserver know when to notify a client?](#how-does-the-homeserver-know-when-to-notify-a-client)
|
||||
* [Push vs privacy, and mitigation](#push-vs-privacy-and-mitigation)
|
||||
* [Background processing limitations](#background-processing-limitations)
|
||||
2. [Element Notification implementations](#element-notification-implementations)
|
||||
|
@ -22,9 +22,9 @@ First let's start with some prerequisite knowledge
|
|||
|
||||
# Prerequisites Knowledge
|
||||
|
||||
## How does a matrix client get a message from a Home Server?
|
||||
## How does a matrix client get a message from a homeserver?
|
||||
|
||||
In order to get messages from a home server, a matrix client need to perform a ``sync`` operation.
|
||||
In order to get messages from a homeserver, a matrix client need to perform a ``sync`` operation.
|
||||
|
||||
`To read events, the intended flow of operation is for clients to first call the /sync API without a since parameter. This returns the most recent message events for each room, as well as the state of the room at the start of the returned timeline. `
|
||||
|
||||
|
@ -90,7 +90,7 @@ That means that Element Android, a matrix client created by New Vector, is using
|
|||
|
||||
If you create your own matrix client, you will also need to deploy an instance of a **Push Gateway** with the credentials needed to use FCM for your app.
|
||||
|
||||
On registration, a matrix client must tell to it's Home Server what Push Gateway to use.
|
||||
On registration, a matrix client must tell its homeserver what Push Gateway to use.
|
||||
|
||||
See [Sygnal](https://github.com/matrix-org/sygnal/) for a reference implementation.
|
||||
```
|
||||
|
@ -122,13 +122,13 @@ Recommended reading:
|
|||
* https://matrix.org/docs/spec/client_server/r0.4.0.html#id128
|
||||
|
||||
|
||||
## How does the Home Server knows when to notify a client?
|
||||
## How does the homeserver know when to notify a client?
|
||||
|
||||
This is defined by [**push rules**](https://matrix.org/docs/spec/client_server/r0.4.0.html#push-rules-).
|
||||
|
||||
`A push rule is a single rule that states under what conditions an event should be passed onto a push gateway and how the notification should be presented (sound / importance).`
|
||||
|
||||
A Home Server can be configured with default rules (for Direct messages, group messages, mentions, etc.. ).
|
||||
A homeserver can be configured with default rules (for Direct messages, group messages, mentions, etc.. ).
|
||||
|
||||
There are different kind of push rules, it can be per room (each new message on this room should be notified), it can also define a pattern that a message should match (when you are mentioned, or key word based).
|
||||
|
||||
|
@ -187,7 +187,7 @@ In background, and depending on wether push is available or not, Element will us
|
|||
|
||||
## Push (FCM) received in background
|
||||
|
||||
In order to enable Push, Element must first get a push token from the firebase SDK, then register a pusher with this token on the HomeServer.
|
||||
In order to enable Push, Element must first get a push token from the firebase SDK, then register a pusher with this token on the homeserver.
|
||||
|
||||
When a message should be notified to a user, the user's homeserver notifies the registered `push gateway` for Element, that is [sygnal](https://github.com/matrix-org/sygnal) _- The reference implementation for push gateways -_ hosted by matrix.org.
|
||||
|
||||
|
@ -199,7 +199,7 @@ Homeserver ----> Sygnal (configured for Element) ----> FCM ----> Element
|
|||
|
||||
The push gateway is configured to only send `(eventId,roomId)` in the push payload (for better [privacy](#push-vs-privacy-and-mitigation)).
|
||||
|
||||
Element needs then to synchronise with the user's HomeServer, in order to resolve the event and create a notification.
|
||||
Element needs then to synchronise with the user's homeserver, in order to resolve the event and create a notification.
|
||||
|
||||
As per [Google recommendation](https://android-developers.googleblog.com/2018/09/notifying-your-users-with-fcm.html), Element will then use the WorkManager API in order to trigger a background sync.
|
||||
|
||||
|
@ -217,7 +217,7 @@ Homeserver ----> Sygnal ----> FCM ----> Element
|
|||
|
||||
**Possible outcomes**
|
||||
|
||||
Upon reception of the FCM push, Element will perform a sync call to the Home Server, during this process it is possible that:
|
||||
Upon reception of the FCM push, Element will perform a sync call to the homeserver, during this process it is possible that:
|
||||
* Happy path, the sync is performed, the message resolved and displayed in the notification drawer
|
||||
* The notified message is not in the sync. Can happen if a lot of things did happen since the push (`gappy sync`)
|
||||
* The sync generates additional notifications (e.g an encrypted message where the user is mentioned detected locally)
|
||||
|
|
2
fastlane/metadata/android/cs-CZ/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/cs-CZ/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hlavní změny v této verzi: aktualizace vzhledu a stylu a nové funkce prostorů.
|
||||
Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/cs-CZ/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/cs-CZ/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hlavní změny v této verzi: aktualizace vzhledu a stylu a nové funkce prostorů (bugfix pro 1.1.10)
|
||||
Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
2
fastlane/metadata/android/de-DE/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hauptänderungen: Design-Update und neue Features für Spaces
|
||||
Vollständige Änderungsliste: https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/de-DE/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/de-DE/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Hauptänderungen: Design-Update und neue Features für Spaces (Bugfix für 1.1.10)
|
||||
Vollständige Änderungsliste: https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
2
fastlane/metadata/android/en-US/changelogs/40101130.txt
Normal file
2
fastlane/metadata/android/en-US/changelogs/40101130.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Main changes in this version: mainly stability and bugfixes update.
|
||||
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.13
|
2
fastlane/metadata/android/et/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/et/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Põhilised muutused selles versioonis: teemade ja välimuse uuendused ning mõned kogukondade uuendused
|
||||
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/et/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/et/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Põhilised muutused selles versioonis: teemade ja välimuse uuendused ning mõned kogukondade uuendused (1.1.10 veaparandus)
|
||||
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
2
fastlane/metadata/android/hu-HU/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Főbb változtatások ebben a verzióban: kinézet és stílus frissítések és új funkciók a terekhez
|
||||
Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/hu-HU/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/hu-HU/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Főbb változtatások ebben a verzióban: kinézet és stílus frissítések és új funkciók a terekhez (hibajavítás az 1.1.10-hez)
|
||||
Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
2
fastlane/metadata/android/it-IT/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/it-IT/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Modifiche principali in questa versione: aggiornati tema e stile e nuove funzioni per gli spazi .
|
||||
Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/it-IT/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/it-IT/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Modifiche principali in questa versione: aggiornati tema e stile e nuove funzioni per gli spazi (bugfix per 1.1.10)
|
||||
Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
|
@ -1,2 +1,2 @@
|
|||
Principais mudanças nesta version: suporte beta para Espaços. Comprimir vídeo antes de enviar.
|
||||
Principais mudanças nesta versão: suporte beta para Espaços. Comprimir vídeo antes de enviar.
|
||||
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.7
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
Principais mudanças nesta version: melhoramento para Espaços.
|
||||
Principais mudanças nesta versão: melhoramento para Espaços.
|
||||
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.8
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
Principais mudanças nesta version: adicionar supporte a rede gitter.im.
|
||||
Principais mudanças nesta versão: adicionar supporte a rede gitter.im.
|
||||
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.9
|
||||
|
|
2
fastlane/metadata/android/pt-BR/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/pt-BR/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Principais mudanças nesta versão: atualização de tema e estilo e novas funcionalidades para espaços.
|
||||
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/pt-BR/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/pt-BR/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Principais mudanças nesta versão: atualização de tema e estilo e novas funcionalidades para espaços (bugfix para 1.1.10)
|
||||
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
2
fastlane/metadata/android/uk/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/uk/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Основні зміни цієї версії: оновлено зовнішній вигляд та нові можливості для просторів
|
||||
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/uk/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/uk/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
Основні зміни цієї версії: оновлено зовнішній вигляд та нові можливості для просторів (bugfix для 1.1.10)
|
||||
Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
2
fastlane/metadata/android/zh-CN/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/zh-CN/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
此版本的主要变化:主题和样式更新以及空间的新功能。
|
||||
完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/zh-CN/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/zh-CN/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
此版本的主要变化:主题和样式更新以及空间的新功能(1.1.10 的错误修复)
|
||||
完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
2
fastlane/metadata/android/zh-TW/changelogs/40101100.txt
Normal file
2
fastlane/metadata/android/zh-TW/changelogs/40101100.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
此版本中的主要變動:佈景主題與樣式更新,以及空間的新功能。
|
||||
完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.10
|
2
fastlane/metadata/android/zh-TW/changelogs/40101110.txt
Normal file
2
fastlane/metadata/android/zh-TW/changelogs/40101110.txt
Normal file
|
@ -0,0 +1,2 @@
|
|||
此版本中的主要變動:佈景主題與樣式更新,以及空間的新功能(1.1.10 的臭蟲修復版本)
|
||||
完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.11
|
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=a9e356a21595348b6f04b024ed0b08ac8aea6b2ac37e6c0ef58e51549cd7b9cb
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-all.zip
|
||||
distributionSha256Sum=9bb8bc05f562f2d42bdf1ba8db62f6b6fa1c3bf6c392228802cc7cb0578fe7e0
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
|
|
|
@ -53,7 +53,7 @@ android {
|
|||
|
||||
dependencies {
|
||||
implementation 'androidx.appcompat:appcompat:1.3.0'
|
||||
implementation 'com.google.android.material:material:1.3.0'
|
||||
implementation 'com.google.android.material:material:1.4.0'
|
||||
// Pref theme
|
||||
implementation 'androidx.preference:preference-ktx:1.1.1'
|
||||
// PFLockScreen attrs
|
||||
|
|
|
@ -9,7 +9,7 @@ buildscript {
|
|||
mavenCentral()
|
||||
}
|
||||
dependencies {
|
||||
classpath "io.realm:realm-gradle-plugin:10.6.0"
|
||||
classpath "io.realm:realm-gradle-plugin:10.6.1"
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -121,7 +121,7 @@ dependencies {
|
|||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
|
||||
|
||||
implementation "androidx.appcompat:appcompat:1.3.0"
|
||||
implementation "androidx.core:core-ktx:1.5.0"
|
||||
implementation "androidx.core:core-ktx:1.6.0"
|
||||
|
||||
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
|
||||
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
|
||||
|
@ -169,30 +169,30 @@ dependencies {
|
|||
implementation 'com.otaliastudios:transcoder:0.10.3'
|
||||
|
||||
// Phone number https://github.com/google/libphonenumber
|
||||
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.26'
|
||||
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.27'
|
||||
|
||||
testImplementation 'junit:junit:4.13.2'
|
||||
testImplementation 'org.robolectric:robolectric:4.5.1'
|
||||
//testImplementation 'org.robolectric:shadows-support-v4:3.0'
|
||||
// Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281
|
||||
testImplementation 'io.mockk:mockk:1.11.0'
|
||||
testImplementation 'org.amshove.kluent:kluent-android:1.67'
|
||||
testImplementation 'io.mockk:mockk:1.12.0'
|
||||
testImplementation 'org.amshove.kluent:kluent-android:1.68'
|
||||
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
|
||||
// Plant Timber tree for test
|
||||
testImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1'
|
||||
|
||||
kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"
|
||||
androidTestImplementation 'androidx.test:core:1.3.0'
|
||||
androidTestImplementation 'androidx.test:runner:1.3.0'
|
||||
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.65'
|
||||
androidTestImplementation 'io.mockk:mockk-android:1.11.0'
|
||||
androidTestImplementation 'androidx.test:core:1.4.0'
|
||||
androidTestImplementation 'androidx.test:runner:1.4.0'
|
||||
androidTestImplementation 'androidx.test:rules:1.4.0'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
androidTestImplementation 'org.amshove.kluent:kluent-android:1.68'
|
||||
androidTestImplementation 'io.mockk:mockk-android:1.12.0'
|
||||
androidTestImplementation "androidx.arch.core:core-testing:$arch_version"
|
||||
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
|
||||
// Plant Timber tree for test
|
||||
androidTestImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1'
|
||||
|
||||
androidTestUtil 'androidx.test:orchestrator:1.3.0'
|
||||
androidTestUtil 'androidx.test:orchestrator:1.4.0'
|
||||
}
|
||||
|
|
|
@ -78,7 +78,7 @@ class CommonTestHelper(context: Context) {
|
|||
}
|
||||
|
||||
/**
|
||||
* Create a Home server configuration, with Http connection allowed for test
|
||||
* Create a homeserver configuration, with Http connection allowed for test
|
||||
*/
|
||||
fun createHomeServerConfig(): HomeServerConnectionConfig {
|
||||
return HomeServerConnectionConfig.Builder()
|
||||
|
|
|
@ -816,7 +816,7 @@ class KeysBackupTest : InstrumentedTest {
|
|||
// - Do an e2e backup to the homeserver
|
||||
mKeysBackupTestHelper.prepareAndCreateKeysBackupData(keysBackup)
|
||||
|
||||
// Get key backup version from the home server
|
||||
// Get key backup version from the homeserver
|
||||
val keysVersionResult = mTestHelper.doSync<KeysVersionResult?> {
|
||||
keysBackup.getCurrentVersion(it)
|
||||
}
|
||||
|
|
|
@ -16,8 +16,12 @@
|
|||
|
||||
package org.matrix.android.sdk.api
|
||||
|
||||
import org.matrix.android.sdk.BuildConfig
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
* This class contains pattern to match the different Matrix ids
|
||||
* Ref: https://matrix.org/docs/spec/appendices#identifier-grammar
|
||||
*/
|
||||
object MatrixPatterns {
|
||||
|
||||
|
@ -25,7 +29,7 @@ object MatrixPatterns {
|
|||
private const val DOMAIN_REGEX = ":[A-Z0-9.-]+(:[0-9]{2,5})?"
|
||||
|
||||
// regex pattern to find matrix user ids in a string.
|
||||
// See https://matrix.org/speculator/spec/HEAD/appendices.html#historical-user-ids
|
||||
// See https://matrix.org/docs/spec/appendices#historical-user-ids
|
||||
private const val MATRIX_USER_IDENTIFIER_REGEX = "@[A-Z0-9\\x21-\\x39\\x3B-\\x7F]+$DOMAIN_REGEX"
|
||||
val PATTERN_CONTAIN_MATRIX_USER_IDENTIFIER = MATRIX_USER_IDENTIFIER_REGEX.toRegex(RegexOption.IGNORE_CASE)
|
||||
|
||||
|
@ -154,7 +158,7 @@ object MatrixPatterns {
|
|||
* Orders which are not strings, or do not consist solely of ascii characters in the range \x20 (space) to \x7E (~),
|
||||
* or consist of more than 50 characters, are forbidden and the field should be ignored if received.
|
||||
*/
|
||||
fun isValidOrderString(order: String?) : Boolean {
|
||||
fun isValidOrderString(order: String?): Boolean {
|
||||
return order != null && order.length < 50 && order matches ORDER_STRING_REGEX
|
||||
}
|
||||
|
||||
|
@ -163,4 +167,18 @@ object MatrixPatterns {
|
|||
"[^a-z0-9._%#@=+-]".toRegex().replace(it, "")
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the domain form a userId
|
||||
* Examples:
|
||||
* - "@alice:domain.org".getDomain() will return "domain.org"
|
||||
* - "@bob:domain.org:3455".getDomain() will return "domain.org:3455"
|
||||
*/
|
||||
fun String.getDomain(): String {
|
||||
if (BuildConfig.DEBUG && !isUserId(this)) {
|
||||
// They are some invalid userId localpart in the wild, but the domain part should be there anyway
|
||||
Timber.w("Not a valid user ID: $this")
|
||||
}
|
||||
return substringAfter(":")
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,11 +18,11 @@ package org.matrix.android.sdk.api.auth.data
|
|||
|
||||
import android.net.Uri
|
||||
import com.squareup.moshi.JsonClass
|
||||
import okhttp3.CipherSuite
|
||||
import okhttp3.TlsVersion
|
||||
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig.Builder
|
||||
import org.matrix.android.sdk.internal.network.ssl.Fingerprint
|
||||
import org.matrix.android.sdk.internal.util.ensureTrailingSlash
|
||||
import okhttp3.CipherSuite
|
||||
import okhttp3.TlsVersion
|
||||
|
||||
/**
|
||||
* This data class holds how to connect to a specific Homeserver.
|
||||
|
@ -31,7 +31,12 @@ import okhttp3.TlsVersion
|
|||
*/
|
||||
@JsonClass(generateAdapter = true)
|
||||
data class HomeServerConnectionConfig(
|
||||
// This is the homeserver URL entered by the user
|
||||
val homeServerUri: Uri,
|
||||
// This is the homeserver base URL for the client-server API. Default to homeServerUri,
|
||||
// but can be updated with data from .Well-Known before login, and/or with the data
|
||||
// included in the login response
|
||||
val homeServerUriBase: Uri = homeServerUri,
|
||||
val identityServerUri: Uri? = null,
|
||||
val antiVirusServerUri: Uri? = null,
|
||||
val allowedFingerprints: List<Fingerprint> = emptyList(),
|
||||
|
@ -47,7 +52,6 @@ data class HomeServerConnectionConfig(
|
|||
* This builder should be use to create a [HomeServerConnectionConfig] instance.
|
||||
*/
|
||||
class Builder {
|
||||
|
||||
private lateinit var homeServerUri: Uri
|
||||
private var identityServerUri: Uri? = null
|
||||
private var antiVirusServerUri: Uri? = null
|
||||
|
@ -69,14 +73,14 @@ data class HomeServerConnectionConfig(
|
|||
*/
|
||||
fun withHomeServerUri(hsUri: Uri): Builder {
|
||||
if (hsUri.scheme != "http" && hsUri.scheme != "https") {
|
||||
throw RuntimeException("Invalid home server URI: $hsUri")
|
||||
throw RuntimeException("Invalid homeserver URI: $hsUri")
|
||||
}
|
||||
// ensure trailing /
|
||||
val hsString = hsUri.toString().ensureTrailingSlash()
|
||||
homeServerUri = try {
|
||||
Uri.parse(hsString)
|
||||
} catch (e: Exception) {
|
||||
throw RuntimeException("Invalid home server URI: $hsUri")
|
||||
throw RuntimeException("Invalid homeserver URI: $hsUri")
|
||||
}
|
||||
return this
|
||||
}
|
||||
|
@ -134,7 +138,7 @@ data class HomeServerConnectionConfig(
|
|||
}
|
||||
|
||||
/**
|
||||
* Add an accepted TLS version for TLS connections with the home server.
|
||||
* Add an accepted TLS version for TLS connections with the homeserver.
|
||||
*
|
||||
* @param tlsVersion the tls version to add to the set of TLS versions accepted.
|
||||
* @return this builder
|
||||
|
@ -156,7 +160,7 @@ data class HomeServerConnectionConfig(
|
|||
}
|
||||
|
||||
/**
|
||||
* Add a TLS cipher suite to the list of accepted TLS connections with the home server.
|
||||
* Add a TLS cipher suite to the list of accepted TLS connections with the homeserver.
|
||||
*
|
||||
* @param tlsCipherSuite the tls cipher suite to add.
|
||||
* @return this builder
|
||||
|
@ -234,16 +238,16 @@ data class HomeServerConnectionConfig(
|
|||
*/
|
||||
fun build(): HomeServerConnectionConfig {
|
||||
return HomeServerConnectionConfig(
|
||||
homeServerUri,
|
||||
identityServerUri,
|
||||
antiVirusServerUri,
|
||||
allowedFingerprints,
|
||||
shouldPin,
|
||||
tlsVersions,
|
||||
tlsCipherSuites,
|
||||
shouldAcceptTlsExtensions,
|
||||
allowHttpExtension,
|
||||
forceUsageTlsVersions
|
||||
homeServerUri = homeServerUri,
|
||||
identityServerUri = identityServerUri,
|
||||
antiVirusServerUri = antiVirusServerUri,
|
||||
allowedFingerprints = allowedFingerprints,
|
||||
shouldPin = shouldPin,
|
||||
tlsVersions = tlsVersions,
|
||||
tlsCipherSuites = tlsCipherSuites,
|
||||
shouldAcceptTlsExtensions = shouldAcceptTlsExtensions,
|
||||
allowHttpExtension = allowHttpExtension,
|
||||
forceUsageTlsVersions = forceUsageTlsVersions
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,13 +51,18 @@ data class SessionParams(
|
|||
val deviceId = credentials.deviceId
|
||||
|
||||
/**
|
||||
* The current homeserver Url. It can be different that the homeserver url entered
|
||||
* during login phase, because a redirection may have occurred
|
||||
* The homeserver Url entered by the user during the login phase.
|
||||
*/
|
||||
val homeServerUrl = homeServerConnectionConfig.homeServerUri.toString()
|
||||
|
||||
/**
|
||||
* The current homeserver host
|
||||
* The current homeserver Url for client-server API. It can be different that the homeserver url entered
|
||||
* during login phase, because a redirection may have occurred
|
||||
*/
|
||||
val homeServerUrlBase = homeServerConnectionConfig.homeServerUriBase.toString()
|
||||
|
||||
/**
|
||||
* The current homeserver host, using what has been entered by the user during login phase
|
||||
*/
|
||||
val homeServerHost = homeServerConnectionConfig.homeServerUri.host
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ data class RegistrationFlowResponse(
|
|||
val completedStages: List<String>? = null,
|
||||
|
||||
/**
|
||||
* The session identifier that the client must pass back to the home server, if one is provided,
|
||||
* The session identifier that the client must pass back to the homeserver, if one is provided,
|
||||
* in subsequent attempts to authenticate in the same API call.
|
||||
*/
|
||||
@Json(name = "session")
|
||||
|
|
|
@ -22,11 +22,6 @@ import org.matrix.android.sdk.api.auth.data.WellKnown
|
|||
* Ref: https://matrix.org/docs/spec/client_server/latest#well-known-uri
|
||||
*/
|
||||
sealed class WellknownResult {
|
||||
/**
|
||||
* The provided matrixId is no valid. Unable to extract a domain name.
|
||||
*/
|
||||
object InvalidMatrixId : WellknownResult()
|
||||
|
||||
/**
|
||||
* Retrieve the specific piece of information from the user in a way which fits within the existing client user experience,
|
||||
* if the client is inclined to do so. Failure can take place instead if no good user experience for this is possible at this point.
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* 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.failure
|
||||
|
||||
sealed class MatrixIdFailure : Failure.FeatureFailure() {
|
||||
object InvalidMatrixId : MatrixIdFailure()
|
||||
}
|
|
@ -29,8 +29,10 @@ interface RawService {
|
|||
|
||||
/**
|
||||
* Specific case for the well-known file. Cache validity is 8 hours
|
||||
* @param domain the domain to get the .well-known file, for instance "matrix.org".
|
||||
* The URL will be "https://{domain}/.well-known/matrix/client"
|
||||
*/
|
||||
suspend fun getWellknown(userId: String): String
|
||||
suspend fun getWellknown(domain: String): String
|
||||
|
||||
/**
|
||||
* Clear all the cache data
|
||||
|
|
|
@ -28,7 +28,7 @@ import org.matrix.android.sdk.internal.crypto.store.SavedKeyBackupKeyInfo
|
|||
|
||||
interface KeysBackupService {
|
||||
/**
|
||||
* Retrieve the current version of the backup from the home server
|
||||
* Retrieve the current version of the backup from the homeserver
|
||||
*
|
||||
* It can be different than keysBackupVersion.
|
||||
* @param callback onSuccess(null) will be called if there is no backup on the server
|
||||
|
|
|
@ -54,7 +54,7 @@ enum class KeysBackupState {
|
|||
// Need to check the current backup version on the homeserver
|
||||
Unknown,
|
||||
|
||||
// Checking if backup is enabled on home server
|
||||
// Checking if backup is enabled on homeserver
|
||||
CheckingBackUpOnHomeserver,
|
||||
|
||||
// Backup has been stopped because a new backup version has been detected on the homeserver
|
||||
|
|
|
@ -104,7 +104,7 @@ data class Event(
|
|||
|
||||
/**
|
||||
* The `age` value transcoded in a timestamp based on the device clock when the SDK received
|
||||
* the event from the home server.
|
||||
* the event from the homeserver.
|
||||
* Unlike `age`, this value is static.
|
||||
*/
|
||||
@Transient
|
||||
|
|
|
@ -32,7 +32,13 @@ data class HomeServerCapabilities(
|
|||
/**
|
||||
* Default identity server url, provided in Wellknown
|
||||
*/
|
||||
val defaultIdentityServerUrl: String? = null
|
||||
val defaultIdentityServerUrl: String? = null,
|
||||
/**
|
||||
* Room versions supported by the server
|
||||
* This capability describes the default and available room versions a server supports, and at what level of stability.
|
||||
* Clients should make use of this capability to determine if users need to be encouraged to upgrade their rooms.
|
||||
*/
|
||||
val roomVersions: RoomVersionCapabilities? = null
|
||||
) {
|
||||
companion object {
|
||||
const val MAX_UPLOAD_FILE_SIZE_UNKNOWN = -1L
|
||||
|
|
|
@ -0,0 +1,32 @@
|
|||
/*
|
||||
* 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.homeserver
|
||||
|
||||
data class RoomVersionCapabilities(
|
||||
val defaultRoomVersion: String,
|
||||
val supportedVersion: List<RoomVersionInfo>
|
||||
)
|
||||
|
||||
data class RoomVersionInfo(
|
||||
val version: String,
|
||||
val status: RoomVersionStatus
|
||||
)
|
||||
|
||||
enum class RoomVersionStatus {
|
||||
STABLE,
|
||||
UNSTABLE
|
||||
}
|
|
@ -34,6 +34,7 @@ import org.matrix.android.sdk.api.session.room.tags.TagsService
|
|||
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.room.version.RoomVersionService
|
||||
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
|
||||
|
@ -57,7 +58,8 @@ interface Room :
|
|||
RelationService,
|
||||
RoomCryptoService,
|
||||
RoomPushRuleService,
|
||||
RoomAccountDataService {
|
||||
RoomAccountDataService,
|
||||
RoomVersionService {
|
||||
|
||||
/**
|
||||
* The roomId of this room
|
||||
|
|
|
@ -54,5 +54,5 @@ data class MessageAudioContent(
|
|||
) : MessageWithAttachmentContent {
|
||||
|
||||
override val mimeType: String?
|
||||
get() = encryptedFileInfo?.mimetype ?: audioInfo?.mimeType
|
||||
get() = audioInfo?.mimeType
|
||||
}
|
||||
|
|
|
@ -60,8 +60,7 @@ data class MessageFileContent(
|
|||
) : MessageWithAttachmentContent {
|
||||
|
||||
override val mimeType: String?
|
||||
get() = encryptedFileInfo?.mimetype
|
||||
?: info?.mimeType
|
||||
get() = info?.mimeType
|
||||
?: MimeTypeMap.getFileExtensionFromUrl(filename ?: body)?.let { extension ->
|
||||
MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension)
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@ import com.squareup.moshi.Json
|
|||
import com.squareup.moshi.JsonClass
|
||||
import org.matrix.android.sdk.api.session.events.model.Content
|
||||
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
|
||||
import org.matrix.android.sdk.api.util.MimeTypes
|
||||
import org.matrix.android.sdk.internal.crypto.model.rest.EncryptedFileInfo
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
|
@ -55,5 +54,5 @@ data class MessageImageContent(
|
|||
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
|
||||
) : MessageImageInfoContent {
|
||||
override val mimeType: String?
|
||||
get() = encryptedFileInfo?.mimetype ?: info?.mimeType ?: MimeTypes.Images
|
||||
get() = info?.mimeType
|
||||
}
|
||||
|
|
|
@ -55,5 +55,5 @@ data class MessageStickerContent(
|
|||
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
|
||||
) : MessageImageInfoContent {
|
||||
override val mimeType: String?
|
||||
get() = encryptedFileInfo?.mimetype ?: info?.mimeType
|
||||
get() = info?.mimeType
|
||||
}
|
||||
|
|
|
@ -53,5 +53,5 @@ data class MessageVideoContent(
|
|||
@Json(name = "file") override val encryptedFileInfo: EncryptedFileInfo? = null
|
||||
) : MessageWithAttachmentContent {
|
||||
override val mimeType: String?
|
||||
get() = encryptedFileInfo?.mimetype ?: videoInfo?.mimeType
|
||||
get() = videoInfo?.mimeType
|
||||
}
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* 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.version
|
||||
|
||||
interface RoomVersionService {
|
||||
/**
|
||||
* Return the room version of this room
|
||||
*/
|
||||
fun getRoomVersion(): String
|
||||
|
||||
/**
|
||||
* Upgrade to the given room version
|
||||
* @return the replacement room id
|
||||
*/
|
||||
suspend fun upgradeToVersion(version: String): String
|
||||
|
||||
/**
|
||||
* Get the recommended room version for the current homeserver
|
||||
*/
|
||||
fun getRecommendedVersion() : String
|
||||
|
||||
/**
|
||||
* Ask if the user has enough power level to upgrade the room
|
||||
*/
|
||||
fun userMayUpgradeRoom(userId: String): Boolean
|
||||
|
||||
/**
|
||||
* Return true if the current room version is declared unstable by the homeserver
|
||||
*/
|
||||
fun isUsingUnstableRoomVersion(): Boolean
|
||||
}
|
|
@ -18,6 +18,7 @@ package org.matrix.android.sdk.api.session.space
|
|||
|
||||
import org.matrix.android.sdk.api.session.room.Room
|
||||
import org.matrix.android.sdk.api.session.room.model.RoomSummary
|
||||
import org.matrix.android.sdk.api.session.space.model.SpaceChildContent
|
||||
|
||||
interface Space {
|
||||
|
||||
|
@ -38,6 +39,8 @@ interface Space {
|
|||
autoJoin: Boolean = false,
|
||||
suggested: Boolean? = false)
|
||||
|
||||
fun getChildInfo(roomId: String): SpaceChildContent?
|
||||
|
||||
suspend fun removeChildren(roomId: String)
|
||||
|
||||
@Throws
|
||||
|
|
|
@ -21,8 +21,8 @@ import org.matrix.android.sdk.api.util.JsonDict
|
|||
import org.matrix.android.sdk.internal.auth.data.Availability
|
||||
import org.matrix.android.sdk.internal.auth.data.LoginFlowResponse
|
||||
import org.matrix.android.sdk.internal.auth.data.PasswordLoginParams
|
||||
import org.matrix.android.sdk.internal.auth.data.RiotConfig
|
||||
import org.matrix.android.sdk.internal.auth.data.TokenLoginParams
|
||||
import org.matrix.android.sdk.internal.auth.data.WebClientConfig
|
||||
import org.matrix.android.sdk.internal.auth.login.ResetPasswordMailConfirmed
|
||||
import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistrationParams
|
||||
import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistrationResponse
|
||||
|
@ -44,16 +44,16 @@ import retrofit2.http.Url
|
|||
*/
|
||||
internal interface AuthAPI {
|
||||
/**
|
||||
* Get a Riot config file, using the name including the domain
|
||||
* Get a Web client config file, using the name including the domain
|
||||
*/
|
||||
@GET("config.{domain}.json")
|
||||
suspend fun getRiotConfigDomain(@Path("domain") domain: String): RiotConfig
|
||||
suspend fun getWebClientConfigDomain(@Path("domain") domain: String): WebClientConfig
|
||||
|
||||
/**
|
||||
* Get a Riot config file
|
||||
* Get a Web client default config file
|
||||
*/
|
||||
@GET("config.json")
|
||||
suspend fun getRiotConfig(): RiotConfig
|
||||
suspend fun getWebClientConfig(): WebClientConfig
|
||||
|
||||
/**
|
||||
* Get the version information of the homeserver
|
||||
|
|
|
@ -19,6 +19,8 @@ package org.matrix.android.sdk.internal.auth
|
|||
import android.net.Uri
|
||||
import dagger.Lazy
|
||||
import okhttp3.OkHttpClient
|
||||
import org.matrix.android.sdk.api.MatrixPatterns
|
||||
import org.matrix.android.sdk.api.MatrixPatterns.getDomain
|
||||
import org.matrix.android.sdk.api.auth.AuthenticationService
|
||||
import org.matrix.android.sdk.api.auth.data.Credentials
|
||||
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
|
||||
|
@ -28,10 +30,11 @@ import org.matrix.android.sdk.api.auth.login.LoginWizard
|
|||
import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
|
||||
import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
|
||||
import org.matrix.android.sdk.api.failure.Failure
|
||||
import org.matrix.android.sdk.api.failure.MatrixIdFailure
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
import org.matrix.android.sdk.api.util.appendParamToUrl
|
||||
import org.matrix.android.sdk.internal.SessionManager
|
||||
import org.matrix.android.sdk.internal.auth.data.RiotConfig
|
||||
import org.matrix.android.sdk.internal.auth.data.WebClientConfig
|
||||
import org.matrix.android.sdk.internal.auth.db.PendingSessionData
|
||||
import org.matrix.android.sdk.internal.auth.login.DefaultLoginWizard
|
||||
import org.matrix.android.sdk.internal.auth.login.DirectLoginTask
|
||||
|
@ -122,7 +125,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
private fun getHomeServerUrlBase(): String? {
|
||||
return pendingSessionData
|
||||
?.homeServerConnectionConfig
|
||||
?.homeServerUri
|
||||
?.homeServerUriBase
|
||||
?.toString()
|
||||
?.trim { it == '/' }
|
||||
}
|
||||
|
@ -143,9 +146,9 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
return result.fold(
|
||||
{
|
||||
// The homeserver exists and up to date, keep the config
|
||||
// Homeserver url may have been changed, if it was a Riot url
|
||||
// Homeserver url may have been changed, if it was a Web client url
|
||||
val alteredHomeServerConnectionConfig = homeServerConnectionConfig.copy(
|
||||
homeServerUri = Uri.parse(it.homeServerUrl)
|
||||
homeServerUriBase = Uri.parse(it.homeServerUrl)
|
||||
)
|
||||
|
||||
pendingSessionData = PendingSessionData(alteredHomeServerConnectionConfig)
|
||||
|
@ -154,7 +157,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
},
|
||||
{
|
||||
if (it is UnrecognizedCertificateException) {
|
||||
throw Failure.UnrecognizedCertificateFailure(homeServerConnectionConfig.homeServerUri.toString(), it.fingerprint)
|
||||
throw Failure.UnrecognizedCertificateFailure(homeServerConnectionConfig.homeServerUriBase.toString(), it.fingerprint)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
|
@ -165,46 +168,57 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
private suspend fun getLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
val authAPI = buildAuthAPI(homeServerConnectionConfig)
|
||||
|
||||
// First check the homeserver version
|
||||
return runCatching {
|
||||
executeRequest(null) {
|
||||
authAPI.versions()
|
||||
// First check if there is a well-known file
|
||||
return try {
|
||||
getWellknownLoginFlowInternal(homeServerConnectionConfig)
|
||||
} catch (failure: Throwable) {
|
||||
if (failure is Failure.OtherServerError
|
||||
&& failure.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// 404, no well-known data, try direct access to the API
|
||||
// First check the homeserver version
|
||||
return runCatching {
|
||||
executeRequest(null) {
|
||||
authAPI.versions()
|
||||
}
|
||||
}
|
||||
.map { versions ->
|
||||
// Ok, it seems that the homeserver url is valid
|
||||
getLoginFlowResult(authAPI, versions, homeServerConnectionConfig.homeServerUriBase.toString())
|
||||
}
|
||||
.fold(
|
||||
{
|
||||
it
|
||||
},
|
||||
{
|
||||
if (it is Failure.OtherServerError
|
||||
&& it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// It's maybe a Web client url?
|
||||
getWebClientDomainLoginFlowInternal(homeServerConnectionConfig)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
}
|
||||
)
|
||||
} else {
|
||||
throw failure
|
||||
}
|
||||
}
|
||||
.map { versions ->
|
||||
// Ok, it seems that the homeserver url is valid
|
||||
getLoginFlowResult(authAPI, versions, homeServerConnectionConfig.homeServerUri.toString())
|
||||
}
|
||||
.fold(
|
||||
{
|
||||
it
|
||||
},
|
||||
{
|
||||
if (it is Failure.OtherServerError
|
||||
&& it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// It's maybe a Riot url?
|
||||
getRiotDomainLoginFlowInternal(homeServerConnectionConfig)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun getRiotDomainLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
private suspend fun getWebClientDomainLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
val authAPI = buildAuthAPI(homeServerConnectionConfig)
|
||||
|
||||
val domain = homeServerConnectionConfig.homeServerUri.host
|
||||
?: return getRiotLoginFlowInternal(homeServerConnectionConfig)
|
||||
?: return getWebClientLoginFlowInternal(homeServerConnectionConfig)
|
||||
|
||||
// Ok, try to get the config.domain.json file of a RiotWeb client
|
||||
// Ok, try to get the config.domain.json file of a Web client
|
||||
return runCatching {
|
||||
executeRequest(null) {
|
||||
authAPI.getRiotConfigDomain(domain)
|
||||
authAPI.getWebClientConfigDomain(domain)
|
||||
}
|
||||
}
|
||||
.map { riotConfig ->
|
||||
onRiotConfigRetrieved(homeServerConnectionConfig, riotConfig)
|
||||
.map { webClientConfig ->
|
||||
onWebClientConfigRetrieved(homeServerConnectionConfig, webClientConfig)
|
||||
}
|
||||
.fold(
|
||||
{
|
||||
|
@ -214,7 +228,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
if (it is Failure.OtherServerError
|
||||
&& it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// Try with config.json
|
||||
getRiotLoginFlowInternal(homeServerConnectionConfig)
|
||||
getWebClientLoginFlowInternal(homeServerConnectionConfig)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
|
@ -222,40 +236,24 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
)
|
||||
}
|
||||
|
||||
private suspend fun getRiotLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
private suspend fun getWebClientLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
val authAPI = buildAuthAPI(homeServerConnectionConfig)
|
||||
|
||||
// Ok, try to get the config.json file of a RiotWeb client
|
||||
return runCatching {
|
||||
executeRequest(null) {
|
||||
authAPI.getRiotConfig()
|
||||
}
|
||||
// Ok, try to get the config.json file of a Web client
|
||||
return executeRequest(null) {
|
||||
authAPI.getWebClientConfig()
|
||||
}
|
||||
.map { riotConfig ->
|
||||
onRiotConfigRetrieved(homeServerConnectionConfig, riotConfig)
|
||||
.let { webClientConfig ->
|
||||
onWebClientConfigRetrieved(homeServerConnectionConfig, webClientConfig)
|
||||
}
|
||||
.fold(
|
||||
{
|
||||
it
|
||||
},
|
||||
{
|
||||
if (it is Failure.OtherServerError
|
||||
&& it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// Try with wellknown
|
||||
getWellknownLoginFlowInternal(homeServerConnectionConfig)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun onRiotConfigRetrieved(homeServerConnectionConfig: HomeServerConnectionConfig, riotConfig: RiotConfig): LoginFlowResult {
|
||||
val defaultHomeServerUrl = riotConfig.getPreferredHomeServerUrl()
|
||||
private suspend fun onWebClientConfigRetrieved(homeServerConnectionConfig: HomeServerConnectionConfig, webClientConfig: WebClientConfig): LoginFlowResult {
|
||||
val defaultHomeServerUrl = webClientConfig.getPreferredHomeServerUrl()
|
||||
if (defaultHomeServerUrl?.isNotEmpty() == true) {
|
||||
// Ok, good sign, we got a default hs url
|
||||
val newHomeServerConnectionConfig = homeServerConnectionConfig.copy(
|
||||
homeServerUri = Uri.parse(defaultHomeServerUrl)
|
||||
homeServerUriBase = Uri.parse(defaultHomeServerUrl)
|
||||
)
|
||||
|
||||
val newAuthAPI = buildAuthAPI(newHomeServerConnectionConfig)
|
||||
|
@ -275,15 +273,13 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
val domain = homeServerConnectionConfig.homeServerUri.host
|
||||
?: throw Failure.OtherServerError("", HttpsURLConnection.HTTP_NOT_FOUND /* 404 */)
|
||||
|
||||
// Create a fake userId, for the getWellknown task
|
||||
val fakeUserId = "@alice:$domain"
|
||||
val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(fakeUserId, homeServerConnectionConfig))
|
||||
val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(domain, homeServerConnectionConfig))
|
||||
|
||||
return when (wellknownResult) {
|
||||
is WellknownResult.Prompt -> {
|
||||
val newHomeServerConnectionConfig = homeServerConnectionConfig.copy(
|
||||
homeServerUri = Uri.parse(wellknownResult.homeServerUrl),
|
||||
identityServerUri = wellknownResult.identityServerUrl?.let { Uri.parse(it) }
|
||||
homeServerUriBase = Uri.parse(wellknownResult.homeServerUrl),
|
||||
identityServerUri = wellknownResult.identityServerUrl?.let { Uri.parse(it) } ?: homeServerConnectionConfig.identityServerUri
|
||||
)
|
||||
|
||||
val newAuthAPI = buildAuthAPI(newHomeServerConnectionConfig)
|
||||
|
@ -379,7 +375,14 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
|
||||
override suspend fun getWellKnownData(matrixId: String,
|
||||
homeServerConnectionConfig: HomeServerConnectionConfig?): WellknownResult {
|
||||
return getWellknownTask.execute(GetWellknownTask.Params(matrixId, homeServerConnectionConfig))
|
||||
if (!MatrixPatterns.isUserId(matrixId)) {
|
||||
throw MatrixIdFailure.InvalidMatrixId
|
||||
}
|
||||
|
||||
return getWellknownTask.execute(GetWellknownTask.Params(
|
||||
domain = matrixId.getDomain(),
|
||||
homeServerConnectionConfig = homeServerConnectionConfig)
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
|
||||
|
@ -390,7 +393,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
}
|
||||
|
||||
private fun buildAuthAPI(homeServerConnectionConfig: HomeServerConnectionConfig): AuthAPI {
|
||||
val retrofit = retrofitFactory.create(buildClient(homeServerConnectionConfig), homeServerConnectionConfig.homeServerUri.toString())
|
||||
val retrofit = retrofitFactory.create(buildClient(homeServerConnectionConfig), homeServerConnectionConfig.homeServerUriBase.toString())
|
||||
return retrofit.create(AuthAPI::class.java)
|
||||
}
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ internal class DefaultIsValidClientServerApiTask @Inject constructor(
|
|||
|
||||
override suspend fun execute(params: IsValidClientServerApiTask.Params): Boolean {
|
||||
val client = buildClient(params.homeServerConnectionConfig)
|
||||
val homeServerUrl = params.homeServerConnectionConfig.homeServerUri.toString()
|
||||
val homeServerUrl = params.homeServerConnectionConfig.homeServerUriBase.toString()
|
||||
|
||||
val authAPI = retrofitFactory.create(client, homeServerUrl)
|
||||
.create(AuthAPI::class.java)
|
||||
|
|
|
@ -38,7 +38,7 @@ internal class DefaultSessionCreator @Inject constructor(
|
|||
) : SessionCreator {
|
||||
|
||||
/**
|
||||
* Credentials can affect the homeServerConnectionConfig, override home server url and/or
|
||||
* Credentials can affect the homeServerConnectionConfig, override homeserver url and/or
|
||||
* identity server url if provided in the credentials
|
||||
*/
|
||||
override suspend fun createSession(credentials: Credentials, homeServerConnectionConfig: HomeServerConnectionConfig): Session {
|
||||
|
@ -56,7 +56,7 @@ internal class DefaultSessionCreator @Inject constructor(
|
|||
tryOrNull {
|
||||
isValidClientServerApiTask.execute(
|
||||
IsValidClientServerApiTask.Params(
|
||||
homeServerConnectionConfig.copy(homeServerUri = it)
|
||||
homeServerConnectionConfig.copy(homeServerUriBase = it)
|
||||
)
|
||||
)
|
||||
.also { Timber.d("Overriding homeserver url: $it") }
|
||||
|
@ -66,7 +66,7 @@ internal class DefaultSessionCreator @Inject constructor(
|
|||
val sessionParams = SessionParams(
|
||||
credentials = credentials,
|
||||
homeServerConnectionConfig = homeServerConnectionConfig.copy(
|
||||
homeServerUri = overriddenUrl ?: homeServerConnectionConfig.homeServerUri,
|
||||
homeServerUriBase = overriddenUrl ?: homeServerConnectionConfig.homeServerUriBase,
|
||||
identityServerUri = credentials.discoveryInformation?.identityServer?.baseURL
|
||||
// remove trailing "/"
|
||||
?.trim { it == '/' }
|
||||
|
|
|
@ -20,7 +20,7 @@ import com.squareup.moshi.Json
|
|||
import com.squareup.moshi.JsonClass
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class RiotConfig(
|
||||
internal data class WebClientConfig(
|
||||
/**
|
||||
* This is now deprecated, but still used first, rather than value from "default_server_config"
|
||||
*/
|
||||
|
@ -28,7 +28,7 @@ internal data class RiotConfig(
|
|||
val defaultHomeServerUrl: String?,
|
||||
|
||||
@Json(name = "default_server_config")
|
||||
val defaultServerConfig: RiotConfigDefaultServerConfig?
|
||||
val defaultServerConfig: WebClientConfigDefaultServerConfig?
|
||||
) {
|
||||
fun getPreferredHomeServerUrl(): String? {
|
||||
return defaultHomeServerUrl
|
||||
|
@ -38,13 +38,13 @@ internal data class RiotConfig(
|
|||
}
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class RiotConfigDefaultServerConfig(
|
||||
internal data class WebClientConfigDefaultServerConfig(
|
||||
@Json(name = "m.homeserver")
|
||||
val homeServer: RiotConfigBaseConfig? = null
|
||||
val homeServer: WebClientConfigBaseConfig? = null
|
||||
)
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class RiotConfigBaseConfig(
|
||||
internal data class WebClientConfigBaseConfig(
|
||||
@Json(name = "base_url")
|
||||
val baseURL: String? = null
|
||||
)
|
|
@ -16,17 +16,19 @@
|
|||
|
||||
package org.matrix.android.sdk.internal.auth.db
|
||||
|
||||
import org.matrix.android.sdk.api.auth.data.Credentials
|
||||
import org.matrix.android.sdk.api.auth.data.sessionId
|
||||
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||
import android.net.Uri
|
||||
import io.realm.DynamicRealm
|
||||
import io.realm.RealmMigration
|
||||
import org.matrix.android.sdk.api.auth.data.Credentials
|
||||
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
|
||||
import org.matrix.android.sdk.api.auth.data.sessionId
|
||||
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||
import timber.log.Timber
|
||||
|
||||
internal object AuthRealmMigration : RealmMigration {
|
||||
|
||||
// Current schema version
|
||||
const val SCHEMA_VERSION = 3L
|
||||
const val SCHEMA_VERSION = 4L
|
||||
|
||||
override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
|
||||
Timber.d("Migrating Auth Realm from $oldVersion to $newVersion")
|
||||
|
@ -34,6 +36,7 @@ internal object AuthRealmMigration : RealmMigration {
|
|||
if (oldVersion <= 0) migrateTo1(realm)
|
||||
if (oldVersion <= 1) migrateTo2(realm)
|
||||
if (oldVersion <= 2) migrateTo3(realm)
|
||||
if (oldVersion <= 3) migrateTo4(realm)
|
||||
}
|
||||
|
||||
private fun migrateTo1(realm: DynamicRealm) {
|
||||
|
@ -81,4 +84,34 @@ internal object AuthRealmMigration : RealmMigration {
|
|||
}
|
||||
?.addPrimaryKey(SessionParamsEntityFields.SESSION_ID)
|
||||
}
|
||||
|
||||
private fun migrateTo4(realm: DynamicRealm) {
|
||||
Timber.d("Step 3 -> 4")
|
||||
Timber.d("Update SessionParamsEntity to add HomeServerConnectionConfig.homeServerUriBase value")
|
||||
|
||||
val adapter = MoshiProvider.providesMoshi()
|
||||
.adapter(HomeServerConnectionConfig::class.java)
|
||||
|
||||
realm.schema.get("SessionParamsEntity")
|
||||
?.transform {
|
||||
val homeserverConnectionConfigJson = it.getString(SessionParamsEntityFields.HOME_SERVER_CONNECTION_CONFIG_JSON)
|
||||
|
||||
val homeserverConnectionConfig = adapter
|
||||
.fromJson(homeserverConnectionConfigJson)
|
||||
|
||||
val homeserverUrl = homeserverConnectionConfig?.homeServerUri?.toString()
|
||||
// Special case for matrix.org. Old session may use "https://matrix.org", newer one may use
|
||||
// "https://matrix-client.matrix.org". So fix that here
|
||||
val alteredHomeserverConnectionConfig =
|
||||
if (homeserverUrl == "https://matrix.org" || homeserverUrl == "https://matrix-client.matrix.org") {
|
||||
homeserverConnectionConfig.copy(
|
||||
homeServerUri = Uri.parse("https://matrix.org"),
|
||||
homeServerUriBase = Uri.parse("https://matrix-client.matrix.org")
|
||||
)
|
||||
} else {
|
||||
homeserverConnectionConfig
|
||||
}
|
||||
it.set(SessionParamsEntityFields.HOME_SERVER_CONNECTION_CONFIG_JSON, adapter.toJson(alteredHomeserverConnectionConfig))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ internal class DefaultDirectLoginTask @Inject constructor(
|
|||
|
||||
override suspend fun execute(params: DirectLoginTask.Params): Session {
|
||||
val client = buildClient(params.homeServerConnectionConfig)
|
||||
val homeServerUrl = params.homeServerConnectionConfig.homeServerUri.toString()
|
||||
val homeServerUrl = params.homeServerConnectionConfig.homeServerUriBase.toString()
|
||||
|
||||
val authAPI = retrofitFactory.create(client, homeServerUrl)
|
||||
.create(AuthAPI::class.java)
|
||||
|
|
|
@ -39,7 +39,9 @@ internal object MXEncryptedAttachments {
|
|||
private const val SECRET_KEY_SPEC_ALGORITHM = "AES"
|
||||
private const val MESSAGE_DIGEST_ALGORITHM = "SHA-256"
|
||||
|
||||
fun encrypt(clearStream: InputStream, mimetype: String?, outputFile: File, progress: ((current: Int, total: Int) -> Unit)): EncryptedFileInfo {
|
||||
fun encrypt(clearStream: InputStream,
|
||||
outputFile: File,
|
||||
progress: ((current: Int, total: Int) -> Unit)): EncryptedFileInfo {
|
||||
val t0 = System.currentTimeMillis()
|
||||
val secureRandom = SecureRandom()
|
||||
val initVectorBytes = ByteArray(16) { 0.toByte() }
|
||||
|
@ -86,7 +88,6 @@ internal object MXEncryptedAttachments {
|
|||
|
||||
return EncryptedFileInfo(
|
||||
url = null,
|
||||
mimetype = mimetype,
|
||||
key = EncryptedFileKey(
|
||||
alg = "A256CTR",
|
||||
ext = true,
|
||||
|
@ -155,10 +156,9 @@ internal object MXEncryptedAttachments {
|
|||
* Encrypt an attachment stream.
|
||||
* DO NOT USE for big files, it will load all in memory
|
||||
* @param attachmentStream the attachment stream. Will be closed after this method call.
|
||||
* @param mimetype the mime type
|
||||
* @return the encryption file info
|
||||
*/
|
||||
fun encryptAttachment(attachmentStream: InputStream, mimetype: String?): EncryptionResult {
|
||||
fun encryptAttachment(attachmentStream: InputStream): EncryptionResult {
|
||||
val t0 = System.currentTimeMillis()
|
||||
val secureRandom = SecureRandom()
|
||||
|
||||
|
@ -207,7 +207,6 @@ internal object MXEncryptedAttachments {
|
|||
return EncryptionResult(
|
||||
encryptedFileInfo = EncryptedFileInfo(
|
||||
url = null,
|
||||
mimetype = mimetype,
|
||||
key = EncryptedFileKey(
|
||||
alg = "A256CTR",
|
||||
ext = true,
|
||||
|
@ -232,7 +231,9 @@ internal object MXEncryptedAttachments {
|
|||
* @param outputStream the outputStream where the decrypted attachment will be write.
|
||||
* @return true in case of success, false in case of error
|
||||
*/
|
||||
fun decryptAttachment(attachmentStream: InputStream?, elementToDecrypt: ElementToDecrypt?, outputStream: OutputStream): Boolean {
|
||||
fun decryptAttachment(attachmentStream: InputStream?,
|
||||
elementToDecrypt: ElementToDecrypt?,
|
||||
outputStream: OutputStream): Boolean {
|
||||
// sanity checks
|
||||
if (null == attachmentStream || elementToDecrypt == null) {
|
||||
Timber.e("## decryptAttachment() : null stream")
|
||||
|
|
|
@ -56,7 +56,7 @@ data class MXDeviceInfo(
|
|||
val signatures: Map<String, Map<String, String>>? = null,
|
||||
|
||||
/*
|
||||
* Additional data from the home server.
|
||||
* Additional data from the homeserver.
|
||||
*/
|
||||
@Json(name = "unsigned")
|
||||
val unsigned: JsonDict? = null,
|
||||
|
|
|
@ -29,12 +29,6 @@ data class EncryptedFileInfo(
|
|||
@Json(name = "url")
|
||||
val url: String? = null,
|
||||
|
||||
/**
|
||||
* Not documented
|
||||
*/
|
||||
@Json(name = "mimetype")
|
||||
val mimetype: String? = null,
|
||||
|
||||
/**
|
||||
* Required. A JSON Web Key object.
|
||||
*/
|
||||
|
|
|
@ -97,7 +97,7 @@ internal class DefaultInitializeCrossSigningTask @Inject constructor(
|
|||
|
||||
Timber.v("## CrossSigning - sskPublicKey:$sskPublicKey")
|
||||
|
||||
// Sign userSigningKey with master
|
||||
// Sign selfSigningKey with master
|
||||
val signedSSK = CryptoCrossSigningKey.Builder(userId, KeyUsage.SELF_SIGNING)
|
||||
.key(sskPublicKey)
|
||||
.build()
|
||||
|
|
|
@ -51,7 +51,7 @@ internal object RealmSessionStoreMigration : RealmMigration {
|
|||
const val SESSION_STORE_SCHEMA_SC_VERSION = 2L
|
||||
const val SESSION_STORE_SCHEMA_SC_VERSION_OFFSET = (1L shl 12)
|
||||
|
||||
const val SESSION_STORE_SCHEMA_VERSION = 15L +
|
||||
const val SESSION_STORE_SCHEMA_VERSION = 16L +
|
||||
SESSION_STORE_SCHEMA_SC_VERSION * SESSION_STORE_SCHEMA_SC_VERSION_OFFSET
|
||||
|
||||
|
||||
|
@ -76,6 +76,7 @@ internal object RealmSessionStoreMigration : RealmMigration {
|
|||
if (oldVersion <= 12) migrateTo13(realm)
|
||||
if (oldVersion <= 13) migrateTo14(realm)
|
||||
if (oldVersion <= 14) migrateTo15(realm)
|
||||
if (oldVersion <= 15) migrateTo16(realm)
|
||||
|
||||
if (oldScVersion <= 0) migrateToSc1(realm)
|
||||
if (oldScVersion <= 1) migrateToSc2(realm)
|
||||
|
@ -337,6 +338,7 @@ internal object RealmSessionStoreMigration : RealmMigration {
|
|||
}
|
||||
|
||||
private fun migrateTo15(realm: DynamicRealm) {
|
||||
Timber.d("Step 14 -> 15")
|
||||
// fix issue with flattenParentIds on DM that kept growing with duplicate
|
||||
// so we reset it, will be updated next sync
|
||||
realm.where("RoomSummaryEntity")
|
||||
|
@ -347,4 +349,14 @@ internal object RealmSessionStoreMigration : RealmMigration {
|
|||
it.setString(RoomSummaryEntityFields.FLATTEN_PARENT_IDS, null)
|
||||
}
|
||||
}
|
||||
|
||||
private fun migrateTo16(realm: DynamicRealm) {
|
||||
Timber.d("Step 15 -> 16")
|
||||
realm.schema.get("HomeServerCapabilitiesEntity")
|
||||
?.addField(HomeServerCapabilitiesEntityFields.ROOM_VERSIONS_JSON, String::class.java)
|
||||
?.transform { obj ->
|
||||
// Schedule a refresh of the capabilities
|
||||
obj.setLong(HomeServerCapabilitiesEntityFields.LAST_UPDATED_TIMESTAMP, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,8 +16,15 @@
|
|||
|
||||
package org.matrix.android.sdk.internal.database.mapper
|
||||
|
||||
import org.matrix.android.sdk.api.extensions.tryOrNull
|
||||
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
|
||||
import org.matrix.android.sdk.api.session.homeserver.RoomVersionCapabilities
|
||||
import org.matrix.android.sdk.api.session.homeserver.RoomVersionInfo
|
||||
import org.matrix.android.sdk.api.session.homeserver.RoomVersionStatus
|
||||
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity
|
||||
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||
import org.matrix.android.sdk.internal.session.homeserver.RoomVersions
|
||||
import org.matrix.android.sdk.internal.session.room.version.DefaultRoomVersionService
|
||||
|
||||
/**
|
||||
* HomeServerCapabilitiesEntity -> HomeSeverCapabilities
|
||||
|
@ -29,7 +36,30 @@ internal object HomeServerCapabilitiesMapper {
|
|||
canChangePassword = entity.canChangePassword,
|
||||
maxUploadFileSize = entity.maxUploadFileSize,
|
||||
lastVersionIdentityServerSupported = entity.lastVersionIdentityServerSupported,
|
||||
defaultIdentityServerUrl = entity.defaultIdentityServerUrl
|
||||
defaultIdentityServerUrl = entity.defaultIdentityServerUrl,
|
||||
roomVersions = mapRoomVersion(entity.roomVersionsJson)
|
||||
)
|
||||
}
|
||||
|
||||
private fun mapRoomVersion(roomVersionsJson: String?): RoomVersionCapabilities? {
|
||||
roomVersionsJson ?: return null
|
||||
|
||||
return tryOrNull {
|
||||
MoshiProvider.providesMoshi().adapter(RoomVersions::class.java).fromJson(roomVersionsJson)?.let {
|
||||
RoomVersionCapabilities(
|
||||
defaultRoomVersion = it.default ?: DefaultRoomVersionService.DEFAULT_ROOM_VERSION,
|
||||
supportedVersion = it.available.entries.map { entry ->
|
||||
RoomVersionInfo(
|
||||
version = entry.key,
|
||||
status = if (entry.value == "stable") {
|
||||
RoomVersionStatus.STABLE
|
||||
} else {
|
||||
RoomVersionStatus.UNSTABLE
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
|
|||
|
||||
internal open class HomeServerCapabilitiesEntity(
|
||||
var canChangePassword: Boolean = true,
|
||||
var roomVersionsJson: String? = null,
|
||||
var maxUploadFileSize: Long = HomeServerCapabilities.MAX_UPLOAD_FILE_SIZE_UNKNOWN,
|
||||
var lastVersionIdentityServerSupported: Boolean = false,
|
||||
var defaultIdentityServerUrl: String? = null,
|
||||
|
|
|
@ -20,7 +20,7 @@ import io.realm.RealmObject
|
|||
import io.realm.annotations.Index
|
||||
|
||||
/**
|
||||
* Clients can store custom config data for their account on their HomeServer.
|
||||
* Clients can store custom config data for their account on their homeserver.
|
||||
* This account data will be synced between different devices and can persist across installations on a particular device.
|
||||
* Users may only view the account data for their own account.
|
||||
* The account_data may be either global or scoped to a particular rooms.
|
||||
|
|
|
@ -37,7 +37,8 @@ internal abstract class FederationModule {
|
|||
fun providesFederationAPI(@Unauthenticated okHttpClient: Lazy<OkHttpClient>,
|
||||
sessionParams: SessionParams,
|
||||
retrofitFactory: RetrofitFactory): FederationAPI {
|
||||
return retrofitFactory.create(okHttpClient, sessionParams.homeServerUrl).create(FederationAPI::class.java)
|
||||
return retrofitFactory.create(okHttpClient, sessionParams.homeServerUrlBase)
|
||||
.create(FederationAPI::class.java)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ public class Credentials {
|
|||
|
||||
public String deviceId;
|
||||
|
||||
// Optional data that may contain info to override home server and/or identity server
|
||||
// Optional data that may contain info to override homeserver and/or identity server
|
||||
public WellKnown wellKnown;
|
||||
|
||||
public JSONObject toJson() throws JSONException {
|
||||
|
|
|
@ -44,7 +44,7 @@ import timber.log.Timber;
|
|||
*/
|
||||
public class HomeServerConnectionConfig {
|
||||
|
||||
// the home server URI
|
||||
// the homeserver URI
|
||||
private Uri mHomeServerUri;
|
||||
// the jitsi server URI. Can be null
|
||||
@Nullable
|
||||
|
@ -82,7 +82,7 @@ public class HomeServerConnectionConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* Update the home server URI.
|
||||
* Update the homeserver URI.
|
||||
*
|
||||
* @param uri the new HS uri
|
||||
*/
|
||||
|
@ -91,7 +91,7 @@ public class HomeServerConnectionConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return the home server uri
|
||||
* @return the homeserver uri
|
||||
*/
|
||||
public Uri getHomeserverUri() {
|
||||
return mHomeServerUri;
|
||||
|
@ -145,7 +145,7 @@ public class HomeServerConnectionConfig {
|
|||
public void setCredentials(Credentials credentials) {
|
||||
mCredentials = credentials;
|
||||
|
||||
// Override home server url and/or identity server url if provided
|
||||
// Override homeserver url and/or identity server url if provided
|
||||
if (credentials.wellKnown != null) {
|
||||
if (credentials.wellKnown.homeServer != null) {
|
||||
String homeServerUrl = credentials.wellKnown.homeServer.baseURL;
|
||||
|
@ -200,7 +200,7 @@ public class HomeServerConnectionConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* TLS versions accepted for TLS connections with the home server.
|
||||
* TLS versions accepted for TLS connections with the homeserver.
|
||||
*/
|
||||
@Nullable
|
||||
public List<TlsVersion> getAcceptedTlsVersions() {
|
||||
|
@ -208,7 +208,7 @@ public class HomeServerConnectionConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* TLS cipher suites accepted for TLS connections with the home server.
|
||||
* TLS cipher suites accepted for TLS connections with the homeserver.
|
||||
*/
|
||||
@Nullable
|
||||
public List<CipherSuite> getAcceptedTlsCipherSuites() {
|
||||
|
@ -426,7 +426,7 @@ public class HomeServerConnectionConfig {
|
|||
*/
|
||||
public Builder withHomeServerUri(final Uri homeServerUri) {
|
||||
if (homeServerUri == null || (!"http".equals(homeServerUri.getScheme()) && !"https".equals(homeServerUri.getScheme()))) {
|
||||
throw new RuntimeException("Invalid home server URI: " + homeServerUri);
|
||||
throw new RuntimeException("Invalid homeserver URI: " + homeServerUri);
|
||||
}
|
||||
|
||||
// remove trailing /
|
||||
|
@ -435,7 +435,7 @@ public class HomeServerConnectionConfig {
|
|||
String url = homeServerUri.toString();
|
||||
mHomeServerConnectionConfig.mHomeServerUri = Uri.parse(url.substring(0, url.length() - 1));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("Invalid home server URI: " + homeServerUri);
|
||||
throw new RuntimeException("Invalid homeserver URI: " + homeServerUri);
|
||||
}
|
||||
} else {
|
||||
mHomeServerConnectionConfig.mHomeServerUri = homeServerUri;
|
||||
|
@ -549,7 +549,7 @@ public class HomeServerConnectionConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* Add an accepted TLS version for TLS connections with the home server.
|
||||
* Add an accepted TLS version for TLS connections with the homeserver.
|
||||
*
|
||||
* @param tlsVersion the tls version to add to the set of TLS versions accepted.
|
||||
* @return this builder
|
||||
|
@ -577,7 +577,7 @@ public class HomeServerConnectionConfig {
|
|||
}
|
||||
|
||||
/**
|
||||
* Add a TLS cipher suite to the list of accepted TLS connections with the home server.
|
||||
* Add a TLS cipher suite to the list of accepted TLS connections with the homeserver.
|
||||
*
|
||||
* @param tlsCipherSuite the tls cipher suite to add.
|
||||
* @return this builder
|
||||
|
@ -666,7 +666,7 @@ public class HomeServerConnectionConfig {
|
|||
public HomeServerConnectionConfig build() {
|
||||
// Check mandatory parameters
|
||||
if (mHomeServerConnectionConfig.mHomeServerUri == null) {
|
||||
throw new RuntimeException("Home server URI not set");
|
||||
throw new RuntimeException("Homeserver URI not set");
|
||||
}
|
||||
|
||||
return mHomeServerConnectionConfig;
|
||||
|
|
|
@ -38,7 +38,7 @@ import timber.log.Timber;
|
|||
public class LoginStorage {
|
||||
private static final String PREFS_LOGIN = "Vector.LoginStorage";
|
||||
|
||||
// multi accounts + home server config
|
||||
// multi accounts + homeserver config
|
||||
private static final String PREFS_KEY_CONNECTION_CONFIGS = "PREFS_KEY_CONNECTION_CONFIGS";
|
||||
|
||||
private final Context mContext;
|
||||
|
@ -49,7 +49,7 @@ public class LoginStorage {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return the list of home server configurations.
|
||||
* @return the list of homeserver configurations.
|
||||
*/
|
||||
public List<HomeServerConnectionConfig> getCredentialsList() {
|
||||
SharedPreferences prefs = mContext.getSharedPreferences(PREFS_LOGIN, Context.MODE_PRIVATE);
|
||||
|
@ -85,7 +85,7 @@ public class LoginStorage {
|
|||
/**
|
||||
* Add a credentials to the credentials list
|
||||
*
|
||||
* @param config the home server config to add.
|
||||
* @param config the homeserver config to add.
|
||||
*/
|
||||
public void addCredentials(HomeServerConnectionConfig config) {
|
||||
if (null != config && config.getCredentials() != null) {
|
||||
|
@ -203,4 +203,4 @@ public class LoginStorage {
|
|||
//Need to commit now because called before forcing an app restart
|
||||
editor.commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -253,7 +253,7 @@ internal object CertUtil {
|
|||
val list = ArrayList<ConnectionSpec>()
|
||||
list.add(builder.build())
|
||||
// TODO: we should display a warning if user enter an http url
|
||||
if (hsConfig.allowHttpExtension || hsConfig.homeServerUri.toString().startsWith("http://")) {
|
||||
if (hsConfig.allowHttpExtension || hsConfig.homeServerUriBase.toString().startsWith("http://")) {
|
||||
list.add(ConnectionSpec.CLEARTEXT)
|
||||
}
|
||||
return list
|
||||
|
|
|
@ -29,10 +29,9 @@ internal class DefaultRawService @Inject constructor(
|
|||
return getUrlTask.execute(GetUrlTask.Params(url, cacheStrategy))
|
||||
}
|
||||
|
||||
override suspend fun getWellknown(userId: String): String {
|
||||
val homeServerDomain = userId.substringAfter(":")
|
||||
override suspend fun getWellknown(domain: String): String {
|
||||
return getUrl(
|
||||
"https://$homeServerDomain/.well-known/matrix/client",
|
||||
"https://$domain/.well-known/matrix/client",
|
||||
CacheStrategy.TtlCache(TimeUnit.HOURS.toMillis(8), false)
|
||||
)
|
||||
}
|
||||
|
|
|
@ -313,7 +313,7 @@ internal class DefaultSession @Inject constructor(
|
|||
|
||||
override fun getUiaSsoFallbackUrl(authenticationSessionId: String): String {
|
||||
val hsBas = sessionParams.homeServerConnectionConfig
|
||||
.homeServerUri
|
||||
.homeServerUriBase
|
||||
.toString()
|
||||
.trim { it == '/' }
|
||||
return buildString {
|
||||
|
|
|
@ -261,7 +261,7 @@ internal abstract class SessionModule {
|
|||
sessionParams: SessionParams,
|
||||
retrofitFactory: RetrofitFactory): Retrofit {
|
||||
return retrofitFactory
|
||||
.create(okHttpClient, sessionParams.homeServerConnectionConfig.homeServerUri.toString())
|
||||
.create(okHttpClient, sessionParams.homeServerConnectionConfig.homeServerUriBase.toString())
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
|
|
|
@ -26,7 +26,7 @@ private const val MATRIX_CONTENT_URI_SCHEME = "mxc://"
|
|||
|
||||
internal class DefaultContentUrlResolver @Inject constructor(homeServerConnectionConfig: HomeServerConnectionConfig) : ContentUrlResolver {
|
||||
|
||||
private val baseUrl = homeServerConnectionConfig.homeServerUri.toString().ensureTrailingSlash()
|
||||
private val baseUrl = homeServerConnectionConfig.homeServerUriBase.toString().ensureTrailingSlash()
|
||||
|
||||
override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload"
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
|
|||
.also { filesToDelete.add(it) }
|
||||
|
||||
uploadedFileEncryptedFileInfo =
|
||||
MXEncryptedAttachments.encrypt(fileToUpload.inputStream(), attachment.getSafeMimeType(), encryptedFile) { read, total ->
|
||||
MXEncryptedAttachments.encrypt(fileToUpload.inputStream(), encryptedFile) { read, total ->
|
||||
notifyTracker(params) {
|
||||
contentUploadStateTracker.setEncrypting(it, read.toLong(), total.toLong())
|
||||
}
|
||||
|
@ -315,7 +315,7 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
|
|||
if (params.isEncrypted) {
|
||||
Timber.v("Encrypt thumbnail")
|
||||
notifyTracker(params) { contentUploadStateTracker.setEncryptingThumbnail(it) }
|
||||
val encryptionResult = MXEncryptedAttachments.encryptAttachment(thumbnailData.bytes.inputStream(), thumbnailData.mimeType)
|
||||
val encryptionResult = MXEncryptedAttachments.encryptAttachment(thumbnailData.bytes.inputStream())
|
||||
val contentUploadResponse = fileUploader.uploadByteArray(
|
||||
byteArray = encryptionResult.encryptedByteArray,
|
||||
filename = null,
|
||||
|
|
|
@ -16,18 +16,12 @@
|
|||
|
||||
package org.matrix.android.sdk.internal.session.homeserver
|
||||
|
||||
import com.zhuinden.monarchy.Monarchy
|
||||
import io.realm.Realm
|
||||
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
|
||||
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService
|
||||
import org.matrix.android.sdk.internal.database.mapper.HomeServerCapabilitiesMapper
|
||||
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity
|
||||
import org.matrix.android.sdk.internal.database.query.get
|
||||
import org.matrix.android.sdk.internal.di.SessionDatabase
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class DefaultHomeServerCapabilitiesService @Inject constructor(
|
||||
@SessionDatabase private val monarchy: Monarchy,
|
||||
private val homeServerCapabilitiesDataSource: HomeServerCapabilitiesDataSource,
|
||||
private val getHomeServerCapabilitiesTask: GetHomeServerCapabilitiesTask
|
||||
) : HomeServerCapabilitiesService {
|
||||
|
||||
|
@ -36,11 +30,7 @@ internal class DefaultHomeServerCapabilitiesService @Inject constructor(
|
|||
}
|
||||
|
||||
override fun getHomeServerCapabilities(): HomeServerCapabilities {
|
||||
return Realm.getInstance(monarchy.realmConfiguration).use { realm ->
|
||||
HomeServerCapabilitiesEntity.get(realm)?.let {
|
||||
HomeServerCapabilitiesMapper.map(it)
|
||||
}
|
||||
}
|
||||
return homeServerCapabilitiesDataSource.getHomeServerCapabilities()
|
||||
?: HomeServerCapabilities()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.session.homeserver
|
|||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
import org.matrix.android.sdk.api.extensions.orTrue
|
||||
import org.matrix.android.sdk.api.util.JsonDict
|
||||
|
||||
/**
|
||||
* Ref: https://matrix.org/docs/spec/client_server/latest#get-matrix-client-r0-capabilities
|
||||
|
@ -38,9 +39,14 @@ internal data class Capabilities(
|
|||
* Capability to indicate if the user can change their password.
|
||||
*/
|
||||
@Json(name = "m.change_password")
|
||||
val changePassword: ChangePassword? = null
|
||||
val changePassword: ChangePassword? = null,
|
||||
|
||||
// No need for m.room_versions for the moment
|
||||
/**
|
||||
* This capability describes the default and available room versions a server supports, and at what level of stability.
|
||||
* Clients should make use of this capability to determine if users need to be encouraged to upgrade their rooms.
|
||||
*/
|
||||
@Json(name = "m.room_versions")
|
||||
val roomVersions: RoomVersions? = null
|
||||
)
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
|
@ -52,6 +58,21 @@ internal data class ChangePassword(
|
|||
val enabled: Boolean?
|
||||
)
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class RoomVersions(
|
||||
/**
|
||||
* Required. The default room version the server is using for new rooms.
|
||||
*/
|
||||
@Json(name = "default")
|
||||
val default: String?,
|
||||
|
||||
/**
|
||||
* Required. A detailed description of the room versions the server supports.
|
||||
*/
|
||||
@Json(name = "available")
|
||||
val available: JsonDict
|
||||
)
|
||||
|
||||
// The spec says: If not present, the client should assume that password changes are possible via the API
|
||||
internal fun GetCapabilitiesResult.canChangePassword(): Boolean {
|
||||
return capabilities?.changePassword?.enabled.orTrue()
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
package org.matrix.android.sdk.internal.session.homeserver
|
||||
|
||||
import com.zhuinden.monarchy.Monarchy
|
||||
import org.matrix.android.sdk.api.MatrixPatterns.getDomain
|
||||
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
|
||||
import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
|
||||
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
|
||||
|
@ -24,6 +25,7 @@ import org.matrix.android.sdk.internal.auth.version.Versions
|
|||
import org.matrix.android.sdk.internal.auth.version.isLoginAndRegistrationSupportedBySdk
|
||||
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity
|
||||
import org.matrix.android.sdk.internal.database.query.getOrCreate
|
||||
import org.matrix.android.sdk.internal.di.MoshiProvider
|
||||
import org.matrix.android.sdk.internal.di.SessionDatabase
|
||||
import org.matrix.android.sdk.internal.di.UserId
|
||||
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
|
||||
|
@ -89,7 +91,10 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
|
|||
}.getOrNull()
|
||||
|
||||
val wellknownResult = runCatching {
|
||||
getWellknownTask.execute(GetWellknownTask.Params(userId, homeServerConnectionConfig))
|
||||
getWellknownTask.execute(GetWellknownTask.Params(
|
||||
domain = userId.getDomain(),
|
||||
homeServerConnectionConfig = homeServerConnectionConfig
|
||||
))
|
||||
}.getOrNull()
|
||||
|
||||
insertInDb(capabilities, mediaConfig, versions, wellknownResult)
|
||||
|
@ -104,6 +109,10 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
|
|||
|
||||
if (getCapabilitiesResult != null) {
|
||||
homeServerCapabilitiesEntity.canChangePassword = getCapabilitiesResult.canChangePassword()
|
||||
|
||||
homeServerCapabilitiesEntity.roomVersionsJson = getCapabilitiesResult.capabilities?.roomVersions?.let {
|
||||
MoshiProvider.providesMoshi().adapter(RoomVersions::class.java).toJson(it)
|
||||
}
|
||||
}
|
||||
|
||||
if (getMediaConfigResult != null) {
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* 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.internal.session.homeserver
|
||||
|
||||
import com.zhuinden.monarchy.Monarchy
|
||||
import io.realm.Realm
|
||||
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
|
||||
import org.matrix.android.sdk.internal.database.mapper.HomeServerCapabilitiesMapper
|
||||
import org.matrix.android.sdk.internal.database.model.HomeServerCapabilitiesEntity
|
||||
import org.matrix.android.sdk.internal.database.query.get
|
||||
import org.matrix.android.sdk.internal.di.SessionDatabase
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class HomeServerCapabilitiesDataSource @Inject constructor(
|
||||
@SessionDatabase private val monarchy: Monarchy
|
||||
) {
|
||||
fun getHomeServerCapabilities(): HomeServerCapabilities? {
|
||||
return Realm.getInstance(monarchy.realmConfiguration).use { realm ->
|
||||
HomeServerCapabilitiesEntity.get(realm)?.let {
|
||||
HomeServerCapabilitiesMapper.map(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -191,7 +191,7 @@ internal class DefaultIdentityService @Inject constructor(
|
|||
} else {
|
||||
// Disconnect previous one if any, first, because the token will change.
|
||||
// In case of error when configuring the new identity server, this is not a big deal,
|
||||
// we will ask for a new token on the previous Identity server
|
||||
// we will ask for a new token on the previous identity server
|
||||
runCatching { identityDisconnectTask.execute(Unit) }
|
||||
.onFailure { Timber.w(it, "Unable to disconnect identity server") }
|
||||
|
||||
|
@ -241,7 +241,7 @@ internal class DefaultIdentityService @Inject constructor(
|
|||
|
||||
override suspend fun getShareStatus(threePids: List<ThreePid>): Map<ThreePid, SharedState> {
|
||||
// Note: we do not require user consent here, because it is used for emails and phone numbers that the user has already sent
|
||||
// to the home server, and not emails and phone numbers from the contact book of the user
|
||||
// to the homeserver, and not emails and phone numbers from the contact book of the user
|
||||
|
||||
if (threePids.isEmpty()) {
|
||||
return emptyMap()
|
||||
|
|
|
@ -42,7 +42,7 @@ internal interface IdentityAuthAPI {
|
|||
suspend fun ping()
|
||||
|
||||
/**
|
||||
* Ping v1 will be used to check outdated Identity server
|
||||
* Ping v1 will be used to check outdated identity server
|
||||
*/
|
||||
@GET("_matrix/identity/api/v1")
|
||||
suspend fun pingV1()
|
||||
|
|
|
@ -43,8 +43,8 @@ import javax.inject.Inject
|
|||
|
||||
/**
|
||||
* The integration manager allows to
|
||||
* - Get the Integration Manager that a user has explicitly set for its account (via account data)
|
||||
* - Get the recommended/preferred Integration Manager list as defined by the HomeServer (via wellknown)
|
||||
* - Get the integration manager that a user has explicitly set for its account (via account data)
|
||||
* - Get the recommended/preferred integration manager list as defined by the homeserver (via wellknown)
|
||||
* - Check if the user has disabled the integration manager feature
|
||||
* - Allow / Disallow Integration manager (propagated to other riot clients)
|
||||
*
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package org.matrix.android.sdk.internal.session.permalinks
|
||||
|
||||
import org.matrix.android.sdk.api.MatrixPatterns.getDomain
|
||||
import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams
|
||||
import org.matrix.android.sdk.api.session.room.model.Membership
|
||||
import org.matrix.android.sdk.internal.di.UserId
|
||||
|
@ -47,9 +48,9 @@ internal class ViaParameterFinder @Inject constructor(
|
|||
}
|
||||
|
||||
fun computeViaParams(userId: String, roomId: String, max: Int): List<String> {
|
||||
val userHomeserver = userId.substringAfter(":")
|
||||
val userHomeserver = userId.getDomain()
|
||||
return getUserIdsOfJoinedMembers(roomId)
|
||||
.map { it.substringAfter(":") }
|
||||
.map { it.getDomain() }
|
||||
.groupBy { it }
|
||||
.mapValues { it.value.size }
|
||||
.toMutableMap()
|
||||
|
|
|
@ -86,7 +86,7 @@ internal interface ProfileAPI {
|
|||
suspend fun addMsisdn(@Body body: AddMsisdnBody): AddMsisdnResponse
|
||||
|
||||
/**
|
||||
* Validate Msisdn code (same model than for Identity server API)
|
||||
* Validate Msisdn code (same model than for identity server API)
|
||||
*/
|
||||
@POST
|
||||
suspend fun validateMsisdn(@Url url: String,
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.matrix.android.sdk.api.session.room.tags.TagsService
|
|||
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.room.version.RoomVersionService
|
||||
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
|
||||
|
@ -67,9 +68,11 @@ internal class DefaultRoom(override val roomId: String,
|
|||
private val roomMembersService: MembershipService,
|
||||
private val roomPushRuleService: RoomPushRuleService,
|
||||
private val roomAccountDataService: RoomAccountDataService,
|
||||
private val roomVersionService: RoomVersionService,
|
||||
private val sendStateTask: SendStateTask,
|
||||
private val viaParameterFinder: ViaParameterFinder,
|
||||
private val searchTask: SearchTask) :
|
||||
private val searchTask: SearchTask
|
||||
) :
|
||||
Room,
|
||||
TimelineService by timelineService,
|
||||
SendService by sendService,
|
||||
|
@ -85,7 +88,8 @@ internal class DefaultRoom(override val roomId: String,
|
|||
RelationService by relationService,
|
||||
MembershipService by roomMembersService,
|
||||
RoomPushRuleService by roomPushRuleService,
|
||||
RoomAccountDataService by roomAccountDataService {
|
||||
RoomAccountDataService by roomAccountDataService,
|
||||
RoomVersionService by roomVersionService {
|
||||
|
||||
override fun getRoomSummaryLive(): LiveData<Optional<RoomSummary>> {
|
||||
return roomSummaryDataSource.getRoomSummaryLive(roomId)
|
||||
|
|
|
@ -369,4 +369,15 @@ internal interface RoomAPI {
|
|||
@Path("roomId") roomId: String,
|
||||
@Path("type") type: String,
|
||||
@Body content: JsonDict)
|
||||
|
||||
/**
|
||||
* Upgrades the given room to a particular room version.
|
||||
* Errors:
|
||||
* 400, The request was invalid. One way this can happen is if the room version requested is not supported by the homeserver
|
||||
* (M_UNSUPPORTED_ROOM_VERSION)
|
||||
* 403: The user is not permitted to upgrade the room.(M_FORBIDDEN)
|
||||
*/
|
||||
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/upgrade")
|
||||
suspend fun upgradeRoom(@Path("roomId") roomId: String,
|
||||
@Body body: RoomUpgradeBody): RoomUpgradeResponse
|
||||
}
|
||||
|
|
|
@ -37,6 +37,7 @@ import org.matrix.android.sdk.internal.session.room.tags.DefaultTagsService
|
|||
import org.matrix.android.sdk.internal.session.room.timeline.DefaultTimelineService
|
||||
import org.matrix.android.sdk.internal.session.room.typing.DefaultTypingService
|
||||
import org.matrix.android.sdk.internal.session.room.uploads.DefaultUploadsService
|
||||
import org.matrix.android.sdk.internal.session.room.version.DefaultRoomVersionService
|
||||
import org.matrix.android.sdk.internal.session.search.SearchTask
|
||||
import javax.inject.Inject
|
||||
|
||||
|
@ -61,6 +62,7 @@ internal class DefaultRoomFactory @Inject constructor(private val cryptoService:
|
|||
private val relationServiceFactory: DefaultRelationService.Factory,
|
||||
private val membershipServiceFactory: DefaultMembershipService.Factory,
|
||||
private val roomPushRuleServiceFactory: DefaultRoomPushRuleService.Factory,
|
||||
private val roomVersionServiceFactory: DefaultRoomVersionService.Factory,
|
||||
private val roomAccountDataServiceFactory: DefaultRoomAccountDataService.Factory,
|
||||
private val sendStateTask: SendStateTask,
|
||||
private val viaParameterFinder: ViaParameterFinder,
|
||||
|
@ -87,6 +89,7 @@ internal class DefaultRoomFactory @Inject constructor(private val cryptoService:
|
|||
roomMembersService = membershipServiceFactory.create(roomId),
|
||||
roomPushRuleService = roomPushRuleServiceFactory.create(roomId),
|
||||
roomAccountDataService = roomAccountDataServiceFactory.create(roomId),
|
||||
roomVersionService = roomVersionServiceFactory.create(roomId),
|
||||
sendStateTask = sendStateTask,
|
||||
searchTask = searchTask,
|
||||
viaParameterFinder = viaParameterFinder
|
||||
|
|
|
@ -94,6 +94,8 @@ import org.matrix.android.sdk.internal.session.room.typing.DefaultSendTypingTask
|
|||
import org.matrix.android.sdk.internal.session.room.typing.SendTypingTask
|
||||
import org.matrix.android.sdk.internal.session.room.uploads.DefaultGetUploadsTask
|
||||
import org.matrix.android.sdk.internal.session.room.uploads.GetUploadsTask
|
||||
import org.matrix.android.sdk.internal.session.room.version.DefaultRoomVersionUpgradeTask
|
||||
import org.matrix.android.sdk.internal.session.room.version.RoomVersionUpgradeTask
|
||||
import org.matrix.android.sdk.internal.session.space.DefaultSpaceService
|
||||
import retrofit2.Retrofit
|
||||
|
||||
|
@ -248,4 +250,7 @@ internal abstract class RoomModule {
|
|||
|
||||
@Binds
|
||||
abstract fun bindGetEventTask(task: DefaultGetEventTask): GetEventTask
|
||||
|
||||
@Binds
|
||||
abstract fun bindRoomVersionUpgradeTask(task: DefaultRoomVersionUpgradeTask): RoomVersionUpgradeTask
|
||||
}
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* 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.internal.session.room
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class RoomUpgradeBody(
|
||||
@Json(name = "new_version")
|
||||
val newVersion: String
|
||||
)
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* 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.internal.session.room
|
||||
|
||||
import com.squareup.moshi.Json
|
||||
import com.squareup.moshi.JsonClass
|
||||
|
||||
@JsonClass(generateAdapter = true)
|
||||
internal data class RoomUpgradeResponse(
|
||||
@Json(name = "replacement_room")
|
||||
val replacementRoomId: String
|
||||
)
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
package org.matrix.android.sdk.internal.session.room.alias
|
||||
|
||||
import org.matrix.android.sdk.api.MatrixPatterns.getDomain
|
||||
import org.matrix.android.sdk.api.failure.Failure
|
||||
import org.matrix.android.sdk.api.session.room.alias.RoomAliasError
|
||||
import org.matrix.android.sdk.internal.di.UserId
|
||||
|
@ -64,6 +65,6 @@ internal class RoomAliasAvailabilityChecker @Inject constructor(
|
|||
}
|
||||
|
||||
companion object {
|
||||
internal fun String.toFullLocalAlias(userId: String) = "#" + this + ":" + userId.substringAfter(":")
|
||||
internal fun String.toFullLocalAlias(userId: String) = "#" + this + ":" + userId.getDomain()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@ internal class CreateRoomBodyBuilder @Inject constructor(
|
|||
val invite3pids = params.invite3pids
|
||||
.takeIf { it.isNotEmpty() }
|
||||
?.let { invites ->
|
||||
// This can throw Exception if Identity server is not configured
|
||||
// This can throw an exception if identity server is not configured
|
||||
ensureIdentityTokenTask.execute(Unit)
|
||||
|
||||
val identityServerUrlWithoutProtocol = identityStore.getIdentityServerUrlWithoutProtocol()
|
||||
|
|
|
@ -142,7 +142,7 @@ internal class DefaultSendService @AssistedInject constructor(
|
|||
// The image has not yet been sent
|
||||
val attachmentData = ContentAttachmentData(
|
||||
size = messageContent.info!!.size,
|
||||
mimeType = messageContent.info.mimeType!!,
|
||||
mimeType = messageContent.mimeType,
|
||||
width = messageContent.info.width.toLong(),
|
||||
height = messageContent.info.height.toLong(),
|
||||
name = messageContent.body,
|
||||
|
@ -169,7 +169,7 @@ internal class DefaultSendService @AssistedInject constructor(
|
|||
is MessageFileContent -> {
|
||||
val attachmentData = ContentAttachmentData(
|
||||
size = messageContent.info!!.size,
|
||||
mimeType = messageContent.info.mimeType!!,
|
||||
mimeType = messageContent.mimeType,
|
||||
name = messageContent.getFileName(),
|
||||
queryUri = Uri.parse(messageContent.url),
|
||||
type = ContentAttachmentData.Type.FILE
|
||||
|
@ -181,7 +181,7 @@ internal class DefaultSendService @AssistedInject constructor(
|
|||
val attachmentData = ContentAttachmentData(
|
||||
size = messageContent.audioInfo?.size ?: 0,
|
||||
duration = messageContent.audioInfo?.duration?.toLong() ?: 0L,
|
||||
mimeType = messageContent.audioInfo?.mimeType,
|
||||
mimeType = messageContent.mimeType,
|
||||
name = messageContent.body,
|
||||
queryUri = Uri.parse(messageContent.url),
|
||||
type = ContentAttachmentData.Type.AUDIO
|
||||
|
|
|
@ -46,7 +46,7 @@ private const val MAX_RETRY_COUNT = 3
|
|||
|
||||
/**
|
||||
* This class is responsible for sending events in order in each room. It uses the QueuedTask.queueIdentifier to execute tasks sequentially.
|
||||
* Each send is retried 3 times, if there is no network (e.g if cannot ping home server) it will wait and
|
||||
* Each send is retried 3 times, if there is no network (e.g if cannot ping homeserver) it will wait and
|
||||
* periodically test reachability before resume (does not count as a retry)
|
||||
*
|
||||
* If the app is killed before all event were sent, on next wakeup the scheduled events will be re posted
|
||||
|
|
|
@ -42,7 +42,7 @@ import kotlin.concurrent.schedule
|
|||
|
||||
/**
|
||||
* A simple ever running thread unique for that session responsible of sending events in order.
|
||||
* Each send is retried 3 times, if there is no network (e.g if cannot ping home server) it will wait and
|
||||
* Each send is retried 3 times, if there is no network (e.g if cannot ping homeserver) it will wait and
|
||||
* periodically test reachability before resume (does not count as a retry)
|
||||
*
|
||||
* If the app is killed before all event were sent, on next wakeup the scheduled events will be re posted
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue