diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index f2fa4ef02d..d7c3506fa0 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -7,27 +7,27 @@ assignees: ''
---
-**Describe the bug**
+#### Describe the bug
A clear and concise description of what the bug is.
-**To Reproduce**
+#### To Reproduce
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
-**Expected behavior**
+#### Expected behavior
A clear and concise description of what you expected to happen.
-**Screenshots**
+#### Screenshots
If applicable, add screenshots to help explain your problem.
-**Smartphone (please complete the following information):**
+#### Smartphone (please complete the following information):
- Device: [e.g. Samsung S6]
- OS: [e.g. Android 6.0]
-**Additional context**
+#### Additional context
- App version and store [e.g. 1.0.0 - F-Droid]
- Homeserver: [e.g. matrix.org]
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
index 73c93186d7..da96d461c5 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.md
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -7,14 +7,14 @@ assignees: ''
---
-**Is your feature request related to a problem? Please describe.**
+#### Is your feature request related to a problem? Please describe.
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
-**Describe the solution you'd like**
+#### Describe the solution you'd like.
A clear and concise description of what you want to happen.
-**Describe alternatives you've considered**
+#### Describe alternatives you've considered.
A clear and concise description of any alternative solutions or features you've considered.
-**Additional context**
+#### Additional context
Add any other context or screenshots about the feature request here.
diff --git a/.github/ISSUE_TEMPLATE/release.md b/.github/ISSUE_TEMPLATE/release.md
new file mode 100644
index 0000000000..154e93286c
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/release.md
@@ -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`
+
+
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 34d7b40a88..8fbc5602fe 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -5,6 +5,6 @@
- [ ] Changes has been tested on an Android device or Android emulator with API 21
- [ ] UI change has been tested on both light and dark themes
- [ ] Pull request is based on the develop branch
-- [ ] Pull request updates [CHANGES.md](https://github.com/vector-im/element-android/blob/develop/CHANGES.md)
+- [ ] Pull request includes a new file under ./changelog.d. See https://github.com/vector-im/element-android/blob/develop/CONTRIBUTING.md#changelog
- [ ] Pull request includes screenshots or videos if containing UI changes
- [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md#sign-off)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000000..e552f5fd43
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,23 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ # Updates for Github Actions used in the repo
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ # Updates for Gradle dependencies used in the app
+ - package-ecosystem: gradle
+ directory: "/"
+ schedule:
+ interval: "daily"
+ open-pull-requests-limit: 200
+ reviewers:
+ - "bmarty"
+### ignore:
+### - dependency-name: com.squareup.okhttp3:logging-interceptor
+### versions: "> 3.12.10"
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 0000000000..85148a2632
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,59 @@
+name: APK Build
+
+on:
+ pull_request: { }
+ push:
+ branches: [ main, develop ]
+
+jobs:
+ debug:
+ name: Build debug APKs (${{ matrix.target }})
+ runs-on: ubuntu-latest
+ if: github.ref != 'refs/heads/main'
+ strategy:
+ fail-fast: false
+ matrix:
+ target: [ Gplay, Fdroid ]
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ - name: Assemble ${{ matrix.target }} debug apk
+ run: ./gradlew assemble${{ matrix.target }}Debug --stacktrace
+ - name: Upload ${{ matrix.target }} debug APKs
+ uses: actions/upload-artifact@v2
+ with:
+ name: vector-${{ matrix.target }}-debug
+ path: |
+ vector/build/outputs/apk/*/debug/*.apk
+
+ release:
+ name: Build unsigned GPlay APKs
+ runs-on: ubuntu-latest
+ if: github.ref == 'refs/heads/main'
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ - name: Assemble GPlay unsigned apk
+ run: ./gradlew clean assembleGplayRelease --stacktrace
+ - name: Upload Gplay unsigned APKs
+ uses: actions/upload-artifact@v2
+ with:
+ name: vector-gplay-release-unsigned
+ path: |
+ vector/build/outputs/apk/*/release/*.apk
+
+# TODO: add exodus checks
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
new file mode 100644
index 0000000000..cb6f1b0e48
--- /dev/null
+++ b/.github/workflows/integration.yml
@@ -0,0 +1,49 @@
+name: Integration Test
+
+on:
+ pull_request: { }
+ push:
+ branches: [ main, develop ]
+
+jobs:
+ integration-tests:
+ name: Integration Tests (Synapse)
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ api-level: [21, 30]
+ steps:
+ - uses: actions/checkout@v2
+ - name: Set up Python 3.8
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.8
+ - name: Cache pip
+ uses: actions/cache@v2
+ with:
+ path: ~/.cache/pip
+ key: ${{ runner.os }}-pip
+ restore-keys: |
+ ${{ runner.os }}-pip-
+ ${{ runner.os }}-
+ - uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ - name: Start synapse server
+ run: |
+ python3 -m venv .synapse
+ source .synapse/bin/activate
+ pip install synapse matrix-synapse
+ curl -sL https://raw.githubusercontent.com/matrix-org/synapse/develop/demo/start.sh --no-rate-limit \
+ | sed s/127.0.0.1/0.0.0.0/g | bash
+ - name: Run integration tests on API ${{ matrix.api-level }}
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ api-level: ${{ matrix.api-level }}
+ # script: ./gradlew -PallWarningsAsErrors=false vector:connectedAndroidTest matrix-sdk-android:connectedAndroidTest
+ script: ./gradlew -PallWarningsAsErrors=false connectedCheck
diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
new file mode 100644
index 0000000000..a65e6b5dee
--- /dev/null
+++ b/.github/workflows/quality.yml
@@ -0,0 +1,74 @@
+name: Code Quality Checks
+
+on:
+ pull_request: { }
+ push:
+ branches: [ main, develop ]
+
+jobs:
+ check:
+ name: Project Check Suite
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Run code quality check suite
+ run: ./tools/check/check_code_quality.sh
+
+ klint:
+ name: Kotlin Linter
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Run klint
+ run: |
+ curl -sSLO https://github.com/pinterest/ktlint/releases/download/0.36.0/ktlint && chmod a+x ktlint
+ ./ktlint --android --experimental -v
+
+ android-lint:
+ name: Android Linter
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ - name: Lint analysis of the SDK
+ run: ./gradlew clean :matrix-sdk-android:lintRelease --stacktrace
+ - name: Upload reports
+ uses: actions/upload-artifact@v2
+ with:
+ name: linting-report-android-sdk
+ path: matrix-sdk-android/build/reports/*.*
+
+ apk-lint:
+ name: Lint APK (${{ matrix.target }})
+ runs-on: ubuntu-latest
+ if: github.ref != 'refs/heads/main'
+ strategy:
+ fail-fast: false
+ matrix:
+ target: [ Gplay, Fdroid ]
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ - name: Lint ${{ matrix.target }} release
+ run: ./gradlew clean lint${{ matrix.target }}Release --stacktrace
+ - name: Upload ${{ matrix.target }} linting report
+ uses: actions/upload-artifact@v2
+ if: always()
+ with:
+ name: release-debug-linting-report-${{ matrix.target }}
+ path: |
+ vector/build/reports/*.*
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000000..6e51368ce5
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,23 @@
+name: Test
+
+on:
+ pull_request: {}
+ push:
+ branches: [main, develop]
+
+jobs:
+ unit-tests:
+ name: Run Unit Tests
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/cache@v2
+ with:
+ path: |
+ ~/.gradle/caches
+ ~/.gradle/wrapper
+ key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+ restore-keys: |
+ ${{ runner.os }}-gradle-
+ - name: Run unit tests
+ run: ./gradlew clean test --stacktrace -PallWarningsAsErrors=false
diff --git a/.gitignore b/.gitignore
index 4a264a28d8..04d1b6fe06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,5 +12,7 @@
.externalNativeBuild
/tmp
+/fastlane/private
+/fastlane/report.xml
ktlint
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 89a7c466fd..523496e317 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -7,15 +7,6 @@
-
diff --git a/.idea/dictionaries/bmarty.xml b/.idea/dictionaries/bmarty.xml
index 16cc35cebe..e143720aa9 100644
--- a/.idea/dictionaries/bmarty.xml
+++ b/.idea/dictionaries/bmarty.xml
@@ -26,15 +26,19 @@
pkcs
previewable
previewables
+ pstn
riotx
signin
signout
signup
+ snackbar
ssss
sygnal
threepid
unpublish
unwedging
+ vctr
+ wellknown
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
index 85bddac7f3..6e67639284 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,4 +1,4 @@
-# FTR: Configuration on https://travis-ci.org/vector-im/riotX-android/settings
+# FTR: Configuration on https://travis-ci.org/github/vector-im/element-android/settings
#
# - Build only if .travis.yml is present -> On
# - Limit concurrent jobs -> Off
@@ -8,53 +8,11 @@
# - Auto cancel branch builds -> On
# - Auto cancel pull request builds -> On
-language: android
-jdk: oraclejdk8
sudo: false
notifications:
email: false
-android:
- components:
- # Uncomment the lines below if you want to
- # use the latest revision of Android SDK Tools
- - tools
- - platform-tools
-
- # The BuildTools version used by your project
- - build-tools-29.0.3
-
- # The SDK version used to compile your project
- - android-29
-
-before_cache:
- - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
- - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
-
-cache:
- directories:
- - $HOME/.gradle/caches/
- - $HOME/.gradle/wrapper/
- - $HOME/.android/build-cache
-
-# Build with the development SDK
-before_script:
- # Not necessary for the moment
- # - /bin/sh ./set_debug_env.sh
-
-# Just build the project for now
+# Just run a simple script here
script:
- # Build app (assembleGplayRelease assembleFdroidRelease)
- # Build Android test (assembleAndroidTest) (disabled for now)
- # Code quality (lintGplayRelease lintFdroidRelease)
- # Split into two steps because if a task contain Fdroid, PlayService will be disabled
- # Done by Buildkite now: - ./gradlew clean assembleGplayRelease lintGplayRelease --stacktrace
- # Done by Buildkite now: - ./gradlew clean assembleFdroidRelease lintFdroidRelease --stacktrace
- # Run unitary test (Disable for now, see https://travis-ci.org/vector-im/riot-android/builds/502504370)
- # - ./gradlew testGplayReleaseUnitTest --stacktrace
- # Other code quality check
- # Done by Buildkite now: - ./tools/check/check_code_quality.sh
- ./tools/travis/check_pr.sh
- # Check that indonesians file are identical. Due to Android issue, the resource folder must be value-in/, and Weblate export data into value-id/.
- # Done by Buildkite now: - diff ./vector/src/main/res/values-id/strings.xml ./vector/src/main/res/values-in/strings.xml
diff --git a/CHANGES.md b/CHANGES.md
index 5e8ae6ab77..640d56a9fd 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,13 +1,453 @@
-Changes in Element 1.0.14 (2020-XX-XX)
+Changes in Element v1.2.0 (2021-08-12)
+======================================
+
+Features ✨
+----------
+ - Reorganise Advanced Notifications in to Default Notifications, Keywords and Mentions, Other (This feature is hidden in the release ui until a future release date.) ([#3646](https://github.com/vector-im/element-android/issues/3646))
+ - Voice Message - Enable by default, remove from labs ([#3817](https://github.com/vector-im/element-android/issues/3817))
+
+Bugfixes 🐛
+----------
+ - Voice Message - UI Improvements ([#3798](https://github.com/vector-im/element-android/issues/3798))
+ - Stop VMs playing in the timeline if a new VM recording is started ([#3802](https://github.com/vector-im/element-android/issues/3802))
+
+
+Changes in Element v1.1.16 (2021-08-09)
+=======================================
+
+Features ✨
+----------
+ - Spaces - Support Restricted Room via room capabilities API ([#3509](https://github.com/vector-im/element-android/issues/3509))
+ - Spaces | Support restricted room access in room settings ([#3665](https://github.com/vector-im/element-android/issues/3665))
+
+Bugfixes 🐛
+----------
+ - Fix crash when opening Troubleshoot Notifications ([#3778](https://github.com/vector-im/element-android/issues/3778))
+ - Fix error when sending encrypted message if someone in the room logs out. ([#3792](https://github.com/vector-im/element-android/issues/3792))
+ - Voice Message - Amplitude update java.util.ConcurrentModificationException ([#3796](https://github.com/vector-im/element-android/issues/3796))
+
+
+Changes in Element v1.1.15 (2021-07-30)
+=======================================
+
+Features ✨
+----------
+ - Voice Message implementation (Currently under Labs Settings and disabled by default). ([#3598](https://github.com/vector-im/element-android/issues/3598))
+
+SDK API changes ⚠️
+------------------
+ - updatePushRuleActions signature has been updated to more explicitly enabled/disable the rule and update the actions. It's behaviour has also been changed to match the web with the enable/disable requests being sent on every invocation and actions sent when needed(not null). ([#3681](https://github.com/vector-im/element-android/issues/3681))
+
+
+Changes in Element 1.1.14 (2021-07-23)
+======================================
+
+Features ✨
+----------
+ - Add low priority section in DM tab ([#3463](https://github.com/vector-im/element-android/issues/3463))
+ - Show missed call notification. ([#3710](https://github.com/vector-im/element-android/issues/3710))
+
+Bugfixes 🐛
+----------
+ - Don't use the transaction ID of the verification for the request ([#3589](https://github.com/vector-im/element-android/issues/3589))
+ - Avoid incomplete downloads in cache ([#3656](https://github.com/vector-im/element-android/issues/3656))
+ - Fix a crash which can happen when user signs out ([#3720](https://github.com/vector-im/element-android/issues/3720))
+ - Ensure OTKs are uploaded when the session is created ([#3724](https://github.com/vector-im/element-android/issues/3724))
+
+SDK API changes ⚠️
+------------------
+ - Add initialState support to CreateRoomParams (#3713) ([#3713](https://github.com/vector-im/element-android/issues/3713))
+
+Other changes
+-------------
+ - Apply grammatical fixes to the Server ACL timeline messages. ([#3721](https://github.com/vector-im/element-android/issues/3721))
+ - Add tags in the log, especially for VoIP, but can be used for other features in the future ([#3723](https://github.com/vector-im/element-android/issues/3723))
+
+
+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)
+======================================
+
+Features ✨
+----------
+ - Reveal password: use facility from com.google.android.material.textfield.TextInputLayout instead of manual handling. ([#3545](https://github.com/vector-im/element-android/issues/3545))
+ - Implements new design for Jump to unread and quick fix visibility issues. ([#3547](https://github.com/vector-im/element-android/issues/3547))
+
+Bugfixes 🐛
+----------
+ - Fix some issues with timeline cache invalidation and visibility. ([#3542](https://github.com/vector-im/element-android/issues/3542))
+ - Fix call invite processed after call is ended because of fastlane mode. ([#3564](https://github.com/vector-im/element-android/issues/3564))
+ - Fix crash after video call. ([#3577](https://github.com/vector-im/element-android/issues/3577))
+ - Fix crash out of memory ([#3583](https://github.com/vector-im/element-android/issues/3583))
+ - CryptoStore migration has to be object to avoid crash ([#3605](https://github.com/vector-im/element-android/issues/3605))
+
+
+Changes in Element v1.1.11 (2021-06-22)
+=======================================
+
+Bugfixes 🐛
+----------
+ - Send button does not show up half of the time ([#3535](https://github.com/vector-im/element-android/issues/3535))
+ - Fix crash on signout: release session at the end of clean up. ([#3538](https://github.com/vector-im/element-android/issues/3538))
+
+
+Changes in Element v1.1.10 (2021-06-18)
+=======================================
+
+Features ✨
+----------
+ - Migrate DefaultTypingService, KeysImporter and KeysExporter to coroutines ([#2449](https://github.com/vector-im/element-android/issues/2449))
+ - Update Message Composer design ([#3182](https://github.com/vector-im/element-android/issues/3182))
+ - Cleanup Epoxy items, and debounce all the clicks ([#3435](https://github.com/vector-im/element-android/issues/3435))
+ - Adds support for receiving MSC3086 Asserted Identity events. ([#3451](https://github.com/vector-im/element-android/issues/3451))
+ - Migrate to new colors and cleanup the style and theme. Now exported in module :library:ui-styles
+ Ref: https://material.io/blog/migrate-android-material-components ([#3459](https://github.com/vector-im/element-android/issues/3459))
+ - Add option to set aliases for public spaces ([#3483](https://github.com/vector-im/element-android/issues/3483))
+ - Add beta warning to private space creation flow ([#3485](https://github.com/vector-im/element-android/issues/3485))
+ - User defined top level spaces ordering ([#3501](https://github.com/vector-im/element-android/issues/3501))
+
+Bugfixes 🐛
+----------
+ - Fix new DMs not always marked as such ([#3333](https://github.com/vector-im/element-android/issues/3333))
+
+SDK API changes ⚠️
+------------------
+ - Splits SessionAccountDataService and RoomAccountDataService and offers to query RoomAccountDataEvent at the session level. ([#3479](https://github.com/vector-im/element-android/issues/3479))
+
+Other changes
+-------------
+ - Move the ability to start a call from dialpad directly to a dedicated tab in the home screen. ([#3457](https://github.com/vector-im/element-android/issues/3457))
+ - VoIP: Change hold direction to send-only. ([#3467](https://github.com/vector-im/element-android/issues/3467))
+ - Some improvements on DialPad (cursor edition, paste number, small fixes). ([#3516](https://github.com/vector-im/element-android/issues/3516))
+
+
+Changes in Element v1.1.9 (2021-06-02)
+======================================
+
+Features ✨:
+ - Upgrade Olm dependency to 3.2.4
+ - Allow user to add custom "network" in room search (#1458)
+ - Add Gitter.im as a default in the Change Network menu (#3196)
+ - VoIP: support for virtual rooms (#3355)
+ - Compress thumbnail: change Jpeg quality from 100 to 80 (#3396)
+ - Inconsistent usage of the term homeserver in Settings (#3404)
+ - VoIP: support attended transfer (#3420)
+ - /snow -> /snowfall and update wording (iso Element Web) (#3430)
+
+Bugfixes 🐛:
+ - Fix | On Android it seems to be impossible to view the complete description of a Space (without dev tools) (#3401)
+ - Fix | Suggest Rooms, Show a detailed view of the room on click (#3406)
+ - Fix app crashing when signing out (#3424)
+ - Switch to stable endpoint/fields for MSC2858 (#3442)
+
+Changes in Element 1.1.8 (2021-05-25)
+===================================================
+
+Improvements 🙌:
+ - Support Jitsi authentication (#3379)
+
+Bugfix 🐛:
+ - Space Invite by link not always displayed for public space (#3345)
+ - Wrong copy in share space bottom sheet (#3346)
+ - Fix a problem with database migration on nightly builds (#3335)
+ - Implement a workaround to render <del> and <u> in the timeline (#1817)
+ - Make sure the SDK can retrieve the secret storage if the system is upgraded (#3304)
+ - Spaces | Explore room list: the RoomId is displayed instead of name (#3371)
+ - Spaces | Personal spaces add DM - Web Parity (#3271)
+ - Spaces | Improve 'Leave Space' UX/UI (#3359)
+ - Don't create private spaces with encryption enabled (#3363)
+ - #+ button on lower right when looking at an empty space goes to an empty 'Explore rooms' (#3327)
+
+Build 🧱:
+ - Compile with Kotlin 1.5.10.
+ - Upgrade some dependencies: gradle wrapper, third party lib, etc.
+ - Sign APK with build tools 30.0.3
+
+Other changes:
+ - Add documentation on LoginWizard and RegistrationWizard (#3303)
+ - Setup towncrier tool (#3293)
+
+ Security:
+ - Element Android shares name of E2EE files with homeserver (#3387)
+
+Changes in Element 1.1.7 (2021-05-12)
+===================================================
+
+Features ✨:
+ - Spaces beta
+
+Improvements 🙌:
+ - Add ability to install APK from directly from Element (#2381)
+ - Delete and react to stickers (#3250)
+ - Compress video before sending (#442)
+ - Improve file too big error detection (#3245)
+ - User can now select video when selecting Gallery to send attachments to a room
+ - Add option to record a video from the camera
+ - Add the public icon on the rooms in the room list (#3292)
+
+Bugfix 🐛:
+ - Message states cosmetic changes (#3007)
+ - Fix exception in rxSingle (#3180)
+ - Do not invite the current user when creating a room (#3123)
+ - Fix color issues when the system theme is changed (#2738)
+ - Fix issues on Android 11 (#3067)
+ - Fix issue when opening encrypted files (#3186)
+ - Fix wording issue (#3242)
+ - Fix missing sender information after edits (#3184)
+ - Fix read marker not updating automatically (#3267)
+ - Sent video does not contains duration (#3272)
+ - Properly clean the back stack if the user cancel registration when waiting for email validation
+ - Fix read marker visibility/position when filtering some events
+ - Fix user invitation in case of restricted profile api (#3306)
+
+SDK API changes ⚠️:
+ - RegistrationWizard.createAccount() parameters are now all optional, following Matrix spec (#3205)
+
+Build 🧱:
+ - Upgrade to gradle 7
+ - https://github.com/Piasy/BigImageViewer is now hosted on mavenCentral()
+ - Upgrade Realm to version 10.4.0
+
+Other changes:
+ - New store descriptions
+ - `master` branch has been renamed to `main`. To apply change to your dev environment, run:
+```sh
+git branch -m master main
+git fetch origin
+git branch -u origin/main main
+# And optionally
+git remote prune origin
+```
+ - Allow cleartext (non-SSL) connections to Matrix servers on LAN hosts (#3166)
+
+Changes in Element 1.1.6 (2021-04-16)
+===================================================
+
+Bugfix 🐛:
+ - Fix crash on the timeline
+ - App crashes on "troubleshoot notifications" button (#3187)
+
+Changes in Element 1.1.5 (2021-04-15)
+===================================================
+
+Bugfix 🐛:
+ - Fix crash during Realm migration
+ - Fix crash when playing video (#3179)
+
+Changes in Element 1.1.4 (2021-04-09)
+===================================================
+
+Improvements 🙌:
+ - Split network request `/keys/query` into smaller requests (250 users max) (#2925)
+ - Crypto improvement | Bulk send NO_OLM withheld code
+ - Display the room shield in all room setting screens
+ - Improve message with Emoji only detection (#3017)
+ - Picture preview when replying. Also add the image preview in the message detail bottomsheet (#2916)
+ - Api interceptor to allow app developers peek responses (#2986)
+ - Update reactions to Unicode 13.1 (#2998)
+ - Be more robust when parsing some enums
+ - Improve timeline filtering (dissociate membership and profile events, display hidden events when highlighted, fix hidden item/read receipts behavior)
+ - Add better support for empty room name fallback (#3106)
+ - Room list improvements (paging)
+ - Fix quick click action (#3127)
+ - Get Event after a Push for a faster notification display in some conditions
+ - Always try to retry Http requests in case of 429 (#1300)
+ - registration availability endpoint added to matrix-sdk
+
+Bugfix 🐛:
+ - Fix bad theme change for the MainActivity
+ - Handle encrypted reactions (#2509)
+ - Disable URL preview for some domains (#2995)
+ - Fix avatar rendering for DMs, after initial sync (#2693)
+ - Fix mandatory parameter in API (#3065)
+ - If signout request fails, do not start LoginActivity, but restart the app (#3099)
+ - Retain keyword order in emoji import script, and update the generated file (#3147)
+
+SDK API changes ⚠️:
+ - Several Services have been migrated to coroutines (#2449)
+ - Removes filtering options on Timeline.
+
+Build 🧱:
+ - Properly exclude gms dependencies in fdroid build flavour which were pulled in through the jitsi SDK (#3125)
+
+Other changes:
+ - Add version details on the login screen, in debug or developer mode
+ - Migrate Retrofit interface to coroutine calls
+
+Changes in Element 1.1.3 (2021-03-18)
+===================================================
+
+Bugfix 🐛:
+ - Fix regression in UpdateTrustWorker (introduced in 1.1.2)
+ - Timeline : Fix ripple effect on text item and fix background color of separators.
+
+Changes in Element 1.1.2 (2021-03-16) (was not published tp GPlay prod)
+===================================================
+
+Improvements 🙌:
+ - Lazy storage of ReadReceipts
+ - Do not load room members in e2e after init sync
+
+Bugfix 🐛:
+ - Add option to cancel stuck messages at bottom of timeline see #516
+ - Ensure message are decrypted in the room list after a clear cache
+ - Regression: Video will not play upon tap, but only after swipe #2928
+ - Cross signing now works with servers with an explicit port in the servername
+
+Other changes:
+ - Change formatting on issue templates to proper headings.
+
+Changes in Element 1.1.1 (2021-03-10) (was not published tp GPlay prod)
+===================================================
+
+Improvements 🙌:
+ - Allow non-HTTPS connections to homeservers on Tor (#2941)
+ - Fetch homeserver type and version and display in a new setting screen and add info in rageshakes (#2831)
+ - Improve initial sync performance - split into 2 transactions (#983)
+ - PIP support for Jitsi call (#2418)
+ - Add tooltip for room quick actions
+ - Pre-share session keys when opening a room or start typing (#2771)
+ - Sending is now queuing by room and not uniquely to the session
+ - Improve Snackbar duration (#2929)
+ - Improve sending message state (#2937)
+
+Bugfix 🐛:
+ - Try to fix crash about UrlPreview (#2640)
+ - Be robust if Event.type is missing (#2946)
+ - Snappier message send status
+ - Fix MainActivity display (#2927)
+
+Translations 🗣:
+ - All string resources and translations have been moved to the application module. Weblate project for the SDK will be removed.
+
+Build 🧱:
+ - Update a lot of dependencies, with the help of dependabot.
+ - Add a script to download and install APK from the CI
+
+Other changes:
+ - Rework edition of event management
+
+Changes in Element 1.1.0 (2021-02-19)
+===================================================
+
+Features ✨:
+ - VoIP : support for VoIP V1 protocol, transfer call and dial-pad
+
+Improvements 🙌:
+ - VoIP : new tiles in timeline
+ - Improve room profile UX
+ - Upgrade Jitsi library from 2.9.3 to 3.1.0
+ - a11y improvements
+
+Bugfix 🐛:
+ - VoIP : fix audio devices output
+ - Fix crash after initial sync on Dendrite
+ - Fix crash reported by PlayStore (#2707)
+ - Ignore url override from credential if it is not valid (#2822)
+ - Fix crash when deactivating an account
+
+SDK API changes ⚠️:
+ - Migrate AuthenticationService API to coroutines (#2449)
+
+Other changes:
+ - New Dev Tools panel for developers
+ - Fix typos in CHANGES.md (#2811)
+ - Colors rework: first step: merge file `colors_riot.xml` to file `colors_riotx.xml` and rename the file to `colors.xml`
+
+Changes in Element 1.0.17 (2021-02-09)
+===================================================
+
+Improvements 🙌:
+ - Create a WidgetItemFactory and use it for better rendering of Jitsi widget change (video conference)
+ - Open image from URL Preview (#2705)
+
+Bugfix 🐛:
+ - Bug in WidgetContent.computeURL() (#2767)
+ - Duplicate thumbs | Mobile reactions for 👍 and 👎 are not the same as web (#2776)
+ - Join room by alias other federation error (#2778)
+ - HTML unescaping for URL preview (#2766)
+ - URL preview on reply fallback (#2756)
+ - RTL: some arrows should be rotated in RTL (#2757)
+ - Properly delete objects from Realm DB (#2765)
+
+Build 🧱:
+ - Upgrade build tools
+
+Other changes:
+ - Change app name from "Element (Riot.im)" to "Element"
+
+Changes in Element 1.0.16 (2021-02-04)
+===================================================
+
+Bugfix 🐛:
+ - Fix crash on API < 30 and light theme (#2774)
+
+Changes in Element 1.0.15 (2021-02-03)
+===================================================
+
+Features ✨:
+ - Social Login support
+
+Improvements 🙌:
+ - SSO support for cross signing (#1062)
+ - Deactivate account when logged in with SSO (#1264)
+ - SSO UIA doesn't work (#2754)
+
+Bugfix 🐛:
+ - Fix clear cache issue: sometimes, after a clear cache, there is still a token, so the init sync service is not started.
+ - Sidebar too large in horizontal orientation or tablets (#475)
+ - UrlPreview should be updated when the url is edited and changed (#2678)
+ - When receiving a new pepper from identity server, use it on the next hash lookup (#2708)
+ - Crashes reported by PlayStore (new in 1.0.14) (#2707)
+ - Widgets: Support $matrix_widget_id parameter (#2748)
+ - Data for Worker overload (#2721)
+ - Fix multiple tasks
+ - Object deletion in database is not complete (#2759)
+
+SDK API changes ⚠️:
+ - Increase targetSdkVersion to 30 (#2600)
+
+Build 🧱:
+ - Compile with Android SDK 30 (Android 11)
+
+Other changes:
+ - Update Dagger to 2.31 version so we can use the embedded AssistedInject feature
+
+Changes in Element 1.0.14 (2021-01-15)
===================================================
Features ✨:
- Enable url previews for notices (#2562)
+ - Edit room permissions (#2471)
Improvements 🙌:
- Add System theme option and set as default (#904, #2387)
- - Use WebView cache for widgets to avoid excessive data use (#2648)
+ - Store megolm outbound session to improve send time of first message after app launch.
- Warn user when they are leaving a not public room (#1460)
+ - Option to disable emoji keyboard (#2563)
Bugfix 🐛:
- Unspecced msgType field in m.sticker (#2580)
@@ -18,19 +458,15 @@ Bugfix 🐛:
- Tapping drawer having more than 1 room in notifications gives "malformed link" error (#2605)
- Sent image not displayed when opened immediately after sending (#409)
- Initial sync is not retried correctly when there is some network error. (#2632)
+ - Fix switch theme issue, and white field issue (#2599, #2528)
+ - Fix request too large Uri error when joining a room
Translations 🗣:
- -
-
-SDK API changes ⚠️:
- -
+ - New language supported: Hebrew
Build 🧱:
- Remove dependency to org.greenrobot.eventbus library
-Test:
- -
-
Other changes:
- Migrate to ViewBindings (#1072)
@@ -385,7 +821,7 @@ Improvements 🙌:
- Sending events is now retried only 3 times, so we avoid blocking the sending queue too long.
- Display warning when fail to send events in room list
- Improve UI of edit role action in member profile
- - Moderation | New screen to display list of banned users in room settings, with unban action
+ - Moderation | New screen to display list of banned users in room settings, with unban action
Bugfix 🐛:
- Fix theme issue on Room directory screen (#1613)
@@ -1105,36 +1541,3 @@ Changes in RiotX 0.1.0 (2019-07-11)
First release!
Mode details here: https://medium.com/@RiotChat/introducing-the-riotx-beta-for-android-b17952e8f771
-
-
-=======================================================
-+ TEMPLATE WHEN PREPARING A NEW RELEASE +
-=======================================================
-
-
-Changes in Element 1.X.X (2020-XX-XX)
-===================================================
-
-Features ✨:
- -
-
-Improvements 🙌:
- -
-
-Bugfix 🐛:
- -
-
-Translations 🗣:
- -
-
-SDK API changes ⚠️:
- -
-
-Build 🧱:
- -
-
-Test:
- -
-
-Other changes:
- -
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 3464fd9e76..5151a618f6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -26,10 +26,10 @@ To install the template (to be done only once):
To create a new screen:
- First create a new package in your code.
-- Then right click on the package, and select `New/New Vector/RiotX Feature`.
+- Then right click on the package, and select `New/New Vector/Element Feature`.
- Follow the Wizard, especially replace `Main` by something more relevant to your feature.
- Click on `Finish`.
-- Remaining steps are described as TODO in the generated files, or will be pointed out by the compilator, or at runtime :)
+- Remaining steps are described as TODO in the generated files, or will be pointed out by the compiler, or at runtime :)
Note that if the templates are modified, the only things to do is to restart Android Studio for the change to take effect.
@@ -51,9 +51,21 @@ If an issue does not exist yet, it may be relevant to open a new issue and let u
This project is full Kotlin. Please do not write Java classes.
-### CHANGES.md
+### Changelog
-Please add a line to the top of the file `CHANGES.md` describing your change.
+Please create at least one file under ./changelog.d containing details about your change. Towncrier will be used when preparing the release.
+
+Towncrier says to use the PR number for the filename, but the issue number is also fine.
+
+Supported filename extensions are:
+
+- ``.feature``: Signifying a new feature in Element Android or in the Matrix SDK.
+- ``.bugfix``: Signifying a bug fix.
+- ``.doc``: Signifying a documentation improvement.
+- ``.removal``: Signifying a deprecation or removal of public API. Can be used to notifying about API change in the Matrix SDK
+- ``.misc``: Any other changes.
+
+See https://github.com/twisted/towncrier#news-fragments if you need more details.
### Code quality
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000000..7a118b49be
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,3 @@
+source "https://rubygems.org"
+
+gem "fastlane"
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000000..345b4c1502
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,209 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ CFPropertyList (3.0.3)
+ 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.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.44.0)
+ aws-sdk-core (~> 3, >= 3.112.0)
+ aws-sigv4 (~> 1.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.4)
+ aws-eventstream (~> 1, >= 1.0.2)
+ babosa (1.0.4)
+ claide (1.0.3)
+ colored (1.2)
+ colored2 (3.1.2)
+ commander (4.6.0)
+ highline (~> 2.0.0)
+ declarative (0.0.20)
+ digest-crc (0.6.3)
+ rake (>= 12.0.0, < 14.0.0)
+ domain_name (0.5.20190701)
+ unf (>= 0.0.5, < 1.0.0)
+ dotenv (2.7.6)
+ emoji_regex (3.2.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)
+ faraday (>= 0.8.0)
+ http-cookie (~> 1.0.0)
+ 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.2.0)
+ faraday-patron (1.0.0)
+ faraday_middleware (1.0.0)
+ faraday (~> 1.0)
+ fastimage (2.2.4)
+ fastlane (2.187.0)
+ CFPropertyList (>= 2.3, < 4.0.0)
+ addressable (>= 2.3, < 3.0.0)
+ artifactory (~> 3.0)
+ aws-sdk-s3 (~> 1.0)
+ babosa (>= 1.0.3, < 2.0.0)
+ bundler (>= 1.12.0, < 3.0.0)
+ colored
+ commander (~> 4.6)
+ dotenv (>= 2.1.1, < 3.0.0)
+ emoji_regex (>= 0.1, < 4.0)
+ excon (>= 0.71.0, < 1.0.0)
+ faraday (~> 1.0)
+ faraday-cookie_jar (~> 0.0.6)
+ faraday_middleware (~> 1.0)
+ fastimage (>= 2.1.0, < 3.0.0)
+ gh_inspector (>= 1.1.2, < 2.0.0)
+ google-apis-androidpublisher_v3 (~> 0.1)
+ google-apis-playcustomapp_v1 (~> 0.1)
+ google-cloud-storage (~> 1.31)
+ highline (~> 2.0)
+ json (< 3.0.0)
+ jwt (>= 2.1.0, < 3)
+ mini_magick (>= 4.9.4, < 5.0.0)
+ multipart-post (~> 2.0.0)
+ naturally (~> 2.2)
+ plist (>= 3.1.0, < 4.0.0)
+ rubyzip (>= 2.0.0, < 3.0.0)
+ security (= 0.1.3)
+ simctl (~> 1.6.3)
+ terminal-notifier (>= 2.0.0, < 3.0.0)
+ terminal-table (>= 1.4.5, < 2.0.0)
+ tty-screen (>= 0.6.3, < 1.0.0)
+ tty-spinner (>= 0.8.0, < 1.0.0)
+ word_wrap (~> 1.0.0)
+ xcodeproj (>= 1.13.0, < 2.0.0)
+ xcpretty (~> 0.3.0)
+ xcpretty-travis-formatter (>= 0.0.3)
+ gh_inspector (1.1.3)
+ 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.16.2, < 2.a)
+ httpclient (>= 2.8.1, < 3.a)
+ mini_mime (~> 1.0)
+ representable (~> 3.0)
+ retriable (>= 2.0, < 4.a)
+ rexml
+ webrick
+ 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.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.6)
+ googleauth (>= 0.16.2, < 2.a)
+ mini_mime (~> 1.0)
+ googleauth (0.16.2)
+ faraday (>= 0.17.3, < 2.0)
+ jwt (>= 1.4, < 3.0)
+ memoist (~> 0.16)
+ multi_json (~> 1.11)
+ os (>= 0.9, < 2.0)
+ signet (~> 0.14)
+ highline (2.0.3)
+ http-cookie (1.0.4)
+ domain_name (~> 0.5)
+ httpclient (2.8.3)
+ jmespath (1.4.0)
+ json (2.5.1)
+ jwt (2.2.3)
+ memoist (0.16.2)
+ mini_magick (4.11.0)
+ mini_mime (1.1.0)
+ multi_json (1.15.0)
+ multipart-post (2.0.0)
+ nanaimo (0.3.0)
+ naturally (2.2.1)
+ os (1.1.1)
+ plist (3.6.0)
+ public_suffix (4.0.6)
+ rake (13.0.6)
+ representable (3.1.1)
+ declarative (< 0.1.0)
+ trailblazer-option (>= 0.1.1, < 0.2.0)
+ uber (< 0.2.0)
+ retriable (3.1.2)
+ rexml (3.2.5)
+ rouge (2.0.7)
+ ruby2_keywords (0.0.5)
+ rubyzip (2.3.2)
+ security (0.1.3)
+ signet (0.15.0)
+ addressable (~> 2.3)
+ faraday (>= 0.17.3, < 2.0)
+ jwt (>= 1.5, < 3.0)
+ multi_json (~> 1.10)
+ simctl (1.6.8)
+ CFPropertyList
+ naturally
+ terminal-notifier (2.0.0)
+ terminal-table (1.8.0)
+ unicode-display_width (~> 1.1, >= 1.1.1)
+ trailblazer-option (0.1.1)
+ tty-cursor (0.7.1)
+ tty-screen (0.8.1)
+ tty-spinner (0.9.3)
+ tty-cursor (~> 0.7)
+ uber (0.1.0)
+ unf (0.1.4)
+ unf_ext
+ unf_ext (0.0.7.7)
+ unicode-display_width (1.7.0)
+ webrick (1.7.0)
+ word_wrap (1.0.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)
+ xcpretty (~> 0.2, >= 0.0.7)
+
+PLATFORMS
+ x86_64-darwin-20
+
+DEPENDENCIES
+ fastlane
+
+BUNDLED WITH
+ 2.2.15
diff --git a/attachment-viewer/build.gradle b/attachment-viewer/build.gradle
index d8cd7d0c98..c393c5f483 100644
--- a/attachment-viewer/build.gradle
+++ b/attachment-viewer/build.gradle
@@ -17,26 +17,12 @@
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
-buildscript {
- repositories {
- maven {
- url 'https://jitpack.io'
- content {
- // PhotoView
- includeGroupByRegex 'com\\.github\\.chrisbanes'
- }
- }
- jcenter()
- }
-
-}
-
android {
- compileSdkVersion 29
+ compileSdkVersion 30
defaultConfig {
minSdkVersion 21
- targetSdkVersion 29
+ targetSdkVersion 30
versionCode 1
versionName "1.0"
}
@@ -61,15 +47,17 @@ android {
}
dependencies {
- implementation 'com.github.chrisbanes:PhotoView:2.1.4'
+ implementation project(":library:ui-styles")
- implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
+ implementation 'com.github.chrisbanes:PhotoView:2.3.0'
+
+ implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
- implementation 'androidx.core:core-ktx:1.3.2'
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation "androidx.recyclerview:recyclerview:1.1.0"
+ implementation 'androidx.core:core-ktx:1.6.0'
+ implementation 'androidx.appcompat:appcompat:1.3.1'
+ implementation "androidx.recyclerview:recyclerview:1.2.1"
- implementation 'com.google.android.material:material:1.2.1'
+ implementation 'com.google.android.material:material:1.4.0'
}
\ No newline at end of file
diff --git a/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt b/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt
index 9b1345cd39..f909418d6f 100644
--- a/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt
+++ b/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/AttachmentViewerActivity.kt
@@ -18,17 +18,22 @@
package im.vector.lib.attachmentviewer
import android.graphics.Color
+import android.os.Build
import android.os.Bundle
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.ScaleGestureDetector
import android.view.View
import android.view.ViewGroup
+import android.view.WindowInsets
+import android.view.WindowInsetsController
import android.view.WindowManager
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.content.ContextCompat
import androidx.core.view.GestureDetectorCompat
import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.transition.TransitionManager
@@ -94,14 +99,7 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- // This is important for the dispatchTouchEvent, if not we must correct
- // the touch coordinates
- window.decorView.systemUiVisibility = (
- View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- or View.SYSTEM_UI_FLAG_IMMERSIVE)
- window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
- window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
+ setDecorViewFullScreen()
views = ActivityAttachmentViewerBinding.inflate(layoutInflater)
setContentView(views.root)
@@ -127,13 +125,38 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
scaleDetector = createScaleGestureDetector()
ViewCompat.setOnApplyWindowInsetsListener(views.rootContainer) { _, insets ->
- overlayView?.updatePadding(top = insets.systemWindowInsetTop, bottom = insets.systemWindowInsetBottom)
- topInset = insets.systemWindowInsetTop
- bottomInset = insets.systemWindowInsetBottom
+ val systemBarsInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
+
+ overlayView?.updatePadding(top = systemBarsInsets.top, bottom = systemBarsInsets.bottom)
+ topInset = systemBarsInsets.top
+ bottomInset = systemBarsInsets.bottom
insets
}
}
+ @Suppress("DEPRECATION")
+ private fun setDecorViewFullScreen() {
+ // This is important for the dispatchTouchEvent, if not we must correct
+ // the touch coordinates
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ // New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ window.setDecorFitsSystemWindows(false)
+ // New API instead of SYSTEM_UI_FLAG_IMMERSIVE
+ window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE
+ // New API instead of FLAG_TRANSLUCENT_STATUS
+ window.statusBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
+ // new API instead of FLAG_TRANSLUCENT_NAVIGATION
+ window.navigationBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
+ } else {
+ window.decorView.systemUiVisibility = (
+ View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ or View.SYSTEM_UI_FLAG_IMMERSIVE)
+ window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
+ window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
+ }
+ }
+
fun onSelectedPositionChanged(position: Int) {
attachmentsAdapter.recyclerView?.findViewHolderForAdapterPosition(currentPosition)?.let {
(it as? BaseViewHolder)?.onSelected(false)
@@ -313,28 +336,48 @@ abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventLi
?.handleCommand(commands)
}
+ @Suppress("DEPRECATION")
private fun hideSystemUI() {
systemUiVisibility = false
// Enables regular immersive mode.
// For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
- window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
- // Set the content to appear under the system bars so that the
- // content doesn't resize when the system bars hide and show.
- or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
- // Hide the nav bar and status bar
- or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
- or View.SYSTEM_UI_FLAG_FULLSCREEN)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ // New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ window.setDecorFitsSystemWindows(false)
+ // new API instead of SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ window.decorView.windowInsetsController?.hide(WindowInsets.Type.navigationBars())
+ // New API instead of SYSTEM_UI_FLAG_IMMERSIVE
+ window.decorView.windowInsetsController?.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_BARS_BY_SWIPE
+ // New API instead of FLAG_TRANSLUCENT_STATUS
+ window.statusBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
+ // New API instead of FLAG_TRANSLUCENT_NAVIGATION
+ window.navigationBarColor = ContextCompat.getColor(this, R.color.half_transparent_status_bar)
+ } else {
+ window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
+ // Set the content to appear under the system bars so that the
+ // content doesn't resize when the system bars hide and show.
+ or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
+ // Hide the nav bar and status bar
+ or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
+ or View.SYSTEM_UI_FLAG_FULLSCREEN)
+ }
}
// Shows the system bars by removing all the flags
// except for the ones that make the content appear under the system bars.
+ @Suppress("DEPRECATION")
private fun showSystemUI() {
systemUiVisibility = true
- window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
- or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
- or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+ // New API instead of SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN and SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ window.setDecorFitsSystemWindows(false)
+ } else {
+ window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
+ or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
+ or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
+ }
}
}
diff --git a/attachment-viewer/src/main/res/layout/item_image_attachment.xml b/attachment-viewer/src/main/res/layout/item_image_attachment.xml
index 91a009df2a..0f9a90e91c 100644
--- a/attachment-viewer/src/main/res/layout/item_image_attachment.xml
+++ b/attachment-viewer/src/main/res/layout/item_image_attachment.xml
@@ -1,22 +1,18 @@
+ android:layout_height="match_parent">
+ android:layout_height="match_parent" />
+ android:layout_centerInParent="true" />
\ No newline at end of file
diff --git a/attachment-viewer/src/main/res/layout/item_video_attachment.xml b/attachment-viewer/src/main/res/layout/item_video_attachment.xml
index 29f01650fd..7dd13ea460 100644
--- a/attachment-viewer/src/main/res/layout/item_video_attachment.xml
+++ b/attachment-viewer/src/main/res/layout/item_video_attachment.xml
@@ -1,8 +1,8 @@
+ android:layout_height="match_parent">
+ android:layout_centerInParent="true"
+ android:visibility="gone"
+ tools:visibility="visible" />
diff --git a/attachment-viewer/src/main/res/layout/view_image_attachment.xml b/attachment-viewer/src/main/res/layout/view_image_attachment.xml
deleted file mode 100644
index 3518a4472d..0000000000
--- a/attachment-viewer/src/main/res/layout/view_image_attachment.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 7531dee61e..cd2a6df4d4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,8 +2,8 @@
buildscript {
// Ref: https://kotlinlang.org/releases.html
- ext.kotlin_version = '1.4.20'
- ext.kotlin_coroutines_version = "1.4.1"
+ ext.kotlin_version = '1.5.21'
+ ext.kotlin_coroutines_version = "1.5.0"
repositories {
google()
jcenter()
@@ -12,11 +12,12 @@ buildscript {
}
}
dependencies {
- classpath 'com.android.tools.build:gradle:4.1.1'
- classpath 'com.google.gms:google-services:4.3.4'
+ classpath 'com.android.tools.build:gradle:4.2.2'
+ classpath 'com.google.gms:google-services:4.3.10'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
- classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7.1'
- classpath 'com.google.android.gms:oss-licenses-plugin:0.10.2'
+ classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3'
+ classpath 'com.google.android.gms:oss-licenses-plugin:0.10.4'
+ classpath "com.likethesalad.android:string-reference:1.2.2"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -44,25 +45,23 @@ allprojects {
// PFLockScreen-Android
includeGroupByRegex 'com\\.github\\.vector-im'
- //Chat effects
+ // Chat effects
includeGroupByRegex 'com\\.github\\.jetradarmobile'
includeGroupByRegex 'nl\\.dionsegijn'
- }
- }
- maven {
- url "http://dl.bintray.com/piasy/maven"
- content {
- includeGroupByRegex "com\\.github\\.piasy"
+
+ // Voice RecordView
+ includeGroupByRegex 'com\\.github\\.Armen101'
}
}
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
// Jitsi repo
maven {
- url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-2.9.3"
+ url "https://github.com/vector-im/jitsi_libre_maven/raw/main/android-sdk-3.1.0"
// Note: to test Jitsi release you can use a local file like this:
- // url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-2.9.3"
+ // url "file:///Users/bmarty/workspaces/jitsi_libre_maven/android-sdk-3.1.0"
}
google()
+ mavenCentral()
jcenter()
}
diff --git a/changelog.d/.gitignore b/changelog.d/.gitignore
new file mode 100644
index 0000000000..b722e9e13e
--- /dev/null
+++ b/changelog.d/.gitignore
@@ -0,0 +1 @@
+!.gitignore
\ No newline at end of file
diff --git a/changelog.d/3243.bugfix b/changelog.d/3243.bugfix
new file mode 100644
index 0000000000..8c912a5c13
--- /dev/null
+++ b/changelog.d/3243.bugfix
@@ -0,0 +1 @@
+Notifications - Fix missing sound on notifications.
\ No newline at end of file
diff --git a/changelog.d/3743.bugfix b/changelog.d/3743.bugfix
new file mode 100644
index 0000000000..87baf62834
--- /dev/null
+++ b/changelog.d/3743.bugfix
@@ -0,0 +1 @@
+Update the AccountData with the users' matrix Id instead of their email for those invited by email in a direct chat
\ No newline at end of file
diff --git a/changelog.d/3793.bugfix b/changelog.d/3793.bugfix
new file mode 100644
index 0000000000..8f81229262
--- /dev/null
+++ b/changelog.d/3793.bugfix
@@ -0,0 +1 @@
+Fix order in which the items of the attachement menu appear
diff --git a/changelog.d/3841.bugfix b/changelog.d/3841.bugfix
new file mode 100644
index 0000000000..d0e84757dc
--- /dev/null
+++ b/changelog.d/3841.bugfix
@@ -0,0 +1 @@
+Authenticated Jitsi not working in release
\ No newline at end of file
diff --git a/changelog.d/3845.bugfix b/changelog.d/3845.bugfix
new file mode 100644
index 0000000000..ce820738fe
--- /dev/null
+++ b/changelog.d/3845.bugfix
@@ -0,0 +1 @@
+Home: Dial pad lost entry when config changes
\ No newline at end of file
diff --git a/docs/color_migration_guide.md b/docs/color_migration_guide.md
new file mode 100644
index 0000000000..31a531d124
--- /dev/null
+++ b/docs/color_migration_guide.md
@@ -0,0 +1,85 @@
+# Color migration
+
+### Changes
+
+- use colors defined in https://www.figma.com/file/X4XTH9iS2KGJ2wFKDqkyed/Compound?node-id=557%3A0
+- remove unused resources and code (ex: PercentView)
+- split some resource files into smaller file
+- rework the theme files
+- ensure material theme is used everywhere in the theme and in the layout
+- add default style for some views in the theme (ex: Toolbar, etc.)
+- add some debug screen in the debug menu, to test the themes and the button style
+- rework the button style to use `materialThemeOverlay` attribute
+- custom tint icon for menu management has been removed
+- comment with `riotx` has been updated
+
+### Main change for developers
+
+- Read migration guide: https://github.com/vector-im/element-android/pull/3459/files#diff-f0e52729d5e4f6eccbcf72246807aa34ed19c4ef5625ca669df998cd1022874b
+- Use MaterialAlertDialogBuilder instead of AlertDialog.Builder
+- some Epoxy Item included a divider. This has been removed. Use a `dividerItem` or `bottomSheetDividerItem` Epoxy items to add a divider
+- RecyclerView.configureWith now take a divider drawable instead of a divider color
+
+### Remaining work
+
+- Cleanup some vector drawables and ensure a tint is always used instead of hard coded color.
+
+### Migration guide
+
+Some colors and color attribute has been removed, here is the list and what has to be used now.
+
+It can help Element Android forks maintainers to migrate their code.
+
+- riotx_text_primary -> ?vctr_content_primary
+- riotx_text_secondary -> ?vctr_content_secondary
+- riotx_text_tertiary -> ?vctr_content_tertiary
+
+- ?riotx_background -> ?android:colorBackground
+- riotx_background_light -> element_background_light
+- riotx_background_dark -> element_background_dark
+- riotx_background_black -> element_background_black
+
+- riotx_accent -> ?colorPrimary
+- riotx_positive_accent -> ?colorPrimary
+- riotx_accent_alpha25 -> color_primary_alpha25
+- riotx_notice -> ?colorError
+- riotx_destructive_accent -> ?colorError
+- vector_error_color -> ?colorError
+- vector_warning_color -> ?colorError
+
+- riotx_bottom_sheet_background -> ?colorSurface
+- riotx_alerter_background -> ?colorSurface
+
+- riotx_username_1 -> element_name_01
+- riotx_username_2 -> element_name_02
+- riotx_username_3 -> element_name_03
+- riotx_username_4 -> element_name_04
+- riotx_username_5 -> element_name_05
+- riotx_username_6 -> element_name_06
+- riotx_username_7 -> element_name_07
+- riotx_username_8 -> element_name_08
+
+- riotx_avatar_fill_1 -> element_room_01
+- riotx_avatar_fill_2 -> element_room_02
+- riotx_avatar_fill_3 -> element_room_03
+
+- white -> @android:color/white
+- black -> @android:color/black or emoji_color
+
+- riotx_list_header_background_color -> ?vctr_header_background
+- riotx_header_panel_background -> ?vctr_header_background
+- riotx_list_bottom_sheet_divider_color -> ?vctr_list_separator_on_surface
+- riotx_list_divider_color -> ?vctr_list_separator
+- list_divider_color -> ?vctr_list_separator
+- riotx_header_panel_border_mobile -> ?vctr_list_separator
+- riotx_bottom_nav_background_border_color -> ?vctr_list_separator
+- riotx_header_panel_text_secondary -> ?vctr_content_primary
+
+- link_color_light -> element_link_light
+- link_color_dark -> element_link_dark
+
+- riotx_toolbar_primary_text_color -> vctr_content_primary
+- riotx_toolbar_secondary_text_color -> vctr_content_primary
+- riot_primary_text_color -> vctr_content_primary
+
+- riotx_android_secondary -> vctr_content_secondary
diff --git a/docs/identity_server.md b/docs/identity_server.md
index 0d75108dd3..e765ae3949 100644
--- a/docs/identity_server.md
+++ b/docs/identity_server.md
@@ -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
diff --git a/docs/jitsi.md b/docs/jitsi.md
index 071470b040..389e7d71ec 100644
--- a/docs/jitsi.md
+++ b/docs/jitsi.md
@@ -18,7 +18,7 @@ The generated maven repository is then host in the project https://github.com/ve
Update the script `./tools/jitsi/build_jisti_libs.sh` with the tag of the project `https://github.com/jitsi/jitsi-meet`.
-Currently we are building the version with the tag `android-sdk-2.9.3`.
+Currently we are building the version with the tag `android-sdk-3.1.0`.
### Run the build script
@@ -35,21 +35,21 @@ It will build the Jitsi Meet Android library and put every generated files in th
- Update the file `./build.gradle` to use the previously created local Maven repository. Currently we have this line:
```groovy
-url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-2.9.3"
+url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.1.0"
```
You can uncomment and update the line starting with `// url "file://...` and comment the line starting with `url`, to test the library using the locally generated Maven repository.
-- Update the dependency of the WebRTC library in the file `./matrix-sdk-android/build.gradle`. Currently we have this line:
-
-```groovy
-implementation('com.facebook.react:react-native-webrtc:1.84.0-jitsi-5112273@aar')
-```
-
- Update the dependency of the Jitsi Meet library in the file `./vector/build.gradle`. Currently we have this line:
```groovy
-implementation('org.jitsi.react:jitsi-meet-sdk:2.9.3') { transitive = true }
+implementation('org.jitsi.react:jitsi-meet-sdk:3.1.0')
+```
+
+- Update the dependency of the WebRTC library in the file `./vector/build.gradle`. Currently we have this line:
+
+```groovy
+implementation('com.facebook.react:react-native-webrtc:1.87.3-jitsi-6624067@aar')
```
- Perform a gradle sync and build the project
@@ -74,9 +74,9 @@ If all the tests are passed, you can export the generated Jitsi library to our M
- Update the file `./build.gradle` to use the previously created Maven repository. Currently we have this line:
```groovy
-url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-2.9.3"
+url "https://github.com/vector-im/jitsi_libre_maven/raw/master/android-sdk-3.1.0"
```
- Build the project and perform the sanity tests again.
-- Update the file `/CANGES.md` to notify about the library upgrade, and create a regular PR for project Element Android.
\ No newline at end of file
+- Update the file `/CHANGES.md` to notify about the library upgrade, and create a regular PR for project Element Android.
\ No newline at end of file
diff --git a/docs/notifications.md b/docs/notifications.md
index 63bf593d0d..b44984785a 100644
--- a/docs/notifications.md
+++ b/docs/notifications.md
@@ -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 gets a message from a Home Server?](#how-does-a-matrix-client-gets-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 gets 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)
diff --git a/fastlane/Appfile b/fastlane/Appfile
new file mode 100644
index 0000000000..25273b0b09
--- /dev/null
+++ b/fastlane/Appfile
@@ -0,0 +1,2 @@
+json_key_file("./fastlane/private/api-8525453667099313774-565354-aca0e6153603.json")
+package_name("im.vector.app")
diff --git a/fastlane/Fastfile b/fastlane/Fastfile
new file mode 100644
index 0000000000..85e3d777ac
--- /dev/null
+++ b/fastlane/Fastfile
@@ -0,0 +1,60 @@
+# This file contains the fastlane.tools configuration
+# You can find the documentation at https://docs.fastlane.tools
+#
+# For a list of all available actions, check out
+#
+# https://docs.fastlane.tools/actions
+#
+# For a list of all available plugins, check out
+#
+# https://docs.fastlane.tools/plugins/available-plugins
+#
+
+# Uncomment the line if you want fastlane to automatically update itself
+# update_fastlane
+
+default_platform(:android)
+
+platform :android do
+ desc "Runs all the tests"
+ lane :test do
+ gradle(task: "test")
+ end
+
+ desc "Submit a new Beta Build to Crashlytics Beta"
+ lane :beta do
+ gradle(task: "clean assembleRelease")
+ crashlytics
+
+ # sh "your_script.sh"
+ # You can also use other beta testing services here
+ end
+
+ desc "Deploy a new version to the Google Play"
+ lane :deploy do
+ gradle(task: "clean assembleRelease")
+ upload_to_play_store
+ end
+
+ desc "Deploy Google Play metadata"
+ lane :deployMeta do
+ # Doc: https://docs.fastlane.tools/actions/upload_to_play_store/
+ upload_to_play_store(
+ skip_upload_apk: true,
+ skip_upload_aab: true,
+ skip_upload_images: true,
+ skip_upload_screenshots: true,
+ skip_upload_changelogs: true,
+ # Set to true to not update the PlayStore
+ validate_only: false
+ )
+ end
+
+ desc "Get version code"
+ lane :getVersionCode do
+ versions = google_play_track_version_codes(track: "production")
+ puts(versions)
+ version_code = versions[0]
+ puts(version_code)
+ end
+end
diff --git a/fastlane/README.md b/fastlane/README.md
new file mode 100644
index 0000000000..54d3a005a6
--- /dev/null
+++ b/fastlane/README.md
@@ -0,0 +1,49 @@
+fastlane documentation
+================
+# Installation
+
+Make sure you have the latest version of the Xcode command line tools installed:
+
+```
+xcode-select --install
+```
+
+Install _fastlane_ using
+```
+[sudo] gem install fastlane -NV
+```
+or alternatively using `brew install fastlane`
+
+# Available Actions
+## Android
+### android test
+```
+fastlane android test
+```
+Runs all the tests
+### android beta
+```
+fastlane android beta
+```
+Submit a new Beta Build to Crashlytics Beta
+### android deploy
+```
+fastlane android deploy
+```
+Deploy a new version to the Google Play
+### android deployMeta
+```
+fastlane android deployMeta
+```
+Deploy Google Play metadata
+### android getVersionCode
+```
+fastlane android getVersionCode
+```
+Get version code
+
+----
+
+This README.md is auto-generated and will be re-generated every time [fastlane](https://fastlane.tools) is run.
+More information about fastlane can be found on [fastlane.tools](https://fastlane.tools).
+The documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).
diff --git a/fastlane/metadata/android/ar/changelogs/40100100.txt b/fastlane/metadata/android/ar/changelogs/40100100.txt
new file mode 100644
index 0000000000..25fc9c9058
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+يحتوي هذا الإصدار الجديد بشكل أساسي على إصلاحات للأخطاء وتحسينات. إرسال الرسالة أصبح الآن أسرع بكثير.
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/ar/changelogs/40100110.txt b/fastlane/metadata/android/ar/changelogs/40100110.txt
new file mode 100644
index 0000000000..1258ba323a
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+يحتوي هذا الإصدار الجديد بشكل أساسي على تحسينات في واجهة المستخدم وتجربة المستخدم. يُمكنك الآن دعوة الأصدقاء وإنشاء رسالة مُباشرة بسرعة كبيرة عن طريق مسح رموز الاستجابة السريعة.
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/ar/changelogs/40100120.txt b/fastlane/metadata/android/ar/changelogs/40100120.txt
new file mode 100644
index 0000000000..18abe163dd
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+التغييرات الرئيسة في هذا الإصدار: مُعاينة URL، لوحة مفاتيح Emoji جديدة، إمكانيات جديدة لإعدادات الغرفة والثلج لميلاد المسيح!
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/ar/changelogs/40100130.txt b/fastlane/metadata/android/ar/changelogs/40100130.txt
new file mode 100644
index 0000000000..eb50cdd31a
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+التغييرات الرئيسة في هذا الإصدار: مُعاينة URL، لوحة مفاتيح Emoji جديدة، إمكانيات جديدة لإعدادات الغرفة والثلج لميلاد المسيح!
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/ar/changelogs/40100140.txt b/fastlane/metadata/android/ar/changelogs/40100140.txt
new file mode 100644
index 0000000000..d3b0dc2dbc
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+التغييرات الرئيسة في هذا الإصدار: تحرير أذونات الغُرفة، السِّمة التلقائية الفاتحة/الداكنة، ومجموعة من إصلاحات الأخطاء.
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/ar/changelogs/40100150.txt b/fastlane/metadata/android/ar/changelogs/40100150.txt
new file mode 100644
index 0000000000..ba77aa0b1c
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+التغييرات الرئيسة في هذا الإصدار: دعم تسجيل الدخول الاجتماعي.
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/ar/changelogs/40100160.txt b/fastlane/metadata/android/ar/changelogs/40100160.txt
new file mode 100644
index 0000000000..b52a902cfa
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+التغييرات الرئيسة في هذا الإصدار: دعم تسجيل الدخول الاجتماعي.
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/ar/changelogs/40100170.txt b/fastlane/metadata/android/ar/changelogs/40100170.txt
new file mode 100644
index 0000000000..8f2226ae0e
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+التغييرات الرئيسة في هذا الإصدار: إصلاحات الأخطاء!
+سجل التعديل الكامل: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/ar/changelogs/40101010.txt b/fastlane/metadata/android/ar/changelogs/40101010.txt
new file mode 100644
index 0000000000..329fffeb3c
--- /dev/null
+++ b/fastlane/metadata/android/ar/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+التغييرات الرئيسة في هذه النسخة: تحسينات على الأداء وإصلاح للعلل!
+اطّلع على سجل التغييرات الكامل هنا: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/ar/full_description.txt b/fastlane/metadata/android/ar/full_description.txt
new file mode 100644
index 0000000000..c0baa7d709
--- /dev/null
+++ b/fastlane/metadata/android/ar/full_description.txt
@@ -0,0 +1,31 @@
+Element هو نوع جديد من تطبيقات المُراسلة والتعاون الذي:
+
+1. يمنحك التحكم في المُحافضة على خصوصيتك
+2. يُتيح لك التواصل مع أي شخص على شبكة Matrix ، وحتى خارجها من خلال التكامل مع التطبيقات مثل Slack
+3. يحميك من الإعلانات والتنقيب عن البيانات وعمليات الحدائق المُسورة
+4. يؤمنك من خلال تعمية النهاية-إلى-النهاية، مع التوقيع المُتبادل للتحقق من الآخرين
+
+يختلف Element تمامًا عن تطبيقات المُراسلة والتعاون الأُخرى لأنه لا مركزي ومفتوح المصدر.
+
+يُتيح لك Element إمكانية الاستضافة الذاتية -أو اختيار مُضيف- بحيث تتمتع بالخصوصية والمُلكية والتحكم في بياناتك ومُحادثاتك. يُتيح لك الوصول إلى شبكة مفتوحة؛ لذلك لا يقتصر الأمر على التحدث إلى مستخدمي Element الآخرين فقط. كما انه آمن للغاية.
+
+Element قادر على القيام بكل ذلك لأنه يعمل على Matrix -مِعيار التواصل المفتوح اللامركزي.
+
+Element يمنحك زمام التحكم من خلال السماح لك باختيار من يستضيف المُحادثات الخاصة بك. من تطبيق Element، يُمكنك اختيار الاستضافة بطرق مختلفة:
+
+1. الحُصول على حساب مجاني على الخادِم العام matrix.org الذي يستضيفه مطورو Matrix، أو اختر من بين آلاف الخوادِم العامة التي يستضيفها متطوعون
+2. استضافة حسابك بنفسك عن طريق تشغيل خادِم على أجهزتك الخاصة
+3. التسجيل للحصول على حساب على خادِم مُخصص بمُجرد الاشتراك في منصة استضافة Element Matrix Services
+
+ لماذا تختار Element؟
+
+تملَّك بياناتك: أنت من تُقرر أين تحتفظ ببياناتك ورسائلك. أنت تمتلكها وتتحكم فيها، وليس بعض الشركات الكُبرى الإحتكارية التي تُنقِّب عن بياناتك أو تُتيح الوصول إلى أطراف ثالثة.
+
+
+تراسُل وتعاون مفتوح: يُمكنك مُحادثة أي شخص آخر على شبكة Matrix، سواء كانوا يستخدمون Element أو تطبيق Matrix آخر، وحتى إذا كانوا يستخدمون نظام مُراسلة مُختلف مثل Slack أو IRC أو XMPP.
+
+الأمان-الخارق: تشفير حقيقي من النهاية إلى النهاية (فقط أطراف المُحادثة مَن يُمكنهم فك تشفير الرسائل)، والتوقيع المُتبادل للتحقق من أجهزة المُشاركين في المُحادثة.
+
+التواصل الكامل: المُراسلة، المُكالمات الصوتية والمرئية، مُشاركة الملفات، مُشاركة الشاشة، مجموعة كاملة وكبيرة من عمليات التكامُل، الروبوتات والأدوات. بناء الغُرف، المُجتمعات، ابق على اتصال وأنجز المهام.
+
+أين ما كُنت: ابق على اتصال أينما كنت مع سجل الرسائل المتزامن بالكامل عبر جميع أجهزتك وفي الويب على https://app.element.io.
diff --git a/fastlane/metadata/android/ar/short_description.txt b/fastlane/metadata/android/ar/short_description.txt
new file mode 100644
index 0000000000..48df6f2b0c
--- /dev/null
+++ b/fastlane/metadata/android/ar/short_description.txt
@@ -0,0 +1 @@
+مُحادثة آمنة لا مركزية و VoIP. حافظ على بياناتك آمنة من الأطراف الثالثة.
diff --git a/fastlane/metadata/android/ar/title.txt b/fastlane/metadata/android/ar/title.txt
new file mode 100644
index 0000000000..11992d355d
--- /dev/null
+++ b/fastlane/metadata/android/ar/title.txt
@@ -0,0 +1 @@
+Element (Riot.im سابقًا)
diff --git a/fastlane/metadata/android/ca/changelogs/40100100.txt b/fastlane/metadata/android/ca/changelogs/40100100.txt
index 70b786d12e..9844c8ed2b 100644
--- a/fastlane/metadata/android/ca/changelogs/40100100.txt
+++ b/fastlane/metadata/android/ca/changelogs/40100100.txt
@@ -1 +1,2 @@
-// TODO
+Aquesta nova versió principalment conté correccions d'errors i millores. Ara, enviar un missatge és molt més ràpid.
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/ca/changelogs/40100110.txt b/fastlane/metadata/android/ca/changelogs/40100110.txt
new file mode 100644
index 0000000000..86e26ee0c4
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Aquesta principalment conté millores d'interfície experiència d'usuari. Ara pots convidar amics i crear xats personals ràpidament escanejant codis QR.
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/ca/changelogs/40100120.txt b/fastlane/metadata/android/ca/changelogs/40100120.txt
new file mode 100644
index 0000000000..e2e967215f
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: previsualització d'URL, nou teclat d'emoticones, noves funcions de configuració de les sales i neu pel Nadal!
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/ca/changelogs/40100130.txt b/fastlane/metadata/android/ca/changelogs/40100130.txt
new file mode 100644
index 0000000000..c63b5fb793
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: previsualització d'URL, nou teclat d'emoticones, noves funcions de configuració de les sales i neu pel Nadal!
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/ca/changelogs/40100140.txt b/fastlane/metadata/android/ca/changelogs/40100140.txt
new file mode 100644
index 0000000000..1823c1abd7
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: modificació dels permisos de sala, tema clar/fosc automàtic, correcció d'errors.
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/ca/changelogs/40100150.txt b/fastlane/metadata/android/ca/changelogs/40100150.txt
new file mode 100644
index 0000000000..430b311b0e
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: inici de sessió amb xarxes socials.
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/ca/changelogs/40100160.txt b/fastlane/metadata/android/ca/changelogs/40100160.txt
new file mode 100644
index 0000000000..8a5b6e5d9d
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: inici de sessió amb xarxes socials.
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.15 i https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/ca/changelogs/40100170.txt b/fastlane/metadata/android/ca/changelogs/40100170.txt
new file mode 100644
index 0000000000..8a208b66f7
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: correcció d'errors!
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/ca/changelogs/40101000.txt b/fastlane/metadata/android/ca/changelogs/40101000.txt
new file mode 100644
index 0000000000..2c651e1801
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: millora de VoIP (trucades i videotrucades en xats personals) i correcció d'errors!
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/ca/changelogs/40101010.txt b/fastlane/metadata/android/ca/changelogs/40101010.txt
new file mode 100644
index 0000000000..26ce0562d0
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: millora de rendiment i correcció d'errors!
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/ca/changelogs/40101020.txt b/fastlane/metadata/android/ca/changelogs/40101020.txt
new file mode 100644
index 0000000000..43c140214f
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: millora de rendiment i correcció d'errors!
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/ca/changelogs/40101030.txt b/fastlane/metadata/android/ca/changelogs/40101030.txt
new file mode 100644
index 0000000000..9b2627e7f2
--- /dev/null
+++ b/fastlane/metadata/android/ca/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Canvis principals d'aquesta versió: millora de rendiment i correcció d'errors!
+Registre de canvis complet: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/ca/short_description.txt b/fastlane/metadata/android/ca/short_description.txt
index 1e842ec64e..136e9c7ae3 100644
--- a/fastlane/metadata/android/ca/short_description.txt
+++ b/fastlane/metadata/android/ca/short_description.txt
@@ -1 +1 @@
-Xat i VoIP segurs i descentralitzats. Protegeix les teves dades de tercers.
+Xats i VoIP segurs i descentralitzats. Protegeix les teves dades de tercers.
diff --git a/fastlane/metadata/android/ca/title.txt b/fastlane/metadata/android/ca/title.txt
index adc831006a..9dc1e0d277 100644
--- a/fastlane/metadata/android/ca/title.txt
+++ b/fastlane/metadata/android/ca/title.txt
@@ -1 +1 @@
-Element (anteriorment Riot.im)
+Element (abans Riot.im)
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100100.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100100.txt
new file mode 100644
index 0000000000..9c3ac6c2b2
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Tato nová verze obsahuje hlavně opravy chyb a vylepšení. Odeslání zprávy je nyní mhohem rychlejší.
+Plné znění změn: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100110.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100110.txt
new file mode 100644
index 0000000000..e038ac5b62
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Tato nová verze obsahuje hlavně vylepšení v uživatelském rozhraní. Nyní můžete pozvat přátele a napsat DM velmi rychle skenem QR kódů.
+Plné znění změn: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100120.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100120.txt
new file mode 100644
index 0000000000..0e90f17e8b
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Náhled URL, nová klávesice s Emoji, nové možnosti nastavení místností a sníh na vánoce!
+Plné znění změn: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100130.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100130.txt
new file mode 100644
index 0000000000..bf44ad40e0
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Náhled URL, nová klávesice s Emoji, nové možnosti nastavení místností a sníh na vánoce!
+Plné znění změn: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100140.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100140.txt
new file mode 100644
index 0000000000..2c9c568c8d
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Úpravy práv místností, automatický tmavý/světlý vzhled a řada oprav chyb.
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100150.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100150.txt
new file mode 100644
index 0000000000..7976d97411
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Podpora přihlášení v sociálních sítích.
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100160.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100160.txt
new file mode 100644
index 0000000000..2cc6c65207
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Podpora přihlášení v sociálních sítích.
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.15 a https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40100170.txt b/fastlane/metadata/android/cs-CZ/changelogs/40100170.txt
new file mode 100644
index 0000000000..693ff3fbaf
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Opravy chyb!
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101000.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101000.txt
new file mode 100644
index 0000000000..7c1e140601
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: VoIP (audio a video hovory v DM), vylepšení a opravy chyb!
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101010.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101010.txt
new file mode 100644
index 0000000000..73c691da06
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: vylepšení výkonnosti a opravy chyb!
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101020.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101020.txt
new file mode 100644
index 0000000000..5e90e49daa
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: vylepšení výkonnosti a opravy chyb!
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101030.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101030.txt
new file mode 100644
index 0000000000..0e624ba6d1
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: vylepšení výkonnosti a opravy chyb!
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101040.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101040.txt
new file mode 100644
index 0000000000..1818c92ba8
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: vylepšení výkonnosti a opravy chyb!
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101050.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101050.txt
new file mode 100644
index 0000000000..3e33cd8d07
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: nutné opravy pro 1.1.4
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101060.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101060.txt
new file mode 100644
index 0000000000..d148a9bc37
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: nutné opravy chyb pro 1.1.5!
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101070.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101070.txt
new file mode 100644
index 0000000000..2a6afb21a5
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: beta podpora pro Spaces. Komprimace videa před odesláním.
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101080.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101080.txt
new file mode 100644
index 0000000000..5ec173ebea
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: vylepšení pro Spaces
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101090.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101090.txt
new file mode 100644
index 0000000000..782a2fa8c5
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: doplněna podpora pro síť gitter.im
+Úplný záznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101100.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101100.txt
new file mode 100644
index 0000000000..de73b6f382
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101100.txt
@@ -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
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101110.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101110.txt
new file mode 100644
index 0000000000..c4bfee0779
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101110.txt
@@ -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
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101120.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101120.txt
new file mode 100644
index 0000000000..3a10c20c0a
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: aktualizace motivu a stylu a oprava pádu aplikace po videohovoru
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101130.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101130.txt
new file mode 100644
index 0000000000..1ea00cbbb9
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: aktualizace hlavně kvůli stabilitě a opravám chyb
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101140.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101140.txt
new file mode 100644
index 0000000000..09f0da7763
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: oprava chyby ohledně šifrovaných zpráv
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt b/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt
new file mode 100644
index 0000000000..e82655d352
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: implementace hlasových zpráv dosupných v rámci laboratoře.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/cs-CZ/full_description.txt b/fastlane/metadata/android/cs-CZ/full_description.txt
new file mode 100644
index 0000000000..d169c077e1
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/full_description.txt
@@ -0,0 +1,39 @@
+Element je zabezpečený komunikátor a zároveň aplikace pro týmovou spolupráci, která je ideální pro skupinové chaty při práci na dálku. Tato chatovací aplikace využívá end-to-end šifrování a poskytuje výkonné videokonference, sdílení souborů a hlasové hovory.
+
+Mezi funkce aplikace Element patří:
+- Pokročilé nástroje pro online komunikaci
+- Plně šifrované zprávy umožňující bezpečnější firemní komunikaci i pro pracovníky na dálku
+- Decentralizovaný chat založený na open source frameworku Matrix
+- Bezpečné sdílení souborů se šifrovanými daty při správě projektů
+- Videochaty s funkcí Voice over IP a sdílením obrazovky
+- Snadná integrace s oblíbenými nástroji pro online spolupráci, nástroji pro správu projektů, službami VoIP a dalšími aplikacemi pro týmovou komunikaci
+
+Element se zcela liší od ostatních aplikací pro zasílání zpráv a spolupráci. Funguje na platformě Matrix, otevřené síti pro bezpečné zasílání zpráv a decentralizovanou komunikaci. Umožňuje vlastní hostování, aby uživatelé měli maximální vlastnictví a kontrolu nad svými daty a zprávami.
+
+Soukromí a šifrované zprávy
+Element vás chrání před nežádoucími reklamami, vytěžováním dat a tzv. walled gardens. Zabezpečuje také všechna vaše data, video a hlasovou komunikaci jeden na jednoho prostřednictvím šifrování end-to-end a křížového ověřování zařízení.
+
+Element vám dává kontrolu nad vaším soukromím a zároveň vám umožňuje bezpečně komunikovat s kýmkoli v síti Matrix nebo s dalšími nástroji pro firemní spolupráci díky integraci s aplikacemi, jako je Slack.
+
+Element lze hostovat samostatně
+Abyste měli větší kontrolu nad svými citlivými daty a konverzacemi, může být Element hostován na vlastním hardwaru nebo si můžete vybrat libovolného hostitele založeného na systému Matrix - standardu pro decentralizovanou komunikaci s otevřeným zdrojovým kódem. Element vám poskytuje soukromí, soulad se zásadami bezpečnosti a flexibilitu integrace.
+
+Vlastněte svá data
+Sami rozhodujete, kde budou vaše data a zprávy uloženy. Bez rizika vytěžování dat nebo přístupu třetích stran.
+
+Element vám dává kontrolu různými způsoby:
+1. Získejte bezplatný účet na veřejném serveru matrix.org, který hostují vývojáři Matrixu, nebo si vyberte z tisíců veřejných serverů hostovaných dobrovolníky.
+2. Vlastní hostování účtu spuštěním serveru na vlastní IT infrastruktuře.
+3. Zaregistrujte si účet na vlastním serveru tak, že si jednoduše předplatíte hostingovou platformu Element Matrix Services.
+
+Otevřené zasílání zpráv a spolupráce
+Můžete chatovat s kýmkoli v síti Matrix, ať už používá aplikaci Element, jinou aplikaci podporující protokol Matrix nebo dokonce i když používá jinou aplikaci pro zasílání zpráv.
+
+Superbezpečné
+Skutečné end-to-end šifrování (zprávy mohou dešifrovat pouze účastníci konverzace) a křížové ověřování zařízení.
+
+Kompletní komunikace a integrace
+Zprávy, hlasové a videohovory, sdílení souborů, sdílení obrazovky a celá řada integrací, botů a widgetů. Vytvářejte místnosti, komunity, zůstaňte v kontaktu a spolupracujte.
+
+Navažte tam, kde jste skončili
+Zůstaňte v kontaktu, ať jste kdekoli, díky plně synchronizované historii zpráv ve všech zařízeních a na webu https://app.element.io
diff --git a/fastlane/metadata/android/cs-CZ/short_description.txt b/fastlane/metadata/android/cs-CZ/short_description.txt
new file mode 100644
index 0000000000..d14ac49efa
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/short_description.txt
@@ -0,0 +1 @@
+Skupinový messenger - šifrovaná komunikace, skupinový chat a video hovory
diff --git a/fastlane/metadata/android/cs-CZ/title.txt b/fastlane/metadata/android/cs-CZ/title.txt
new file mode 100644
index 0000000000..2fedfecb15
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/title.txt
@@ -0,0 +1 @@
+Element - bezpečný messenger
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100100.txt b/fastlane/metadata/android/de-DE/changelogs/40100100.txt
new file mode 100644
index 0000000000..2faf4b5d39
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Diese neue Version enthält hauptsächlich Fehlerkorrekturen und Verbesserungen. Nachrichten verschicken geht jetzt viel schneller.
+Vollständige Versionshinweise: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100110.txt b/fastlane/metadata/android/de-DE/changelogs/40100110.txt
new file mode 100644
index 0000000000..120f04a3f9
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Diese neue Version enthält hauptsächlich Verbesserungen der Benutzeroberfläche und der Handhabung. Du kannst jetzt ganz schnell Freunde einladen und DMs erstellen, indem du schlicht einen QR-Code scannst.
+Vollständige Versionshinweise: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100120.txt b/fastlane/metadata/android/de-DE/changelogs/40100120.txt
new file mode 100644
index 0000000000..305329ff8c
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: URL-Vorschau, neue Emoji-Tastatur, neue Raumeinstellungen und Schnee für Weihnachten!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100130.txt b/fastlane/metadata/android/de-DE/changelogs/40100130.txt
new file mode 100644
index 0000000000..142003d607
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: URL-Vorschau, neue Emoji-Tastatur, neue Raumeinstellungen und Schnee für Weihnachten!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100140.txt b/fastlane/metadata/android/de-DE/changelogs/40100140.txt
new file mode 100644
index 0000000000..1e4725411b
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Bearbeiten von Raumberechtigungen, automatisches Hell/Dunkel-Design und eine Reihe von Fehlerkorrekturen.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100150.txt b/fastlane/metadata/android/de-DE/changelogs/40100150.txt
new file mode 100644
index 0000000000..f3335da144
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Unterstützung für soziale Anmeldungen.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100160.txt b/fastlane/metadata/android/de-DE/changelogs/40100160.txt
new file mode 100644
index 0000000000..1c4ce91ae2
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Unterstützung für soziale Anmeldungen.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/de-DE/changelogs/40100170.txt b/fastlane/metadata/android/de-DE/changelogs/40100170.txt
new file mode 100644
index 0000000000..2ea20cf3ce
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Fehlerkorrekturen
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101000.txt b/fastlane/metadata/android/de-DE/changelogs/40101000.txt
new file mode 100644
index 0000000000..03a85ba86a
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: VoIP-Verbesserung (Audio- und Video-Anrufe in Direktnachrichten) und Fehlerkorrekturen!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101010.txt b/fastlane/metadata/android/de-DE/changelogs/40101010.txt
new file mode 100644
index 0000000000..59758edcc9
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Leistungsverbesserungen und Fehlerbehebungen!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101020.txt b/fastlane/metadata/android/de-DE/changelogs/40101020.txt
new file mode 100644
index 0000000000..32fabf7c2f
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Leistungsverbesserung und Fehlerbehebungen!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101030.txt b/fastlane/metadata/android/de-DE/changelogs/40101030.txt
new file mode 100644
index 0000000000..7e6dc25033
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Leistungsverbesserung und Fehlerbehebungen!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101040.txt b/fastlane/metadata/android/de-DE/changelogs/40101040.txt
new file mode 100644
index 0000000000..eaa8db1409
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Leistungsverbesserung und Fehlerbehebungen!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101050.txt b/fastlane/metadata/android/de-DE/changelogs/40101050.txt
new file mode 100644
index 0000000000..de6352961a
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Wichtige Fehlerbehebungen für 1.1.4!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101060.txt b/fastlane/metadata/android/de-DE/changelogs/40101060.txt
new file mode 100644
index 0000000000..775c016b3d
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Wichtige Fehlerbehebungen für 1.1.5!
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101070.txt b/fastlane/metadata/android/de-DE/changelogs/40101070.txt
new file mode 100644
index 0000000000..757475a44d
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Hauptänderungen in dieser Version: Mit Spaces kannst du deine Räume gruppieren (Beta). Videos können vor dem Senden komprimiert werden.
+Die vollständige Änderungsliste gibt es hier: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101080.txt b/fastlane/metadata/android/de-DE/changelogs/40101080.txt
new file mode 100644
index 0000000000..3609fb7078
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Hauptänderung: Verbesserung für Spaces.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101090.txt b/fastlane/metadata/android/de-DE/changelogs/40101090.txt
new file mode 100644
index 0000000000..1a957862ab
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Hauptänderung in dieser Version: Füge Unterstützung für gitter.im-Netzwerk hinzu
+Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101100.txt b/fastlane/metadata/android/de-DE/changelogs/40101100.txt
new file mode 100644
index 0000000000..04f944cdcf
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101100.txt
@@ -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
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101110.txt b/fastlane/metadata/android/de-DE/changelogs/40101110.txt
new file mode 100644
index 0000000000..8e115469e1
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101110.txt
@@ -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
diff --git a/fastlane/metadata/android/de-DE/changelogs/40101140.txt b/fastlane/metadata/android/de-DE/changelogs/40101140.txt
new file mode 100644
index 0000000000..75732a5364
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Hauptänderung dieser Version: Beheben eines Problems mit verschlüsselten Nachrichten.
+Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt
new file mode 100644
index 0000000000..30eb153ee9
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/full_description.txt
@@ -0,0 +1,39 @@
+Element ist ein sicherer Messenger und ideal für die produktive Zusammenarbeit mit Ihrem Team im Homeoffice. Mit eingebauter Ende-zu-Ende-Verschlüsselung ermöglicht Element auch umfangreiche und sichere Videokonferenzen, das Teilen von Dateien, Sprachanrufe und vieles mehr.
+
+Element bietet folgende Funktionen:
+- Fortschrittliche Werkzeuge für die Online-Kommunikation
+- Vollständig verschlüsselte Nachrichten, um eine sichere Kommunikation innerhalb und außerhalb von Unternehmen zu ermöglichen
+- Dezentralisierte Chats, basierend auf dem quelloffenen Matrix-Protokoll
+- Sichere und kontrollierte Dateifreigabe durch verschlüsselte Daten beim Verwalten von Projekten
+- Videochats mit VoIP und Bildschirmübertragung
+- Einfache Einbindung in Ihre bevorzugten Online-Kollaborations- und Projektverwaltungswerkzeuge, VoIP-Dienste und andere Kommunikationsapps für Ihr Team
+
+Element unterscheidet sich grundlegend von anderen Kommunikations- und Kollaborationsapps. Es läuft auf Matrix, einem offenen Netzwerk für sichere und dezentralisierte Kommunikation. Es erlaubt Nutzern ihre eigene Infrastruktur zu betreiben und gibt ihnen damit vollständige Kontrolle und Besitz über ihre eigenen Daten und Nachrichten.
+
+Privatsphäre/Datenschutz und verschlüsselte Kommunikation
+Element schützt Sie vor unerwünschter Werbung, dem Datensammeln und geschlossenen Plattformen. Auch schützt es all Ihre Daten, Ihre Video- und Sprachkommunikation mittels Ende-zu-Ende-Verschlüsselung und durch das Quersignieren von Geräten zur Verifizierung.
+
+Element gibt Ihnen volle Kontrolle über Ihre Privatsphäre und ermöglicht es Ihnen zugleich, mit jedem im Matrix-Netzwerk sicher zu kommunizieren - oder auch auf anderen geschäftlichen Kollaborationswerkzeugen, zum Beispiel durch das Einbinden von Apps wie Slack.
+
+Element kann man selber betreiben
+Um mehr Kontrolle über Ihre sensiblen Daten und Konversationen zu ermöglichen, kann man Element selbst betreiben, oder Sie wählen irgendeinen Matrix-basierten Dienst - der Standard für quelloffene, dezentralisierte Kommunikation. Element gibt Ihnen Privatsphäre, Sicherheitskonformität und Flexibilität für Integrationen.
+
+Besitzen Sie Ihre Daten
+Sie entscheiden, wo Sie Ihre Daten und Nachrichten aufbewahren - ohne das Datensammeln oder den Zugriff Dritter zu riskieren.
+
+Element gibt Ihnen auf verschiedene Arten Kontrolle:
+1. Sie können sich kostenlos auf dem öffentlichen matrix.org-Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder einen von Tausenden öffentlichen Servern, die von Freiwilligen betrieben werden, auswählen
+2. Sie haben die Möglichkeit, ein Konto auf einem eigenen Server in der eigenen IT-Infrastruktur betreiben
+3. Außerdem können Sie durch ein Abonnement der Element Matrix Services ein Konto auf einem für Sie maßgeschneiderten Server erstellen
+
+Offene Kommunikation und Zusammenarbeit
+Sie können mit jedem im Matrix-Netzwerk chatten, egal ob ihr Kontakt Element, eine andere Matrix-App oder sogar eine völlig andere Anwendung nutzt.
+
+Super sicher
+Durch Ende-zu-Ende-Verschlüsselung können nur die Personen, die in der Unterhaltung sind, die Nachrichten lesen. Außerdem stellt die Verifizierung mittels Quersignierung sicher, dass Sie wirklich mit dem Chatten, mit dem Sie glauben - und niemand Anderem.
+
+Vollständige Kommunikation und Integration
+Kurznachrichten, Sprach- und Videoanrufe, Dateifreigaben, Bildschirmübertragungen und einer Menge an Integrationen, Bots und Widgets. Schaffen Sie Räume und Communities, bleiben Sie auf dem Laufenden und erledigen Sie Sachen.
+
+Da Weitermachen, wo Sie aufgehört haben
+Bleiben Sie in Kontakt, egal wo Sie sind, mit vollständig synchronisiertem Nachrichtenverlauf quer über all Ihre Geräte und im Netz auf https://app.element.io
diff --git a/fastlane/metadata/android/de-DE/short_description.txt b/fastlane/metadata/android/de-DE/short_description.txt
new file mode 100644
index 0000000000..d27bd3ef12
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/short_description.txt
@@ -0,0 +1 @@
+Gruppen-Messenger - verschlüsselte Kommunikation, Gruppenchat und Videoanrufe
diff --git a/fastlane/metadata/android/de-DE/title.txt b/fastlane/metadata/android/de-DE/title.txt
new file mode 100644
index 0000000000..6304f37925
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/title.txt
@@ -0,0 +1 @@
+Element - Sicherer Messenger
diff --git a/fastlane/metadata/android/de/full_description.txt b/fastlane/metadata/android/de/full_description.txt
deleted file mode 100644
index 133f5e10d4..0000000000
--- a/fastlane/metadata/android/de/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element ist eine neuartige Messaging- und Kollaborationsapp:
-
-1. Volle Kontrolle über deine Privatssphäre
-2. Kommuniziere mit jedem aus dem Matrix-Netzwerk und mit der Integration von z.B. Slack sogar über Matrix hinaus
-3. Schutz vor Werbung, Datamining und geschlossenen Platformen
-4. Absicherung durch Ende-zu-Ende-Verschlüsselung, und Cross Signing um andere zu verifizieren
-
-Element unterscheidet sich durch Dezentralität und Open Source deutlich von anderen Messaging- und Kollaborationsapps.
-
-Element ermöglicht es einen eigenen Server zu betreiben - oder einen beliebigen auszuwählen, sodass du nicht nur Privatssphäre gewinnst, sondern auch deine Daten und Konversationen in deiner Hand sind und du sie kontrollieren kannst. Du hast Zugriff auf ein offenes Netzwerk, und kannst daher nicht nur mit Element-Nutzern schreiben. Und es ist sehr sicher.
-
-Element ist zu all diesem in der Lage, weil es Matrix nutzt - einen Standard für offene, dezentrale Kommunikation.
-
-Element gibt dir die Kontrolle, indem es dir die Wahl darüber lässt, wer deine Konversationen hostet. In der Element App kannst du zwischen verschiedenen Möglichkeiten auswählen:
-
-1. Kostenlos auf dem öffentlichen matrix.org Server registrieren, der von den Matrix-Entwicklern gehostet wird, oder wähle aus Tausenden von öffentlichen Servern, die von Freiwilligen gehostet werden
-2. Einen Account auf einem eigenen Server auf eigener Hardware betreiben
-3. Einen Account auf einem benutzerdefinierten Server erstellen, zum Beispiel durch ein Abonnment bei der Element Matrix Services Hosting-Platform
-
-Wieso Element nutzen?
-
-BESITZE DEINE DATEN: Du entscheidest wo deine Daten und Nachrichten gespeichert werden. Du besitzt und kontrollierst sie, anstatt ein Großkonzern, der deine Daten analysiert und Dritten Zugriff gibt.
-
-OFFENE KOMMUNIKATION UND KOLLABORATION: Du kannst mit jedem im Matrix-Netzwerk schreiben, ob sie nun Element oder eine andere Matrix-App nutzen, oder gar ein anderes Kommunikationssystem wie z.B. Slack, IRC oder XMPP.
-
-SUPER SICHER: Echte Ende-zu-Ende-Verschlüsselung (nur Personen in der Konversation können die Nachrichten entschlüsseln), und Cross Signing um die Geräte der anderen Personen zu verifizieren.
-
-VOLLSTÄNDIGE KOMMUNIKATION: Nachrichten, Telefonate und Videoanrufe, Teilen von Dateien oder dem eigenen Bildschirm und viele andere Integrationen, Bots und Widgets. Erstelle Räume, Communities, bleib in Kontakt und sei produktiv.
-
-ÜBERALL WO DU BIST: Bleib in Kontakt wo auch immer du bist - mit einem vollständig synchronisierten Nachrichtenverlauf über alle Geräte und im Web auf https://app.element.io.
diff --git a/fastlane/metadata/android/de/short_description.txt b/fastlane/metadata/android/de/short_description.txt
deleted file mode 100644
index 0ffacfd8d9..0000000000
--- a/fastlane/metadata/android/de/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Sicherer dezentraler Chat & Telefonie. Schütze deine Daten vor Dritten.
diff --git a/fastlane/metadata/android/de/title.txt b/fastlane/metadata/android/de/title.txt
deleted file mode 100644
index ec25e8a631..0000000000
--- a/fastlane/metadata/android/de/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (zuvor Riot.im)
diff --git a/fastlane/metadata/android/en-US/changelogs/40100130.txt b/fastlane/metadata/android/en-US/changelogs/40100130.txt
index 39715c2910..dc517fac48 100644
--- a/fastlane/metadata/android/en-US/changelogs/40100130.txt
+++ b/fastlane/metadata/android/en-US/changelogs/40100130.txt
@@ -1,2 +1,2 @@
Main changes in this version: URL Preview, new Emoji keyboard, new room settings capabilities, and snow for Christmas!
-Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.0.12
\ No newline at end of file
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.0.13
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40100140.txt b/fastlane/metadata/android/en-US/changelogs/40100140.txt
new file mode 100644
index 0000000000..74f609fa15
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Edit room permissions, automatic light/dark theme, and a bunch of bug fixes.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.0.14
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40100150.txt b/fastlane/metadata/android/en-US/changelogs/40100150.txt
new file mode 100644
index 0000000000..c3e10cefbd
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Social Login support.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.0.15
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40100160.txt b/fastlane/metadata/android/en-US/changelogs/40100160.txt
new file mode 100644
index 0000000000..539ddbe63a
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Social Login support.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40100170.txt b/fastlane/metadata/android/en-US/changelogs/40100170.txt
new file mode 100644
index 0000000000..b787c01b05
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.0.17
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101000.txt b/fastlane/metadata/android/en-US/changelogs/40101000.txt
new file mode 100644
index 0000000000..ef64bd99a5
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Main changes in this version: VoIP (audio and video calls in DM) improvement and bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.0
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101010.txt b/fastlane/metadata/android/en-US/changelogs/40101010.txt
new file mode 100644
index 0000000000..e411a6889c
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Main changes in this version: performance improvement and bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.1
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101020.txt b/fastlane/metadata/android/en-US/changelogs/40101020.txt
new file mode 100644
index 0000000000..8146712593
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Main changes in this version: performance improvement and bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.2
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101030.txt b/fastlane/metadata/android/en-US/changelogs/40101030.txt
new file mode 100644
index 0000000000..22d116fbfe
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Main changes in this version: performance improvement and bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.3
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101040.txt b/fastlane/metadata/android/en-US/changelogs/40101040.txt
new file mode 100644
index 0000000000..e8977f3211
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Main changes in this version: performance improvement and bug fixes!
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.4
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101050.txt b/fastlane/metadata/android/en-US/changelogs/40101050.txt
new file mode 100644
index 0000000000..917dbee284
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Main changes in this version: hot fixes for 1.1.4
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.5
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101060.txt b/fastlane/metadata/android/en-US/changelogs/40101060.txt
new file mode 100644
index 0000000000..6d895542eb
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Main changes in this version: hot fixes for 1.1.5
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.6
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101070.txt b/fastlane/metadata/android/en-US/changelogs/40101070.txt
new file mode 100644
index 0000000000..254e4c0f62
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Main changes in this version: beta support for Spaces. Compress video before sending.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.7
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101080.txt b/fastlane/metadata/android/en-US/changelogs/40101080.txt
new file mode 100644
index 0000000000..f94a332ec3
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Main changes in this version: improvement for Spaces.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.8
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101090.txt b/fastlane/metadata/android/en-US/changelogs/40101090.txt
new file mode 100644
index 0000000000..a5a4e14a29
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Main changes in this version: add support for gitter.im network.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.9
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101100.txt b/fastlane/metadata/android/en-US/changelogs/40101100.txt
new file mode 100644
index 0000000000..30543cb102
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+Main changes in this version: theme and style update and new features for spaces.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.10
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101110.txt b/fastlane/metadata/android/en-US/changelogs/40101110.txt
new file mode 100644
index 0000000000..cb3e85d6c0
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+Main changes in this version: theme and style update and new features for spaces (bugfix for 1.1.10)
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.11
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101120.txt b/fastlane/metadata/android/en-US/changelogs/40101120.txt
new file mode 100644
index 0000000000..6118974777
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Main changes in this version: theme and style update and fix a crash after video call
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.12
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101130.txt b/fastlane/metadata/android/en-US/changelogs/40101130.txt
new file mode 100644
index 0000000000..9fc3f23b3e
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101130.txt
@@ -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
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101140.txt b/fastlane/metadata/android/en-US/changelogs/40101140.txt
new file mode 100644
index 0000000000..ee04069968
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Main changes in this version: fix an issue about encrypted messages.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.14
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101150.txt b/fastlane/metadata/android/en-US/changelogs/40101150.txt
new file mode 100644
index 0000000000..321d78b21d
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Main changes in this version: voice message implementation under labs settings.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.15
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40101160.txt b/fastlane/metadata/android/en-US/changelogs/40101160.txt
new file mode 100644
index 0000000000..54b6cbee97
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40101160.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Fix error when sending encrypted message if someone in the room logs out.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.16
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/changelogs/40102000.txt b/fastlane/metadata/android/en-US/changelogs/40102000.txt
new file mode 100644
index 0000000000..46d9b07809
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40102000.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Voice Message is enabled by default.
+Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.1.16
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
index e939b75bb7..853885944c 100644
--- a/fastlane/metadata/android/en-US/full_description.txt
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -1,30 +1,39 @@
-Element is a new type of messenger and collaboration app that:
+Element is both a secure messenger and a productivity team collaboration app that is ideal for group chats while remote working. This chat app uses end-to-end encryption to provide powerful video conferencing, file sharing and voice calls.
-1. Puts you in control to preserve your privacy
-2. Lets you communicate with anyone in the Matrix network, and even beyond by integrating with apps such as Slack
-3. Protects you from advertising, datamining and walled gardens
-4. Secures you through end-to-end encryption, with cross-signing to verify others
+Element’s features include:
+- Advanced online communication tools
+- Fully encrypted messages to allow safer corporate communication, even for remote workers
+- Decentralized chat based on the Matrix open source framework
+- File sharing securely with encrypted data while managing projects
+- Video chats with Voice over IP and screen sharing
+- Easy integration with your favourite online collaboration tools, project management tools, VoIP services and other team messaging apps
-Element is completely different from other messaging and collaboration apps because it is decentralised and open source.
+Element is completely different from other messaging and collaboration apps. It operates on Matrix, an open network for secure messaging and decentralized communication. It allows self-hosting to give users maximum ownership and control of their data and messages.
-Element lets you self-host - or choose a host - so that you have privacy, ownership and control of your data and conversations. It gives you access to an open network; so you’re not just stuck speaking to other Element users only. And it is very secure.
+Privacy and encrypted messaging
+Element protects you from unwanted ads, data mining and walled gardens. It also secures all your data, one-to-one video and voice communication through end-to-end encryption and cross-signed device verification.
-Element is able to do all this because it operates on Matrix - the standard for open, decentralised communication.
+Element gives you control over your privacy while allowing you to communicate securely with anyone on the Matrix network, or other business collaboration tools by integrating with apps such as Slack.
-Element puts you in control by letting you choose who hosts your conversations. From the Element app, you can choose to host in different ways:
+Element can be self-hosted
+To allow more control of your sensitive data and conversations, Element can be self-hosted or you can choose any Matrix-based host - the standard for open source, decentralized communication. Element gives you privacy, security compliance and integration flexibility.
+Own your data
+You decide where to keep your data and messages. Without the risk of data mining or access from third parties.
+
+Element puts you in control in different ways:
1. Get a free account on the matrix.org public server hosted by the Matrix developers, or choose from thousands of public servers hosted by volunteers
-2. Self-host your account by running a server on your own hardware
+2. Self-host your account by running a server on your own IT infrastructure
3. Sign up for an account on a custom server by simply subscribing to the Element Matrix Services hosting platform
-Why choose Element?
+Open messaging and collaboration
+You can chat with anyone on the Matrix network, whether they’re using Element, another Matrix app or even if they are using a different messaging app.
-OWN YOUR DATA: You decide where to keep your data and messages. You own it and control it, not some MEGACORP that mines your data or gives access to third parties.
+Super secure
+Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signed device verification.
-OPEN MESSAGING AND COLLABORATION: You can chat with anyone else in the Matrix network, whether they’re using Element or another Matrix app, and even if they are using a different messaging system of the likes of Slack, IRC or XMPP.
+Complete communication and integration
+Messaging, voice and video calls, file sharing, screen sharing and a whole bunch of integrations, bots and widgets. Build rooms, communities, stay in touch and get things done.
-SUPER-SECURE: Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signing to verify the devices of conversation participants.
-
-COMPLETE COMMUNICATION: Messaging, voice and video calls, file sharing, screen sharing and a whole bunch of integrations, bots and widgets. Build rooms, communities, stay in touch and get things done.
-
-EVERYWHERE YOU ARE: Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io.
+Pick up where you left off
+Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
index 023b366c9a..5a98f6f772 100644
--- a/fastlane/metadata/android/en-US/short_description.txt
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -1 +1 @@
-Secure decentralised chat & VoIP. Keep your data safe from third parties.
\ No newline at end of file
+Group messenger - encrypted messaging, group chat and video calls
\ No newline at end of file
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
index 039da1fc3b..12fa89b99b 100644
--- a/fastlane/metadata/android/en-US/title.txt
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -1 +1 @@
-Element (previously Riot.im)
\ No newline at end of file
+Element - Secure Messenger
\ No newline at end of file
diff --git a/fastlane/metadata/android/de/changelogs/40100100.txt b/fastlane/metadata/android/es-ES/changelogs/40100100.txt
similarity index 100%
rename from fastlane/metadata/android/de/changelogs/40100100.txt
rename to fastlane/metadata/android/es-ES/changelogs/40100100.txt
diff --git a/fastlane/metadata/android/es/full_description.txt b/fastlane/metadata/android/es-ES/full_description.txt
similarity index 100%
rename from fastlane/metadata/android/es/full_description.txt
rename to fastlane/metadata/android/es-ES/full_description.txt
diff --git a/fastlane/metadata/android/es/short_description.txt b/fastlane/metadata/android/es-ES/short_description.txt
similarity index 100%
rename from fastlane/metadata/android/es/short_description.txt
rename to fastlane/metadata/android/es-ES/short_description.txt
diff --git a/fastlane/metadata/android/es/title.txt b/fastlane/metadata/android/es-ES/title.txt
similarity index 100%
rename from fastlane/metadata/android/es/title.txt
rename to fastlane/metadata/android/es-ES/title.txt
diff --git a/fastlane/metadata/android/es/changelogs/40100100.txt b/fastlane/metadata/android/es/changelogs/40100100.txt
deleted file mode 100644
index 70b786d12e..0000000000
--- a/fastlane/metadata/android/es/changelogs/40100100.txt
+++ /dev/null
@@ -1 +0,0 @@
-// TODO
diff --git a/fastlane/metadata/android/et/changelogs/40100100.txt b/fastlane/metadata/android/et/changelogs/40100100.txt
new file mode 100644
index 0000000000..11a040ceb0
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Selles uues versioonis leidub põhiliselt veaparandusi ja pisikohendusi. Sõnumite saatmine on nüüd märkatavalt kiirem.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/et/changelogs/40100110.txt b/fastlane/metadata/android/et/changelogs/40100110.txt
new file mode 100644
index 0000000000..019a84a2be
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Uues versioonis leidub põhiliselt kasutajaliidese ning kasutajakogemuse parandusi. Nüüd saad sõpradele kutseid saata ning otsevestlusi alustada QR-koodi lugemise abil.
+Kõik muudatused: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/et/changelogs/40100120.txt b/fastlane/metadata/android/et/changelogs/40100120.txt
new file mode 100644
index 0000000000..583bc3fc42
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Olulisemad muutused selles versioonis: URLide eelvaade, uus klahvistik emojide jaoks, jututubade uued seadistused ja natuke lund jõuludeks!
+Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/et/changelogs/40100130.txt b/fastlane/metadata/android/et/changelogs/40100130.txt
new file mode 100644
index 0000000000..0dae99a63e
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Olulisemad muutused selles versioonis: URLide eelvaade, uus klahvistik emojide jaoks, jututubade uued seadistused ja natuke lund jõuludeks!
+Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/et/changelogs/40100140.txt b/fastlane/metadata/android/et/changelogs/40100140.txt
new file mode 100644
index 0000000000..88b6fa56cd
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Olulisemad muutused selles versioonis: Jututoa õiguste muutmine, automaatne tumeda ja heleda teema vahetamine ning märgatav kogus veaparandusi.
+Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/et/changelogs/40100150.txt b/fastlane/metadata/android/et/changelogs/40100150.txt
new file mode 100644
index 0000000000..5df920b96c
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Olulisemad muutused selles versioonis: Sisselogimine sotsiaalmeediakontode abil.
+Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/et/changelogs/40100160.txt b/fastlane/metadata/android/et/changelogs/40100160.txt
new file mode 100644
index 0000000000..902394552a
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Olulisemad muutused selles versioonis: Sisselogimine sotsiaalmeediakontode abil.
+Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.0.15 ja https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/et/changelogs/40100170.txt b/fastlane/metadata/android/et/changelogs/40100170.txt
new file mode 100644
index 0000000000..3c565c011c
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Olulisemad muutused selles versioonis: Veaparandused!
+Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/et/changelogs/40101000.txt b/fastlane/metadata/android/et/changelogs/40101000.txt
new file mode 100644
index 0000000000..4d3facffc8
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Olulisemad muutused selles versioonis: Heli- ja videokõnede parandused otsevestluses ning üldised veaparandused!
+Muudatuste logi täismahus: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/et/changelogs/40101010.txt b/fastlane/metadata/android/et/changelogs/40101010.txt
new file mode 100644
index 0000000000..4db2c52cb0
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: jõudluse parandused ja pisikohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/et/changelogs/40101020.txt b/fastlane/metadata/android/et/changelogs/40101020.txt
new file mode 100644
index 0000000000..5f34bb579f
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: jõudluse parandused ja pisikohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/et/changelogs/40101030.txt b/fastlane/metadata/android/et/changelogs/40101030.txt
new file mode 100644
index 0000000000..5a558d911a
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: jõudluse parandused ja pisikohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/et/changelogs/40101040.txt b/fastlane/metadata/android/et/changelogs/40101040.txt
new file mode 100644
index 0000000000..2e7849db9e
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: jõudluse parandused ja pisikohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/et/changelogs/40101050.txt b/fastlane/metadata/android/et/changelogs/40101050.txt
new file mode 100644
index 0000000000..9aa2f4e10c
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: kiirparandused versioon 1.1.4 jaoks.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/et/changelogs/40101060.txt b/fastlane/metadata/android/et/changelogs/40101060.txt
new file mode 100644
index 0000000000..0577bf452d
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: kiirparandused versioon 1.1.5 jaoks.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/et/changelogs/40101070.txt b/fastlane/metadata/android/et/changelogs/40101070.txt
new file mode 100644
index 0000000000..8ef65a7396
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Põhilised muudatused selles versioonis: beeta-versioon kogukonnakeskustest ja videofailide pakkimine enne üleslaadimist.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/et/changelogs/40101080.txt b/fastlane/metadata/android/et/changelogs/40101080.txt
new file mode 100644
index 0000000000..6fa09b30a7
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: kogukonnakeskuste täiendused
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/et/changelogs/40101090.txt b/fastlane/metadata/android/et/changelogs/40101090.txt
new file mode 100644
index 0000000000..f354f7f320
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: liidestus gitter.im võrguga.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/et/changelogs/40101100.txt b/fastlane/metadata/android/et/changelogs/40101100.txt
new file mode 100644
index 0000000000..e00e6de393
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101100.txt
@@ -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
diff --git a/fastlane/metadata/android/et/changelogs/40101110.txt b/fastlane/metadata/android/et/changelogs/40101110.txt
new file mode 100644
index 0000000000..a4629c92d0
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101110.txt
@@ -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
diff --git a/fastlane/metadata/android/et/changelogs/40101120.txt b/fastlane/metadata/android/et/changelogs/40101120.txt
new file mode 100644
index 0000000000..c43e8f47b5
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: teemade ja välimuse uuendused ning videokõne-järgse kokkujooksmise parandused
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/et/changelogs/40101130.txt b/fastlane/metadata/android/et/changelogs/40101130.txt
new file mode 100644
index 0000000000..4305a66770
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: üldiste vigade parandus.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/et/changelogs/40101140.txt b/fastlane/metadata/android/et/changelogs/40101140.txt
new file mode 100644
index 0000000000..5e16cad97b
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: krüptitud sõnumitega seotud vigade parandus
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/et/changelogs/40101150.txt b/fastlane/metadata/android/et/changelogs/40101150.txt
new file mode 100644
index 0000000000..caab68c89f
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: häälsõnumid katsete all.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/et/full_description.txt b/fastlane/metadata/android/et/full_description.txt
index 7c7f7195a8..ee0adef9ac 100644
--- a/fastlane/metadata/android/et/full_description.txt
+++ b/fastlane/metadata/android/et/full_description.txt
@@ -1,30 +1,39 @@
-Element on uut tüüpi suhtlus- ja koostöörakendus, mis:
+Element on nii suhtlus- ja koostöörakendus, mis sobib ideaalselt rühmavestlusteks kaugtöö ajal. Läbiv krüptimine on kasutusel sõnumivahetuseks, videokõnedeks, häälkõnedeks ja failide jagamiseks.
-1. Võimaldab täielikku kontrolli privaatsuse üle
-2. Võimaldab suhelda kõigiga Matrixi võrgus ja isegi väljaspool seda, olles integreeritud selliste rakendustega nagu Slack
-3. Kaitseb sind reklaamide ja andmekogumise eest
-4. Tagab turvalisuse läbiva krüptimise abil, kasutades risttunnustamist vestlejate tuvastamiseks
+Element pakub muu hulgas selliseid võimalusi
+- moodsad võrgupõhised suhtlusvahendid
+- läbivalt krüptitud sõnumid võimaldavad turvalist suhtlust, sealhulgas kaugtöötajatega
+- Matrix'i protokollil põhinev hajutatud suhtlusvõrk
+- projektide jaoks vajalike failide jagamine turvaliselt ja krüptitult
+- VoIP'i põhised videokõned ja ekraani jagamine
+- lihtne lõimimine harjumispäraste võrgupõhiste koostöövahenditega, projektihalduse rakendustega, VoIP-teenustega ja muude ühistöörakendustega
-Element erineb täielikult teistest sõnumside- ja koostöörakendustest, kuna see on detsentraliseeritud ja avatud lähtekoodiga.
+Element erineb teistest sõnumi- ja koostöörakendustest. Tema aluseks on Matrix - avatud võrk turvalise ja hajutatud suhtluse jaoks.
-Element võimaldab ise hostida - või valida hosti -, et oleks tagatud privaatsus ja kontroll oma andmete ja vestluste üle. Element annab ka juurdepääsu avatud võrgule, nii et te ei pea vaid Elemendi kasutajatega rääkima. Ning kogu süsteem on väga turvaline.
+Privaatsus ja krüptitud sõnumivahetus
+Element tagab, et sa ei ole seotud reklaamidega, andmekogumisega ja suletud süsteemidega. Kasutades läbivat krüptimist ja risttunnustamisel põhinevat verifitseerimist on sinu sõnumid, andmed, kahepoolsed videokõned ja häälkõned turvatud.
-Element töötab Matrixil - avatud, detsentraliseeritud suhtlus-standardil.
+Lubades suhelda turvaliselt ükspuha kellega Matrix'i võrgus või muude ärikeskondades kasutatavate koostöörakendustega nagu Slack, jätab Element sulle kontrolli oma privaatsuse üle.
-Võimaldades valida, kes vestlusi korraldab, annab Element annab kontrolli sinule. Rakendust Element saad kasutada mitmel viisil.
+Võid kasutada Element'i jaoks oma serverid
+Kui vajad suuremat kontrolli oma suhtluse ja andmete üle, siis võid kasutada oma serverit või tellida teenuse ükspuha missuguselt Matrix'i-teenuse pakkujalt. Matrix on standard avatud lähtekoodil põhineva detsentraliseeritud suhtluse jaoks.
-1. Tasuta konto Matrixi arendajate hostitud avalikus serveris matrix.org või vali tuhandete avalike serverite hulgast, mida haldavad vabatahtlikud
-2. Hosti oma kontot ise, paigaldades serveri oma riistvarale
-3. Registreeruge serveris olevale kontole, tellides Element Matrix Services teenuseplatvormi
+Andmed on Sinu omad
+Sina otsustad seda, kus hoiad oma sõnumeid ja andmeid. Ning seejuures puudub andmekaevandamise risk ja ligipääs kolmandatele osapooltele.
- Miks valida element?
+Element annab kontrolli sinule valikuga mitme võimaluse vahel:
+1. tasuta konto Matrix'i arendajate hostitud avalikus serveris matrix.org või vali tuhandete avalike serverite hulgast, mida haldavad vabatahtlikud
+2. hosti oma kontot ise, paigaldades serveri oma IT-taristule
+3. telli tasuline kasutajakonto Element Matrix Services teenuseplatvormilt
- KONTROLL ANDMETE ÜLE: otsustad ise, kus oma andmeid ja sõnumeid hoida. Need kuuluvad sulle ja sinu käes on kontroll, mitte mõne MEGAFIRMA käes, mis andmeid oma kasuks kaevandab või kolmandatele isikutele juurdepääsu annab.
+Avatud suhtlus ja koostöö
+Saad vestelda kõigi teistega Matrix'i võrgus, olenemata sellest, kas nad kasutavad Elementi või mõnda muud Matrixi rakendust ja isegi kui nad kasutavad mõnda teistsugust suhtlussüsteemi.
- AVATUD SUHTLUS JA KOOSTÖÖ : saad vestelda kõigi teistega Matrixi võrgus, olenemata sellest, kas nad kasutavad Elementi või mõnda muud Matrixi rakendust, ja isegi kui nad kasutavad teistsugust suhtlussüsteemi nagu Slack, IRC või XMPP.
+Üliturvaline
+Tõeline läbiv krüptimine (ainult vestluses osalejad saavad sõnumeid lugeda) ja risttunnustamine vestluses osalejate tuvastamiseks.
- ÜLITURVALINE : tõeline läbiv krüptimine (ainult vestluses osalejad saavad sõnumeid lugeda) ja risttunnustamine vestluses osalejate tuvastamiseks.
+Kõik suhtlusvõimalused
+Sõnumid, hääl- ja videokõned, failide jagamine, ekraani jagamine ja terve hulk lõiminguid, roboteid ja vidinaid. Loo tubasid, kogukondi, hoia ühendust ja saa asjad aetud.
- KÕIK SUHTLUSVÕIMALUSED: sõnumid, hääl- ja videokõned, failide jagamine, ekraani jagamine ja terve hulk lõiminguid, roboteid ja vidinaid. Loo tubasid, kogukondi, hoia ühendust ja saa asjad aetud.
-
- KÕIKJAL, KUS VIIBITE: saad suhelda kõigis oma seadmetes ja ka veebis aadressil https://app.element.io ning sealjuures täielikult sünkroonitud sõnumite ajalooga.
+Jätka sealt, kus pooleli jäid
+Saad suhelda kõigis oma seadmetes ja ka veebis aadressil https://app.element.io ning sealjuures täielikult sünkroonitud sõnumite ajalooga.
diff --git a/fastlane/metadata/android/et/short_description.txt b/fastlane/metadata/android/et/short_description.txt
index 4075c1f7cf..5352464a7a 100644
--- a/fastlane/metadata/android/et/short_description.txt
+++ b/fastlane/metadata/android/et/short_description.txt
@@ -1 +1 @@
-Turvalised ning hajutatud vestlused ja VoIP-kõned. Sinu suhtlus on üliturvaline.
+Vestlus- ja koostöörakendus: krüptitud sõnumid, rühmavestlused ja videokõned
diff --git a/fastlane/metadata/android/et/title.txt b/fastlane/metadata/android/et/title.txt
index f74f9ff18f..b0bf39ba23 100644
--- a/fastlane/metadata/android/et/title.txt
+++ b/fastlane/metadata/android/et/title.txt
@@ -1 +1 @@
-Element (varem Riot.im)
+Element - turvaline sõnumiklient
diff --git a/fastlane/metadata/android/fa/changelogs/40100100.txt b/fastlane/metadata/android/fa/changelogs/40100100.txt
index 6123bfc7fc..080d80a3ad 100644
--- a/fastlane/metadata/android/fa/changelogs/40100100.txt
+++ b/fastlane/metadata/android/fa/changelogs/40100100.txt
@@ -1 +1,2 @@
-// برای انجام
+این نگارش جدید به طور عمده شامل رفع اشکالها و بهبودها است. ارسال پیام اکنون بسیار سریعتر است.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/fa/changelogs/40100110.txt b/fastlane/metadata/android/fa/changelogs/40100110.txt
new file mode 100644
index 0000000000..c95922e2d7
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+این نگارش جدید به طور عمده شامل رابط کاربری و بهبود تجربه کاربر است. اکنون میتوانید با پویش کدهای QR دوستانتان را دعوت کرده و بسیار سریع پیام مستقیم ایجاد کنید.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/fa/changelogs/40100120.txt b/fastlane/metadata/android/fa/changelogs/40100120.txt
new file mode 100644
index 0000000000..511cdb49fa
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: پیشنمایش نشانی، صفحهکلید اموجی جدید، تنظیمهای اتاق جدید و برف برای کریسمس!
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/fa/changelogs/40100130.txt b/fastlane/metadata/android/fa/changelogs/40100130.txt
new file mode 100644
index 0000000000..d78c76e041
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: پیشنمایش نشانی، صفحهکلید اموجی جدید، تنظیمهای اتاق جدید و برف برای کریسمس!
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/fa/changelogs/40100140.txt b/fastlane/metadata/android/fa/changelogs/40100140.txt
new file mode 100644
index 0000000000..5defa284aa
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: ویرایش اجازههای اتاق، زمینهٔ تاریک/روشن خودکار و رفع دستهای از مشکلها.
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/fa/changelogs/40100150.txt b/fastlane/metadata/android/fa/changelogs/40100150.txt
new file mode 100644
index 0000000000..d856b3a252
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: پشتیبانی از ورود اجتماعی.
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/fa/changelogs/40100160.txt b/fastlane/metadata/android/fa/changelogs/40100160.txt
new file mode 100644
index 0000000000..4d8aea0cb6
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: پشتیبانی از ورود اجتماعی.
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.15 و https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/fa/changelogs/40100170.txt b/fastlane/metadata/android/fa/changelogs/40100170.txt
new file mode 100644
index 0000000000..6de164e57f
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: رفع مشکلها!
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/fa/changelogs/40101000.txt b/fastlane/metadata/android/fa/changelogs/40101000.txt
new file mode 100644
index 0000000000..6a3c154ae4
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: بهبود ویپ (تماسهای صوتی و تصویری در پیامهای مستقیم) و رفع مشکلها!
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/fa/changelogs/40101010.txt b/fastlane/metadata/android/fa/changelogs/40101010.txt
new file mode 100644
index 0000000000..8e29373452
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: بهبود عملکرد و رفع مشکلها!
+گزارش تغییر کامل: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/fa/changelogs/40101150.txt b/fastlane/metadata/android/fa/changelogs/40101150.txt
new file mode 100644
index 0000000000..46677551ef
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+تغییرات اصلی در این نگارش: پیادهسازی پیام صوتی در تنظیمات آزمایشگاهها.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/fa/full_description.txt b/fastlane/metadata/android/fa/full_description.txt
index 0a93676bbf..3051f491ba 100644
--- a/fastlane/metadata/android/fa/full_description.txt
+++ b/fastlane/metadata/android/fa/full_description.txt
@@ -23,7 +23,7 @@
پیامرسانی و همکاری باز: میتوانید با هرکسی در شبکهٔ ماتریکس گپ بزنید، چه از المنت استفاده کنند و چه از هر کارهٔ ماتریکس دیگری؛ و حتا اگر از سامانهٔ پیامرسانی متفاوتی مثل اسلک، آیآرسی یا جبر استفاده کنند.
-فوق امن: رمزنگاری سرتاسری واقعی (فقط کسانی که در گفتوگو هستند،میتوانند پیامها را رمزگشایی کنند) و ورود چندگانه برای تأیید هویت افزارههای شرکتکنندگان در گفتوگو.
+b>فوق امن: رمزنگاری سرتاسری واقعی (فقط کسانی که در گفتوگو هستند،میتوانند پیامها را رمزگشایی کنند) و ورود چندگانه برای تأیید هویت افزارههای شرکتکنندگان در گفتوگو.
ارتباط کامل: پیامرسانی، تماسهای صوتی و تصویری،همرسانی پرونده، همرسانی صفحه و یه عالمه یکپارچگی، بات و ابزارک. اتاق و اجتماع ساخته، در دسترس بوده و کارها را انجام دهید.
diff --git a/fastlane/metadata/android/fa/short_description.txt b/fastlane/metadata/android/fa/short_description.txt
index 4cfa767649..2925db47b7 100644
--- a/fastlane/metadata/android/fa/short_description.txt
+++ b/fastlane/metadata/android/fa/short_description.txt
@@ -1 +1 @@
-گپ و تماس نامتمرکز امن. دادههایتان را از شرکتها امن نگه دارید.
+پیامرسان گروهی - پیامرسانی رمزنگاشته، گپ گروهی و تماسهای ویدیویی
diff --git a/fastlane/metadata/android/fa/title.txt b/fastlane/metadata/android/fa/title.txt
index fb4ea4125e..96f2f9a9df 100644
--- a/fastlane/metadata/android/fa/title.txt
+++ b/fastlane/metadata/android/fa/title.txt
@@ -1 +1 @@
-المنت (ریوت سابق)
+المنت - پیامرسان امن
diff --git a/fastlane/metadata/android/fi/changelogs/40100100.txt b/fastlane/metadata/android/fi-FI/changelogs/40100100.txt
similarity index 100%
rename from fastlane/metadata/android/fi/changelogs/40100100.txt
rename to fastlane/metadata/android/fi-FI/changelogs/40100100.txt
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40100110.txt b/fastlane/metadata/android/fi-FI/changelogs/40100110.txt
new file mode 100644
index 0000000000..356eabd29b
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Tämä versio sisältää pääosin käyttöliittymä- ja käyttökokemusparannuksia. Voit nyt kutsua kavereita ja luoda yksityisviestejä nopeasti QR-koodeja lukemalla.
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40100120.txt b/fastlane/metadata/android/fi-FI/changelogs/40100120.txt
new file mode 100644
index 0000000000..cc47bb0ceb
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Tärkeimmät muutokset tässä versiossa: URL-esikatselu, uusi emoji-näppäimistö, uudet huoneasetukset ja lunta jouluksi!
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40100130.txt b/fastlane/metadata/android/fi-FI/changelogs/40100130.txt
new file mode 100644
index 0000000000..f96792957b
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Tärkeimmät muutokset tässä versiossa: URL-esikatselu, uusi emoji-näppäimistö, uudet huoneasetukset ja lunta jouluksi!
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40100140.txt b/fastlane/metadata/android/fi-FI/changelogs/40100140.txt
new file mode 100644
index 0000000000..b01b7e7325
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Tärkeimmät muutokset tässä versiossa: Huoneoikeuksien muokkaus, automaattinen valoisa/tumma teema ja läjäpäin virheenkorjauksia.
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40100150.txt b/fastlane/metadata/android/fi-FI/changelogs/40100150.txt
new file mode 100644
index 0000000000..6ae0b1abf4
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Tärkeimmät muutokset tässä versiossa: Social Login -tuki.
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40100160.txt b/fastlane/metadata/android/fi-FI/changelogs/40100160.txt
new file mode 100644
index 0000000000..ab143642a8
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Tärkeimmät muutokset tässä versiossa: Social Login -tuki.
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40100170.txt b/fastlane/metadata/android/fi-FI/changelogs/40100170.txt
new file mode 100644
index 0000000000..22a851b495
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Tärkeimmät muutokset tässä versiossa: Virheenkorjauksia!
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40101000.txt b/fastlane/metadata/android/fi-FI/changelogs/40101000.txt
new file mode 100644
index 0000000000..1b85b6d00d
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Suurimmat muutokset tässä versiossa: VoIP-parannuksia ja korjauksia (ääni- ja videopuhelut yksityiskeskusteluissa)
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/fi-FI/changelogs/40101010.txt b/fastlane/metadata/android/fi-FI/changelogs/40101010.txt
new file mode 100644
index 0000000000..c79023c148
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Suurimmat muutokset tässä versiossa: suorituskykyparannuksia ja bugikorjauksia!
+Täysi muutosloki: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/fi-FI/full_description.txt b/fastlane/metadata/android/fi-FI/full_description.txt
new file mode 100644
index 0000000000..ac02bc3b42
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/full_description.txt
@@ -0,0 +1,39 @@
+Element on turvallinen pikaviesti- ja tiimityösovellus joka sopii mainiosti ryhmäkeskusteluihin etätöissä. Sovellus käyttää päästä päähän -salausta ja tarjoaa videoneuvottelun, tiedostojen jakamisen ja äänipuhelut.
+
+Elementin ominaisuuksia:
+- Edistyneet viestintätyökalut
+- Turvallisempaa yritysviestintää täysin salatuilla viesteillä, myös etätyöntekijöille
+- Hajautettu keskustelu, joka perustuu avoimen lähdekoodin Matrix-teknologiaan
+- Turvallinen tiedostojen jakaminen datan salauksella
+- Videoneuvottelut VoIP:lla ja näytön jakamisella
+- Helppo integraatio tiimityövälineisiin, projektinhallintatyökaluihin, VoIP-palveluihin ja muihin ryhmäviestimiin
+
+Element on täysin erilainen kuin muut viestintä- ja yhteistyösovellukset. Se toimii Matrixilla, avoimella turvallisen ja hajautetun viestinnän verkostolla. Palvelimen ylläpitäminen itse on mahdollista, jos haluaa tietonsa ja viestinsä täysin hallintaansa.
+
+Yksityisyys ja salattu viestintä
+Element protects you from unwanted ads, data mining and walled gardens. It also secures all your data, one-to-one video and voice communication through end-to-end encryption and cross-signed device verification.
+
+Element gives you control over your privacy while allowing you to communicate securely with anyone on the Matrix network, or other business collaboration tools by integrating with apps such as Slack.
+
+Voit ylläpitää omaa palvelinta
+To allow more control of your sensitive data and conversations, Element can be self-hosted or you can choose any Matrix-based host - the standard for open source, decentralized communication. Element gives you privacy, security compliance and integration flexibility.
+
+Hallitse omia tietojasi
+You decide where to keep your data and messages. Without the risk of data mining or access from third parties.
+
+Element puts you in control in different ways:
+1. Get a free account on the matrix.org public server hosted by the Matrix developers, or choose from thousands of public servers hosted by volunteers
+2. Self-host your account by running a server on your own IT infrastructure
+3. Sign up for an account on a custom server by simply subscribing to the Element Matrix Services hosting platform
+
+Avointa viestintää ja yhteistyötä
+Voit keskustella kenen tahansa kanssa Matrix-verkossa, riippumatta siitä käyttääkö tämä Elementiä, jotain muuta Matrix-sovellusta tai jopa muuta viestintäsovellusta.
+
+Todella turvallinen
+Real end-to-end encryption (only those in the conversation can decrypt messages), and cross-signed device verification.
+
+Kattavaa viestintää ja integraatioita
+Viestit, ääni- ja videopuhelut, tiedostojen jakaminen, näytön jakaminen ja koko joukko integraatioita, botteja ja sovelmia. Luo huoneita ja yhteisöjä, pidä yhteyttä ja hoida asiasi.
+
+Jatka siitä mihin jäit
+Stay in touch wherever you are with fully synchronised message history across all your devices and on the web at https://app.element.io
diff --git a/fastlane/metadata/android/fi-FI/short_description.txt b/fastlane/metadata/android/fi-FI/short_description.txt
new file mode 100644
index 0000000000..0f5314071d
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/short_description.txt
@@ -0,0 +1 @@
+Ryhmäviestin - salattua viestintää, ryhmäkeskusteluja ja videopuheluita
diff --git a/fastlane/metadata/android/fi-FI/title.txt b/fastlane/metadata/android/fi-FI/title.txt
new file mode 100644
index 0000000000..080d4020d0
--- /dev/null
+++ b/fastlane/metadata/android/fi-FI/title.txt
@@ -0,0 +1 @@
+Element - Turvallinen viestin
diff --git a/fastlane/metadata/android/fi/full_description.txt b/fastlane/metadata/android/fi/full_description.txt
deleted file mode 100644
index 70def518da..0000000000
--- a/fastlane/metadata/android/fi/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element on uudenlainen viestinsovellus, joka:
-
-1. Antaa sinun päättää yksityisyydestäsi.
-2. Antaa sinun kommunikoida kenen tahansa kanssa Matrix-verkossa ja jopa sen ulkopuolella siltaamalla sovelluksiin, kuten Slack
-3. Suojaa sinua mainonnalta, tietojen keräämiseltä ja suljetuilta alustoilta
-4. Suojaa sinut päästä päähän -salauksella sekä ristiin varmentamisella muiden todentamiseksi
-
-Element eroaa täysin muista viestintäsovelluksista, koska se on hajautettu ja avointa lähdekoodia.
-
-Element antaa sinun isännöidä itse - valita isännän - jotta sinulla on yksityisyys ja voit hallita tietojasi sekä keskustelujasi. Se antaa sinulle pääsyn avoimeen verkkoon; joten et ole jumissa Elementin käyttäjissä.
-
-Element pystyy tekemään kaiken tämän, koska se toimii Matrixilla - avoimella, hajautetun viestinnän standardilla.
-
-Element antaa sinulle hallinnan antamalla sinun valita, kuka isännöi keskustelujasi. Element-sovelluksessa voit valita isännän eri tavoin:
-
-1. Hanki ilmainen tili Matrix-kehittäjien ylläpitämällä matrix.org-palvelimella tai valitse tuhansista vapaaehtoisten ylläpitämistä julkisista palvelimista.
-2. Isännöi tiliäsi itse suorittamalla palvelinta omalla laitteellasi
-3. Luo tili mukautetulla palvelimella yksinkertaisesti tilaamalla Element Matrix Services -palvelu
-
-Miksi valita Element?
-
-OMAT TIEDOT: Sinä päätät, missä tietosi ja viestisi säilytetään. Hallitset sitä itse, eikä jokin MEGAYHTIÖ, joka tutkii tietojasi tai antaa niitä kolmansille osapuolille.
-
-AVOIN KOMMUNIKOINYI JA YHTEISTYÖ: Voit keskustella kaikkien muiden Matrix-verkon käyttäjien kanssa, riippumatta siitä käyttävätkö he Elementiä tai muuta Matrix-sovellusta, ja vaikka he käyttäisivät eri viestijärjestelmiä, kuten Slack, IRC tai XMPP.
-
-ERITTÄIN TURVALLINEN: Vahva päästä päähän -salaus (vain keskustelussa olevat voivat purkaa viestien salauksen), ja ristiin varmentaminen keskustelun osallistujien laitteiden tarkistamiseksi.
-
-TÄYDELLISTÄ VIESTINTÄÄ: Viestit, ääni- ja videopuhelut, tiedostojen jakaminen, näytön jakaminen ja koko joukko integraatioita, botteja ja widgettejä. Rakenna huoneita, yhteisöjä, pidä yhteyttä ja tee asioita.
-
-MISSÄ TAHANSA OLETKIN: Pidä yhteyttä missä tahansa, täysin synkronoidun viestihistorian kautta kaikilla laitteillasi ja verkossa osoitteessa https://app.element.io.
diff --git a/fastlane/metadata/android/fi/short_description.txt b/fastlane/metadata/android/fi/short_description.txt
deleted file mode 100644
index 5573ac1cb9..0000000000
--- a/fastlane/metadata/android/fi/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Turvallista, hajautettua, keskusteluja ja VoIP-puheluita. Pidä tietosi turvassa.
diff --git a/fastlane/metadata/android/fi/title.txt b/fastlane/metadata/android/fi/title.txt
deleted file mode 100644
index 8cda14e3c8..0000000000
--- a/fastlane/metadata/android/fi/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (aiemmin Riot.im)
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100100.txt b/fastlane/metadata/android/fr-FR/changelogs/40100100.txt
new file mode 100644
index 0000000000..36ca3016b6
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Cette nouvelle version contient principalement des corrections de bogues et des améliorations. Envoyer un message est maintenant plus rapide.
+Liste complète des changements : https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100110.txt b/fastlane/metadata/android/fr-FR/changelogs/40100110.txt
new file mode 100644
index 0000000000..317877657d
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Cette nouvelle version contient principalement des améliorations de l'interface utilisateur et de l'expérience utilisateur. Il est désormais possible d'inviter des amis, de créer des DM rapidement et de scanner des codes QR.
+Liste complète des changements : https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100120.txt b/fastlane/metadata/android/fr-FR/changelogs/40100120.txt
new file mode 100644
index 0000000000..412b2b9db2
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Principaux changements apportés par cette version : aperçu des URL, nouveau clavier Emoji, nouvelles options de configuration pour le salon et neige pour Noël.
+Liste complète des changements : https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100130.txt b/fastlane/metadata/android/fr-FR/changelogs/40100130.txt
new file mode 100644
index 0000000000..a7e233616a
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Principaux changements apportés par cette version : aperçu des URL, nouveau clavier Emoji, nouvelles options de configuration pour le salon et neige pour Noël.
+Liste complète des changements : https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100140.txt b/fastlane/metadata/android/fr-FR/changelogs/40100140.txt
new file mode 100644
index 0000000000..e823d7a89a
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : modification des permissions dans les salons, thème lumineux/sombre automatique, et plein de corrections de bugs.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100150.txt b/fastlane/metadata/android/fr-FR/changelogs/40100150.txt
new file mode 100644
index 0000000000..cfc92299d4
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : prise en charge de l’authentification avec les réseaux sociaux.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100160.txt b/fastlane/metadata/android/fr-FR/changelogs/40100160.txt
new file mode 100644
index 0000000000..b5bca83268
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : prise en charge de l’authentification avec les réseaux sociaux !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.0.15 et https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40100170.txt b/fastlane/metadata/android/fr-FR/changelogs/40100170.txt
new file mode 100644
index 0000000000..5474f15417
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : corrections de bugs !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1..017
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101000.txt b/fastlane/metadata/android/fr-FR/changelogs/40101000.txt
new file mode 100644
index 0000000000..e9330611ee
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : améliorations de la VoIP (appels audio et vidéo dans les conversations primées) et corrections de bugs !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101010.txt b/fastlane/metadata/android/fr-FR/changelogs/40101010.txt
new file mode 100644
index 0000000000..8e9de64423
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : amélioration des performances et corrections de bugs !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101020.txt b/fastlane/metadata/android/fr-FR/changelogs/40101020.txt
new file mode 100644
index 0000000000..7bce8ac19a
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : amélioration des performances et corrections de bugs !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101030.txt b/fastlane/metadata/android/fr-FR/changelogs/40101030.txt
new file mode 100644
index 0000000000..93f0b9e7fb
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : amélioration des performances et corrections de bugs !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101040.txt b/fastlane/metadata/android/fr-FR/changelogs/40101040.txt
new file mode 100644
index 0000000000..0af0cf55d8
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : amélioration des performances et corrections de bugs !
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101050.txt b/fastlane/metadata/android/fr-FR/changelogs/40101050.txt
new file mode 100644
index 0000000000..dd6e8468af
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : Corrections de bugs sur la 1.1.4
+Liste de tous les changements : https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101060.txt b/fastlane/metadata/android/fr-FR/changelogs/40101060.txt
new file mode 100644
index 0000000000..e10a8aa4f3
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : Corrections de bugs sur la 1.1.5
+Liste de tous les changements : https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101070.txt b/fastlane/metadata/android/fr-FR/changelogs/40101070.txt
new file mode 100644
index 0000000000..66cc5d1671
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : prise en charge des espaces en bêta. Compression des vidéos avant envoi.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101080.txt b/fastlane/metadata/android/fr-FR/changelogs/40101080.txt
new file mode 100644
index 0000000000..31a4b72363
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : amélioration des espaces.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101090.txt b/fastlane/metadata/android/fr-FR/changelogs/40101090.txt
new file mode 100644
index 0000000000..99f02f1bb2
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : ajout de la prise en charge de gitter.im
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101100.txt b/fastlane/metadata/android/fr-FR/changelogs/40101100.txt
new file mode 100644
index 0000000000..610f7765d6
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : rafraîchissement des styles et des thèmes, et nouvelles fonctionnalités pour les espaces.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101110.txt b/fastlane/metadata/android/fr-FR/changelogs/40101110.txt
new file mode 100644
index 0000000000..5a5db82f07
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : rafraîchissement des styles et des thèmes, et nouvelles fonctionnalités pour les espaces (correction for 1.1.10).
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101120.txt b/fastlane/metadata/android/fr-FR/changelogs/40101120.txt
new file mode 100644
index 0000000000..b75ec7d3fe
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : rafraîchissement des styles et des thèmes, et correction d’un plantage après un appel vidéo.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101130.txt b/fastlane/metadata/android/fr-FR/changelogs/40101130.txt
new file mode 100644
index 0000000000..7190eede74
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : principalement des corrections de bogues et de stabilité.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101140.txt b/fastlane/metadata/android/fr-FR/changelogs/40101140.txt
new file mode 100644
index 0000000000..ba1784b5fd
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : correction d’un problème concernant les messages chiffrés.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40101150.txt b/fastlane/metadata/android/fr-FR/changelogs/40101150.txt
new file mode 100644
index 0000000000..559dcc1f6a
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : ajout des messages vocaux dans les expérimentations.
+Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/fr-FR/full_description.txt b/fastlane/metadata/android/fr-FR/full_description.txt
new file mode 100644
index 0000000000..78fcdf5617
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/full_description.txt
@@ -0,0 +1,39 @@
+Element est à la fois une messagerie sécurisée et une application de collaboration en équipe, idéale pour les conversations de groupe en télétravail. Cette application utilise le chiffrement de bout en bout. Elle permet de mettre en place des téléconférences vidéo, du partage de fichier et des appels vocaux.
+
+Les fonctionnalités d’Element incluent :
+- Outils de communication en ligne avancés
+- Communication d’entreprise sécurisée par le chiffrement de bout en bout des messages, même pour les travailleurs à distance
+- Messagerie décentralisée basée sur le framework open source Matrix
+- Partage sécurisé de fichiers avec chiffrement des données lors de la gestion de projet
+- Conversations vidéo par voix sur IP et partage d’écran
+- Intégration facile avec vos outils de collaboration, de gestion de projet, services de VoIP et autres applications de messagerie
+
+Element est complètement différente des autres applications de messagerie et de collaboration. Elle s’appuie sur Matrix, un réseau ouvert de communication décentralisée. Elle permet l’auto-hébergement pour que ses utilisateurs restent le plus en contrôle possible de leurs données et leurs messages.
+
+Confidentialité et messagerie chiffrée
+Element vous protège des publicités non désirées, du minage de données et des prisons dorées. Elle protègé vos données et vos communications vocales grâce au chiffrement de bout en bout et à la vérification de signature croisée entre appareils.
+
+Element vous donne la main sur votre confidentialité en vous permettant de communiquer de manière sécurisée avec tout le réseau Matrix ou d’autres applications de communication d’entreprise au travers d’intégrations d’applications comme Slack.
+
+Element peut être auto-hébergé
+Pour une meilleure souveraineté sur vos données et conversations, Element peut être auto-hébergé ou vous pouvez choisir votre hôte Matrix - la norme open source pour les communications décentralisées. Element garantit votre confidentialité, conformité aux normes de sécurité, tout en proposant une intégration souple.
+
+Vos données vous appartiennent
+Vous décidez où stocker vos données et messages. Aucun risque de minage de données où d’accès par des tierce parties.
+
+Element vous place aux commandes de différente manières :
+1. Inscrivez vous sur le serveur public matrix.org hébergé par les développeurs de Matrix ou choisissez parmi des milliers de serveurs publics hébergés par des bénévoles
+2. Auto-hébergez votre compte sur un serveur de votre proper infrastructure informatique
+3. Inscrivez vous à la plateforme d’hébergement Element Matrix Services
+
+Messagerie et collaboration ouvertes
+Vous pouvez discuter avec tout le réseau Matrix, que vos interlocuteurs utilisent Element, une autre application Matrix, ou même s’ils utilisent une application complètement différente.
+
+Ultra sécurisé
+Chiffrement de bout en bout (seules les personnes dans la conversation peuvent déchiffrer les messages) et vérification de signature croisée entre appareils.
+
+Communication et intégration parfaites
+Messagerie instantannée, appels audio et vidéo, partage de fichier, partage d’écran et bien d’autres intégrations, bots et widgets. Lancez des salons, des communautés, restez en contact et menez vos projets à bien.
+
+Reprenez où vous vous êtes arrêté
+Restez en contact où que vous soyez grâce à l’historique des messages synchronisé entre tous vos appareils et sur le web sur https://app.element.io
diff --git a/fastlane/metadata/android/fr-FR/short_description.txt b/fastlane/metadata/android/fr-FR/short_description.txt
new file mode 100644
index 0000000000..f9d18863ce
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/short_description.txt
@@ -0,0 +1 @@
+Messagerie de groupe - messages chiffrés, groupes et appels vidéos
diff --git a/fastlane/metadata/android/fr-FR/title.txt b/fastlane/metadata/android/fr-FR/title.txt
new file mode 100644
index 0000000000..9152e92cfa
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/title.txt
@@ -0,0 +1 @@
+Element - Messagerie sécurisée
diff --git a/fastlane/metadata/android/fr/full_description.txt b/fastlane/metadata/android/fr/full_description.txt
deleted file mode 100644
index 2b17d8f846..0000000000
--- a/fastlane/metadata/android/fr/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element est une nouvelle application de messagerie et de collaboration qui :
-
-1) Vous place aux commandes de votre vie privée
-2) Vous permet de communiquer avec n'importe qui du réseau Matrix, et plus encore par des intégrations d'autres applications comme Slack ou Discord
-3) Vous protège de la publicité et de la collecte de données
-4) Vous sécurise grâce à du chiffrement bout-à-bout, avec de la signature croisée pour authentifier les autres utilisateurs
-
-Element est complètement différent des autres applications de messagerie et de collaboration puisque l'application est décentralisée et open-source.
-
-Element vous permet d'héberger vous-même -ou de choisir un hôte- vous permettant d'assurer votre vie privée, la propriété et le contrôle de vos données et de vos conversations. Cela vous offre l'accès à un réseau ouvert, vous n'êtes donc pas condamné à parler à d'autres utilisateurs d'Element seulement. Et c'est très sécurisé.
-
-Element peut faire tout ça car il est basé sur Matrix, le protocole standard pour la communication ouverte et décentralisée.
-
-Element vous donne le contrôle en vous laissant choisir qui héberge vos conversations. Depuis l'application Element, vous pouvez choisir votre hôte de différentes manières :
-
-1) Créer un compte gratuit sur le serveur public matrix.org hébergé par les développeurs de Matrix, ou choisir parler les milliers de serveurs public hébergés par des bénévoles
-2) Héberger vous-même votre compte en installant un serveur sur votre propre machine
-3) Créer un compte sur un serveur personnalisé en souscrivant sur la plateforme d'hébergement « Element Matrix Services » (EMS)
-
-Pourquoi choisir Element ?
-
-POSSÉDEZ VOS DONNÉES : Vous décidez où conserver vos données et vos messages. Vous les possédez et vous les contrôlez, et non une MEGACORP qui mine vos données ou les donnent à des tiers
-
-UNE MESSAGERIE OUVERTE ET COLLABORATIVE : Vous pouvez discuter avec n'importe qui sur le réseau Matrix, qu'ils utilisent Element ou une autre application basée sur Matrix, et même s'ils utilisent un système de messagerie différent comment Slack, Discord, IRC ou XMPP.
-
-SUPER SÉCURISÉ : Un réel chiffrement bout-à-bout (seulement ceux deux la conversation peuvent déchiffrer les messages), et une signature croisée pour vérifier les appareils des participants de la conversation.
-
-COMMUNICATION COMPLÈTE : Messagerie, appels vocaux et vidéo, transfert de fichiers, partage d'écran et un tas d'intégrations, robots et widgets. Construisez des salons, des communautés, restez en contact et accomplissez de grandes choses.
-
-PARTOUT OÙ VOUS ÊTES : Restez connectés peu import où vous êtes avec la synchronisation complète de l'historique des messages sur tous vos appareils et sur le web sur https://app.element.io.
diff --git a/fastlane/metadata/android/fr/short_description.txt b/fastlane/metadata/android/fr/short_description.txt
deleted file mode 100644
index 2fb9762e97..0000000000
--- a/fastlane/metadata/android/fr/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Chat & VoIP sûr et décentralisé. Gardez vos données en sécurité.
diff --git a/fastlane/metadata/android/fr/title.txt b/fastlane/metadata/android/fr/title.txt
deleted file mode 100644
index 87cbc3b858..0000000000
--- a/fastlane/metadata/android/fr/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (anciennement Riot.im)
diff --git a/fastlane/metadata/android/fy/changelogs/40100100.txt b/fastlane/metadata/android/fy/changelogs/40100100.txt
new file mode 100644
index 0000000000..dc2eda9234
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Disse nije ferzje bestjit foar in grut diel út breksoplossings en ferbetteringen. Berjochten stjoere giet no in soad flugger.
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/fy/changelogs/40100110.txt b/fastlane/metadata/android/fy/changelogs/40100110.txt
new file mode 100644
index 0000000000..8249b5c409
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Disse nije ferzje bestjit foar in grut diel út brûkersinterfaasje en brûkersûnderfingsferbetteringen. No kinst freonen útnûgje, en gau DM's meitsje troch QR koades te scannen.
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/fy/changelogs/40100120.txt b/fastlane/metadata/android/fy/changelogs/40100120.txt
new file mode 100644
index 0000000000..9605ce2a75
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: URL ynsjen, nij emoji toetseboerd, nij keamer ynstellings moochlikheden, en snie foar kryst.
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/fy/changelogs/40100130.txt b/fastlane/metadata/android/fy/changelogs/40100130.txt
new file mode 100644
index 0000000000..ebc7285193
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: URL ynsjen, nij emoji toetseboerd, nij keamer ynstellings moochlikheden, en snie foar kryst.
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/fy/changelogs/40100140.txt b/fastlane/metadata/android/fy/changelogs/40100140.txt
new file mode 100644
index 0000000000..6886848889
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Keamer fjochten feroarje, automatysk ljocht/tsjuster tema, en breksferbetteringen.
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/fy/changelogs/40100150.txt b/fastlane/metadata/android/fy/changelogs/40100150.txt
new file mode 100644
index 0000000000..d291da0475
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Stipe foar sosjaal ynlogge!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/fy/changelogs/40100160.txt b/fastlane/metadata/android/fy/changelogs/40100160.txt
new file mode 100644
index 0000000000..eb2be2d09c
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Stipe foar sosjaal ynlogge!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/fy/changelogs/40100170.txt b/fastlane/metadata/android/fy/changelogs/40100170.txt
new file mode 100644
index 0000000000..281b087584
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Breksoplossings!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/fy/changelogs/40101000.txt b/fastlane/metadata/android/fy/changelogs/40101000.txt
new file mode 100644
index 0000000000..a860b7b468
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: VoIP (lûds en video skilje yn DM) ferbetteringen en breksoplossings!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/fy/changelogs/40101010.txt b/fastlane/metadata/android/fy/changelogs/40101010.txt
new file mode 100644
index 0000000000..2369fc4d22
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Prestaasje feroaringen en breksoplossings!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/fy/changelogs/40101020.txt b/fastlane/metadata/android/fy/changelogs/40101020.txt
new file mode 100644
index 0000000000..13aa172071
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Prestaasje feroaringen en breksoplossings!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/fy/changelogs/40101030.txt b/fastlane/metadata/android/fy/changelogs/40101030.txt
new file mode 100644
index 0000000000..595cbdf104
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Prestaasje feroaringen en breksoplossings!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/fy/changelogs/40101040.txt b/fastlane/metadata/android/fy/changelogs/40101040.txt
new file mode 100644
index 0000000000..e86e7ce3e3
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: Prestaasje feroaringen en breksoplossings!
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/fy/changelogs/40101050.txt b/fastlane/metadata/android/fy/changelogs/40101050.txt
new file mode 100644
index 0000000000..fdf5f98eb7
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: feroaringen foar 1.1.4
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/fy/changelogs/40101060.txt b/fastlane/metadata/android/fy/changelogs/40101060.txt
new file mode 100644
index 0000000000..47ac5692d5
--- /dev/null
+++ b/fastlane/metadata/android/fy/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Haadferoaring yn disse ferzje: feroaringen foar 1.1.5
+Folsleine feroaringslist: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/fy/short_description.txt b/fastlane/metadata/android/fy/short_description.txt
new file mode 100644
index 0000000000..ddc559b59c
--- /dev/null
+++ b/fastlane/metadata/android/fy/short_description.txt
@@ -0,0 +1 @@
+Groepsberjochtetsjinst - fersifere berjochten, groeps petearen en fideo skilje
diff --git a/fastlane/metadata/android/fy/title.txt b/fastlane/metadata/android/fy/title.txt
new file mode 100644
index 0000000000..c4b5b596fc
--- /dev/null
+++ b/fastlane/metadata/android/fy/title.txt
@@ -0,0 +1 @@
+Element - Feilige Berjochtetsjinst
diff --git a/fastlane/metadata/android/ga/title.txt b/fastlane/metadata/android/ga/title.txt
new file mode 100644
index 0000000000..85dd3fa07f
--- /dev/null
+++ b/fastlane/metadata/android/ga/title.txt
@@ -0,0 +1 @@
+Element (Riot.im roimhe sin)
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100100.txt b/fastlane/metadata/android/hu-HU/changelogs/40100100.txt
new file mode 100644
index 0000000000..87a00efded
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Ez az új verzió főképp hibajavításokat, és teljesítménybeli fejlesztéseket tartalmaz. Most már sokkal gyorsabb az üzenetek elküldése.
+A változtatások teljes listája itt található: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100110.txt b/fastlane/metadata/android/hu-HU/changelogs/40100110.txt
new file mode 100644
index 0000000000..c14ed73aeb
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Ez az új verzió főleg a felhasználói felülettel és a felhasználói élménnyel kapcsolatos javításokat tartalmaz. Mostantól már sokkal gyorsabban hívhatsz meg új ismerősöket a QR kód beolvasás által.
+A változtatások teljes listája itt található: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100120.txt b/fastlane/metadata/android/hu-HU/changelogs/40100120.txt
new file mode 100644
index 0000000000..2b5304522d
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Főbb változtatások ebben a verzióban: URL előnézet, új emoji billentyűzet, új szoba beállítási lehetőségek, és hó karácsonyra!
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100130.txt b/fastlane/metadata/android/hu-HU/changelogs/40100130.txt
new file mode 100644
index 0000000000..47ce2690f4
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Főbb változtatások ebben a verzióban: URL előnézet, új emoji billentyűzet, új szoba beállitási lehetőségek, és hó karácsonyra!
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100140.txt b/fastlane/metadata/android/hu-HU/changelogs/40100140.txt
new file mode 100644
index 0000000000..1b86da9ab1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Szoba jogosultságok szerkesztése, automatikus sötét/világos téma és sok hibajavítás.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100150.txt b/fastlane/metadata/android/hu-HU/changelogs/40100150.txt
new file mode 100644
index 0000000000..b48fd6a0d7
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Közösségi hálózatos bejelentkezés támogatása
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100160.txt b/fastlane/metadata/android/hu-HU/changelogs/40100160.txt
new file mode 100644
index 0000000000..bb983ed5e8
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Közösségi hálózatos bejelentkezés
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40100170.txt b/fastlane/metadata/android/hu-HU/changelogs/40100170.txt
new file mode 100644
index 0000000000..806470d74e
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: Hibajavítás!
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101000.txt b/fastlane/metadata/android/hu-HU/changelogs/40101000.txt
new file mode 100644
index 0000000000..0bc4f5d49f
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: VoIP (hang és videóhívás közvetlen beszélgetésekben) fejlesztés és hibajavítás
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101010.txt b/fastlane/metadata/android/hu-HU/changelogs/40101010.txt
new file mode 100644
index 0000000000..503fc0ab2f
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: sebesség javítás és hibajavítás
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101020.txt b/fastlane/metadata/android/hu-HU/changelogs/40101020.txt
new file mode 100644
index 0000000000..04d67ac5ae
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: sebesség javítás és hibajavítás
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101030.txt b/fastlane/metadata/android/hu-HU/changelogs/40101030.txt
new file mode 100644
index 0000000000..4d0e46739e
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: sebesség javítás és hibajavítás
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101040.txt b/fastlane/metadata/android/hu-HU/changelogs/40101040.txt
new file mode 100644
index 0000000000..1c6921f0d5
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: sebesség javítás és hibajavítás
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101050.txt b/fastlane/metadata/android/hu-HU/changelogs/40101050.txt
new file mode 100644
index 0000000000..c937bb9215
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: javítás az 1.1.4 verzióhoz
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101060.txt b/fastlane/metadata/android/hu-HU/changelogs/40101060.txt
new file mode 100644
index 0000000000..a9b37e66a9
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: javítás az 1.1.5 verzióhoz
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101070.txt b/fastlane/metadata/android/hu-HU/changelogs/40101070.txt
new file mode 100644
index 0000000000..4acfbea1ea
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: béta állapotú Tér támogatás. Videó tömörítés küldés előtt.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101080.txt b/fastlane/metadata/android/hu-HU/changelogs/40101080.txt
new file mode 100644
index 0000000000..e0f45f09b5
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: javítások a Terekhez
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101090.txt b/fastlane/metadata/android/hu-HU/changelogs/40101090.txt
new file mode 100644
index 0000000000..b3f3369ed7
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: támogatás a gitter.im hálózathoz
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101100.txt b/fastlane/metadata/android/hu-HU/changelogs/40101100.txt
new file mode 100644
index 0000000000..34171b2221
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101100.txt
@@ -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
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101110.txt b/fastlane/metadata/android/hu-HU/changelogs/40101110.txt
new file mode 100644
index 0000000000..1550736f36
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101110.txt
@@ -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
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101120.txt b/fastlane/metadata/android/hu-HU/changelogs/40101120.txt
new file mode 100644
index 0000000000..d3ca6a935f
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Főbb változtatások ebben a verzióban: kinézet és stílus frissítések és a videóhívás utáni összeomlás javítása
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101130.txt b/fastlane/metadata/android/hu-HU/changelogs/40101130.txt
new file mode 100644
index 0000000000..c90cefeeda
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: leginkább hibajavító és stabilitást növelő frissítés
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40101140.txt b/fastlane/metadata/android/hu-HU/changelogs/40101140.txt
new file mode 100644
index 0000000000..55d57c4515
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Fő változás ebben a verzióban: titkosított üzenetekkel kapcsolatos hibajavítás
+Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/hu-HU/full_description.txt b/fastlane/metadata/android/hu-HU/full_description.txt
new file mode 100644
index 0000000000..032346ccb8
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/full_description.txt
@@ -0,0 +1,40 @@
+Element egy biztonságos üzenetküldő és csapatmunka támogató alkalmazás ami ideális távoli munkavégzés közben csoportos csevegéshez. Az alkalmazás végpontok közötti titkosítást használ videó konferenciához, fájl megosztáshoz és videó hivásokhoz.
+
+Element tulajdonságai:
+- Fejlett online kommunikációs eszköz
+- Teljesen titkosított üzenetküldés biztonságos céges kommunikációt kínál még a távdolgozóknak is
+- Elosztott csevegés a Matrix nyílt forráskódú keretrendszer felhasználásával
+- Bizontságos fájl megosztás titkosítottan projektek kezeléséhez
+- Videó hívás VoIP-pal és képernyőmegosztással
+- Könnyen integrálható a kedvenc online kollaborációs eszközöddel, projekt menedzsment eszközzel, VoIP szolgáltatással vagy más csoport üzenetküldő alkalmazással
+
+Element teljesen más mint a többi üzenetküldő alkalmazás. Matrixot használ, egy nyílt hálózatot a decentralizált biztonságos kommunikációhoz. Lehetőséget ad saját szerver üzemeltetésére ami maximális tulajdont és kontrollt biztosít az adatok fölött.
+
+Magánélet védelme és titkosított üzenetküldés
+Element megóv a kéretlen hirdetésektől, adatbányászattól és a különböző szigetszerű megoldásoktól. Minden adatot biztonságba helyez, egy az egybe videó és hang kommunikáció végpontok között titkosítva ahol az eszközök hitelesítve vannak.
+
+Element a kezedbe adja az adatvédelmi irányítást miközben bárkivel kommunikálhatsz a Matrix hálózatban vagy más üzleti kollaborációs eszközzel ami integrálva van, mint amilyen a Slack.
+
+Element futtatható saját szerveren
+
+Azért, hogy az érzékeny adatok és beszélgetések minnél inkább az irányításod alatt lehessen az Elementet saját magadnak üzemeltetheted vagy választhatsz bármely Matrixon alapuló - szabványos nyílt forráskódú és decentralizált kommunikáció - szoláltató közül. Element adatvédelmet, biztonságot és rugalmas integrációkat biztosít.
+
+A te adatod a tiéd
+Te döntöd el, hogy hol tárolod az adataidat és üzeneteidet. Adatbányászat vagy harmadik fél hozzáférésének kockázata nélkül.
+
+Element többféle képpen adja vissza az irányítást:
+1. Szerezz egy ingyenes hozzáférést a matrix.org nyilvános szerverre amit a Matrix fejlesztők üzemeltetnek vagy válassz a több ezer önkéntesek által üzemeltetett nyilvános szerverből
+2. Üzemeltess szerver magadnak a saját infrastruktúrádon
+3. Iratkozz fel egy egyedi szerverre az Element Matrix Services platformon
+
+Nyílt üzenetküldés és kollaboráció
+Bárkivel beszélgethetsz a Matrix hálózaton, akár az Elementet használja akár egy másik Matrix alkalmazást használ vagy akár egy eltérő üzenetküldőt.
+
+Fantasztikusan biztonságos
+Igazi végpontok között titkosítás (csak a beszélgetésben résztvevők tudják visszafejteni) és hitelesítés eszközök közötti aláírásokkal.
+
+Teljes kommunikáció és integráció
+Üzenetküldés, hang és videóhívás, fájl megosztás, képernyő megosztás és egy csomó integráció, botok és kisalkalmazások. Építs szobákat, közösségeket, maradj kapcsolatban és végezz el dolgokat.
+
+Vedd fel a fonalat
+Maradj kapcsolatban bárhol minden eszközödön a szinkronizált üzenetekkel és a weben a https://app.element.io oldallal
diff --git a/fastlane/metadata/android/hu-HU/short_description.txt b/fastlane/metadata/android/hu-HU/short_description.txt
new file mode 100644
index 0000000000..2dfe14c516
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/short_description.txt
@@ -0,0 +1 @@
+Csoportos üzenetküldő - titkosított üzenetek, videó hívások
diff --git a/fastlane/metadata/android/hu-HU/title.txt b/fastlane/metadata/android/hu-HU/title.txt
new file mode 100644
index 0000000000..c463dea393
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/title.txt
@@ -0,0 +1 @@
+Element - Biztonságos üzenetküldő
diff --git a/fastlane/metadata/android/hu/full_description.txt b/fastlane/metadata/android/hu/full_description.txt
deleted file mode 100644
index dfc842594d..0000000000
--- a/fastlane/metadata/android/hu/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Az Element egy új üzenetküldő, és csapatmunka alkalmazás, amivel
-
-1. A te kezedben van az irányítás a saját adataid fölött, hogy megőrizhesd a magánszférádat
-2. Akárkivel beszélgethetsz a Matrix hálózatban, sőt még azon kívül is, például olyan alkalmazások integrálásával, mint a Slack
-3. Megvédheted magad a hirdetésektől, adatbányászattól, és a nagy cégek megoldásaiba való bezártságtól
-4. Biztonságosan beszélgethetsz, a végpontok közötti titkosításnak köszönhetően, az eszközök megbízhatóságát az eszköz-közti hitelesítéssel garantálva
-
-Az Element teljesen más, mint a többi üzenetküldő és csapatmunka alkalmazás, mert nyílt forráskódú, és decentralizált (nem központilag irányított).
-
-Az Element lehetővé teszi, hogy saját szervert futtass - vagy válassz egy szolgáltatót - így te birtoklod az adataidat, ezáltal megőrizve a magánszférád és a biztonságod. Egy nyitott hálózathoz ad hozzáférést, így nem csak a többi Element felhasználóval tudsz beszélgetni, hanem másokkal is. Ráadásul nagyon biztonságos.
-
-Az Element-tel azért válik mindez lehetővé, mert a Matrix hálózatra épül - egy nyílt, decentralizált kommunikációs szabványra.
-
-Az Element a te kezedbe adja az irányítást azáltal, hogy eldöntheted, ki tárolja a beszélgetéseidet. Az Element alkalmazásból több féle szolgáltatót is választhatsz:
-
-1. Regisztrálhatsz ingyen egy fiókot a matrix.org nyilvános szerveren, amit a Matrix fejlesztői üzemeltetnek, vagy választhatsz a több ezer, ingyenes szerver közül, amit önkéntesek üzemeltetnek
-2. A saját számítógépeden is futtathatsz szervert
-3. Előfizethetsz egy saját szerverre az Element Matrix Szolgáltatások platformon
-
-Miért válaszd az Element-et?
-
-ADATAID MEGVÉDÉSE: Eldöntheted, hol tárold az adataid és üzeneteid. A te tulajdonodban van, nem valami megacégnél, ami bányássza az adataid, vagy továbbadja másoknak.
-
-NYÍLT BESZÉLGETÉS, ÉS CSAPATMUNKA: Akárkivel cseveghetsz a Matrix hálózatban, akár az Element-et használják, akár valamilyen másik Matrix alkalmazást, de még akkor is, ha egy másik csevegő hálózatot használnak, olyat, mint például a Slack, IRC, vagy az XMPP.
-
-SZUPER-BIZTONSÁGOS: Valódi, végpontok közötti titkosítás (csak a beszélgetés résztvevői tudják elolvasni az üzeneteket), és eszköz-közti hitelesítés, hogy ellenőrizhesd a résztvevők eszközeit.
-
-TELJES KOMMUNIKÁCIÓ: Üzenetküldés, hang- és videóhívások, fájlmegosztás, képernyőmegosztás, és egy rakás integráció, bot, és widget. Hozz létre szobákat, közösségeket, maradj elérhető, és végezzétek el a feladatokat.
-
-AKÁRHOL, AHOL CSAK SZÜKSÉG VAN RÁ: Akárhol is vagy, maradj elérhető, a teljes mértékben szinkronizált beszélgetésekkel az összes eszközödön, és a weben a https://app.element.io oldalon.
diff --git a/fastlane/metadata/android/hu/short_description.txt b/fastlane/metadata/android/hu/short_description.txt
deleted file mode 100644
index 89f7c13f54..0000000000
--- a/fastlane/metadata/android/hu/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Biztonságos, decentralizált chat és VoIP. Tartsd az adataid biztonságban.
diff --git a/fastlane/metadata/android/hu/title.txt b/fastlane/metadata/android/hu/title.txt
deleted file mode 100644
index 8e493d2d08..0000000000
--- a/fastlane/metadata/android/hu/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (régebben Riot.im)
diff --git a/fastlane/metadata/android/id/changelogs/40100100.txt b/fastlane/metadata/android/id/changelogs/40100100.txt
new file mode 100644
index 0000000000..96a8f506b3
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Versi baru ini terutama berisi perbaikan bug dan peningkatan. Mengirim pesan sekarang jauh lebih cepat.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/id/changelogs/40100110.txt b/fastlane/metadata/android/id/changelogs/40100110.txt
new file mode 100644
index 0000000000..9f86005d8b
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Versi baru ini terutama berisi antarmuka pengguna dan peningkatan pengalaman pengguna. Sekarang Anda dapat mengundang teman, dan membuat sebuah DM sangat cepat dengan memindai kode QR.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/id/changelogs/40100120.txt b/fastlane/metadata/android/id/changelogs/40100120.txt
new file mode 100644
index 0000000000..3067b6367d
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Pratinjau URL, keyboard Emoji baru, kemampuan pengaturan ruangan baru, dan salju untuk Natal!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/id/changelogs/40100130.txt b/fastlane/metadata/android/id/changelogs/40100130.txt
new file mode 100644
index 0000000000..df52988b6c
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Pratinjau URL, keyboard Emoji baru, kemampuan pengaturan ruangan baru, dan salju untuk Natal!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/id/changelogs/40100140.txt b/fastlane/metadata/android/id/changelogs/40100140.txt
new file mode 100644
index 0000000000..5243adc1a8
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Edit izin ruangan, tema cahaya/gelap otomatis, dan banyak perbaikan bug.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/id/changelogs/40100150.txt b/fastlane/metadata/android/id/changelogs/40100150.txt
new file mode 100644
index 0000000000..54c307b9b6
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Dukungan login sosial.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/id/changelogs/40100160.txt b/fastlane/metadata/android/id/changelogs/40100160.txt
new file mode 100644
index 0000000000..3e357db352
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Dukungan login sosial.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.15 dan https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/id/changelogs/40100170.txt b/fastlane/metadata/android/id/changelogs/40100170.txt
new file mode 100644
index 0000000000..77f638a7fd
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/id/changelogs/40101000.txt b/fastlane/metadata/android/id/changelogs/40101000.txt
new file mode 100644
index 0000000000..acfe661354
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: perbaikan VoIP (panggilan audio dan video dalam DM) dan perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/id/changelogs/40101010.txt b/fastlane/metadata/android/id/changelogs/40101010.txt
new file mode 100644
index 0000000000..a9903a90bd
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/id/changelogs/40101020.txt b/fastlane/metadata/android/id/changelogs/40101020.txt
new file mode 100644
index 0000000000..d654bda4fe
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/id/changelogs/40101030.txt b/fastlane/metadata/android/id/changelogs/40101030.txt
new file mode 100644
index 0000000000..283c201b2f
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/id/changelogs/40101040.txt b/fastlane/metadata/android/id/changelogs/40101040.txt
new file mode 100644
index 0000000000..fdb94db53d
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: peningkatan kinerja dan perbaikan bug!
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/id/changelogs/40101050.txt b/fastlane/metadata/android/id/changelogs/40101050.txt
new file mode 100644
index 0000000000..856530c703
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: perbaikan hot-fix untuk 1.1.4
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/id/changelogs/40101060.txt b/fastlane/metadata/android/id/changelogs/40101060.txt
new file mode 100644
index 0000000000..1810ecc3aa
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: perbaikan hot-fix untuk 1.1.5
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/id/changelogs/40101070.txt b/fastlane/metadata/android/id/changelogs/40101070.txt
new file mode 100644
index 0000000000..0087d51703
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: dukungan beta untuk Spaces. Kompres video sebelum mengirim.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/id/changelogs/40101080.txt b/fastlane/metadata/android/id/changelogs/40101080.txt
new file mode 100644
index 0000000000..cb98796449
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: perbaikan untuk Spaces.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/id/changelogs/40101090.txt b/fastlane/metadata/android/id/changelogs/40101090.txt
new file mode 100644
index 0000000000..f6f535fe64
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: menambahkan dukungan untuk jaringan gitter.im.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/id/changelogs/40101100.txt b/fastlane/metadata/android/id/changelogs/40101100.txt
new file mode 100644
index 0000000000..121d84ca50
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: pembaruan tema dan gaya dan fitur-fitur baru untuk Spaces.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/id/changelogs/40101110.txt b/fastlane/metadata/android/id/changelogs/40101110.txt
new file mode 100644
index 0000000000..63c97253c4
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: pembaruan tema dan gaya dan fitur baru untuk spaces (perbaikan bug untuk 1.1.10)
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/id/changelogs/40101120.txt b/fastlane/metadata/android/id/changelogs/40101120.txt
new file mode 100644
index 0000000000..b8f23c530b
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: pembaruan tema dan gaya dan perbaiki crash setelah panggilan video
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/id/changelogs/40101130.txt b/fastlane/metadata/android/id/changelogs/40101130.txt
new file mode 100644
index 0000000000..51c532725b
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: terutama pembaruan stabilitas dan perbaikan bug.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/id/changelogs/40101140.txt b/fastlane/metadata/android/id/changelogs/40101140.txt
new file mode 100644
index 0000000000..af1e203dde
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: memperbaiki masalah tentang pesan terenkripsi.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/id/changelogs/40101150.txt b/fastlane/metadata/android/id/changelogs/40101150.txt
new file mode 100644
index 0000000000..f3aec557d0
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: implementasi pesan suara dalam pengaturan labs.
+Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/id/full_description.txt b/fastlane/metadata/android/id/full_description.txt
new file mode 100644
index 0000000000..0a18b8d64a
--- /dev/null
+++ b/fastlane/metadata/android/id/full_description.txt
@@ -0,0 +1,39 @@
+Element adalah perpesanan yang aman dan aplikasi kolaborasi tim produktivitas yang ideal untuk obrolan grup saat bekerja jarak jauh. Aplikasi obrolan ini menggunakan enkripsi ujung-ke-ujung untuk memberikan konferensi video, berbagi file, dan panggilan suara.
+
+Fitur Element termasuk:
+- Alat komunikasi online yang canggih
+- Pesan terenkripsi sepenuhnya untuk memungkinkan komunikasi perusahaan yang lebih aman, bahkan untuk pekerja jarak jauh
+- Obrolan terdesentralisasi berdasarkan framework sumber-terbuka Matrix
+- Berbagi file dengan aman dengan data terenkripsi saat mengelola proyek
+- Obrolan video dengan VoIP dan berbagi layar
+- Integrasi yang mudah dengan alat kolaborasi online favorit Anda, alat manajemen proyek, layanan VoIP dan aplikasi perpesanan tim lainnya
+
+Element benar-benar berbeda dari aplikasi perpesanan dan kolaborasi lainnya. Ini beroperasi pada Matrix, jaringan terbuka untuk pengiriman pesan yang aman dan komunikasi terdesentralisasi. Ini memungkinkan hosting sendiri untuk memberi pengguna kepemilikan maksimum dan kontrol data dan pesan mereka.
+
+Pesan privasi dan terenkripsi
+Element melindungi Anda dari iklan yang tidak diinginkan, data penambangan dan taman berdinding. Ini juga mengamankan semua data Anda, komunikasi video dan suara satu-ke-satu melalui enkripsi ujung-ke-ujung dan verifikasi perangkat yang di-cross-signed.
+
+Element memberi Anda kendali atas privasi Anda sambil memungkinkan Anda untuk berkomunikasi dengan aman dengan siapa pun di jaringan Matrix, atau alat kolaborasi bisnis lainnya dengan mengintegrasikan dengan aplikasi seperti Slack.
+
+Element dapat dihost sendiri
+Untuk memungkinkan lebih banyak kendali atas data dan percakapan sensitif Anda, Element bisa dihost sendiri atau Anda dapat memilih host berbasis Matrix - standar untuk komunikasi terdesentralisasi sumber-terbuka. Element memberi Anda privasi, kepatuhan keamanan, dan fleksibilitas integrasi.
+
+Miliki data Anda
+Anda memutuskan di mana menyimpan data dan pesan Anda. Tanpa risiko penambangan data atau akses dari pihak ketiga.
+
+Element menempatkan Anda dalam kendali dengan cara yang berbeda:
+1. Dapatkan akun gratis pada server publik matrix.org yang dihost oleh pengembang Matrix, atau memilih dari ribuan server publik yang dihost oleh sukarelawan
+2. Host sendiri akun Anda dengan menjalankan server pada infrastruktur IT Anda sendiri
+3. Daftar untuk akun di server khusus dengan hanya berlangganan platform hosting Element Matrix Services
+
+Pesan terbuka dan kolaborasi
+Anda dapat mengobrol dengan siapa saja di jaringan Matrix, apakah mereka menggunakan Element, aplikasi Matrix lain atau bahkan jika mereka menggunakan aplikasi perpesanan yang berbeda.
+
+Sangat aman
+Enkripsi ujung-ke-ujung beneran (hanya mereka yang dalam percakapan dapat mendekripsi pesan), dan verifikasi perangkat yang di-cross-signed.
+
+Komunikasi dan integrasi lengkap
+Perpesanan, panggilan suara dan video, berbagi file, berbagi layar dan banyak integrasi, bot dan widget. Buat ruangan, komunitas, tetap terhubung dan selesaikan hal-hal.
+
+Ambil di mana Anda tinggalkan
+Tetap terhubung di mana pun Anda berada dengan riwayat pesan yang sepenuhnya disinkronkan di semua perangkat Anda dan di web di https://app.element.io
diff --git a/fastlane/metadata/android/id/short_description.txt b/fastlane/metadata/android/id/short_description.txt
new file mode 100644
index 0000000000..e6c3a2f7a9
--- /dev/null
+++ b/fastlane/metadata/android/id/short_description.txt
@@ -0,0 +1 @@
+Perpesanan grup - pesan terenkripsi, panggilan grup dan video
diff --git a/fastlane/metadata/android/id/title.txt b/fastlane/metadata/android/id/title.txt
new file mode 100644
index 0000000000..aec5dc9351
--- /dev/null
+++ b/fastlane/metadata/android/id/title.txt
@@ -0,0 +1 @@
+Element - Perpesanan Aman
diff --git a/fastlane/metadata/android/it/changelogs/40100100.txt b/fastlane/metadata/android/it-IT/changelogs/40100100.txt
similarity index 100%
rename from fastlane/metadata/android/it/changelogs/40100100.txt
rename to fastlane/metadata/android/it-IT/changelogs/40100100.txt
diff --git a/fastlane/metadata/android/it-IT/changelogs/40100110.txt b/fastlane/metadata/android/it-IT/changelogs/40100110.txt
new file mode 100644
index 0000000000..897dda36d2
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Questa nuova versione contiene principalmente miglioramenti di interfaccia ed esperienza utente. Ora puoi invitare amici e iniziare messaggi diretti rapidamente tramite codici QR.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/it-IT/changelogs/40100120.txt b/fastlane/metadata/android/it-IT/changelogs/40100120.txt
new file mode 100644
index 0000000000..fcf8ca0f4e
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: anteprima URL, nuova tastiera emoji, nuove impostazioni stanza e neve per Natale!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/it-IT/changelogs/40100130.txt b/fastlane/metadata/android/it-IT/changelogs/40100130.txt
new file mode 100644
index 0000000000..ef27be9e1e
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: anteprima URL, nuova tastiera emoji, nuove impostazioni stanza e neve per Natale!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/it-IT/changelogs/40100140.txt b/fastlane/metadata/android/it-IT/changelogs/40100140.txt
new file mode 100644
index 0000000000..0bf5c1b085
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: modifica autorizzazioni stanza, tema chiaro/scuro automatico e varie correzioni di errori.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/it-IT/changelogs/40100150.txt b/fastlane/metadata/android/it-IT/changelogs/40100150.txt
new file mode 100644
index 0000000000..5df2a0d650
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: supporto all'accesso dai social.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/it-IT/changelogs/40100160.txt b/fastlane/metadata/android/it-IT/changelogs/40100160.txt
new file mode 100644
index 0000000000..9177421e44
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: supporto all'accesso dai social.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/it-IT/changelogs/40100170.txt b/fastlane/metadata/android/it-IT/changelogs/40100170.txt
new file mode 100644
index 0000000000..b2a8424497
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: correzioni di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101000.txt b/fastlane/metadata/android/it-IT/changelogs/40101000.txt
new file mode 100644
index 0000000000..bd13c2c185
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: migliorato il VoIP (chiamate audio e video in MD) e correzione di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101010.txt b/fastlane/metadata/android/it-IT/changelogs/40101010.txt
new file mode 100644
index 0000000000..51e6659827
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: prestazioni migliorate e correzione di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101020.txt b/fastlane/metadata/android/it-IT/changelogs/40101020.txt
new file mode 100644
index 0000000000..21057629e3
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: prestazioni migliorate e correzione di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101030.txt b/fastlane/metadata/android/it-IT/changelogs/40101030.txt
new file mode 100644
index 0000000000..a62c4a0736
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: prestazioni migliorate e correzioni di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101040.txt b/fastlane/metadata/android/it-IT/changelogs/40101040.txt
new file mode 100644
index 0000000000..93aac046a1
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: prestazioni migliorate e correzione di errori!
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101050.txt b/fastlane/metadata/android/it-IT/changelogs/40101050.txt
new file mode 100644
index 0000000000..7fa5ba20df
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: correzioni per la 1.1.4
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101060.txt b/fastlane/metadata/android/it-IT/changelogs/40101060.txt
new file mode 100644
index 0000000000..d915bf2d8f
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: correzioni per la 1.1.5
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101070.txt b/fastlane/metadata/android/it-IT/changelogs/40101070.txt
new file mode 100644
index 0000000000..6f7ffcd958
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: supporto beta per gli Spazi. Compressione video prima dell'invio.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101080.txt b/fastlane/metadata/android/it-IT/changelogs/40101080.txt
new file mode 100644
index 0000000000..9964245d4d
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: miglioramenti per gli Spazi.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101090.txt b/fastlane/metadata/android/it-IT/changelogs/40101090.txt
new file mode 100644
index 0000000000..d1d89c8f41
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: aggiunto supporto per la rete gitter.im .
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101100.txt b/fastlane/metadata/android/it-IT/changelogs/40101100.txt
new file mode 100644
index 0000000000..6f2447e5f6
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101100.txt
@@ -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
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101110.txt b/fastlane/metadata/android/it-IT/changelogs/40101110.txt
new file mode 100644
index 0000000000..263f46b4f1
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101110.txt
@@ -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
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101120.txt b/fastlane/metadata/android/it-IT/changelogs/40101120.txt
new file mode 100644
index 0000000000..382b490745
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: aggiornati tema e stile, corretto un crash dopo videochiamata
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101130.txt b/fastlane/metadata/android/it-IT/changelogs/40101130.txt
new file mode 100644
index 0000000000..2c7fc1a614
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: aggiornamento di stabilità e correzione errori.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101140.txt b/fastlane/metadata/android/it-IT/changelogs/40101140.txt
new file mode 100644
index 0000000000..30921e31c6
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: corretto un problema con i messaggi cifrati.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/it-IT/changelogs/40101150.txt b/fastlane/metadata/android/it-IT/changelogs/40101150.txt
new file mode 100644
index 0000000000..7a7eef5757
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: implementazione messaggi vocali nelle impostazioni Laboratori.
+Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt
new file mode 100644
index 0000000000..dd7716ffbf
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/full_description.txt
@@ -0,0 +1,39 @@
+Element è sia un messenger sicuro sia un'app collaborativa per team di produttività, ideale per chat di gruppo durante il lavoro da remoto. Questa app usa una crittografia end-to-end per fornire videoconferenze, condivisione di file e videochiamate.
+
+Tra le caratteristiche di Element ci sono:
+- Strumenti di comunicazione online avanzati
+- Messaggi totalmente cifrati per consentire comunicazioni aziendali più sicure, anche per i lavoratori remoti
+- Chat decentralizzate basate sull'infrastruttura open source Matrix
+- Condivisione sicura di file con dati crittografati durante la gestione dei progetti
+- Videochiamate con "Voice over IP" e condivisione dello schermo
+- Facile integrazione con i tuoi strumenti collaborativi online preferiti, strumenti di gestione progetti, servizi VoIP ed altre app di messaggistica tra team
+
+Element è completamente diverso dalle altre app di messaggistica e collaborazione. Funziona su Matrix, una rete aperta per messaggi sicuri e comunicazioni decentralizzate. Può essere installato in locale per dare agli utenti il pieno possesso e controllo dei propri dati e messaggi.
+
+Privacy e messaggi privati
+Element ti protegge da pubblicità indesiderate, dalla raccolta di dati e dalle piattaforme chiuse. Protegge tutti i tuoi dati e comunicazioni uno-ad-uno, attraverso la crittografia end-to-end e la verifica a firma incrociata tra dispositivi.
+
+Element ti dà il controllo della tua privacy consentendoti di comunicazre in modo sicuro con chiunque nella rete di Matrix, o con altri strumenti collaborativi aziendali, integrandosi con app come Slack.
+
+Element può essere installato in locale
+Per consentire un maggiore controllo dei tuoi dati sensibili e delle conversazioni, Element può essere gestito in locale o puoi scegliere un qualsiasi host basato su Matrix - lo standard per le comunicazioni open source e decentralizzate. Element ti offre privacy, conformità alla sicurezza e flessibilità di integrazione.
+
+Possiedi i tuoi dati
+Decidi tu dove tenere i tuoi dati e messaggi. Senza il rischio di raccolta di dati o accessi da terze parti.
+
+Element ti mette al controllo in diversi modi:
+1. Crea un account gratuito sul server pubblico matrix.org gestito dagli sviluppatori di Matrix, o scegli tra migliaia di server pubblici gestiti da volontari
+2. Gestisci autonomamente un account installando un server nella tua infrastruttura informatica
+3. Registra un account su un server personalizzato iscrivendoti alla piattaforma Element Matrix Services
+
+Messaggistica e collaborazioni aperte
+Puoi chattare con chiunque nella rete Matrix, sia che stiano usando Element, un'altra app Matrix, o anche un'app di messaggistica diversa.
+
+Super sicuro
+Vera crittografia end-to-end (solo chi è nella conversazione può decifrare i messaggi) e verifica di dispositivi a firma incrociata.
+
+Comunicazioni ed integrazioni complete
+Messaggi, chiamate audio e video, condivisione file e schermo, un vasto numero di integrazioni, bot e widget. Crea stanze, comunità, resta in contatto e porta a termine gli obiettivi.
+
+Riprendi da dove ti eri fermato
+Resta in contatto ovunque tu sia con la cronologia dei messaggi sincronizzata tra tutti i tuoi dispositivi e in rete su https://app.element.io
diff --git a/fastlane/metadata/android/it-IT/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt
new file mode 100644
index 0000000000..5050d0c1c5
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/short_description.txt
@@ -0,0 +1 @@
+Messenger di gruppo - messaggi cifrati, chat di gruppo e videochiamate
diff --git a/fastlane/metadata/android/it-IT/title.txt b/fastlane/metadata/android/it-IT/title.txt
new file mode 100644
index 0000000000..c426a480d3
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/title.txt
@@ -0,0 +1 @@
+Element - Messaggi sicuri
diff --git a/fastlane/metadata/android/it/full_description.txt b/fastlane/metadata/android/it/full_description.txt
deleted file mode 100644
index b6f7cf449c..0000000000
--- a/fastlane/metadata/android/it/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element è un nuovo tipo di app di messaggistica e collaborazione che:
-
-1. Ti mette al controllo per preservare la tua privacy
-2. Ti lascia comunicare con chiunque nella rete Matrix e oltre, integrandosi con app come Slack
-3. Ti protegge da pubblicità, raccolta di dati e piattaforme chiuse
-4. Ti protegge con la crittografia end-to-end, con la firma incrociata per verificare gli altri
-
-Element è completamente diverso dalle altre app di messaggistica e collaborazione perchè è decentralizzato e open source.
-
-Element può essere gestito in locale - o puoi scegliere un host - in modo che tu abbia privacy, possesso e controllo dei tuoi dati e conversazioni. Ti dà accesso ad una rete aperta, quindi non sei limitato a parlare solo con altri utenti Element. Ed è molto sicuro.
-
-Element può fare tutto ciò perchè funziona su Matrix - lo standard per comunicazioni aperte e decentralizzate.
-
-Element ti mette al controllo lasciandoti scegliere chi gestisce il server delle tue conversazioni. Dall'app Element, hai diverse opzioni:
-
-1. Crea un account gratuito sul server pubblico matrix.org gestito dagli sviluppatori di Matrix, o scegli tra migliaia di server pubblici gestiti da volontari
-2. Gestisci autonomamente un account installando un server sul tuo hardware
-3. Registra un account su un server personalizzato iscrivendoti alla piattaforma Element Matrix Services
-
-Perchè scegliere Element?
-
-POSSIEDI I TUOI DATI: decidi dove tenere i tuoi dati e messaggi. Sono tuoi e li controlli tu, non qualche MEGADITTA che raccoglie i tuoi dati o ne dà l'accesso a terze parti.
-
-MESSAGGISTICA E COLLABORAZIONE APERTE: puoi chattare con chiunque nella rete Matrix, usando Element o un'altra app Matrix, o anche se si sta usando un sistema di messaggistica diverso come Slack, IRC o XMPP.
-
-SUPER SICURO: vera crittografia end-to-end (solo chi è nella conversazione può decifrare i messaggi) e firma incrociata per verificare i dispositivi dei partecipanti.
-
-COMUNICAZIONE COMPLETA: messaggi, chiamate audio e video, condivisione file e schermo, un vasto numero di integrazioni, bot e widget. Crea stanze, comunità, resta in contatto e porta a termine gli impegni.
-
-OVUNQUE TU SIA: resta in contatto ovunque tu sia con la cronologia dei messaggi sincronizzata tra tutti i tuoi dispositivi e in rete su https://app.element.io.
diff --git a/fastlane/metadata/android/it/short_description.txt b/fastlane/metadata/android/it/short_description.txt
deleted file mode 100644
index 8c0c8fbee0..0000000000
--- a/fastlane/metadata/android/it/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Chat e VoIP decentralizzati sicuri. Tieni lontani i tuoi dati dalle terze parti.
diff --git a/fastlane/metadata/android/it/title.txt b/fastlane/metadata/android/it/title.txt
deleted file mode 100644
index 54e3b456c7..0000000000
--- a/fastlane/metadata/android/it/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (ex Riot.im)
diff --git a/fastlane/metadata/android/iw-IL/changelogs/40100100.txt b/fastlane/metadata/android/iw-IL/changelogs/40100100.txt
new file mode 100644
index 0000000000..e317277b9e
--- /dev/null
+++ b/fastlane/metadata/android/iw-IL/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+גרסה חדשה זו מכילה בעיקר תיקוני באגים ושיפורים. שליחת הודעה עכשיו הרבה יותר מהירה.
+לוח שינויים מלא: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/iw-IL/changelogs/40100110.txt b/fastlane/metadata/android/iw-IL/changelogs/40100110.txt
new file mode 100644
index 0000000000..fa017ecd40
--- /dev/null
+++ b/fastlane/metadata/android/iw-IL/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+גרסה חדשה זו מכילה בעיקר שיפורים בממשק המשתמש וחוויית המשתמש. עכשיו אתה יכול להזמין חברים וליצור DM מהר מאוד על ידי סריקת קודי QR.
+לוח שינויים מלא: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/iw-IL/changelogs/40100120.txt b/fastlane/metadata/android/iw-IL/changelogs/40100120.txt
new file mode 100644
index 0000000000..4cd08cc537
--- /dev/null
+++ b/fastlane/metadata/android/iw-IL/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+שינויים עיקריים בגרסה זו: תצוגה מקדימה של כתובת URL, מקלדת Emoji חדשה, יכולות הגדרת חדרים חדשות ושלג לחג המולד!
+לוח שינויים מלא: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/iw-IL/changelogs/40100130.txt b/fastlane/metadata/android/iw-IL/changelogs/40100130.txt
new file mode 100644
index 0000000000..4cd08cc537
--- /dev/null
+++ b/fastlane/metadata/android/iw-IL/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+שינויים עיקריים בגרסה זו: תצוגה מקדימה של כתובת URL, מקלדת Emoji חדשה, יכולות הגדרת חדרים חדשות ושלג לחג המולד!
+לוח שינויים מלא: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/iw-IL/full_description.txt b/fastlane/metadata/android/iw-IL/full_description.txt
new file mode 100644
index 0000000000..fe3bc16661
--- /dev/null
+++ b/fastlane/metadata/android/iw-IL/full_description.txt
@@ -0,0 +1,30 @@
+אלמנט הוא סוג חדש של אפליקציית מסנג'רים ושיתופי פעולה ש:
+
+1. נותן לך שליטה לשמור על פרטיותך
+2. מאפשר לך לתקשר עם כל אחד ברשת מטריקס, ואף מעבר לכך על ידי שילוב עם אפליקציות כגון Slack
+3. מגן עליכם מפני פרסום, ייצור נתונים וגינות חומות
+4. מאבטח אותך באמצעות הצפנה מקצה לקצה, באמצעות חתימה צולבת כדי לאמת אחרים
+
+אלמנט שונה לחלוטין מאפליקציות העברת הודעות ושיתופי פעולה מכיוון שהוא מבוזר ומקור פתוח.
+
+אלמנט מאפשר לך לארח בעצמך - או לבחור מארח - כך שתהיה לך פרטיות, בעלות ושליטה בנתונים ובשיחות שלך. זה נותן לך גישה לרשת פתוחה; כך שאתה לא סתם תקוע לדבר עם משתמשי Element אחרים בלבד. וזה מאוד מאובטח.
+
+אלמנט מסוגל לעשות את כל זה מכיוון שהוא פועל במטריקס - הסטנדרט לתקשורת פתוחה ומבוזרת.
+
+אלמנט מכניס אותך לשליטה בכך שהוא מאפשר לבחור מי מארח את השיחות שלך. מאפליקציית Element תוכלו לבחור לארח בדרכים שונות:
+
+1. קבל חשבון חינם בשרת הציבורי matrix.org המתארח על ידי מפתחי מטריקס, או בחר מתוך אלפי שרתים ציבוריים המתארחים על ידי מתנדבים.
+2. אירח את חשבונך באופן עצמאי על ידי הפעלת שרת בחומרה משלך
+3. הירשם לחשבון בשרת מותאם אישית על ידי מנוי פשוט לפלטפורמת האירוח של מטריקס מטריקס
+
+ מדוע לבחור באלמנט?
+
+ בבעלות הנתונים שלך : אתה מחליט היכן לשמור את הנתונים וההודעות שלך. אתה הבעלים שלה ושולט בו, לא על איזה MEGACORP שמכרה את הנתונים שלך או נותן גישה לצדדים שלישיים.
+
+ הודעות ושיתוף פעולה פתוח : אתה יכול לשוחח בצ'אט עם כל אחד אחר ברשת מטריקס, בין אם הוא משתמש באלמנט או באפליקציית מטריקס אחרת, וגם אם הם משתמשים במערכת העברת הודעות אחרת כמו Slack, IRC או XMPP.
+
+ SUPER-SECURE : הצפנה אמיתית מקצה לקצה (רק מי שבשיחה יכול לפענח הודעות), וחתימה צולבת כדי לאמת את המכשירים של משתתפי השיחה.
+
+ תקשורת מלאה : הודעות, שיחות קול ווידאו, שיתוף קבצים, שיתוף מסך וחבורה שלמה של אינטגרציות, בוטים ווידג'טים. לבנות חדרים, קהילות, לשמור על קשר ולעשות דברים.
+
+ בכל מקום שאתה נמצא : הישאר בקשר בכל מקום שאתה נמצא עם היסטוריית הודעות מסונכרנת לחלוטין בכל המכשירים שלך באינטרנט בכתובת https://app.element.io.
diff --git a/fastlane/metadata/android/iw-IL/short_description.txt b/fastlane/metadata/android/iw-IL/short_description.txt
new file mode 100644
index 0000000000..340cff40bc
--- /dev/null
+++ b/fastlane/metadata/android/iw-IL/short_description.txt
@@ -0,0 +1 @@
+צ'ט מבוזר ומאובטח. שמור על המידע שלך מפני צדדים שלישיים.
diff --git a/fastlane/metadata/android/iw-IL/title.txt b/fastlane/metadata/android/iw-IL/title.txt
new file mode 100644
index 0000000000..d8849a5023
--- /dev/null
+++ b/fastlane/metadata/android/iw-IL/title.txt
@@ -0,0 +1 @@
+אלמנט (בעבר Riot.im)
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100100.txt b/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
new file mode 100644
index 0000000000..8359a12964
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+今回の新バージョンでは、主にバグの修正と改善が行われています。メッセージの送信がより速くなりました。
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100110.txt b/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
new file mode 100644
index 0000000000..c93db421af
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+今回の新バージョンでは、主にUI(ユーザーインターフェース)とUX(ユーザーエクスペリエンス)の向上が図られています。友達を招待したり、QRコードを読み取って素早くDMを作成できるようになりました。
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100120.txt b/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
new file mode 100644
index 0000000000..aace2ef79f
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100130.txt b/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
new file mode 100644
index 0000000000..97633621c5
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: URLプレビュー、新しい絵文字、新しいルーム設定機能、それにクリスマスには雪が!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100140.txt b/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
new file mode 100644
index 0000000000..c340663127
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: 部屋の許可、自動のテーマ切替、そして多くのバグを修正しました。
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100150.txt b/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
new file mode 100644
index 0000000000..42f28c7bea
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: ソーシャルログインに対応しました。
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100160.txt b/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
new file mode 100644
index 0000000000..8b5196998a
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40100170.txt b/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
new file mode 100644
index 0000000000..586b01cb2b
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: バグの修正!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101000.txt b/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
new file mode 100644
index 0000000000..25bbd7ab87
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101010.txt b/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
new file mode 100644
index 0000000000..35ba933069
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101020.txt b/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
new file mode 100644
index 0000000000..88e3c79ca8
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/ja-JP/changelogs/40101030.txt b/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
new file mode 100644
index 0000000000..87d191b226
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+このバージョンの主な変更点: パフォーマンスの向上とバグの修正!
+すべての変更履歴はこちら: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/ja-JP/full_description.txt b/fastlane/metadata/android/ja-JP/full_description.txt
new file mode 100644
index 0000000000..855eb309c9
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/full_description.txt
@@ -0,0 +1,30 @@
+Elementはまったく新しいタイプのメッセンジャーアプリです。
+
+1. あなた自身がプライバシーをコントロールすることを可能にします。
+2. Matrixネットワークにいる誰とでも通信できることはもちろん、Slackなどのアプリとの連携によって他のネットワークとも通信ができます。
+3. 広告、データ収集、バックドア、ユーザーの囲い込みから逃れることができます。
+4. エンドツーエンド暗号化とクロス署名によってあなたを保護します。
+
+Elementは非中央集権型でオープンソースであるため、他のメッセンジャーアプリとは完全に異なっています。
+
+Elementはあなた自身でサーバーをホストすることも、サーバーを選ぶこともできます。これによってあなたのデータと会話に関するプライバシーや所有権はあなた自身で管理できるようになります。さらに、あなたは他のElementユーザーと話せるだけでなくオープンネットワークへのアクセスも可能です。とてもセキュアです。
+
+Elementは、オープンな分散型通信の標準規格であるMatrixで動作するため、これらすべてを実現することができています。
+
+Elementではあなたの会話をどのサーバーでホストするか決めることができます。アプリでは、さまざまな方法で選択できます。
+
+1. matrix.orgの公開サーバーで無料のアカウントを取得します。
+2. あなた自身のハードウェアでサーバーを動かし、アカウントを管理します。
+3. Element Matrix Servicesのホスティングプラットフォームに登録することで、カスタムサーバー上のアカウントを取得できます。
+
+なぜElementを選ぶべきなのか?
+
+データの所有権: 自分でデータやメッセージを保管する場所を決めることができます。あなたが所有権を持ってコントロールすることで、第三者にあなたのデータを渡したり、ビッグデータを収集する巨大テック企業に依存する必要がなくなります。
+
+開かれたネットワークと共同作業: Matrixネットワーク内の他の誰とでも、あるいはElementや他のMatrixアプリを使っているかどうかに関わらず、またSlack、IRC、XMPPのような他のメッセージングシステムを使っているかどうかに関わらず、チャットすることができます。
+
+はるかに安全: 本物のエンドツーエンド暗号化(会話に参加している者のみがメッセージを読める)と会話参加者の真正性を確認するためクロス署名によって。
+
+完全なるコミュニケーションの訪れ: テキスト、音声通話、ビデオ通話、ファイル共有、画面共有、連携機能、ボット、ウィジェットなどのコミュニケーションに必要な機能の全てが実装されています。ルームやコミュニティを立ち上げて連絡を取り合い、物事をスムーズに成し遂げることができます。
+
+いつでもどこでも!: すべてのデバイスとウェブ(https://app.element.io)でメッセージの履歴が完全に同期されるため、どこにいても連絡を取ることができます。
diff --git a/fastlane/metadata/android/ja-JP/short_description.txt b/fastlane/metadata/android/ja-JP/short_description.txt
new file mode 100644
index 0000000000..c3991b7a93
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/short_description.txt
@@ -0,0 +1 @@
+安全な分散型チャットとVoIP。あなたの情報が第三者から守られます。
diff --git a/fastlane/metadata/android/ja-JP/title.txt b/fastlane/metadata/android/ja-JP/title.txt
new file mode 100644
index 0000000000..376f4a95de
--- /dev/null
+++ b/fastlane/metadata/android/ja-JP/title.txt
@@ -0,0 +1 @@
+Element(エレメントメッセンジャー)
diff --git a/fastlane/metadata/android/kab/short_description.txt b/fastlane/metadata/android/kab/short_description.txt
index bee72ea427..453d31fc2a 100644
--- a/fastlane/metadata/android/kab/short_description.txt
+++ b/fastlane/metadata/android/kab/short_description.txt
@@ -1 +1 @@
-Adiwenni aɣellsan ur nelli aslammas & VoIP. Ḥrez isefra-k•m seg tama tis tlata.
+Adiwenni aɣellsan ur nelli d aslammas & VoIP. Ḥrez isefra-k•m seg wis tlata.
diff --git a/fastlane/metadata/android/nb/changelogs/40100170.txt b/fastlane/metadata/android/nb/changelogs/40100170.txt
new file mode 100644
index 0000000000..3593e50e05
--- /dev/null
+++ b/fastlane/metadata/android/nb/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: Bugfikser!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/nb/changelogs/40101010.txt b/fastlane/metadata/android/nb/changelogs/40101010.txt
new file mode 100644
index 0000000000..2d80855ed8
--- /dev/null
+++ b/fastlane/metadata/android/nb/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: Forbedringer i ytelse og bugfikser!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100100.txt b/fastlane/metadata/android/no-NO/changelogs/40100100.txt
new file mode 100644
index 0000000000..7ef80a2532
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Denne nye versjonen inneholder hovedsakelig feilrettinger og forbedringer. Å sende en melding er nå mye raskere.
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100110.txt b/fastlane/metadata/android/no-NO/changelogs/40100110.txt
new file mode 100644
index 0000000000..c2f5e03845
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Denne nye versjonen inneholder hovedsakelig forbedringer av brukergrensesnittet og brukeropplevelsen. Nå kan du invitere venner og opprette DM veldig raskt ved å skanne QR-koder.
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100120.txt b/fastlane/metadata/android/no-NO/changelogs/40100120.txt
new file mode 100644
index 0000000000..163cd64cdc
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: URL-forhåndsvisning, nytt Emoji-tastatur, nye rominnstillingsmuligheter og snø til jul!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100130.txt b/fastlane/metadata/android/no-NO/changelogs/40100130.txt
new file mode 100644
index 0000000000..23ab42ef2c
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: URL-forhåndsvisning, nytt Emoji-tastatur, nye rominnstillingsmuligheter og snø til jul!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100140.txt b/fastlane/metadata/android/no-NO/changelogs/40100140.txt
new file mode 100644
index 0000000000..10a3d9b925
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: Rediger romtillatelser, automatisk lys/mørkt tema og en haug med feilrettinger.
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100150.txt b/fastlane/metadata/android/no-NO/changelogs/40100150.txt
new file mode 100644
index 0000000000..3237da115d
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: Sosial innloggingsstøtte.
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100160.txt b/fastlane/metadata/android/no-NO/changelogs/40100160.txt
new file mode 100644
index 0000000000..5502fd3ab1
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: Sosial innloggingsstøtte.
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.15 og https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/no-NO/changelogs/40100170.txt b/fastlane/metadata/android/no-NO/changelogs/40100170.txt
new file mode 100644
index 0000000000..f9174a2ee4
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: Feilrettinger!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/no-NO/changelogs/40101000.txt b/fastlane/metadata/android/no-NO/changelogs/40101000.txt
new file mode 100644
index 0000000000..370dbb36ce
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: forbedring av VoIP (lyd og videosamtaler i DM) og feilrettinger!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/no-NO/changelogs/40101010.txt b/fastlane/metadata/android/no-NO/changelogs/40101010.txt
new file mode 100644
index 0000000000..c6109b8d9b
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: forbedring av ytelsen og feilrettinger!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/no-NO/changelogs/40101020.txt b/fastlane/metadata/android/no-NO/changelogs/40101020.txt
new file mode 100644
index 0000000000..9464c6fb0f
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: forbedring av ytelsen og feilrettinger!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/no-NO/changelogs/40101030.txt b/fastlane/metadata/android/no-NO/changelogs/40101030.txt
new file mode 100644
index 0000000000..1e12246e9a
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Hovedendringene i denne versjonen: forbedring av ytelsen og feilrettinger!
+Full endringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/no-NO/full_description.txt b/fastlane/metadata/android/no-NO/full_description.txt
new file mode 100644
index 0000000000..92a3c4c5c3
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/full_description.txt
@@ -0,0 +1,30 @@
+Element er en ny type messenger og samarbeidsapp som:
+
+1. Gir deg kontrollen for å bevare personvernet ditt
+2. Lar deg kommunisere med hvem som helst i Matrix-nettverket, og til og med ved å integrere med apper som Slack
+3. Beskytter deg mot reklame, datamining og inngjerdede hager
+4. Sikrer deg gjennom end-to-end-kryptering, med kryssignering for å bekrefte andre
+
+Element er helt forskjellig fra andre meldings- og samarbeidsapper fordi det er desentralisert og åpen kildekode.
+
+Element lar deg selv være vert - eller velge en vert - slik at du har personvern, eierskap og kontroll over dataene og samtalene dine. Det gir deg tilgang til et åpent nettverk; slik at du ikke bare holder på å snakke med bare andre Element-brukere. Og det er veldig sikkert.
+
+Element er i stand til å gjøre alt dette fordi det opererer på Matrix - standarden for åpen, desentralisert kommunikasjon.
+
+Element setter deg i kontroll ved å la deg velge hvem som er vert for samtalene dine. Fra Element-appen kan du velge å være vert på forskjellige måter:
+
+1. Få en gratis konto på matrix.org-serveren som er vert for Matrix-utviklerne, eller velg blant tusenvis av offentlige servere som er vert for frivillige
+2. Vær vert for kontoen din ved å kjøre en server på din egen maskinvare
+3. Registrer deg for en konto på en tilpasset server ved å bare abonnere på Hosting Matrix Services-vertsplattformen
+
+ Hvorfor velge Element?
+
+ EGNE DATA DINE : Du bestemmer hvor du vil oppbevare dataene og meldingene dine. Du eier den og kontrollerer den, ikke noe MEGACORP som utvinner dataene dine eller gir tilgang til tredjeparter.
+
+ ÅPEN MELDING OG SAMARBEID : Du kan chatte med alle andre i Matrix-nettverket, enten de bruker Element eller en annen Matrix-app, og selv om de bruker et annet meldingssystem som Slack, IRC eller XMPP.
+
+ SUPER-SECURE : Ekte end-to-end-kryptering (bare de i samtalen kan dekryptere meldinger), og kryssignering for å verifisere enhetene til samtaledeltakerne.
+
+ KOMPLETT KOMMUNIKASJON : Meldinger, tale- og videosamtaler, fildeling, skjermdeling og en hel haug med integrasjoner, bots og widgets. Bygg rom, lokalsamfunn, hold kontakten og få ting gjort.
+
+ ALT DER DU ER : Hold kontakten uansett hvor du er med fullt synkronisert meldingslogg på alle enhetene dine og på nettet på https://app.element.io.
diff --git a/fastlane/metadata/android/no-NO/short_description.txt b/fastlane/metadata/android/no-NO/short_description.txt
new file mode 100644
index 0000000000..b7cad4c849
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/short_description.txt
@@ -0,0 +1 @@
+Sikker desentralisert chat & VoIP. Beskytt dataene dine fra tredjeparter.
diff --git a/fastlane/metadata/android/no-NO/title.txt b/fastlane/metadata/android/no-NO/title.txt
new file mode 100644
index 0000000000..aacee5be54
--- /dev/null
+++ b/fastlane/metadata/android/no-NO/title.txt
@@ -0,0 +1 @@
+Element (tidligere Riot.im)
diff --git a/fastlane/metadata/android/pt_BR/changelogs/40100100.txt b/fastlane/metadata/android/pt-BR/changelogs/40100100.txt
similarity index 100%
rename from fastlane/metadata/android/pt_BR/changelogs/40100100.txt
rename to fastlane/metadata/android/pt-BR/changelogs/40100100.txt
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100110.txt b/fastlane/metadata/android/pt-BR/changelogs/40100110.txt
new file mode 100644
index 0000000000..2e9aef1c4a
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Esta nova versão contém principalmente melhorias na interface do usuário e na experiência do usuário. Agora você pode convidar amigos e criar conversas rapidamente, digitalizando códigos QR.
+Registro completo de alterações: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100120.txt b/fastlane/metadata/android/pt-BR/changelogs/40100120.txt
new file mode 100644
index 0000000000..834b512304
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Principais mudanças nessa versão: Prévia do endereço URL, novo teclado de Emojis, novos recursos de configuração da sala, e neve para o Natal!
+Registro de alterações completo: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100130.txt b/fastlane/metadata/android/pt-BR/changelogs/40100130.txt
new file mode 100644
index 0000000000..8f5a3d4b21
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Principais mudanças nessa versão: Prévia do endereço URL, novo teclado de Emojis, novos recursos de configuração da sala, e neve para o Natal!
+Registro de alterações completo: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100140.txt b/fastlane/metadata/android/pt-BR/changelogs/40100140.txt
new file mode 100644
index 0000000000..3533e8dd9c
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Principais mudanças nessa versão: editar permissões da sala, tema automaticamente claro/escuro e várias correções de erros.
+Registro de alterações completo: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100150.txt b/fastlane/metadata/android/pt-BR/changelogs/40100150.txt
new file mode 100644
index 0000000000..fb13732507
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Principais mudanças nessa versão: suporte para Login Social.
+Registro de alterações completo: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100160.txt b/fastlane/metadata/android/pt-BR/changelogs/40100160.txt
new file mode 100644
index 0000000000..561ceb3f25
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Principais mudanças nessa versão: suporte para Login Social.
+Registro de alterações completo: https://github.com/vector-im/element-android/releases/tag/v1.0.15 e https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40100170.txt b/fastlane/metadata/android/pt-BR/changelogs/40100170.txt
new file mode 100644
index 0000000000..2292ddab98
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: Correções de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101000.txt b/fastlane/metadata/android/pt-BR/changelogs/40101000.txt
new file mode 100644
index 0000000000..8cdb122f14
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: melhoramento de VoIP (chamadas de áudio e vídeo em DM) e correções de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101010.txt b/fastlane/metadata/android/pt-BR/changelogs/40101010.txt
new file mode 100644
index 0000000000..3a1128f229
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: melhoramento de performance e correções de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101020.txt b/fastlane/metadata/android/pt-BR/changelogs/40101020.txt
new file mode 100644
index 0000000000..7ee163e003
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: melhoramento de performance e correções de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101030.txt b/fastlane/metadata/android/pt-BR/changelogs/40101030.txt
new file mode 100644
index 0000000000..e83058e014
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: melhoramento de performance e correções de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101040.txt b/fastlane/metadata/android/pt-BR/changelogs/40101040.txt
new file mode 100644
index 0000000000..c58ede0161
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: melhora de performance e correções de bugs!
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101050.txt b/fastlane/metadata/android/pt-BR/changelogs/40101050.txt
new file mode 100644
index 0000000000..5ab2dbee0d
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: correções quentes para 1.1.4
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101060.txt b/fastlane/metadata/android/pt-BR/changelogs/40101060.txt
new file mode 100644
index 0000000000..062b53d279
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Principais alterações nesta versão: correções quentes para 1.1.5
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101070.txt b/fastlane/metadata/android/pt-BR/changelogs/40101070.txt
new file mode 100644
index 0000000000..5667b1609a
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+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
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101080.txt b/fastlane/metadata/android/pt-BR/changelogs/40101080.txt
new file mode 100644
index 0000000000..7922e6d800
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: melhoramento para Espaços.
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101090.txt b/fastlane/metadata/android/pt-BR/changelogs/40101090.txt
new file mode 100644
index 0000000000..3246596eab
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+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
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101100.txt b/fastlane/metadata/android/pt-BR/changelogs/40101100.txt
new file mode 100644
index 0000000000..4efd042313
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101100.txt
@@ -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
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101110.txt b/fastlane/metadata/android/pt-BR/changelogs/40101110.txt
new file mode 100644
index 0000000000..ac98ef9e3b
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101110.txt
@@ -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
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101120.txt b/fastlane/metadata/android/pt-BR/changelogs/40101120.txt
new file mode 100644
index 0000000000..4e8b0a0901
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: atualização de tema e estilo e consertar um crash depois de chamada de vídeo
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101130.txt b/fastlane/metadata/android/pt-BR/changelogs/40101130.txt
new file mode 100644
index 0000000000..cadd1619d6
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: principalmente atualização de estabilidade e consertos de bug.
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101140.txt b/fastlane/metadata/android/pt-BR/changelogs/40101140.txt
new file mode 100644
index 0000000000..2d33d46e3a
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: consertar um problema sobre mensagens encriptadas.
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40101150.txt b/fastlane/metadata/android/pt-BR/changelogs/40101150.txt
new file mode 100644
index 0000000000..3be1d63d46
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: implementação de mensagem de voz em configurações labs.
+Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/pt-BR/full_description.txt b/fastlane/metadata/android/pt-BR/full_description.txt
new file mode 100644
index 0000000000..7bb3d0981d
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/full_description.txt
@@ -0,0 +1,39 @@
+Element é tanto um mensageiro seguro como um app de colaboração de time de produtividade que é ideal para chats de grupo enquanto se trabalha remotamente. Este app de chat usa encriptação ponta-a-ponta para prover conferência de vídeo, compartilhamento de arquivo e chamadas de voz poderasos.
+
+As funções de Element incluem:
+- Ferramentas de comunicação online avançadas
+- Mensagens completamente encriptadas para permitir comunicação de corporação mais segura, até para pessoas trabalhando remotamente
+- Chat descentralizado baseado na framework open source Matrix
+- Compartilhamento de arquivo seguramente com dados encriptados enquanto se gerencia projetos
+- Chats de vídeo com Voz sobre IP e compartilhamento de tela
+- Integração fácil com suas ferramentas de colaboração online favoritas, ferramentas de gerenciamento de projetos, serviços de VoIP e outros apps de mensageria de time
+
+Element é completamente diferente de outros apps de mensageria e colaboração. Ele opera em Matrix, uma rede aberta para mensageria segura e comunicação descentralizada. Ele permite auto-hospedagem para dar a usuárias(os) máxima propriedade e controle de seus dados e suas mensagens.
+
+Privacidade e mensageria encriptada
+Element protege você de ads indesejados, datamining e jardins murados. Ele também assegura todos os seus dados, vídeo um-a-um e comunicação de voz através de encriptação ponta-a-ponta e verificação de dispositivo assinada cruzado.
+
+Element dá a você controle sobre sua privacidade enquanto permite a você se comunicar seguramente com qualquer pessoa na rede Matrix, ou outras ferramentas de colaboração ao se integrar com apps tais como Slack.
+
+Element pode ser auto-hospedado
+Para permitir mais controle de seus dados e conversas sensíveis, Element pode ser auto-hospedado ou você pode escolher qualquer host baseado em Matrix - o standard para comunicação open source e descentralizada. Element dá a você privacidade, conformidade de segurança e flexibilidade de integração.
+
+Tenha posse de seus dados
+Você decide onde manter seus dados e mensagens. Sem o risco de data mining ou acesso de terceiros.
+
+Element põe você em controle de diferentes maneiras:
+1. Pegar uma conta grátis no servidor público matrix.org hospedado pelos desenvolvedores Matrix, ou escolha de milhares de servidores públicos hospedados por pessoas se voluntariando
+2. Auto-hospedar sua conta ao rodar um servidor em sua própria infraestrutura de TI
+3. Fazer signup para uma conta num servidor personalizado ao simplesmente assinar a plataforma de hospedagem Element Matrix Services
+
+Mensageria e colaboração abertos
+Você pode fazer chat com qualquer pessoa na rede Matrix, caso ela esteja usando Element, um outro app de Matrix ou mesmo se ela estiver usando um app de mensageria diferente.
+
+Super seguro
+Encriptação ponta-a-ponta real (somente aquelas/es na conversa podem decriptar mensagens), e verificação de dispositivo assinada cuzado.
+
+Comunicação e integração completas
+Messageria, chamadas de voz e vídeo, compartilhamento de arquivo, compartilhamento de tela e um monte de integrações, bots e widgets. Construa salas, comunidades, fique em contato e tenha as coisas feitas.
+
+Continue de onde você parou
+Fique em contato onde quer que você esteja com histórico de mensagem completamente sincronizado por todos os seus dispositivos e na web em https://app.element.io
diff --git a/fastlane/metadata/android/pt-BR/short_description.txt b/fastlane/metadata/android/pt-BR/short_description.txt
new file mode 100644
index 0000000000..d5f82d8623
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/short_description.txt
@@ -0,0 +1 @@
+Mensageiro de grupo - mensageria, chat de grupo e chamadas de vídeo encriptados
diff --git a/fastlane/metadata/android/pt-BR/title.txt b/fastlane/metadata/android/pt-BR/title.txt
new file mode 100644
index 0000000000..90dbcf1bba
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/title.txt
@@ -0,0 +1 @@
+Element - Mensageiro Seguro
diff --git a/fastlane/metadata/android/pt_BR/full_description.txt b/fastlane/metadata/android/pt_BR/full_description.txt
deleted file mode 100644
index 82b38b473c..0000000000
--- a/fastlane/metadata/android/pt_BR/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element é um novo tipo de aplicativo de mensagens e colaboração que:
-
-1. Coloca você no controle de sua privacidade;
-2. Permite que você se comunique com qualquer pessoa na rede Matrix e, através de integrações, outros aplicativos como o Slack;
-3. Protege você de anúncios, mineração de dados e de ecossistemas fechados;
-4. Faz uso da criptografia de ponta a ponta, com autoverificação para confirmar outras pessoas.
-
-Element é completamente diferente de outros aplicativos de mensagem e colaboração porque é descentralizado e código aberto.
-
-É possível hospedar um servidor ou escolher um servidor hospedeiro, para que você tenha privacidade, controle e que você seja o dono de seus dados e conversas. Com o Element, você possui acesso a uma rede aberta; então você não está preso falando somente com outros usuários no Element. O Element também é muito seguro.
-
-Element é capaz de fazer tudo isso porque ele opera no Matrix, o padrão para comunicação aberta e descentralizada.
-
-Element coloca você no controle ao permitir quem hospeda suas conversas. Neste aplicativo, você pode escolher hospedar de maneiras diferentes:
-
-1. Crie uma conta gratuita no servidor público matrix.org;
-2. Hospede sua conta no seu servidor;
-3. Entre em uma conta em um servidor customizado ao simplesmente se inscrever na plataforma de hospedagem Serviços Matrix Element.
-
-Por que escolher o Element?
-
-SEJA O DONO DE SEUS DADOS: você decide onde manter seus dados e mensagens. Você é o dono deles e também os controla, não alguma mega corporação que minera os seus dados ou compartilha eles com terceiros.
-
-COLABORAÇÃO E MENSAGENS ABERTAS: você pode falar com qualquer outra pessoa na rede Matrix, não importa se ela está usando o Element ou algum outro aplicativo Matrix, ou até mesmo se ela está utilizando um sistema de mensagens diferente como o Slack, IRC ou XMPP.
-
-SUPER-SEGURO: criptografia de ponta a ponta verdadeira (apenas aqueles na conversa podem descriptografar mensagens), e assinatura cruzada para verificar os dispositivos de participantes de conversas.
-
-COMUNICAÇÃO COMPLETA: mensagens, chamadas de voz, chamadas de vídeo, compartilhamento de arquivos, compartilhamento de tela e um monte de integrações, robôs e widgets. Construa salas, comunidades, mantenha contato e faça seus projetos.
-
-NÃO IMPORTA ONDE VOCÊ ESTEJA: mantenha contato não importa onde você esteja com o histórico sincronizado de mensagens em todos os seus dispositivos e no navegador em https://app.element.io.
diff --git a/fastlane/metadata/android/pt_BR/short_description.txt b/fastlane/metadata/android/pt_BR/short_description.txt
deleted file mode 100644
index 853f629c30..0000000000
--- a/fastlane/metadata/android/pt_BR/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Conversas e chamadas seguras e descentralizadas. Mantenha seus dados protegidos.
diff --git a/fastlane/metadata/android/pt_BR/title.txt b/fastlane/metadata/android/pt_BR/title.txt
deleted file mode 100644
index 5d2ae0c353..0000000000
--- a/fastlane/metadata/android/pt_BR/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (o novo Riot.im)
diff --git a/fastlane/metadata/android/ro/short_description.txt b/fastlane/metadata/android/ro/short_description.txt
new file mode 100644
index 0000000000..86abb501b1
--- /dev/null
+++ b/fastlane/metadata/android/ro/short_description.txt
@@ -0,0 +1 @@
+Mesagerie de grup - mesaje criptate, comunicare de grup și apeluri video
diff --git a/fastlane/metadata/android/ro/title.txt b/fastlane/metadata/android/ro/title.txt
new file mode 100644
index 0000000000..09a73b82e2
--- /dev/null
+++ b/fastlane/metadata/android/ro/title.txt
@@ -0,0 +1 @@
+Element - Mesagerie securizată
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100100.txt b/fastlane/metadata/android/ru-RU/changelogs/40100100.txt
new file mode 100644
index 0000000000..326562fb32
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Эта новая версия в основном содержит исправления ошибок и улучшения. Отправка сообщения стала намного быстрее.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100110.txt b/fastlane/metadata/android/ru-RU/changelogs/40100110.txt
new file mode 100644
index 0000000000..166e5b701c
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Эта новая версия в основном содержит улучшения пользовательского интерфейса и взаимодействия с пользователем. Теперь вы можете приглашать друзей и очень быстро создавать чаты, сканируя QR-коды.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100120.txt b/fastlane/metadata/android/ru-RU/changelogs/40100120.txt
new file mode 100644
index 0000000000..5a594af4cf
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: предварительный просмотр URL, новая клавиатура эмодзи, новые возможности настройки комнаты и снег на Рождество!
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100130.txt b/fastlane/metadata/android/ru-RU/changelogs/40100130.txt
new file mode 100644
index 0000000000..a5a090d06a
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: предварительный просмотр URL, новая клавиатура эмодзи, новые возможности настройки комнаты и снег на Рождество!
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100140.txt b/fastlane/metadata/android/ru-RU/changelogs/40100140.txt
new file mode 100644
index 0000000000..8769f971eb
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Редактирование разрешений для комнаты, автоматическая светлая/темная тема и множество исправлений ошибок.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100150.txt b/fastlane/metadata/android/ru-RU/changelogs/40100150.txt
new file mode 100644
index 0000000000..1de07b1b13
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Поддержка входа в социальные сети.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100160.txt b/fastlane/metadata/android/ru-RU/changelogs/40100160.txt
new file mode 100644
index 0000000000..346a3d75e1
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Поддержка входа в социальные сети.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40100170.txt b/fastlane/metadata/android/ru-RU/changelogs/40100170.txt
new file mode 100644
index 0000000000..0e636dc4dc
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Исправлены ошибки!
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101000.txt b/fastlane/metadata/android/ru-RU/changelogs/40101000.txt
new file mode 100644
index 0000000000..8ec344a85a
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: VoIP (аудио и видео звонки в ЛС) Улучшение и исправления ошибок!
+Полный список изменений: https://github.com/vector-im/element-android/release/tag/v1.1.0
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101010.txt b/fastlane/metadata/android/ru-RU/changelogs/40101010.txt
new file mode 100644
index 0000000000..7295e0df60
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: улучшение производительности и исправления ошибок!
+Полный список изменений: https://github.com/vector-im/element-android/release/tag/v1.1.1
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101020.txt b/fastlane/metadata/android/ru-RU/changelogs/40101020.txt
new file mode 100644
index 0000000000..70e164f39d
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: улучшение производительности и исправления ошибок!
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101030.txt b/fastlane/metadata/android/ru-RU/changelogs/40101030.txt
new file mode 100644
index 0000000000..381c2761d0
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: улучшение производительности и исправления ошибок!
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101040.txt b/fastlane/metadata/android/ru-RU/changelogs/40101040.txt
new file mode 100644
index 0000000000..0fa9e956c0
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: улучшение и исправления ошибок!
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101050.txt b/fastlane/metadata/android/ru-RU/changelogs/40101050.txt
new file mode 100644
index 0000000000..c40bcab325
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: исправление для 1.1.4
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101060.txt b/fastlane/metadata/android/ru-RU/changelogs/40101060.txt
new file mode 100644
index 0000000000..44be6599ec
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: исправление для 1.1.5
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101070.txt b/fastlane/metadata/android/ru-RU/changelogs/40101070.txt
new file mode 100644
index 0000000000..4a400e8dc6
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: бета-поддержка Пространств. Сжатие видео перед отправкой.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101080.txt b/fastlane/metadata/android/ru-RU/changelogs/40101080.txt
new file mode 100644
index 0000000000..a695b9301d
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Усовершенствованы Пространства!
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101090.txt b/fastlane/metadata/android/ru-RU/changelogs/40101090.txt
new file mode 100644
index 0000000000..5233f3985b
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: добавлена поддержка сети gitter.im.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101100.txt b/fastlane/metadata/android/ru-RU/changelogs/40101100.txt
new file mode 100644
index 0000000000..fa3e77adcd
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+Основные изменения этой версии: обновлен внешний вид и новые возможности для пространств
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101110.txt b/fastlane/metadata/android/ru-RU/changelogs/40101110.txt
new file mode 100644
index 0000000000..b5dcad40e2
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+Основные изменения этой версии: обновлен внешний вид и новые возможности для пространств (bugfix для 1.1.10)
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101120.txt b/fastlane/metadata/android/ru-RU/changelogs/40101120.txt
new file mode 100644
index 0000000000..b76827916d
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: обновление темы и стиля и исправления сбоев после видеовызова
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101130.txt b/fastlane/metadata/android/ru-RU/changelogs/40101130.txt
new file mode 100644
index 0000000000..c1ed9005aa
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: улучшение стабильности и исправления ошибок.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40101140.txt b/fastlane/metadata/android/ru-RU/changelogs/40101140.txt
new file mode 100644
index 0000000000..1c8c7cb356
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: исправление проблемы с зашифрованными сообщениями.
+Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/ru-RU/full_description.txt b/fastlane/metadata/android/ru-RU/full_description.txt
new file mode 100644
index 0000000000..3d21b20a90
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/full_description.txt
@@ -0,0 +1,39 @@
+Element - это одновременно безопасный мессенджер и приложение для совместной работы, которое идеально подходит для групповых чатов при удаленной работе. Это приложение для чатов использует сквозное шифрование для обеспечения мощных видеоконференций, обмена файлами и голосовых звонков.
+
+Особенности Element включают:
+- Передовые средства онлайн-общения
+- Полностью зашифрованные сообщения, обеспечивающие безопасное корпоративное общение даже для удаленных работников
+- Децентрализованный чат на базе платформы Matrix с открытым исходным кодом
+- Безопасный обмен файлами с зашифрованными данными при управлении проектами
+- Видеочаты с VoIP и совместным использованием экрана
+- Простая интеграция с вашими любимыми инструментами для совместной работы в Интернете, средствами управления проектами, VoIP-сервисами и другими приложениями для обмена сообщениями в команде.
+
+Element полностью отличается от других приложений для обмена сообщениями и совместной работы. Он работает на базе Matrix, открытой сети для безопасного обмена сообщениями и децентрализованного общения. Он позволяет самостоятельно размещать свои данные и сообщения, предоставляя пользователям максимальный контроль над ними.
+
+Приватность и зашифрованный обмен сообщениями.
+Element защищает вас от нежелательной рекламы, сбора данных и "садов". Он также защищает все ваши данные, видео- и голосовую связь один на один благодаря сквозному шифрованию и перекрестной проверке устройств.
+
+Element дает вам контроль над вашей конфиденциальностью, позволяя безопасно общаться с любым человеком в сети Matrix или с другими инструментами совместной работы благодаря интеграции с такими приложениями, как Slack.
+
+Element может быть размещен самостоятельно.
+Чтобы обеспечить больший контроль над конфиденциальными данными и разговорами, Element может быть размещен самостоятельно или вы можете выбрать любой хост на базе Matrix - стандарт децентрализованного общения с открытым исходным кодом. Element обеспечивает конфиденциальность, соответствие требованиям безопасности и гибкость интеграции.
+
+Владение своими данными.
+Вы сами решаете, где хранить свои данные и сообщения. Без риска добычи данных или доступа третьих лиц.
+
+Element дает вам возможность контролировать ситуацию различными способами:
+1. Получить бесплатный аккаунт на публичном сервере matrix.org, размещенном разработчиками Matrix, или выбрать один из тысяч публичных серверов, размещенных добровольцами.
+2. Самостоятельно разместить свою учетную запись, запустив сервер на собственной IT-инфраструктуре.
+3. Зарегистрировать учетную запись на пользовательском сервере, просто подписавшись на хостинг-платформу Element Matrix Services.
+
+Открытый обмен сообщениями и сотрудничество.
+Вы можете общаться с любым человеком в сети Matrix, независимо от того, использует ли он Element, другое приложение Matrix или даже если он использует другое приложение для обмена сообщениями.
+
+Супербезопасно
+Настоящее сквозное шифрование (только участники разговора могут расшифровывать сообщения) и проверка устройств с перекрестной подписью.
+
+Полная коммуникация и интеграция.
+Обмен сообщениями, голосовые и видеозвонки, совместное использование файлов, совместное использование экрана и целый ряд интеграций, ботов и виджетов. Создавайте комнаты, сообщества, оставайтесь на связи и выполняйте задачи.
+
+Восстанавливайте связь с того места, где остановились.
+Оставайтесь на связи, где бы вы ни находились, с полностью синхронизированной историей сообщений на всех ваших устройствах и в Интернете по адресу https://app.element.io
diff --git a/fastlane/metadata/android/ru-RU/short_description.txt b/fastlane/metadata/android/ru-RU/short_description.txt
new file mode 100644
index 0000000000..8f7566d208
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/short_description.txt
@@ -0,0 +1 @@
+Групповой мессенджер - зашифрованные сообщения, групповые беседы и видеовызовы
diff --git a/fastlane/metadata/android/ru-RU/title.txt b/fastlane/metadata/android/ru-RU/title.txt
new file mode 100644
index 0000000000..b7b25082a4
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/title.txt
@@ -0,0 +1 @@
+Element - Безопасный мессенджер
diff --git a/fastlane/metadata/android/ru/full_description.txt b/fastlane/metadata/android/ru/full_description.txt
deleted file mode 100644
index 2ac7f9be54..0000000000
--- a/fastlane/metadata/android/ru/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element - это новый тип приложения для обмена сообщениями и совместной работы, которое:
-
-1. Позволяет вам контролировать вашу конфиденциальность
-2. Позволяет общаться с кем угодно в сети Matrix и даже за ее пределами за счет интеграции с такими приложениями, как Slack
-3. Защищает вас от рекламы, данных и огороженных стеной садов
-4. Обеспечивает безопасность с помощью сквозного шифрования с перекрестной подписью для проверки других пользователей
-
-Element полностью отличается от других приложений для обмена сообщениями и совместной работы, потому что он децентрализован и имеет открытый исходный код.
-
-Element позволяет вам самостоятельно размещать или выбирать хост-узел, чтобы у вас была конфиденциальность, право собственности и контроль над своими данными и разговорами. Он предоставляет вам доступ к открытой сети, поэтому вы не ограничены общением исключительно с пользователями Element. И он очень надежен и безопаснен.
-
-Element может делать все это, потому что он работает на Matrix - стандарте открытого, децентрализованного общения.
-
-Element предоставляет вам полный контроль, позволяя выбрать поставщиков услуг, обслуживающих серверы с вашими беседами. Вы свободны выбрать любой способ размещения прямо из приложения Element:
-
-1. Получить бесплатную учетную запись на общедоступном сервере matrix.org, размещенном разработчиками Matrix, или выберите один из тысяч общедоступных серверов, размещенных волонтерами.
-2. Разместить свою учетную запись на собственном сервере
-3. Зарегистрироваться на индивидуальном сервере, просто подписавшись на услуги платформы Element Matrix Services
-
-Почему выбирают Element?
-
-СОБСТВЕННЫЕ ДАННЫЕ: Вы решаете, где хранить свои данные и сообщения. Вы владеете ими и контролируете их, а не какая-то мегакорпорация, что собирает ваши данные и предоставляет сторонним лицам доступ к ним.
-
-ОТКРЫТОЕ ОБЩЕНИЕ И СОТРУДНИЧЕСТВО: Вы можете общаться с кем угодно в сети Matrix, независимо от того, используют ли они приложение Element или другое приложение Matrix, и даже если они используют другую систему обмена сообщениями, такую как Slack, IRC или XMPP.
-
-СУПЕР-БЕЗОПАСНОСТЬ: Настоящее сквозное шифрование (только участники разговора могут расшифровывать сообщения) и перекрестная подпись для проверки устройств участников разговора.
-
-ПОЛНАЯ КОММУНИКАЦИЯ: Обмен сообщениями, голосовые и видеозвонки, совместное использование файлов, совместное использование экрана и целый ряд интеграций, ботов и виджетов. Создавайте комнаты, сообщества, оставайтесь на связи и добивайтесь результатов.
-
-ВЫ ВЕЗДЕ: Оставайтесь на связи, где бы вы ни находились, благодаря полностью синхронизированной истории сообщений на всех ваших устройствах и в Интернете по адресу https://app.element.io.
diff --git a/fastlane/metadata/android/ru/short_description.txt b/fastlane/metadata/android/ru/short_description.txt
deleted file mode 100644
index 64452ed22d..0000000000
--- a/fastlane/metadata/android/ru/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Защищённый децентрализованный чат и звонки. Держите ваши данные в безопасности.
diff --git a/fastlane/metadata/android/ru/title.txt b/fastlane/metadata/android/ru/title.txt
deleted file mode 100644
index 00e488e69f..0000000000
--- a/fastlane/metadata/android/ru/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (ранее Riot.im)
diff --git a/fastlane/metadata/android/si-LK/title.txt b/fastlane/metadata/android/si-LK/title.txt
new file mode 100644
index 0000000000..83955cd75e
--- /dev/null
+++ b/fastlane/metadata/android/si-LK/title.txt
@@ -0,0 +1 @@
+ඉලෙමන්ට් (මීට පෙර Riot.im)
diff --git a/fastlane/metadata/android/sk/changelogs/40100100.txt b/fastlane/metadata/android/sk/changelogs/40100100.txt
new file mode 100644
index 0000000000..b5fe2085ca
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Táto verzia obsahuje predovšetkým opravy chýb. Odosielanie správ je odteraz omnoho rýchlejšie.
+Kompletný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/sk/changelogs/40100110.txt b/fastlane/metadata/android/sk/changelogs/40100110.txt
new file mode 100644
index 0000000000..ae68eee15e
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Táto verzia obsahuje najmä vylepšenia používateľského rozhrania. Pozývať priateľov alebo vytvárať priame konverzácie môžete veľmi rýchlo naskenovaním QR kódov.
+Kompletný zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/sk/changelogs/40100120.txt b/fastlane/metadata/android/sk/changelogs/40100120.txt
new file mode 100644
index 0000000000..46d39ad9e7
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Ukážka URL, nová klávesnica Emoji, nové možnosti nastavenia miestnosti a sneh na Vianoce!
+Celý zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/sk/changelogs/40100130.txt b/fastlane/metadata/android/sk/changelogs/40100130.txt
new file mode 100644
index 0000000000..6dc39b44f1
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Ukážka URL, nová klávesnica Emoji, nové možnosti nastavenia miestnosti a sneh na Vianoce!
+Celý zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/sk/changelogs/40100140.txt b/fastlane/metadata/android/sk/changelogs/40100140.txt
new file mode 100644
index 0000000000..22db5f972f
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Úpravy povolení miestnosti, automatický svetlý / tmavý motív a veľa opráv chýb.
+Celý zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/sk/changelogs/40100150.txt b/fastlane/metadata/android/sk/changelogs/40100150.txt
new file mode 100644
index 0000000000..ca26356e8a
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Podpora sociálneho prihlásenia.
+Celý zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/sk/changelogs/40100160.txt b/fastlane/metadata/android/sk/changelogs/40100160.txt
new file mode 100644
index 0000000000..28cd4b52c9
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Podpora sociálneho prihlásenia.
+Celý zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.15 and https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/sk/changelogs/40100170.txt b/fastlane/metadata/android/sk/changelogs/40100170.txt
new file mode 100644
index 0000000000..41336e7700
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Opravy chýb!
+Celý zoznam zmien: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/sk/short_description.txt b/fastlane/metadata/android/sk/short_description.txt
index 7d352942bf..0744f4a617 100644
--- a/fastlane/metadata/android/sk/short_description.txt
+++ b/fastlane/metadata/android/sk/short_description.txt
@@ -1 +1 @@
-Zabezpečené konverzácie a VoIP. Ochráňte vaše údaje pred zhromažďovaním.
+Zabezpečené konverzácie a VoIP. Ochráňte vaše údaje pred tretími stranami.
diff --git a/fastlane/metadata/android/sr/changelogs/40100100.txt b/fastlane/metadata/android/sr/changelogs/40100100.txt
new file mode 100644
index 0000000000..7e886a503c
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Ова нова верзија углавном садржи поправке грешака и побољшања. Слање порука сада је много брже.
+Дневник свих измена: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/sr/changelogs/40100110.txt b/fastlane/metadata/android/sr/changelogs/40100110.txt
new file mode 100644
index 0000000000..e09e45fa4d
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Ова нова верзија углавном садржи побољшања корисничког искуства и сучеља. Сада можете позвати пријатеље и направити ћаскања веома брзо скенирањем КуЕр кодова.
+Дневник свих измена: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/sr/changelogs/40100120.txt b/fastlane/metadata/android/sr/changelogs/40100120.txt
new file mode 100644
index 0000000000..07ab721c42
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Главне измене у овој верзији: УРЛ преглед, нова емоџи тастатура, нове могућности у поставкама собе и снег за Божић !
+Дневник свих измена: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/sr/changelogs/40100130.txt b/fastlane/metadata/android/sr/changelogs/40100130.txt
new file mode 100644
index 0000000000..ba9ff5ad43
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Главне измене у овој верзији: УРЛ преглед, нова емоџи тастатура, нове могућности у поставкама собе и снег за Божић!
+Дневник свих измена: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/sr/changelogs/40100140.txt b/fastlane/metadata/android/sr/changelogs/40100140.txt
new file mode 100644
index 0000000000..8fe5bed02d
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Главна измена у овој верзији: уређивање дозвола у соби, аутоматска светла/тамна тема и гомила исправљених грешака.
+Цео дневник измена: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/sr/changelogs/40100150.txt b/fastlane/metadata/android/sr/changelogs/40100150.txt
new file mode 100644
index 0000000000..6300f1f026
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Главна измена у овој верзији: подршка за пријављивање са друштвених мрежа.
+Цео дневник измена: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/sr/changelogs/40100160.txt b/fastlane/metadata/android/sr/changelogs/40100160.txt
new file mode 100644
index 0000000000..b4dbbd763a
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Главна измена у овој верзији: подршка за пријављивање са друштвених мрежа.
+Цео дневник измена: https://github.com/vector-im/element-android/releases/tag/v1.0.15 и https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/sr/changelogs/40100170.txt b/fastlane/metadata/android/sr/changelogs/40100170.txt
new file mode 100644
index 0000000000..51d332a5ea
--- /dev/null
+++ b/fastlane/metadata/android/sr/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Главна измена у овој верзији: сређене грешке!
+Цео дневник измена: https://github.com/vector-im/element-android/releases/tag/v1.0.15 и https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/sr/full_description.txt b/fastlane/metadata/android/sr/full_description.txt
new file mode 100644
index 0000000000..b8dbb67fdb
--- /dev/null
+++ b/fastlane/metadata/android/sr/full_description.txt
@@ -0,0 +1,30 @@
+Елемент је нова врста апликације за ћаскање и сарадњу која:
+
+1. вама даје контролу над вашом приватношћу
+2. омогућава комуникацију са свима на Матрикс (Matrix) мрежи, па и шире интегришући се са апликацијама попут Слека (Slack)
+3. вас штити од рекламирања, крађе података и затворених система
+4. вас обезбеђује шифровањем с краја на крај, са међу-потписима ради верификовања осталих корисника
+
+Елемент је потпуно другачији од осталих апликација за поруке и сарадњу јер је децентрализован и отвореног кода.
+
+Елемент омогућава да сами хостујете или изаберете хост - како бисте сачували приватност, власништво и контролу над својим подацима и разговорима. Даје вам приступ отвореној мрежи; па тако нисте ограничени да причате само са осталим Елемент корисницима. И наравно веома је безбедан.
+
+Елемент је способан да понуди све ово јер је базиран на Матриксу — што је стандард за отворену, децентрализовану комуникацију.
+
+Елемент омогућава да контролишете ко ће бити домаћин ваших конверзација. Из Елемент апликације, домаћина можете изабрати на више начина:
+
+1. Узмите бесплатан налог на matrix.org јавном серверу који хостују Матрикс програмериили изаберите неки од хиљада јавних сервера који хостују волонтери
+2. Сами хостујте свој налог покрећући сервер на свом сопственом хардверу
+3. Пријавите се за налог на посебним серверима једноставно прретплативши се на „Елементову Матрикс сервис“ хостинг платформу
+
+Зашто изабрати Елемент?
+
+ПОСЕДУЈТЕ СВОЈЕ ПОДАТКЕ: Ви одлучујете где ћете чувати своје податке и поруке. Ви их поседујете и контролишете, не нека МЕГАКОРПОРАЦИЈА која бунари по вашим подацима или омогућава приступ трећим странама.
+
+ОТВОРЕНА КОМУНИКАЦИЈА И САРАДЊА: Можете ћаскати са свима на Матрикс мрежи, без обзира да ли користе Елемент или другу Матрикс апликацију, па чак иако користе другачији систем порука, попут Слека (Slack), ИРЦ-а (IRC) или ИксМПП (XMPP).
+
+СУПЕР-БЕЗБЕДАН: Право с-краја-на-крај шифровање (само они који су у разговору могу да дешифрују поруке), и међу-потписивање ради верификације уређаја учесника у конверзацији.
+
+КОМПЛЕТНА КОМУНИКАЦИЈА: Поруке, гласовни и видео позиви, дељење фајлова и екрана и гомила интеграција, ботова и виџета. Правите собе, заједнице, останите у контакту и завршавајте послове.
+
+СВУДА ГДЕ СТЕ ВИ: Останите у контакту без обзира где сте, са потпуно синхронизованом историјом порука на свим вашим уређајима па и на вебу на https://app.element.io.
diff --git a/fastlane/metadata/android/sr/short_description.txt b/fastlane/metadata/android/sr/short_description.txt
new file mode 100644
index 0000000000..9dbc920402
--- /dev/null
+++ b/fastlane/metadata/android/sr/short_description.txt
@@ -0,0 +1 @@
+Сигурно децентрализовано ћаскање и разговори. Држите своје податке безбедним.
diff --git a/fastlane/metadata/android/sr/title.txt b/fastlane/metadata/android/sr/title.txt
new file mode 100644
index 0000000000..235687ef56
--- /dev/null
+++ b/fastlane/metadata/android/sr/title.txt
@@ -0,0 +1 @@
+Елемент (претходно Riot.im)
diff --git a/fastlane/metadata/android/sv/changelogs/40100100.txt b/fastlane/metadata/android/sv-SE/changelogs/40100100.txt
similarity index 100%
rename from fastlane/metadata/android/sv/changelogs/40100100.txt
rename to fastlane/metadata/android/sv-SE/changelogs/40100100.txt
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40100110.txt b/fastlane/metadata/android/sv-SE/changelogs/40100110.txt
new file mode 100644
index 0000000000..e3ed460f17
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Den här nya versionen innehåller mest förbättringar för användargränssnittet och användarupplevelsen. Du kan nu bjuda in vänner och skapa direktmeddelanden väldigt snabbt genom att skanna QR-koder.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40100120.txt b/fastlane/metadata/android/sv-SE/changelogs/40100120.txt
new file mode 100644
index 0000000000..375833fec5
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: URL-förhandsgranskning, bytt emojitangentbord, nya rumsinställningsförmågor, och en vit jul!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40100130.txt b/fastlane/metadata/android/sv-SE/changelogs/40100130.txt
new file mode 100644
index 0000000000..a2adbf9746
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: URL-förhandsgranskning, nya rumsinställningsförmågor, och en vit jul!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40100140.txt b/fastlane/metadata/android/sv-SE/changelogs/40100140.txt
new file mode 100644
index 0000000000..15596de911
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Redigering av rumsbehörigheter, automatiskt ljust/mörkt tema, och en hög buggfixar.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40100150.txt b/fastlane/metadata/android/sv-SE/changelogs/40100150.txt
new file mode 100644
index 0000000000..f280e5ed89
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Stöd för social inloggning.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40100160.txt b/fastlane/metadata/android/sv-SE/changelogs/40100160.txt
new file mode 100644
index 0000000000..adb520ecab
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Stöd för social inloggning.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.15 och https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40100170.txt b/fastlane/metadata/android/sv-SE/changelogs/40100170.txt
new file mode 100644
index 0000000000..37f027d054
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101000.txt b/fastlane/metadata/android/sv-SE/changelogs/40101000.txt
new file mode 100644
index 0000000000..1a5944da88
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Förbättringar för VoIP (ljud- och videosamtal i DM) och buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101010.txt b/fastlane/metadata/android/sv-SE/changelogs/40101010.txt
new file mode 100644
index 0000000000..66a3751aac
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: Förbättringar och buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101020.txt b/fastlane/metadata/android/sv-SE/changelogs/40101020.txt
new file mode 100644
index 0000000000..229793ab31
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: prestandaförbättringar och buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101030.txt b/fastlane/metadata/android/sv-SE/changelogs/40101030.txt
new file mode 100644
index 0000000000..7e0f8c80d2
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: prestandaförbättringar och buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101040.txt b/fastlane/metadata/android/sv-SE/changelogs/40101040.txt
new file mode 100644
index 0000000000..46a004ec54
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: prestandaförbättringar och buggfixar!
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101050.txt b/fastlane/metadata/android/sv-SE/changelogs/40101050.txt
new file mode 100644
index 0000000000..158e2032b7
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: hotfixar för 1.1.4
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101060.txt b/fastlane/metadata/android/sv-SE/changelogs/40101060.txt
new file mode 100644
index 0000000000..cc7a9b84b6
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: hotfixar för 1.1.5
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101070.txt b/fastlane/metadata/android/sv-SE/changelogs/40101070.txt
new file mode 100644
index 0000000000..4756a2d028
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: betastöd för utrymmen. Komprimera video innan den skickas.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101080.txt b/fastlane/metadata/android/sv-SE/changelogs/40101080.txt
new file mode 100644
index 0000000000..38d704f995
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: förbättringar för utrymmen.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101090.txt b/fastlane/metadata/android/sv-SE/changelogs/40101090.txt
new file mode 100644
index 0000000000..e1b5900a30
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: lägg till stöd för gitter.im-nätverket.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101100.txt b/fastlane/metadata/android/sv-SE/changelogs/40101100.txt
new file mode 100644
index 0000000000..bc7a6de663
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: tema- och stiluppdatering och nya funktioner för utrymmen.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101110.txt b/fastlane/metadata/android/sv-SE/changelogs/40101110.txt
new file mode 100644
index 0000000000..176fd38769
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: tema- och stiluppdatering och nya funktioner för utrymmen (buggfix för 1.1.10).
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101120.txt b/fastlane/metadata/android/sv-SE/changelogs/40101120.txt
new file mode 100644
index 0000000000..aeef7814ee
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: tema- och stiluppdatering och fixa en krasch efter videosamtal.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101130.txt b/fastlane/metadata/android/sv-SE/changelogs/40101130.txt
new file mode 100644
index 0000000000..def96d7315
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: huvudsakligen stabilitets- och buggfixuppdatering.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101140.txt b/fastlane/metadata/android/sv-SE/changelogs/40101140.txt
new file mode 100644
index 0000000000..96203647b9
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: fixa ett problem med krypterade meddelanden.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40101150.txt b/fastlane/metadata/android/sv-SE/changelogs/40101150.txt
new file mode 100644
index 0000000000..db74658651
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: röstmeddelandeimplementation under experimentinställningar.
+Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/sv-SE/full_description.txt b/fastlane/metadata/android/sv-SE/full_description.txt
new file mode 100644
index 0000000000..5302976ed7
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/full_description.txt
@@ -0,0 +1,39 @@
+Element är både en säker meddelandeapp och en samarbetsapp för produktivitet som är ideal för gruppchattar vid distansarbete. Appen använder totalsträckskryptering för att tillhandahålla kraftfulla videogruppsamtal, fildelning och röstsamtal.
+
+Elements funktioner inkluderar:
+- Avancerade kommunikationsverktyg
+- Fullt krypterade meddelanden för att tillåta säkrare företagskommunikation, även för distansarbetare
+- Decentraliserad chatt baserad på det öppna ramverket Matrix
+- Säker fildelning med krypterad data vid hantering av projekt
+- Videochattar med Voice over IP och skärmdelning
+- Enkel integration med dina föredragna onlinesamarbetsverktyg, projektledningsverktyg, VoIP-tjänster och andra teammeddelandeappar
+
+Element är helt olik andra meddelande- och samarbetsappar. Den använder Matrix, ett öppet nätverk för säkra meddelanden och decentraliserad kommunikation. Den låter dig driva en igen server för att ge användare maximalt ägandeskap över sin data och sina meddelanden.
+
+Sekretess och krypterade meddelanden
+Element skyddar dig från oönskad reklam, datainsamling och inlåsning. Den skyddar även all din data, en-till-en-video- och röstkommunikation genom totalsträckskryptering och korssignerad enhetsverifiering.
+
+Element sätter dig i kontroll över ditt privatliv och låter dig kommunicera säkert med vem som helst i Matrix-nätverket, eller andra samarbetsverktyg genom att integrera med appar som Slack.
+
+Du kan driva Element själv
+För att tillåta större kontroll över din känsliga data och konversationer, så kan du lägga Element på en egen server eller använda valfri Matrix-baserad värd - standarden för open source-baserad, decentraliserad kommunikation. Element ger dig sekretess, säkerhetsefterlevnad och integrationsflexibilitet.
+
+Äg din data
+Du bestämmer vart du vill lagra din data och dina meddelanden, utan rist för datainsamling eller åtkomst av tredje parter.
+
+Element sätter dig i kontroll på olika sätt:
+1. Få ett gratiskonto på den offentliga servern matrix.org som drivas av Matrixutvecklarna, eller välj bland tusentals offentliga servrar som drivs av volontärer
+2. Självdriv ditt konto genom att driva en server på din egen IT-infrastruktur
+3. Skapa ett konto på en anpassad server genom att abonnera på värdplattformen Element Matrix Services
+
+Öppen meddelandehantering och kommunikation
+Du kan chatta med vem som helst i Matrix-nätverket, oavsett om de använder Matrix, en annan Matrix-app eller till och med en annan meddelandeapp.
+
+Supersäker
+Riktig totalsträckskryptering (bara de i konversationen kan avkryptera meddelanden), och korssignerad enhetsverifiering.
+
+Komplett kommunikation och integration
+Meddelanden, röst- och videosamtal, fildelning, skärmdelning och massa integrationer, bottar och widgets. Bygg rum och gemenskaper, håll kontakten och få saker gjorda.
+
+Fortsätt där du lämnade
+Håll kontakten vart du än är med fullt synkroniserad meddelandehistorik på alla dina enheter och på webben på https://app.element.io
diff --git a/fastlane/metadata/android/sv-SE/short_description.txt b/fastlane/metadata/android/sv-SE/short_description.txt
new file mode 100644
index 0000000000..c16da5c761
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/short_description.txt
@@ -0,0 +1 @@
+Gruppmeddelandeapp - krypterade meddelanden, gruppchatt och videosamtal
diff --git a/fastlane/metadata/android/sv-SE/title.txt b/fastlane/metadata/android/sv-SE/title.txt
new file mode 100644
index 0000000000..4fc189de15
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/title.txt
@@ -0,0 +1 @@
+Element - Säker meddelandeapp
diff --git a/fastlane/metadata/android/sv/full_description.txt b/fastlane/metadata/android/sv/full_description.txt
deleted file mode 100644
index d130e9214a..0000000000
--- a/fastlane/metadata/android/sv/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element är en ny sorts meddelande- och samarbetsapp som:
-
-1. Sätter dig i kontroll för att kunna säkerställa ditt privatliv
-2. Låter dig kommunicera med vem som helst i Matrix-nätverket, och till och med bortom det genom integrationer med appar som Slack
-3. Skyddar dig från reklam, datainsamling och inlåsning
-4. Säkrar dig genom totalsträckskryptering, med korssingering för att verifiera andra
-
-Element skiljer sig helt från andra meddelande- och samarbetsappar genom att vara decentraliserad och öppen källkod.
-
-Element låter dig driva en egen server - eller välja en värd - så att du har sekretess, ägande och kontroll över din data och dina konversationer. Den ger dig tillgång till ett öppet nätverk; så att du inte kan prata bara med Element-användare. Och den är väldigt säker.
-
-Element kan göra allt detta för att den använder Matrix - standarden för öppen decentraliserad kommunikation.
-
-Element sätter dig i kontroll genom att låta dig välja att vara värd för dina konversationer. Från appen Element kan du välja att ansluta på följande sätt:
-
-1. Skaffa ett gratis konto på den publika servern på matrix.org, vilken drivs av Matrix-utvecklarna, eller välj bland tusentals offentliga servrar som drivs av volontärer
-2. Var värd för ditt eget konto genom att driva en server på din egen hårdvara
-3. Skapa ett konto på en anpassad server genom att registrera dig på värdplattformen Element Matrix Services
-
-Varför välja Element?
-
-ÄG DIN DATA: Du väljer var du vill ha din data och dina meddelanden. Du äger den och kontrollerar den, inte nåt stort företag som samlar in din data och ger den till tredje parter.
-
-ÖPPEN KOMMUNIKATION OCH ÖPPET SAMARBETE: Du kan chatta med vem som helst på Matrix-nätverket, oavsett om de använder Element eller en annan Matrix-app, och till och med om de använder ett annat meddelandesystem som Slack, IRC eller XMPP.
-
-SUPERSÄKER: Riktig totalsträckskryptering (bara de in konversationen kan avkryptera meddelandena), och korssingering för att verifiera konversationsmedlemmars enheter.
-
-KOMPLETT KOMMUNIKATION: Meddelanden, röst- och videosamtal, fildelning, skärmdelning och massa integrationer, bottar och widgets. Skapa rum och gemenskaper, håll kontakten och få saker gjorda.
-
-ÖVERALLT DÄR DU ÄR: Håll kontakten vart du än befinner dig med fullständigt synkroniserad meddelandehistorik på alla dina enheter och på webben på https://app.element.io.
diff --git a/fastlane/metadata/android/sv/short_description.txt b/fastlane/metadata/android/sv/short_description.txt
deleted file mode 100644
index ddfc5dcbfb..0000000000
--- a/fastlane/metadata/android/sv/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-Säker decentraliserad chatt och VoIP. Håll din data säker från tredje parter.
diff --git a/fastlane/metadata/android/sv/title.txt b/fastlane/metadata/android/sv/title.txt
deleted file mode 100644
index 573e27fab9..0000000000
--- a/fastlane/metadata/android/sv/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element (före detta Riot.im)
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40100100.txt b/fastlane/metadata/android/tr-TR/changelogs/40100100.txt
new file mode 100644
index 0000000000..ff6a936bbf
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Bu yeni sürüm başlıca hata düzeltmeleri ve iyileştirmeler içerir. Mesaj göndermek artık çok daha hızlı.
+Tam değişiklik günlüğü: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40100110.txt b/fastlane/metadata/android/tr-TR/changelogs/40100110.txt
new file mode 100644
index 0000000000..81ca97fd96
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Bu yeni sürüm, temel olarak kullanıcı arayüzü ve kullanıcı deneyimi iyileştirmelerini içerir. Artık QR kodlarını tarayarak arkadaşlarınızı davet edebilir ve çok hızlı bir şekilde DM oluşturabilirsiniz.
+Tam değişiklik günlüğü: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40100120.txt b/fastlane/metadata/android/tr-TR/changelogs/40100120.txt
new file mode 100644
index 0000000000..fb3268f74b
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Bu sürümdeki başlıca değişiklikler: URL ön izlemesi , yeni Emoji klavyesi, yeni oda ayarları ve Yılbaşı için kar!
+Tam değişiklik günlüğü: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40100130.txt b/fastlane/metadata/android/tr-TR/changelogs/40100130.txt
new file mode 100644
index 0000000000..fb3268f74b
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Bu sürümdeki başlıca değişiklikler: URL ön izlemesi , yeni Emoji klavyesi, yeni oda ayarları ve Yılbaşı için kar!
+Tam değişiklik günlüğü: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40100140.txt b/fastlane/metadata/android/tr-TR/changelogs/40100140.txt
new file mode 100644
index 0000000000..9a5cf6d5f0
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Bu sürümdeki başlıca değişiklikler: Oda izinlerini düzenleme, otomatik koyu/açık tema ve bir avuç hata düzeltmeleri.
+Değişim günlüğünün tamamı: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40100170.txt b/fastlane/metadata/android/tr-TR/changelogs/40100170.txt
new file mode 100644
index 0000000000..a93cbb4908
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Bu sürümdeki başlıca değişiklikler: Hata düzeltmeleri!
+değişim günlüğünün tamamı: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40101000.txt b/fastlane/metadata/android/tr-TR/changelogs/40101000.txt
new file mode 100644
index 0000000000..ce457ee0f4
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Bu sürümdeki ana değişiklikler: VoIP (DM'de sesli ve görüntülü aramalar) geliştirmeleri ve hata düzeltmeleri!
+Değişim günlüğünün tamamı: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/tr-TR/changelogs/40101010.txt b/fastlane/metadata/android/tr-TR/changelogs/40101010.txt
new file mode 100644
index 0000000000..912d5bcd7c
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Bu sürümdeki ana değişiklikler: performans iyileştirme ve hata düzeltmeleri!
+Değişim günlüğünün tamamı: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/tr-TR/full_description.txt b/fastlane/metadata/android/tr-TR/full_description.txt
new file mode 100644
index 0000000000..3895621620
--- /dev/null
+++ b/fastlane/metadata/android/tr-TR/full_description.txt
@@ -0,0 +1,30 @@
+Element, şu özelliklere sahip yeni bir tür mesajlaşma ve işbirliği uygulamasıdır:
+
+1. Gizliliğinizi korumak için kontrolü size verir
+2. Matrix ağındaki herkesle ve hatta Slack gibi uygulamalarla entegre olarak iletişim kurmanızı sağlar
+3. Sizi reklamlardan, veri madenciliğinden ve walled gardenlardan korur
+4. Başkalarını doğrulamak için çapraz imzalama ile uçtan uca şifreleme yoluyla güvenliğinizi sağlar
+
+Element, dağıtık (decentralized) ve açık kaynak olduğu için diğer mesajlaşma ve işbirliği uygulamalarından tamamen farklıdır.
+
+Element kendi sunucunuzu kurmanıza yada bir sunucu seçmenizi izin verir, böylece verilerinizin ve sohbetlerinizin gizliliğine ve kontrolüne sahip olursunuz. Size açık bir ağa erişim sağlar; yani yalnızca diğer Element kullanıcılarıyla konuşmak zorunda kalmazsınız. Ve çok güvenlidir.
+
+Element, açık, merkezi olmayan iletişim standardı olan Matrix üzerinde çalıştığı için tüm bunları yapabilir.
+
+Element, konuşmalarınızın sunucusunu seçmenize izin vererek kontrolü size verir. Element uygulamasından, farklı şekillerde sunucu seçebilirsiniz:
+
+1. Matrix geliştiricilerinin sahip olduğu matrix.org genel sunucusunda ücretsiz bir hesap edinin veya gönüllüler tarafından barındırılan binlerce genel sunucu arasından seçim yapın
+2. Kendi donanımınız üzerinde bir sunucu çalıştırarak kendi hesabınızı barındırın
+3. Element Matrix Hizmetleri sunucu platformuna abone olarak özel bir sunucuda hesap oluşturun
+
+Neden Element'i Seçmelisiniz
+
+KENDİ VERİLERİNİZE SAHİP OLUN : Verilerinizi ve mesajlarınızı nerede saklayacağınıza siz karar verirsiniz. Verilerinize madencilik yapan veya üçüncü şahıslara erişim sağlayan bir BÜYÜKŞİRKETE verilerinizi vermiyorsunuz, onlara sahipsiniz ve kontrol ediyorsunuz.
+
+AÇIK MESAJLAŞMA VE İŞBİRLİĞİ: Element veya başka bir Matrix uygulamalarını kullanmaları fark etmeksizin, hatta Slack, IRC yada XMPP gibi farklı mesajlaşma uygulamaları kullanıyor olsalar bile, Matrix sunucusundaki herhangi biriyle konuşabilirsiniz
+
+SÜPER GÜVENLİ: Gerçek uçtan uca şifreleme (yalnızca görüştüğünüz kişiler mesajların şifresini çözebilir) ve konuşma katılımcılarının cihazlarını doğrulamak için çapraz imzalama.
+
+TAM İLETİŞİM: Mesajlaşma, sesli ve görüntülü aramalar, dosya paylaşımı, ekran paylaşımı ve bir sürü entegrasyon, bot ve widgetlar. Odalar, topluluklar oluşturun, iletişimde kalın ve işlerinizi halledin.
+
+OLDUĞUNUZ HER YERDE: Nerede olursanız olun, tüm cihazlarınızda ve internette https://app.element.io adresinden tam senkronize mesaj geçmişiyle iletişimde kalın
diff --git a/fastlane/metadata/android/tr/short_description.txt b/fastlane/metadata/android/tr-TR/short_description.txt
similarity index 100%
rename from fastlane/metadata/android/tr/short_description.txt
rename to fastlane/metadata/android/tr-TR/short_description.txt
diff --git a/fastlane/metadata/android/tr/title.txt b/fastlane/metadata/android/tr-TR/title.txt
similarity index 100%
rename from fastlane/metadata/android/tr/title.txt
rename to fastlane/metadata/android/tr-TR/title.txt
diff --git a/fastlane/metadata/android/uk/changelogs/40100110.txt b/fastlane/metadata/android/uk/changelogs/40100110.txt
new file mode 100644
index 0000000000..32f220e75d
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Ця нова версія містить переважно поліпшення інтерфейсу та зручності користування. Тепер ви можете запросити друзів і створити прямі повідомлення дуже швидко, скануючи QR-коди.
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/uk/changelogs/40100120.txt b/fastlane/metadata/android/uk/changelogs/40100120.txt
new file mode 100644
index 0000000000..7342934333
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: попередній перегляд URL-адреси, нова клавіатура Emoji, нові можливості налаштування кімнати та сніг на Різдво!
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/uk/changelogs/40100130.txt b/fastlane/metadata/android/uk/changelogs/40100130.txt
new file mode 100644
index 0000000000..c1ccdd7500
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: попередній перегляд URL-адрес, нова клавіатура Emoji, нові можливості налаштування кімнати та сніг на Різдво!
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/uk/changelogs/40100140.txt b/fastlane/metadata/android/uk/changelogs/40100140.txt
new file mode 100644
index 0000000000..f61bebc71c
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+Основні зміни цієї версії: Керування дозволами кімнати, автоперемикання між світлою/темною темами та виправлення багатьох вад.
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/uk/changelogs/40100150.txt b/fastlane/metadata/android/uk/changelogs/40100150.txt
new file mode 100644
index 0000000000..5b76163ab0
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+Основні зміни цієї версії: підтримка входу за допомогою суспільних мереж.
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/uk/changelogs/40100160.txt b/fastlane/metadata/android/uk/changelogs/40100160.txt
new file mode 100644
index 0000000000..f3fa048e24
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+Основні зміни цієї версії: підтримка входу за допомогою суспільних мереж.
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.0.15 та https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/uk/changelogs/40100170.txt b/fastlane/metadata/android/uk/changelogs/40100170.txt
new file mode 100644
index 0000000000..c4b1bcc8e0
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+Основні зміни у цій версії: Виправлення помилок!
+Повний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/uk/changelogs/40101000.txt b/fastlane/metadata/android/uk/changelogs/40101000.txt
new file mode 100644
index 0000000000..36870f5ef7
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: поліпшення VoIP (аудіо та відео дзвінки в DM) та виправлення помилок!
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/uk/changelogs/40101010.txt b/fastlane/metadata/android/uk/changelogs/40101010.txt
new file mode 100644
index 0000000000..085ac5a118
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: поліпшення продуктивності та виправлення помилок!
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/uk/changelogs/40101020.txt b/fastlane/metadata/android/uk/changelogs/40101020.txt
new file mode 100644
index 0000000000..469de21a6f
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: поліпшення продуктивності та виправлення помилок!
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/uk/changelogs/40101030.txt b/fastlane/metadata/android/uk/changelogs/40101030.txt
new file mode 100644
index 0000000000..da2bb0ddd6
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: поліпшення продуктивності та виправлення помилок!
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/uk/changelogs/40101040.txt b/fastlane/metadata/android/uk/changelogs/40101040.txt
new file mode 100644
index 0000000000..663133a99c
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: поліпшення швидкодії та виправлення помилок!
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/uk/changelogs/40101050.txt b/fastlane/metadata/android/uk/changelogs/40101050.txt
new file mode 100644
index 0000000000..00f44f2606
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: виправлення для 1.1.4
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/uk/changelogs/40101060.txt b/fastlane/metadata/android/uk/changelogs/40101060.txt
new file mode 100644
index 0000000000..8a4ae2a4d2
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: виправлення для 1.1.5
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/uk/changelogs/40101070.txt b/fastlane/metadata/android/uk/changelogs/40101070.txt
new file mode 100644
index 0000000000..4d60bb1704
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: бета-підтримка Spaces. Стиснення відео перед надсиланням.
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/uk/changelogs/40101080.txt b/fastlane/metadata/android/uk/changelogs/40101080.txt
new file mode 100644
index 0000000000..c174603258
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+Основні зміни у цій версії: Вдосконалено Простори!
+Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/uk/changelogs/40101090.txt b/fastlane/metadata/android/uk/changelogs/40101090.txt
new file mode 100644
index 0000000000..af822ad291
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+Основні зміни цієї версії: підтримка мережі gitter.im.
+Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/uk/changelogs/40101100.txt b/fastlane/metadata/android/uk/changelogs/40101100.txt
new file mode 100644
index 0000000000..c1fde35579
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+Основні зміни цієї версії: оновлено зовнішній вигляд та нові можливості для просторів
+Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/uk/changelogs/40101110.txt b/fastlane/metadata/android/uk/changelogs/40101110.txt
new file mode 100644
index 0000000000..9aa1195e49
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+Основні зміни цієї версії: оновлено зовнішній вигляд та нові можливості для просторів (bugfix для 1.1.10)
+Вичерпний перелік змін: https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/uk/changelogs/40101120.txt b/fastlane/metadata/android/uk/changelogs/40101120.txt
new file mode 100644
index 0000000000..f738d32b83
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: оновлення теми та стилю та виправлення збоїв після відеовиклику
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/uk/changelogs/40101130.txt b/fastlane/metadata/android/uk/changelogs/40101130.txt
new file mode 100644
index 0000000000..fd6dcb9e97
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: в поліпшення стабільності та виправлення помилок.
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/uk/changelogs/40101140.txt b/fastlane/metadata/android/uk/changelogs/40101140.txt
new file mode 100644
index 0000000000..f2040a29d8
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+Основні зміни у цій версії: виправлення проблеми із зашифрованими повідомленнями.
+Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/uk/full_description.txt b/fastlane/metadata/android/uk/full_description.txt
index 026ae4162a..df06315754 100644
--- a/fastlane/metadata/android/uk/full_description.txt
+++ b/fastlane/metadata/android/uk/full_description.txt
@@ -1,30 +1,39 @@
-Element — це застосунок для спілкування та співпраці нового типу, який:
+Element — це і безпечний месенджер, і застосунок для співпраці команди, який ідеально підходить для групових бесід під час віддаленої роботи. Цей застосунок для спілкування застосовує наскрізне шифрування для забезпечення відеоконференцій, обміну файлами та голосових викликів.
-1. Надає вам повний контроль за своєю конфіденційністю
-2. Дозволяє спілкування з будь-ким у мережі Matrix та поза нею, інтегруючись із такими застосунками, як Slack
-3. Убезпечує вас від реклами, збору даних та штучних обмежень
-4. Захищає ваше спілкування наскрізним шифруванням із перехресним підписуванням для звірення інших осіб
+Можливості Element включають:
+- Розширені засоби спілкування в Інтернеті
+- Повністю зашифровані повідомлення для надання можливості безпечнішого корпоративного спілкування, навіть для віддалених працівників
+- Децентралізований чат на основі відкритого коду Matrix
+- Безпечний обмін файлами із зашифрованими даними для керування проєктами
+- Відеочати з передачею голосу через IP та показом екрану іншим
+- Проста інтеграція з вашими улюбленими інструментами для онлайн-співпраці, інструментами керування проєктами, послугами VoIP та іншими застосунками обміну повідомленнями для команд
-Element ґрунтовно відрізняється від інших застосунків для спілкування та співпраці тому що він є децентралізованим та відкритоджерельним.
+Element цілковито відрізняється від інших застосунків обміну повідомленнями та спільної роботи. Він працює на Matrix, відкритій мережі для безпечного обміну повідомленнями та децентралізованого зв'язку. Це дозволяє самостійне розгортання, щоб надати користувачам якнайбільше володіння та контролю над їх даними та повідомленнями.
-Element дозволяє вам розміщувати сервер в себе або обирати будь-якого з надавачів послуг, таким чином забезпечуючи вам конфіденційність і можливість володіти власними даними й бесідами та контролювати їх. Він надає вам доступ до відкритої мережі, тож ви не є обмеженими спілкуванням виключно з користувачами Element. І він є дуже надійним та безпечним.
+Приватність та обмін зашифрованими повідомленнями
+Element захищає вас від небажаної реклами, збору даних та обмежень. Він також захищає всі ваші дані, відео та голосовий зв'язок віч-на-віч за допомогою наскрізного шифрування та взаємного підписування пристроїв.
-Element здатен забезпечити усе це завдяки тому, що він заснований на протоколі Matrix — стандарті для відкритого та децентралізованого спілкування.
+Element дає вам можливість контролювати вашу приватність, одночасно дозволяючи вам безпечно спілкуватися з будь-ким у мережі Matrix або через інші інструменти ділової співпраці, інтегрувавшись із такими програмами, як Slack.
-Element надає вам повний контроль, дозволяючи обирати з-поміж надавачів послуг, що обслуговують сервери з вашими бесідами. Ви вільні обрати будь-який спосіб розміщення прямо з застосунку Element:
+Element можна розгортати самостійно
+Щоб забезпечити більше контролю над вашими приватними даними та розмовами, Element можна самостійно розміщувати або ви можете вибрати будь-який вузол на основі Matrix — стандарт для децентралізованого спілкування з відкритим кодом. Element надає вам приватність, відповідність безпеці та гнучкість інтеграції.
-1. Отримати безкоштовний обліковий запис на загальнодоступному сервері matrix.org, який обслуговують розробники Matrix, чи на одному з тисяч публічних серверів, які обслуговують волонтери
-2. Розмістити свій обліковий запис на власному сервері
-3. Зареєструватись на індивідуальному сервері, просто підписавшись на послуги платформи Element Matrix Services
+Ваші дані
+Ви вирішуєте, де зберігати свої дані та повідомлення. Без ризику видобутку даних або стороннього доступу.
-Чому я маю обрати Element?
+Element надає такі можливості на вибір:
+1. Отримайте безплатний обліковий запис на загальнодоступному сервері matrix.org, розміщеному розробниками Matrix, або виберіть серед тисяч загальнодоступних серверів, розміщених волонтерами
+2. Самостійно розмістіть свій обліковий запис, запустивши сервер на власній ІТ-інфраструктурі
+3. Зареєструйте обліковий запис на власному сервері, просто підписавшись на хостинг-платформу Element Matrix Services
-ВОЛОДІЙТЕ ВАШИМИ ДАНИМИ: Ви вирішуєте де тримати ваші дані та повідомлення. Саме ви володієте ними та контролюєте їх, а не якась Мегакорпорація, що збирає ваші дані та надає стороннім особам доступ до них.
+Відкриті обмін повідомленнями та співпраця
+Ви можете спілкуватися з усіма у мережі Matrix, незалежно від того, чи користуються вони Element, іншим застосунком Matrix або навіть якщо іншим застосунком для обміну повідомленнями.
-ВІДКРИТІ ОБМІН ПОВІДОМЛЕННЯМИ ТА СПІВПРАЦЯ: Ви можете балакати з будь-ким у мережі Matrix, хоч вони користуються Element, хоч іншим застосунком для Matrix, і навіть якщо вони користуються іншою системою обміну повідомленнями на кшталт Slack, IRC чи XMPP.
+Надбезпечний
+Справжнє наскрізне шифрування (лише учасники бесіди можуть розшифровувати повідомлення) та взаємне підписування пристроїв.
-НАДБЕЗПЕЧНІСТЬ: Справжнє наскрізне шифрування (лише ваші співрозмовники здатні дешифровувати повідомлення) та перехресне підписування для звірення пристроїв інших учасників бесіди.
+Повноцінні спілкування та інтеграція
+Обмін повідомленнями, голосові та відеовиклики, обмін файлами, спільний доступ до екрана та ціла купа інтеграцій, ботів та віджетів. Створюйте кімнати, спільноти, залишайтеся на зв’язку та виконуйте завдання.
-ДОВЕРШЕНИЙ ЗВʼЯЗОК: Повідомлення, голосові та відеодзвінки, обмін файлами, розподіл екрану та ціла купа інтеграцій, ботів та знадобів. Створюйте кімнати й спільноти, залишайтесь на зв'язку та завершуйте свої справи.
-
-ДЕ Б ВИ НЕ БУЛИ: Залишайтесь на зв'язку де б ви не були, разом з синхронізовною історією листувань на усіх ваших пристроях та в Інтернеті на https://app.element.io.
+Продовжуйте, де зупинилися
+Залишайтеся на зв'язку, де б ви не знаходились, з повністю синхронізованою історією повідомлень на всіх своїх пристроях та в Інтернеті за адресою https://app.element.io
diff --git a/fastlane/metadata/android/uk/short_description.txt b/fastlane/metadata/android/uk/short_description.txt
index 116f6f95b7..fa42cce81e 100644
--- a/fastlane/metadata/android/uk/short_description.txt
+++ b/fastlane/metadata/android/uk/short_description.txt
@@ -1 +1 @@
-Захищене децентралізоване листування та дзвінки. Тримайте ваші дані в безпеці.
+Груповий месенджер — зашифровані повідомлення, групові бесіди та відеовиклики
diff --git a/fastlane/metadata/android/uk/title.txt b/fastlane/metadata/android/uk/title.txt
index 88e3f7c573..0a170676ff 100644
--- a/fastlane/metadata/android/uk/title.txt
+++ b/fastlane/metadata/android/uk/title.txt
@@ -1 +1 @@
-Element (раніше Riot.im)
+Element — Безпечний месенджер
diff --git a/fastlane/metadata/android/vi/changelogs/40100100.txt b/fastlane/metadata/android/vi/changelogs/40100100.txt
new file mode 100644
index 0000000000..7125bbde9a
--- /dev/null
+++ b/fastlane/metadata/android/vi/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+Phiên bản mới này chủ yếu bao gồm sửa lỗi và một số cải thiện. Gửi tin nhắn trở nên nhanh chóng hơn trước.
+Danh sách đầy đủ các thay đổi: https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/vi/changelogs/40100110.txt b/fastlane/metadata/android/vi/changelogs/40100110.txt
new file mode 100644
index 0000000000..fce5eff648
--- /dev/null
+++ b/fastlane/metadata/android/vi/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+Phiên bản mới này chủ yếu bao gồm các cải thiện về giao diện và trải nghiệm người dùng. Bây giờ bạn có thể mời bạn bè và bắt đầu nói chuyện nhanh chóng bằng cách quét mã QR.
+Danh sách đầy đủ các thay đổi: https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/vi/short_description.txt b/fastlane/metadata/android/vi/short_description.txt
new file mode 100644
index 0000000000..cead47480f
--- /dev/null
+++ b/fastlane/metadata/android/vi/short_description.txt
@@ -0,0 +1 @@
+Nhắn tin nhóm - tin nhắn được mã hoá, cuộc trò chuyện nhóm và cuộc gọi video
diff --git a/fastlane/metadata/android/vi/title.txt b/fastlane/metadata/android/vi/title.txt
new file mode 100644
index 0000000000..8ef5498c44
--- /dev/null
+++ b/fastlane/metadata/android/vi/title.txt
@@ -0,0 +1 @@
+Element - Nhắn tin bảo mật
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100100.txt b/fastlane/metadata/android/zh-CN/changelogs/40100100.txt
new file mode 100644
index 0000000000..0c226c1c8f
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100100.txt
@@ -0,0 +1,2 @@
+此新版本主要包含错误修复和改进。现在,发送消息比以前快多了。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.10
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100110.txt b/fastlane/metadata/android/zh-CN/changelogs/40100110.txt
new file mode 100644
index 0000000000..8d6629db4c
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+此新版本主要包含用户界面和用户体验方面的改进。现在,您可以邀请朋友,并通过扫描二维码快速创建私聊。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100120.txt b/fastlane/metadata/android/zh-CN/changelogs/40100120.txt
new file mode 100644
index 0000000000..67d69a3834
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:链接预览,全新 Emoji 键盘,全新聊天室设置功能,以及圣诞节雪花!
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100130.txt b/fastlane/metadata/android/zh-CN/changelogs/40100130.txt
new file mode 100644
index 0000000000..5a2ba4256f
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:链接预览,全新 Emoji 键盘,全新聊天室设置功能,以及圣诞节雪花!
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100140.txt b/fastlane/metadata/android/zh-CN/changelogs/40100140.txt
new file mode 100644
index 0000000000..dc25b5094b
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:支持编辑聊天室权限,自动切换浅色/深色主题,修复大量错误。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100150.txt b/fastlane/metadata/android/zh-CN/changelogs/40100150.txt
new file mode 100644
index 0000000000..d5f37ff3a6
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:支持通过社交网络登录。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100160.txt b/fastlane/metadata/android/zh-CN/changelogs/40100160.txt
new file mode 100644
index 0000000000..c0658e1881
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:支持通过社交网络登录。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.15 和 https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40100170.txt b/fastlane/metadata/android/zh-CN/changelogs/40100170.txt
new file mode 100644
index 0000000000..55cbadb37f
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:修复错误!
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101000.txt b/fastlane/metadata/android/zh-CN/changelogs/40101000.txt
new file mode 100644
index 0000000000..95bd9c55c0
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:改进 VoIP(私聊中的音频与视频通话)以及修复错误!
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101010.txt b/fastlane/metadata/android/zh-CN/changelogs/40101010.txt
new file mode 100644
index 0000000000..9a4e611cf9
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:改进性能以及修复错误!
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101020.txt b/fastlane/metadata/android/zh-CN/changelogs/40101020.txt
new file mode 100644
index 0000000000..0de3f2aed0
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+此版本中的主要更新:改进性能和错误修复!
+完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101030.txt b/fastlane/metadata/android/zh-CN/changelogs/40101030.txt
new file mode 100644
index 0000000000..5a7fae92d5
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+此版本中的主要更新:改进性能和修复错误!
+完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101040.txt b/fastlane/metadata/android/zh-CN/changelogs/40101040.txt
new file mode 100644
index 0000000000..44a3547b3e
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+此版本中的主要更新:改进性能和修复错误!
+完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101050.txt b/fastlane/metadata/android/zh-CN/changelogs/40101050.txt
new file mode 100644
index 0000000000..c320815a00
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+此版本中的主要更新:1.1.4 的热修复
+完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101060.txt b/fastlane/metadata/android/zh-CN/changelogs/40101060.txt
new file mode 100644
index 0000000000..193ef8f48e
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+此版本中的主要更新:1.1.5 的热修复
+完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101070.txt b/fastlane/metadata/android/zh-CN/changelogs/40101070.txt
new file mode 100644
index 0000000000..ba8e92be9b
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+此版本中的主要更新:对「空间」的测试版支持。发送前压缩视频。
+完整的更新记录:https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101080.txt b/fastlane/metadata/android/zh-CN/changelogs/40101080.txt
new file mode 100644
index 0000000000..64b6462ad2
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:对空间进行改进。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101090.txt b/fastlane/metadata/android/zh-CN/changelogs/40101090.txt
new file mode 100644
index 0000000000..c4c6b349c8
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:为 gitter.im 网络提供支持。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101100.txt b/fastlane/metadata/android/zh-CN/changelogs/40101100.txt
new file mode 100644
index 0000000000..b748f34290
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:主题和样式更新以及空间的新功能。
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/zh-CN/changelogs/40101110.txt b/fastlane/metadata/android/zh-CN/changelogs/40101110.txt
new file mode 100644
index 0000000000..ef3f46e07d
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+此版本的主要变化:主题和样式更新以及空间的新功能(1.1.10 的错误修复)
+完整更新日志:https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/zh-CN/full_description.txt b/fastlane/metadata/android/zh-CN/full_description.txt
new file mode 100644
index 0000000000..fa6b00f1e4
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/full_description.txt
@@ -0,0 +1,39 @@
+Element 不仅是安全的通讯软件,同时也是生产力团队协作应用,非常适合在远端工作时进行群组聊天。此聊天应用使用了端到端加密来提供强大的视频会议、文件分享与语音通话功能。
+
+Element 的功能包含了:
+- 进阶的线上通讯工具
+- 完全加密的信息,即使对于远端工作者来说,也可以有更安全的公司通讯
+- 以 Matrix 开放源码框架为基础的去中心化的聊天
+- 在管理项目时通过加密资料安全地分享文件
+- 包含了 VoIP 与画面分享的视频聊天
+- 与你最喜欢的协作工具、项目管理工具、VoIP 服务与其他团队信息应用轻松整合
+
+Element 与其他信息传递与协作应用完全不同。它在 Matrix(一个用于安全传递讯息与去中心化通讯的开放网络)上运行。其可以自建,让使用者对他们的资料和信息拥有最大的所有权与控制权。
+
+隐私与加密信息传递
+Element 保护你不受不想要的广告、信息泄露与围城侵扰。其也通过端到端加密与交叉签章装置验证保护了你所有的资料,并提供一对一视频以及语音通讯。
+
+Element 通过与其他商业协作工具,如 Slack 等应用整合,让你可以在控制你的隐私的同时,也可以与 Matrix 网络上的任何人安全地通讯。
+
+Element 可以自建
+为了可以完整控制你的敏感资料与对话,Element 可以自建,你也可以选择任何以 Matrix 为基础的服务提供商,开放源码、去中心化的通讯标准。Element 为你提供隐私、安全合规与整合灵活性。
+
+拥有你的资料
+你可以决定将你的资料与信息储存在何处。没有信息泄露或被第三方爬取的风险。
+
+Element 透过不同的方式让你掌控一切:
+1. 在 Matrix 开发者架设的 matrix.org 公开服务器上取得免费帐号,或是从数千个由志愿者架设的公开服务器中选择
+2. 在你自己的 IT 基础架构上的服务器自行托管你的帐号
+3. 只要订阅 Element Matrix Services 托管平台就可以在自定义的服务器上注册帐号
+
+开放信息传递与协作
+你可以与 Matrix 网络上的任何人聊天,不论他们是使用 Element、其他 Matrix 应用或其他通讯应用。
+
+超级安全
+真正的端到端加密(仅有那些在对话中的可以解密讯息)以及交叉签章装置验证。
+
+完整的通讯与整合
+信息传递、语音与视频通话、文件分享、画面分享与超多的整合、机器人与挂件。建构聊天室、社群、保持联络并完成工作。
+
+从上次离开的地方开始
+无论你身在何处,都可以透过在你所有设备与网页 https://app.element.io 间完全同步的信息历史保持联络
diff --git a/fastlane/metadata/android/zh-CN/short_description.txt b/fastlane/metadata/android/zh-CN/short_description.txt
new file mode 100644
index 0000000000..e271e7f9a4
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/short_description.txt
@@ -0,0 +1 @@
+群组消息应用-加密的消息传递、群组聊天和视频通话
diff --git a/fastlane/metadata/android/zh-CN/title.txt b/fastlane/metadata/android/zh-CN/title.txt
new file mode 100644
index 0000000000..aad1a96f19
--- /dev/null
+++ b/fastlane/metadata/android/zh-CN/title.txt
@@ -0,0 +1 @@
+Element - 安全消息应用
diff --git a/fastlane/metadata/android/zh_Hant/changelogs/40100100.txt b/fastlane/metadata/android/zh-TW/changelogs/40100100.txt
similarity index 100%
rename from fastlane/metadata/android/zh_Hant/changelogs/40100100.txt
rename to fastlane/metadata/android/zh-TW/changelogs/40100100.txt
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100110.txt b/fastlane/metadata/android/zh-TW/changelogs/40100110.txt
new file mode 100644
index 0000000000..22dfe07097
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40100110.txt
@@ -0,0 +1,2 @@
+這個新版本主要包含使用者介面與使用者體驗改善。現在您可以邀請朋友,並透過掃描 QR code 來快速建立直接訊息了。
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.11
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100120.txt b/fastlane/metadata/android/zh-TW/changelogs/40100120.txt
new file mode 100644
index 0000000000..846126af63
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40100120.txt
@@ -0,0 +1,2 @@
+此版本中的主要變更:URL 預覽、新的表情符號鍵盤、新的聊天室設定功能以及聖誕節降雪!
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.12
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100130.txt b/fastlane/metadata/android/zh-TW/changelogs/40100130.txt
new file mode 100644
index 0000000000..f42e9d3101
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40100130.txt
@@ -0,0 +1,2 @@
+此版本中的主要變更:URL 預覽、新的表情符號鍵盤、新的聊天室設定功能以及聖誕節降雪!
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.13
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100140.txt b/fastlane/metadata/android/zh-TW/changelogs/40100140.txt
new file mode 100644
index 0000000000..9ed2152127
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40100140.txt
@@ -0,0 +1,2 @@
+此版本的主要變動:編輯聊天室權限、自動淺色/深色佈景主題與許多臭蟲修復。
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.14
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100150.txt b/fastlane/metadata/android/zh-TW/changelogs/40100150.txt
new file mode 100644
index 0000000000..09a67d544b
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40100150.txt
@@ -0,0 +1,2 @@
+此版本的主要變動:社群網路登入支援。
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.15
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100160.txt b/fastlane/metadata/android/zh-TW/changelogs/40100160.txt
new file mode 100644
index 0000000000..77606636d3
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40100160.txt
@@ -0,0 +1,2 @@
+此版本的主要變動:社群網路登入支援。
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.15 以及 https://github.com/vector-im/element-android/releases/tag/v1.0.16
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40100170.txt b/fastlane/metadata/android/zh-TW/changelogs/40100170.txt
new file mode 100644
index 0000000000..35b8a54110
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40100170.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:錯誤修復!
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.0.17
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101000.txt b/fastlane/metadata/android/zh-TW/changelogs/40101000.txt
new file mode 100644
index 0000000000..3d5049ad65
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101000.txt
@@ -0,0 +1,2 @@
+此版本的主要變更:VoIP(直接訊息中的音訊與視訊通話)改善與錯誤修復!
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.0
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101010.txt b/fastlane/metadata/android/zh-TW/changelogs/40101010.txt
new file mode 100644
index 0000000000..8b0e45e6b3
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101010.txt
@@ -0,0 +1,2 @@
+此版本的主要變更:效能改進與錯誤修復!
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.1
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101020.txt b/fastlane/metadata/android/zh-TW/changelogs/40101020.txt
new file mode 100644
index 0000000000..90e76b074e
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101020.txt
@@ -0,0 +1,2 @@
+此版本中的主要變更:效能改進與錯誤修復!
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.2
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101030.txt b/fastlane/metadata/android/zh-TW/changelogs/40101030.txt
new file mode 100644
index 0000000000..c13d6ecfd4
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101030.txt
@@ -0,0 +1,2 @@
+此版本中的主要變更:效能改進與錯誤修復!
+完整變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.3
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101040.txt b/fastlane/metadata/android/zh-TW/changelogs/40101040.txt
new file mode 100644
index 0000000000..1786691c42
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101040.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:效能改善與錯誤修復!
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.4
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101050.txt b/fastlane/metadata/android/zh-TW/changelogs/40101050.txt
new file mode 100644
index 0000000000..899ce72c9a
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101050.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:1.1.4 的快速修補
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.5
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101060.txt b/fastlane/metadata/android/zh-TW/changelogs/40101060.txt
new file mode 100644
index 0000000000..838dc6d731
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101060.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:1.1.5 的快速修補
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.6
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101070.txt b/fastlane/metadata/android/zh-TW/changelogs/40101070.txt
new file mode 100644
index 0000000000..c62c7d5224
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101070.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:對「空間」的測試版支援。傳送前壓縮影片。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.7
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101080.txt b/fastlane/metadata/android/zh-TW/changelogs/40101080.txt
new file mode 100644
index 0000000000..4ed232fe70
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101080.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:改善「空間」的功能。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.8
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101090.txt b/fastlane/metadata/android/zh-TW/changelogs/40101090.txt
new file mode 100644
index 0000000000..84e46bdd76
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101090.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:新增對 gitter.im 網路的支援。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.9
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101100.txt b/fastlane/metadata/android/zh-TW/changelogs/40101100.txt
new file mode 100644
index 0000000000..08e081fd8b
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101100.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:佈景主題與樣式更新,以及空間的新功能。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.10
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101110.txt b/fastlane/metadata/android/zh-TW/changelogs/40101110.txt
new file mode 100644
index 0000000000..91bbc18fff
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101110.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:佈景主題與樣式更新,以及空間的新功能(1.1.10 的臭蟲修復版本)
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.11
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101120.txt b/fastlane/metadata/android/zh-TW/changelogs/40101120.txt
new file mode 100644
index 0000000000..152173fe1b
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101120.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:佈景主題與樣式更新,以及修復視訊通話後當機的問題
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.12
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101130.txt b/fastlane/metadata/android/zh-TW/changelogs/40101130.txt
new file mode 100644
index 0000000000..88f439281f
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101130.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:主要是穩定性與臭蟲修復更新。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.13
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101140.txt b/fastlane/metadata/android/zh-TW/changelogs/40101140.txt
new file mode 100644
index 0000000000..3eb5aa35ed
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101140.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:修復關於加密訊息的問題。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.14
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40101150.txt b/fastlane/metadata/android/zh-TW/changelogs/40101150.txt
new file mode 100644
index 0000000000..c730151fe7
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40101150.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:實驗室設定下,語音訊息的實作。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases/tag/v1.1.15
diff --git a/fastlane/metadata/android/zh-TW/full_description.txt b/fastlane/metadata/android/zh-TW/full_description.txt
new file mode 100644
index 0000000000..90c0eb4c4c
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/full_description.txt
@@ -0,0 +1,39 @@
+Element 同時是安全的通訊軟體,也是生產力團隊協作應用程式,非常適合在遠端工作時進行群組聊天。此聊天應用程式使用了端到端加密來提供強大的視訊會議、檔案分享與語音通話。
+
+Element 的功能包含了:
+- 進階線上通訊工具
+- 完全加密的訊息,即使對於遠端工作者,也可以有更安全的公司通訊
+- 以 Matrix 開放原始碼框架為基礎的去中心化的聊天
+- 在管理專案時透過加密資料安全地分享檔案
+- 包含了 VoIP 與畫面分享的視訊聊天
+- 與您最喜歡的協作工具、專案管理工具、VoIP 服務與其他團隊訊息應用程式輕鬆整合
+
+Element 與其他訊息傳遞與協作應用程式完全不同。它在 Matrix(一個用於安全傳遞訊息與去中心化通訊的開放網路)上執行。其可以自架,讓使用者對他們的資料與訊息有最大的所有權與控制權。
+
+隱私與加密訊息傳遞
+Element 保護您不受不想要的廣告、資料挖礦與圍牆花園侵擾。其也透過端到端加密與交叉簽章裝置驗證保護了您所有的資料,並提供一對一視訊以及語音通訊。
+
+Element 透過與其他商業協作工具,如 Slack 等應用程式整合,讓您可以在控制您的隱私的同時,也可以與 Matrix 網路上的任何人安全地通訊。
+
+Element 可以自架
+為了可以完整控制您的敏感資料與對話,Element 可以自架,您也可以選擇任何以 Matrix 為基礎的服務提供商,開放原始碼、去中心化的通訊標準。Element 為您提供隱私、安全合規與整合活性。
+
+擁有您的資料
+您可以決定將您的資料與訊息儲存在何處。沒有資料挖礦或被第三方存取的風險。
+
+Element 透過不同的方式讓您掌控一切:
+1. 在 Matrix 開發者架設的 matrix.org 公開伺服器上取得免費帳號,或是從數千個由志願者架設的公開伺服器中選擇
+2. 在您自己的 IT 基礎架構上執行伺服器來自行託管您的帳號
+3. 只要訂閱 Element Matrix Services 託管平台就可以在自訂的伺服器上註冊帳號
+
+開放訊息傳遞與協作
+您可以與 Matrix 網路上的任何人聊天,不論他們是使用 Element、其他 Matrix 應用程式或其他通訊應用程式。
+
+超級安全
+真的端到端加密(僅有那些在對話中的可以解密訊息)以及交叉簽章裝置驗證。
+
+完整的通訊與整合Complete communication and integration
+訊息傳遞、語音與視訊通話、檔案分享、畫面分享與超多的整合、機器人與小工具。建構聊天室、社群、保持聯絡並完成工作。
+
+從上次離開的地方開始
+無論您身在何處,都可以透過在您所有裝置與網頁 https://app.element.io 間完全同步的訊息歷史保持聯絡
diff --git a/fastlane/metadata/android/zh-TW/short_description.txt b/fastlane/metadata/android/zh-TW/short_description.txt
new file mode 100644
index 0000000000..0d1f5bb7cd
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/short_description.txt
@@ -0,0 +1 @@
+群組通訊軟體 - 訊息加密、群組聊天與視訊通話
diff --git a/fastlane/metadata/android/zh-TW/title.txt b/fastlane/metadata/android/zh-TW/title.txt
new file mode 100644
index 0000000000..47d8a6b3ad
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/title.txt
@@ -0,0 +1 @@
+Element - 安全的通訊軟體
diff --git a/fastlane/metadata/android/zh_Hans/full_description.txt b/fastlane/metadata/android/zh_Hans/full_description.txt
deleted file mode 100644
index 12664f7c9b..0000000000
--- a/fastlane/metadata/android/zh_Hans/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element 是一种新型消息和协作应用:
-
-1. 使您可以掌控您的隐私
-2. 使您与 Matrix 网络中的任何人交流,甚至可以通过与其他应用如 Slack 集成
-3. 保护您远离广告,数据挖掘和围墙花园
-4. 通过端到端加密保护您,通过交叉签名验证其他人
-
-Element 与其他消息和协作应用完全不同,因为它是去中心化且开源的。
-
-Element 使您可以自托管 - 或选择托管商 - 因此您拥有您的数据和会话的隐私权,所有权和控制权。它使您可以访问开放网络;因此您可以不仅仅与其他 Element 用户交流。并且它非常安全。
-
-Element 可以做到这些因为它在 Matrix 上运行 - 开放,去中心化通信标准。
-
-Element 通过让您选择谁来托管您的会话使您掌控一切。在 Element 应用中,您可以选择不同的托管方式:
-
-1. 在由 Matrix 开发者托管的 matrix.org 公共服务器上获取免费帐户,或从志愿者托管的几千个公共服务器中选择
-2. 在您自己的硬件上运行服务器自托管您的会话
-3. 通过简单地订阅 Element Matrix Services 托管平台在自定义服务器上注册账户
-
-为什么选择 Element?
-
-拥有您的数据:您来决定存放您的数据和消息的位置。拥有并控制它的是您,而不是挖掘您的数据或与第三方分享的巨型企业。
-
-开放消息与协作:您可以与 Matrix 网络中的任何人聊天,不论他们使用 Element 还是其他 Matrix 应用,甚至即使他们在使用不同的消息系统例如 Slack,IRC 或 XMPP。
-
-超级安全:真正的端到端加密(仅有会话中的人可以解密消息),及用于验证会话参与方的设备的交叉签名。
-
-丰富的通信方式:消息,语音和视频通话,文件分享,屏幕分享和大量集成,机器人和小部件。建立房间,社区,保持联系并做好工作。
-
-随时随地:通过在您的全部设备和 https://app.element.io 网页上完全同步的消息历史,无论您在哪里都可以保持联系。
diff --git a/fastlane/metadata/android/zh_Hans/short_description.txt b/fastlane/metadata/android/zh_Hans/short_description.txt
deleted file mode 100644
index 87d127335b..0000000000
--- a/fastlane/metadata/android/zh_Hans/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-安全去中心化的聊天和 VoIP。保护您的数据不受第三方的影响。
diff --git a/fastlane/metadata/android/zh_Hans/title.txt b/fastlane/metadata/android/zh_Hans/title.txt
deleted file mode 100644
index 03aecdd2cb..0000000000
--- a/fastlane/metadata/android/zh_Hans/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element(曾为 Riot.im)
diff --git a/fastlane/metadata/android/zh_Hant/full_description.txt b/fastlane/metadata/android/zh_Hant/full_description.txt
deleted file mode 100644
index 2fdf6fa478..0000000000
--- a/fastlane/metadata/android/zh_Hant/full_description.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-Element 是一種新型態的即時通訊軟體與協作應用程式:
-
-1. 自己的隱私自己掌控
-2. 讓您與任何在 Matrix 網路中的人通訊,甚至可與如 Slack 等的應用程式整合
-3. 保護您免受廣告、資料採礦與圍牆花園的侵害
-4. 透過端到端加密保護您,並使用交叉簽章來驗證其他人
-
-Element 是去中心化且開放原始碼的應用程式,因此與其他即時通訊與協作軟體完全不同。
-
-Element 讓您可以自架(或是自行選擇服務提供者)所以您擁有您資料與對話的隱私、所有權與控制權。它讓您可以存取開放的網路;因此,您不僅可以與其他 Matrix 使用者聊天。而且非常安全。
-
-Element 能作到這些事情是因為它在 Matrix 上執行,這是一個開放的去中心化通訊的標準。
-
-Element 讓您選擇您要在哪裡託管您的對話來將控制權還給您。在 Element 應用程式中,您可以選擇其他方式來託管:
-
-1. 在由 Matrix 開發者架設的 matrix.org 公開伺服器上取得免費的帳號,或是從數千個由志願者所架設的公開伺服器中選擇
-2. 在您自己的硬體上自行架設伺服器並建立帳號
-3. 訂閱 Element Matrix 服務託管平台並在自訂伺服氣上註冊帳號
-
-為何選擇 Element?
-
-擁有您的資料:您決定您的資料與訊息要放在哪裡。您擁有並控制它,而非某些科技巨頭會挖掘您的資料並將其售予第三方。
-
-開放的即時通訊與協作:您可以與 Matrix 網路中的任何人聊天,不管他們是使用 Element 或其他 Matrix 應用程式都可以,或甚至是其他的訊息系統,如 Slack、IRC 或 XMPP 也都可以。
-
-超級安全:即時的端到端加密(僅有參與對話的人可以解密訊息),以及交叉簽章以驗證對話參與者的裝置。
-
-完整通訊:即時通訊、語音與視訊通話、檔案分享、畫面分享與超多的整合、機器人與小工具。建立聊天室、保持聯繫並完成工作。
-
-無論您身在何處:無論您身在何處,都可以透過 https://app.element.io 來在所有裝置與網路上保持訊息歷史同步。
diff --git a/fastlane/metadata/android/zh_Hant/short_description.txt b/fastlane/metadata/android/zh_Hant/short_description.txt
deleted file mode 100644
index 23bb82c04e..0000000000
--- a/fastlane/metadata/android/zh_Hant/short_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-安全的去中心化聊天與 VoIP。確保您的資料不受第三方的影響。
diff --git a/fastlane/metadata/android/zh_Hant/title.txt b/fastlane/metadata/android/zh_Hant/title.txt
deleted file mode 100644
index 3be2260b73..0000000000
--- a/fastlane/metadata/android/zh_Hant/title.txt
+++ /dev/null
@@ -1 +0,0 @@
-Element(曾名為 Riot.im)
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index e708b1c023..7454180f2a 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index f1577bddaa..a37233c5e2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=a7ca23b3ccf265680f2bfd35f1f00b1424f4466292c7337c85d46c9641b3f053
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-all.zip
+distributionSha256Sum=a8da5b02437a60819cad23e10fc7e9cf32bcb57029d9cb277e26eeff76ce014b
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index 4f906e0c81..1b6c787337 100755
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
-#!/usr/bin/env sh
+#!/bin/sh
#
-# Copyright 2015 the original author or authors.
+# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -17,67 +17,101 @@
#
##############################################################################
-##
-## Gradle start up script for UN*X
-##
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
##############################################################################
# Attempt to set APP_HOME
+
# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
+
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
+APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
+MAX_FD=maximum
warn () {
echo "$*"
-}
+} >&2
die () {
echo
echo "$*"
echo
exit 1
-}
+} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
-case "`uname`" in
- CYGWIN* )
- cygwin=true
- ;;
- Darwin* )
- darwin=true
- ;;
- MINGW* )
- msys=true
- ;;
- NONSTOP* )
- nonstop=true
- ;;
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
@@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
- JAVACMD="$JAVA_HOME/jre/sh/java"
+ JAVACMD=$JAVA_HOME/jre/sh/java
else
- JAVACMD="$JAVA_HOME/bin/java"
+ JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
- JAVACMD="java"
+ JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
-
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=`expr $i + 1`
- done
- case $i in
- 0) set -- ;;
- 1) set -- "$args0" ;;
- 2) set -- "$args0" "$args1" ;;
- 3) set -- "$args0" "$args1" "$args2" ;;
- 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=`save "$@"`
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+# Collect all arguments for the java command;
+# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
+# shell script including quotes and variable substitutions, so put them in
+# double quotes to make sure that they get re-expanded; and
+# * put everything else in single quotes, so that it's not re-expanded.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
exec "$JAVACMD" "$@"
diff --git a/library/ui-styles/.gitignore b/library/ui-styles/.gitignore
new file mode 100644
index 0000000000..42afabfd2a
--- /dev/null
+++ b/library/ui-styles/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/library/ui-styles/build.gradle b/library/ui-styles/build.gradle
new file mode 100644
index 0000000000..e264ef8319
--- /dev/null
+++ b/library/ui-styles/build.gradle
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+plugins {
+ id 'com.android.library'
+ id 'kotlin-android'
+}
+
+android {
+ compileSdkVersion 30
+ buildToolsVersion "30.0.3"
+
+ defaultConfig {
+ minSdkVersion 21
+ targetSdkVersion 30
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ consumerProguardFiles "consumer-rules.pro"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+dependencies {
+ implementation 'androidx.appcompat:appcompat:1.3.1'
+ implementation 'com.google.android.material:material:1.4.0'
+ // Pref theme
+ implementation 'androidx.preference:preference-ktx:1.1.1'
+ // PFLockScreen attrs
+ implementation 'com.github.vector-im:PFLockScreen-Android:1.0.0-beta12'
+ // dialpad dimen
+ implementation 'im.dlg:android-dialer:1.2.5'
+ // AudioRecordView attr
+ implementation 'com.github.Armen101:AudioRecordView:1.0.5'
+}
\ No newline at end of file
diff --git a/library/ui-styles/src/debug/AndroidManifest.xml b/library/ui-styles/src/debug/AndroidManifest.xml
new file mode 100644
index 0000000000..e32676136d
--- /dev/null
+++ b/library/ui-styles/src/debug/AndroidManifest.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugBottomSheet.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugBottomSheet.kt
new file mode 100644
index 0000000000..9998fd661f
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugBottomSheet.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.google.android.material.bottomsheet.BottomSheetDialogFragment
+import im.vector.lib.ui.styles.databinding.ActivityDebugMaterialThemeBinding
+
+class DebugBottomSheet : BottomSheetDialogFragment() {
+ override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
+ // Reuse tha Activity layout
+ val binding = ActivityDebugMaterialThemeBinding.inflate(inflater, container, false)
+ return binding.root
+ }
+}
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt
new file mode 100644
index 0000000000..553d495e22
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeActivity.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+import android.os.Bundle
+import android.view.Menu
+import android.widget.Toast
+import androidx.appcompat.app.AppCompatActivity
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.google.android.material.snackbar.Snackbar
+import im.vector.lib.ui.styles.R
+import im.vector.lib.ui.styles.databinding.ActivityDebugMaterialThemeBinding
+import im.vector.lib.ui.styles.dialogs.MaterialProgressDialog
+
+// Rendering is not the same with VectorBaseActivity
+abstract class DebugMaterialThemeActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val views = ActivityDebugMaterialThemeBinding.inflate(layoutInflater)
+ setContentView(views.root)
+
+ setSupportActionBar(views.debugToolbar)
+ supportActionBar?.let {
+ it.setDisplayShowHomeEnabled(true)
+ it.setDisplayHomeAsUpEnabled(true)
+ }
+
+ views.debugShowSnackbar.setOnClickListener {
+ Snackbar.make(views.coordinatorLayout, "Snackbar!", Snackbar.LENGTH_SHORT)
+ .setAction("Action") { }
+ .show()
+ }
+
+ views.debugShowToast.setOnClickListener {
+ Toast.makeText(this, "Toast", Toast.LENGTH_SHORT).show()
+ }
+
+ views.debugShowDialog.setOnClickListener {
+ showTestDialog(0)
+ }
+
+ views.debugShowDialogDestructive.setOnClickListener {
+ showTestDialog(R.style.ThemeOverlay_Vector_MaterialAlertDialog_Destructive)
+ }
+
+ views.debugShowDialogNegativeDestructive.setOnClickListener {
+ showTestDialog(R.style.ThemeOverlay_Vector_MaterialAlertDialog_NegativeDestructive)
+ }
+
+ views.debugShowProgressDialog.setOnClickListener {
+ MaterialProgressDialog(this)
+ .show(message = "Progress Dialog\nLine 2", cancellable = true)
+ }
+
+ views.debugShowBottomSheet.setOnClickListener {
+ DebugBottomSheet().show(supportFragmentManager, "TAG")
+ }
+ }
+
+ private fun showTestDialog(theme: Int) {
+ MaterialAlertDialogBuilder(this, theme)
+ .setTitle("Dialog title")
+ .setMessage("Dialog content\nLine 2")
+ .setIcon(R.drawable.ic_debug_icon)
+ .setPositiveButton("Positive", null)
+ .setNegativeButton("Negative", null)
+ .setNeutralButton("Neutral", null)
+ .show()
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ menuInflater.inflate(R.menu.menu_debug, menu)
+ return true
+ }
+}
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkDefaultActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkDefaultActivity.kt
new file mode 100644
index 0000000000..d24ceb6ede
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkDefaultActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugMaterialThemeDarkDefaultActivity : DebugMaterialThemeActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkTestActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkTestActivity.kt
new file mode 100644
index 0000000000..fea1f27dae
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkTestActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugMaterialThemeDarkTestActivity : DebugMaterialThemeActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkVectorActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkVectorActivity.kt
new file mode 100644
index 0000000000..379d55d006
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeDarkVectorActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugMaterialThemeDarkVectorActivity : DebugMaterialThemeActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightDefaultActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightDefaultActivity.kt
new file mode 100644
index 0000000000..57f172bdc3
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightDefaultActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugMaterialThemeLightDefaultActivity : DebugMaterialThemeActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightTestActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightTestActivity.kt
new file mode 100644
index 0000000000..d3a6c757fb
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightTestActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugMaterialThemeLightTestActivity : DebugMaterialThemeActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightVectorActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightVectorActivity.kt
new file mode 100644
index 0000000000..3fafa61421
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugMaterialThemeLightVectorActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugMaterialThemeLightVectorActivity : DebugMaterialThemeActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesActivity.kt
new file mode 100644
index 0000000000..50d1e344e9
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesActivity.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import im.vector.lib.ui.styles.databinding.ActivityDebugButtonStylesBinding
+
+abstract class DebugVectorButtonStylesActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val views = ActivityDebugButtonStylesBinding.inflate(layoutInflater)
+ setContentView(views.root)
+ }
+}
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesDarkActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesDarkActivity.kt
new file mode 100644
index 0000000000..102ca53f3c
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesDarkActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugVectorButtonStylesDarkActivity : DebugVectorButtonStylesActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesLightActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesLightActivity.kt
new file mode 100644
index 0000000000..c1b01dc6a3
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorButtonStylesLightActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugVectorButtonStylesLightActivity : DebugVectorButtonStylesActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt
new file mode 100644
index 0000000000..db50500195
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewActivity.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+import android.os.Bundle
+import android.text.InputType
+import android.widget.EditText
+import androidx.appcompat.app.AppCompatActivity
+import im.vector.lib.ui.styles.databinding.ActivityDebugTextViewBinding
+
+// Rendering is not the same with VectorBaseActivity
+abstract class DebugVectorTextViewActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val views = ActivityDebugTextViewBinding.inflate(layoutInflater)
+ setContentView(views.root)
+
+ views.debugShowPassword.setOnClickListener {
+ views.debugTextInputEditText.showPassword(true)
+ }
+ views.debugHidePassword.setOnClickListener {
+ views.debugTextInputEditText.showPassword(false)
+ }
+ }
+
+ private fun EditText.showPassword(visible: Boolean) {
+ if (visible) {
+ inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
+ } else {
+ inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
+ }
+ }
+}
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewDarkActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewDarkActivity.kt
new file mode 100644
index 0000000000..2d95056fef
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewDarkActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugVectorTextViewDarkActivity : DebugVectorTextViewActivity()
diff --git a/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewLightActivity.kt b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewLightActivity.kt
new file mode 100644
index 0000000000..33e4a0f075
--- /dev/null
+++ b/library/ui-styles/src/debug/java/im/vector/lib/ui/styles/debug/DebugVectorTextViewLightActivity.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.debug
+
+class DebugVectorTextViewLightActivity : DebugVectorTextViewActivity()
diff --git a/library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml b/library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml
new file mode 100644
index 0000000000..08af7d6539
--- /dev/null
+++ b/library/ui-styles/src/debug/res/drawable/ic_debug_icon.xml
@@ -0,0 +1,22 @@
+
+
+
+
diff --git a/vector/src/debug/res/drawable/linear_divider.xml b/library/ui-styles/src/debug/res/drawable/linear_divider.xml
similarity index 100%
rename from vector/src/debug/res/drawable/linear_divider.xml
rename to library/ui-styles/src/debug/res/drawable/linear_divider.xml
diff --git a/library/ui-styles/src/debug/res/layout/activity_debug_button_styles.xml b/library/ui-styles/src/debug/res/layout/activity_debug_button_styles.xml
new file mode 100644
index 0000000000..0f129fb406
--- /dev/null
+++ b/library/ui-styles/src/debug/res/layout/activity_debug_button_styles.xml
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml b/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml
new file mode 100644
index 0000000000..4828810e34
--- /dev/null
+++ b/library/ui-styles/src/debug/res/layout/activity_debug_material_theme.xml
@@ -0,0 +1,525 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml b/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml
new file mode 100644
index 0000000000..1b38f04b97
--- /dev/null
+++ b/library/ui-styles/src/debug/res/layout/activity_debug_text_view.xml
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/debug/res/menu/menu_debug.xml b/library/ui-styles/src/debug/res/menu/menu_debug.xml
new file mode 100644
index 0000000000..c58a29db8f
--- /dev/null
+++ b/library/ui-styles/src/debug/res/menu/menu_debug.xml
@@ -0,0 +1,19 @@
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/debug/res/values/debug_styles.xml b/library/ui-styles/src/debug/res/values/debug_styles.xml
new file mode 100644
index 0000000000..d025ba1784
--- /dev/null
+++ b/library/ui-styles/src/debug/res/values/debug_styles.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/AndroidManifest.xml b/library/ui-styles/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..19aa89e2e7
--- /dev/null
+++ b/library/ui-styles/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/java/MaterialProgressDialog.kt b/library/ui-styles/src/main/java/MaterialProgressDialog.kt
new file mode 100644
index 0000000000..9523c5c19c
--- /dev/null
+++ b/library/ui-styles/src/main/java/MaterialProgressDialog.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.lib.ui.styles.dialogs
+
+import android.content.Context
+import android.view.LayoutInflater
+import androidx.appcompat.app.AlertDialog
+import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import im.vector.lib.ui.styles.R
+import im.vector.lib.ui.styles.databinding.DialogProgressMaterialBinding
+
+class MaterialProgressDialog(val context: Context) {
+ fun show(message: CharSequence, cancellable: Boolean = false): AlertDialog {
+ val view = LayoutInflater.from(context).inflate(R.layout.dialog_progress_material, null)
+ val views = DialogProgressMaterialBinding.bind(view)
+ views.message.text = message
+
+ return MaterialAlertDialogBuilder(context)
+ .setCancelable(cancellable)
+ .setView(view)
+ .show()
+ }
+}
diff --git a/library/ui-styles/src/main/res/color/bottom_navigation_icon_tint_selector.xml b/library/ui-styles/src/main/res/color/bottom_navigation_icon_tint_selector.xml
new file mode 100644
index 0000000000..403ed865e7
--- /dev/null
+++ b/library/ui-styles/src/main/res/color/bottom_navigation_icon_tint_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/color/button_background_tint_selector.xml b/library/ui-styles/src/main/res/color/button_background_tint_selector.xml
new file mode 100644
index 0000000000..57135b1eb9
--- /dev/null
+++ b/library/ui-styles/src/main/res/color/button_background_tint_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/color/button_social_google_background_selector_dark.xml b/library/ui-styles/src/main/res/color/button_social_google_background_selector_dark.xml
new file mode 100644
index 0000000000..3893ce3e34
--- /dev/null
+++ b/library/ui-styles/src/main/res/color/button_social_google_background_selector_dark.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/color/button_social_google_background_selector_light.xml b/library/ui-styles/src/main/res/color/button_social_google_background_selector_light.xml
new file mode 100644
index 0000000000..dc80f861b9
--- /dev/null
+++ b/library/ui-styles/src/main/res/color/button_social_google_background_selector_light.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/color/color_primary_alpha25.xml b/library/ui-styles/src/main/res/color/color_primary_alpha25.xml
new file mode 100644
index 0000000000..5afa385f3c
--- /dev/null
+++ b/library/ui-styles/src/main/res/color/color_primary_alpha25.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/drawable-hdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-hdpi/element_splash_white.png
similarity index 100%
rename from vector/src/main/res/drawable-hdpi/riot_splash_white.png
rename to library/ui-styles/src/main/res/drawable-hdpi/element_splash_white.png
diff --git a/vector/src/main/res/drawable-mdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-mdpi/element_splash_white.png
similarity index 100%
rename from vector/src/main/res/drawable-mdpi/riot_splash_white.png
rename to library/ui-styles/src/main/res/drawable-mdpi/element_splash_white.png
diff --git a/vector/src/main/res/drawable-xhdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-xhdpi/element_splash_white.png
similarity index 100%
rename from vector/src/main/res/drawable-xhdpi/riot_splash_white.png
rename to library/ui-styles/src/main/res/drawable-xhdpi/element_splash_white.png
diff --git a/vector/src/main/res/drawable-xxhdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-xxhdpi/element_splash_white.png
similarity index 100%
rename from vector/src/main/res/drawable-xxhdpi/riot_splash_white.png
rename to library/ui-styles/src/main/res/drawable-xxhdpi/element_splash_white.png
diff --git a/vector/src/main/res/drawable-xxxhdpi/riot_splash_white.png b/library/ui-styles/src/main/res/drawable-xxxhdpi/element_splash_white.png
similarity index 100%
rename from vector/src/main/res/drawable-xxxhdpi/riot_splash_white.png
rename to library/ui-styles/src/main/res/drawable-xxxhdpi/element_splash_white.png
diff --git a/library/ui-styles/src/main/res/drawable/bg_bottom_navigation.xml b/library/ui-styles/src/main/res/drawable/bg_bottom_navigation.xml
new file mode 100644
index 0000000000..3011da0026
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/bg_bottom_navigation.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/drawable/bg_pin_key.xml b/library/ui-styles/src/main/res/drawable/bg_pin_key.xml
similarity index 100%
rename from vector/src/main/res/drawable/bg_pin_key.xml
rename to library/ui-styles/src/main/res/drawable/bg_pin_key.xml
diff --git a/library/ui-styles/src/main/res/drawable/bg_round_corner_8dp.xml b/library/ui-styles/src/main/res/drawable/bg_round_corner_8dp.xml
new file mode 100644
index 0000000000..f44b146021
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/bg_round_corner_8dp.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/drawable/element_logo_green.xml b/library/ui-styles/src/main/res/drawable/element_logo_green.xml
similarity index 100%
rename from vector/src/main/res/drawable/element_logo_green.xml
rename to library/ui-styles/src/main/res/drawable/element_logo_green.xml
diff --git a/library/ui-styles/src/main/res/drawable/file_progress_bar.xml b/library/ui-styles/src/main/res/drawable/file_progress_bar.xml
new file mode 100644
index 0000000000..d175b871f7
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/file_progress_bar.xml
@@ -0,0 +1,19 @@
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/drawable/ic_search.xml b/library/ui-styles/src/main/res/drawable/ic_search.xml
similarity index 100%
rename from vector/src/main/res/drawable/ic_search.xml
rename to library/ui-styles/src/main/res/drawable/ic_search.xml
diff --git a/vector/src/main/res/drawable/ic_social_apple.xml b/library/ui-styles/src/main/res/drawable/ic_social_apple.xml
similarity index 100%
rename from vector/src/main/res/drawable/ic_social_apple.xml
rename to library/ui-styles/src/main/res/drawable/ic_social_apple.xml
diff --git a/vector/src/main/res/drawable/ic_social_facebook.xml b/library/ui-styles/src/main/res/drawable/ic_social_facebook.xml
similarity index 100%
rename from vector/src/main/res/drawable/ic_social_facebook.xml
rename to library/ui-styles/src/main/res/drawable/ic_social_facebook.xml
diff --git a/vector/src/main/res/drawable/ic_social_github.xml b/library/ui-styles/src/main/res/drawable/ic_social_github.xml
similarity index 100%
rename from vector/src/main/res/drawable/ic_social_github.xml
rename to library/ui-styles/src/main/res/drawable/ic_social_github.xml
diff --git a/library/ui-styles/src/main/res/drawable/ic_social_gitlab.xml b/library/ui-styles/src/main/res/drawable/ic_social_gitlab.xml
new file mode 100644
index 0000000000..9399f6448a
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/ic_social_gitlab.xml
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/main/res/drawable/ic_social_google.xml b/library/ui-styles/src/main/res/drawable/ic_social_google.xml
similarity index 100%
rename from vector/src/main/res/drawable/ic_social_google.xml
rename to library/ui-styles/src/main/res/drawable/ic_social_google.xml
diff --git a/vector/src/main/res/drawable/ic_social_twitter.xml b/library/ui-styles/src/main/res/drawable/ic_social_twitter.xml
similarity index 100%
rename from vector/src/main/res/drawable/ic_social_twitter.xml
rename to library/ui-styles/src/main/res/drawable/ic_social_twitter.xml
diff --git a/vector/src/main/res/drawable/ic_x_gray.xml b/library/ui-styles/src/main/res/drawable/ic_x_gray.xml
similarity index 100%
rename from vector/src/main/res/drawable/ic_x_gray.xml
rename to library/ui-styles/src/main/res/drawable/ic_x_gray.xml
diff --git a/library/ui-styles/src/main/res/drawable/pin_code_dot_empty.xml b/library/ui-styles/src/main/res/drawable/pin_code_dot_empty.xml
new file mode 100644
index 0000000000..1827a7682b
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/pin_code_dot_empty.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/drawable/pin_code_dot_fill.xml b/library/ui-styles/src/main/res/drawable/pin_code_dot_fill.xml
similarity index 100%
rename from vector/src/main/res/drawable/pin_code_dot_fill.xml
rename to library/ui-styles/src/main/res/drawable/pin_code_dot_fill.xml
diff --git a/vector/src/main/res/drawable/pin_code_dots.xml b/library/ui-styles/src/main/res/drawable/pin_code_dots.xml
similarity index 100%
rename from vector/src/main/res/drawable/pin_code_dots.xml
rename to library/ui-styles/src/main/res/drawable/pin_code_dots.xml
diff --git a/library/ui-styles/src/main/res/drawable/splash.xml b/library/ui-styles/src/main/res/drawable/splash.xml
new file mode 100644
index 0000000000..067688fd79
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/splash.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+ -
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/drawable/vector_label_background.xml b/library/ui-styles/src/main/res/drawable/vector_label_background.xml
new file mode 100644
index 0000000000..bc8fd22a4d
--- /dev/null
+++ b/library/ui-styles/src/main/res/drawable/vector_label_background.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/layout/dialog_progress_material.xml b/library/ui-styles/src/main/res/layout/dialog_progress_material.xml
new file mode 100644
index 0000000000..09c88cc50b
--- /dev/null
+++ b/library/ui-styles/src/main/res/layout/dialog_progress_material.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/transition/image_preview_transition.xml b/library/ui-styles/src/main/res/transition/image_preview_transition.xml
similarity index 100%
rename from vector/src/main/res/transition/image_preview_transition.xml
rename to library/ui-styles/src/main/res/transition/image_preview_transition.xml
diff --git a/vector/src/main/res/values-land/dimens.xml b/library/ui-styles/src/main/res/values-land/dimens.xml
similarity index 100%
rename from vector/src/main/res/values-land/dimens.xml
rename to library/ui-styles/src/main/res/values-land/dimens.xml
diff --git a/vector/src/main/res/values-land/styles.xml b/library/ui-styles/src/main/res/values-land/styles.xml
similarity index 100%
rename from vector/src/main/res/values-land/styles.xml
rename to library/ui-styles/src/main/res/values-land/styles.xml
diff --git a/library/ui-styles/src/main/res/values-land/styles_dial_pad.xml b/library/ui-styles/src/main/res/values-land/styles_dial_pad.xml
new file mode 100644
index 0000000000..39c5bf9aa6
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-land/styles_dial_pad.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-ldrtl/integers.xml b/library/ui-styles/src/main/res/values-ldrtl/integers.xml
new file mode 100644
index 0000000000..88b587c96f
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-ldrtl/integers.xml
@@ -0,0 +1,7 @@
+
+
+
+ -1
+ 180
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-sw600dp/dimens.xml b/library/ui-styles/src/main/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000000..204d663d9c
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-sw600dp/dimens.xml
@@ -0,0 +1,5 @@
+
+
+
+ 400dp
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-v23/theme_black.xml b/library/ui-styles/src/main/res/values-v23/theme_black.xml
new file mode 100644
index 0000000000..e0399f6449
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-v23/theme_black.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-v23/theme_dark.xml b/library/ui-styles/src/main/res/values-v23/theme_dark.xml
new file mode 100644
index 0000000000..45b340eaad
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-v23/theme_dark.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-v23/theme_light.xml b/library/ui-styles/src/main/res/values-v23/theme_light.xml
new file mode 100644
index 0000000000..28a78b98bf
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-v23/theme_light.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-v27/theme_black.xml b/library/ui-styles/src/main/res/values-v27/theme_black.xml
new file mode 100644
index 0000000000..2a18b021e3
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-v27/theme_black.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-v27/theme_dark.xml b/library/ui-styles/src/main/res/values-v27/theme_dark.xml
new file mode 100644
index 0000000000..ee654bbaab
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-v27/theme_dark.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values-v27/theme_light.xml b/library/ui-styles/src/main/res/values-v27/theme_light.xml
new file mode 100644
index 0000000000..0151130f5a
--- /dev/null
+++ b/library/ui-styles/src/main/res/values-v27/theme_light.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/values-w820dp/dimens.xml b/library/ui-styles/src/main/res/values-w820dp/dimens.xml
similarity index 100%
rename from vector/src/main/res/values-w820dp/dimens.xml
rename to library/ui-styles/src/main/res/values-w820dp/dimens.xml
diff --git a/library/ui-styles/src/main/res/values/attrs_room_message_colors.xml b/library/ui-styles/src/main/res/values/attrs_room_message_colors.xml
new file mode 100644
index 0000000000..68b64c21b0
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/attrs_room_message_colors.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/attrs_social_login_button.xml b/library/ui-styles/src/main/res/values/attrs_social_login_button.xml
new file mode 100644
index 0000000000..e988646049
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/attrs_social_login_button.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/main/res/values/bools.xml b/library/ui-styles/src/main/res/values/bools.xml
similarity index 100%
rename from vector/src/main/res/values/bools.xml
rename to library/ui-styles/src/main/res/values/bools.xml
diff --git a/library/ui-styles/src/main/res/values/colors.xml b/library/ui-styles/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..9d5f15cbde
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/colors.xml
@@ -0,0 +1,135 @@
+
+
+
+
+ @color/palette_melon
+ #2f9edb
+
+
+ #2f9edb
+ ?colorError
+
+
+ #14368BD6
+ @color/palette_azure
+
+
+ @color/palette_azure
+ @color/palette_melon
+
+
+
+ #99000000
+ #27303A
+
+ #FF61708B
+ #1E61708B
+
+
+
+ @android:color/black
+
+ #80000000
+
+ #55000000
+ #8A000000
+
+
+ @color/element_system_light
+ @color/element_system_light
+ @color/element_background_dark
+ @color/element_system_dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #FF61708B
+ #FF61708B
+ #FF61708B
+
+
+ @android:color/white
+ #FF181B21
+ #FF181B21
+
+
+ #1EFFFFFF
+ @android:color/black
+ @android:color/black
+
+
+ #FF2E2F32
+ #FFA1B2D1
+ #FFA1B2D1
+
+
+ #66000000
+ #BF000000
+ #BF000000
+
+
+ #FFFFFFFF
+ #FF22262E
+ #FF090A0C
+
+
+ #FFE9EDF1
+ #FF22262E
+ #FF090A0C
+
+
+ #EBEFF5
+ #27303A
+ #27303A
+
+
+ #61708B
+ #E3E8F0
+ #E3E8F0
+
+
+ #AAAAAAAA
+ #55555555
+
+
+ #EEEEEE
+ #61708B
+
+
+ #FFF3F8FD
+ #22252B
+ #22252B
+
+
+ #2011BC8A
+ #4011BC8A
+ #4011BC8A
+
+
+
+ #FFF8E3
+ #22262E
+
+
+ @color/black_alpha
+ @android:color/transparent
+
+
+ @color/palette_black_900
+ @color/palette_gray_400
+
+
diff --git a/library/ui-styles/src/main/res/values/colors_password_strength.xml b/library/ui-styles/src/main/res/values/colors_password_strength.xml
new file mode 100644
index 0000000000..038f42044c
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/colors_password_strength.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ #FFF56679
+ #FFFFC666
+ #FFF8E71C
+ #FF7AC9A1
+ #FF9E9E9E
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/dimens.xml b/library/ui-styles/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000..88338f799b
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/dimens.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ 48dp
+
+ 16dp
+ 16dp
+ 32dp
+
+ 50dp
+ 16dp
+ 196dp
+ 44dp
+ 72dp
+ 16dp
+
+ 40dp
+ 60dp
+
+ 4dp
+ 8dp
+ 8dp
+
+ - 0.75
+
+ 16dp
+ 20dp
+ 4dp
+
+
+ 76dp
+
+
+ 280dp
+
+
+ 320dp
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/dimens_font.xml b/library/ui-styles/src/main/res/values/dimens_font.xml
new file mode 100644
index 0000000000..1b5a826acb
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/dimens_font.xml
@@ -0,0 +1,13 @@
+
+
+
+ 24sp
+ 18sp
+ 16sp
+ 14sp
+ 12sp
+ 10sp
+
+ 14sp
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/integers.xml b/library/ui-styles/src/main/res/values/integers.xml
new file mode 100644
index 0000000000..2f6a1b0bc4
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/integers.xml
@@ -0,0 +1,15 @@
+
+
+
+ 200
+
+ 400
+
+ 200
+
+ 1
+ 0
+
+ 750
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/palette.xml b/library/ui-styles/src/main/res/values/palette.xml
new file mode 100644
index 0000000000..ed12f10af3
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/palette.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+ #368BD6
+ #74D12C
+ #AC3BA8
+ #03B381
+ #E64F7A
+ #FF812D
+
+ #0DBD8B
+ #FFFFFF
+ #FF5B55
+ #7E69FF
+ #2DC2C5
+ #5C56F5
+ #0086E6
+
+
+
+ #F4F6FA
+ #E3E8F0
+ #C1C6CD
+ #8D97A5
+ #737D8C
+ #17191C
+ #F4F9FD
+
+
+ #A9B2BC
+ #8E99A4
+ #6F7882
+ #394049
+ #15191E
+ #21262C
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/palette_mobile.xml b/library/ui-styles/src/main/res/values/palette_mobile.xml
new file mode 100644
index 0000000000..c22b9705c7
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/palette_mobile.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+ @color/palette_element_green
+ @color/palette_element_green
+
+ @color/palette_vermilion
+ @color/palette_vermilion
+
+ @color/palette_links
+ @color/palette_links
+
+
+
+
+
+
+
+
+ @color/palette_black_900
+ @color/palette_gray_200
+ @color/palette_gray_150
+ @color/palette_gray_100
+ @color/palette_gray_50
+
+ @color/palette_white
+ @color/palette_gray_250
+ @color/palette_gray_300
+ @color/palette_gray_400
+ @color/palette_gray_450
+
+
+ @color/palette_gray_25
+ @color/palette_black_950
+ @color/palette_black_950
+
+ @color/palette_white
+ @color/palette_black_800
+ @android:color/black
+
+ @color/palette_azure
+ @color/palette_grape
+ @color/palette_verde
+ @color/palette_polly
+ @color/palette_melon
+ @color/palette_aqua
+ @color/palette_prune
+ @color/palette_kiwi
+
+
+ @color/palette_verde
+ @color/palette_azure
+ @color/palette_grape
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/values/attrs_badge_fab.xml b/library/ui-styles/src/main/res/values/stylable_badge_floating_action_button.xml
similarity index 100%
rename from vector/src/main/res/values/attrs_badge_fab.xml
rename to library/ui-styles/src/main/res/values/stylable_badge_floating_action_button.xml
diff --git a/library/ui-styles/src/main/res/values/stylable_bottom_sheet_action.xml b/library/ui-styles/src/main/res/values/stylable_bottom_sheet_action.xml
new file mode 100644
index 0000000000..d6fa160d6b
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/stylable_bottom_sheet_action.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/stylable_button_state_view.xml b/library/ui-styles/src/main/res/values/stylable_button_state_view.xml
new file mode 100644
index 0000000000..3681884735
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/stylable_button_state_view.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/vector/src/main/res/values/attrs_max_height_scroll_view.xml b/library/ui-styles/src/main/res/values/stylable_max_height_scroll_view.xml
similarity index 100%
rename from vector/src/main/res/values/attrs_max_height_scroll_view.xml
rename to library/ui-styles/src/main/res/values/stylable_max_height_scroll_view.xml
diff --git a/library/ui-styles/src/main/res/values/stylable_pool_result_line.xml b/library/ui-styles/src/main/res/values/stylable_pool_result_line.xml
new file mode 100644
index 0000000000..93e9851106
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/stylable_pool_result_line.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/main/res/values/values.xml b/library/ui-styles/src/main/res/values/stylable_reaction_button.xml
similarity index 100%
rename from vector/src/main/res/values/values.xml
rename to library/ui-styles/src/main/res/values/stylable_reaction_button.xml
diff --git a/library/ui-styles/src/main/res/values/stylable_sign_out_bottom_sheet_action_button.xml b/library/ui-styles/src/main/res/values/stylable_sign_out_bottom_sheet_action_button.xml
new file mode 100644
index 0000000000..068fb93e1b
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/stylable_sign_out_bottom_sheet_action_button.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/stylable_social_login_button_view.xml b/library/ui-styles/src/main/res/values/stylable_social_login_button_view.xml
new file mode 100644
index 0000000000..5e0b17f7df
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/stylable_social_login_button_view.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/stylable_wizard_button_view.xml b/library/ui-styles/src/main/res/values/stylable_wizard_button_view.xml
new file mode 100644
index 0000000000..2705abd7ca
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/stylable_wizard_button_view.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/style_snackbar.xml b/library/ui-styles/src/main/res/values/style_snackbar.xml
new file mode 100644
index 0000000000..d15f846d8f
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/style_snackbar.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/styles.xml b/library/ui-styles/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..b028d2e219
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_action_mode.xml b/library/ui-styles/src/main/res/values/styles_action_mode.xml
new file mode 100644
index 0000000000..f6e6079633
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_action_mode.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_alert_dialog.xml b/library/ui-styles/src/main/res/values/styles_alert_dialog.xml
new file mode 100644
index 0000000000..69abc85c39
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_alert_dialog.xml
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_app_bar_layout.xml b/library/ui-styles/src/main/res/values/styles_app_bar_layout.xml
new file mode 100644
index 0000000000..973a2c5e4a
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_app_bar_layout.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_attachments.xml b/library/ui-styles/src/main/res/values/styles_attachments.xml
new file mode 100644
index 0000000000..18c2e3f95f
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_attachments.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_bottom_navigation.xml b/library/ui-styles/src/main/res/values/styles_bottom_navigation.xml
new file mode 100644
index 0000000000..8925d6a74f
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_bottom_navigation.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_bottom_sheet.xml b/library/ui-styles/src/main/res/values/styles_bottom_sheet.xml
new file mode 100644
index 0000000000..9f17342ede
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_bottom_sheet.xml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_buttons.xml b/library/ui-styles/src/main/res/values/styles_buttons.xml
new file mode 100644
index 0000000000..ad90469a52
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_buttons.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_dial_pad.xml b/library/ui-styles/src/main/res/values/styles_dial_pad.xml
new file mode 100644
index 0000000000..34e128c56d
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_dial_pad.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_edit_text.xml b/library/ui-styles/src/main/res/values/styles_edit_text.xml
new file mode 100644
index 0000000000..cc1041a2ce
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_edit_text.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_jump_to_unread.xml b/library/ui-styles/src/main/res/values/styles_jump_to_unread.xml
new file mode 100644
index 0000000000..21f0ebd5d4
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_jump_to_unread.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_label.xml b/library/ui-styles/src/main/res/values/styles_label.xml
new file mode 100644
index 0000000000..3f38855430
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_label.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_login.xml b/library/ui-styles/src/main/res/values/styles_login.xml
new file mode 100644
index 0000000000..ab2cb44c5a
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_login.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/styles_pin_code.xml b/library/ui-styles/src/main/res/values/styles_pin_code.xml
new file mode 100644
index 0000000000..2b6c113359
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_pin_code.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_popup.xml b/library/ui-styles/src/main/res/values/styles_popup.xml
new file mode 100644
index 0000000000..2aad848989
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_popup.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_progress.xml b/library/ui-styles/src/main/res/values/styles_progress.xml
new file mode 100644
index 0000000000..712e7e98b6
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_progress.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_search_view.xml b/library/ui-styles/src/main/res/values/styles_search_view.xml
new file mode 100644
index 0000000000..e1439697c9
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_search_view.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_social_login.xml b/library/ui-styles/src/main/res/values/styles_social_login.xml
new file mode 100644
index 0000000000..b527d5bfdc
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_social_login.xml
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_text_view.xml b/library/ui-styles/src/main/res/values/styles_text_view.xml
new file mode 100644
index 0000000000..77e32da345
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_text_view.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_timeline.xml b/library/ui-styles/src/main/res/values/styles_timeline.xml
new file mode 100644
index 0000000000..7fd7eac0ec
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_timeline.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_toolbar.xml b/library/ui-styles/src/main/res/values/styles_toolbar.xml
new file mode 100644
index 0000000000..9f6ba102ed
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_toolbar.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/styles_voice_message.xml b/library/ui-styles/src/main/res/values/styles_voice_message.xml
new file mode 100644
index 0000000000..59fea75074
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_voice_message.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/text_appearances.xml b/library/ui-styles/src/main/res/values/text_appearances.xml
new file mode 100644
index 0000000000..4ad3fd493e
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/text_appearances.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/theme_black.xml b/library/ui-styles/src/main/res/values/theme_black.xml
new file mode 100644
index 0000000000..c472a4fae5
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/theme_black.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/theme_common.xml b/library/ui-styles/src/main/res/values/theme_common.xml
new file mode 100644
index 0000000000..2e9c2c5123
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/theme_common.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/library/ui-styles/src/main/res/values/theme_dark.xml b/library/ui-styles/src/main/res/values/theme_dark.xml
new file mode 100644
index 0000000000..0dbdc5ad4f
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/theme_dark.xml
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/theme_light.xml b/library/ui-styles/src/main/res/values/theme_light.xml
new file mode 100644
index 0000000000..17e0ff2938
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/theme_light.xml
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/vector/src/release/res/values/styles.xml b/library/ui-styles/src/release/res/values/styles.xml
similarity index 100%
rename from vector/src/release/res/values/styles.xml
rename to library/ui-styles/src/release/res/values/styles.xml
diff --git a/matrix-sdk-android-rx/build.gradle b/matrix-sdk-android-rx/build.gradle
index a99b5856ba..899432b498 100644
--- a/matrix-sdk-android-rx/build.gradle
+++ b/matrix-sdk-android-rx/build.gradle
@@ -3,11 +3,11 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
- compileSdkVersion 29
+ compileSdkVersion 30
defaultConfig {
minSdkVersion 21
- targetSdkVersion 29
+ targetSdkVersion 30
versionCode 1
versionName "1.0"
@@ -35,8 +35,8 @@ android {
dependencies {
implementation project(":matrix-sdk-android")
- implementation 'androidx.appcompat:appcompat:1.2.0'
- implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
+ implementation 'androidx.appcompat:appcompat:1.3.1'
+ implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-rx2:$kotlin_coroutines_version"
diff --git a/matrix-sdk-android-rx/src/main/AndroidManifest.xml b/matrix-sdk-android-rx/src/main/AndroidManifest.xml
index f1bb42638f..5f399e9f84 100644
--- a/matrix-sdk-android-rx/src/main/AndroidManifest.xml
+++ b/matrix-sdk-android-rx/src/main/AndroidManifest.xml
@@ -1,2 +1 @@
-
+
diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxCallbackBuilders.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxCallbackBuilders.kt
deleted file mode 100644
index ec30a31f6d..0000000000
--- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxCallbackBuilders.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright 2020 The Matrix.org Foundation C.I.C.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.matrix.android.sdk.rx
-
-import org.matrix.android.sdk.api.MatrixCallback
-import org.matrix.android.sdk.api.util.Cancelable
-import io.reactivex.Completable
-import io.reactivex.Single
-
-fun singleBuilder(builder: (MatrixCallback) -> Cancelable): Single = Single.create { emitter ->
- val callback = object : MatrixCallback {
- override fun onSuccess(data: T) {
- // Add `!!` to fix the warning:
- // "Type mismatch: type parameter with nullable bounds is used T is used where T was expected. This warning will become an error soon"
- emitter.onSuccess(data!!)
- }
-
- override fun onFailure(failure: Throwable) {
- emitter.tryOnError(failure)
- }
- }
- val cancelable = builder(callback)
- emitter.setCancellable {
- cancelable.cancel()
- }
-}
-
-fun completableBuilder(builder: (MatrixCallback) -> Cancelable): Completable = Completable.create { emitter ->
- val callback = object : MatrixCallback {
- override fun onSuccess(data: T) {
- emitter.onComplete()
- }
-
- override fun onFailure(failure: Throwable) {
- emitter.tryOnError(failure)
- }
- }
- val cancelable = builder(callback)
- emitter.setCancellable {
- cancelable.cancel()
- }
-}
diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt
index b938f60e39..b3495c4493 100644
--- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt
+++ b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxRoom.kt
@@ -21,7 +21,9 @@ import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.Single
import kotlinx.coroutines.rx2.rxCompletable
+import kotlinx.coroutines.rx2.rxSingle
import org.matrix.android.sdk.api.query.QueryStringValue
+import org.matrix.android.sdk.api.session.content.ContentAttachmentData
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.identity.ThreePid
import org.matrix.android.sdk.api.session.room.Room
@@ -90,13 +92,13 @@ class RxRoom(private val room: Room) {
return room.getMyReadReceiptLive().asObservable()
}
- fun loadRoomMembersIfNeeded(): Single = singleBuilder {
- room.loadRoomMembersIfNeeded(it)
+ fun loadRoomMembersIfNeeded(): Single = rxSingle {
+ room.loadRoomMembersIfNeeded()
}
fun joinRoom(reason: String? = null,
- viaServers: List = emptyList()): Single = singleBuilder {
- room.join(reason, viaServers, it)
+ viaServers: List = emptyList()): Single = rxSingle {
+ room.join(reason, viaServers)
}
fun liveEventReadReceipts(eventId: String): Observable> {
@@ -114,12 +116,12 @@ class RxRoom(private val room: Room) {
return room.getLiveRoomNotificationState().asObservable()
}
- fun invite(userId: String, reason: String? = null): Completable = completableBuilder {
- room.invite(userId, reason, it)
+ fun invite(userId: String, reason: String? = null): Completable = rxCompletable {
+ room.invite(userId, reason)
}
- fun invite3pid(threePid: ThreePid): Completable = completableBuilder {
- room.invite3pid(threePid, it)
+ fun invite3pid(threePid: ThreePid): Completable = rxCompletable {
+ room.invite3pid(threePid)
}
fun updateTopic(topic: String): Completable = rxCompletable {
@@ -145,6 +147,10 @@ class RxRoom(private val room: Room) {
fun deleteAvatar(): Completable = rxCompletable {
room.deleteAvatar()
}
+
+ fun sendMedia(attachment: ContentAttachmentData, compressBeforeSending: Boolean, roomIds: Set): Completable = rxCompletable {
+ room.sendMedia(attachment, compressBeforeSending, roomIds)
+ }
}
fun Room.rx(): RxRoom {
diff --git a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt
index a7b269fcc6..58fb760ff5 100644
--- a/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt
+++ b/matrix-sdk-android-rx/src/main/java/org/matrix/android/sdk/rx/RxSession.kt
@@ -20,6 +20,7 @@ import androidx.paging.PagedList
import io.reactivex.Observable
import io.reactivex.Single
import io.reactivex.functions.Function3
+import kotlinx.coroutines.rx2.rxSingle
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.session.Session
@@ -34,10 +35,12 @@ import org.matrix.android.sdk.api.session.group.model.GroupSummary
import org.matrix.android.sdk.api.session.identity.ThreePid
import org.matrix.android.sdk.api.session.pushers.Pusher
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
+import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataEvent
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.RoomMemberSummary
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
+import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams
import org.matrix.android.sdk.api.session.sync.SyncState
import org.matrix.android.sdk.api.session.user.model.User
import org.matrix.android.sdk.api.session.widgets.model.Widget
@@ -65,6 +68,13 @@ class RxSession(private val session: Session) {
}
}
+ fun liveSpaceSummaries(queryParams: SpaceSummaryQueryParams): Observable> {
+ return session.spaceService().getSpaceSummariesLive(queryParams).asObservable()
+ .startWithCallable {
+ session.spaceService().getSpaceSummaries(queryParams)
+ }
+ }
+
fun liveBreadcrumbs(queryParams: RoomSummaryQueryParams): Observable> {
return session.getBreadcrumbsLive(queryParams).asObservable()
.startWithCallable {
@@ -123,29 +133,29 @@ class RxSession(private val session: Session) {
.startWithCallable { session.getPendingThreePids() }
}
- fun createRoom(roomParams: CreateRoomParams): Single = singleBuilder {
- session.createRoom(roomParams, it)
+ fun createRoom(roomParams: CreateRoomParams): Single = rxSingle {
+ session.createRoom(roomParams)
}
fun searchUsersDirectory(search: String,
limit: Int,
- excludedUserIds: Set): Single> = singleBuilder {
- session.searchUsersDirectory(search, limit, excludedUserIds, it)
+ excludedUserIds: Set): Single> = rxSingle {
+ session.searchUsersDirectory(search, limit, excludedUserIds)
}
fun joinRoom(roomIdOrAlias: String,
reason: String? = null,
- viaServers: List = emptyList()): Single = singleBuilder {
- session.joinRoom(roomIdOrAlias, reason, viaServers, it)
+ viaServers: List = emptyList()): Single = rxSingle {
+ session.joinRoom(roomIdOrAlias, reason, viaServers)
}
fun getRoomIdByAlias(roomAlias: String,
- searchOnServer: Boolean): Single> = singleBuilder {
- session.getRoomIdByAlias(roomAlias, searchOnServer, it)
+ searchOnServer: Boolean): Single> = rxSingle {
+ session.getRoomIdByAlias(roomAlias, searchOnServer)
}
- fun getProfileInfo(userId: String): Single = singleBuilder {
- session.getProfile(userId, it)
+ fun getProfileInfo(userId: String): Single = rxSingle {
+ session.getProfile(userId)
}
fun liveUserCryptoDevices(userId: String): Observable> {
@@ -168,10 +178,17 @@ class RxSession(private val session: Session) {
}
}
- fun liveAccountData(types: Set): Observable> {
- return session.getLiveAccountDataEvents(types).asObservable()
+ fun liveUserAccountData(types: Set): Observable> {
+ return session.accountDataService().getLiveUserAccountDataEvents(types).asObservable()
.startWithCallable {
- session.getAccountDataEvents(types)
+ session.accountDataService().getUserAccountDataEvents(types)
+ }
+ }
+
+ fun liveRoomAccountData(types: Set): Observable> {
+ return session.accountDataService().getLiveRoomAccountDataEvents(types).asObservable()
+ .startWithCallable {
+ session.accountDataService().getRoomAccountDataEvents(types)
}
}
@@ -193,7 +210,7 @@ class RxSession(private val session: Session) {
fun liveSecretSynchronisationInfo(): Observable {
return Observable.combineLatest, Optional, Optional, SecretsSynchronisationInfo>(
- liveAccountData(setOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME)),
+ liveUserAccountData(setOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME)),
liveCrossSigningInfo(session.myUserId),
liveCrossSigningPrivateKeys(),
Function3 { _, crossSigningInfo, pInfo ->
diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle
index 6a2f7575e5..e30b63e751 100644
--- a/matrix-sdk-android/build.gradle
+++ b/matrix-sdk-android/build.gradle
@@ -6,20 +6,20 @@ apply plugin: 'realm-android'
buildscript {
repositories {
- jcenter()
+ mavenCentral()
}
dependencies {
- classpath "io.realm:realm-gradle-plugin:10.1.2"
+ classpath "io.realm:realm-gradle-plugin:10.7.1"
}
}
android {
- compileSdkVersion 29
+ compileSdkVersion 30
testOptions.unitTests.includeAndroidResources = true
defaultConfig {
minSdkVersion 21
- targetSdkVersion 29
+ targetSdkVersion 30
versionCode 1
versionName "0.0.1"
// Multidex is useful for tests
@@ -108,20 +108,20 @@ static def gitRevisionDate() {
dependencies {
def arrow_version = "0.8.2"
- def moshi_version = '1.11.0'
+ def moshi_version = '1.12.0'
def lifecycle_version = '2.2.0'
def arch_version = '2.1.0'
def markwon_version = '3.1.0'
- def daggerVersion = '2.29.1'
- def work_version = '2.4.0'
- def retrofit_version = '2.6.2'
+ def daggerVersion = '2.38'
+ def work_version = '2.5.0'
+ def retrofit_version = '2.9.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
- implementation "androidx.appcompat:appcompat:1.2.0"
- implementation "androidx.core:core-ktx:1.3.2"
+ implementation "androidx.appcompat:appcompat:1.3.1"
+ implementation "androidx.core:core-ktx:1.6.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
@@ -130,7 +130,7 @@ dependencies {
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version"
- implementation(platform("com.squareup.okhttp3:okhttp-bom:4.8.1"))
+ implementation(platform("com.squareup.okhttp3:okhttp-bom:4.9.1"))
implementation 'com.squareup.okhttp3:okhttp'
implementation 'com.squareup.okhttp3:logging-interceptor'
implementation 'com.squareup.okhttp3:okhttp-urlconnection'
@@ -141,11 +141,11 @@ dependencies {
implementation "ru.noties.markwon:core:$markwon_version"
// Image
- implementation 'androidx.exifinterface:exifinterface:1.3.1'
+ implementation 'androidx.exifinterface:exifinterface:1.3.3'
// Database
implementation 'com.github.Zhuinden:realm-monarchy:0.7.1'
- kapt 'dk.ilios:realmfieldnameshelper:1.1.1'
+ kapt 'dk.ilios:realmfieldnameshelper:2.0.0'
// Work
implementation "androidx.work:work-runtime-ktx:$work_version"
@@ -155,50 +155,44 @@ dependencies {
implementation "io.arrow-kt:arrow-instances-core:$arrow_version"
// olm lib is now hosted by jitpack: https://jitpack.io/#org.matrix.gitlab.matrix-org/olm
- implementation 'org.matrix.gitlab.matrix-org:olm:3.1.2'
+ implementation 'org.matrix.gitlab.matrix-org:olm:3.2.4'
// DI
implementation "com.google.dagger:dagger:$daggerVersion"
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
- compileOnly 'com.squareup.inject:assisted-inject-annotations-dagger2:0.5.0'
- kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.5.0'
// Logging
implementation 'com.jakewharton.timber:timber:4.7.1'
- implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
+ implementation 'com.facebook.stetho:stetho-okhttp3:1.6.0'
+
+ // Video compression
+ implementation 'com.otaliastudios:transcoder:0.10.3'
// Phone number https://github.com/google/libphonenumber
- implementation 'com.googlecode.libphonenumber:libphonenumber:8.10.23'
+ implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.30'
- // Web RTC
- // org.webrtc:google-webrtc is for development purposes only. See http://webrtc.github.io/webrtc-org/native-code/android/
- // implementation 'org.webrtc:google-webrtc:1.0.+'
- // Use the same WebRTC library than the one used by Jitsi library
- implementation('com.facebook.react:react-native-webrtc:1.84.0-jitsi-5112273@aar')
-
- testImplementation 'junit:junit:4.13'
- testImplementation 'org.robolectric:robolectric:4.3'
+ 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.9.2.kotlin12'
- testImplementation 'org.amshove.kluent:kluent-android:1.61'
+ 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.61'
- // Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281
- androidTestImplementation 'io.mockk:mockk-android:1.9.2.kotlin12'
+ 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'
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/InstrumentedTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/InstrumentedTest.kt
index b784884363..583406346e 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/InstrumentedTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/InstrumentedTest.kt
@@ -20,7 +20,6 @@ import android.content.Context
import androidx.test.core.app.ApplicationProvider
import org.matrix.android.sdk.test.shared.createTimberTestRule
import org.junit.Rule
-import java.io.File
interface InstrumentedTest {
@@ -30,8 +29,4 @@ interface InstrumentedTest {
fun context(): Context {
return ApplicationProvider.getApplicationContext()
}
-
- fun cacheDir(): File {
- return context().cacheDir
- }
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/SpaceOrderTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/SpaceOrderTest.kt
new file mode 100644
index 0000000000..3270dfb757
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/SpaceOrderTest.kt
@@ -0,0 +1,260 @@
+/*
+ * 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
+
+import org.amshove.kluent.internal.assertEquals
+import org.junit.Assert
+import org.junit.Test
+import org.matrix.android.sdk.api.session.space.SpaceOrderUtils
+
+class SpaceOrderTest {
+
+ @Test
+ fun testOrderBetweenNodesWithOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to "a",
+ "roomId2" to "m",
+ "roomId3" to "z"
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 1)
+
+ Assert.assertTrue("Only one order should be changed", orderCommand.size == 1)
+ Assert.assertTrue("Moved space order should change", orderCommand.first().spaceId == "roomId1")
+
+ Assert.assertTrue("m" < orderCommand[0].order)
+ Assert.assertTrue(orderCommand[0].order < "z")
+ }
+
+ @Test
+ fun testMoveLastBetweenNodesWithOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to "a",
+ "roomId2" to "m",
+ "roomId3" to "z"
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 2)
+
+ Assert.assertTrue("Only one order should be changed", orderCommand.size == 1)
+ Assert.assertTrue("Moved space order should change", orderCommand.first().spaceId == "roomId1")
+
+ Assert.assertTrue("z" < orderCommand[0].order)
+ }
+
+ @Test
+ fun testMoveUpNoOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to null,
+ "roomId2" to null,
+ "roomId3" to null
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 1)
+
+ Assert.assertTrue("2 orders change should be needed", orderCommand.size == 2)
+
+ val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand)
+
+ Assert.assertEquals("roomId2", reOrdered[0].first)
+ Assert.assertEquals("roomId1", reOrdered[1].first)
+ Assert.assertEquals("roomId3", reOrdered[2].first)
+ }
+
+ @Test
+ fun testMoveUpNotEnoughSpace() {
+ val orderedSpaces = listOf(
+ "roomId1" to "a",
+ "roomId2" to "j",
+ "roomId3" to "k"
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 1)
+
+ Assert.assertTrue("more orders change should be needed", orderCommand.size > 1)
+
+ val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand)
+
+ Assert.assertEquals("roomId2", reOrdered[0].first)
+ Assert.assertEquals("roomId1", reOrdered[1].first)
+ Assert.assertEquals("roomId3", reOrdered[2].first)
+ }
+
+ @Test
+ fun testMoveEndNoOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to null,
+ "roomId2" to null,
+ "roomId3" to null
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId1", 2)
+
+ // Actually 2 could be enough... as it's last it can stays with null
+ Assert.assertEquals("3 orders change should be needed", 3, orderCommand.size)
+
+ val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand)
+
+ Assert.assertEquals("roomId2", reOrdered[0].first)
+ Assert.assertEquals("roomId3", reOrdered[1].first)
+ Assert.assertEquals("roomId1", reOrdered[2].first)
+ }
+
+ @Test
+ fun testMoveUpBiggerOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to "aaaa",
+ "roomId2" to "ffff",
+ "roomId3" to "pppp",
+ "roomId4" to null,
+ "roomId5" to null,
+ "roomId6" to null
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId2", 3)
+
+ // Actually 2 could be enough... as it's last it can stays with null
+ Assert.assertEquals("3 orders change should be needed", 3, orderCommand.size)
+
+ val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand)
+
+ Assert.assertEquals("roomId1", reOrdered[0].first)
+ Assert.assertEquals("roomId3", reOrdered[1].first)
+ Assert.assertEquals("roomId4", reOrdered[2].first)
+ Assert.assertEquals("roomId5", reOrdered[3].first)
+ Assert.assertEquals("roomId2", reOrdered[4].first)
+ Assert.assertEquals("roomId6", reOrdered[5].first)
+ }
+
+ @Test
+ fun testMoveDownBetweenNodesWithOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to "a",
+ "roomId2" to "m",
+ "roomId3" to "z"
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId3", -1)
+
+ Assert.assertTrue("Only one order should be changed", orderCommand.size == 1)
+ Assert.assertTrue("Moved space order should change", orderCommand.first().spaceId == "roomId3")
+
+ val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand)
+
+ Assert.assertEquals("roomId1", reOrdered[0].first)
+ Assert.assertEquals("roomId3", reOrdered[1].first)
+ Assert.assertEquals("roomId2", reOrdered[2].first)
+ }
+
+ @Test
+ fun testMoveDownNoOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to null,
+ "roomId2" to null,
+ "roomId3" to null
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId3", -1)
+
+ Assert.assertTrue("2 orders change should be needed", orderCommand.size == 2)
+
+ val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand)
+
+ Assert.assertEquals("roomId1", reOrdered[0].first)
+ Assert.assertEquals("roomId3", reOrdered[1].first)
+ Assert.assertEquals("roomId2", reOrdered[2].first)
+ }
+
+ @Test
+ fun testMoveDownBiggerOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to "aaaa",
+ "roomId2" to "ffff",
+ "roomId3" to "pppp",
+ "roomId4" to null,
+ "roomId5" to null,
+ "roomId6" to null
+ ).assertSpaceOrdered()
+
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId5", -4)
+
+ Assert.assertEquals("1 order change should be needed", 1, orderCommand.size)
+
+ val reOrdered = reOrderWithCommands(orderedSpaces, orderCommand)
+
+ Assert.assertEquals("roomId5", reOrdered[0].first)
+ Assert.assertEquals("roomId1", reOrdered[1].first)
+ Assert.assertEquals("roomId2", reOrdered[2].first)
+ Assert.assertEquals("roomId3", reOrdered[3].first)
+ Assert.assertEquals("roomId4", reOrdered[4].first)
+ Assert.assertEquals("roomId6", reOrdered[5].first)
+ }
+
+ @Test
+ fun testMultipleMoveOrder() {
+ val orderedSpaces = listOf(
+ "roomId1" to null,
+ "roomId2" to null,
+ "roomId3" to null,
+ "roomId4" to null,
+ "roomId5" to null,
+ "roomId6" to null
+ ).assertSpaceOrdered()
+
+ // move 5 to Top
+ val fiveToTop = SpaceOrderUtils.orderCommandsForMove(orderedSpaces, "roomId5", -4)
+
+ val fiveTopReOrder = reOrderWithCommands(orderedSpaces, fiveToTop)
+
+ // now move 4 to second
+ val orderCommand = SpaceOrderUtils.orderCommandsForMove(fiveTopReOrder, "roomId4", -3)
+
+ val reOrdered = reOrderWithCommands(fiveTopReOrder, orderCommand)
+ // second order should cost 1 re-order
+ Assert.assertEquals(1, orderCommand.size)
+
+ Assert.assertEquals("roomId5", reOrdered[0].first)
+ Assert.assertEquals("roomId4", reOrdered[1].first)
+ Assert.assertEquals("roomId1", reOrdered[2].first)
+ Assert.assertEquals("roomId2", reOrdered[3].first)
+ Assert.assertEquals("roomId3", reOrdered[4].first)
+ Assert.assertEquals("roomId6", reOrdered[5].first)
+ }
+
+ @Test
+ fun testComparator() {
+ listOf(
+ "roomId2" to "a",
+ "roomId1" to "b",
+ "roomId3" to null,
+ "roomId4" to null
+ ).assertSpaceOrdered()
+ }
+
+ private fun reOrderWithCommands(orderedSpaces: List>, orderCommand: List) =
+ orderedSpaces.map { orderInfo ->
+ orderInfo.first to (orderCommand.find { it.spaceId == orderInfo.first }?.order ?: orderInfo.second)
+ }
+ .sortedWith(testSpaceComparator)
+
+ private fun List>.assertSpaceOrdered(): List> {
+ assertEquals(this, this.sortedWith(testSpaceComparator))
+ return this
+ }
+
+ private val testSpaceComparator = compareBy, String?>(nullsLast()) { it.second }.thenBy { it.first }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/StringOrderTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/StringOrderTest.kt
new file mode 100644
index 0000000000..a625362c04
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/StringOrderTest.kt
@@ -0,0 +1,110 @@
+/*
+ * 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
+
+import org.amshove.kluent.internal.assertEquals
+import org.junit.Assert
+import org.junit.Test
+import org.matrix.android.sdk.api.MatrixPatterns
+import org.matrix.android.sdk.api.util.StringOrderUtils
+
+class StringOrderTest {
+
+ @Test
+ fun testbasing() {
+ assertEquals("a", StringOrderUtils.baseToString(StringOrderUtils.stringToBase("a", StringOrderUtils.DEFAULT_ALPHABET), StringOrderUtils.DEFAULT_ALPHABET))
+ assertEquals("element", StringOrderUtils.baseToString(StringOrderUtils.stringToBase("element", StringOrderUtils.DEFAULT_ALPHABET), StringOrderUtils.DEFAULT_ALPHABET))
+ assertEquals("matrix", StringOrderUtils.baseToString(StringOrderUtils.stringToBase("matrix", StringOrderUtils.DEFAULT_ALPHABET), StringOrderUtils.DEFAULT_ALPHABET))
+ }
+
+ @Test
+ fun testValid() {
+ println(StringOrderUtils.DEFAULT_ALPHABET.joinToString(","))
+
+ assert(MatrixPatterns.isValidOrderString("a"))
+ assert(MatrixPatterns.isValidOrderString(" "))
+ assert(MatrixPatterns.isValidOrderString("abc"))
+ assert(!MatrixPatterns.isValidOrderString("abcê"))
+ assert(!MatrixPatterns.isValidOrderString(""))
+ assert(MatrixPatterns.isValidOrderString("!"))
+ assert(MatrixPatterns.isValidOrderString("!\"#\$%&'()*+,012"))
+ assert(!MatrixPatterns.isValidOrderString(Char(' '.code - 1).toString()))
+
+ assert(!MatrixPatterns.isValidOrderString(
+ buildString {
+ for (i in 0..49) {
+ append(StringOrderUtils.DEFAULT_ALPHABET.random())
+ }
+ }
+ ))
+
+ assert(MatrixPatterns.isValidOrderString(
+ buildString {
+ for (i in 0..48) {
+ append(StringOrderUtils.DEFAULT_ALPHABET.random())
+ }
+ }
+ ))
+ }
+
+ @Test
+ fun testAverage() {
+ assertAverage("${StringOrderUtils.DEFAULT_ALPHABET.first()}", "m")
+ assertAverage("aa", "aab")
+ assertAverage("matrix", "element")
+ assertAverage("mmm", "mmmmm")
+ assertAverage("aab", "aa")
+ assertAverage("", "aa")
+ assertAverage("a", "z")
+ assertAverage("ground", "sky")
+ }
+
+ @Test
+ fun testMidPoints() {
+ val orders = StringOrderUtils.midPoints("element", "matrix", 4)
+ assertEquals(4, orders!!.size)
+ assert("element" < orders[0])
+ assert(orders[0] < orders[1])
+ assert(orders[1] < orders[2])
+ assert(orders[2] < orders[3])
+ assert(orders[3] < "matrix")
+
+ println("element < ${orders.joinToString(" < ") { "[$it]" }} < matrix")
+
+ val orders2 = StringOrderUtils.midPoints("a", "d", 4)
+ assertEquals(null, orders2)
+ }
+
+ @Test
+ fun testRenumberNeeded() {
+ assertEquals(null, StringOrderUtils.average("a", "a"))
+ assertEquals(null, StringOrderUtils.average("", ""))
+ assertEquals(null, StringOrderUtils.average("a", "b"))
+ assertEquals(null, StringOrderUtils.average("b", "a"))
+ assertEquals(null, StringOrderUtils.average("mmmm", "mmmm"))
+ assertEquals(null, StringOrderUtils.average("a${Char(0)}", "a"))
+ }
+
+ private fun assertAverage(first: String, second: String) {
+ val left = first.takeIf { first < second } ?: second
+ val right = first.takeIf { first > second } ?: second
+ val av1 = StringOrderUtils.average(left, right)!!
+ println("[$left] < [$av1] < [$right]")
+ Assert.assertTrue(left < av1)
+ Assert.assertTrue(av1 < right)
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/account/DeactivateAccountTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/account/DeactivateAccountTest.kt
index 9996eef0a8..01c4f8ccb3 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/account/DeactivateAccountTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/account/DeactivateAccountTest.kt
@@ -16,21 +16,24 @@
package org.matrix.android.sdk.account
-import org.matrix.android.sdk.InstrumentedTest
-import org.matrix.android.sdk.api.auth.data.LoginFlowResult
-import org.matrix.android.sdk.api.auth.registration.RegistrationResult
-import org.matrix.android.sdk.api.failure.Failure
-import org.matrix.android.sdk.api.failure.MatrixError
-import org.matrix.android.sdk.common.CommonTestHelper
-import org.matrix.android.sdk.common.SessionTestParams
-import org.matrix.android.sdk.common.TestConstants
-import org.matrix.android.sdk.common.TestMatrixCallback
import org.junit.Assert.assertTrue
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.auth.UIABaseAuth
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
+import org.matrix.android.sdk.api.auth.UserPasswordAuth
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
+import org.matrix.android.sdk.api.failure.Failure
+import org.matrix.android.sdk.api.failure.MatrixError
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.SessionTestParams
+import org.matrix.android.sdk.common.TestConstants
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.resume
@RunWith(JUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
@@ -40,11 +43,24 @@ class DeactivateAccountTest : InstrumentedTest {
@Test
fun deactivateAccountTest() {
- val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = false))
+ val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = true))
// Deactivate the account
commonTestHelper.runBlockingTest {
- session.deactivateAccount(TestConstants.PASSWORD, false)
+ session.deactivateAccount(
+ eraseAllData = false,
+ userInteractiveAuthInterceptor = object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = session.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }
+ )
}
// Try to login on the previous account, it will fail (M_USER_DEACTIVATED)
@@ -58,23 +74,23 @@ class DeactivateAccountTest : InstrumentedTest {
// Try to create an account with the deactivate account user id, it will fail (M_USER_IN_USE)
val hs = commonTestHelper.createHomeServerConfig()
- commonTestHelper.doSync {
- commonTestHelper.matrix.authenticationService.getLoginFlow(hs, it)
+ commonTestHelper.runBlockingTest {
+ commonTestHelper.matrix.authenticationService.getLoginFlow(hs)
}
var accountCreationError: Throwable? = null
- commonTestHelper.waitWithLatch {
- commonTestHelper.matrix.authenticationService
- .getRegistrationWizard()
- .createAccount(session.myUserId.substringAfter("@").substringBefore(":"),
- TestConstants.PASSWORD,
- null,
- object : TestMatrixCallback(it, false) {
- override fun onFailure(failure: Throwable) {
- accountCreationError = failure
- super.onFailure(failure)
- }
- })
+ commonTestHelper.runBlockingTest {
+ try {
+ commonTestHelper.matrix.authenticationService
+ .getRegistrationWizard()
+ .createAccount(
+ session.myUserId.substringAfter("@").substringBefore(":"),
+ TestConstants.PASSWORD,
+ null
+ )
+ } catch (failure: Throwable) {
+ accountCreationError = failure
+ }
}
// Test the error
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/api/Matrix.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/api/Matrix.kt
index 03943cea14..c439da8407 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/api/Matrix.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/api/Matrix.kt
@@ -27,9 +27,12 @@ import org.matrix.android.sdk.BuildConfig
import org.matrix.android.sdk.api.auth.AuthenticationService
import org.matrix.android.sdk.api.auth.HomeServerHistoryService
import org.matrix.android.sdk.api.legacy.LegacySessionImporter
+import org.matrix.android.sdk.api.network.ApiInterceptorListener
+import org.matrix.android.sdk.api.network.ApiPath
import org.matrix.android.sdk.api.raw.RawService
import org.matrix.android.sdk.common.DaggerTestMatrixComponent
import org.matrix.android.sdk.internal.SessionManager
+import org.matrix.android.sdk.internal.network.ApiInterceptor
import org.matrix.android.sdk.internal.network.UserAgentHolder
import org.matrix.android.sdk.internal.util.BackgroundDetectionObserver
import org.matrix.olm.OlmManager
@@ -51,6 +54,7 @@ class Matrix private constructor(context: Context, matrixConfiguration: MatrixCo
@Inject internal lateinit var olmManager: OlmManager
@Inject internal lateinit var sessionManager: SessionManager
@Inject internal lateinit var homeServerHistoryService: HomeServerHistoryService
+ @Inject internal lateinit var apiInterceptor: ApiInterceptor
private val uiHandler = Handler(Looper.getMainLooper())
@@ -79,6 +83,14 @@ class Matrix private constructor(context: Context, matrixConfiguration: MatrixCo
return legacySessionImporter
}
+ fun registerApiInterceptorListener(path: ApiPath, listener: ApiInterceptorListener) {
+ apiInterceptor.addListener(path, listener)
+ }
+
+ fun unregisterApiInterceptorListener(path: ApiPath, listener: ApiInterceptorListener) {
+ apiInterceptor.removeListener(path, listener)
+ }
+
companion object {
private lateinit var instance: Matrix
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/api/network/ApiInterceptorTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/api/network/ApiInterceptorTest.kt
new file mode 100644
index 0000000000..9371154aaf
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/api/network/ApiInterceptorTest.kt
@@ -0,0 +1,58 @@
+/*
+ * 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.network
+
+import org.amshove.kluent.shouldBeEqualTo
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.SessionTestParams
+import org.matrix.android.sdk.common.TestConstants
+import timber.log.Timber
+
+@RunWith(JUnit4::class)
+@FixMethodOrder(MethodSorters.JVM)
+class ApiInterceptorTest : InstrumentedTest {
+
+ private val commonTestHelper = CommonTestHelper(context())
+
+ @Test
+ fun apiInterceptorTest() {
+ val responses = mutableListOf()
+
+ val listener = object : ApiInterceptorListener {
+ override fun onApiResponse(path: ApiPath, response: String) {
+ Timber.w("onApiResponse($path): $response")
+ responses.add(response)
+ }
+ }
+
+ commonTestHelper.matrix.registerApiInterceptorListener(ApiPath.REGISTER, listener)
+
+ val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = true))
+
+ commonTestHelper.signOutAndClose(session)
+
+ commonTestHelper.matrix.unregisterApiInterceptorListener(ApiPath.REGISTER, listener)
+
+ responses.size shouldBeEqualTo 2
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt
index cb49ee8818..6e07223ac7 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CommonTestHelper.kt
@@ -19,11 +19,19 @@ package org.matrix.android.sdk.common
import android.content.Context
import android.net.Uri
import androidx.lifecycle.Observer
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withTimeout
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
import org.matrix.android.sdk.api.Matrix
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.MatrixConfiguration
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
-import org.matrix.android.sdk.api.auth.data.LoginFlowResult
import org.matrix.android.sdk.api.auth.registration.RegistrationResult
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.events.model.EventType
@@ -35,15 +43,6 @@ import org.matrix.android.sdk.api.session.room.timeline.Timeline
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
import org.matrix.android.sdk.api.session.sync.SyncState
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.delay
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import kotlinx.coroutines.withTimeout
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertNotNull
-import org.junit.Assert.assertTrue
import java.util.ArrayList
import java.util.UUID
import java.util.concurrent.CountDownLatch
@@ -60,7 +59,13 @@ class CommonTestHelper(context: Context) {
fun getTestInterceptor(session: Session): MockOkHttpInterceptor? = TestNetworkModule.interceptorForSession(session.sessionId) as? MockOkHttpInterceptor
init {
- Matrix.initialize(context, MatrixConfiguration("TestFlavor"))
+ Matrix.initialize(
+ context,
+ MatrixConfiguration(
+ applicationFlavor = "TestFlavor",
+ roomDisplayNameFallbackProvider = TestRoomDisplayNameFallbackProvider()
+ )
+ )
matrix = Matrix.getInstance(context)
}
@@ -73,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()
@@ -210,22 +215,21 @@ class CommonTestHelper(context: Context) {
sessionTestParams: SessionTestParams): Session {
val hs = createHomeServerConfig()
- doSync {
- matrix.authenticationService
- .getLoginFlow(hs, it)
+ runBlockingTest {
+ matrix.authenticationService.getLoginFlow(hs)
}
- doSync(timeout = 60_000) {
+ runBlockingTest(timeout = 60_000) {
matrix.authenticationService
.getRegistrationWizard()
- .createAccount(userName, password, null, it)
+ .createAccount(userName, password, null)
}
// Perform dummy step
- val registrationResult = doSync(timeout = 60_000) {
+ val registrationResult = runBlockingTest(timeout = 60_000) {
matrix.authenticationService
.getRegistrationWizard()
- .dummy(it)
+ .dummy()
}
assertTrue(registrationResult is RegistrationResult.Success)
@@ -249,15 +253,14 @@ class CommonTestHelper(context: Context) {
sessionTestParams: SessionTestParams): Session {
val hs = createHomeServerConfig()
- doSync {
- matrix.authenticationService
- .getLoginFlow(hs, it)
+ runBlockingTest {
+ matrix.authenticationService.getLoginFlow(hs)
}
- val session = doSync {
+ val session = runBlockingTest {
matrix.authenticationService
.getLoginWizard()
- .login(userName, password, "myDevice", it)
+ .login(userName, password, "myDevice")
}
if (sessionTestParams.withInitialSync) {
@@ -277,21 +280,19 @@ class CommonTestHelper(context: Context) {
password: String): Throwable {
val hs = createHomeServerConfig()
- doSync {
- matrix.authenticationService
- .getLoginFlow(hs, it)
+ runBlockingTest {
+ matrix.authenticationService.getLoginFlow(hs)
}
var requestFailure: Throwable? = null
- waitWithLatch { latch ->
- matrix.authenticationService
- .getLoginWizard()
- .login(userName, password, "myDevice", object : TestMatrixCallback(latch, onlySuccessful = false) {
- override fun onFailure(failure: Throwable) {
- requestFailure = failure
- super.onFailure(failure)
- }
- })
+ runBlockingTest {
+ try {
+ matrix.authenticationService
+ .getLoginWizard()
+ .login(userName, password, "myDevice")
+ } catch (failure: Throwable) {
+ requestFailure = failure
+ }
}
assertNotNull(requestFailure)
@@ -378,7 +379,9 @@ class CommonTestHelper(context: Context) {
fun Iterable.signOutAndClose() = forEach { signOutAndClose(it) }
fun signOutAndClose(session: Session) {
- doSync(60_000) { session.signOut(true, it) }
+ runBlockingTest(timeout = 60_000) {
+ session.signOut(true)
+ }
// no need signout will close
// session.close()
}
@@ -388,8 +391,8 @@ fun List.checkSendOrder(baseTextMessage: String, numberOfMessages
return drop(startIndex)
.take(numberOfMessages)
.foldRightIndexed(true) { index, timelineEvent, acc ->
- val body = timelineEvent.root.content.toModel()?.body
- val currentMessageSuffix = numberOfMessages - index
- acc && (body == null || body.startsWith(baseTextMessage) && body.endsWith("#$currentMessageSuffix"))
- }
+ val body = timelineEvent.root.content.toModel()?.body
+ val currentMessageSuffix = numberOfMessages - index
+ acc && (body == null || body.startsWith(baseTextMessage) && body.endsWith("#$currentMessageSuffix"))
+ }
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt
index 3d5856fc64..da176491c6 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/CryptoTestHelper.kt
@@ -19,6 +19,18 @@ package org.matrix.android.sdk.common
import android.os.SystemClock
import android.util.Log
import androidx.lifecycle.Observer
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertNull
+import org.junit.Assert.assertTrue
+import org.matrix.android.sdk.api.auth.UIABaseAuth
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
+import org.matrix.android.sdk.api.auth.UserPasswordAuth
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.crypto.verification.IncomingSasVerificationTransaction
import org.matrix.android.sdk.api.session.crypto.verification.OutgoingSasVerificationTransaction
@@ -36,17 +48,10 @@ import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import org.matrix.android.sdk.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP
import org.matrix.android.sdk.internal.crypto.keysbackup.model.MegolmBackupAuthData
import org.matrix.android.sdk.internal.crypto.keysbackup.model.MegolmBackupCreationInfo
-import org.matrix.android.sdk.internal.crypto.model.rest.UserPasswordAuth
-import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.GlobalScope
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertNotNull
-import org.junit.Assert.assertNull
-import org.junit.Assert.assertTrue
import java.util.UUID
import java.util.concurrent.CountDownLatch
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.resume
class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
@@ -61,8 +66,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
fun doE2ETestWithAliceInARoom(encryptedRoom: Boolean = true): CryptoTestData {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, defaultSessionParams)
- val roomId = mTestHelper.doSync {
- aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }, it)
+ val roomId = mTestHelper.runBlockingTest {
+ aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" })
}
if (encryptedRoom) {
@@ -107,8 +112,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
bobRoomSummariesLive.observeForever(newRoomObserver)
}
- mTestHelper.doSync {
- aliceRoom.invite(bobSession.myUserId, callback = it)
+ mTestHelper.runBlockingTest {
+ aliceRoom.invite(bobSession.myUserId)
}
mTestHelper.await(lock1)
@@ -130,7 +135,7 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
bobRoomSummariesLive.observeForever(roomJoinedObserver)
}
- mTestHelper.doSync { bobSession.joinRoom(aliceRoomId, callback = it) }
+ mTestHelper.runBlockingTest { bobSession.joinRoom(aliceRoomId) }
mTestHelper.await(lock)
@@ -167,12 +172,12 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
fun createSamAccountAndInviteToTheRoom(room: Room): Session {
val samSession = mTestHelper.createAccount(TestConstants.USER_SAM, defaultSessionParams)
- mTestHelper.doSync {
- room.invite(samSession.myUserId, null, it)
+ mTestHelper.runBlockingTest {
+ room.invite(samSession.myUserId, null)
}
- mTestHelper.doSync {
- samSession.joinRoom(room.roomId, null, emptyList(), it)
+ mTestHelper.runBlockingTest {
+ samSession.joinRoom(room.roomId, null, emptyList())
}
return samSession
@@ -251,8 +256,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
}
fun createDM(alice: Session, bob: Session): String {
- val roomId = mTestHelper.doSync {
- alice.createDirectRoom(bob.myUserId, it)
+ val roomId = mTestHelper.runBlockingTest {
+ alice.createDirectRoom(bob.myUserId)
}
mTestHelper.waitWithLatch { latch ->
@@ -295,7 +300,7 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
bobRoomSummariesLive.observeForever(newRoomObserver)
}
- mTestHelper.doSync { bob.joinRoom(roomId, callback = it) }
+ mTestHelper.runBlockingTest { bob.joinRoom(roomId) }
}
return roomId
@@ -304,10 +309,18 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
fun initializeCrossSigning(session: Session) {
mTestHelper.doSync {
session.cryptoService().crossSigningService()
- .initializeCrossSigning(UserPasswordAuth(
- user = session.myUserId,
- password = TestConstants.PASSWORD
- ), it)
+ .initializeCrossSigning(
+ object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = session.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }, it)
}
}
@@ -324,8 +337,7 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
requestID,
roomId,
bob.myUserId,
- bob.sessionParams.credentials.deviceId!!,
- null)
+ bob.sessionParams.credentials.deviceId!!)
// we should reach SHOW SAS on both
var alicePovTx: OutgoingSasVerificationTransaction? = null
@@ -386,8 +398,8 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, defaultSessionParams)
aliceSession.cryptoService().setWarnOnUnknownDevices(false)
- val roomId = mTestHelper.doSync {
- aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }, it)
+ val roomId = mTestHelper.runBlockingTest {
+ aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" })
}
val room = aliceSession.getRoom(roomId)!!
@@ -398,9 +410,9 @@ class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
val sessions = mutableListOf(aliceSession)
for (index in 1 until numberOfMembers) {
val session = mTestHelper.createAccount("User_$index", defaultSessionParams)
- mTestHelper.doSync(timeout = 600_000) { room.invite(session.myUserId, null, it) }
+ mTestHelper.runBlockingTest(timeout = 600_000) { room.invite(session.myUserId, null) }
println("TEST -> " + session.myUserId + " invited")
- mTestHelper.doSync { session.joinRoom(room.roomId, null, emptyList(), it) }
+ mTestHelper.runBlockingTest { session.joinRoom(room.roomId, null, emptyList()) }
println("TEST -> " + session.myUserId + " joined")
sessions.add(session)
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestMatrixComponent.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestMatrixComponent.kt
index 33de345630..1d05e655af 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestMatrixComponent.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestMatrixComponent.kt
@@ -26,6 +26,7 @@ import org.matrix.android.sdk.internal.di.MatrixModule
import org.matrix.android.sdk.internal.di.MatrixScope
import org.matrix.android.sdk.internal.di.NetworkModule
import org.matrix.android.sdk.internal.raw.RawModule
+import org.matrix.android.sdk.internal.util.system.SystemModule
@Component(modules = [
TestModule::class,
@@ -33,6 +34,7 @@ import org.matrix.android.sdk.internal.raw.RawModule
NetworkModule::class,
AuthModule::class,
RawModule::class,
+ SystemModule::class,
TestNetworkModule::class
])
@MatrixScope
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestRoomDisplayNameFallbackProvider.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestRoomDisplayNameFallbackProvider.kt
new file mode 100644
index 0000000000..af2d57f9ce
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/common/TestRoomDisplayNameFallbackProvider.kt
@@ -0,0 +1,43 @@
+/*
+ * 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.common
+
+import org.matrix.android.sdk.api.RoomDisplayNameFallbackProvider
+
+class TestRoomDisplayNameFallbackProvider : RoomDisplayNameFallbackProvider {
+
+ override fun getNameForRoomInvite() =
+ "Room invite"
+
+ override fun getNameForEmptyRoom(isDirect: Boolean, leftMemberNames: List) =
+ "Empty room"
+
+ override fun getNameFor1member(name: String) =
+ name
+
+ override fun getNameFor2members(name1: String, name2: String) =
+ "$name1 and $name2"
+
+ override fun getNameFor3members(name1: String, name2: String, name3: String) =
+ "$name1, $name2 and $name3"
+
+ override fun getNameFor4members(name1: String, name2: String, name3: String, name4: String) =
+ "$name1, $name2, $name3 and $name4"
+
+ override fun getNameFor4membersAndMore(name1: String, name2: String, name3: String, remainingCount: Int) =
+ "$name1, $name2, $name3 and $remainingCount others"
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/PreShareKeysTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/PreShareKeysTest.kt
new file mode 100644
index 0000000000..a2566c1414
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/PreShareKeysTest.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.internal.crypto
+
+import android.util.Log
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.session.events.model.EventType
+import org.matrix.android.sdk.api.session.events.model.toModel
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.CryptoTestHelper
+import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
+import org.matrix.android.sdk.internal.crypto.model.event.RoomKeyContent
+
+@RunWith(AndroidJUnit4::class)
+@FixMethodOrder(MethodSorters.JVM)
+class PreShareKeysTest : InstrumentedTest {
+
+ private val mTestHelper = CommonTestHelper(context())
+ private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)
+
+ @Test
+ fun ensure_outbound_session_happy_path() {
+ val testData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom(true)
+ val e2eRoomID = testData.roomId
+ val aliceSession = testData.firstSession
+ val bobSession = testData.secondSession!!
+
+ // clear any outbound session
+ aliceSession.cryptoService().discardOutboundSession(e2eRoomID)
+
+ val preShareCount = bobSession.cryptoService().getGossipingEvents().count {
+ it.senderId == aliceSession.myUserId
+ && it.getClearType() == EventType.ROOM_KEY
+ }
+
+ assertEquals("Bob should not have receive any key from alice at this point", 0, preShareCount)
+ Log.d("#Test", "Room Key Received from alice $preShareCount")
+
+ // Force presharing of new outbound key
+ mTestHelper.doSync {
+ aliceSession.cryptoService().prepareToEncrypt(e2eRoomID, it)
+ }
+
+ mTestHelper.waitWithLatch { latch ->
+ mTestHelper.retryPeriodicallyWithLatch(latch) {
+ val newGossipCount = bobSession.cryptoService().getGossipingEvents().count {
+ it.senderId == aliceSession.myUserId
+ && it.getClearType() == EventType.ROOM_KEY
+ }
+ newGossipCount > preShareCount
+ }
+ }
+
+ val latest = bobSession.cryptoService().getGossipingEvents().lastOrNull {
+ it.senderId == aliceSession.myUserId
+ && it.getClearType() == EventType.ROOM_KEY
+ }
+
+ val content = latest?.getClearContent().toModel()
+ assertNotNull("Bob should have received and decrypted a room key event from alice", content)
+ assertEquals("Wrong room", e2eRoomID, content!!.roomId)
+ val megolmSessionId = content.sessionId!!
+
+ val sharedIndex = aliceSession.cryptoService().getSharedWithInfo(e2eRoomID, megolmSessionId)
+ .getObject(bobSession.myUserId, bobSession.sessionParams.deviceId)
+
+ assertEquals("The session received by bob should match what alice sent", 0, sharedIndex)
+
+ // Just send a real message as test
+ val sentEvent = mTestHelper.sendTextMessage(aliceSession.getRoom(e2eRoomID)!!, "Allo", 1).first()
+
+ assertEquals(megolmSessionId, sentEvent.root.content.toModel()?.sessionId, "Unexpected megolm session")
+ mTestHelper.waitWithLatch { latch ->
+ mTestHelper.retryPeriodicallyWithLatch(latch) {
+ bobSession.getRoom(e2eRoomID)?.getTimeLineEvent(sentEvent.eventId)?.root?.getClearType() == EventType.MESSAGE
+ }
+ }
+
+ mTestHelper.signOutAndClose(aliceSession)
+ mTestHelper.signOutAndClose(bobSession)
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/UnwedgingTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/UnwedgingTest.kt
index 0e3b29118c..cf31294e2f 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/UnwedgingTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/UnwedgingTest.kt
@@ -17,7 +17,18 @@
package org.matrix.android.sdk.internal.crypto
import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.amshove.kluent.shouldBe
+import org.junit.Assert
+import org.junit.Before
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.auth.UIABaseAuth
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
+import org.matrix.android.sdk.api.auth.UserPasswordAuth
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
import org.matrix.android.sdk.api.session.events.model.EventType
@@ -30,19 +41,13 @@ import org.matrix.android.sdk.common.CryptoTestHelper
import org.matrix.android.sdk.common.TestConstants
import org.matrix.android.sdk.internal.crypto.model.OlmSessionWrapper
import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
-import org.matrix.android.sdk.internal.crypto.model.rest.UserPasswordAuth
import org.matrix.android.sdk.internal.crypto.store.db.deserializeFromRealm
import org.matrix.android.sdk.internal.crypto.store.db.serializeForRealm
-import org.amshove.kluent.shouldBe
-import org.junit.Assert
-import org.junit.Before
-import org.junit.FixMethodOrder
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.MethodSorters
import org.matrix.olm.OlmSession
import timber.log.Timber
import java.util.concurrent.CountDownLatch
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.resume
/**
* Ref:
@@ -202,10 +207,18 @@ class UnwedgingTest : InstrumentedTest {
// It's a trick to force key request on fail to decrypt
mTestHelper.doSync {
bobSession.cryptoService().crossSigningService()
- .initializeCrossSigning(UserPasswordAuth(
- user = bobSession.myUserId,
- password = TestConstants.PASSWORD
- ), it)
+ .initializeCrossSigning(
+ object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = bobSession.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }, it)
}
// Wait until we received back the key
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/crosssigning/XSigningTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/crosssigning/XSigningTest.kt
index 38c57bd22a..44af87bcbe 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/crosssigning/XSigningTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/crosssigning/XSigningTest.kt
@@ -17,14 +17,6 @@
package org.matrix.android.sdk.internal.crypto.crosssigning
import androidx.test.ext.junit.runners.AndroidJUnit4
-import org.matrix.android.sdk.InstrumentedTest
-import org.matrix.android.sdk.common.CommonTestHelper
-import org.matrix.android.sdk.common.CryptoTestHelper
-import org.matrix.android.sdk.common.SessionTestParams
-import org.matrix.android.sdk.common.TestConstants
-import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
-import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap
-import org.matrix.android.sdk.internal.crypto.model.rest.UserPasswordAuth
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
@@ -35,6 +27,19 @@ import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.auth.UIABaseAuth
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
+import org.matrix.android.sdk.api.auth.UserPasswordAuth
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.CryptoTestHelper
+import org.matrix.android.sdk.common.SessionTestParams
+import org.matrix.android.sdk.common.TestConstants
+import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
+import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.resume
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
@@ -49,10 +54,17 @@ class XSigningTest : InstrumentedTest {
mTestHelper.doSync {
aliceSession.cryptoService().crossSigningService()
- .initializeCrossSigning(UserPasswordAuth(
- user = aliceSession.myUserId,
- password = TestConstants.PASSWORD
- ), it)
+ .initializeCrossSigning(object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = aliceSession.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }, it)
}
val myCrossSigningKeys = aliceSession.cryptoService().crossSigningService().getMyCrossSigningKeys()
@@ -86,8 +98,18 @@ class XSigningTest : InstrumentedTest {
password = TestConstants.PASSWORD
)
- mTestHelper.doSync { aliceSession.cryptoService().crossSigningService().initializeCrossSigning(aliceAuthParams, it) }
- mTestHelper.doSync { bobSession.cryptoService().crossSigningService().initializeCrossSigning(bobAuthParams, it) }
+ mTestHelper.doSync {
+ aliceSession.cryptoService().crossSigningService().initializeCrossSigning(object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(aliceAuthParams)
+ }
+ }, it)
+ }
+ mTestHelper.doSync { bobSession.cryptoService().crossSigningService().initializeCrossSigning(object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(bobAuthParams)
+ }
+ }, it) }
// Check that alice can see bob keys
mTestHelper.doSync> { aliceSession.cryptoService().downloadKeys(listOf(bobSession.myUserId), true, it) }
@@ -122,8 +144,16 @@ class XSigningTest : InstrumentedTest {
password = TestConstants.PASSWORD
)
- mTestHelper.doSync { aliceSession.cryptoService().crossSigningService().initializeCrossSigning(aliceAuthParams, it) }
- mTestHelper.doSync { bobSession.cryptoService().crossSigningService().initializeCrossSigning(bobAuthParams, it) }
+ mTestHelper.doSync { aliceSession.cryptoService().crossSigningService().initializeCrossSigning(object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(aliceAuthParams)
+ }
+ }, it) }
+ mTestHelper.doSync { bobSession.cryptoService().crossSigningService().initializeCrossSigning(object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(bobAuthParams)
+ }
+ }, it) }
// Check that alice can see bob keys
val bobUserId = bobSession.myUserId
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt
index 197e36df06..40659cef11 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/KeyShareTests.kt
@@ -18,7 +18,21 @@ package org.matrix.android.sdk.internal.crypto.gossiping
import android.util.Log
import androidx.test.ext.junit.runners.AndroidJUnit4
+import junit.framework.TestCase.assertEquals
+import junit.framework.TestCase.assertNotNull
+import junit.framework.TestCase.assertTrue
+import junit.framework.TestCase.fail
+import org.junit.Assert
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.auth.UIABaseAuth
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
+import org.matrix.android.sdk.api.auth.UserPasswordAuth
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
+import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.session.crypto.verification.IncomingSasVerificationTransaction
import org.matrix.android.sdk.api.session.crypto.verification.SasVerificationTransaction
import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod
@@ -28,6 +42,7 @@ import org.matrix.android.sdk.api.session.crypto.verification.VerificationTxStat
import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.room.model.RoomDirectoryVisibility
import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
+import org.matrix.android.sdk.api.session.room.model.message.MessageContent
import org.matrix.android.sdk.common.CommonTestHelper
import org.matrix.android.sdk.common.CryptoTestHelper
import org.matrix.android.sdk.common.SessionTestParams
@@ -40,17 +55,9 @@ import org.matrix.android.sdk.internal.crypto.keysbackup.model.rest.KeysVersion
import org.matrix.android.sdk.internal.crypto.model.CryptoDeviceInfo
import org.matrix.android.sdk.internal.crypto.model.MXUsersDevicesMap
import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
-import org.matrix.android.sdk.internal.crypto.model.rest.UserPasswordAuth
-import junit.framework.TestCase.assertEquals
-import junit.framework.TestCase.assertNotNull
-import junit.framework.TestCase.assertTrue
-import junit.framework.TestCase.fail
-import org.junit.Assert
-import org.junit.FixMethodOrder
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.MethodSorters
import java.util.concurrent.CountDownLatch
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.resume
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
@@ -64,13 +71,12 @@ class KeyShareTests : InstrumentedTest {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
// Create an encrypted room and add a message
- val roomId = mTestHelper.doSync {
+ val roomId = mTestHelper.runBlockingTest {
aliceSession.createRoom(
CreateRoomParams().apply {
visibility = RoomDirectoryVisibility.PRIVATE
enableEncryption()
- },
- it
+ }
)
}
val room = aliceSession.getRoom(roomId)
@@ -198,10 +204,17 @@ class KeyShareTests : InstrumentedTest {
mTestHelper.doSync {
aliceSession1.cryptoService().crossSigningService()
- .initializeCrossSigning(UserPasswordAuth(
- user = aliceSession1.myUserId,
- password = TestConstants.PASSWORD
- ), it)
+ .initializeCrossSigning(
+ object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = aliceSession1.myUserId,
+ password = TestConstants.PASSWORD
+ )
+ )
+ }
+ }, it)
}
// Also bootstrap keybackup on first session
@@ -296,4 +309,92 @@ class KeyShareTests : InstrumentedTest {
mTestHelper.signOutAndClose(aliceSession1)
mTestHelper.signOutAndClose(aliceSession2)
}
+
+ @Test
+ fun test_ImproperKeyShareBug() {
+ val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
+
+ mTestHelper.doSync {
+ aliceSession.cryptoService().crossSigningService()
+ .initializeCrossSigning(
+ object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = aliceSession.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }, it)
+ }
+
+ // Create an encrypted room and send a couple of messages
+ val roomId = mTestHelper.runBlockingTest {
+ aliceSession.createRoom(
+ CreateRoomParams().apply {
+ visibility = RoomDirectoryVisibility.PRIVATE
+ enableEncryption()
+ }
+ )
+ }
+ val roomAlicePov = aliceSession.getRoom(roomId)
+ assertNotNull(roomAlicePov)
+ Thread.sleep(1_000)
+ assertTrue(roomAlicePov?.isEncrypted() == true)
+ val secondEventId = mTestHelper.sendTextMessage(roomAlicePov!!, "Message", 3)[1].eventId
+
+ // Create bob session
+
+ val bobSession = mTestHelper.createAccount(TestConstants.USER_BOB, SessionTestParams(true))
+ mTestHelper.doSync {
+ bobSession.cryptoService().crossSigningService()
+ .initializeCrossSigning(
+ object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = bobSession.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }, it)
+ }
+
+ // Let alice invite bob
+ mTestHelper.runBlockingTest {
+ roomAlicePov.invite(bobSession.myUserId, null)
+ }
+
+ mTestHelper.runBlockingTest {
+ bobSession.joinRoom(roomAlicePov.roomId, null, emptyList())
+ }
+
+ // we want to discard alice outbound session
+ aliceSession.cryptoService().discardOutboundSession(roomAlicePov.roomId)
+
+ // and now resend a new message to reset index to 0
+ mTestHelper.sendTextMessage(roomAlicePov, "After", 1)
+
+ val roomRoomBobPov = aliceSession.getRoom(roomId)
+ val beforeJoin = roomRoomBobPov!!.getTimeLineEvent(secondEventId)
+
+ var dRes = tryOrNull { bobSession.cryptoService().decryptEvent(beforeJoin!!.root, "") }
+
+ assert(dRes == null)
+
+ // Try to re-ask the keys
+
+ bobSession.cryptoService().reRequestRoomKeyForEvent(beforeJoin!!.root)
+
+ Thread.sleep(3_000)
+
+ // With the bug the first session would have improperly reshare that key :/
+ dRes = tryOrNull { bobSession.cryptoService().decryptEvent(beforeJoin.root, "") }
+ Log.d("#TEST", "KS: sgould not decrypt that ${beforeJoin.root.getClearContent().toModel()?.body}")
+ assert(dRes?.clearEvent == null)
+ }
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt
index 80cc14fcb6..b2516ea2be 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/gossiping/WithHeldTests.kt
@@ -51,7 +51,7 @@ class WithHeldTests : InstrumentedTest {
// =============================
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
- val bobSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
+ val bobSession = mTestHelper.createAccount(TestConstants.USER_BOB, SessionTestParams(true))
// Initialize cross signing on both
mCryptoTestHelper.initializeCrossSigning(aliceSession)
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/keysbackup/KeysBackupTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/keysbackup/KeysBackupTest.kt
index eb8b8b9730..89d297c592 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/keysbackup/KeysBackupTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/keysbackup/KeysBackupTest.kt
@@ -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 {
keysBackup.getCurrentVersion(it)
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt
index 0489ee179f..d14de30c90 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/ssss/QuadSTests.kt
@@ -19,7 +19,6 @@ package org.matrix.android.sdk.internal.crypto.ssss
import androidx.lifecycle.Observer
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.matrix.android.sdk.InstrumentedTest
-import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.securestorage.EncryptedSecretContent
import org.matrix.android.sdk.api.session.securestorage.KeySigner
@@ -31,7 +30,6 @@ import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.common.CommonTestHelper
import org.matrix.android.sdk.common.SessionTestParams
import org.matrix.android.sdk.common.TestConstants
-import org.matrix.android.sdk.common.TestMatrixCallback
import org.matrix.android.sdk.internal.crypto.SSSS_ALGORITHM_AES_HMAC_SHA2
import org.matrix.android.sdk.internal.crypto.crosssigning.toBase64NoPadding
import org.matrix.android.sdk.internal.crypto.secrets.DefaultSharedSecretStorageService
@@ -40,7 +38,6 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
-import org.amshove.kluent.shouldBe
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
@@ -70,8 +67,8 @@ class QuadSTests : InstrumentedTest {
val TEST_KEY_ID = "my.test.Key"
- mTestHelper.doSync {
- quadS.generateKey(TEST_KEY_ID, null, "Test Key", emptyKeySigner, it)
+ mTestHelper.runBlockingTest {
+ quadS.generateKey(TEST_KEY_ID, null, "Test Key", emptyKeySigner)
}
// Assert Account data is updated
@@ -79,7 +76,7 @@ class QuadSTests : InstrumentedTest {
var accountData: UserAccountDataEvent? = null
val liveAccountData = runBlocking(Dispatchers.Main) {
- aliceSession.getLiveAccountDataEvent("${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID")
+ aliceSession.accountDataService().getLiveUserAccountDataEvent("${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID")
}
val accountDataObserver = Observer?> { t ->
if (t?.getOrNull()?.type == "${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID") {
@@ -99,13 +96,15 @@ class QuadSTests : InstrumentedTest {
assertNull("Key was not generated from passphrase", parsed.passphrase)
// Set as default key
- quadS.setDefaultKey(TEST_KEY_ID, object : MatrixCallback {})
+ GlobalScope.launch {
+ quadS.setDefaultKey(TEST_KEY_ID)
+ }
var defaultKeyAccountData: UserAccountDataEvent? = null
val defaultDataLock = CountDownLatch(1)
val liveDefAccountData = runBlocking(Dispatchers.Main) {
- aliceSession.getLiveAccountDataEvent(DefaultSharedSecretStorageService.DEFAULT_KEY_ID)
+ aliceSession.accountDataService().getLiveUserAccountDataEvent(DefaultSharedSecretStorageService.DEFAULT_KEY_ID)
}
val accountDefDataObserver = Observer?> { t ->
if (t?.getOrNull()?.type == DefaultSharedSecretStorageService.DEFAULT_KEY_ID) {
@@ -133,12 +132,11 @@ class QuadSTests : InstrumentedTest {
// Store a secret
val clearSecret = "42".toByteArray().toBase64NoPadding()
- mTestHelper.doSync {
+ mTestHelper.runBlockingTest {
aliceSession.sharedSecretStorageService.storeSecret(
"secret.of.life",
clearSecret,
- listOf(SharedSecretStorageService.KeyRef(null, keySpec)), // default key
- it
+ listOf(SharedSecretStorageService.KeyRef(null, keySpec)) // default key
)
}
@@ -155,12 +153,11 @@ class QuadSTests : InstrumentedTest {
// Try to decrypt??
- val decryptedSecret = mTestHelper.doSync {
+ val decryptedSecret = mTestHelper.runBlockingTest {
aliceSession.sharedSecretStorageService.getSecret(
"secret.of.life",
null, // default key
- keySpec!!,
- it
+ keySpec!!
)
}
@@ -176,13 +173,13 @@ class QuadSTests : InstrumentedTest {
val TEST_KEY_ID = "my.test.Key"
- mTestHelper.doSync {
- quadS.generateKey(TEST_KEY_ID, null, "Test Key", emptyKeySigner, it)
+ mTestHelper.runBlockingTest {
+ quadS.generateKey(TEST_KEY_ID, null, "Test Key", emptyKeySigner)
}
// Test that we don't need to wait for an account data sync to access directly the keyid from DB
- mTestHelper.doSync {
- quadS.setDefaultKey(TEST_KEY_ID, it)
+ mTestHelper.runBlockingTest {
+ quadS.setDefaultKey(TEST_KEY_ID)
}
mTestHelper.signOutAndClose(aliceSession)
@@ -198,19 +195,18 @@ class QuadSTests : InstrumentedTest {
val mySecretText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
- mTestHelper.doSync {
+ mTestHelper.runBlockingTest {
aliceSession.sharedSecretStorageService.storeSecret(
"my.secret",
mySecretText.toByteArray().toBase64NoPadding(),
listOf(
SharedSecretStorageService.KeyRef(keyId1, RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey)),
SharedSecretStorageService.KeyRef(keyId2, RawBytesKeySpec.fromRecoveryKey(key2Info.recoveryKey))
- ),
- it
+ )
)
}
- val accountDataEvent = aliceSession.getAccountDataEvent("my.secret")
+ val accountDataEvent = aliceSession.accountDataService().getUserAccountDataEvent("my.secret")
val encryptedContent = accountDataEvent?.content?.get("encrypted") as? Map<*, *>
assertEquals("Content should contains two encryptions", 2, encryptedContent?.keys?.size ?: 0)
@@ -219,19 +215,17 @@ class QuadSTests : InstrumentedTest {
assertNotNull(encryptedContent?.get(keyId2))
// Assert that can decrypt with both keys
- mTestHelper.doSync {
+ mTestHelper.runBlockingTest {
aliceSession.sharedSecretStorageService.getSecret("my.secret",
keyId1,
- RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey)!!,
- it
+ RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey)!!
)
}
- mTestHelper.doSync {
+ mTestHelper.runBlockingTest {
aliceSession.sharedSecretStorageService.getSecret("my.secret",
keyId2,
- RawBytesKeySpec.fromRecoveryKey(key2Info.recoveryKey)!!,
- it
+ RawBytesKeySpec.fromRecoveryKey(key2Info.recoveryKey)!!
)
}
@@ -247,50 +241,34 @@ class QuadSTests : InstrumentedTest {
val mySecretText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
- mTestHelper.doSync {
+ mTestHelper.runBlockingTest {
aliceSession.sharedSecretStorageService.storeSecret(
"my.secret",
mySecretText.toByteArray().toBase64NoPadding(),
- listOf(SharedSecretStorageService.KeyRef(keyId1, RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey))),
- it
+ listOf(SharedSecretStorageService.KeyRef(keyId1, RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey)))
)
}
- val decryptCountDownLatch = CountDownLatch(1)
- var error = false
- aliceSession.sharedSecretStorageService.getSecret("my.secret",
- keyId1,
- RawBytesKeySpec.fromPassphrase(
- "A bad passphrase",
- key1Info.content?.passphrase?.salt ?: "",
- key1Info.content?.passphrase?.iterations ?: 0,
- null),
- object : MatrixCallback {
- override fun onSuccess(data: String) {
- decryptCountDownLatch.countDown()
- }
-
- override fun onFailure(failure: Throwable) {
- error = true
- decryptCountDownLatch.countDown()
- }
- }
- )
-
- mTestHelper.await(decryptCountDownLatch)
-
- error shouldBe true
+ mTestHelper.runBlockingTest {
+ aliceSession.sharedSecretStorageService.getSecret("my.secret",
+ keyId1,
+ RawBytesKeySpec.fromPassphrase(
+ "A bad passphrase",
+ key1Info.content?.passphrase?.salt ?: "",
+ key1Info.content?.passphrase?.iterations ?: 0,
+ null)
+ )
+ }
// Now try with correct key
- mTestHelper.doSync {
+ mTestHelper.runBlockingTest {
aliceSession.sharedSecretStorageService.getSecret("my.secret",
keyId1,
RawBytesKeySpec.fromPassphrase(
passphrase,
key1Info.content?.passphrase?.salt ?: "",
key1Info.content?.passphrase?.iterations ?: 0,
- null),
- it
+ null)
)
}
@@ -302,7 +280,7 @@ class QuadSTests : InstrumentedTest {
var accountData: UserAccountDataEvent? = null
val liveAccountData = runBlocking(Dispatchers.Main) {
- session.getLiveAccountDataEvent(type)
+ session.accountDataService().getLiveUserAccountDataEvent(type)
}
val accountDataObserver = Observer?> { t ->
if (t?.getOrNull()?.type == type) {
@@ -321,15 +299,15 @@ class QuadSTests : InstrumentedTest {
private fun generatedSecret(session: Session, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
val quadS = session.sharedSecretStorageService
- val creationInfo = mTestHelper.doSync {
- quadS.generateKey(keyId, null, keyId, emptyKeySigner, it)
+ val creationInfo = mTestHelper.runBlockingTest {
+ quadS.generateKey(keyId, null, keyId, emptyKeySigner)
}
assertAccountData(session, "${DefaultSharedSecretStorageService.KEY_ID_BASE}.$keyId")
if (asDefault) {
- mTestHelper.doSync {
- quadS.setDefaultKey(keyId, it)
+ mTestHelper.runBlockingTest {
+ quadS.setDefaultKey(keyId)
}
assertAccountData(session, DefaultSharedSecretStorageService.DEFAULT_KEY_ID)
}
@@ -340,21 +318,20 @@ class QuadSTests : InstrumentedTest {
private fun generatedSecretFromPassphrase(session: Session, passphrase: String, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
val quadS = session.sharedSecretStorageService
- val creationInfo = mTestHelper.doSync {
+ val creationInfo = mTestHelper.runBlockingTest {
quadS.generateKeyWithPassphrase(
keyId,
keyId,
passphrase,
emptyKeySigner,
- null,
- it)
+ null)
}
assertAccountData(session, "${DefaultSharedSecretStorageService.KEY_ID_BASE}.$keyId")
if (asDefault) {
- val setDefaultLatch = CountDownLatch(1)
- quadS.setDefaultKey(keyId, TestMatrixCallback(setDefaultLatch))
- mTestHelper.await(setDefaultLatch)
+ mTestHelper.runBlockingTest {
+ quadS.setDefaultKey(keyId)
+ }
assertAccountData(session, DefaultSharedSecretStorageService.DEFAULT_KEY_ID)
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/SASTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/SASTest.kt
index a81f503e77..4ea8cdc074 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/SASTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/SASTest.kt
@@ -593,16 +593,14 @@ class SASTest : InstrumentedTest {
requestID!!,
cryptoTestData.roomId,
bobSession.myUserId,
- bobSession.sessionParams.deviceId!!,
- null)
+ bobSession.sessionParams.deviceId!!)
bobVerificationService.beginKeyVerificationInDMs(
VerificationMethod.SAS,
requestID!!,
cryptoTestData.roomId,
aliceSession.myUserId,
- aliceSession.sessionParams.deviceId!!,
- null)
+ aliceSession.sessionParams.deviceId!!)
// we should reach SHOW SAS on both
var alicePovTx: SasVerificationTransaction?
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/QrCodeTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/QrCodeTest.kt
index ee604fc9ab..76bf6dc040 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/QrCodeTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/QrCodeTest.kt
@@ -226,12 +226,12 @@ class QrCodeTest : InstrumentedTest {
private fun checkHeader(byteArray: ByteArray) {
// MATRIX
- byteArray[0] shouldBeEqualTo 'M'.toByte()
- byteArray[1] shouldBeEqualTo 'A'.toByte()
- byteArray[2] shouldBeEqualTo 'T'.toByte()
- byteArray[3] shouldBeEqualTo 'R'.toByte()
- byteArray[4] shouldBeEqualTo 'I'.toByte()
- byteArray[5] shouldBeEqualTo 'X'.toByte()
+ byteArray[0] shouldBeEqualTo 'M'.code.toByte()
+ byteArray[1] shouldBeEqualTo 'A'.code.toByte()
+ byteArray[2] shouldBeEqualTo 'T'.code.toByte()
+ byteArray[3] shouldBeEqualTo 'R'.code.toByte()
+ byteArray[4] shouldBeEqualTo 'I'.code.toByte()
+ byteArray[5] shouldBeEqualTo 'X'.code.toByte()
// Version
byteArray[6] shouldBeEqualTo 2
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/VerificationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/VerificationTest.kt
index 1385dac1ec..397f7f9441 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/VerificationTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/crypto/verification/qrcode/VerificationTest.kt
@@ -17,20 +17,25 @@
package org.matrix.android.sdk.internal.crypto.verification.qrcode
import androidx.test.ext.junit.runners.AndroidJUnit4
-import org.matrix.android.sdk.InstrumentedTest
-import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod
-import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
-import org.matrix.android.sdk.common.CommonTestHelper
-import org.matrix.android.sdk.common.CryptoTestHelper
-import org.matrix.android.sdk.common.TestConstants
-import org.matrix.android.sdk.internal.crypto.model.rest.UserPasswordAuth
-import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest
import org.amshove.kluent.shouldBe
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.auth.UIABaseAuth
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
+import org.matrix.android.sdk.api.auth.UserPasswordAuth
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
+import org.matrix.android.sdk.api.session.crypto.verification.PendingVerificationRequest
+import org.matrix.android.sdk.api.session.crypto.verification.VerificationMethod
+import org.matrix.android.sdk.api.session.crypto.verification.VerificationService
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.CryptoTestHelper
+import org.matrix.android.sdk.common.TestConstants
import java.util.concurrent.CountDownLatch
+import kotlin.coroutines.Continuation
+import kotlin.coroutines.resume
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
@@ -157,18 +162,34 @@ class VerificationTest : InstrumentedTest {
mTestHelper.doSync { callback ->
aliceSession.cryptoService().crossSigningService()
- .initializeCrossSigning(UserPasswordAuth(
- user = aliceSession.myUserId,
- password = TestConstants.PASSWORD
- ), callback)
+ .initializeCrossSigning(
+ object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = aliceSession.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }, callback)
}
mTestHelper.doSync { callback ->
bobSession.cryptoService().crossSigningService()
- .initializeCrossSigning(UserPasswordAuth(
- user = bobSession.myUserId,
- password = TestConstants.PASSWORD
- ), callback)
+ .initializeCrossSigning(
+ object : UserInteractiveAuthInterceptor {
+ override fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation) {
+ promise.resume(
+ UserPasswordAuth(
+ user = bobSession.myUserId,
+ password = TestConstants.PASSWORD,
+ session = flowResponse.session
+ )
+ )
+ }
+ }, callback)
}
val aliceVerificationService = aliceSession.cryptoService().verificationService()
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/media/UrlsExtractorTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/media/UrlsExtractorTest.kt
index 9ee84fdfc6..473b18b31b 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/media/UrlsExtractorTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/media/UrlsExtractorTest.kt
@@ -26,6 +26,8 @@ import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
import org.matrix.android.sdk.api.session.room.model.message.MessageTextContent
import org.matrix.android.sdk.api.session.room.model.message.MessageType
+import org.matrix.android.sdk.api.session.room.sender.SenderInfo
+import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
@RunWith(AndroidJUnit4::class)
internal class UrlsExtractorTest : InstrumentedTest {
@@ -36,6 +38,7 @@ internal class UrlsExtractorTest : InstrumentedTest {
fun wrongEventTypeTest() {
createEvent(body = "https://matrix.org")
.copy(type = EventType.STATE_ROOM_GUEST_ACCESS)
+ .toFakeTimelineEvent()
.let { urlsExtractor.extract(it) }
.size shouldBeEqualTo 0
}
@@ -43,6 +46,7 @@ internal class UrlsExtractorTest : InstrumentedTest {
@Test
fun oneUrlTest() {
createEvent(body = "https://matrix.org")
+ .toFakeTimelineEvent()
.let { urlsExtractor.extract(it) }
.let { result ->
result.size shouldBeEqualTo 1
@@ -53,6 +57,7 @@ internal class UrlsExtractorTest : InstrumentedTest {
@Test
fun withoutProtocolTest() {
createEvent(body = "www.matrix.org")
+ .toFakeTimelineEvent()
.let { urlsExtractor.extract(it) }
.size shouldBeEqualTo 0
}
@@ -60,6 +65,7 @@ internal class UrlsExtractorTest : InstrumentedTest {
@Test
fun oneUrlWithParamTest() {
createEvent(body = "https://matrix.org?foo=bar")
+ .toFakeTimelineEvent()
.let { urlsExtractor.extract(it) }
.let { result ->
result.size shouldBeEqualTo 1
@@ -70,6 +76,7 @@ internal class UrlsExtractorTest : InstrumentedTest {
@Test
fun oneUrlWithParamsTest() {
createEvent(body = "https://matrix.org?foo=bar&bar=foo")
+ .toFakeTimelineEvent()
.let { urlsExtractor.extract(it) }
.let { result ->
result.size shouldBeEqualTo 1
@@ -80,16 +87,18 @@ internal class UrlsExtractorTest : InstrumentedTest {
@Test
fun oneUrlInlinedTest() {
createEvent(body = "Hello https://matrix.org, how are you?")
+ .toFakeTimelineEvent()
.let { urlsExtractor.extract(it) }
.let { result ->
result.size shouldBeEqualTo 1
- result[0] shouldBeEqualTo "https://matrix.org"
+ result[0] shouldBeEqualTo "https://matrix.org"
}
}
@Test
fun twoUrlsTest() {
createEvent(body = "https://matrix.org https://example.org")
+ .toFakeTimelineEvent()
.let { urlsExtractor.extract(it) }
.let { result ->
result.size shouldBeEqualTo 2
@@ -99,10 +108,26 @@ internal class UrlsExtractorTest : InstrumentedTest {
}
private fun createEvent(body: String): Event = Event(
+ eventId = "!fake",
type = EventType.MESSAGE,
content = MessageTextContent(
msgType = MessageType.MSGTYPE_TEXT,
body = body
).toContent()
)
+
+ private fun Event.toFakeTimelineEvent(): TimelineEvent {
+ return TimelineEvent(
+ root = this,
+ localId = 0L,
+ eventId = eventId!!,
+ displayIndex = 0,
+ senderInfo = SenderInfo(
+ userId = "",
+ displayName = null,
+ isUniqueDisplayName = true,
+ avatarUrl = null
+ )
+ )
+ }
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/securestorage/SecretStoringUtilsTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/securestorage/SecretStoringUtilsTest.kt
new file mode 100644
index 0000000000..7ee6caed0d
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/securestorage/SecretStoringUtilsTest.kt
@@ -0,0 +1,184 @@
+/*
+ * 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.securestorage
+
+import android.os.Build
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import org.amshove.kluent.shouldBeEqualTo
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.internal.crypto.crosssigning.fromBase64
+import org.matrix.android.sdk.internal.crypto.crosssigning.toBase64NoPadding
+import java.io.ByteArrayOutputStream
+import java.util.UUID
+
+@RunWith(AndroidJUnit4::class)
+@FixMethodOrder(MethodSorters.JVM)
+class SecretStoringUtilsTest : InstrumentedTest {
+
+ private val buildVersionSdkIntProvider = TestBuildVersionSdkIntProvider()
+ private val secretStoringUtils = SecretStoringUtils(context(), buildVersionSdkIntProvider)
+
+ companion object {
+ const val TEST_STR = "This is something I want to store safely!"
+ }
+
+ @Test
+ fun testStringNominalCaseApi21() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.LOLLIPOP
+ // Encrypt
+ val encrypted = secretStoringUtils.securelyStoreString(TEST_STR, alias)
+ // Decrypt
+ val decrypted = secretStoringUtils.loadSecureSecret(encrypted, alias)
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ @Test
+ fun testStringNominalCaseApi23() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.M
+ // Encrypt
+ val encrypted = secretStoringUtils.securelyStoreString(TEST_STR, alias)
+ // Decrypt
+ val decrypted = secretStoringUtils.loadSecureSecret(encrypted, alias)
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ @Test
+ fun testStringNominalCaseApi30() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.R
+ // Encrypt
+ val encrypted = secretStoringUtils.securelyStoreString(TEST_STR, alias)
+ // Decrypt
+ val decrypted = secretStoringUtils.loadSecureSecret(encrypted, alias)
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ @Test
+ fun testStringMigration21_23() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.LOLLIPOP
+ // Encrypt
+ val encrypted = secretStoringUtils.securelyStoreString(TEST_STR, alias)
+
+ // Simulate a system upgrade
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.M
+
+ // Decrypt
+ val decrypted = secretStoringUtils.loadSecureSecret(encrypted, alias)
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ @Test
+ fun testObjectNominalCaseApi21() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.LOLLIPOP
+
+ // Encrypt
+ val encrypted = ByteArrayOutputStream().also { outputStream ->
+ outputStream.use {
+ secretStoringUtils.securelyStoreObject(TEST_STR, alias, it)
+ }
+ }
+ .toByteArray()
+ .toBase64NoPadding()
+ // Decrypt
+ val decrypted = encrypted.fromBase64().inputStream().use {
+ secretStoringUtils.loadSecureSecret(it, alias)
+ }
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ @Test
+ fun testObjectNominalCaseApi23() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.M
+
+ // Encrypt
+ val encrypted = ByteArrayOutputStream().also { outputStream ->
+ outputStream.use {
+ secretStoringUtils.securelyStoreObject(TEST_STR, alias, it)
+ }
+ }
+ .toByteArray()
+ .toBase64NoPadding()
+ // Decrypt
+ val decrypted = encrypted.fromBase64().inputStream().use {
+ secretStoringUtils.loadSecureSecret(it, alias)
+ }
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ @Test
+ fun testObjectNominalCaseApi30() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.R
+
+ // Encrypt
+ val encrypted = ByteArrayOutputStream().also { outputStream ->
+ outputStream.use {
+ secretStoringUtils.securelyStoreObject(TEST_STR, alias, it)
+ }
+ }
+ .toByteArray()
+ .toBase64NoPadding()
+ // Decrypt
+ val decrypted = encrypted.fromBase64().inputStream().use {
+ secretStoringUtils.loadSecureSecret(it, alias)
+ }
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ @Test
+ fun testObjectMigration21_23() {
+ val alias = generateAlias()
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.LOLLIPOP
+
+ // Encrypt
+ val encrypted = ByteArrayOutputStream().also { outputStream ->
+ outputStream.use {
+ secretStoringUtils.securelyStoreObject(TEST_STR, alias, it)
+ }
+ }
+ .toByteArray()
+ .toBase64NoPadding()
+
+ // Simulate a system upgrade
+ buildVersionSdkIntProvider.value = Build.VERSION_CODES.M
+
+ // Decrypt
+ val decrypted = encrypted.fromBase64().inputStream().use {
+ secretStoringUtils.loadSecureSecret(it, alias)
+ }
+ decrypted shouldBeEqualTo TEST_STR
+ secretStoringUtils.safeDeleteKey(alias)
+ }
+
+ private fun generateAlias() = UUID.randomUUID().toString()
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/securestorage/TestBuildVersionSdkIntProvider.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/securestorage/TestBuildVersionSdkIntProvider.kt
new file mode 100644
index 0000000000..b08c88fb24
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/session/securestorage/TestBuildVersionSdkIntProvider.kt
@@ -0,0 +1,25 @@
+/*
+ * 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.securestorage
+
+import org.matrix.android.sdk.internal.util.system.BuildVersionSdkIntProvider
+
+class TestBuildVersionSdkIntProvider : BuildVersionSdkIntProvider {
+ var value: Int = 0
+
+ override fun get() = value
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt
index 34edf37733..f156a5eb64 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineForwardPaginationTest.kt
@@ -66,8 +66,8 @@ class TimelineForwardPaginationTest : InstrumentedTest {
numberOfMessagesToSend)
// Alice clear the cache
- commonTestHelper.doSync {
- aliceSession.clearCache(it)
+ commonTestHelper.runBlockingTest {
+ aliceSession.clearCache()
}
// And restarts the sync
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineWithManyMembersTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineWithManyMembersTest.kt
index ff07cf1d1d..ace48cef77 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineWithManyMembersTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/TimelineWithManyMembersTest.kt
@@ -16,6 +16,7 @@
package org.matrix.android.sdk.session.room.timeline
+import org.junit.Assert.fail
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
@@ -29,7 +30,6 @@ import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
import org.matrix.android.sdk.common.CommonTestHelper
import org.matrix.android.sdk.common.CryptoTestHelper
import java.util.concurrent.CountDownLatch
-import kotlin.test.fail
@RunWith(JUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
@@ -80,6 +80,7 @@ class TimelineWithManyMembersTest : InstrumentedTest {
return@createEventListener true
} else {
fail("User " + session.myUserId + " decrypted as " + body + " CryptoError: " + it.root.mCryptoError)
+ false
}
} ?: return@createEventListener false
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/search/SearchMessagesTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/search/SearchMessagesTest.kt
index ae300c936d..1baf490dfc 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/search/SearchMessagesTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/search/SearchMessagesTest.kt
@@ -17,116 +17,38 @@
package org.matrix.android.sdk.session.search
import org.junit.Assert.assertTrue
-import org.junit.Assert.fail
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.MethodSorters
import org.matrix.android.sdk.InstrumentedTest
-import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
import org.matrix.android.sdk.api.session.room.timeline.TimelineSettings
import org.matrix.android.sdk.api.session.search.SearchResult
import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.CryptoTestData
import org.matrix.android.sdk.common.CryptoTestHelper
-import org.matrix.android.sdk.common.TestConstants
import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
@RunWith(JUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class SearchMessagesTest : InstrumentedTest {
- private val MESSAGE = "Lorem ipsum dolor sit amet"
+ companion object {
+ private const val MESSAGE = "Lorem ipsum dolor sit amet"
+ }
private val commonTestHelper = CommonTestHelper(context())
private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
@Test
fun sendTextMessageAndSearchPartOfItUsingSession() {
- val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
- val aliceSession = cryptoTestData.firstSession
- val aliceRoomId = cryptoTestData.roomId
- aliceSession.cryptoService().setWarnOnUnknownDevices(false)
- val roomFromAlicePOV = aliceSession.getRoom(aliceRoomId)!!
- val aliceTimeline = roomFromAlicePOV.createTimeline(null, TimelineSettings(10))
- aliceTimeline.start()
-
- commonTestHelper.sendTextMessage(
- roomFromAlicePOV,
- MESSAGE,
- 2)
-
- run {
- var lock = CountDownLatch(1)
-
- val eventListener = commonTestHelper.createEventListener(lock) { snapshot ->
- snapshot.count { it.root.content.toModel()?.body?.startsWith(MESSAGE).orFalse() } == 2
- }
-
- aliceTimeline.addListener(eventListener)
- commonTestHelper.await(lock)
-
- lock = CountDownLatch(1)
- val data = commonTestHelper.runBlockingTest {
- aliceSession
- .searchService()
- .search(
- searchTerm = "lore",
- limit = 10,
- includeProfile = true,
- afterLimit = 0,
- beforeLimit = 10,
- orderByRecent = true,
- nextBatch = null,
- roomId = aliceRoomId
- )
- }
- assertTrue(data.results?.size == 2)
- assertTrue(
- data.results
- ?.all {
- (it.event.content?.get("body") as? String)?.startsWith(MESSAGE).orFalse()
- }.orFalse()
- )
-
- aliceTimeline.removeAllListeners()
- cryptoTestData.cleanUp(commonTestHelper)
- }
-
- aliceSession.startSync(true)
- }
-
- @Test
- fun sendTextMessageAndSearchPartOfItUsingRoom() {
- val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceAndBobInARoom(false)
- val aliceSession = cryptoTestData.firstSession
- val aliceRoomId = cryptoTestData.roomId
- aliceSession.cryptoService().setWarnOnUnknownDevices(false)
- val roomFromAlicePOV = aliceSession.getRoom(aliceRoomId)!!
- val aliceTimeline = roomFromAlicePOV.createTimeline(null, TimelineSettings(10))
- aliceTimeline.start()
-
- commonTestHelper.sendTextMessage(
- roomFromAlicePOV,
- MESSAGE,
- 2)
-
- run {
- var lock = CountDownLatch(1)
-
- val eventListener = commonTestHelper.createEventListener(lock) { snapshot ->
- snapshot.count { it.root.content.toModel()?.body?.startsWith(MESSAGE).orFalse() } == 2
- }
-
- aliceTimeline.addListener(eventListener)
- commonTestHelper.await(lock)
-
- lock = CountDownLatch(1)
- roomFromAlicePOV
+ doTest { cryptoTestData ->
+ cryptoTestData.firstSession
+ .searchService()
.search(
searchTerm = "lore",
limit = 10,
@@ -135,32 +57,64 @@ class SearchMessagesTest : InstrumentedTest {
beforeLimit = 10,
orderByRecent = true,
nextBatch = null,
- callback = object : MatrixCallback {
- override fun onSuccess(data: SearchResult) {
- super.onSuccess(data)
- assertTrue(data.results?.size == 2)
- assertTrue(
- data.results
- ?.all {
- (it.event.content?.get("body") as? String)?.startsWith(MESSAGE).orFalse()
- }.orFalse()
- )
- lock.countDown()
- }
-
- override fun onFailure(failure: Throwable) {
- super.onFailure(failure)
- fail(failure.localizedMessage)
- lock.countDown()
- }
- }
+ roomId = cryptoTestData.roomId
)
- lock.await(TestConstants.timeOutMillis, TimeUnit.MILLISECONDS)
+ }
+ }
- aliceTimeline.removeAllListeners()
- cryptoTestData.cleanUp(commonTestHelper)
+ @Test
+ fun sendTextMessageAndSearchPartOfItUsingRoom() {
+ doTest { cryptoTestData ->
+ cryptoTestData.firstSession
+ .getRoom(cryptoTestData.roomId)!!
+ .search(
+ searchTerm = "lore",
+ limit = 10,
+ includeProfile = true,
+ afterLimit = 0,
+ beforeLimit = 10,
+ orderByRecent = true,
+ nextBatch = null
+ )
+ }
+ }
+
+ private fun doTest(block: suspend (CryptoTestData) -> SearchResult) {
+ val cryptoTestData = cryptoTestHelper.doE2ETestWithAliceInARoom(false)
+ val aliceSession = cryptoTestData.firstSession
+ val aliceRoomId = cryptoTestData.roomId
+ val roomFromAlicePOV = aliceSession.getRoom(aliceRoomId)!!
+ val aliceTimeline = roomFromAlicePOV.createTimeline(null, TimelineSettings(10))
+ aliceTimeline.start()
+
+ val lock = CountDownLatch(1)
+
+ val eventListener = commonTestHelper.createEventListener(lock) { snapshot ->
+ snapshot.count { it.root.content.toModel()?.body?.startsWith(MESSAGE).orFalse() } == 2
}
- aliceSession.startSync(true)
+ aliceTimeline.addListener(eventListener)
+
+ commonTestHelper.sendTextMessage(
+ roomFromAlicePOV,
+ MESSAGE,
+ 2)
+
+ commonTestHelper.await(lock)
+
+ val data = commonTestHelper.runBlockingTest {
+ block.invoke(cryptoTestData)
+ }
+
+ assertTrue(data.results?.size == 2)
+ assertTrue(
+ data.results
+ ?.all {
+ (it.event.content?.get("body") as? String)?.startsWith(MESSAGE).orFalse()
+ }.orFalse()
+ )
+
+ aliceTimeline.removeAllListeners()
+ cryptoTestData.cleanUp(commonTestHelper)
}
}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceCreationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceCreationTest.kt
new file mode 100644
index 0000000000..a1744a0dae
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceCreationTest.kt
@@ -0,0 +1,222 @@
+/*
+ * Copyright 2021 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.session.space
+
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.query.ActiveSpaceFilter
+import org.matrix.android.sdk.api.session.events.model.EventType
+import org.matrix.android.sdk.api.session.events.model.toModel
+import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
+import org.matrix.android.sdk.api.session.room.model.GuestAccess
+import org.matrix.android.sdk.api.session.room.model.Membership
+import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
+import org.matrix.android.sdk.api.session.room.model.RoomGuestAccessContent
+import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibility
+import org.matrix.android.sdk.api.session.room.model.RoomHistoryVisibilityContent
+import org.matrix.android.sdk.api.session.room.model.RoomType
+import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
+import org.matrix.android.sdk.api.session.room.model.create.CreateRoomPreset
+import org.matrix.android.sdk.api.session.room.model.create.RoomCreateContent
+import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
+import org.matrix.android.sdk.api.session.space.JoinSpaceResult
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.SessionTestParams
+
+@RunWith(JUnit4::class)
+@FixMethodOrder(MethodSorters.JVM)
+class SpaceCreationTest : InstrumentedTest {
+
+ private val commonTestHelper = CommonTestHelper(context())
+
+ @Test
+ fun createSimplePublicSpace() {
+ val session = commonTestHelper.createAccount("Hubble", SessionTestParams(true))
+ val roomName = "My Space"
+ val topic = "A public space for test"
+ var spaceId: String = ""
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ spaceId = session.spaceService().createSpace(roomName, topic, null, true)
+ // wait a bit to let the summary update it self :/
+ it.countDown()
+ }
+ }
+
+ val syncedSpace = session.spaceService().getSpace(spaceId)
+ commonTestHelper.waitWithLatch {
+ commonTestHelper.retryPeriodicallyWithLatch(it) {
+ syncedSpace?.asRoom()?.roomSummary()?.name != null
+ }
+ }
+ assertEquals("Room name should be set", roomName, syncedSpace?.asRoom()?.roomSummary()?.name)
+ assertEquals("Room topic should be set", topic, syncedSpace?.asRoom()?.roomSummary()?.topic)
+ // assertEquals(topic, syncedSpace.asRoom().roomSummary()?., "Room topic should be set")
+
+ assertNotNull("Space should be found by Id", syncedSpace)
+ val creationEvent = syncedSpace!!.asRoom().getStateEvent(EventType.STATE_ROOM_CREATE)
+ val createContent = creationEvent?.content.toModel()
+ assertEquals("Room type should be space", RoomType.SPACE, createContent?.type)
+
+ var powerLevelsContent: PowerLevelsContent? = null
+ commonTestHelper.waitWithLatch { latch ->
+ commonTestHelper.retryPeriodicallyWithLatch(latch) {
+ val toModel = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_POWER_LEVELS)?.content.toModel()
+ powerLevelsContent = toModel
+ toModel != null
+ }
+ }
+ assertEquals("Space-rooms should be created with a power level for events_default of 100", 100, powerLevelsContent?.eventsDefault)
+
+ val guestAccess = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_GUEST_ACCESS)?.content
+ ?.toModel()?.guestAccess
+
+ assertEquals("Public space room should be peekable by guest", GuestAccess.CanJoin, guestAccess)
+
+ val historyVisibility = syncedSpace.asRoom().getStateEvent(EventType.STATE_ROOM_HISTORY_VISIBILITY)?.content
+ ?.toModel()?.historyVisibility
+
+ assertEquals("Public space room should be world readable", RoomHistoryVisibility.WORLD_READABLE, historyVisibility)
+
+ commonTestHelper.signOutAndClose(session)
+ }
+
+ @Test
+ fun testJoinSimplePublicSpace() {
+ val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
+ val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
+
+ val roomName = "My Space"
+ val topic = "A public space for test"
+ val spaceId: String
+ runBlocking {
+ spaceId = aliceSession.spaceService().createSpace(roomName, topic, null, true)
+ // wait a bit to let the summary update it self :/
+ delay(400)
+ }
+
+ // Try to join from bob, it's a public space no need to invite
+
+ val joinResult: JoinSpaceResult
+ runBlocking {
+ joinResult = bobSession.spaceService().joinSpace(spaceId)
+ }
+
+ assertEquals(JoinSpaceResult.Success, joinResult)
+
+ val spaceBobPov = bobSession.spaceService().getSpace(spaceId)
+ assertEquals("Room name should be set", roomName, spaceBobPov?.asRoom()?.roomSummary()?.name)
+ assertEquals("Room topic should be set", topic, spaceBobPov?.asRoom()?.roomSummary()?.topic)
+
+ commonTestHelper.signOutAndClose(aliceSession)
+ commonTestHelper.signOutAndClose(bobSession)
+ }
+
+ @Test
+ fun testSimplePublicSpaceWithChildren() {
+ val aliceSession = commonTestHelper.createAccount("alice", SessionTestParams(true))
+ val bobSession = commonTestHelper.createAccount("bob", SessionTestParams(true))
+
+ val roomName = "My Space"
+ val topic = "A public space for test"
+
+ val spaceId: String = runBlocking { aliceSession.spaceService().createSpace(roomName, topic, null, true) }
+ val syncedSpace = aliceSession.spaceService().getSpace(spaceId)
+
+ // create a room
+ var firstChild: String? = null
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ firstChild = aliceSession.createRoom(CreateRoomParams().apply {
+ this.name = "FirstRoom"
+ this.topic = "Description of first room"
+ this.preset = CreateRoomPreset.PRESET_PUBLIC_CHAT
+ })
+ it.countDown()
+ }
+ }
+
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ syncedSpace?.addChildren(firstChild!!, listOf(aliceSession.sessionParams.homeServerHost ?: ""), "a", true, suggested = true)
+ it.countDown()
+ }
+ }
+
+ var secondChild: String? = null
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ secondChild = aliceSession.createRoom(CreateRoomParams().apply {
+ this.name = "SecondRoom"
+ this.topic = "Description of second room"
+ this.preset = CreateRoomPreset.PRESET_PUBLIC_CHAT
+ })
+ it.countDown()
+ }
+ }
+
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ syncedSpace?.addChildren(secondChild!!, listOf(aliceSession.sessionParams.homeServerHost ?: ""), "b", false, suggested = true)
+ it.countDown()
+ }
+ }
+
+ // Try to join from bob, it's a public space no need to invite
+ var joinResult: JoinSpaceResult? = null
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ joinResult = bobSession.spaceService().joinSpace(spaceId)
+ // wait a bit to let the summary update it self :/
+ it.countDown()
+ }
+ }
+
+ assertEquals(JoinSpaceResult.Success, joinResult)
+
+ val spaceBobPov = bobSession.spaceService().getSpace(spaceId)
+ assertEquals("Room name should be set", roomName, spaceBobPov?.asRoom()?.roomSummary()?.name)
+ assertEquals("Room topic should be set", topic, spaceBobPov?.asRoom()?.roomSummary()?.topic)
+
+ // check if bob has joined automatically the first room
+
+ val bobMembershipFirstRoom = bobSession.getRoomSummary(firstChild!!)?.membership
+ assertEquals("Bob should have joined this room", Membership.JOIN, bobMembershipFirstRoom)
+ RoomSummaryQueryParams.Builder()
+
+ val childCount = bobSession.getRoomSummaries(
+ roomSummaryQueryParams {
+ activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(spaceId)
+ }
+ ).size
+
+ assertEquals("Unexpected number of joined children", 1, childCount)
+
+ commonTestHelper.signOutAndClose(aliceSession)
+ commonTestHelper.signOutAndClose(bobSession)
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceHierarchyTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceHierarchyTest.kt
new file mode 100644
index 0000000000..521b5805bd
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/space/SpaceHierarchyTest.kt
@@ -0,0 +1,472 @@
+/*
+ * Copyright 2021 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.session.space
+
+import android.util.Log
+import androidx.lifecycle.Observer
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertNotNull
+import org.junit.Assert.assertTrue
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.runners.MethodSorters
+import org.matrix.android.sdk.InstrumentedTest
+import org.matrix.android.sdk.api.query.ActiveSpaceFilter
+import org.matrix.android.sdk.api.session.Session
+import org.matrix.android.sdk.api.session.room.model.RoomSummary
+import org.matrix.android.sdk.api.session.room.model.RoomType
+import org.matrix.android.sdk.api.session.room.model.create.CreateRoomParams
+import org.matrix.android.sdk.api.session.room.roomSummaryQueryParams
+import org.matrix.android.sdk.common.CommonTestHelper
+import org.matrix.android.sdk.common.SessionTestParams
+
+@RunWith(JUnit4::class)
+@FixMethodOrder(MethodSorters.JVM)
+class SpaceHierarchyTest : InstrumentedTest {
+
+ private val commonTestHelper = CommonTestHelper(context())
+
+ @Test
+ fun createCanonicalChildRelation() {
+ val session = commonTestHelper.createAccount("John", SessionTestParams(true))
+ val spaceName = "My Space"
+ val topic = "A public space for test"
+ var spaceId: String = ""
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ spaceId = session.spaceService().createSpace(spaceName, topic, null, true)
+ it.countDown()
+ }
+ }
+
+ val syncedSpace = session.spaceService().getSpace(spaceId)
+
+ var roomId: String = ""
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ roomId = session.createRoom(CreateRoomParams().apply { name = "General" })
+ it.countDown()
+ }
+ }
+
+ val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
+
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ syncedSpace!!.addChildren(roomId, viaServers, null, true)
+ it.countDown()
+ }
+ }
+
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ session.spaceService().setSpaceParent(roomId, spaceId, true, viaServers)
+ it.countDown()
+ }
+ }
+
+ Thread.sleep(9000)
+
+ val parents = session.getRoom(roomId)?.roomSummary()?.spaceParents
+ val canonicalParents = session.getRoom(roomId)?.roomSummary()?.spaceParents?.filter { it.canonical == true }
+
+ parents?.forEach {
+ Log.d("## TEST", "parent : $it")
+ }
+
+ assertNotNull(parents)
+ assertEquals(1, parents!!.size)
+ assertEquals(spaceName, parents.first().roomSummary?.name)
+
+ assertNotNull(canonicalParents)
+ assertEquals(1, canonicalParents!!.size)
+ assertEquals(spaceName, canonicalParents.first().roomSummary?.name)
+ }
+
+// @Test
+// fun testCreateChildRelations() {
+// val session = commonTestHelper.createAccount("Jhon", SessionTestParams(true))
+// val spaceName = "My Space"
+// val topic = "A public space for test"
+// Log.d("## TEST", "Before")
+//
+// var spaceId = ""
+// commonTestHelper.waitWithLatch {
+// GlobalScope.launch {
+// spaceId = session.spaceService().createSpace(spaceName, topic, null, true)
+// it.countDown()
+// }
+// }
+//
+// Log.d("## TEST", "created space $spaceId ${Thread.currentThread()}")
+// val syncedSpace = session.spaceService().getSpace(spaceId)
+//
+// val children = listOf("General" to true /*canonical*/, "Random" to false)
+//
+// // val roomIdList = children.map {
+// // runBlocking {
+// // session.createRoom(CreateRoomParams().apply { name = it.first })
+// // } to it.second
+// // }
+// val roomIdList = mutableListOf>()
+// commonTestHelper.waitWithLatch {
+// GlobalScope.launch {
+// children.forEach {
+// val rID = session.createRoom(CreateRoomParams().apply { name = it.first })
+// roomIdList.add(rID to it.second)
+// }
+// it.countDown()
+// }
+// }
+//
+// val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
+//
+// commonTestHelper.waitWithLatch {
+// GlobalScope.launch {
+// roomIdList.forEach { entry ->
+// syncedSpace!!.addChildren(entry.first, viaServers, null, true)
+// }
+// it.countDown()
+// }
+// }
+//
+// commonTestHelper.waitWithLatch {
+// GlobalScope.launch {
+// roomIdList.forEach {
+// session.spaceService().setSpaceParent(it.first, spaceId, it.second, viaServers)
+// }
+// it.countDown()
+// }
+// }
+//
+// roomIdList.forEach {
+// val parents = session.getRoom(it.first)?.roomSummary()?.spaceParents
+// val canonicalParents = session.getRoom(it.first)?.roomSummary()?.spaceParents?.filter { it.canonical == true }
+//
+// assertNotNull(parents)
+// assertEquals("Unexpected number of parent", 1, parents!!.size)
+// assertEquals("Unexpected parent name", spaceName, parents.first().roomSummary?.name)
+// assertEquals("Parent of ${it.first} should be canonical ${it.second}", if (it.second) 1 else 0, canonicalParents?.size ?: 0)
+// }
+// }
+
+ @Test
+ fun testFilteringBySpace() {
+ val session = commonTestHelper.createAccount("John", SessionTestParams(true))
+
+ val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
+ Triple("A1", true /*auto-join*/, true/*canonical*/),
+ Triple("A2", true, true)
+ ))
+
+ val spaceBInfo = createPublicSpace(session, "SpaceB", listOf(
+ Triple("B1", true /*auto-join*/, true/*canonical*/),
+ Triple("B2", true, true),
+ Triple("B3", true, true)
+ ))
+
+ val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
+ Triple("C1", true /*auto-join*/, true/*canonical*/),
+ Triple("C2", true, true)
+ ))
+
+ // add C as a subspace of A
+ val spaceA = session.spaceService().getSpace(spaceAInfo.spaceId)
+ val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ spaceA!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
+ session.spaceService().setSpaceParent(spaceCInfo.spaceId, spaceAInfo.spaceId, true, viaServers)
+ it.countDown()
+ }
+ }
+
+ // Create orphan rooms
+
+ var orphan1 = ""
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ orphan1 = session.createRoom(CreateRoomParams().apply { name = "O1" })
+ it.countDown()
+ }
+ }
+
+ var orphan2 = ""
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ orphan2 = session.createRoom(CreateRoomParams().apply { name = "O2" })
+ it.countDown()
+ }
+ }
+
+ val allRooms = session.getRoomSummaries(roomSummaryQueryParams { excludeType = listOf(RoomType.SPACE) })
+
+ assertEquals("Unexpected number of rooms", 9, allRooms.size)
+
+ val orphans = session.getFlattenRoomSummaryChildrenOf(null)
+
+ assertEquals("Unexpected number of orphan rooms", 2, orphans.size)
+ assertTrue("O1 should be an orphan", orphans.any { it.roomId == orphan1 })
+ assertTrue("O2 should be an orphan ${orphans.map { it.name }}", orphans.any { it.roomId == orphan2 })
+
+ val aChildren = session.getFlattenRoomSummaryChildrenOf(spaceAInfo.spaceId)
+
+ assertEquals("Unexpected number of flatten child rooms", 4, aChildren.size)
+ assertTrue("A1 should be a child of A", aChildren.any { it.name == "A1" })
+ assertTrue("A2 should be a child of A", aChildren.any { it.name == "A2" })
+ assertTrue("CA should be a grand child of A", aChildren.any { it.name == "C1" })
+ assertTrue("A1 should be a grand child of A", aChildren.any { it.name == "C2" })
+
+ // Add a non canonical child and check that it does not appear as orphan
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ val a3 = session.createRoom(CreateRoomParams().apply { name = "A3" })
+ spaceA!!.addChildren(a3, viaServers, null, false)
+ it.countDown()
+ }
+ }
+
+ Thread.sleep(2_000)
+ val orphansUpdate = session.getRoomSummaries(roomSummaryQueryParams {
+ activeSpaceFilter = ActiveSpaceFilter.ActiveSpace(null)
+ })
+ assertEquals("Unexpected number of orphan rooms ${orphansUpdate.map { it.name }}", 2, orphansUpdate.size)
+ }
+
+ @Test
+ fun testBreakCycle() {
+ val session = commonTestHelper.createAccount("John", SessionTestParams(true))
+
+ val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
+ Triple("A1", true /*auto-join*/, true/*canonical*/),
+ Triple("A2", true, true)
+ ))
+
+ val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
+ Triple("C1", true /*auto-join*/, true/*canonical*/),
+ Triple("C2", true, true)
+ ))
+
+ // add C as a subspace of A
+ val spaceA = session.spaceService().getSpace(spaceAInfo.spaceId)
+ val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ spaceA!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
+ session.spaceService().setSpaceParent(spaceCInfo.spaceId, spaceAInfo.spaceId, true, viaServers)
+ it.countDown()
+ }
+ }
+
+ // add back A as subspace of C
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ val spaceC = session.spaceService().getSpace(spaceCInfo.spaceId)
+ spaceC!!.addChildren(spaceAInfo.spaceId, viaServers, null, true)
+ it.countDown()
+ }
+ }
+
+ Thread.sleep(1000)
+
+ // A -> C -> A
+
+ val aChildren = session.getFlattenRoomSummaryChildrenOf(spaceAInfo.spaceId)
+
+ assertEquals("Unexpected number of flatten child rooms ${aChildren.map { it.name }}", 4, aChildren.size)
+ assertTrue("A1 should be a child of A", aChildren.any { it.name == "A1" })
+ assertTrue("A2 should be a child of A", aChildren.any { it.name == "A2" })
+ assertTrue("CA should be a grand child of A", aChildren.any { it.name == "C1" })
+ assertTrue("A1 should be a grand child of A", aChildren.any { it.name == "C2" })
+ }
+
+ @Test
+ fun testLiveFlatChildren() {
+ val session = commonTestHelper.createAccount("John", SessionTestParams(true))
+
+ val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
+ Triple("A1", true /*auto-join*/, true/*canonical*/),
+ Triple("A2", true, true)
+ ))
+
+ val spaceBInfo = createPublicSpace(session, "SpaceB", listOf(
+ Triple("B1", true /*auto-join*/, true/*canonical*/),
+ Triple("B2", true, true),
+ Triple("B3", true, true)
+ ))
+
+ // add B as a subspace of A
+ val spaceA = session.spaceService().getSpace(spaceAInfo.spaceId)
+ val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
+ runBlocking {
+ spaceA!!.addChildren(spaceBInfo.spaceId, viaServers, null, true)
+ session.spaceService().setSpaceParent(spaceBInfo.spaceId, spaceAInfo.spaceId, true, viaServers)
+ }
+
+ val flatAChildren = runBlocking(Dispatchers.Main) {
+ session.getFlattenRoomSummaryChildrenOfLive(spaceAInfo.spaceId)
+ }
+
+ commonTestHelper.waitWithLatch { latch ->
+
+ val childObserver = object : Observer> {
+ override fun onChanged(children: List?) {
+// Log.d("## TEST", "Space A flat children update : ${children?.map { it.name }}")
+ System.out.println("## TEST | Space A flat children update : ${children?.map { it.name }}")
+ if (children?.any { it.name == "C1" } == true && children.any { it.name == "C2" }) {
+ // B1 has been added live!
+ latch.countDown()
+ flatAChildren.removeObserver(this)
+ }
+ }
+ }
+
+ val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
+ Triple("C1", true /*auto-join*/, true/*canonical*/),
+ Triple("C2", true, true)
+ ))
+
+ // add C as subspace of B
+ runBlocking {
+ val spaceB = session.spaceService().getSpace(spaceBInfo.spaceId)
+ spaceB!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
+ }
+
+ // C1 and C2 should be in flatten child of A now
+
+ GlobalScope.launch(Dispatchers.Main) { flatAChildren.observeForever(childObserver) }
+ }
+
+ // Test part one of the rooms
+
+ val bRoomId = spaceBInfo.roomIds.first()
+ val bRoom = session.getRoom(bRoomId)
+
+ commonTestHelper.waitWithLatch { latch ->
+
+ val childObserver = object : Observer> {
+ override fun onChanged(children: List?) {
+ System.out.println("## TEST | Space A flat children update : ${children?.map { it.name }}")
+ if (children?.any { it.roomId == bRoomId } == false) {
+ // B1 has been added live!
+ latch.countDown()
+ flatAChildren.removeObserver(this)
+ }
+ }
+ }
+
+ // part from b room
+ runBlocking {
+ bRoom!!.leave(null)
+ }
+ // The room should have disapear from flat children
+ GlobalScope.launch(Dispatchers.Main) { flatAChildren.observeForever(childObserver) }
+ }
+ }
+
+ data class TestSpaceCreationResult(
+ val spaceId: String,
+ val roomIds: List
+ )
+
+ private fun createPublicSpace(session: Session,
+ spaceName: String,
+ childInfo: List>
+ /** Name, auto-join, canonical*/
+ ): TestSpaceCreationResult {
+ var spaceId = ""
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ spaceId = session.spaceService().createSpace(spaceName, "Test Topic", null, true)
+ it.countDown()
+ }
+ }
+
+ val syncedSpace = session.spaceService().getSpace(spaceId)
+ val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
+
+ val roomIds =
+ childInfo.map { entry ->
+ var roomId = ""
+ commonTestHelper.waitWithLatch {
+ GlobalScope.launch {
+ roomId = session.createRoom(CreateRoomParams().apply { name = entry.first })
+ it.countDown()
+ }
+ }
+ roomId
+ }
+
+ roomIds.forEachIndexed { index, roomId ->
+ runBlocking {
+ syncedSpace!!.addChildren(roomId, viaServers, null, childInfo[index].second)
+ val canonical = childInfo[index].third
+ if (canonical != null) {
+ session.spaceService().setSpaceParent(roomId, spaceId, canonical, viaServers)
+ }
+ }
+ }
+ return TestSpaceCreationResult(spaceId, roomIds)
+ }
+
+ @Test
+ fun testRootSpaces() {
+ val session = commonTestHelper.createAccount("John", SessionTestParams(true))
+
+ val spaceAInfo = createPublicSpace(session, "SpaceA", listOf(
+ Triple("A1", true /*auto-join*/, true/*canonical*/),
+ Triple("A2", true, true)
+ ))
+
+ val spaceBInfo = createPublicSpace(session, "SpaceB", listOf(
+ Triple("B1", true /*auto-join*/, true/*canonical*/),
+ Triple("B2", true, true),
+ Triple("B3", true, true)
+ ))
+
+ val spaceCInfo = createPublicSpace(session, "SpaceC", listOf(
+ Triple("C1", true /*auto-join*/, true/*canonical*/),
+ Triple("C2", true, true)
+ ))
+
+ val viaServers = listOf(session.sessionParams.homeServerHost ?: "")
+
+ // add C as subspace of B
+ runBlocking {
+ val spaceB = session.spaceService().getSpace(spaceBInfo.spaceId)
+ spaceB!!.addChildren(spaceCInfo.spaceId, viaServers, null, true)
+ }
+
+ Thread.sleep(2000)
+ // + A
+ // a1, a2
+ // + B
+ // b1, b2, b3
+ // + C
+ // + c1, c2
+
+ val rootSpaces = session.spaceService().getRootSpaceSummaries()
+
+ assertEquals("Unexpected number of root spaces ${rootSpaces.map { it.name }}", 2, rootSpaces.size)
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/Matrix.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/Matrix.kt
index a5d457222f..9980259266 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/Matrix.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/Matrix.kt
@@ -25,9 +25,12 @@ import org.matrix.android.sdk.BuildConfig
import org.matrix.android.sdk.api.auth.AuthenticationService
import org.matrix.android.sdk.api.auth.HomeServerHistoryService
import org.matrix.android.sdk.api.legacy.LegacySessionImporter
+import org.matrix.android.sdk.api.network.ApiInterceptorListener
+import org.matrix.android.sdk.api.network.ApiPath
import org.matrix.android.sdk.api.raw.RawService
import org.matrix.android.sdk.internal.SessionManager
import org.matrix.android.sdk.internal.di.DaggerMatrixComponent
+import org.matrix.android.sdk.internal.network.ApiInterceptor
import org.matrix.android.sdk.internal.network.UserAgentHolder
import org.matrix.android.sdk.internal.util.BackgroundDetectionObserver
import org.matrix.olm.OlmManager
@@ -49,6 +52,7 @@ class Matrix private constructor(context: Context, matrixConfiguration: MatrixCo
@Inject internal lateinit var olmManager: OlmManager
@Inject internal lateinit var sessionManager: SessionManager
@Inject internal lateinit var homeServerHistoryService: HomeServerHistoryService
+ @Inject internal lateinit var apiInterceptor: ApiInterceptor
init {
Monarchy.init(context)
@@ -73,6 +77,14 @@ class Matrix private constructor(context: Context, matrixConfiguration: MatrixCo
return legacySessionImporter
}
+ fun registerApiInterceptorListener(path: ApiPath, listener: ApiInterceptorListener) {
+ apiInterceptor.addListener(path, listener)
+ }
+
+ fun unregisterApiInterceptorListener(path: ApiPath, listener: ApiInterceptorListener) {
+ apiInterceptor.removeListener(path, listener)
+ }
+
companion object {
private lateinit var instance: Matrix
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt
index 725fd08d3b..ed809cdb04 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixConfiguration.kt
@@ -35,7 +35,15 @@ data class MatrixConfiguration(
* Optional proxy to connect to the matrix servers
* You can create one using for instance Proxy(proxyType, InetSocketAddress.createUnresolved(hostname, port)
*/
- val proxy: Proxy? = null
+ val proxy: Proxy? = null,
+ /**
+ * True to advertise support for call transfers to other parties on Matrix calls.
+ */
+ val supportsCallTransfer: Boolean = false,
+ /**
+ * RoomDisplayNameFallbackProvider to provide default room display name.
+ */
+ val roomDisplayNameFallbackProvider: RoomDisplayNameFallbackProvider
) {
/**
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt
index d8532c77c8..9a5e40ffeb 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt
@@ -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)
@@ -71,6 +75,9 @@ object MatrixPatterns {
private const val LINK_TO_APP_ROOM_ALIAS_REGEXP = APP_BASE_REGEX + MATRIX_ROOM_ALIAS_REGEX + SEP_REGEX + MATRIX_EVENT_IDENTIFIER_REGEX
private val PATTERN_CONTAIN_APP_LINK_PERMALINK_ROOM_ALIAS = LINK_TO_APP_ROOM_ALIAS_REGEXP.toRegex(RegexOption.IGNORE_CASE)
+ // ascii characters in the range \x20 (space) to \x7E (~)
+ val ORDER_STRING_REGEX = "[ -~]+".toRegex()
+
// list of patterns to find some matrix item.
val MATRIX_PATTERNS = listOf(
PATTERN_CONTAIN_MATRIX_TO_PERMALINK_ROOM_ID,
@@ -146,4 +153,32 @@ object MatrixPatterns {
fun extractServerNameFromId(matrixId: String?): String? {
return matrixId?.substringAfter(":", missingDelimiterValue = "")?.takeIf { it.isNotEmpty() }
}
+
+ /**
+ * 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 {
+ return order != null && order.length < 50 && order matches ORDER_STRING_REGEX
+ }
+
+ fun candidateAliasFromRoomName(name: String): String {
+ return Regex("\\s").replace(name.lowercase(), "_").let {
+ "[^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(":")
+ }
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt
new file mode 100644
index 0000000000..a34dbcc196
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt
@@ -0,0 +1,27 @@
+/*
+ * 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
+
+interface RoomDisplayNameFallbackProvider {
+ fun getNameForRoomInvite(): String
+ fun getNameForEmptyRoom(isDirect: Boolean, leftMemberNames: List): String
+ fun getNameFor1member(name: String): String
+ fun getNameFor2members(name1: String, name2: String): String
+ fun getNameFor3members(name1: String, name2: String, name3: String): String
+ fun getNameFor4members(name1: String, name2: String, name3: String, name4: String): String
+ fun getNameFor4membersAndMore(name1: String, name2: String, name3: String, remainingCount: Int): String
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
index bf21941e0c..5e35917243 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/AuthenticationService.kt
@@ -16,7 +16,6 @@
package org.matrix.android.sdk.api.auth
-import org.matrix.android.sdk.api.MatrixCallback
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.LoginFlowResult
@@ -24,7 +23,6 @@ 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.session.Session
-import org.matrix.android.sdk.api.util.Cancelable
/**
* This interface defines methods to authenticate or to create an account to a matrix server.
@@ -32,14 +30,14 @@ import org.matrix.android.sdk.api.util.Cancelable
interface AuthenticationService {
/**
* Request the supported login flows for this homeserver.
- * This is the first method to call to be able to get a wizard to login or the create an account
+ * This is the first method to call to be able to get a wizard to login or to create an account
*/
- fun getLoginFlow(homeServerConnectionConfig: HomeServerConnectionConfig, callback: MatrixCallback): Cancelable
+ suspend fun getLoginFlow(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult
/**
* Request the supported login flows for the corresponding sessionId.
*/
- fun getLoginFlowOfSession(sessionId: String, callback: MatrixCallback): Cancelable
+ suspend fun getLoginFlowOfSession(sessionId: String): LoginFlowResult
/**
* Get a SSO url
@@ -53,11 +51,15 @@ interface AuthenticationService {
/**
* Return a LoginWizard, to login to the homeserver. The login flow has to be retrieved first.
+ *
+ * See [LoginWizard] for more details
*/
fun getLoginWizard(): LoginWizard
/**
* Return a RegistrationWizard, to create an matrix account on the homeserver. The login flow has to be retrieved first.
+ *
+ * See [RegistrationWizard] for more details.
*/
fun getRegistrationWizard(): RegistrationWizard
@@ -69,12 +71,12 @@ interface AuthenticationService {
/**
* Cancel pending login or pending registration
*/
- fun cancelPendingLoginOrRegistration()
+ suspend fun cancelPendingLoginOrRegistration()
/**
* Reset all pending settings, including current HomeServerConnectionConfig
*/
- fun reset()
+ suspend fun reset()
/**
* Check if there is an authenticated [Session].
@@ -91,24 +93,21 @@ interface AuthenticationService {
/**
* Create a session after a SSO successful login
*/
- fun createSessionFromSso(homeServerConnectionConfig: HomeServerConnectionConfig,
- credentials: Credentials,
- callback: MatrixCallback): Cancelable
+ suspend fun createSessionFromSso(homeServerConnectionConfig: HomeServerConnectionConfig,
+ credentials: Credentials): Session
/**
* Perform a wellknown request, using the domain from the matrixId
*/
- fun getWellKnownData(matrixId: String,
- homeServerConnectionConfig: HomeServerConnectionConfig?,
- callback: MatrixCallback): Cancelable
+ suspend fun getWellKnownData(matrixId: String,
+ homeServerConnectionConfig: HomeServerConnectionConfig?): WellknownResult
/**
* Authenticate with a matrixId and a password
* Usually call this after a successful call to getWellKnownData()
*/
- fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
- matrixId: String,
- password: String,
- initialDeviceName: String,
- callback: MatrixCallback): Cancelable
+ suspend fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
+ matrixId: String,
+ password: String,
+ initialDeviceName: String): Session
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/TokenBasedAuth.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/TokenBasedAuth.kt
new file mode 100644
index 0000000000..e522352c38
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/TokenBasedAuth.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.matrix.android.sdk.api.auth
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
+
+/**
+ * This class provides the authentication data by using user and password
+ */
+@JsonClass(generateAdapter = true)
+data class TokenBasedAuth(
+
+ /**
+ * This is a 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")
+ override val session: String? = null,
+
+ /**
+ * A client may receive a login token via some external service, such as email or SMS.
+ * Note that a login token is separate from an access token, the latter providing general authentication to various API endpoints.
+ */
+ @Json(name = "token")
+ val token: String? = null,
+
+ /**
+ * The txn_id should be a random string generated by the client for the request.
+ * The same txn_id should be used if retrying the request.
+ * The txn_id may be used by the server to disallow other devices from using the token,
+ * thus providing "single use" tokens while still allowing the device to retry the request.
+ * This would be done by tying the token to the txn_id server side, as well as potentially invalidating
+ * the token completely once the device has successfully logged in
+ * (e.g. when we receive a request from the newly provisioned access_token).
+ */
+ @Json(name = "txn_id")
+ val transactionId: String? = null,
+
+ // registration information
+ @Json(name = "type")
+ val type: String? = LoginFlowTypes.TOKEN
+
+) : UIABaseAuth {
+ override fun hasAuthInfo() = token != null
+
+ override fun copyWithSession(session: String) = this.copy(session = session)
+
+ override fun asMap(): Map = mapOf(
+ "session" to session,
+ "token" to token,
+ "transactionId" to transactionId,
+ "type" to type
+ )
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UIABaseAuth.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UIABaseAuth.kt
new file mode 100644
index 0000000000..d5e323e457
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UIABaseAuth.kt
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.auth
+
+interface UIABaseAuth {
+ /**
+ * This is a 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.
+ */
+ val session: String?
+
+ fun hasAuthInfo(): Boolean
+
+ fun copyWithSession(session: String): UIABaseAuth
+
+ fun asMap() : Map
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UserInteractiveAuthInterceptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UserInteractiveAuthInterceptor.kt
new file mode 100644
index 0000000000..16a5c8073d
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UserInteractiveAuthInterceptor.kt
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.auth
+
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
+import kotlin.coroutines.Continuation
+
+/**
+ * Some API endpoints require authentication that interacts with the user.
+ * The homeserver may provide many different ways of authenticating, such as user/password auth, login via a social network (OAuth2),
+ * login by confirming a token sent to their email address, etc.
+ *
+ * The process takes the form of one or more 'stages'.
+ * At each stage the client submits a set of data for a given authentication type and awaits a response from the server,
+ * which will either be a final success or a request to perform an additional stage.
+ * This exchange continues until the final success.
+ *
+ * For each endpoint, a server offers one or more 'flows' that the client can use to authenticate itself.
+ * Each flow comprises a series of stages, as described above.
+ * The client is free to choose which flow it follows, however the flow's stages must be completed in order.
+ * Failing to follow the flows in order must result in an HTTP 401 response.
+ * When all stages in a flow are complete, authentication is complete and the API call succeeds.
+ */
+interface UserInteractiveAuthInterceptor {
+
+ /**
+ * When the API needs additional auth, this will be called.
+ * Implementation should check the flows from flow response and act accordingly.
+ * Updated auth should be provided using promise.resume, this allow implementation to perform
+ * an async operation (prompt for user password, open sso fallback) and then resume initial API call when done.
+ */
+ fun performStage(flowResponse: RegistrationFlowResponse, errCode: String?, promise: Continuation)
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UserPasswordAuth.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UserPasswordAuth.kt
new file mode 100644
index 0000000000..e985c5f08a
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/UserPasswordAuth.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.matrix.android.sdk.api.auth
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
+
+/**
+ * This class provides the authentication data by using user and password
+ */
+@JsonClass(generateAdapter = true)
+data class UserPasswordAuth(
+
+ // device device session id
+ @Json(name = "session")
+ override val session: String? = null,
+
+ // registration information
+ @Json(name = "type")
+ val type: String? = LoginFlowTypes.PASSWORD,
+
+ @Json(name = "user")
+ val user: String? = null,
+
+ @Json(name = "password")
+ val password: String? = null
+) : UIABaseAuth {
+
+ override fun hasAuthInfo() = password != null
+
+ override fun copyWithSession(session: String) = this.copy(session = session)
+
+ override fun asMap(): Map = mapOf(
+ "session" to session,
+ "user" to user,
+ "password" to password,
+ "type" to type
+ )
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt
index e1c5171bfc..215f0a0351 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt
@@ -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 = 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
)
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt
index f1f9ba3916..7d1407c0d8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/LoginFlowResult.kt
@@ -16,12 +16,10 @@
package org.matrix.android.sdk.api.auth.data
-sealed class LoginFlowResult {
- data class Success(
- val supportedLoginTypes: List,
- val ssoIdentityProviders: List?,
- val isLoginAndRegistrationSupported: Boolean,
- val homeServerUrl: String,
- val isOutdatedHomeserver: Boolean
- ) : LoginFlowResult()
-}
+data class LoginFlowResult(
+ val supportedLoginTypes: List,
+ val ssoIdentityProviders: List?,
+ val isLoginAndRegistrationSupported: Boolean,
+ val homeServerUrl: String,
+ val isOutdatedHomeserver: Boolean
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt
index b2a57c7f5c..b490ac877e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt
@@ -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
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt
index 6759c59237..a0733dda97 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SsoIdentityProvider.kt
@@ -38,15 +38,45 @@ data class SsoIdentityProvider(
* If present then it must be an HTTPS URL to an image resource.
* This should be hosted by the homeserver service provider to not leak the client's IP address unnecessarily.
*/
- @Json(name = "icon") val iconUrl: String?
-) : Parcelable {
+ @Json(name = "icon") val iconUrl: String?,
+
+ /**
+ * The `brand` field is **optional**. It allows the client to style the login
+ * button to suit a particular brand. It should be a string matching the
+ * "Common namespaced identifier grammar" as defined in
+ * [MSC2758](https://github.com/matrix-org/matrix-doc/pull/2758).
+ */
+ @Json(name = "brand") val brand: String?
+
+) : Parcelable, Comparable {
companion object {
- // Not really defined by the spec, but we may define some ids here
- const val ID_GOOGLE = "google"
- const val ID_GITHUB = "github"
- const val ID_APPLE = "apple"
- const val ID_FACEBOOK = "facebook"
- const val ID_TWITTER = "twitter"
+ const val BRAND_GOOGLE = "google"
+ const val BRAND_GITHUB = "github"
+ const val BRAND_APPLE = "apple"
+ const val BRAND_FACEBOOK = "facebook"
+ const val BRAND_TWITTER = "twitter"
+ const val BRAND_GITLAB = "gitlab"
+ }
+
+ override fun compareTo(other: SsoIdentityProvider): Int {
+ return other.toPriority().compareTo(toPriority())
+ }
+
+ private fun toPriority(): Int {
+ return when (brand) {
+ // We are on Android, so user is more likely to have a Google account
+ BRAND_GOOGLE -> 5
+ // Facebook is also an important SSO provider
+ BRAND_FACEBOOK -> 4
+ // Twitter is more for professionals
+ BRAND_TWITTER -> 3
+ // Here it's very for techie people
+ BRAND_GITHUB,
+ BRAND_GITLAB -> 2
+ // And finally, if the account has been created with an iPhone...
+ BRAND_APPLE -> 1
+ else -> 0
+ }
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginProfileInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginProfileInfo.kt
new file mode 100644
index 0000000000..288a6d1232
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginProfileInfo.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.auth.login
+
+data class LoginProfileInfo(
+ val matrixId: String,
+ val displayName: String?,
+ val fullAvatarUrl: String?
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt
index 48705ee7b7..a2a9373837 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt
@@ -16,39 +16,52 @@
package org.matrix.android.sdk.api.auth.login
-import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.session.Session
-import org.matrix.android.sdk.api.util.Cancelable
+/**
+ * Set of methods to be able to login to an existing account on a homeserver.
+ *
+ * More documentation can be found in the file https://github.com/vector-im/element-android/blob/main/docs/signin.md
+ */
interface LoginWizard {
+ /**
+ * Get some information about a matrixId: displayName and avatar url
+ */
+ suspend fun getProfileInfo(matrixId: String): LoginProfileInfo
/**
- * @param login the login field
- * @param password the password field
+ * Login to the homeserver.
+ *
+ * @param login the login field. Can be a user name, or a msisdn (email or phone number) associated to the account
+ * @param password the password of the account
* @param deviceName the initial device name
- * @param callback the matrix callback on which you'll receive the result of authentication.
- * @return a [Cancelable]
+ * @return a [Session] if the login is successful
*/
- fun login(login: String,
- password: String,
- deviceName: String,
- callback: MatrixCallback): Cancelable
+ suspend fun login(login: String,
+ password: String,
+ deviceName: String): Session
/**
- * Exchange a login token to an access token
+ * Exchange a login token to an access token.
+ *
+ * @param loginToken login token, obtain when login has happen in a WebView, using SSO
+ * @return a [Session] if the login is successful
*/
- fun loginWithToken(loginToken: String,
- callback: MatrixCallback): Cancelable
+ suspend fun loginWithToken(loginToken: String): Session
/**
- * Reset user password
+ * Ask the homeserver to reset the user password. The password will not be reset until
+ * [resetPasswordMailConfirmed] is successfully called.
+ *
+ * @param email an email previously associated to the account the user wants the password to be reset.
+ * @param newPassword the desired new password
*/
- fun resetPassword(email: String,
- newPassword: String,
- callback: MatrixCallback): Cancelable
+ suspend fun resetPassword(email: String,
+ newPassword: String)
/**
- * Confirm the new password, once the user has checked his email
+ * Confirm the new password, once the user has checked their email
+ * When this method succeed, tha account password will be effectively modified.
*/
- fun resetPasswordMailConfirmed(callback: MatrixCallback): Cancelable
+ suspend fun resetPasswordMailConfirmed()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationAvailability.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationAvailability.kt
new file mode 100644
index 0000000000..f9a7ace7ba
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationAvailability.kt
@@ -0,0 +1,24 @@
+/*
+ * 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.auth.registration
+
+import org.matrix.android.sdk.api.failure.Failure
+
+sealed class RegistrationAvailability {
+ object Available : RegistrationAvailability()
+ data class NotAvailable(val failure: Failure.ServerError) : RegistrationAvailability()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationFlowResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationFlowResponse.kt
new file mode 100644
index 0000000000..ac740ddab7
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationFlowResponse.kt
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.auth.registration
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
+import org.matrix.android.sdk.api.util.JsonDict
+import org.matrix.android.sdk.internal.auth.data.InteractiveAuthenticationFlow
+
+@JsonClass(generateAdapter = true)
+data class RegistrationFlowResponse(
+
+ /**
+ * The list of flows.
+ */
+ @Json(name = "flows")
+ val flows: List? = null,
+
+ /**
+ * The list of stages the client has completed successfully.
+ */
+ @Json(name = "completed")
+ val completedStages: List? = null,
+
+ /**
+ * 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")
+ val session: String? = null,
+
+ /**
+ * The information that the client will need to know in order to use a given type of authentication.
+ * For each login stage type presented, that type may be present as a key in this dictionary.
+ * For example, the public key of reCAPTCHA stage could be given here.
+ * other example
+ * "params": {
+ * "m.login.sso": {
+ * "identity_providers": [
+ * {
+ * "id": "google",
+ * "name": "Google",
+ * "icon": "https://..."
+ * }
+ * ]
+ * }
+ * }
+ */
+ @Json(name = "params")
+ val params: JsonDict? = null
+
+ /**
+ * WARNING,
+ * The two MatrixError fields "errcode" and "error" can also be present here in case of error when validating a stage,
+ * But in this case Moshi will be able to parse the result as a MatrixError, see [RetrofitExtensions.toFailure]
+ * Ex: when polling for "m.login.msisdn" validation
+ */
+)
+
+/**
+ * Convert to something easier to handle on client side
+ */
+fun RegistrationFlowResponse.toFlowResult(): FlowResult {
+ // Get all the returned stages
+ val allFlowTypes = mutableSetOf()
+
+ val missingStage = mutableListOf()
+ val completedStage = mutableListOf()
+
+ this.flows?.forEach { it.stages?.mapTo(allFlowTypes) { type -> type } }
+
+ allFlowTypes.forEach { type ->
+ val isMandatory = flows?.all { type in it.stages.orEmpty() } == true
+
+ val stage = when (type) {
+ LoginFlowTypes.RECAPTCHA -> Stage.ReCaptcha(isMandatory, ((params?.get(type) as? Map<*, *>)?.get("public_key") as? String)
+ ?: "")
+ LoginFlowTypes.DUMMY -> Stage.Dummy(isMandatory)
+ LoginFlowTypes.TERMS -> Stage.Terms(isMandatory, params?.get(type) as? TermPolicies ?: emptyMap())
+ LoginFlowTypes.EMAIL_IDENTITY -> Stage.Email(isMandatory)
+ LoginFlowTypes.MSISDN -> Stage.Msisdn(isMandatory)
+ else -> Stage.Other(isMandatory, type, (params?.get(type) as? Map<*, *>))
+ }
+
+ if (type in completedStages.orEmpty()) {
+ completedStage.add(stage)
+ } else {
+ missingStage.add(stage)
+ }
+ }
+
+ return FlowResult(missingStage, completedStage)
+}
+
+fun RegistrationFlowResponse.nextUncompletedStage(flowIndex: Int = 0): String? {
+ val completed = completedStages ?: emptyList()
+ return flows?.getOrNull(flowIndex)?.stages?.firstOrNull { completed.contains(it).not() }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
index ed7b249f1e..621253faa5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/registration/RegistrationWizard.kt
@@ -16,31 +16,98 @@
package org.matrix.android.sdk.api.auth.registration
-import org.matrix.android.sdk.api.MatrixCallback
-import org.matrix.android.sdk.api.util.Cancelable
-
+/**
+ * Set of methods to be able to create an account on a homeserver.
+ *
+ * Common scenario to register an account successfully:
+ * - Call [getRegistrationFlow] to check that you application supports all the mandatory registration stages
+ * - Call [createAccount] to start the account creation
+ * - Fulfill all mandatory stages using the methods [performReCaptcha] [acceptTerms] [dummy], etc.
+ *
+ * More documentation can be found in the file https://github.com/vector-im/element-android/blob/main/docs/signup.md
+ * and https://matrix.org/docs/spec/client_server/latest#account-registration-and-management
+ */
interface RegistrationWizard {
+ /**
+ * Call this method to get the possible registration flow of the current homeserver.
+ * It can be useful to ensure that your application implementation supports all the stages
+ * required to create an account. If it is not the case, you will have to use the web fallback
+ * to let the user create an account with your application.
+ * See [org.matrix.android.sdk.api.auth.AuthenticationService.getFallbackUrl]
+ */
+ suspend fun getRegistrationFlow(): RegistrationResult
- fun getRegistrationFlow(callback: MatrixCallback): Cancelable
+ /**
+ * Can be call to check is the desired userName is available for registration on the current homeserver.
+ * It may also fails if the desired userName is not correctly formatted or does not follow any restriction on
+ * the homeserver. Ex: userName with only digits may be rejected.
+ * @param userName the desired username. Ex: "alice"
+ */
+ suspend fun registrationAvailable(userName: String): RegistrationAvailability
- fun createAccount(userName: String, password: String, initialDeviceDisplayName: String?, callback: MatrixCallback): Cancelable
+ /**
+ * This is the first method to call in order to create an account and start the registration process.
+ *
+ * @param userName the desired username. Ex: "alice"
+ * @param password the desired password
+ * @param initialDeviceDisplayName the device display name
+ */
+ suspend fun createAccount(userName: String?,
+ password: String?,
+ initialDeviceDisplayName: String?): RegistrationResult
- fun performReCaptcha(response: String, callback: MatrixCallback): Cancelable
+ /**
+ * Perform the "m.login.recaptcha" stage.
+ *
+ * @param response the response from ReCaptcha
+ */
+ suspend fun performReCaptcha(response: String): RegistrationResult
- fun acceptTerms(callback: MatrixCallback): Cancelable
+ /**
+ * Perform the "m.login.terms" stage.
+ */
+ suspend fun acceptTerms(): RegistrationResult
- fun dummy(callback: MatrixCallback): Cancelable
+ /**
+ * Perform the "m.login.dummy" stage.
+ */
+ suspend fun dummy(): RegistrationResult
- fun addThreePid(threePid: RegisterThreePid, callback: MatrixCallback): Cancelable
+ /**
+ * Perform the "m.login.email.identity" or "m.login.msisdn" stage.
+ *
+ * @param threePid the threePid to add to the account. If this is an email, the homeserver will send an email
+ * to validate it. For a msisdn a SMS will be sent.
+ */
+ suspend fun addThreePid(threePid: RegisterThreePid): RegistrationResult
- fun sendAgainThreePid(callback: MatrixCallback): Cancelable
+ /**
+ * Ask the homeserver to send again the current threePid (email or msisdn).
+ */
+ suspend fun sendAgainThreePid(): RegistrationResult
- fun handleValidateThreePid(code: String, callback: MatrixCallback): Cancelable
+ /**
+ * Send the code received by SMS to validate a msisdn.
+ * If the code is correct, the registration request will be executed to validate the msisdn.
+ */
+ suspend fun handleValidateThreePid(code: String): RegistrationResult
- fun checkIfEmailHasBeenValidated(delayMillis: Long, callback: MatrixCallback): Cancelable
+ /**
+ * Useful to poll the homeserver when waiting for the email to be validated by the user.
+ * Once the email is validated, this method will return successfully.
+ * @param delayMillis the SDK can wait before sending the request
+ */
+ suspend fun checkIfEmailHasBeenValidated(delayMillis: Long): RegistrationResult
+ /**
+ * This is the current ThreePid, waiting for validation. The SDK will store it in database, so it can be
+ * restored even if the app has been killed during the registration
+ */
val currentThreePid: String?
- // True when login and password has been sent with success to the homeserver
+ /**
+ * True when login and password have been sent with success to the homeserver, i.e. [createAccount] has been
+ * called successfully.
+ */
val isRegistrationStarted: Boolean
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt
index c68a9e9699..56257db79c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt
@@ -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.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/VerificationState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/VerificationState.kt
new file mode 100644
index 0000000000..54276a6b51
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/crypto/VerificationState.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.crypto
+
+enum class VerificationState {
+ REQUEST,
+ WAITING,
+ CANCELED_BY_ME,
+ CANCELED_BY_OTHER,
+ DONE
+}
+
+fun VerificationState.isCanceled(): Boolean {
+ return this == VerificationState.CANCELED_BY_ME || this == VerificationState.CANCELED_BY_OTHER
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
index 4711f7957d..0ba61e5890 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Extensions.kt
@@ -16,8 +16,8 @@
package org.matrix.android.sdk.api.failure
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.api.extensions.tryOrNull
-import org.matrix.android.sdk.internal.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.internal.di.MoshiProvider
import java.io.IOException
import javax.net.ssl.HttpsURLConnection
@@ -37,23 +37,64 @@ fun Throwable.shouldBeRetried(): Boolean {
|| (this is Failure.ServerError && error.code == MatrixError.M_LIMIT_EXCEEDED)
}
+/**
+ * Get the retry delay in case of rate limit exceeded error, adding 100 ms, of defaultValue otherwise
+ */
+fun Throwable.getRetryDelay(defaultValue: Long): Long {
+ return (this as? Failure.ServerError)
+ ?.error
+ ?.takeIf { it.code == MatrixError.M_LIMIT_EXCEEDED }
+ ?.retryAfterMillis
+ ?.plus(100L)
+ ?: defaultValue
+}
+
fun Throwable.isInvalidPassword(): Boolean {
return this is Failure.ServerError
&& error.code == MatrixError.M_FORBIDDEN
&& error.message == "Invalid password"
}
+fun Throwable.isInvalidUIAAuth(): Boolean {
+ return this is Failure.ServerError
+ && error.code == MatrixError.M_FORBIDDEN
+ && error.flows != null
+}
+
/**
* Try to convert to a RegistrationFlowResponse. Return null in the cases it's not possible
*/
fun Throwable.toRegistrationFlowResponse(): RegistrationFlowResponse? {
- return if (this is Failure.OtherServerError && this.httpCode == 401) {
+ return if (this is Failure.OtherServerError
+ && httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED /* 401 */) {
tryOrNull {
MoshiProvider.providesMoshi()
.adapter(RegistrationFlowResponse::class.java)
- .fromJson(this.errorBody)
+ .fromJson(errorBody)
+ }
+ } else if (this is Failure.ServerError
+ && httpCode == HttpsURLConnection.HTTP_UNAUTHORIZED /* 401 */
+ && error.code == MatrixError.M_FORBIDDEN) {
+ // This happens when the submission for this stage was bad (like bad password)
+ if (error.session != null && error.flows != null) {
+ RegistrationFlowResponse(
+ flows = error.flows,
+ session = error.session,
+ completedStages = error.completedStages,
+ params = error.params
+ )
+ } else {
+ null
}
} else {
null
}
}
+
+fun Throwable.isRegistrationAvailabilityError(): Boolean {
+ return this is Failure.ServerError
+ && httpCode == HttpsURLConnection.HTTP_BAD_REQUEST /* 400 */
+ && (error.code == MatrixError.M_USER_IN_USE
+ || error.code == MatrixError.M_INVALID_USERNAME
+ || error.code == MatrixError.M_EXCLUSIVE)
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Failure.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Failure.kt
index de881b9e02..8f1bbb6941 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Failure.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/Failure.kt
@@ -16,8 +16,8 @@
package org.matrix.android.sdk.api.failure
+import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
-import org.matrix.android.sdk.internal.auth.registration.RegistrationFlowResponse
import org.matrix.android.sdk.internal.network.ssl.Fingerprint
import java.io.IOException
@@ -32,7 +32,6 @@ import java.io.IOException
*/
sealed class Failure(cause: Throwable? = null) : Throwable(cause = cause) {
data class Unknown(val throwable: Throwable? = null) : Failure(throwable)
- data class Cancelled(val throwable: Throwable? = null) : Failure(throwable)
data class UnrecognizedCertificateFailure(val url: String, val fingerprint: Fingerprint) : Failure()
data class NetworkConnection(val ioException: IOException? = null) : Failure(ioException)
data class ServerError(val error: MatrixError, val httpCode: Int) : Failure(RuntimeException(error.toString()))
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt
index 895be0031a..73b0fe0a7c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixError.kt
@@ -18,6 +18,8 @@ package org.matrix.android.sdk.api.failure
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.util.JsonDict
+import org.matrix.android.sdk.internal.auth.data.InteractiveAuthenticationFlow
/**
* This data class holds the error defined by the matrix specifications.
@@ -39,10 +41,20 @@ data class MatrixError(
// For M_LIMIT_EXCEEDED
@Json(name = "retry_after_ms") val retryAfterMillis: Long? = null,
// For M_UNKNOWN_TOKEN
- @Json(name = "soft_logout") val isSoftLogout: Boolean = false,
+ @Json(name = "soft_logout") val isSoftLogout: Boolean? = null,
// For M_INVALID_PEPPER
// {"error": "pepper does not match 'erZvr'", "lookup_pepper": "pQgMS", "algorithm": "sha256", "errcode": "M_INVALID_PEPPER"}
- @Json(name = "lookup_pepper") val newLookupPepper: String? = null
+ @Json(name = "lookup_pepper") val newLookupPepper: String? = null,
+
+ // For M_FORBIDDEN UIA
+ @Json(name = "session")
+ val session: String? = null,
+ @Json(name = "completed")
+ val completedStages: List? = null,
+ @Json(name = "flows")
+ val flows: List? = null,
+ @Json(name = "params")
+ val params: JsonDict? = null
) {
companion object {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixIdFailure.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixIdFailure.kt
new file mode 100644
index 0000000000..8f7bca803d
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixIdFailure.kt
@@ -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()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationService.kt
new file mode 100644
index 0000000000..0761ef8d21
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationService.kt
@@ -0,0 +1,24 @@
+/*
+ * 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.federation
+
+interface FederationService {
+ /**
+ * Get information about the homeserver
+ */
+ suspend fun getFederationVersion(): FederationVersion
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationVersion.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationVersion.kt
new file mode 100644
index 0000000000..2ed3f848b6
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/federation/FederationVersion.kt
@@ -0,0 +1,31 @@
+/*
+ * 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.federation
+
+/**
+ * Ref: https://matrix.org/docs/spec/server_server/latest#get-matrix-federation-v1-version
+ */
+data class FederationVersion(
+ /**
+ * Arbitrary name that identify this implementation.
+ */
+ val name: String?,
+ /**
+ * Version of this implementation. The version format depends on the implementation.
+ */
+ val version: String?
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/logger/LoggerTag.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/logger/LoggerTag.kt
new file mode 100644
index 0000000000..51f9b50699
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/logger/LoggerTag.kt
@@ -0,0 +1,34 @@
+/*
+ * 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.logger
+
+/**
+ * Parent class for custom logger tags. Can be used with Timber :
+ *
+ * val loggerTag = LoggerTag("MyTag", LoggerTag.VOIP)
+ * Timber.tag(loggerTag.value).v("My log message")
+ */
+open class LoggerTag(_value: String, parentTag: LoggerTag? = null) {
+
+ object VOIP : LoggerTag("VOIP")
+
+ val value: String = if (parentTag == null) {
+ _value
+ } else {
+ "${parentTag.value}/$_value"
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/network/ApiInterceptorListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/network/ApiInterceptorListener.kt
new file mode 100644
index 0000000000..ad21da8fdf
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/network/ApiInterceptorListener.kt
@@ -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.network
+
+interface ApiInterceptorListener {
+ fun onApiResponse(path: ApiPath, response: String)
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/network/ApiPath.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/network/ApiPath.kt
new file mode 100644
index 0000000000..db112a30b2
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/network/ApiPath.kt
@@ -0,0 +1,183 @@
+/*
+ * 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.network
+
+import org.matrix.android.sdk.internal.network.NetworkConstants
+
+enum class ApiPath(val path: String, val method: String) {
+ // AuthApi
+ VERSIONS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "versions", "GET"),
+ REGISTER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "register", "POST"),
+ ADD_3PID(NetworkConstants.URI_API_PREFIX_PATH_R0 + "register/{threePid}/requestToken", "POST"),
+ LOGIN_FLOWS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "login", "GET"),
+ LOGIN(NetworkConstants.URI_API_PREFIX_PATH_R0 + "login", "POST"),
+ RESET_PASSWORD(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/password/email/requestToken", "POST"),
+ RESET_PASSWORD_MAIL_CONFIRMED(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/password", "POST"),
+
+ // DirectoryApi
+ ROOM_ID_BY_ALIAS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}", "GET"),
+ ROOM_DIRECTORY_VISIBILITY(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/list/room/{roomId}", "GET"),
+ SET_ROOM_DIRECTORY_VISIBILITY(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/list/room/{roomId}", "PUT"),
+ ADD_ROOM_ALIAS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}", "PUT"),
+ DELETE_ROOM_ALIAS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "directory/room/{roomAlias}", "DELETE"),
+
+ // CryptoApi
+ GET_DEVICES(NetworkConstants.URI_API_PREFIX_PATH_R0 + "devices", "GET"),
+ GET_DEVICE_INFO(NetworkConstants.URI_API_PREFIX_PATH_R0 + "devices/{deviceId}", "GET"),
+ UPLOAD_KEYS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "keys/upload", "POST"),
+ DOWNLOAD_KEYS_FOR_USERS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "keys/query", "POST"),
+ UPLOAD_SIGNING_KEYS(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "keys/device_signing/upload", "POST"),
+ UPLOAD_SIGNATURES(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "keys/signatures/upload", "POST"),
+ CLAIM_ONE_TIME_KEYS_FOR_USERS_DEVICES(NetworkConstants.URI_API_PREFIX_PATH_R0 + "keys/claim", "POST"),
+ SEND_TO_DEVICE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "sendToDevice/{eventType}/{txnId}", "PUT"),
+ DELETE_DEVICE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "devices/{device_id}", "DELETE"),
+ UPDATE_DEVICE_INFO(NetworkConstants.URI_API_PREFIX_PATH_R0 + "devices/{device_id}", "PUT"),
+ GET_KEY_CHANGES(NetworkConstants.URI_API_PREFIX_PATH_R0 + "keys/changes", "GET"),
+
+ // RoomKeysApi
+ CREATE_KEYS_BACKUP_VERSION(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/version", "POST"),
+ GET_KEYS_BACKUP_LAST_VERSION(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/version", "GET"),
+ GET_KEYS_BACKUP_VERSION(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/version/{version}", "GET"),
+ UPDATE_KEYS_BACKUP_VERSION(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/version/{version}", "PUT"),
+ STORE_ROOM_SESSION_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}/{sessionId}", "PUT"),
+ STORE_ROOM_SESSIONS_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}", "PUT"),
+ STORE_SESSIONS_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys", "PUT"),
+ GET_ROOM_SESSION_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}/{sessionId}", "GET"),
+ GET_ROOM_SESSIONS_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}", "GET"),
+ GET_SESSIONS_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys", "GET"),
+ DELETE_ROOM_SESSION_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}/{sessionId}", "DELETE"),
+ DELETE_ROOM_SESSIONS_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys/{roomId}", "DELETE"),
+ DELETE_SESSIONS_DATA(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/keys", "DELETE"),
+ DELETE_BACKUP(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "room_keys/version/{version}", "DELETE"),
+
+ // AccountApi
+ CHANGE_PASSWORD(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/password", "POST"),
+ DEACTIVATE_ACCOUNT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/deactivate", "POST"),
+
+ // SearchApi
+ SEARCH(NetworkConstants.URI_API_PREFIX_PATH_R0 + "search", "POST"),
+
+ // FederationApi
+ GET_FEDERATION_VERSION(NetworkConstants.URI_FEDERATION_PATH + "version", "GET"),
+
+ // VoipApi
+ GET_TURN_SERVER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "voip/turnServer", "GET"),
+
+ // PushGatewayApi
+ NOTIFY_PUSH_GATEWAY(NetworkConstants.URI_PUSH_GATEWAY_PREFIX_PATH + "notify", "POST"),
+
+ // GroupApi
+ GET_GROUP_SUMMARY(NetworkConstants.URI_API_PREFIX_PATH_R0 + "groups/{groupId}/summary", "GET"),
+ GET_GROUP_ROOMS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "groups/{groupId}/rooms", "GET"),
+ GET_GROUP_USERS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "groups/{groupId}/users", "GET"),
+
+ // CapabilitiesApi
+ GET_CAPABILITIES(NetworkConstants.URI_API_PREFIX_PATH_R0 + "capabilities", "GET"),
+ GET_VERSIONS(NetworkConstants.URI_API_PREFIX_PATH_ + "versions", "GET"),
+ PING(NetworkConstants.URI_API_PREFIX_PATH_ + "versions", "GET"),
+
+ // IdentityApi
+ GET_ACCOUNT(NetworkConstants.URI_IDENTITY_PATH_V2 + "account", "GET"),
+ LOGOUT(NetworkConstants.URI_IDENTITY_PATH_V2 + "account/logout", "POST"),
+ IDENTITY_HAS_DETAILS(NetworkConstants.URI_IDENTITY_PATH_V2 + "hash_details", "GET"),
+ LOOKUP(NetworkConstants.URI_IDENTITY_PATH_V2 + "lookup", "POST"),
+ REQUEST_TOKEN_TO_BIND_EMAIL(NetworkConstants.URI_IDENTITY_PATH_V2 + "validate/email/requestToken", "POST"),
+ REQUEST_TOKEN_TO_BIND_MSISDN(NetworkConstants.URI_IDENTITY_PATH_V2 + "validate/msisdn/requestToken", "POST"),
+ SUBMIT_TOKEN(NetworkConstants.URI_IDENTITY_PATH_V2 + "validate/{medium}/submitToken", "POST"),
+
+ // FilterApi
+ UPLOAD_FILTER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "user/{userId}/filter", "POST"),
+ GET_FILTER_BY_ID(NetworkConstants.URI_API_PREFIX_PATH_R0 + "user/{userId}/filter/{filterId}", "GET"),
+
+ // IndentityAuthApi
+ IDENTITY_REGISTER(NetworkConstants.URI_IDENTITY_PATH_V2 + "account/register", "POST"),
+
+ // MediaApi
+ GET_MEDIA_CONFIG(NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "config", "GET"),
+ GET_PREVIEW_URL_DATA(NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "preview_url", "GET"),
+
+ // OpenIdApi
+ OPEN_ID_TOKEN(NetworkConstants.URI_API_PREFIX_PATH_R0 + "user/{userId}/openid/request_token", "POST"),
+
+ // ProfileApi
+ GET_PROFILE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "profile/{userId}", "GET"),
+ GET_THREE_PIDS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/3pid", "GET"),
+ SET_DISPLAY_NAME(NetworkConstants.URI_API_PREFIX_PATH_R0 + "profile/{userId}/displayname", "PUT"),
+ SET_AVATAR_URL(NetworkConstants.URI_API_PREFIX_PATH_R0 + "profile/{userId}/avatar_url", "PUT"),
+ BIND_THREE_PID(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "account/3pid/bind", "POST"),
+ UNBIND_THREE_PID(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "account/3pid/unbind", "POST"),
+ ADD_EMAIL(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/3pid/email/requestToken", "POST"),
+ ADD_MSISDN(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/3pid/msisdn/requestToken", "POST"),
+ FINALIZE_ADD_THREE_PID(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/3pid/add", "POST"),
+ DELETE_THREE_PID(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/3pid/delete", "POST"),
+
+ // PusherRulesApi
+ GET_ALL_PUSHER_RULES(NetworkConstants.URI_API_PREFIX_PATH_R0 + "pushrules/", "GET"),
+ UPDATE_ENABLE_PUSH_RULE_STATUS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "pushrules/global/{kind}/{ruleId}/enabled", "PUT"),
+ UPDATE_PUSH_RULE_ACTIONS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "pushrules/global/{kind}/{ruleId}/actions", "PUT"),
+ DELETE_PUSH_RULE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "pushrules/global/{kind}/{ruleId}", "DELETE"),
+ ADD_PUSH_RULE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "pushrules/global/{kind}/{ruleId}", "PUT"),
+
+ // PusherApi
+ GET_PUSHERS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "pushers", "GET"),
+ SET_PUSHER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "pushers/set", "POST"),
+
+ // SignOutApi
+ LOGIN_AGAIN(NetworkConstants.URI_API_PREFIX_PATH_R0 + "login", "POST"),
+ SIGN_OUT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "logout", "POST"),
+
+ // RoomApi
+ GET_PUBLIC_ROOMS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "publicRooms", "POST"),
+ CREATE_ROOM(NetworkConstants.URI_API_PREFIX_PATH_R0 + "createRoom", "POST"),
+ GET_ROOM_MESSAGES_FROM(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/messages", "GET"),
+ GET_MEMBERS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/members", "GET"),
+ SEND_EVENT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/send/{eventType}/{txId}", "PUT"),
+ GET_CONTEXT_OF_EVENT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/context/{eventId}", "GET"),
+ GET_EVENT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/event/{eventId}", "GET"),
+ SEND_READ_MARKER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/read_markers", "POST"),
+ INVITE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/invite", "POST"),
+ INVITE_USING_THREE_PID(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/invite", "POST"),
+ SEND_STATE_EVENT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/state/{state_event_type}", "PUT"),
+ SEND_STATE_EVENT_WITH_STATE_KEY(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/state/{state_event_type}/{state_key}", "PUT"),
+ GET_ROOM_STATE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/state", "GET"),
+ SEND_RELATION(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/send_relation/{parent_id}/{relation_type}/{event_type}", "POST"),
+ GET_RELATIONS(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "rooms/{roomId}/relations/{eventId}/{relationType}/{eventType}", "GET"),
+ JOIN_ROOM(NetworkConstants.URI_API_PREFIX_PATH_R0 + "join/{roomIdOrAlias}", "POST"),
+ LEAVE_ROOM(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/leave", "POST"),
+ BAN_USER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/ban", "POST"),
+ UNBAN_USER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/unban", "POST"),
+ KICK_USER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/kick", "POST"),
+ REDACT_EVENT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/redact/{eventId}/{txnId}", "PUT"),
+ REPORT_CONTENT(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/report/{eventId}", "POST"),
+ GET_ALIASES(NetworkConstants.URI_API_PREFIX_PATH_UNSTABLE + "org.matrix.msc2432/rooms/{roomId}/aliases", "GET"),
+ SEND_TYPING_STATE(NetworkConstants.URI_API_PREFIX_PATH_R0 + "rooms/{roomId}/typing/{userId}", "PUT"),
+ PUT_TAG(NetworkConstants.URI_API_PREFIX_PATH_R0 + "user/{userId}/rooms/{roomId}/tags/{tag}", "PUT"),
+ DELETE_TAG(NetworkConstants.URI_API_PREFIX_PATH_R0 + "user/{userId}/rooms/{roomId}/tags/{tag}", "DELETE"),
+
+ // SyncApi
+ SYNC(NetworkConstants.URI_API_PREFIX_PATH_R0 + "sync", "GET"),
+
+ // ThirdPartyApi
+ THIRD_PARTY_PROTOCOLS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "thirdparty/protocols", "GET"),
+ THIRD_PARTY_USER(NetworkConstants.URI_API_PREFIX_PATH_R0 + "thirdparty/protocols/user/{protocol}", "GET"),
+
+ // SearchUserApi
+ SEARCH_USERS(NetworkConstants.URI_API_PREFIX_PATH_R0 + "user_directory/search", "POST"),
+
+ // AccountDataApi
+ SET_ACCOUNT_DATA(NetworkConstants.URI_API_PREFIX_PATH_R0 + "user/{userId}/account_data/{type}", "PUT")
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
index 4da1662681..4534368679 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/PushRuleService.kt
@@ -31,7 +31,13 @@ interface PushRuleService {
suspend fun addPushRule(kind: RuleKind, pushRule: PushRule)
- suspend fun updatePushRuleActions(kind: RuleKind, oldPushRule: PushRule, newPushRule: PushRule)
+ /**
+ * Enables/Disables a push rule and updates the actions if necessary
+ * @param enable Enables/Disables the rule
+ * @param actions Actions to update if not null
+ */
+
+ suspend fun updatePushRuleActions(kind: RuleKind, ruleId: String, enable: Boolean, actions: List?)
suspend fun removePushRule(kind: RuleKind, pushRule: PushRule)
@@ -39,6 +45,8 @@ interface PushRuleService {
fun removePushRuleListener(listener: PushRuleListener)
+ fun getActions(event: Event): List
+
// fun fulfilledBingRule(event: Event, rules: List): PushRule?
interface PushRuleListener {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/SenderNotificationPermissionCondition.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/SenderNotificationPermissionCondition.kt
index 4f9c84a47c..6675fb0ff5 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/SenderNotificationPermissionCondition.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/SenderNotificationPermissionCondition.kt
@@ -37,6 +37,6 @@ class SenderNotificationPermissionCondition(
fun isSatisfied(event: Event, powerLevels: PowerLevelsContent): Boolean {
val powerLevelsHelper = PowerLevelsHelper(powerLevels)
- return event.senderId != null && powerLevelsHelper.getUserPowerLevelValue(event.senderId) >= powerLevelsHelper.notificationLevel(key)
+ return event.senderId != null && powerLevelsHelper.getUserPowerLevelValue(event.senderId) >= powerLevels.notificationLevel(key)
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushRule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushRule.kt
index 3a9fc4fb83..31d7770a9f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushRule.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/pushrules/rest/PushRule.kt
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.api.pushrules.rest
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.extensions.orFalse
import org.matrix.android.sdk.api.pushrules.Action
import org.matrix.android.sdk.api.pushrules.getActions
import org.matrix.android.sdk.api.pushrules.toJson
@@ -100,6 +101,13 @@ data class PushRule(
)
}
+ /**
+ * Get the highlight status. As spec mentions assume false if no tweak present.
+ */
+ fun getHighlight(): Boolean {
+ return getActions().filterIsInstance().firstOrNull()?.highlight.orFalse()
+ }
+
/**
* Set the notification status.
*
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/ActiveSpaceFilter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/ActiveSpaceFilter.kt
new file mode 100644
index 0000000000..48619b9394
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/ActiveSpaceFilter.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.query
+
+sealed class ActiveSpaceFilter {
+ object None : ActiveSpaceFilter()
+ data class ActiveSpace(val currentSpaceId: String?) : ActiveSpaceFilter()
+ data class ExcludeSpace(val spaceId: String) : ActiveSpaceFilter()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/RoomCategoryFilter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/RoomCategoryFilter.kt
new file mode 100644
index 0000000000..c8ccc4c8a3
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/RoomCategoryFilter.kt
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2021 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.query
+
+enum class RoomCategoryFilter {
+ ONLY_DM,
+ ONLY_ROOMS,
+ ONLY_WITH_NOTIFICATIONS,
+ ALL
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/RoomTagQueryFilter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/RoomTagQueryFilter.kt
new file mode 100644
index 0000000000..613916bc18
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/query/RoomTagQueryFilter.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2021 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.query
+
+data class RoomTagQueryFilter(
+ val isFavorite: Boolean?,
+ val isLowPriority: Boolean?,
+ val isServerNotice: Boolean?
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt
index f1722b2189..3366d040f7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt
@@ -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
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/InitialSyncProgressService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/InitialSyncProgressService.kt
deleted file mode 100644
index 09c6b8e94c..0000000000
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/InitialSyncProgressService.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2020 The Matrix.org Foundation C.I.C.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.matrix.android.sdk.api.session
-
-import androidx.annotation.StringRes
-import androidx.lifecycle.LiveData
-
-interface InitialSyncProgressService {
-
- fun getInitialSyncProgressStatus(): LiveData
-
- sealed class Status {
- object Idle : Status()
- data class Progressing(
- @StringRes val statusText: Int,
- val percentProgress: Int = 0
- ) : Status()
- }
-}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
index 8a95baf3cb..2f981ffbbe 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/Session.kt
@@ -21,21 +21,25 @@ import androidx.lifecycle.LiveData
import okhttp3.OkHttpClient
import org.matrix.android.sdk.api.auth.data.SessionParams
import org.matrix.android.sdk.api.failure.GlobalError
+import org.matrix.android.sdk.api.federation.FederationService
import org.matrix.android.sdk.api.pushrules.PushRuleService
import org.matrix.android.sdk.api.session.account.AccountService
-import org.matrix.android.sdk.api.session.accountdata.AccountDataService
+import org.matrix.android.sdk.api.session.accountdata.SessionAccountDataService
import org.matrix.android.sdk.api.session.cache.CacheService
import org.matrix.android.sdk.api.session.call.CallSignalingService
import org.matrix.android.sdk.api.session.content.ContentUploadStateTracker
import org.matrix.android.sdk.api.session.content.ContentUrlResolver
import org.matrix.android.sdk.api.session.crypto.CryptoService
+import org.matrix.android.sdk.api.session.events.EventService
import org.matrix.android.sdk.api.session.file.ContentDownloadStateTracker
import org.matrix.android.sdk.api.session.file.FileService
import org.matrix.android.sdk.api.session.group.GroupService
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService
import org.matrix.android.sdk.api.session.identity.IdentityService
+import org.matrix.android.sdk.api.session.initsync.InitialSyncProgressService
import org.matrix.android.sdk.api.session.integrationmanager.IntegrationManagerService
import org.matrix.android.sdk.api.session.media.MediaService
+import org.matrix.android.sdk.api.session.openid.OpenIdService
import org.matrix.android.sdk.api.session.permalinks.PermalinkService
import org.matrix.android.sdk.api.session.profile.ProfileService
import org.matrix.android.sdk.api.session.pushers.PushersService
@@ -45,9 +49,11 @@ import org.matrix.android.sdk.api.session.search.SearchService
import org.matrix.android.sdk.api.session.securestorage.SecureStorageService
import org.matrix.android.sdk.api.session.securestorage.SharedSecretStorageService
import org.matrix.android.sdk.api.session.signout.SignOutService
+import org.matrix.android.sdk.api.session.space.SpaceService
import org.matrix.android.sdk.api.session.sync.FilterService
import org.matrix.android.sdk.api.session.sync.SyncState
import org.matrix.android.sdk.api.session.terms.TermsService
+import org.matrix.android.sdk.api.session.thirdparty.ThirdPartyService
import org.matrix.android.sdk.api.session.typing.TypingUsersTracker
import org.matrix.android.sdk.api.session.user.UserService
import org.matrix.android.sdk.api.session.widgets.WidgetService
@@ -65,13 +71,13 @@ interface Session :
SignOutService,
FilterService,
TermsService,
+ EventService,
ProfileService,
PushRuleService,
PushersService,
InitialSyncProgressService,
HomeServerCapabilitiesService,
SecureStorageService,
- AccountDataService,
AccountService {
/**
@@ -212,6 +218,31 @@ interface Session :
*/
fun searchService(): SearchService
+ /**
+ * Returns the federation service associated with the session
+ */
+ fun federationService(): FederationService
+
+ /**
+ * Returns the third party service associated with the session
+ */
+ fun thirdPartyService(): ThirdPartyService
+
+ /**
+ * Returns the space service associated with the session
+ */
+ fun spaceService(): SpaceService
+
+ /**
+ * Returns the open id service associated with the session
+ */
+ fun openIdService(): OpenIdService
+
+ /**
+ * Returns the account data service associated with the session
+ */
+ fun accountDataService(): SessionAccountDataService
+
/**
* Add a listener to the session.
* @param listener the listener to add.
@@ -234,17 +265,24 @@ interface Session :
/**
* A global session listener to get notified for some events.
*/
- interface Listener {
+ interface Listener : SessionLifecycleObserver {
+ /**
+ * Called when the session received new invites to room so the client can react to it once.
+ */
+ fun onNewInvitedRoom(session: Session, roomId: String) = Unit
+
/**
* Possible cases:
* - The access token is not valid anymore,
* - a M_CONSENT_NOT_GIVEN error has been received from the homeserver
*/
- fun onGlobalError(globalError: GlobalError)
+ fun onGlobalError(session: Session, globalError: GlobalError) = Unit
}
val sharedSecretStorageService: SharedSecretStorageService
+ fun getUiaSsoFallbackUrl(authenticationSessionId: String): String
+
/**
* Maintenance API, allows to print outs info on DB size to logcat
*/
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/SessionLifecycleObserver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/SessionLifecycleObserver.kt
new file mode 100644
index 0000000000..b76e454e4b
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/SessionLifecycleObserver.kt
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.session
+
+import androidx.annotation.MainThread
+
+/**
+ * This defines methods associated with some lifecycle events of a session.
+ */
+interface SessionLifecycleObserver {
+ /*
+ Called when the session is opened
+ */
+ @MainThread
+ fun onSessionStarted(session: Session) {
+ // noop
+ }
+
+ /*
+ Called when the session is cleared
+ */
+ @MainThread
+ fun onClearCache(session: Session) {
+ // noop
+ }
+
+ /*
+ Called when the session is closed
+ */
+ @MainThread
+ fun onSessionStopped(session: Session) {
+ // noop
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/account/AccountService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/account/AccountService.kt
index 8915202f35..1f28dbd8af 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/account/AccountService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/account/AccountService.kt
@@ -16,6 +16,8 @@
package org.matrix.android.sdk.api.session.account
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
+
/**
* This interface defines methods to manage the account. It's implemented at the session level.
*/
@@ -25,7 +27,8 @@ interface AccountService {
* @param password Current password.
* @param newPassword New password
*/
- suspend fun changePassword(password: String, newPassword: String)
+ suspend fun changePassword(password: String,
+ newPassword: String)
/**
* Deactivate the account.
@@ -39,9 +42,10 @@ interface AccountService {
* be shared with any new or unregistered users, but registered users who already have access to these messages will still
* have access to their copy.
*
- * @param password the account password
* @param eraseAllData set to true to forget all messages that have been sent. Warning: this will cause future users to see
* an incomplete view of conversations
+ * @param userInteractiveAuthInterceptor see [UserInteractiveAuthInterceptor]
*/
- suspend fun deactivateAccount(password: String, eraseAllData: Boolean)
+ suspend fun deactivateAccount(eraseAllData: Boolean,
+ userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/AccountDataService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/AccountDataService.kt
deleted file mode 100644
index f5d2a7df3e..0000000000
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/AccountDataService.kt
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright 2020 The Matrix.org Foundation C.I.C.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.matrix.android.sdk.api.session.accountdata
-
-import androidx.lifecycle.LiveData
-import org.matrix.android.sdk.api.MatrixCallback
-import org.matrix.android.sdk.api.session.events.model.Content
-import org.matrix.android.sdk.api.util.Cancelable
-import org.matrix.android.sdk.api.util.Optional
-
-interface AccountDataService {
- /**
- * Retrieve the account data with the provided type or null if not found
- */
- fun getAccountDataEvent(type: String): UserAccountDataEvent?
-
- /**
- * Observe the account data with the provided type
- */
- fun getLiveAccountDataEvent(type: String): LiveData>
-
- /**
- * Retrieve the account data with the provided types. The return list can have a different size that
- * the size of the types set, because some AccountData may not exist.
- * If an empty set is provided, all the AccountData are retrieved
- */
- fun getAccountDataEvents(types: Set): List
-
- /**
- * Observe the account data with the provided types. If an empty set is provided, all the AccountData are observed
- */
- fun getLiveAccountDataEvents(types: Set): LiveData>
-
- /**
- * Update the account data with the provided type and the provided account data content
- */
- fun updateAccountData(type: String, content: Content, callback: MatrixCallback? = null): Cancelable
-}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/SessionAccountDataService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/SessionAccountDataService.kt
new file mode 100644
index 0000000000..2ffb9112d1
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/SessionAccountDataService.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.session.accountdata
+
+import androidx.lifecycle.LiveData
+import org.matrix.android.sdk.api.session.events.model.Content
+import org.matrix.android.sdk.api.session.room.accountdata.RoomAccountDataEvent
+import org.matrix.android.sdk.api.util.Optional
+
+/**
+ * This service is attached globally to the session.
+ */
+interface SessionAccountDataService {
+ /**
+ * Retrieve the account data with the provided type or null if not found
+ */
+ fun getUserAccountDataEvent(type: String): UserAccountDataEvent?
+
+ /**
+ * Observe the account data with the provided type
+ */
+ fun getLiveUserAccountDataEvent(type: String): LiveData>
+
+ /**
+ * Retrieve the account data with the provided types. The return list can have a different size that
+ * the size of the types set, because some AccountData may not exist.
+ * If an empty set is provided, all the AccountData are retrieved
+ */
+ fun getUserAccountDataEvents(types: Set): List
+
+ /**
+ * Observe the account data with the provided types. If an empty set is provided, all the AccountData are observed
+ */
+ fun getLiveUserAccountDataEvents(types: Set): LiveData>
+
+ /**
+ * Retrieve the room account data with the provided types. The return list can have a different size that
+ * the size of the types set, because some AccountData may not exist.
+ * If an empty set is provided, all the room AccountData are retrieved
+ */
+ fun getRoomAccountDataEvents(types: Set): List
+
+ /**
+ * Observe the room account data with the provided types. If an empty set is provided, AccountData of every room are observed
+ */
+ fun getLiveRoomAccountDataEvents(types: Set): LiveData>
+
+ /**
+ * Update the account data with the provided type and the provided account data content
+ */
+ suspend fun updateUserAccountData(type: String, content: Content)
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataEvent.kt
index 744e3e5379..77381a28c4 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataEvent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/accountdata/UserAccountDataEvent.kt
@@ -22,7 +22,7 @@ import org.matrix.android.sdk.api.session.events.model.Content
/**
* This is a simplified Event with just a type and a content.
- * Currently used types are defined in [UserAccountDataTypes].
+ * Currently used types are defined in [UserAccountDataTypes]
*/
@JsonClass(generateAdapter = true)
data class UserAccountDataEvent(
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/cache/CacheService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/cache/CacheService.kt
index c1c5663227..2945cc45d6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/cache/CacheService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/cache/CacheService.kt
@@ -16,8 +16,6 @@
package org.matrix.android.sdk.api.session.cache
-import org.matrix.android.sdk.api.MatrixCallback
-
/**
* This interface defines a method to clear the cache. It's implemented at the session level.
*/
@@ -26,5 +24,5 @@ interface CacheService {
/**
* Clear the whole cached data, except credentials. Once done, the sync has to be restarted by the sdk user.
*/
- fun clearCache(callback: MatrixCallback)
+ suspend fun clearCache()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallIdGenerator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallIdGenerator.kt
new file mode 100644
index 0000000000..43e6872525
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallIdGenerator.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.session.call
+
+import java.util.UUID
+
+object CallIdGenerator {
+ fun generate() = UUID.randomUUID().toString()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt
new file mode 100644
index 0000000000..d17be59cd4
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallListener.kt
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.session.call
+
+import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent
+import org.matrix.android.sdk.api.session.room.model.call.CallAssertedIdentityContent
+import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent
+import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent
+import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent
+import org.matrix.android.sdk.api.session.room.model.call.CallNegotiateContent
+import org.matrix.android.sdk.api.session.room.model.call.CallRejectContent
+import org.matrix.android.sdk.api.session.room.model.call.CallSelectAnswerContent
+
+interface CallListener {
+ /**
+ * Called when there is an incoming call within the room.
+ */
+ fun onCallInviteReceived(mxCall: MxCall, callInviteContent: CallInviteContent)
+
+ fun onCallIceCandidateReceived(mxCall: MxCall, iceCandidatesContent: CallCandidatesContent)
+
+ /**
+ * An outgoing call is started.
+ */
+ fun onCallAnswerReceived(callAnswerContent: CallAnswerContent)
+
+ /**
+ * Called when a called has been hung up
+ */
+ fun onCallHangupReceived(callHangupContent: CallHangupContent)
+
+ /**
+ * Called when a called has been rejected
+ */
+ fun onCallRejectReceived(callRejectContent: CallRejectContent)
+
+ /**
+ * Called when an answer has been selected
+ */
+ fun onCallSelectAnswerReceived(callSelectAnswerContent: CallSelectAnswerContent)
+
+ /**
+ * Called when a negotiation is sent
+ */
+ fun onCallNegotiateReceived(callNegotiateContent: CallNegotiateContent)
+
+ /**
+ * Called when the call has been managed by an other session
+ */
+ fun onCallManagedByOtherSession(callId: String)
+
+ /**
+ * Called when an asserted identity event is received
+ */
+ fun onCallAssertedIdentityReceived(callAssertedIdentityContent: CallAssertedIdentityContent)
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallSignalingService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallSignalingService.kt
index e28c1fa595..c34744e75f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallSignalingService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallSignalingService.kt
@@ -16,21 +16,18 @@
package org.matrix.android.sdk.api.session.call
-import org.matrix.android.sdk.api.MatrixCallback
-import org.matrix.android.sdk.api.util.Cancelable
-
interface CallSignalingService {
- fun getTurnServer(callback: MatrixCallback): Cancelable
+ suspend fun getTurnServer(): TurnServerResponse
/**
* Create an outgoing call
*/
fun createOutgoingCall(roomId: String, otherUserId: String, isVideoCall: Boolean): MxCall
- fun addCallListener(listener: CallsListener)
+ fun addCallListener(listener: CallListener)
- fun removeCallListener(listener: CallsListener)
+ fun removeCallListener(listener: CallListener)
fun getCallWithId(callId: String): MxCall?
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallState.kt
index 757a09fb3f..47a63b4a25 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallState.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallState.kt
@@ -16,13 +16,18 @@
package org.matrix.android.sdk.api.session.call
-import org.webrtc.PeerConnection
+import org.matrix.android.sdk.api.session.room.model.call.EndCallReason
sealed class CallState {
/** Idle, setting up objects */
object Idle : CallState()
+ /**
+ * CreateOffer. Intermediate state between Idle and Dialing.
+ */
+ object CreateOffer: CallState()
+
/** Dialing. Outgoing call is signaling the remote peer */
object Dialing : CallState()
@@ -36,9 +41,9 @@ sealed class CallState {
* Connected. Incoming/Outgoing call, ice layer connecting or connected
* Notice that the PeerState failed is not always final, if you switch network, new ice candidtates
* could be exchanged, and the connection could go back to connected
- */
- data class Connected(val iceConnectionState: PeerConnection.PeerConnectionState) : CallState()
+ * */
+ data class Connected(val iceConnectionState: MxPeerConnectionState) : CallState()
- /** Terminated. Incoming/Outgoing call, the call is terminated */
- object Terminated : CallState()
+ /** Ended. Incoming/Outgoing call, the call is terminated */
+ data class Ended(val reason: EndCallReason? = null) : CallState()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallsListener.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallsListener.kt
deleted file mode 100644
index 37ab198487..0000000000
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/CallsListener.kt
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2020 The Matrix.org Foundation C.I.C.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.matrix.android.sdk.api.session.call
-
-import org.matrix.android.sdk.api.session.room.model.call.CallAnswerContent
-import org.matrix.android.sdk.api.session.room.model.call.CallCandidatesContent
-import org.matrix.android.sdk.api.session.room.model.call.CallHangupContent
-import org.matrix.android.sdk.api.session.room.model.call.CallInviteContent
-
-interface CallsListener {
- /**
- * Called when there is an incoming call within the room.
- */
- fun onCallInviteReceived(mxCall: MxCall, callInviteContent: CallInviteContent)
-
- fun onCallIceCandidateReceived(mxCall: MxCall, iceCandidatesContent: CallCandidatesContent)
-
- /**
- * An outgoing call is started.
- */
- fun onCallAnswerReceived(callAnswerContent: CallAnswerContent)
-
- /**
- * Called when a called has been hung up
- */
- fun onCallHangupReceived(callHangupContent: CallHangupContent)
-
- fun onCallManagedByOtherSession(callId: String)
-}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/EglUtils.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/EglUtils.kt
deleted file mode 100644
index 131779a4dc..0000000000
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/EglUtils.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2020 The Matrix.org Foundation C.I.C.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.matrix.android.sdk.api.session.call
-
-import org.webrtc.EglBase
-import timber.log.Timber
-
-/**
- * The root [EglBase] instance shared by the entire application for
- * the sake of reducing the utilization of system resources (such as EGL
- * contexts)
- * by performing a runtime check.
- */
-object EglUtils {
-
- // TODO how do we release that?
-
- /**
- * Lazily creates and returns the one and only [EglBase] which will
- * serve as the root for all contexts that are needed.
- */
- @get:Synchronized var rootEglBase: EglBase? = null
- get() {
- if (field == null) {
- val configAttributes = EglBase.CONFIG_PLAIN
- try {
- field = EglBase.createEgl14(configAttributes)
- ?: EglBase.createEgl10(configAttributes) // Fall back to EglBase10.
- } catch (ex: Throwable) {
- Timber.e(ex, "Failed to create EglBase")
- }
- }
- return field
- }
- private set
-
- val rootEglBaseContext: EglBase.Context?
- get() {
- val eglBase = rootEglBase
- return eglBase?.eglBaseContext
- }
-}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/MxCall.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/MxCall.kt
index a1ab687894..dd23e81cc6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/MxCall.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/MxCall.kt
@@ -16,15 +16,22 @@
package org.matrix.android.sdk.api.session.call
-import org.webrtc.IceCandidate
-import org.webrtc.SessionDescription
+import org.matrix.android.sdk.api.session.room.model.call.CallCandidate
+import org.matrix.android.sdk.api.session.room.model.call.CallCapabilities
+import org.matrix.android.sdk.api.session.room.model.call.EndCallReason
+import org.matrix.android.sdk.api.session.room.model.call.SdpType
+import org.matrix.android.sdk.api.util.Optional
interface MxCallDetail {
val callId: String
val isOutgoing: Boolean
val roomId: String
- val otherUserId: String
val isVideoCall: Boolean
+ val ourPartyId: String
+ val opponentPartyId: Optional?
+ val opponentVersion: Int
+ val opponentUserId: String
+ val capabilities: CallCapabilities?
}
/**
@@ -32,40 +39,62 @@ interface MxCallDetail {
*/
interface MxCall : MxCallDetail {
+ companion object {
+ const val VOIP_PROTO_VERSION = 1
+ }
+
var state: CallState
/**
* Pick Up the incoming call
* It has no effect on outgoing call
*/
- fun accept(sdp: SessionDescription)
+ fun accept(sdpString: String)
+
+ /**
+ * SDP negotiation for media pause, hold/resume, ICE restarts and voice/video call up/downgrading
+ */
+ fun negotiate(sdpString: String, type: SdpType)
+
+ /**
+ * This has to be sent by the caller's client once it has chosen an answer.
+ */
+ fun selectAnswer()
/**
* Reject an incoming call
- * It's an alias to hangUp
*/
- fun reject() = hangUp()
+ fun reject()
/**
* End the call
*/
- fun hangUp()
+ fun hangUp(reason: EndCallReason? = null)
/**
* Start a call
* Send offer SDP to the other participant.
*/
- fun offerSdp(sdp: SessionDescription)
+ fun offerSdp(sdpString: String)
/**
- * Send Ice candidate to the other participant.
+ * Send Call candidate to the other participant.
*/
- fun sendLocalIceCandidates(candidates: List)
+ fun sendLocalCallCandidates(candidates: List)
/**
* Send removed ICE candidates to the other participant.
*/
- fun sendLocalIceCandidateRemovals(candidates: List)
+ fun sendLocalIceCandidateRemovals(candidates: List)
+
+ /**
+ * Send a m.call.replaces event to initiate call transfer.
+ * See [org.matrix.android.sdk.api.session.room.model.call.CallReplacesContent] for documentation about the parameters
+ */
+ suspend fun transfer(targetUserId: String,
+ targetRoomId: String?,
+ createCallId: String?,
+ awaitCallId: String?)
fun addListener(listener: StateListener)
fun removeListener(listener: StateListener)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/MxPeerConnectionState.java b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/MxPeerConnectionState.java
new file mode 100644
index 0000000000..7ea0765809
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/call/MxPeerConnectionState.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2020 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.session.call;
+
+/**
+ * This is a copy of https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/connectionState
+ * to avoid having the dependency over WebRtc library on sdk.
+ */
+public enum MxPeerConnectionState {
+ NEW,
+ CONNECTING,
+ CONNECTED,
+ DISCONNECTED,
+ FAILED,
+ CLOSED
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentAttachmentData.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentAttachmentData.kt
index 98a84b8b66..7ee26de8db 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentAttachmentData.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentAttachmentData.kt
@@ -35,7 +35,8 @@ data class ContentAttachmentData(
val name: String? = null,
val queryUri: Uri,
val mimeType: String?,
- val type: Type
+ val type: Type,
+ val waveform: List? = null
) : Parcelable {
@JsonClass(generateAdapter = false)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUploadStateTracker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUploadStateTracker.kt
index 924da6c19b..ec63eb0be2 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUploadStateTracker.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/content/ContentUploadStateTracker.kt
@@ -31,6 +31,8 @@ interface ContentUploadStateTracker {
sealed class State {
object Idle : State()
object EncryptingThumbnail : State()
+ object CompressingImage : State()
+ data class CompressingVideo(val percent: Float) : State()
data class UploadingThumbnail(val current: Long, val total: Long) : State()
data class Encrypting(val current: Long, val total: Long) : State()
data class Uploading(val current: Long, val total: Long) : State()
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt
index 0eefca1b4c..e3f00a24b6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/CryptoService.kt
@@ -20,6 +20,7 @@ import android.content.Context
import androidx.lifecycle.LiveData
import androidx.paging.PagedList
import org.matrix.android.sdk.api.MatrixCallback
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
import org.matrix.android.sdk.api.listeners.ProgressListener
import org.matrix.android.sdk.api.session.crypto.crosssigning.CrossSigningService
import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupService
@@ -41,7 +42,6 @@ import org.matrix.android.sdk.internal.crypto.model.event.RoomKeyWithHeldContent
import org.matrix.android.sdk.internal.crypto.model.rest.DeviceInfo
import org.matrix.android.sdk.internal.crypto.model.rest.DevicesListResponse
import org.matrix.android.sdk.internal.crypto.model.rest.RoomKeyRequestBody
-import kotlin.jvm.Throws
interface CryptoService {
@@ -53,9 +53,7 @@ interface CryptoService {
fun setDeviceName(deviceId: String, deviceName: String, callback: MatrixCallback)
- fun deleteDevice(deviceId: String, callback: MatrixCallback)
-
- fun deleteDeviceWithUserPassword(deviceId: String, authSession: String?, password: String, callback: MatrixCallback)
+ fun deleteDevice(deviceId: String, userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor, callback: MatrixCallback)
fun getCryptoVersion(context: Context, longFormat: Boolean): String
@@ -83,9 +81,11 @@ interface CryptoService {
fun getDeviceTrackingStatus(userId: String): Int
- fun importRoomKeys(roomKeysAsArray: ByteArray, password: String, progressListener: ProgressListener?, callback: MatrixCallback)
+ suspend fun importRoomKeys(roomKeysAsArray: ByteArray,
+ password: String,
+ progressListener: ProgressListener?): ImportRoomKeysResult
- fun exportRoomKeys(password: String, callback: MatrixCallback)
+ suspend fun exportRoomKeys(password: String): ByteArray
fun setRoomBlacklistUnverifiedDevices(roomId: String)
@@ -157,4 +157,10 @@ interface CryptoService {
fun getWithHeldMegolmSession(roomId: String, sessionId: String): RoomKeyWithHeldContent?
fun logDbUsageInfo()
+
+ /**
+ * Perform any background tasks that can be done before a message is ready to
+ * send, in order to speed up sending of the message.
+ */
+ fun prepareToEncrypt(roomId: String, callback: MatrixCallback)
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt
index 6a646cd4c7..359e33cc2c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/crosssigning/CrossSigningService.kt
@@ -18,10 +18,10 @@ package org.matrix.android.sdk.api.session.crypto.crosssigning
import androidx.lifecycle.LiveData
import org.matrix.android.sdk.api.MatrixCallback
+import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.internal.crypto.crosssigning.DeviceTrustResult
import org.matrix.android.sdk.internal.crypto.crosssigning.UserTrustResult
-import org.matrix.android.sdk.internal.crypto.model.rest.UserPasswordAuth
import org.matrix.android.sdk.internal.crypto.store.PrivateKeysInfo
interface CrossSigningService {
@@ -40,7 +40,7 @@ interface CrossSigningService {
* Initialize cross signing for this user.
* Users needs to enter credentials
*/
- fun initializeCrossSigning(authParams: UserPasswordAuth?,
+ fun initializeCrossSigning(uiaInterceptor: UserInteractiveAuthInterceptor?,
callback: MatrixCallback)
fun isCrossSigningInitialized(): Boolean = getMyCrossSigningKeys() != null
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupService.kt
index 465d00168f..4464427b90 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupService.kt
@@ -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
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupState.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupState.kt
index 7d0f04ebcf..a4cc133398 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupState.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/keysbackup/KeysBackupState.kt
@@ -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
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/VerificationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/VerificationService.kt
index 2413786ea9..b9d0c0ad2c 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/VerificationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/crypto/verification/VerificationService.kt
@@ -16,7 +16,6 @@
package org.matrix.android.sdk.api.session.crypto.verification
-import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.LocalEcho
@@ -53,7 +52,7 @@ interface VerificationService {
transactionId: String?): String?
/**
- * Request a key verification from another user using toDevice events.
+ * Request key verification with another user via room events (instead of the to-device API)
*/
fun requestKeyVerificationInDMs(methods: List,
otherUserId: String,
@@ -79,8 +78,7 @@ interface VerificationService {
transactionId: String,
roomId: String,
otherUserId: String,
- otherDeviceId: String,
- callback: MatrixCallback?): String?
+ otherDeviceId: String): String
/**
* Returns false if the request is unknown
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/EventService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/EventService.kt
new file mode 100644
index 0000000000..297f277497
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/EventService.kt
@@ -0,0 +1,29 @@
+/*
+ * 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.session.events
+
+import org.matrix.android.sdk.api.session.events.model.Event
+
+interface EventService {
+
+ /**
+ * Ask the homeserver for an event content. The SDK will try to decrypt it if it is possible
+ * The result will not be stored into cache
+ */
+ suspend fun getEvent(roomId: String,
+ eventId: String): Event
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt
index 8f9f409b74..3d82846e7e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/Event.kt
@@ -28,6 +28,8 @@ import org.matrix.android.sdk.internal.crypto.algorithms.olm.OlmDecryptionResult
import org.matrix.android.sdk.internal.crypto.model.event.EncryptedEventContent
import org.matrix.android.sdk.internal.di.MoshiProvider
import org.json.JSONObject
+import org.matrix.android.sdk.api.extensions.tryOrNull
+import org.matrix.android.sdk.api.failure.MatrixError
import timber.log.Timber
typealias Content = JsonDict
@@ -66,7 +68,7 @@ inline fun T.toContent(): Content {
*/
@JsonClass(generateAdapter = true)
data class Event(
- @Json(name = "type") val type: String,
+ @Json(name = "type") val type: String? = null,
@Json(name = "event_id") val eventId: String? = null,
@Json(name = "content") val content: Content? = null,
@Json(name = "prev_content") val prevContent: Content? = null,
@@ -90,14 +92,37 @@ data class Event(
@Transient
var sendState: SendState = SendState.UNKNOWN
+ @Transient
+ var sendStateDetails: String? = null
+
+ fun sendStateError(): MatrixError? {
+ return sendStateDetails?.let {
+ val matrixErrorAdapter = MoshiProvider.providesMoshi().adapter(MatrixError::class.java)
+ tryOrNull { matrixErrorAdapter.fromJson(it) }
+ }
+ }
+
/**
* The `age` value transcoded in a timestamp based on the device clock when the SDK received
- * the event from the home server.
+ * the event from the homeserver.
* Unlike `age`, this value is static.
*/
@Transient
var ageLocalTs: Long? = null
+ /**
+ * Copy all fields, including transient fields
+ */
+ fun copyAll(): Event {
+ return copy().also {
+ it.mxDecryptionResult = mxDecryptionResult
+ it.mCryptoError = mCryptoError
+ it.mCryptoErrorReason = mCryptoErrorReason
+ it.sendState = sendState
+ it.ageLocalTs = ageLocalTs
+ }
+ }
+
/**
* Check if event is a state event.
* @return true if event is state event.
@@ -135,7 +160,7 @@ data class Event(
* @return the event type
*/
fun getClearType(): String {
- return mxDecryptionResult?.payload?.get("type")?.toString() ?: type
+ return mxDecryptionResult?.payload?.get("type")?.toString() ?: type ?: EventType.MISSING_TYPE
}
/**
@@ -276,3 +301,7 @@ fun Event.getRelationContent(): RelationDefaultContent? {
fun Event.isReply(): Boolean {
return getRelationContent()?.inReplyTo?.eventId != null
}
+
+fun Event.isEdition(): Boolean {
+ return getRelationContent()?.takeIf { it.type == RelationType.REPLACE }?.eventId != null
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt
index 68874a1fb1..9c3fdd57da 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventType.kt
@@ -20,6 +20,8 @@ package org.matrix.android.sdk.api.session.events.model
* Constants defining known event types from Matrix specifications.
*/
object EventType {
+ // Used when the type is missing, which should not happen
+ const val MISSING_TYPE = "org.matrix.android.sdk.missing_type"
const val PRESENCE = "m.presence"
const val MESSAGE = "m.room.message"
@@ -29,9 +31,7 @@ object EventType {
const val TYPING = "m.typing"
const val REDACTION = "m.room.redaction"
const val RECEIPT = "m.receipt"
- const val TAG = "m.tag"
const val ROOM_KEY = "m.room_key"
- const val FULLY_READ = "m.fully_read"
const val PLUMBING = "m.room.plumbing"
const val BOT_OPTIONS = "m.room.bot.options"
const val PREVIEW_URLS = "org.matrix.room.preview_urls"
@@ -50,6 +50,10 @@ object EventType {
const val STATE_ROOM_GUEST_ACCESS = "m.room.guest_access"
const val STATE_ROOM_POWER_LEVELS = "m.room.power_levels"
+ const val STATE_SPACE_CHILD = "m.space.child"
+
+ const val STATE_SPACE_PARENT = "m.space.parent"
+
/**
* Note that this Event has been deprecated, see
* - https://matrix.org/docs/spec/client_server/r0.6.1#historical-events
@@ -68,7 +72,15 @@ object EventType {
const val CALL_INVITE = "m.call.invite"
const val CALL_CANDIDATES = "m.call.candidates"
const val CALL_ANSWER = "m.call.answer"
+ const val CALL_SELECT_ANSWER = "m.call.select_answer"
+ const val CALL_NEGOTIATE = "m.call.negotiate"
+ const val CALL_REJECT = "m.call.reject"
const val CALL_HANGUP = "m.call.hangup"
+ const val CALL_ASSERTED_IDENTITY = "m.call.asserted_identity"
+ const val CALL_ASSERTED_IDENTITY_PREFIX = "org.matrix.call.asserted_identity"
+
+ // This type is not processed by the client, just sent to the server
+ const val CALL_REPLACES = "m.call.replaces"
// Key share events
const val ROOM_KEY_REQUEST = "m.room_key_request"
@@ -98,5 +110,9 @@ object EventType {
|| type == CALL_CANDIDATES
|| type == CALL_ANSWER
|| type == CALL_HANGUP
+ || type == CALL_SELECT_ANSWER
+ || type == CALL_NEGOTIATE
+ || type == CALL_REJECT
+ || type == CALL_REPLACES
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt
index bcdb5ea257..23dc1e0ba8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/file/FileService.kt
@@ -17,11 +17,9 @@
package org.matrix.android.sdk.api.session.file
import android.net.Uri
-import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.session.room.model.message.MessageWithAttachmentContent
import org.matrix.android.sdk.api.session.room.model.message.getFileName
import org.matrix.android.sdk.api.session.room.model.message.getFileUrl
-import org.matrix.android.sdk.api.util.Cancelable
import org.matrix.android.sdk.internal.crypto.attachments.ElementToDecrypt
import org.matrix.android.sdk.internal.crypto.attachments.toElementToDecrypt
import java.io.File
@@ -31,30 +29,32 @@ import java.io.File
*/
interface FileService {
- enum class FileState {
- IN_CACHE,
- DOWNLOADING,
- UNKNOWN
+ sealed class FileState {
+ /**
+ * The original file is in cache, but the decrypted files can be deleted for security reason.
+ * To decrypt the file again, call [downloadFile], the encrypted file will not be downloaded again
+ * @param decryptedFileInCache true if the decrypted file is available. Always true for clear files.
+ */
+ data class InCache(val decryptedFileInCache: Boolean) : FileState()
+ object Downloading : FileState()
+ object Unknown : FileState()
}
/**
- * Download a file.
+ * Download a file if necessary and ensure that if the file is encrypted, the file is decrypted.
* Result will be a decrypted file, stored in the cache folder. url parameter will be used to create unique filename to avoid name collision.
*/
- fun downloadFile(fileName: String,
+ suspend fun downloadFile(fileName: String,
mimeType: String?,
url: String?,
- elementToDecrypt: ElementToDecrypt?,
- callback: MatrixCallback): Cancelable
+ elementToDecrypt: ElementToDecrypt?): File
- fun downloadFile(messageContent: MessageWithAttachmentContent,
- callback: MatrixCallback): Cancelable =
+ suspend fun downloadFile(messageContent: MessageWithAttachmentContent): File =
downloadFile(
fileName = messageContent.getFileName(),
mimeType = messageContent.mimeType,
url = messageContent.getFileUrl(),
- elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt(),
- callback = callback
+ elementToDecrypt = messageContent.encryptedFileInfo?.toElementToDecrypt()
)
fun isFileInCache(mxcUrl: String?,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt
index da99ab8d54..b49236c338 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilities.kt
@@ -32,9 +32,71 @@ 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
) {
+
+ enum class RoomCapabilitySupport {
+ SUPPORTED,
+ SUPPORTED_UNSTABLE,
+ UNSUPPORTED,
+ UNKNOWN
+ }
+
+ /**
+ * Check if a feature is supported by the homeserver.
+ * @return
+ * UNKNOWN if the server does not implement room caps
+ * UNSUPPORTED if this feature is not supported
+ * SUPPORTED if this feature is supported by a stable version
+ * SUPPORTED_UNSTABLE if this feature is supported by an unstable version
+ * (unstable version should only be used for dev/experimental purpose)
+ */
+ fun isFeatureSupported(feature: String): RoomCapabilitySupport {
+ if (roomVersions?.capabilities == null) return RoomCapabilitySupport.UNKNOWN
+ val info = roomVersions.capabilities[feature] ?: return RoomCapabilitySupport.UNSUPPORTED
+
+ val preferred = info.preferred ?: info.support.lastOrNull()
+ val versionCap = roomVersions.supportedVersion.firstOrNull { it.version == preferred }
+
+ return when {
+ versionCap == null -> {
+ RoomCapabilitySupport.UNKNOWN
+ }
+ versionCap.status == RoomVersionStatus.STABLE -> {
+ RoomCapabilitySupport.SUPPORTED
+ }
+ else -> {
+ RoomCapabilitySupport.SUPPORTED_UNSTABLE
+ }
+ }
+ }
+ fun isFeatureSupported(feature: String, byRoomVersion: String): Boolean {
+ if (roomVersions?.capabilities == null) return false
+ val info = roomVersions.capabilities[feature] ?: return false
+
+ return info.preferred == byRoomVersion || info.support.contains(byRoomVersion)
+ }
+
+ /**
+ * Use this method to know if you should force a version when creating
+ * a room that requires this feature.
+ * You can also use #isFeatureSupported prior to this call to check if the
+ * feature is supported and report some feedback to user.
+ */
+ fun versionOverrideForFeature(feature: String) : String? {
+ val cap = roomVersions?.capabilities?.get(feature)
+ return cap?.preferred ?: cap?.support?.lastOrNull()
+ }
+
companion object {
const val MAX_UPLOAD_FILE_SIZE_UNKNOWN = -1L
+ const val ROOM_CAP_KNOCK = "knock"
+ const val ROOM_CAP_RESTRICTED = "restricted"
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt
index 2c9121ce4a..f12cbcd6db 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/HomeServerCapabilitiesService.kt
@@ -21,6 +21,11 @@ package org.matrix.android.sdk.api.session.homeserver
*/
interface HomeServerCapabilitiesService {
+ /**
+ * Force a refresh of the stored data
+ */
+ suspend fun refreshHomeServerCapabilities()
+
/**
* Get the HomeServer capabilities
*/
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/RoomVersionModel.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/RoomVersionModel.kt
new file mode 100644
index 0000000000..9f8e9aa1d1
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/homeserver/RoomVersionModel.kt
@@ -0,0 +1,39 @@
+/*
+ * 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,
+ // Keys are capabilities defined per spec, as for now knock or restricted
+ val capabilities: Map?
+)
+
+data class RoomVersionInfo(
+ val version: String,
+ val status: RoomVersionStatus
+)
+
+data class RoomCapabilitySupport(
+ val preferred: String?,
+ val support: List
+)
+
+enum class RoomVersionStatus {
+ STABLE,
+ UNSTABLE
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/identity/IdentityService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/identity/IdentityService.kt
index aedb813735..ae546b6cec 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/identity/IdentityService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/identity/IdentityService.kt
@@ -16,9 +16,6 @@
package org.matrix.android.sdk.api.session.identity
-import org.matrix.android.sdk.api.MatrixCallback
-import org.matrix.android.sdk.api.util.Cancelable
-
/**
* Provides access to the identity server configuration and services identity server can provide
*/
@@ -38,57 +35,57 @@ interface IdentityService {
/**
* Check if the identity server is valid
* See https://matrix.org/docs/spec/identity_service/latest#status-check
- * RiotX SDK only supports identity server API v2
+ * Matrix Android SDK2 only supports identity server API v2
*/
- fun isValidIdentityServer(url: String, callback: MatrixCallback): Cancelable
+ suspend fun isValidIdentityServer(url: String)
/**
* Update the identity server url.
* If successful, any previous identity server will be disconnected.
* In case of error, any previous identity server will remain configured.
* @param url the new url.
- * @param callback will notify the user if change is successful. The String will be the final url of the identity server.
+ * @return The String will be the final url of the identity server.
* The SDK can prepend "https://" for instance.
*/
- fun setNewIdentityServer(url: String, callback: MatrixCallback): Cancelable
+ suspend fun setNewIdentityServer(url: String): String
/**
* Disconnect (logout) from the current identity server
*/
- fun disconnect(callback: MatrixCallback): Cancelable
+ suspend fun disconnect()
/**
* This will ask the identity server to send an email or an SMS to let the user confirm he owns the ThreePid
*/
- fun startBindThreePid(threePid: ThreePid, callback: MatrixCallback): Cancelable
+ suspend fun startBindThreePid(threePid: ThreePid)
/**
* This will cancel a pending binding of threePid.
*/
- fun cancelBindThreePid(threePid: ThreePid, callback: MatrixCallback): Cancelable
+ suspend fun cancelBindThreePid(threePid: ThreePid)
/**
* This will ask the identity server to send an new email or a new SMS to let the user confirm he owns the ThreePid
*/
- fun sendAgainValidationCode(threePid: ThreePid, callback: MatrixCallback): Cancelable
+ suspend fun sendAgainValidationCode(threePid: ThreePid)
/**
* Submit the code that the identity server has sent to the user (in email or SMS)
* Once successful, you will have to call [finalizeBindThreePid]
* @param code the code sent to the user
*/
- fun submitValidationToken(threePid: ThreePid, code: String, callback: MatrixCallback): Cancelable
+ suspend fun submitValidationToken(threePid: ThreePid, code: String)
/**
* This will perform the actual association of ThreePid and Matrix account
*/
- fun finalizeBindThreePid(threePid: ThreePid, callback: MatrixCallback): Cancelable
+ suspend fun finalizeBindThreePid(threePid: ThreePid)
/**
* Unbind a threePid
* The request will actually be done on the homeserver
*/
- fun unbindThreePid(threePid: ThreePid, callback: MatrixCallback): Cancelable
+ suspend fun unbindThreePid(threePid: ThreePid)
/**
* Search MatrixId of users providing email and phone numbers
@@ -96,7 +93,7 @@ interface IdentityService {
* Application has to explicitly ask for the user consent, and the answer can be stored using [setUserConsent]
* Please see https://support.google.com/googleplay/android-developer/answer/9888076?hl=en for more details.
*/
- fun lookUp(threePids: List, callback: MatrixCallback>): Cancelable
+ suspend fun lookUp(threePids: List): List
/**
* Return the current user consent for the current identity server, which has been stored using [setUserConsent].
@@ -120,9 +117,9 @@ interface IdentityService {
* A lookup will be performed, but also pending binding state will be restored
*
* @param threePids the list of threePid the user owns (retrieved form the homeserver)
- * @param callback onSuccess will be called with a map of ThreePid -> SharedState
+ * @return a map of ThreePid -> SharedState
*/
- fun getShareStatus(threePids: List, callback: MatrixCallback