diff --git a/.gitattributes b/.gitattributes
index 0542767eff..b44f3fab1b 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
**/snapshots/**/*.png filter=lfs diff=lfs merge=lfs -text
+**/src/androidTest/assets/*.realm filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/ISSUE_TEMPLATE/release.yml b/.github/ISSUE_TEMPLATE/release.yml
index b41188a920..4ab77af5a0 100644
--- a/.github/ISSUE_TEMPLATE/release.yml
+++ b/.github/ISSUE_TEMPLATE/release.yml
@@ -10,7 +10,6 @@ body:
id: checklist
attributes:
label: Release checklist
- description: For the template example, we are releasing the version 1.2.3. Replace 1.2.3 with the version in the issue body.
placeholder: |
If you are reading this, you have deleted the content of the release template: undo the deletion or start again.
value: |
@@ -24,28 +23,7 @@ body:
### Do the release
- - [ ] Make sure `develop` and `main` are up to date (git pull)
- - [ ] Checkout develop and create a release with gitflow, branch name `release/1.2.3`
- - [ ] Check the crashes from the PlayStore
- - [ ] Check the rageshake with the current dev version: https://github.com/matrix-org/element-android-rageshakes/labels/1.2.3-dev
- - [ ] Run the integration test, and especially `UiAllScreensSanityTest.allScreensTest()`
- - [ ] Create an account on matrix.org and do some smoke tests that the sanity test does not cover like: 1-1 call, 1-1 video call, Jitsi call for instance
- - [ ] Run towncrier: `towncrier build --version v1.2.3 --draft` (remove `--draft` do write the file CHANGES.md)
- - [ ] Check the file CHANGES.md consistency. It's possible to reorder items (most important changes first) or change their section if relevant. Also an opportunity to fix some typo, or rewrite things
- - [ ] Add file for fastlane under ./fastlane/metadata/android/en-US/changelogs
- - [ ] (optional) 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 (if created)
- - [ ] Push `main` and the new tag `v1.2.3` to origin
- - [ ] Checkout `develop`
- - [ ] Increase version (versionPatch + 2) in `./vector/build.gradle`
- - [ ] Change the value of SDK_VERSION in the file `./matrix-sdk-android/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 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
+ - [ ] Run the script ./tools/release/releaseScript.sh and follow the steps.
### Once tested and validated internally
@@ -82,29 +60,9 @@ body:
The SDK2 and the sample app are released only when Element has been pushed to production.
- - [ ] Checkout the `main` branch on Element Android project
+ - [ ] On the [SDK2 project](https://github.com/matrix-org/matrix-android-sdk2), run the script ./tools/releaseScript.sh and follow the instructions.
- #### On the SDK2 project
-
- https://github.com/matrix-org/matrix-android-sdk2
-
- - [ ] Create a release with GitFlow
- - [ ] Update the value of VERSION_NAME in the file gradle.properties
- - [ ] 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`
- - [ ] Check the diff in the file `./matrix-sdk-android/build.gradle` and restore what may have been erased (in particular the line `apply plugin: "com.vanniktech.maven.publish"` and the line about the version)
- - [ ] Let the script finish to build the library
- - [ ] Update the file `CHANGES.md`
- - [ ] Finish the release using GitFlow
- - [ ] Push the branch `main`, the new tag and the branch `develop` to origin
-
- ##### Release on MavenCentral
-
- - [ ] Checkout the branch `main`
- - [ ] Run the command `./gradlew publish --no-daemon --no-parallel`. You'll need some non-public element to do so
- - [ ] Run the command `./gradlew closeAndReleaseRepository`. If it is working well, you can jump directly to the final step of this section.
-
- If `./gradlew closeAndReleaseRepository` fails (for instance, several repositories are waiting to be handled), you have to close and release the repository manually. Do the following steps:
+ Note: if the step `./gradlew closeAndReleaseRepository` fails (for instance, several repositories are waiting to be handled), you have to close and release the repository manually. Do the following steps:
- [ ] Connect to https://s01.oss.sonatype.org
- [ ] Click on Staging Repositories and check the the files have been uploaded
@@ -112,15 +70,6 @@ body:
- [ ] Wait (check Activity tab until step "Repository closed" is displayed)
- [ ] Click on release. The staging repository will disappear
- Final step
-
- - [ ] Check that the release is available in https://repo1.maven.org/maven2/org/matrix/android/matrix-android-sdk2/ (it can take a few minutes)
-
- ##### Release on GitHub
-
- - [ ] 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
diff --git a/.github/workflows/danger.yml b/.github/workflows/danger.yml
index d1c63b9f30..505f14b75c 100644
--- a/.github/workflows/danger.yml
+++ b/.github/workflows/danger.yml
@@ -17,8 +17,8 @@ jobs:
- run: |
npm install --save-dev @babel/plugin-transform-flow-strip-types
- name: Danger
- uses: danger/danger-js@11.1.4
+ uses: danger/danger-js@11.2.0
with:
- args: "--dangerfile tools/danger/dangerfile.js"
+ args: "--dangerfile ./tools/danger/dangerfile.js"
env:
DANGER_GITHUB_API_TOKEN: ${{ steps.generate_token.outputs.token }}
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index b6333c5940..a44872e0ef 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
- name: Build docs
run: ./gradlew dokkaHtml
diff --git a/.github/workflows/post-pr.yml b/.github/workflows/post-pr.yml
index 7c3bad3b77..26a1ad2c90 100644
--- a/.github/workflows/post-pr.yml
+++ b/.github/workflows/post-pr.yml
@@ -16,7 +16,7 @@ env:
jobs:
# More info on should-i-run:
- # If this fails to run (the IF doesn't complete) then the needs will not be satisfied for any of the
+ # If this fails to run (the IF doesn't complete) then the needs will not be satisfied for any of the
# other jobs below, so none will run.
# except for the notification job at the bottom which will run all the time, unless should-i-run isn't
# successful, or all the other jobs have succeeded
@@ -32,6 +32,7 @@ jobs:
name: UI Tests (Synapse)
needs: should-i-run
runs-on: buildjet-4vcpu-ubuntu-2204
+ timeout-minutes: 90 # We might need to increase it if the time for tests grows
strategy:
fail-fast: false
matrix:
diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml
index 452f6da36f..f781da7a3b 100644
--- a/.github/workflows/quality.yml
+++ b/.github/workflows/quality.yml
@@ -72,9 +72,9 @@ jobs:
yarn add danger-plugin-lint-report --dev
- name: Danger lint
if: always()
- uses: danger/danger-js@11.1.4
+ uses: danger/danger-js@11.2.0
with:
- args: "--dangerfile tools/danger/dangerfile-lint.js"
+ args: "--dangerfile ./tools/danger/dangerfile-lint.js"
env:
DANGER_GITHUB_API_TOKEN: ${{ steps.generate_token.outputs.token }}
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index fc0ce5e044..5d3905a8c1 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -14,6 +14,7 @@ jobs:
tests:
name: Runs all tests
runs-on: buildjet-4vcpu-ubuntu-2204
+ timeout-minutes: 90 # We might need to increase it if the time for tests grows
strategy:
matrix:
api-level: [28]
@@ -128,25 +129,25 @@ jobs:
# Unneeded as part of the test suite above, kept around in case we want to re-enable them.
#
# # Build Android Tests
-# build-android-tests:
-# name: Build Android Tests
-# runs-on: ubuntu-latest
+# build-android-tests:
+# name: Build Android Tests
+# runs-on: ubuntu-latest
# concurrency:
# group: ${{ github.ref == 'refs/heads/main' && format('unit-tests-main-{0}', github.sha) || github.ref == 'refs/heads/develop' && format('unit-tests-develop-{0}', github.sha) || format('build-android-tests-{0}', github.ref) }}
# cancel-in-progress: true
-# steps:
-# - uses: actions/checkout@v3
-# - uses: actions/setup-java@v3
-# with:
-# distribution: 'adopt'
-# java-version: 11
-# - uses: actions/cache@v3
-# with:
-# path: |
-# ~/.gradle/caches
-# ~/.gradle/wrapper
-# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
-# restore-keys: |
-# ${{ runner.os }}-gradle-
-# - name: Build Android Tests
+# steps:
+# - uses: actions/checkout@v3
+# - uses: actions/setup-java@v3
+# with:
+# distribution: 'adopt'
+# java-version: 11
+# - uses: actions/cache@v3
+# with:
+# path: |
+# ~/.gradle/caches
+# ~/.gradle/wrapper
+# key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+# restore-keys: |
+# ${{ runner.os }}-gradle-
+# - name: Build Android Tests
# run: ./gradlew clean assembleAndroidTest $CI_GRADLE_ARG_PROPERTIES
diff --git a/.github/workflows/triage-labelled.yml b/.github/workflows/triage-labelled.yml
index 8e9cc6d76c..036bc069ac 100644
--- a/.github/workflows/triage-labelled.yml
+++ b/.github/workflows/triage-labelled.yml
@@ -17,7 +17,8 @@ jobs:
contains(github.event.issue.labels.*.name, 'Z-IA') ||
contains(github.event.issue.labels.*.name, 'A-Themes-Custom') ||
contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') ||
- contains(github.event.issue.labels.*.name, 'A-Tags')
+ contains(github.event.issue.labels.*.name, 'A-Tags') ||
+ contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor')
steps:
- uses: actions/github-script@v5
with:
@@ -79,8 +80,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -88,7 +89,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc0sUA"
+ PROJECT_ID: "PVT_kwDOAM0swc0sUA"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
add_product_issues:
@@ -103,8 +104,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -112,7 +113,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc4AAg6N"
+ PROJECT_ID: "PVT_kwDOAM0swc4AAg6N"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
delight_issues_to_board:
@@ -129,8 +130,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -138,7 +139,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc1HvQ"
+ PROJECT_ID: "PVT_kwDOAM0swc1HvQ"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
move_voice-message_issues:
@@ -154,8 +155,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -163,7 +164,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc2KCw"
+ PROJECT_ID: "PVT_kwDOAM0swc2KCw"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
move_message_bubbles_issues:
name: A-Message-Bubbles to Message bubbles board
@@ -178,8 +179,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -187,7 +188,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc3m-g"
+ PROJECT_ID: "PVT_kwDOAM0swc3m-g"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
move_ftue_issues:
@@ -203,8 +204,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -212,7 +213,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc4AAqVx"
+ PROJECT_ID: "PVT_kwDOAM0swc4AAqVx"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
move_WTF_issues:
@@ -228,8 +229,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -237,7 +238,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc4AArk0"
+ PROJECT_ID: "PVT_kwDOAM0swc4AArk0"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
move_element_x_issues:
@@ -258,8 +259,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!,$contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -267,7 +268,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.issue.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc4ABTXY"
+ PROJECT_ID: "PVT_kwDOAM0swc4ABTXY"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
ps_features1:
diff --git a/.github/workflows/triage-move-review-requests.yml b/.github/workflows/triage-move-review-requests.yml
index 61f1f114dd..f604b82873 100644
--- a/.github/workflows/triage-move-review-requests.yml
+++ b/.github/workflows/triage-move-review-requests.yml
@@ -60,8 +60,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!, $contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -69,7 +69,7 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.pull_request.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc0sUA"
+ PROJECT_ID: "PVT_kwDOAM0swc0sUA"
TEAM: "design"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
@@ -129,8 +129,8 @@ jobs:
headers: '{"GraphQL-Features": "projects_next_graphql"}'
query: |
mutation add_to_project($projectid:ID!, $contentid:ID!) {
- addProjectNextItem(input:{projectId:$projectid contentId:$contentid}) {
- projectNextItem {
+ addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) {
+ item {
id
}
}
@@ -138,6 +138,6 @@ jobs:
projectid: ${{ env.PROJECT_ID }}
contentid: ${{ github.event.pull_request.node_id }}
env:
- PROJECT_ID: "PN_kwDOAM0swc4AAg6N"
+ PROJECT_ID: "PVT_kwDOAM0swc4AAg6N"
TEAM: "product"
GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e7d6648070..3750d32b5b 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,6 +12,7 @@
* [Code quality](#code-quality)
* [Internal tool](#internal-tool)
* [ktlint](#ktlint)
+ * [knit](#knit)
* [lint](#lint)
* [Unit tests](#unit-tests)
* [Tests](#tests)
@@ -116,6 +117,23 @@ Note that you can run
For ktlint to fix some detected errors for you (you still have to check and commit the fix of course)
+#### knit
+
+[knit](https://github.com/Kotlin/kotlinx-knit) is a tool which checks markdown files on the project. Also it generates/updates the table of content (toc) of the markdown files.
+
+So everytime the toc should be updated, just run
+
+./gradlew knit
+
+
+and commit the changes.
+
+The CI will check that markdown files are up to date by running
+
+
+./gradlew knitCheck
+
+
#### lint
diff --git a/ELEMENT_CHANGES.md b/ELEMENT_CHANGES.md
index 18bb2480c3..e742d79c1e 100644
--- a/ELEMENT_CHANGES.md
+++ b/ELEMENT_CHANGES.md
@@ -1,3 +1,197 @@
+Changes in Element v1.5.18 (2023-01-02)
+=======================================
+
+This release fixes a bunch of recent regressions. Most of them were not pushed to production hopefully. Current production version is 1.5.11.
+Threads are now enabled by default, and this may let the application perform an initial sync.
+Testers on the PlayStore may have experimented some issues like empty room list, or incomplete room state (room name missing, etc.), or even crashing due to initial sync not using lazy loading of room members. All those issues have been fixed, but to fix your current state, please clear cache once you get the release 1.5.18.
+
+Bugfixes 🐛
+----------
+ - Start DM will create a deadlock if user profile was never loaded ([#7870](https://github.com/vector-im/element-android/issues/7870))
+
+
+Changes in Element v1.5.16 (2022-12-29)
+======================================
+
+Features ✨
+----------
+ - [Rich text editor] Add support for links ([#7746](https://github.com/vector-im/element-android/issues/7746))
+ - [Poll] When a poll is ended, use /relations API to ensure poll results are correct ([#7767](https://github.com/vector-im/element-android/issues/7767))
+ - [Session manager] Security recommendations cards: whole view should be tappable ([#7795](https://github.com/vector-im/element-android/issues/7795))
+ - [Session manager] Other sessions list: header should not be sticky ([#7797](https://github.com/vector-im/element-android/issues/7797))
+
+Bugfixes 🐛
+----------
+ - Do not show typing notification of ignored users. ([#2965](https://github.com/vector-im/element-android/issues/2965))
+ - [Push Notifications, Threads] - quick reply to threaded notification now sent to thread except main timeline ([#7475](https://github.com/vector-im/element-android/issues/7475))
+ - [Session manager] Other sessions list: filter option is displayed when selection mode is enabled ([#7784](https://github.com/vector-im/element-android/issues/7784))
+ - [Session manager] Other sessions: Filter bottom sheet cut in landscape mode ([#7786](https://github.com/vector-im/element-android/issues/7786))
+ - Automatically show keyboard after learn more bottom sheet is dismissed ([#7790](https://github.com/vector-im/element-android/issues/7790))
+ - [Session Manager] Other sessions list: cannot select/deselect session by a long press when in select mode ([#7792](https://github.com/vector-im/element-android/issues/7792))
+ - Fix current session ip address visibility ([#7794](https://github.com/vector-im/element-android/issues/7794))
+ - Device Manager UI review fixes ([#7798](https://github.com/vector-im/element-android/issues/7798))
+
+SDK API changes ⚠️
+------------------
+ - [Sync] Sync Filter params are moved to MatrixConfiguration and will not be stored in session realm to avoid bug when session cache is cleared ([#7843](https://github.com/vector-im/element-android/issues/7843))
+
+Other changes
+-------------
+ - [Voice Broadcast] Replace the player timeline ([#7821](https://github.com/vector-im/element-android/issues/7821))
+ - Increase session manager test coverage ([#7836](https://github.com/vector-im/element-android/issues/7836))
+
+
+Changes in Element v1.5.14 (2022-12-20)
+=======================================
+
+Bugfixes 🐛
+----------
+- ActiveSessionHolder is not supposed to start syncing. Instead, the MainActivity does it, if necessary. Fixes a race condition when clearing cache.
+
+
+Changes in Element v1.5.13 (2022-12-19)
+=======================================
+
+Bugfixes 🐛
+----------
+- Add `largeHeap=true` in the manifest since we are seeing more crashes (OOM) when handling sync response.
+
+
+Changes in Element v1.5.12 (2022-12-15)
+=======================================
+
+Features ✨
+----------
+- [Threads] - Threads Labs Flag is enabled by default and forced to be enabled for existing users, but sill can be disabled manually ([#5503](https://github.com/vector-im/element-android/issues/5503))
+ - [Session manager] Add action to signout all the other session ([#7693](https://github.com/vector-im/element-android/issues/7693))
+ - Remind unverified sessions with a banner once a week ([#7694](https://github.com/vector-im/element-android/issues/7694))
+ - [Session manager] Add actions to rename and signout current session ([#7697](https://github.com/vector-im/element-android/issues/7697))
+ - Voice Broadcast - Update last message in the room list ([#7719](https://github.com/vector-im/element-android/issues/7719))
+ - Delete unused client information from account data ([#7754](https://github.com/vector-im/element-android/issues/7754))
+
+Bugfixes 🐛
+----------
+ - Fix bad pills color background. For light and dark theme the color is now 61708B (iso EleWeb) ([#7274](https://github.com/vector-im/element-android/issues/7274))
+ - [Notifications] Fixed a bug when push notification was automatically dismissed while app is on background ([#7643](https://github.com/vector-im/element-android/issues/7643))
+ - ANR when asking to select the notification method ([#7653](https://github.com/vector-im/element-android/issues/7653))
+ - [Rich text editor] Fix design and spacing of rich text editor ([#7658](https://github.com/vector-im/element-android/issues/7658))
+ - [Rich text editor] Fix keyboard closing after collapsing editor ([#7659](https://github.com/vector-im/element-android/issues/7659))
+ - Rich Text Editor: fix several issues related to insets:
+ * Empty space displayed at the bottom when you don't have permissions to send messages into a room.
+ * Wrong insets being kept when you exit the room screen and the keyboard is displayed, then come back to it. ([#7680](https://github.com/vector-im/element-android/issues/7680))
+ - Fix crash in message composer when room is missing ([#7683](https://github.com/vector-im/element-android/issues/7683))
+ - Fix crash when invalid homeserver url is entered. ([#7684](https://github.com/vector-im/element-android/issues/7684))
+ - Rich Text Editor: improve performance when entering reply/edit/quote mode. ([#7691](https://github.com/vector-im/element-android/issues/7691))
+ - [Rich text editor] Add error tracking for rich text editor ([#7695](https://github.com/vector-im/element-android/issues/7695))
+ - Fix E2EE set up failure whilst signing in using QR code ([#7699](https://github.com/vector-im/element-android/issues/7699))
+ - Fix usage of unknown shield in room summary ([#7710](https://github.com/vector-im/element-android/issues/7710))
+ - Fix crash when the network is not available. ([#7725](https://github.com/vector-im/element-android/issues/7725))
+ - [Session manager] Sessions without encryption support should not prompt to verify ([#7733](https://github.com/vector-im/element-android/issues/7733))
+ - Fix issue of Scan QR code button sometimes not showing when it should be available ([#7737](https://github.com/vector-im/element-android/issues/7737))
+ - Verification request is not showing when verify session popup is displayed ([#7743](https://github.com/vector-im/element-android/issues/7743))
+ - Fix crash when inviting by email. ([#7744](https://github.com/vector-im/element-android/issues/7744))
+ - Revert usage of stable fields in live location sharing and polls ([#7751](https://github.com/vector-im/element-android/issues/7751))
+ - [Poll] Poll end event is not recognized ([#7753](https://github.com/vector-im/element-android/issues/7753))
+ - [Push Notifications] When push notification for threaded message is clicked, thread timeline will be opened instead of room's main timeline ([#7770](https://github.com/vector-im/element-android/issues/7770))
+
+Other changes
+-------------
+ - [Threads] - added API to fetch threads list from the server instead of building it locally from events ([#5819](https://github.com/vector-im/element-android/issues/5819))
+ - Add Z-Labs label for rich text editor and migrate to new label naming. ([#7477](https://github.com/vector-im/element-android/issues/7477))
+ - Crypto database migration tests ([#7645](https://github.com/vector-im/element-android/issues/7645))
+ - Add tracing Id for to device messages ([#7708](https://github.com/vector-im/element-android/issues/7708))
+ - Disable nightly popup and add an entry point in the advanced settings instead. ([#7723](https://github.com/vector-im/element-android/issues/7723))
+- Save m.local_notification_settings. event in account_data ([#7596](https://github.com/vector-im/element-android/issues/7596))
+- Update notifications setting when m.local_notification_settings. event changes for current device ([#7632](https://github.com/vector-im/element-android/issues/7632))
+
+SDK API changes ⚠️
+------------------
+- Handle account data removal ([#7740](https://github.com/vector-im/element-android/issues/7740))
+
+Changes in Element 1.5.11 (2022-12-07)
+======================================
+
+Bugfixes 🐛
+----------
+ - Fix crash when the network is not available. ([#7725](https://github.com/vector-im/element-android/issues/7725))
+
+
+Changes in Element v1.5.10 (2022-11-30)
+=======================================
+
+Features ✨
+----------
+ - Add setting to allow disabling direct share ([#2725](https://github.com/vector-im/element-android/issues/2725))
+ - [Device Manager] Toggle IP address visibility ([#7546](https://github.com/vector-im/element-android/issues/7546))
+ - New implementation of the full screen mode for the Rich Text Editor. ([#7577](https://github.com/vector-im/element-android/issues/7577))
+
+Bugfixes 🐛
+----------
+ - Fix italic text is truncated when bubble mode and markdown is enabled ([#5679](https://github.com/vector-im/element-android/issues/5679))
+ - Missing translations on "replyTo" messages ([#7555](https://github.com/vector-im/element-android/issues/7555))
+ - ANR on session start when sending client info is enabled ([#7604](https://github.com/vector-im/element-android/issues/7604))
+ - Make the plain text mode layout of the RTE more compact. ([#7620](https://github.com/vector-im/element-android/issues/7620))
+ - Push notification for thread message is now shown correctly when user observes rooms main timeline ([#7634](https://github.com/vector-im/element-android/issues/7634))
+ - Voice Broadcast - Fix playback stuck in buffering mode ([#7646](https://github.com/vector-im/element-android/issues/7646))
+
+In development 🚧
+----------------
+ - Voice Broadcast - Handle redaction of the state events on the listener and recorder sides ([#7629](https://github.com/vector-im/element-android/issues/7629))
+ - Voice Broadcast - Update the buffering display in the timeline ([#7655](https://github.com/vector-im/element-android/issues/7655))
+ - Voice Broadcast - Remove voice messages related to a VB from the room attachments ([#7656](https://github.com/vector-im/element-android/issues/7656))
+
+SDK API changes ⚠️
+------------------
+ - Added support for read receipts in threads. Now user in a room can have multiple read receipts (one per thread + one in main thread + one without threadId) ([#6996](https://github.com/vector-im/element-android/issues/6996))
+ - Sync Filter now taking in account homeserver capabilities to not pass unsupported parameters.
+ Sync Filter is now configured by providing SyncFilterBuilder class instance, instead of Filter to identify Filter changes related to homeserver capabilities ([#7626](https://github.com/vector-im/element-android/issues/7626))
+
+Other changes
+-------------
+ - Remove usage of Buildkite. ([#7583](https://github.com/vector-im/element-android/issues/7583))
+ - Better validation of edits ([#7594](https://github.com/vector-im/element-android/issues/7594))
+
+
+Changes in Element v1.5.8 (2022-11-17)
+======================================
+
+Features ✨
+----------
+ - [Session manager] Multi-session signout ([#7418](https://github.com/vector-im/element-android/issues/7418))
+ - Rich text editor: add full screen mode. ([#7436](https://github.com/vector-im/element-android/issues/7436))
+ - [Rich text editor] Add plain text mode ([#7452](https://github.com/vector-im/element-android/issues/7452))
+ - Move TypingView inside the timeline items. ([#7496](https://github.com/vector-im/element-android/issues/7496))
+ - Push notifications toggle: align implementation for current session ([#7512](https://github.com/vector-im/element-android/issues/7512))
+ - Voice messages - Persist the playback position across different screens ([#7582](https://github.com/vector-im/element-android/issues/7582))
+
+Bugfixes 🐛
+----------
+ - [Voice Broadcast] Do not display the recorder view for a live broadcast started from another session ([#7431](https://github.com/vector-im/element-android/issues/7431))
+ - [Session manager] Hide push notification toggle when there is no server support ([#7457](https://github.com/vector-im/element-android/issues/7457))
+ - Fix rich text editor textfield not growing to fill parent on full screen. ([#7491](https://github.com/vector-im/element-android/issues/7491))
+ - Fix duplicated mention pills in some cases ([#7501](https://github.com/vector-im/element-android/issues/7501))
+ - Voice Broadcast - Fix duplicated voice messages in the internal playlist ([#7502](https://github.com/vector-im/element-android/issues/7502))
+ - When joining a room, the message composer is displayed once the room is loaded. ([#7509](https://github.com/vector-im/element-android/issues/7509))
+ - Voice Broadcast - Fix error on voice messages in unencrypted rooms ([#7519](https://github.com/vector-im/element-android/issues/7519))
+ - Fix description of verified sessions ([#7533](https://github.com/vector-im/element-android/issues/7533))
+
+In development 🚧
+----------------
+ - [Voice Broadcast] Improve timeline items factory and handle bad recording state display ([#7448](https://github.com/vector-im/element-android/issues/7448))
+ - [Voice Broadcast] Stop recording when opening the room after an app restart ([#7450](https://github.com/vector-im/element-android/issues/7450))
+ - [Voice Broadcast] Improve playlist fetching and player codebase ([#7478](https://github.com/vector-im/element-android/issues/7478))
+ - [Voice Broadcast] Display an error dialog if the user fails to start a voice broadcast ([#7485](https://github.com/vector-im/element-android/issues/7485))
+ - [Voice Broadcast] Add seekbar in listening tile ([#7496](https://github.com/vector-im/element-android/issues/7496))
+ - [Voice Broadcast] Improve the live indicator icon rendering in the timeline ([#7579](https://github.com/vector-im/element-android/issues/7579))
+ - Voice Broadcast - Add maximum length ([#7588](https://github.com/vector-im/element-android/issues/7588))
+
+SDK API changes ⚠️
+------------------
+ - [Metrics] Add `SpannableMetricPlugin` to support spans within transactions. ([#7514](https://github.com/vector-im/element-android/issues/7514))
+ - Fix a bug that caused messages with no formatted text to be quoted as "null". ([#7530](https://github.com/vector-im/element-android/issues/7530))
+ - If message content has no `formattedBody`, default to `body` when editing. ([#7574](https://github.com/vector-im/element-android/issues/7574))
+
+
Changes in Element v1.5.7 (2022-11-07)
======================================
diff --git a/README.md b/README.md
index 093f690aaa..4ad5ff5e5a 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Tchap Android
-Tchap Android v2 is an Android Matrix client. The app can be run on every Android devices with Android OS Lollipop and more (API 21).
+Tchap Android is an Android Matrix Client provided by [DINUM](https://tchap.beta.gouv.fr/). The app can be run on every Android devices with Android OS Lollipop and more (API 21).
[](https://play.google.com/store/apps/details?id=fr.gouv.tchap.a)
@@ -33,5 +33,3 @@ Also [this documentation](./docs/_developer_onboarding.md) can hopefully help de
Issues are triaged by community members and the Android App Team, following the [triage process](https://github.com/vector-im/element-meta/wiki/Triage-process).
We use [issue labels](https://github.com/vector-im/element-meta/wiki/Issue-labelling) to sort all incoming issues.
-
->>>>>>> v1.5.2
diff --git a/TCHAP_CHANGES.md b/TCHAP_CHANGES.md
index c6212a6505..c5137340c1 100644
--- a/TCHAP_CHANGES.md
+++ b/TCHAP_CHANGES.md
@@ -1,3 +1,17 @@
+Changes in Tchap 2.7.0 (2023-02-13)
+===================================
+
+Features ✨
+----------
+ - [Keys Management] Restore "Encrypted Message Recovery" when the key backup is enabled ([#814](https://github.com/tchapgouv/tchap-android-v2/issues/814))
+ - Enable cross signin and secure storage. ([#815](https://github.com/tchapgouv/tchap-android-v2/issues/815))
+
+Improvements 🙌
+--------------
+ - Rebase against Element-Android v1.5.11 ([#825](https://github.com/tchapgouv/tchap-android-v2/issues/825))
+ - Rebase against Element-Android v1.5.18 ([#826](https://github.com/tchapgouv/tchap-android-v2/issues/826))
+
+
Changes in Tchap 2.6.1 (2023-02-10)
===================================
diff --git a/build.gradle b/build.gradle
index c004149a4d..2a13a2fca2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -24,12 +24,12 @@ buildscript {
classpath libs.gradle.gradlePlugin
classpath libs.gradle.kotlinPlugin
classpath libs.gradle.hiltPlugin
- classpath 'com.google.firebase:firebase-appdistribution-gradle:3.0.3'
+ classpath 'com.google.firebase:firebase-appdistribution-gradle:3.1.1'
classpath 'com.google.gms:google-services:4.3.14'
- classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.4.0.2513'
+ classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.5.0.2730'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.5'
classpath "com.likethesalad.android:stem-plugin:2.2.3"
- classpath 'org.owasp:dependency-check-gradle:7.3.0'
+ classpath 'org.owasp:dependency-check-gradle:7.4.1'
classpath "org.jetbrains.dokka:dokka-gradle-plugin:1.7.20"
classpath "org.jetbrains.kotlinx:kotlinx-knit:0.4.0"
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.3'
@@ -43,12 +43,12 @@ plugins {
// ktlint Plugin
id "org.jlleitschuh.gradle.ktlint" version "11.0.0"
// Detekt
- id "io.gitlab.arturbosch.detekt" version "1.21.0"
+ id "io.gitlab.arturbosch.detekt" version "1.22.0"
// Ksp
- id "com.google.devtools.ksp" version "1.7.20-1.0.7"
+ id "com.google.devtools.ksp" version "1.7.22-1.0.8"
// Dependency Analysis
- id 'com.autonomousapps.dependency-analysis' version "1.13.1"
+ id 'com.autonomousapps.dependency-analysis' version "1.17.0"
// Gradle doctor
id "com.osacky.doctor" version "0.8.1"
}
diff --git a/coverage.gradle b/coverage.gradle
index f6ce9db551..2ce4645f28 100644
--- a/coverage.gradle
+++ b/coverage.gradle
@@ -82,7 +82,7 @@ task unitTestsWithCoverage(type: GradleBuild) {
// the 7.1.3 android gradle plugin has a bug where enableTestCoverage generates invalid coverage
startParameter.projectProperties.coverage = [enableTestCoverage: false]
// Tchap: Specify variant for every module
- tasks = [':matrix-sdk-android:testDebugUnitTest', ':vector:testGplayBtchapWithoutvoipWithoutpinningDebugUnitTest', ':vector-app:testGplayBtchapWithoutvoipWithoutpinningDebugUnitTest', ':vector-config:testBtchapDebugUnitTest']
+ tasks = [':matrix-sdk-android:testDebugUnitTest', ':vector:testGplayBtchapWithoutvoipWithoutpinningDebugUnitTest', ':vector-app:testGplayBtchapWithoutvoipWithoutpinningDebugUnitTest', ':vector-config:testBtchapWithoutvoipDebugUnitTest']
}
task instrumentationTestsWithCoverage(type: GradleBuild) {
diff --git a/dependencies.gradle b/dependencies.gradle
index 33a2096a43..b81c1c2017 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -8,16 +8,16 @@ ext.versions = [
def gradle = "7.3.1"
// Ref: https://kotlinlang.org/releases.html
-def kotlin = "1.7.20"
+def kotlin = "1.7.22"
def kotlinCoroutines = "1.6.4"
-def dagger = "2.44"
+def dagger = "2.44.2"
def appDistribution = "16.0.0-beta05"
def retrofit = "2.9.0"
def markwon = "4.6.2"
def moshi = "1.14.0"
def lifecycle = "2.5.1"
def flowBinding = "1.2.0"
-def flipper = "0.171.1"
+def flipper = "0.176.0"
def epoxy = "5.0.0"
def mavericks = "3.0.1"
def glide = "4.14.2"
@@ -26,13 +26,13 @@ def jjwt = "0.11.5"
// Temporary version to unblock #6929. Once 0.16.0 is released we should use it, and revert
// the whole commit which set version 0.16.0-SNAPSHOT
def vanniktechEmoji = "0.16.0-SNAPSHOT"
-def sentry = "6.6.0"
-def fragment = "1.5.4"
+def sentry = "6.9.2"
+def fragment = "1.5.5"
// Testing
def mockk = "1.12.3" // We need to use 1.12.3 to have mocking in androidTest until a new version is released: https://github.com/mockk/mockk/issues/819
def espresso = "3.4.0"
def androidxTest = "1.4.0"
-def androidxOrchestrator = "1.4.1"
+def androidxOrchestrator = "1.4.2"
def paparazzi = "1.1.0"
ext.libs = [
@@ -83,7 +83,7 @@ ext.libs = [
'appdistributionApi' : "com.google.firebase:firebase-appdistribution-api-ktx:$appDistribution",
'appdistribution' : "com.google.firebase:firebase-appdistribution:$appDistribution",
// Phone number https://github.com/google/libphonenumber
- 'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.12.57"
+ 'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.13.3"
],
dagger : [
'dagger' : "com.google.dagger:dagger:$dagger",
@@ -98,7 +98,7 @@ ext.libs = [
],
element : [
'opusencoder' : "io.element.android:opusencoder:1.1.0",
- 'wysiwyg' : "io.element.android:wysiwyg:0.2.1"
+ 'wysiwyg' : "io.element.android:wysiwyg:0.10.0"
],
squareup : [
'moshi' : "com.squareup.moshi:moshi:$moshi",
@@ -129,7 +129,7 @@ ext.libs = [
'mavericksTesting' : "com.airbnb.android:mavericks-testing:$mavericks"
],
maplibre : [
- 'androidSdk' : "org.maplibre.gl:android-sdk:9.5.2",
+ 'androidSdk' : "org.maplibre.gl:android-sdk:9.6.0",
'pluginAnnotation' : "org.maplibre.gl:android-plugin-annotation-v9:1.0.0"
],
mockk : [
diff --git a/docs/database_migration_test.md b/docs/database_migration_test.md
new file mode 100644
index 0000000000..f7844abde8
--- /dev/null
+++ b/docs/database_migration_test.md
@@ -0,0 +1,55 @@
+
+
+* [Testing database migration](#testing-database-migration)
+ * [Creating a reference database](#creating-a-reference-database)
+ * [Testing](#testing)
+
+
+
+## Testing database migration
+
+### Creating a reference database
+
+Databases are encrypted, the key to decrypt is needed to setup the test.
+A special build property must be enabled to extract it.
+
+Set `vector.debugPrivateData=true` in `~/.gradle/gradle.properties` (to avoid committing by mistake)
+
+Launch the app in your emulator, login and use the app to fill up the database.
+
+Save the key for the tested database
+```
+RealmKeysUtils W Database key for alias `session_db_fe9f212a611ccf6dea1141777065ed0a`: 935a6dfa0b0fc5cce1414194ed190....
+RealmKeysUtils W Database key for alias `crypto_module_fe9f212a611ccf6dea1141777065ed0a`: 7b9a21a8a311e85d75b069a343.....
+```
+
+
+Use the [Device File Explorer](https://developer.android.com/studio/debug/device-file-explorer) to extrat the database file from the emulator.
+
+Go to `data/data/im.vector.app.debug/files//`
+Pick the database you want to test (name can be found in SessionRealmConfigurationFactory):
+ - crypto_store.realm for crypto
+ - disk_store.realm for session
+ - etc...
+
+Download the file on your disk
+
+### Testing
+
+Copy the file in `src/AndroidTest/assets`
+
+see `CryptoSanityMigrationTest` or `RealmSessionStoreMigration43Test` for sample tests.
+
+There are already some databases in the assets folder.
+The existing test will properly detect schema changes, and fail with such errors if a migration is missing:
+
+```
+io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
+- Property 'CryptoMetadataEntity.foo' has been added.
+```
+
+If you want to test properly more complex database migration (dynamic transforms) ensure that the database contains
+the entity you want to migrate.
+
+You can explore the database with [realm studio](https://www.mongodb.com/docs/realm/studio/) if needed.
+
diff --git a/docs/installing_from_ci.md b/docs/installing_from_ci.md
new file mode 100644
index 0000000000..01fb4afef2
--- /dev/null
+++ b/docs/installing_from_ci.md
@@ -0,0 +1,52 @@
+## Installing from CI
+
+
+
+ * [Installing from Buildkite](#installing-from-buildkite)
+ * [Installing from GitHub](#installing-from-github)
+ * [Create a GitHub token](#create-a-github-token)
+ * [Provide artifact URL](#provide-artifact-url)
+ * [Next steps](#next-steps)
+ * [Future improvement](#future-improvement)
+
+
+
+Installing APK build by the CI is possible
+
+### Installing from Buildkite
+
+The script `./tools/install/installFromBuildkite.sh` can be used, but Builkite will be removed soon. See next section.
+
+### Installing from GitHub
+
+To install an APK built by a GitHub action, run the script `./tools/install/installFromGitHub.sh`. You will need to pass a GitHub token to do so.
+
+#### Create a GitHub token
+
+You can create a GitHub token going to your Github account, at this page: [https://github.com/settings/tokens](https://github.com/settings/tokens).
+
+You need to create a token (classic) with the scope `repo/public_repo`. So just check the corresponding checkbox.
+Validity can be long since the scope of this token is limited. You will still be able to delete the token and generate a new one.
+Click on Generate token and save the token locally.
+
+### Provide artifact URL
+
+The script will ask for an artifact URL. You can get this artifact URL by following these steps:
+
+- open the pull request
+- in the check at the bottom, click on `APK Build / Build debug APKs`
+- click on `Summary`
+- scroll to the bottom of the page
+- copy the link `vector-Fdroid-debug` if you want the F-Droid variant or `vector-Gplay-debug` if you want the Gplay variant.
+
+The copied link can be provided to the script.
+
+### Next steps
+
+The script will download the artifact, unzip it and install the correct version (regarding arch) on your device.
+
+Files will be added to the folder `./tmp/DebugApks`. Feel free to cleanup this folder from time to time, the script will not delete files.
+
+### Future improvement
+
+The script could ask the user for a Pull Request number and Gplay/Fdroid choice like it was done with Buildkite script. Using GitHub API may be possible to do that.
diff --git a/fastlane/metadata/android/az/short_description.txt b/fastlane/metadata/android/az/short_description.txt
new file mode 100644
index 0000000000..ecf3d5008c
--- /dev/null
+++ b/fastlane/metadata/android/az/short_description.txt
@@ -0,0 +1 @@
+Qrup mesajlaşma - şifrəli mesajlaşma, qrup söhbəti və video zənglər
diff --git a/fastlane/metadata/android/az/title.txt b/fastlane/metadata/android/az/title.txt
new file mode 100644
index 0000000000..4ca0ffb55b
--- /dev/null
+++ b/fastlane/metadata/android/az/title.txt
@@ -0,0 +1 @@
+Element - Təhlükəsiz Mesajlaşma
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105060.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105060.txt
new file mode 100644
index 0000000000..e966dbbd92
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: nové uživatelské rozhraní pro výběr přílohy.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105070.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105070.txt
new file mode 100644
index 0000000000..e966dbbd92
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: nové uživatelské rozhraní pro výběr přílohy.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105080.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105080.txt
new file mode 100644
index 0000000000..90210199a1
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: opravy různých chyb a vylepšení.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40105100.txt b/fastlane/metadata/android/cs-CZ/changelogs/40105100.txt
new file mode 100644
index 0000000000..8c51742e06
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Nová implementace celoobrazovkového režimu pro editor formátovaného textu a opravy chyb.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/de-DE/changelogs/40105060.txt b/fastlane/metadata/android/de-DE/changelogs/40105060.txt
new file mode 100644
index 0000000000..0b36faff1e
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Die wichtigste Änderung in dieser Version: Neues Anhangauswahl-UI.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/de-DE/changelogs/40105070.txt b/fastlane/metadata/android/de-DE/changelogs/40105070.txt
new file mode 100644
index 0000000000..3141cea7cb
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Die wichtigste Änderung in dieser Version: Neue Anhangauswahl-Oberfläche.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/de-DE/changelogs/40105080.txt b/fastlane/metadata/android/de-DE/changelogs/40105080.txt
new file mode 100644
index 0000000000..0422f9cd4f
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Die wichtigsten Änderungen in dieser Version: Fehlerbehebungen und Verbesserungen.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/de-DE/changelogs/40105100.txt b/fastlane/metadata/android/de-DE/changelogs/40105100.txt
new file mode 100644
index 0000000000..de5f4d90e8
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+Die wichtigsten Änderungen in dieser Version: Der Vollbildmodus des Textverarbeitungseditors wurde neu umgesetzt und es wurden diverse Fehler behoben.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105080.txt b/fastlane/metadata/android/en-US/changelogs/40105080.txt
new file mode 100644
index 0000000000..f9ca8cdd7c
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Main changes in this version: bug fixes and improvements.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105100.txt b/fastlane/metadata/android/en-US/changelogs/40105100.txt
new file mode 100644
index 0000000000..c9e5ba5fa9
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+Main changes in this version: New implementation of the full screen mode for the Rich Text Editor and bugfixes.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105110.txt b/fastlane/metadata/android/en-US/changelogs/40105110.txt
new file mode 100644
index 0000000000..c9e5ba5fa9
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105110.txt
@@ -0,0 +1,2 @@
+Main changes in this version: New implementation of the full screen mode for the Rich Text Editor and bugfixes.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105120.txt b/fastlane/metadata/android/en-US/changelogs/40105120.txt
new file mode 100644
index 0000000000..91c25cf053
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105120.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Thread are now enabled by default.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105130.txt b/fastlane/metadata/android/en-US/changelogs/40105130.txt
new file mode 100644
index 0000000000..91c25cf053
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105130.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Thread are now enabled by default.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105140.txt b/fastlane/metadata/android/en-US/changelogs/40105140.txt
new file mode 100644
index 0000000000..91c25cf053
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105140.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Thread are now enabled by default.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105160.txt b/fastlane/metadata/android/en-US/changelogs/40105160.txt
new file mode 100644
index 0000000000..91c25cf053
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105160.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Thread are now enabled by default.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40105180.txt b/fastlane/metadata/android/en-US/changelogs/40105180.txt
new file mode 100644
index 0000000000..91c25cf053
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40105180.txt
@@ -0,0 +1,2 @@
+Main changes in this version: Thread are now enabled by default.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/et/changelogs/40105060.txt b/fastlane/metadata/android/et/changelogs/40105060.txt
new file mode 100644
index 0000000000..d5606e24b3
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: uus liides manuste lisamiseks.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/et/changelogs/40105070.txt b/fastlane/metadata/android/et/changelogs/40105070.txt
new file mode 100644
index 0000000000..061e09814d
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: uus liides manuste valimiseks.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/et/changelogs/40105080.txt b/fastlane/metadata/android/et/changelogs/40105080.txt
new file mode 100644
index 0000000000..37b9a2cfe5
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: erinevate vigade parandused ja kohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/et/changelogs/40105100.txt b/fastlane/metadata/android/et/changelogs/40105100.txt
new file mode 100644
index 0000000000..f6212db01b
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: tekstitoimeti täisekraanivaade ja erinevate vigade parandused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fa/changelogs/40105060.txt b/fastlane/metadata/android/fa/changelogs/40105060.txt
new file mode 100644
index 0000000000..b677c05c89
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: رابط کاربری جدید برای گزینش پیوست.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fa/changelogs/40105070.txt b/fastlane/metadata/android/fa/changelogs/40105070.txt
new file mode 100644
index 0000000000..b677c05c89
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: رابط کاربری جدید برای گزینش پیوست.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fa/changelogs/40105080.txt b/fastlane/metadata/android/fa/changelogs/40105080.txt
new file mode 100644
index 0000000000..91385addde
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: رفع اشکالها و بهبود.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40105060.txt b/fastlane/metadata/android/fr-FR/changelogs/40105060.txt
new file mode 100644
index 0000000000..b33f290d0d
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : nouvelle interface de sélection d’une pièce jointe.
+Intégralité des changements : https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40105070.txt b/fastlane/metadata/android/fr-FR/changelogs/40105070.txt
new file mode 100644
index 0000000000..b33f290d0d
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : nouvelle interface de sélection d’une pièce jointe.
+Intégralité des changements : https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40105080.txt b/fastlane/metadata/android/fr-FR/changelogs/40105080.txt
new file mode 100644
index 0000000000..d33197c270
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : corrections de bugs et améliorations.
+Intégralité des changements : https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/id/changelogs/40105060.txt b/fastlane/metadata/android/id/changelogs/40105060.txt
new file mode 100644
index 0000000000..32fb87563e
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Antarmuka baru untuk memilih sebuah lampiran.
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/id/changelogs/40105070.txt b/fastlane/metadata/android/id/changelogs/40105070.txt
new file mode 100644
index 0000000000..32fb87563e
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Antarmuka baru untuk memilih sebuah lampiran.
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/id/changelogs/40105080.txt b/fastlane/metadata/android/id/changelogs/40105080.txt
new file mode 100644
index 0000000000..8384716bbc
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: perbaikan kutu dan fitur
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/id/changelogs/40105100.txt b/fastlane/metadata/android/id/changelogs/40105100.txt
new file mode 100644
index 0000000000..0c7d2f5262
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Penerapan baru mode layar penuh untuk Penyunting Teks Kaya dan perbaikan kutu.
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/it-IT/changelogs/40105060.txt b/fastlane/metadata/android/it-IT/changelogs/40105060.txt
new file mode 100644
index 0000000000..34d299b774
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: nuova interfaccia utente per selezionare un allegato!
+Cronologia completa: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/it-IT/changelogs/40105070.txt b/fastlane/metadata/android/it-IT/changelogs/40105070.txt
new file mode 100644
index 0000000000..ec4d944d72
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: nuova interfaccia utente per selezionare un allegato.
+Cronologia completa: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/it-IT/changelogs/40105080.txt b/fastlane/metadata/android/it-IT/changelogs/40105080.txt
new file mode 100644
index 0000000000..a3d49ca1b7
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: correzione di errori e miglioramenti.
+Cronologia completa: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40105060.txt b/fastlane/metadata/android/pt-BR/changelogs/40105060.txt
new file mode 100644
index 0000000000..108a8a88b4
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: novo UI para selecionar um anexo.
+Changelog completo: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40105070.txt b/fastlane/metadata/android/pt-BR/changelogs/40105070.txt
new file mode 100644
index 0000000000..108a8a88b4
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: novo UI para selecionar um anexo.
+Changelog completo: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40105080.txt b/fastlane/metadata/android/pt-BR/changelogs/40105080.txt
new file mode 100644
index 0000000000..6e85b9ba6a
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: consertos de bugs e melhorias.
+Changelog completo: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104260.txt b/fastlane/metadata/android/ru-RU/changelogs/40104260.txt
new file mode 100644
index 0000000000..b023e07b3d
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40104260.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Использование UnifiedPush и разрешение пользователям получать push-оповещения без FCM.
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104270.txt b/fastlane/metadata/android/ru-RU/changelogs/40104270.txt
new file mode 100644
index 0000000000..ff4e5cdf15
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40104270.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Исправления различных багов и улучшения стабильности работы.
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104280.txt b/fastlane/metadata/android/ru-RU/changelogs/40104280.txt
new file mode 100644
index 0000000000..ff4e5cdf15
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40104280.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Исправления различных багов и улучшения стабильности работы.
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104300.txt b/fastlane/metadata/android/ru-RU/changelogs/40104300.txt
new file mode 100644
index 0000000000..aec45e0348
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40104300.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Улучшены вход и регистрация
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104310.txt b/fastlane/metadata/android/ru-RU/changelogs/40104310.txt
new file mode 100644
index 0000000000..aec45e0348
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40104310.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Улучшены вход и регистрация
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40104320.txt b/fastlane/metadata/android/ru-RU/changelogs/40104320.txt
new file mode 100644
index 0000000000..d6c614f22b
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40104320.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: Исправления различных багов и улучшения стабильности работы
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40105000.txt b/fastlane/metadata/android/ru-RU/changelogs/40105000.txt
new file mode 100644
index 0000000000..93ea0aff68
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40105000.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: отложённые личные сообщения включены по умолчанию
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40105060.txt b/fastlane/metadata/android/ru-RU/changelogs/40105060.txt
new file mode 100644
index 0000000000..234d265dd8
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: новый интерфейс для выбора прикреплённых файлов
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/ru-RU/changelogs/40105070.txt b/fastlane/metadata/android/ru-RU/changelogs/40105070.txt
new file mode 100644
index 0000000000..234d265dd8
--- /dev/null
+++ b/fastlane/metadata/android/ru-RU/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Основные изменения в этой версии: новый интерфейс для выбора прикреплённых файлов
+Полный список изменений: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sk/changelogs/40105060.txt b/fastlane/metadata/android/sk/changelogs/40105060.txt
new file mode 100644
index 0000000000..0d1d4965ca
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: nové používateľské rozhranie na výber príloh.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sk/changelogs/40105070.txt b/fastlane/metadata/android/sk/changelogs/40105070.txt
new file mode 100644
index 0000000000..0d1d4965ca
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: nové používateľské rozhranie na výber príloh.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sk/changelogs/40105080.txt b/fastlane/metadata/android/sk/changelogs/40105080.txt
new file mode 100644
index 0000000000..56daa3b4b7
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: opravy chýb a vylepšenia.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sk/changelogs/40105100.txt b/fastlane/metadata/android/sk/changelogs/40105100.txt
new file mode 100644
index 0000000000..c286f155d4
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Nová implementácia celo-obrazovkového režimu pre Rozšírený textový editor a opravy chýb.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104120.txt b/fastlane/metadata/android/sq/changelogs/40104120.txt
new file mode 100644
index 0000000000..f93220235b
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104120.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: U lejon përdoruesve të shfaqen si jo në linjë dhe shton një lojtës audio për bashkëngjitje audio
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104130.txt b/fastlane/metadata/android/sq/changelogs/40104130.txt
new file mode 100644
index 0000000000..f93220235b
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104130.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: U lejon përdoruesve të shfaqen si jo në linjë dhe shton një lojtës audio për bashkëngjitje audio
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104140.txt b/fastlane/metadata/android/sq/changelogs/40104140.txt
new file mode 100644
index 0000000000..c8b2eb09ab
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104140.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Përmirësim i administrimit të përdoruesve të shpërfillur. Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104160.txt b/fastlane/metadata/android/sq/changelogs/40104160.txt
new file mode 100644
index 0000000000..987197f0f6
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104160.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Administrim më i mirë i mesazheve të fshehtëzuar. Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104180.txt b/fastlane/metadata/android/sq/changelogs/40104180.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104180.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104190.txt b/fastlane/metadata/android/sq/changelogs/40104190.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104190.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104200.txt b/fastlane/metadata/android/sq/changelogs/40104200.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104200.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104220.txt b/fastlane/metadata/android/sq/changelogs/40104220.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104220.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104230.txt b/fastlane/metadata/android/sq/changelogs/40104230.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104230.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104240.txt b/fastlane/metadata/android/sq/changelogs/40104240.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104240.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104250.txt b/fastlane/metadata/android/sq/changelogs/40104250.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104250.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104260.txt b/fastlane/metadata/android/sq/changelogs/40104260.txt
new file mode 100644
index 0000000000..c5ffad38c9
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104260.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Përdorim i UnifiedPush dhe lejim i përdoruesve të kenë push pa FCM.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104270.txt b/fastlane/metadata/android/sq/changelogs/40104270.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104270.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104280.txt b/fastlane/metadata/android/sq/changelogs/40104280.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104280.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104300.txt b/fastlane/metadata/android/sq/changelogs/40104300.txt
new file mode 100644
index 0000000000..6c1be8f556
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104300.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Bërje e mundur hapash të përmirësuar hyrje dhe dalje nga llogaria.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104310.txt b/fastlane/metadata/android/sq/changelogs/40104310.txt
new file mode 100644
index 0000000000..6c1be8f556
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104310.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Bërje e mundur hapash të përmirësuar hyrje dhe dalje nga llogaria.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104320.txt b/fastlane/metadata/android/sq/changelogs/40104320.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104320.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104340.txt b/fastlane/metadata/android/sq/changelogs/40104340.txt
new file mode 100644
index 0000000000..87f801d1f4
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Ndreqje të metash dhe përmirësime të ndryshme qëndrueshmërie.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40104360.txt b/fastlane/metadata/android/sq/changelogs/40104360.txt
new file mode 100644
index 0000000000..ef9251a497
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40104360.txt
@@ -0,0 +1,3 @@
+Skema e re e Aplikacionit mund të aktivizohet që nga rregullimet Labs. Ju lutemi, provojeni!
+Ndreqje problemesh me njoftim që mungon dhe njëkohësim i gjatë shtues.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40105000.txt b/fastlane/metadata/android/sq/changelogs/40105000.txt
new file mode 100644
index 0000000000..2ee2ded823
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40105000.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Hedhje poshtë MD e aktivizuar, si parazgjedhje.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40105020.txt b/fastlane/metadata/android/sq/changelogs/40105020.txt
new file mode 100644
index 0000000000..26647d519f
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40105020.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Skema e re e aplikacionit e aktivizuar, si parazgjedhje!
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40105040.txt b/fastlane/metadata/android/sq/changelogs/40105040.txt
new file mode 100644
index 0000000000..4e38434f89
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40105040.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: Veçori të reja nën rregullimet Labs: hartues teksti të pasur, administrim i ri pajisjesh, transmetim zanor. Ende nën zhvillim aktivt!
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40105060.txt b/fastlane/metadata/android/sq/changelogs/40105060.txt
new file mode 100644
index 0000000000..eb300bafed
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: ndërfaqe e re UI për përzgjedhjen e një bashkëngjitjeje!
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40105070.txt b/fastlane/metadata/android/sq/changelogs/40105070.txt
new file mode 100644
index 0000000000..f4beb912a5
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë verson: ndërfaqe UI e re për përzgjedhje të një bashkëngjitjeje.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sq/changelogs/40105080.txt b/fastlane/metadata/android/sq/changelogs/40105080.txt
new file mode 100644
index 0000000000..b059e86cbd
--- /dev/null
+++ b/fastlane/metadata/android/sq/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Ndryshimet kryesore në këtë version: ndreqje të metash dhe përmirësime.
+Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40105060.txt b/fastlane/metadata/android/sv-SE/changelogs/40105060.txt
new file mode 100644
index 0000000000..d64984fcfb
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: nytt gränssnitt för val av bilaga.
+Full ändringslogg: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40105070.txt b/fastlane/metadata/android/sv-SE/changelogs/40105070.txt
new file mode 100644
index 0000000000..d64984fcfb
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: nytt gränssnitt för val av bilaga.
+Full ändringslogg: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sv-SE/changelogs/40105080.txt b/fastlane/metadata/android/sv-SE/changelogs/40105080.txt
new file mode 100644
index 0000000000..cee589ed35
--- /dev/null
+++ b/fastlane/metadata/android/sv-SE/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Huvudsakliga ändringar i den här versionen: buggfixar och förbättringar.
+Full ändringslogg: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/uk/changelogs/40105040.txt b/fastlane/metadata/android/uk/changelogs/40105040.txt
index bbc005f84c..b3327f68ab 100644
--- a/fastlane/metadata/android/uk/changelogs/40105040.txt
+++ b/fastlane/metadata/android/uk/changelogs/40105040.txt
@@ -1,2 +1,2 @@
-Основні зміни в цій версії: Нові можливості в налаштуваннях лабораторії: Текстовий редактор, нове керування пристроями, голосові повідомлення. Досі в активній розробці!
+Основні зміни в цій версії: Нові можливості в налаштуваннях лабораторії: Текстовий редактор, нове керування пристроями, голосові трансляції. Досі в активній розробці!
Список усіх змін: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/uk/changelogs/40105060.txt b/fastlane/metadata/android/uk/changelogs/40105060.txt
new file mode 100644
index 0000000000..4be635901f
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: новий інтерфейс для вибору вкладення.
+Перелік усіх змін: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/uk/changelogs/40105070.txt b/fastlane/metadata/android/uk/changelogs/40105070.txt
new file mode 100644
index 0000000000..65254059c5
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: новий інтерфейс для вибору вкладень.
+Перелік усіх змін: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/uk/changelogs/40105080.txt b/fastlane/metadata/android/uk/changelogs/40105080.txt
new file mode 100644
index 0000000000..e6f6384a5f
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: усування вад і вдосконалення.
+Перелік усіх змін: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/uk/changelogs/40105100.txt b/fastlane/metadata/android/uk/changelogs/40105100.txt
new file mode 100644
index 0000000000..6bb3ab95c7
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: Нова реалізація повноекранного режиму для редактора розширеного тексту та виправлення помилок.
+Перелік усіх змін: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105060.txt b/fastlane/metadata/android/zh-TW/changelogs/40105060.txt
new file mode 100644
index 0000000000..56667ccfc0
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40105060.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:選取附件的新使用者介面。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105070.txt b/fastlane/metadata/android/zh-TW/changelogs/40105070.txt
new file mode 100644
index 0000000000..56667ccfc0
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40105070.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:選取附件的新使用者介面。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105080.txt b/fastlane/metadata/android/zh-TW/changelogs/40105080.txt
new file mode 100644
index 0000000000..2a368ec8be
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40105080.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:臭蟲修復與改善。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40105100.txt b/fastlane/metadata/android/zh-TW/changelogs/40105100.txt
new file mode 100644
index 0000000000..20341b84fe
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40105100.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:格式化文字編輯器的全螢幕模式新實作與臭蟲修復。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 249e5832f0..943f0cbfa7 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 f7189a776c..bc073f6761 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=db9c8211ed63f61f60292c69e80d89196f9eb36665e369e7f00ac4cc841c2219
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-all.zip
+distributionSha256Sum=312eb12875e1747e05c2f81a4789902d7e4ec5defbd1eefeaccc08acf096505d
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip
+networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
index a69d9cb6c2..65dcd68d65 100755
--- a/gradlew
+++ b/gradlew
@@ -55,7 +55,7 @@
# 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
+# https://github.com/gradle/gradle/blob/HEAD/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/.
@@ -80,10 +80,10 @@ do
esac
done
-APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
-
-APP_NAME="Gradle"
+# This is normally unused
+# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
+APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# 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"'
@@ -143,12 +143,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
diff --git a/gradlew.bat b/gradlew.bat
index 53a6b238d4..6689b85bee 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -26,6 +26,7 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
diff --git a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt
index 92d28d26c9..07c7b4588f 100644
--- a/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt
+++ b/library/attachment-viewer/src/main/java/im/vector/lib/attachmentviewer/VideoViewHolder.kt
@@ -103,14 +103,12 @@ class VideoViewHolder constructor(itemView: View) :
views.videoView.setOnPreparedListener {
stopTimer()
countUpTimer = CountUpTimer(100).also {
- it.tickListener = object : CountUpTimer.TickListener {
- override fun onTick(milliseconds: Long) {
- val duration = views.videoView.duration
- val progress = views.videoView.currentPosition
- val isPlaying = views.videoView.isPlaying
-// Log.v("FOO", "isPlaying $isPlaying $progress/$duration")
- eventListener?.get()?.onEvent(AttachmentEvents.VideoEvent(isPlaying, progress, duration))
- }
+ it.tickListener = CountUpTimer.TickListener {
+ val duration = views.videoView.duration
+ val progress = views.videoView.currentPosition
+ val isPlaying = views.videoView.isPlaying
+ // Log.v("FOO", "isPlaying $isPlaying $progress/$duration")
+ eventListener?.get()?.onEvent(AttachmentEvents.VideoEvent(isPlaying, progress, duration))
}
it.resume()
}
diff --git a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt
index e9d311fe03..a4fd8bb4e1 100644
--- a/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt
+++ b/library/core-utils/src/main/java/im/vector/lib/core/utils/timer/CountUpTimer.kt
@@ -66,7 +66,7 @@ class CountUpTimer(private val intervalInMs: Long = 1_000) {
coroutineScope.cancel()
}
- interface TickListener {
+ fun interface TickListener {
fun onTick(milliseconds: Long)
}
}
diff --git a/library/ui-strings/src/main/res/values-ar/strings.xml b/library/ui-strings/src/main/res/values-ar/strings.xml
index 70b9a33ab5..a49ecc3d08 100644
--- a/library/ui-strings/src/main/res/values-ar/strings.xml
+++ b/library/ui-strings/src/main/res/values-ar/strings.xml
@@ -1167,4 +1167,12 @@
البريد الإلكتروني
كلمة السر الجديدة
التالي
-
+
+ - صفر
+ - واحد
+ - اثنان
+ - قليلة
+ - كثيرة
+ - اخرى
+
+
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-az/strings.xml b/library/ui-strings/src/main/res/values-az/strings.xml
index 044ecf900c..6fe322bdd0 100644
--- a/library/ui-strings/src/main/res/values-az/strings.xml
+++ b/library/ui-strings/src/main/res/values-az/strings.xml
@@ -20,7 +20,7 @@
%s səsli zəng etdi.
%s zəngə cavab verdi.
%s zəng başa çatdı.
- "%1$s gələcək otaq tarixçəsini %2$s-ə görünən etdi"
+ %1$s gələcək otaq tarixçəsini %2$s-ə görünən etdi
bütün otaq üzvləri, dəvət olunduğu andan.
bütün otaq üzvləri, qoşulduğu andan.
bütün otaq üzvləri.
@@ -48,8 +48,9 @@
\nKriptografiyanın idxalı
İlkin sinxronizasiya:
\nOtaqlar idxalı
- İlkin sinxronizasiya:
-\nOtaqlara daxil olmaq
+ İlkin sinxronizasiya:
+\nSöhbətləriniz yüklənilir
+\nƏgər çoxlu otaqlara qoşulmusunuzsa, bu, bir az vaxt apara bilər
İlkin sinxronizasiya:
\nDəvət olunmuş otaqların idxalı
İlkin sinxronizasiya:
@@ -133,4 +134,6 @@
Otağa qoşulmaq üçün %1$s-a dəvət göndərdiniz
%s, bu otaq üçün server ACL-lərini dəyişdi.
• %s ilə uyğunlaşan serverlərə icazə verildi.
+ Siz %1$s üçün otağa qoşulmaq dəvətin ləğv etdiniz
+ %1$s-ı dəvət etdiniz
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-ca/strings.xml b/library/ui-strings/src/main/res/values-ca/strings.xml
index ce786fb87d..7e3e019ee5 100644
--- a/library/ui-strings/src/main/res/values-ca/strings.xml
+++ b/library/ui-strings/src/main/res/values-ca/strings.xml
@@ -2836,4 +2836,7 @@
Adjunts
Adhesius
Galeria
+ Format de text
+ Enrere 30 segons
+ Avança 30 segons
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-cs/strings.xml b/library/ui-strings/src/main/res/values-cs/strings.xml
index 53599adce2..67cc3353aa 100644
--- a/library/ui-strings/src/main/res/values-cs/strings.xml
+++ b/library/ui-strings/src/main/res/values-cs/strings.xml
@@ -2789,7 +2789,7 @@
Pravost této šifrované zprávy nelze v tomto zařízení zaručit.
Požadujte, aby klávesnice neaktualizovala žádné personalizované údaje, jako je historie psaní a slovník, na základě toho, co jste napsali v konverzacích. Upozorňujeme, že některé klávesnice nemusí toto nastavení respektovat.
Inkognito klávesnice
- Přidá znaky (╯°□°)╯︵ ┻━┻ před zprávy ve formátu obyčejného textu
+ Přidá znaky (╯°□°)╯︵ ┻━┻ před zprávy ve formátu prostého textu
Hlasové vysílání
Otevřít nástroje pro vývojáře
🔒 V nastavení zabezpečení jste povolili šifrování pouze do ověřených relací pro všechny místnosti.
@@ -2824,8 +2824,8 @@
${app_name} potřebuje oprávnění k zobrazování oznámení. Oznámení mohou zobrazovat vaše zprávy, pozvánky atd.
\n
\nPro zobrazování oznámení povolte přístup na dalších vyskakovacích oknech.
- Vyzkoušejte rozšířený textový editor (textový režim již brzy)
- Povolit rozšířený textový editor
+ Vyzkoušejte editor formátovaného textu (režim prostého textu již brzy)
+ Povolit editor formátovaného textu
Ujistěte se, že znáte původ tohoto kódu. Propojením zařízení poskytnete někomu plný přístup ke svému účtu.
Potvrdit
Zkuste to znovu
@@ -2868,7 +2868,7 @@
Druhé zařízení je již přihlášeno.
Při nastavování zabezpečeného zasílání zpráv se vyskytl problém se zabezpečením. Může být napadena jedna z následujících věcí: váš domovský server; vaše internetové připojení; vaše zařízení;
Žádost se nezdařila.
- Ukládání do vyrovnávací paměti
+ Ukládání do vyrovnávací paměti…
Pozastavit hlasové vysílání
Přehrát nebo obnovit hlasové vysílání
Ukončit záznam hlasového vysílání
@@ -2891,4 +2891,37 @@
- %1$d vybrané
- %1$d vybraných
+ Přepnutí režimu celé obrazovky
+ Formátování textu
+ Již nahráváte hlasové vysílání. Ukončete prosím aktuální hlasové vysílání a zahajte nové.
+ Hlasové vysílání už nahrává někdo jiný. Počkejte, až jeho hlasové vysílání skončí, a zahajte nové.
+ Nemáte potřebná oprávnění k zahájení hlasového vysílání v této místnosti. Obraťte se na správce místnosti, aby vám zvýšil oprávnění.
+ Nelze zahájit nové hlasové vysílání
+ Přetočení o 30 sekund zpět
+ Přetočení o 30 sekund dopředu
+ Ověřené relace jsou všude tam, kde tento účet používáte po zadání přístupové fráze nebo po potvrzení své totožnosti jinou ověřenou relací.
+\n
+\nTo znamená, že máte všechny klíče potřebné k odemknutí zašifrovaných zpráv a potvrzení ostatním uživatelům, že této relaci důvěřujete.
+
+ - Odhlásit se z %1$d relace
+ - Odhlásit se ze %1$d relací
+ - Odhlásit se z %1$d relací
+
+ Odhlásit se
+ zbývá %1$s
+ vytvořil hlasování.
+ poslal nálepku.
+ poslal video.
+ poslal obrázek.
+ poslal hlasovou zprávu.
+ poslal zvukový soubor.
+ odeslal soubor.
+ V odpovědi na
+ Skrýt IP adresu
+ Zobrazit IP adresu
+ Citace
+ Odpovídám na %s
+ Úpravy
+ Zobrazit poslední chaty v nabídce sdílení systému
+ Povolit přímé sdílení
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-de/strings.xml b/library/ui-strings/src/main/res/values-de/strings.xml
index 409fc564f4..809ee477fc 100644
--- a/library/ui-strings/src/main/res/values-de/strings.xml
+++ b/library/ui-strings/src/main/res/values-de/strings.xml
@@ -2232,13 +2232,13 @@
- %1$s weitere Optionen benötigt
Frage darf nicht leer sein
- ABSTIMMUNG ERSTELLEN
+ Umfrage erstellen
NEUE OPTION
Option %1$d
Optionen hinzufügen
Frage oder Thema
Abstimmungsthema oder Frage
- Abstimmung erstellen
+ Umfrage erstellen
Umfrage
Auffindungseinstellungen öffnen
Sitzung abgemeldet!
@@ -2306,21 +2306,21 @@
Richtlinie deines Identitäts-Servers
Richtlinie deines Heim-Servers
Richtlinie von ${app_name}
- Abstimmung erstellen
+ Umfrage erstellen
Kontakte öffnen
Sticker verschicken
Datei hochladen
Verschicke Fotos und Videos
Kamera öffnen
- Willst du diese Abstimmung wirklich entfernen\? Du wirst sie nicht wiederherstellen können.
- Abstimmung entfernen
- Abstimmung beendet
+ Willst du diese Umfrage wirklich entfernen\? Du wirst sie nicht wiederherstellen können.
+ Umfrage entfernen
+ Umfrage beendet
Stimme abgegeben
- Abstimmung beenden
+ Umfrage beenden
Dies verhindert, dass andere Personen abstimmen können, und zeigt die Endergebnisse der Umfrage an.
- Diese Abstimmung beenden\?
+ Diese Umfrage beenden\?
Gewinneroption
- Abstimmung beenden
+ Umfrage beenden
- Endgültiges Ergebnis basiert auf %1$d Stimme
- Endgültiges Ergebnis basiert auf %1$d Stimmen
@@ -2333,11 +2333,11 @@
${app_name} konnte nicht auf deinen Standort zugreifen
Standort
Die Ergebnisse werden erst sichtbar, sobald du die Umfrage beendest
- Abgeschlossene Abstimmung
+ Versteckte Umfrage
Abstimmende können die Ergebnisse nach Stimmabgabe sehen
- Laufende Abstimmung
- Abstimmungsart
- Abstimmung bearbeiten
+ Offene Umfrage
+ Umfragetyp
+ Umfrage bearbeiten
Keine Stimmen abgegeben
Konto erstellen
Kommunikation für dein Team.
@@ -2527,7 +2527,7 @@
Server-Richtlinien
Folge den Anweisungen, die an %s gesendet wurden
E-Mail bestätigen
- Ergebnisse werden nach Abschluss der Abstimmung sichtbar sein
+ Ergebnisse werden nach Abschluss der Umfrage sichtbar sein
Prüfe deine E-Mails.
Passwort zurücksetzen
Gib mindestens 8 Zeichen ein.
@@ -2815,7 +2815,7 @@
Die Anfrage ist fehlgeschlagen.
Abspielen oder fortsetzen der Sprachübertragung
Fortsetzen der Sprachübertragung
- Puffere
+ Puffere …
Pausiere Sprachübertragung
Stoppe Aufzeichnung der Sprachübertragung
Pausiere Aufzeichnung der Sprachübertragung
@@ -2835,4 +2835,36 @@
- %1$d ausgewählt
- %1$d ausgewählt
+ Du hast nicht die nötigen Berechtigungen, um eine Sprachübertragung in diesem Raum zu starten. Kontaktiere einen Raumadministrator, um deine Berechtigungen anzupassen.
+ Sprachübertragung kann nicht gestartet werden
+ Vollbildmodus umschalten
+ Textformatierung
+ Du zeichnest bereits eine Sprachübertragung auf. Bitte beende die laufende Übertragung, um eine neue zu beginnen.
+ Jemand anderes nimmt bereits eine Sprachübertragung auf. Warte auf das Ende der Übertragung, bevor du eine neue startest.
+ 30 Sekunden vorspulen
+ 30 Sekunden zurückspulen
+ Auf verifizierte Sitzungen kannst du überall mit deinem Konto zugreifen, wenn du deine Passphrase eingegeben oder Element mit einer anderen Sitzung verifiziert hast.
+\n
+\nDies bedeutet, dass du alle Schlüssel zum Entsperren deiner verschlüsselten Nachrichten hast und anderen bestätigst, dieser Sitzung zu vertrauen.
+
+ - Von %1$d Sitzung abmelden
+ - Von %1$d Sitzungen abmelden
+
+ Abmelden
+ %1$s übrig
+ Zitieren
+ Bearbeiten
+ erstellte eine Umfrage.
+ sandte einen Sticker.
+ sandte ein Video.
+ sandte ein Bild.
+ sandte eine Sprachnachricht.
+ sandte eine Audiodatei.
+ sandte eine Datei.
+ Als Antwort auf
+ %s antworten
+ IP-Adresse ausblenden
+ IP-Adresse anzeigen
+ Kürzliche Unterhaltungen im Teilen-Menü des Systems anzeigen
+ Direktes Teilen aktivieren
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-es/strings.xml b/library/ui-strings/src/main/res/values-es/strings.xml
index f73c4952c6..3d10997233 100644
--- a/library/ui-strings/src/main/res/values-es/strings.xml
+++ b/library/ui-strings/src/main/res/values-es/strings.xml
@@ -2649,4 +2649,10 @@
Crear sala
Iniciar conversación
Todas las conversaciones
-
+ Seleccionar todo
+ De acuerdo
+
+ - %1$d seleccionado
+ - %1$d seleccionados
+
+
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-et/strings.xml b/library/ui-strings/src/main/res/values-et/strings.xml
index 9bfbbe8eeb..96d9650ceb 100644
--- a/library/ui-strings/src/main/res/values-et/strings.xml
+++ b/library/ui-strings/src/main/res/values-et/strings.xml
@@ -2805,7 +2805,7 @@
Teine seade on juba võrku loginud.
Turvalise sõnumivahetuse ülesseadmisel tekkis turvaviga. Üks kolmest võib olla sattunud vale osapoole kontrolli alla: sinu koduserver, sinu internetiühendus või sinu seade;
Päring ei õnnestunud.
- Andmed on puhverdamisel
+ Andmed on puhverdamisel…
Alusta või jätka ringhäälingukõne esitamist
Lõpeta ringhäälingukõne salvestamine
Peata ringhäälingukõne salvestamine
@@ -2827,4 +2827,36 @@
- %1$d valitud
- %1$d valitud
+ Lülita täisekraanivaade sisse/välja
+ Tekstivorming
+ Sa juba salvestad ringhäälingukõnet. Uue alustamiseks palun lõpeta eelmine salvestus.
+ Keegi juba salvestab ringhäälingukõnet. Uue ringhäälingukõne salvestamiseks palun oota, kuni see teine ringhäälingukõne on lõppenud.
+ Sul pole piisavalt õigusi selles jututoas ringhäälingukõne algatamiseks. Õiguste lisamiseks palun võta ühendust jututoa haldajaga.
+ Uue ringhäälingukõne alustamine pole võimalik
+ Keri tagasi 30 sekundi kaupa
+ Keri edasi 30 sekundi kaupa
+ Verifitseeritud sessioonideks loetakse Element\'is või mõnes muus Matrix\'i rakenduses selliseid sessioone, kus sa kas oled sisestanud oma salafraasi või tuvastanud end mõne teise oma verifitseeritud sessiooni abil.
+\n
+\nSee tähendab, et selles sessioonis on ka kõik vajalikud võtmed krüptitud sõnumite lugemiseks ja teistele kasutajatele kinnitamiseks, et sa usaldad seda sessiooni.
+
+ - Logi välja %1$d\'st sessioonist
+ - Logi välja %1$d\'st sessioonist
+
+ Logi välja
+ jäänud %1$s
+ Muudan sõnumit
+ Vastan sõnumile %s
+ Tsiteerides
+ Näita IP-aadressi
+ Peida IP-aadress
+ Vastuseks kasutajale
+ saatis faili.
+ saatis helifaili.
+ saatis häälsõnumi.
+ saatis pildi.
+ saatis video.
+ saatis kleepsu.
+ koostas küsitluse.
+ Kasuta otsejagamist
+ Näita viimaseid vestlusi süsteemses jagamisvaates
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-fa/strings.xml b/library/ui-strings/src/main/res/values-fa/strings.xml
index f2701519e7..a3a74df10f 100644
--- a/library/ui-strings/src/main/res/values-fa/strings.xml
+++ b/library/ui-strings/src/main/res/values-fa/strings.xml
@@ -943,7 +943,7 @@
\n
\nپیامهایتان با قفلهایی امن شدهاند و فقط شما و گیرندگان دیگر، کلیدهای یکتا را برای قفلگشاییشان دارید.
امنیت
- بثیشتر بدانید
+ بیشتر بدانید
بیشتر
کنشهای مدیر
تنظمیات اتاق
@@ -2783,7 +2783,7 @@
نظرسنجیها
پیوستها
برچسبها
- میانگیری
+ میانگیری…
زنده
تأیید
۳
@@ -2802,4 +2802,51 @@
- ۱ گزیده
- %1$d گزیده
+ اجازههای لازم برای آغاز پخش صوتی در این اتاق را ندارید. برای ارتقای اجازههایتان با یک مدیر اتاق تماس بگیرید.
+ فرد دیگری در حال ضبط یک پخش صوتی است. برای آغاز یک پخش جدید، منتظر پایان پخشش بمانید.
+ با بررسی افزارههای وارد شدهتان باید کد زیر را ببینید. تأیید کنید که این کد با آن افزاره مطابق است:
+ دارید یک پخش صوتی ضبط میکنید. لطفاً برای آغاز یک پخش جدید، به پخش کنونی پایان دهید.
+ ⚠ افزارههای تأییدنشدهای در این اتاق وجود دارند. آنها قادر به رمزگشایی پیامهایی که فرستادهاید نیستند.
+ استفاده از دوربین روی این افزاره برای پویش کد QR نشان داده شده روی افزارهٔ دیگرتان:
+ ضبط نام کارخواه، نگارش و نشانی برای بازشناسی آسانتر نشستها در مدیر نشست.
+ 🔒 رمزگذاری به نشستهای تأیید شده را فقط برای تمامی اتاقها در تنظیمات امنیت به کار انداختهاید.
+
+ - خارج شدن از نشستهای قدیمی (۱ روز یا بیشتر) که دیگر استفاده نمیکنید را در نظر داشته باشید.
+ - خارج شدن از نشستهای قدیمی (%1$d روز یا بیشتر) که دیگر استفاده نمیکنید را در نظر داشته باشید.
+
+ توانایی ضبط و فرستادن پخش صدا در خط زمانی اتاق.
+ پویش کد QR زیر با افزارهای که خارج شده.
+ استفاده از افزارهٔ وارد شدهتان برای پویش کد QR زیر:
+ چیزی اشتباه پیش رفت. لطفاً اتّصال شبکهتان را بررسی و دوباره تلاش کنید.
+ ${app_name} برای نمایش آگاهیها نیازمند اجازه است.
+\nلطفاً اجازه را اعطا کنید.
+ نمیتوان پخش صدایی جدید را آغاز کرد
+ تغییر حالت تمامصفحه
+ ۳۰ ثانیه پیشروی
+ ۳۰ ثانیه پسروی
+ قالببندی متن
+ خروج
+
+ - خروج از ۱ نشست
+ - خروج از %1$d نشست
+
+ %1$s مانده
+ پیام صوتیای فرستاد.
+ پروندهٔ صوتیای فرستاد.
+ نظرسنجیای ایجاد کرد.
+ عکسبرگردانی فرستاد.
+ ویدیویی فرستاد.
+ تصویری فرستاد.
+ پروندهای فرستاد.
+ در پاسخ به
+ نهفتن نشانی آیپی
+ نمایش نشانی آیپی
+ نقل کردن
+ پاسخ دادن به %s
+ ویرایش کردن
+ میتوانید با یک رمز QR از این افزاره برای ورود به افزارهای همراه یا روی وب استفاده کنید. دو راه برای این کار وجود دارد:
+ مشکلی امنیتی در برپایی پیامرسانی امن وجود داشت. ممکن است یکی از موارد زیر دستکاری شده باشند: کارساز خانیگیتان؛ اتّصال اینترنتیتان؛ افزاره(های)تان؛
+ لطفاً مطمئن شوید که مبدأ این کد را میدانید. با پیوند دادن افزارهها، دسترسی کامل را به حسابتان میدهید.
+ نمایش گپهای اخیر در فهرست هم رسانی سامانه
+ به کار انداختن همرسانی مستقیم
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-fr/strings.xml b/library/ui-strings/src/main/res/values-fr/strings.xml
index 3fae312560..44ad36a869 100644
--- a/library/ui-strings/src/main/res/values-fr/strings.xml
+++ b/library/ui-strings/src/main/res/values-fr/strings.xml
@@ -682,9 +682,10 @@
La phrase secrète est trop faible
Veuillez supprimer la phrase secrète si vous voulez que ${app_name} génère une clé de récupération.
Ne perdez jamais vos messages chiffrés
- Les messages dans les salons chiffrés sont sécurisés avec un chiffrement de bout en bout. Seuls vous et le(s) destinataire(s) avez les clés pour lire ces messages.
-\n
-\nSauvegardez vos clés de façon sécurisée pour éviter de les perdre.
+ Protection afin d\'éviter de perdre l\'accès aux messages et données chiffrés.
+
+ Générez une clé de sécurité à stocker dans un endroit sûr comme un gestionnaire de mot de passe ou un coffre.
+
Définir la phrase secrète
Terminé
Sauvegarder la clé de récupération
@@ -743,7 +744,7 @@
Voulez-vous vraiment vous déconnecter ?
Récupération des messages chiffrés
Veuillez renseigner un nom d’utilisateur.
- Commencer à utiliser la sauvegarde de clés
+ Utiliser une clé de sauvegarde Tchap
(Avancé)
Exporter les clés manuellement
Protégez votre sauvegarde avec une phrase secrète.
@@ -754,7 +755,7 @@
Ou protégez votre sauvegarde avec une clé de récupération, en la conservant en lieu sûr.
(Avancé) Configurer une clé de récupération
Bien joué !
- Vos clés sont en cours de sauvegarde.
+ Stockez votre clé dans un endroit sûr. Elle peut être utilisée pour dévérouiller vos messages et données chiffrés.
Votre clé de récupération est une mesure de précaution. Vous pouvez l’utiliser pour restaurer l’accès à vos messages chiffrés si vous oubliez votre phrase secrète.
\nConservez votre clé de récupération en lieu sûr, comme un gestionnaire de mots de passe (ou un coffre-fort)
Conservez votre clé de récupération dans un endroit sûr, comme un gestionnaire de mots de passe (ou un coffre-fort)
@@ -2814,7 +2815,7 @@
Vous pouvez utiliser cet appareil pour connecter un appareil mobile ou un client web avec un QR code. Il y a deux façons de le faire :
Se connecter avec un QR code
Scanner le QR code
- Mise en mémoire tampon
+ Mise en mémoire tampon…
Mettre en pause la diffusion audio
Lire ou continuer la diffusion audio
Arrêter l’enregistrement de la diffusion audio
@@ -2836,4 +2837,36 @@
- %1$d sélectionné
- %1$d sélectionnés
+ Basculer en mode plein écran
+ Formatage de texte
+ Vous êtes déjà en train de réaliser une diffusion audio. Veuillez terminer votre diffusion audio actuelle pour en démarrer une nouvelle.
+ Une autre personne est déjà en train de réaliser une diffusion audio. Attendez que sa diffusion audio soit terminée pour en démarrer une nouvelle.
+ Vous n’avez pas les permissions requises pour démarrer une nouvelle diffusion audio dans ce salon. Contactez un administrateur du salon pour mettre-à-jour vos permissions.
+ Impossible de commencer une nouvelle diffusion audio
+ Avance rapide de 30 secondes
+ Retour rapide de 30 secondes
+ Les sessions vérifiées sont toutes celles qui utilisent ce compte après avoir saisie la phrase de sécurité ou confirmé votre identité à l’aide d’une autre session vérifiée.
+\n
+\nCela veut dire qu’elles disposent de toutes les clés nécessaires pour lire les messages chiffrés, et confirment aux autres utilisateurs que vous faites confiance à cette session.
+
+ - Déconnecter %1$d session
+ - Déconnecter %1$d sessions
+
+ Déconnecter
+ %1$s restant
+ a créé un sondage.
+ a envoyé un autocollant.
+ a envoyé une vidéo.
+ a envoyé une image.
+ envoyer un message vocal.
+ a envoyé un fichier audio.
+ a envoyé un fichier.
+ En réponse à
+ Masquer l’adresse IP
+ Afficher l’adresse IP
+ Citation de
+ Réponse à %s
+ Modification
+ Affiche les conversations récentes dans le menu de partage du système
+ Activer le partage direct
diff --git a/library/ui-strings/src/main/res/values-hu/strings.xml b/library/ui-strings/src/main/res/values-hu/strings.xml
index 21ea6aab14..1dd2134b90 100644
--- a/library/ui-strings/src/main/res/values-hu/strings.xml
+++ b/library/ui-strings/src/main/res/values-hu/strings.xml
@@ -2836,4 +2836,34 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
- %1$d kiválasztva
- %1$d kiválasztva
+ Teljes képernyő váltás
+ Mindenhol ellenőrzött munkamenetek vannak ahol ezt a fiókot használva megadtad a jelmondatodat vagy egy másik már hitelesített munkamenetből megerősítetted az identitásodat.
+\n
+\nEz azt jelenti, hogy a titkosított üzenetek visszafejtéséhez rendelkezel a kulcsokkal és megerősíted a többiek felé, hogy megbízol a munkamenetben.
+
+ - Kijelentkezés %1$d munkamenetből
+ - Kijelentkezés %1$d munkamenetből
+
+ Kijelentkezés
+ Szöveg formázás
+ Egy hang közvetítés már folyamatban van. Először fejezze be a jelenlegi közvetítést egy új indításához.
+ Valaki már elindított egy hang közvetítést. Várd meg a közvetítés végét az új indításához.
+ Nincs jogosultságod hang közvetítést indítani ebben a szobában. Vedd fel a kapcsolatot a szoba adminisztrátorával a szükséges jogosultság megszerzéséhez.
+ Az új hang közvetítés nem indítható el
+ 30 másodperccel előre
+ 30 másodperccel vissza
+ visszavan: %1$s
+ szavazás elkészítve.
+ matrica elküldve.
+ videót küldött.
+ kép elküldve.
+ hang üzenet elküldve.
+ hangfájl elküldve.
+ fájl elküldve.
+ Válaszolva erre
+ IP címek elrejtése
+ IP címek megjelenítése
+ Idézet
+ Válasz erre: %s
+ Szerkesztés
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-in/strings.xml b/library/ui-strings/src/main/res/values-in/strings.xml
index 6ed423bb70..da4c474689 100644
--- a/library/ui-strings/src/main/res/values-in/strings.xml
+++ b/library/ui-strings/src/main/res/values-in/strings.xml
@@ -2762,7 +2762,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Permintaan gagal.
Memungkinkan untuk merekam dan mengirim siaran suara dalam linimasa ruangan.
Aktifkan siaran suara (dalam pengembangan aktif)
- Memuat
+ Memuat…
Jeda siaran suara
Mainkan atau lanjutkan siaran suara
Hentikan rekaman siaran suara
@@ -2783,4 +2783,35 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
- %1$d dipilih
+ Ubah mode layar penuh
+ Format teks
+ Anda sedang merekam sebuah siaran suara. Mohon akhiri siaran suara Anda saat ini untuk memulai yang baru.
+ Orang lain sedang merekam sebuah siaran suara. Tunggu untuk siaran suara berakhir untuk memulai yang baru.
+ Anda tidak memiliki izin yang dibutuhkan untuk memulai sebuah siaran suara di ruangan ini. Hubungi sebuah administrator ruangan untuk meningkatkan izin Anda.
+ Tidak dapat memulai siaran suara baru
+ Maju cepat 30 detik
+ Mundur cepat 30 detik
+ Sesi terverifikasi ada di mana pun Anda menggunakan Element setelah memasukkan frasa sandi atau mengonfirmasi identitas Anda dengan sesi terverifikasi lainnya.
+\n
+\nIni berarti Anda memiliki semua kunci yang diperlukan untuk membuka kunci pesan terenkripsi dan mengonfirmasi kepada pengguna lain bahwa Anda memercayai sesi ini.
+
+ - Keluarkan %1$d sesi
+
+ Keluarkan
+ %1$s tersisa
+ membuat pemungutan suara.
+ mengirim stiker.
+ mengirim video.
+ mengirim gambar.
+ mengirim file.
+ mengirim file audio.
+ mengirim pesan suara.
+ Membalas ke
+ Sembunyikan alamat IP
+ Mengutip
+ Mengedit
+ Tampilkan alamat IP
+ Membalas ke %s
+ Tampilkan obrolan terkini dalam menu pembagian sistem
+ Aktifkan pembagian langsung
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-it/strings.xml b/library/ui-strings/src/main/res/values-it/strings.xml
index 5cc509e8b9..d6a7858ebc 100644
--- a/library/ui-strings/src/main/res/values-it/strings.xml
+++ b/library/ui-strings/src/main/res/values-it/strings.xml
@@ -2805,7 +2805,7 @@
L\'altro dispositivo ha già fatto l\'accesso.
Si è verificato un problema di sicurezza configurando i messaggi sicuri. Una delle seguenti cose potrebbe essere compromessa: il tuo homeserver; la/e connessione/i internet; il/i dispositivo/i;
La richiesta è fallita.
- Buffering
+ Buffer…
Sospendi trasmissione vocale
Avvia o riprendi trasmissione vocale
Ferma registrazione trasmissione vocale
@@ -2827,4 +2827,36 @@
- %1$d selezionato
- %1$d selezionati
+ Attiva/disattiva schermo intero
+ Le sessioni verificate sono ovunque usi questo account dopo l\'inserimento della password o la conferma della tua identità con un\'altra sessione verificata.
+\n
+\nCiò significa che hai tutte le chiavi necessarie per sbloccare i tuoi messaggi cifrati e per confermare agli altri utenti che ti fidi di questa sessione.
+
+ - Disconnetti da %1$d sessione
+ - Disconnetti da %1$d sessioni
+
+ Disconnetti
+ Formattazione testo
+ Stai già registrando una trasmissione vocale. Termina quella in corso per iniziarne una nuova.
+ Qualcun altro sta già registrando una trasmissione vocale. Aspetta che finisca prima di iniziarne una nuova.
+ Non hai l\'autorizzazione necessaria per iniziare una trasmissione vocale in questa stanza. Contatta un amministratore della stanza per aggiornare le tue autorizzazioni.
+ Impossibile iniziare una nuova trasmissione vocale
+ Manda avanti di 30 secondi
+ Manda indietro di 30 secondi
+ %1$s rimasti
+ creato un sondaggio.
+ inviato un adesivo.
+ inviato un video.
+ inviata un\'immagine.
+ inviato un messaggio vocale.
+ inviato un file audio.
+ inviato un file.
+ In risposta a
+ Nascondi indirizzo IP
+ Mostra indirizzo IP
+ Citazione
+ Risposta a %s
+ Modifica
+ Mostra chat recenti nel menu di condivisione di sistema
+ Attiva condivisione diretta
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-ja/strings.xml b/library/ui-strings/src/main/res/values-ja/strings.xml
index 37c0bca52f..11ab6ee857 100644
--- a/library/ui-strings/src/main/res/values-ja/strings.xml
+++ b/library/ui-strings/src/main/res/values-ja/strings.xml
@@ -2459,4 +2459,18 @@
ルームを作成
チャットを開始
全ての会話
+ ${app_name}にようこそ、
+\n%s。
+ 認証済のセッション
+ QRコードでサインイン
+ 新しいセッションマネージャーを有効にする
+ QRコードでサインイン
+ 3
+ 2
+ 1
+ リクエストが失敗しました。
+ QRコードをスキャン
+ QRコードをスキャン
+ QRコードをスキャン
+ QRコードが不正です。
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-pl/strings.xml b/library/ui-strings/src/main/res/values-pl/strings.xml
index ab9c367824..1c01c82189 100644
--- a/library/ui-strings/src/main/res/values-pl/strings.xml
+++ b/library/ui-strings/src/main/res/values-pl/strings.xml
@@ -2715,7 +2715,7 @@
Preferencje interfejsu
Przeglądaj pokoje
Utwórz pokój
- Zacznij rozmawiać
+ Rozpocznij czat
Wszystkie rozmowy
Nie zweryfikowano · Ostatnia aktywność %1$s
Zweryfikowano · Ostatnia aktywność %1$s
@@ -2743,4 +2743,4 @@
%s
\nwygląda nieco pusto.
Brak przestrzeni.
-
+
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml
index 2ec5f394bd..8129a234fb 100644
--- a/library/ui-strings/src/main/res/values-pt-rBR/strings.xml
+++ b/library/ui-strings/src/main/res/values-pt-rBR/strings.xml
@@ -2723,7 +2723,7 @@
Sessões não-verificadas
Sessões inativas são sessões que você não tem usado em algum tempo, mas elas continuam a receber chaves de encriptação.
\n
-\nRemover sessões inativas melhora segurança e performance, e torna-o mais fácil para você identificar se uma nova sessão é suspeita.
+\nRemover sessões inativas melhora segurança e performance, e torna mais fácil para você identificar se uma nova sessão é suspeita.
Sessões inativas
Por favor esteja ciente que nomes de sessões também são visíveis a pessoas com quem você se comunica.
Nomes de sessões personalizadas podem ajudar você a reconhecer seus dispositivos mais facilmente.
@@ -2836,4 +2836,34 @@
- %1$d selecionada(o)
- %1$d selecionadas(os)
+ Alguma outra pessoa já está gravando um broadcast de voz. Espere que o broadcast de voz dela termine para começar um novo.
+ Alternar modo de tela cheia
+ Formatação de texto
+ Você já está gravando um broadcast de voz. Por favor termine seu broadcast de voz atual para começar um novo.
+ Você não tem as permissões requeridas para começar um broadcast de voz nesta sala. Contacte um/uma administrador(a) para fazer upgrade de suas permissões.
+ Não dá pra começar um novo broadcast de voz
+ Avançar rápido 30 segundos
+ Retroceder 30 segundos
+ Sessões verificadas são onde quer que você esteja usando esta conta depois de entrar sua frasepasse ou confirmar sua identidade com uma outra sessão verificada.
+\n
+\nIsto significa que você tem todas as chaves necessárias para destrancar suas mensagens encriptadas e confirmar a outras(os) usuárias(os) que você confia nesta sessão.
+
+ - Fazer signout de %1$d sessão
+ - Fazer signout de %1$d sessões
+
+ Fazer signout
+ %1$s restando
+ criou uma sondagem.
+ enviou um sticker.
+ enviou um vídeo.
+ enviou uma imagem.
+ enviou uma mensagem de voz.
+ enviou um arquivo de áudio.
+ enviou um arquivo.
+ Em resposta a
+ Esconder endereço de IP
+ Mostrar endereço de IP
+ Citando
+ Respondendo a %s
+ Editando
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-ru/strings.xml b/library/ui-strings/src/main/res/values-ru/strings.xml
index fb819efb69..39d1c8de2b 100644
--- a/library/ui-strings/src/main/res/values-ru/strings.xml
+++ b/library/ui-strings/src/main/res/values-ru/strings.xml
@@ -930,7 +930,7 @@
Безопасность
Правила push-уведомлений
ID приложения:
- push_key:
+ Ключ Push:
Отображаемое название приложения:
Отображаемое название сессии:
Url:
@@ -1000,10 +1000,10 @@
Не удалось подключиться к серверу обнаружения
Пожалуйста, введите URL сервера обнаружения
Сервер обнаружения не имеет условий использования
- Параметры обнаружения появятся после добавления электронной почты.
+ Параметры обнаружения появятся после добавления адреса электронной почты.
Параметры поиска появятся после добавления номера телефона.
Отключение от сервера обнаружения будет означать, что другие пользователи не смогут обнаружить вас, и вы не сможете приглашать других по электронной почте или по телефону.
- Мы отправили вам электронное письмо с подтверждением на %s, проверьте вашу электронную почту и нажмите на ссылку для подтверждения
+ Мы отправили вам электронное письмо на %s, проверьте вашу электронную почту и нажмите на ссылку для подтверждения
Выбранный сервер обнаружения не имеет условий использования. Продолжайте, только если вы доверяете его владельцу
Текстовое сообщение отправлено %s. Введите код проверки, который он содержит.
В настоящее время вы делитесь адресами электронной почты или телефонными номерами на сервере обнаружения %1$s. Вам нужно повторно подключиться к %2$s, чтобы прекратить делиться ими.
@@ -1102,7 +1102,7 @@
Предупреждение!
Смена пароля приведёт к сбросу всех сквозных ключей шифрования во всех ваших сессиях, что сделает зашифрованную историю разговоров нечитаемой. Настройте резервное копирование ключей или экспортируйте ключи от комнаты из другой сессии, прежде чем сбрасывать пароль.
Продолжить
- Данный электронный ящик не связан ни с одним аккаунтом
+ Данный адрес электронной почты не связан ни с одним аккаунтом
Проверьте свою почту
Письмо с подтверждением было отправлено на %1$s.
Нажмите на ссылку, чтобы подтвердить свой новый пароль. Как только вы перейдете по ссылке нажмите ниже.
@@ -1241,7 +1241,7 @@
%1$s: %2$s %3$s
Удалённые сообщения
Показывать заглушку на месте удалённых сообщений
- Мы отправили письмо для подтверждения на %s, проверьте почту и нажмите на ссылку для подтверждения
+ Мы отправили письмо на %s, пожалуйста проверьте почту и нажмите на ссылку для подтверждения
Код подтверждения неверный.
Попробуйте снова после принятия условий обслуживания на вашем домашнем сервере.
Похоже, сервер долгое время не отвечает, что может быть вызвано плохим соединением или ошибкой на сервере. Попробуйте снова через некоторое время.
@@ -1351,7 +1351,7 @@
Введите адрес сервера, который вы хотите использовать
На ваш почтовый ящик будет отправлено письмо для подтверждения установки нового пароля.
Я подтвердил свою электронную почту
- Установите адрес электронной почты для восстановления вашей учетной записи. Позже вы можете дополнительно разрешить людям, которых вы знаете, обнаружить вас по электронной почте.
+ Укажите адрес электронной почты для восстановления вашей учетной записи. Потом вы сможете, при желании, разрешить людям, которых вы знаете, обнаружить вас по адресу электронной почты.
Введенный код неверен. Пожалуйста, проверьте.
Войти с Matrix ID
Войти с Matrix ID
@@ -1482,7 +1482,7 @@
Незаверенная
Эта сессия является доверенной для безопасного обмена сообщениями, так как %1$s (%2$s) проверил(а) его:
%1$s (%2$s) вошел(ла), используя новую сессию:
- Пока этот пользователь не доверяет этой сессии, сообщения, отправленные в обе стороны, помечаются предупреждениями. Кроме того, вы можете подтвердить сессию вручную.
+ Пока этот пользователь не доверяет этой сессии, сообщения, отправленные в обе стороны, помечаются предупреждениями. Вы также можете подтвердить эту сессию вручную.
Начать перекрестную подпись
Сбросить ключи
Почти готово! Показывает ли %s галочку\?
@@ -1606,7 +1606,7 @@
Эта операция невозможна. Домашний сервер устарел.
Пожалуйста, настройте сначала сервер идентификации.
Пожалуйста, примите сначала условия сервера идентификации в настройках.
- Для вашей приватности, ${app_name} поддерживает отправку адреса электронной почты и номера телефона только в хэшированном виде.
+ Для вашей приватности, ${app_name} поддерживает отправку адреса электронной почты и номеров телефонов только в хэшированном виде.
Привязка не удалась.
Текущая взаимосвязь с этим идентификатором отсутствует.
Ваш домашний сервер (%1$s) предлагает использовать %2$s для вашего сервера обнаружения
@@ -1793,7 +1793,7 @@
Добавить изображение из
Тема
Название комнаты
- Вы дали свое согласие на отправку электронных писем и телефонных номеров на этот сервер обнаружения для обнаружения других пользователей из ваших контактов.
+ Вы дали свое согласие на отправку адресов электронных почт и телефонных номеров на этот сервер идентификации для обнаружения других пользователей из ваших контактов.
Добавить по QR-коду
Разрешить доступ к вашим контактам.
Чтобы отсканировать QR-код, вам нужно разрешить доступ к камере.
@@ -2396,7 +2396,7 @@
Местоположение
Вы согласны отправить эту информацию\?
Чтобы обнаружить существующие контакты, необходимо отправить контактную информацию (электронную почту и номера телефонов) на сервер обнаружения. Мы хешируем ваши данные перед отправкой для обеспечения конфиденциальности.
- Отправить электронные адреса и номера телефонов %s
+ Отправить адреса электронных почт и номера телефонов %s
Ваши контакты приватны. Чтобы обнаружить пользователей из ваших контактов, нам необходимо ваше разрешение на отправку контактной информации на ваш сервер обнаружения.
Системные настройки
Версии
@@ -2805,4 +2805,162 @@
Местоположение
Камера
Контакт
+ ${app_name} нуждается в разрешении для отображения оповещений.
+\nПожалуйста, дайте разрешение.
+
+ - %1$s и %2$d другой
+ - %1$s и %2$d другие
+ - %1$s и %2$d других
+ - %1$s и %2$d других
+
+ ${app_name} нуждается в резрешении для отображения оповещений. Оповещения могут показывать ваши сообщения, приглашения и тому подобное.
+\n
+\nПожалуйста разрешите доступ при следующем всплывающем сообщении, чтобы иметь возможность видеть оповещения.
+ Здесь будут появляться новые запросы и приглашения.
+ Приглашения
+ Попробуйте расширенный текстовый редактор (режим набора обычного текста скоро появится)
+ Создавать личные сообщения только при отправке первого сообщения
+ Включить отложенные личные сообщения
+ Отменить выбор всего
+ Выбрать всё
+ Свернуть дочерние элементы %s
+ Развернуть дочерние элементы %s
+
+ - Выбрано %1$d
+ - Выбрано %1$d
+ - Выбрано %1$d
+ - Выбрано %1$d
+
+ Войти в полноэкранный режим
+ Применить форматирование подчёркиванием
+ Применить форматирование перечёркиванием
+ Применить форматирование курсивом
+ Применить форматирование жирным
+ Пожалуйста удостоверьтесь в том, что вы знаете откуда этот код. При соединении устройств, вы даёте кому-то полный доступ к вашей учётной записи.
+ Подтвердить
+ Попробовать снова
+ Не сходится\?
+ Вход
+ Соединение с устройством
+ Сканировать QR-код
+ Входите с мобильного устройства\?
+ Показать QR-код на этом устройстве
+ Выберите «Сканировать QR-код»
+ Начните с экрана входа
+ Выберите «Войти при помощи QR-кода»
+ Начните с экрана входа
+ Выберите «Показать QR-код»
+ Зайдите в Настройки -> Безопасность и Приватность
+ Откройте приложение с другого устройства
+ Домашний сервер не поддерживает вход при помощи QR-кода.
+ Вход был отменён с другого устройства.
+ Этот QR-код не работает.
+ Другое устройство должно войти в учётную запись.
+ Другое устройство уже выполнило вход.
+ Во время установки безопасной переписки возникла проблема с безопасностью. Одно из следующего является скомпроментированным: Ваш домашний сервер; Ваше интернет-соединение; Ваше устройство;
+ Запрос не выполнен.
+ Запрос был отклонён на другом устройстве.
+ Соединение не было выполнено за нужное время.
+ Соединение с этим устройством не поддерживается.
+ Неудачное соединение
+ Проверьте устройство, с которого вы вошли в учётную запись. На его экране должен появиться код снизу. Подтвердите, что код снизу такой же, как и на том устройстве:
+ Безопасное соединение установлено
+ Сканируйте QR-код снизу при помощи устройства, с которого вы вышли с учётной записи.
+ Используйте устройство, с которого вы вошли в учётную запись, чтобы сканировать QR-код снизу:
+ Войти при помощи QR-кода
+ Используйте камеру на этом устройстве, чтобы сканировать QR-код, отображённый на вашем другом устройстве:
+ Сканировать QR-код
+ 3
+ 2
+ 1
+ Нажмите слева сверху, чтобы увидеть опцию отзыва.
+ Чтобы упростить ${app_name}, вкладки теперь опциональные. Управляйте ими при помощи меню справа сверху.
+ Универсальное безопасное приложение для переписок с командами, друзьями и организациями. Создайте переписку или присоеденитесь к уже существующей, чтобы начать.
+ Пространства — новый способ групировать комнаты и людей. Добавьте существующую комнату или создайте новую, используя кнопку слева снизу.
+ Возможность записывать и отправлять голосовые трансляции в ленту комнаты.
+ Получите лучший надзор и контроль над всеми вашими сессиями.
+ Подтверждённые сессии есть везде, где вы используете эту учётную запись, после введения вашего пароля или подтверждения вашей личности при помощи другой подтверждённой сессии.
+\n
+\nЭто значит, что у вас есть все нужные ключи, чтобы разблокировать зашифрованные сообщения и даёте другим пользователям знать, что вы доверяете этой сессии.
+ Подтверждённые сессии вошли при помощи ваших учётных данных и были подтверждены, либо при помощи вашего безопасного пароля, либо при помощи подтверждения с другого устройства.
+\n
+\nЭто значит, что на них находятся ключи шифрования для ваших предыдущих сообщений и дают другим пользователям знать, что эти сессии действительно принадлежат вам.
+ Неподтверждённые сессии — это сессии, которые вошли при помощи ваших учётных данных, но не были подтверждены.
+\n
+\nВы должны удостовериться, что узнаёте эти сессии, так как они могут быть несанкционированным входом в вашу учётную запись.
+ Вы можете использовать это устройство для входа с телефона или веб-устройства при помощи QR-кода. Для этого есть два способа:
+ Войти при помощи QR-кода
+ Собственные названия сессий помогут вам легче распознать свои девайсы.
+
+ - Выйти из %1$d сессии
+ - Выйти из %1$d сессий
+ - Выйти из %1$d сессий
+ - Выйти из %1$d сессий
+
+ Выйти
+ Выбрать сессии
+ Фильтр
+
+ - Неактивен %1$d+ день (%2$s)
+ - Неактивен %1$d+ дней (%2$s)
+ - Неактивен %1$d+ дня (%2$s)
+ - Неактивен %1$d+ дня (%2$s)
+
+ Подтвердите текущую сессию, чтобы посмотреть её состояние подтверждения.
+ Неизвестное состояние проверки
+ Автоматически принимать виджеты Element Call и давать доступ к микрофону/камере
+ Включить ярлыки разрешений Element Call
+ Форматирование текста
+ Начать новую голосовую трансляцию
+ Вам необходимо иметь нужные разрешения, чтобы делиться местоположением в реальном времени в этой комнате.
+ У вас нет разрешения делиться местоположением в реальном времени
+ При приглашении кого-то в зашифрованную комнату, которая делится историей, зашифрованная история будет видимой.
+ Вы уже записываете голосовую трансляцию. Пожалуйста закончите текущую голосовую трансляцию, чтобы начать новую.
+ Кто-то другой уже записывает голосовую трансляцию. Подождите пока их голосовая трансляция закончится, чтобы начать новую.
+ У вас нет необходимых разрешений для начала голосовой трансляции в этой комнате. Свяжитесь с администратором комнаты, чтобы получить разрешения.
+ Не получилось начать новую голосовую трансляцию
+ Перемотать вперёд на 30 секунд
+ Перемотать назад на 30 секунд
+ Буферизация
+ Приостановить голосовую трансляцию
+ Проиграть или продолжить голосовую трансляцию
+ Остановить запись голосовой трансляции
+ Приостановить запись голосовой трансляции
+ Продолжить запись голосовой трансляции
+ Прямая трансляция
+ Подлинность этого зашифрованного сообщения не может быть гарантирована на этом устройстве.
+ Сканировать QR-код
+ Отправьте ваше первое сообщение, чтобы пригласить %s в переписку
+ Этот QR-код выглядит неправильно. Пожалуйста, попробуйте подтвердить другим способом.
+ Вы не сможете получить доступ к истории зашифрованных сообщений. Сбросьте вашу защищённую резевную копию и ключи подтверждения, чтобы начать заново.
+ Сброс пароля
+ Выберите новый пароль
+ %s пришлёт вам ссылку для подтверждения
+ %s нуждается в подтверждении вашей учётной записи
+ %s нуждается в подтверждении вашей учётной записи
+ Связаться
+ Element Matrix Services (EMS) — надёжная хостинговая служба для быстрой и безопасной связи в режиме реального времени. Узнайте больше на <a href=\"${ftue_ems_url}\">element.io/ems</a>
+ Открыть список пространств
+ Включено:
+ Что-то пошло не так. Пожалуйста, проверьте соединение и попробуйте ещё раз.
+ Открыть экран инструментов для разработчика
+ Простите, эта комната не была найдена.
+\nПожалуйста, попробуйте снова позже.%s
+ ⚠ В этой комнате есть неподтверждённые устройства, они не смогут расшифровывать сообщения, отправленные вами.
+ Дать разрешение
+ Другие пользователи могут найти вас по %s
+ Осталось %1$s
+ создал опрос.
+ отправил наклейку.
+ отправил видео.
+ отправил изображение.
+ отправил голосовое сообщение.
+ отправил аудиофайл.
+ отправил файл.
+ В ответ на
+ Скрыть IP-адрес
+ Показать IP-адрес
+ Цитируя
+ В ответ на %s
+ Редактирование
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-sk/strings.xml b/library/ui-strings/src/main/res/values-sk/strings.xml
index bf57233b37..f59073c5db 100644
--- a/library/ui-strings/src/main/res/values-sk/strings.xml
+++ b/library/ui-strings/src/main/res/values-sk/strings.xml
@@ -2653,7 +2653,7 @@
V záujme čo najlepšieho zabezpečenia, overte svoje relácie a odhláste sa z každej relácie, ktorú už nepoznáte alebo nepoužívate.
Iné relácie
Relácie
- Otvoriť zoznam priestorov
+ Zoznam priestorov
Vytvoriť novú konverzáciu alebo miestnosť
Ľudia
Obľúbené
@@ -2765,7 +2765,7 @@
Zapnúť nové usporiadanie
Ostatní používatelia v priamych správach a miestnostiach, do ktorých sa pripojíte, si môžu pozrieť úplný zoznam vašich relácií.
\n
-\nTo im poskytuje istotu, že sa s vami naozaj rozprávajú, ale zároveň to znamená, že vidia názov relácie, ktorý sem zadáte.
+\nTo im poskytuje istotu, že sa komunikujú naozaj s vami, ale zároveň to znamená, že vidia názov relácie, ktorý sem zadáte.
Premenovanie relácií
Overené relácie, do ktorých ste sa prihlásili pomocou svojich prihlasovacích údajov a ktoré boli následne overené buď pomocou vašej bezpečnostnej prístupovej frázy, alebo krížovým overením.
\n
@@ -2868,7 +2868,7 @@
Žiadosť zlyhala.
Možnosť nahrávania a odosielania hlasového vysielania v časovej osi miestnosti.
Zapnúť hlasové vysielanie (v štádiu aktívneho vývoja)
- Načítavanie do vyrovnávacej pamäte
+ Načítavanie do vyrovnávacej pamäte…
Pozastaviť hlasové vysielanie
Prehrať alebo pokračovať v nahrávaní hlasového vysielania
Zastaviť nahrávanie hlasového vysielania
@@ -2891,4 +2891,37 @@
- %1$d vybraté
- %1$d vybraných
+ Prepnutie režimu na celú obrazovku
+ Formátovanie textu
+ Už nahrávate hlasové vysielanie. Ukončite aktuálne hlasové vysielanie a spustite nové.
+ Niekto iný už nahráva hlasové vysielanie. Počkajte, kým sa skončí jeho hlasové vysielanie, a potom spustite nové.
+ Nemáte požadované oprávnenia na spustenie hlasového vysielania v tejto miestnosti. Obráťte sa na správcu miestnosti, aby vám rozšíril oprávnenia.
+ Nie je možné spustiť nové hlasové vysielanie
+ Rýchle posunutie dozadu o 30 sekúnd
+ Rýchle posunutie dopredu o 30 sekúnd
+ Overené relácie sú všade tam, kde používate toto konto po zadaní svojho prístupového hesla alebo po potvrdení svojej totožnosti inou overenou reláciou.
+\n
+\nTo znamená, že máte všetky kľúče potrebné na odomknutie zašifrovaných správ a potvrdenie pre ostatných používateľov, že tejto relácii dôverujete.
+
+ - Odhlásiť sa z %1$d relácie
+ - Odhlásiť sa z %1$d relácií
+ - Odhlásiť sa z %1$d relácií
+
+ Odhlásiť sa
+ Ostáva %1$s
+ Cituje
+ vytvoril/a anketu.
+ poslal/a nálepku.
+ poslal/a video.
+ poslal/a obrázok.
+ poslal/a zvukovú správu.
+ poslal/a zvukový súbor.
+ poslal súbor.
+ V odpovedi na
+ Skryť IP adresu
+ Zobraziť IP adresu
+ Odpoveď na %s
+ Úprava
+ Zobraziť posledné konverzácie v systémovej ponuke zdieľania
+ Povoliť priame zdieľanie
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-sq/strings.xml b/library/ui-strings/src/main/res/values-sq/strings.xml
index a6af0a4921..58214e8a22 100644
--- a/library/ui-strings/src/main/res/values-sq/strings.xml
+++ b/library/ui-strings/src/main/res/values-sq/strings.xml
@@ -601,9 +601,7 @@
Formatojini mesazhet duke përdorur sintaksën Markdown përpara se të dërgohen. Kjo lejon formatim të thelluar, f.v., përdorimi i yllthit për ta shfaqur tekstin me të pjerrëta.
Nuk prek ftesat, heqjet dhe dëbimet.
${app_name}-i grumbullon të dhëna analitike anonime që të na lejojë ta përmirësojmë aplikacionin.
- Të shfaqen krejt mesazhet prej %s\?
-\n
-\nKini parasysh që ky veprim do të sjellë rinisjen e aplikacionit dhe mund të hajë ca kohë.
+ Të shfaqen krejt mesazhet prej %s\?
Nis kamerën e sistemit, në vend se skenën e kamerës vetjake.
Shfaq veprimin
On/Off sintakse Markdown
@@ -897,10 +895,10 @@
S’u arrit të dërgohej sugjerimi (%s)
Shfaq te rrjedha kohore akte të fshehura
Përgjegjës integrimesh
- app_id:
- push_key:
- app_display_name:
- emër_sesioni:
+ ID Aplikacioni:
+
+ Emër Aplikacioni Në Ekran:
+ Emër Sesioni Në Ekran:
Mesazhe të Drejtpërdrejtë
Po pritet…
Po fshehtëzohet miniatura…
@@ -949,11 +947,11 @@
Po përdorni %1$s për të zbuluar dhe për të qenë i zbulueshëm nga kontakte ekzistues që njihni.
S’po përdorni ndonjë shërbyes identitetesh. Që të zbuloni dhe të jini i zbulueshëm nga kontakte ekzistuese që njihni, formësoni një të tillë më poshtë.
Adresa email të zbulueshme
- Mundësitë rreth zbulimesh do të shfaqen sapo të keni shtuar një email.
+ Mundësitë e zbulimit do të shfaqen sapo të keni shtuar një adresë email.
Mundësi zbulimesh do të shfaqen sapo të keni shtuar një numër telefoni.
Shkëputja prej shërbyesit tuaj të identiteteve do të thotë se s’do të jeni i zbulueshëm prej përdoruesish të tjerë dhe s’do të jeni në gjendje të ftoni të tjerë me email ose telefon.
Numra telefoni të zbulueshëm
- Ju dërguam një email ripohimi te %s, hapeni dhe klikoni mbi lidhjen e ripohimit
+ Ju dërguam një email te %s, hapeni dhe klikoni mbi lidhjen e ripohimit
Jepni një URL shërbyesi identitetesh
S’u lidh dot te shërbyes identitetesh
Ju lutemi, jepni URL-në e shërbyesit të identiteteve
@@ -1080,7 +1078,7 @@
Aplikacioni s’është në gjendje të krijojë llogari në këtë shërbyes Home.
\n
\nDoni të regjistroheni duke përdorur një klient web\?
- Ky emai s’është përshoqëruar me ndonjë llogari.
+ Kjo adresë email s’është e përshoqëruar me ndonjë llogari.
Ricaktoni fjalëkalimin në %1$s
Te mesazhet tuaj do të dërgohet një email verifikimi, për të ripohuar caktimin e fjalëkalimit tuaj të ri.
Pasuesi
@@ -1089,7 +1087,7 @@
Kujdes!
Ndryshimi i fjalëkalimit tuaj do të sjellë zerim të çfarëdo kyçesh fshehtëzimi skaj-më-skaj në krejt sesionet tuaj, duke e bërë të palexueshëm historikun e bisedave të fshehtëzuara. Ujdisni një Kopjeruajtje Kyçesh ose eksportoni kyçet e dhomës tuaj prej një tjetër sesioni, përpara se të ricaktoni fjalëkalimin tuaj.
Vazhdo
- Ky email s’është i lidhur me ndonjë llogari
+ Kjo adresë email s’është e lidhur me ndonjë llogari
Kontrolloni te mesazhet tuaj të marrë
Një email verifikimi u dërgua te %1$s.
Prekni mbi lidhjen që të ripohohet fjalëkalimi juaj i ri. Pasi të keni ndjekur lidhjen që përmban, klikoni më poshtë.
@@ -1103,7 +1101,7 @@
\n
\nTë ndalet procesi i ndryshimit të fjalëkalimit\?
Caktoni adresë email
- Caktoni një email për rimarrje të llogarisë tuaj. Më vonë, mundeni të lejoni persona që njihni t’ju zbulojnë përmes email-it tuaj.
+ Caktoni një adresë email për rimarrje të llogarisë tuaj. Më vonë, mundeni të lejoni persona që njihni t’ju zbulojnë përmes kësaj adrese.
Email
Email (në daçi)
Pasuesi
@@ -1445,7 +1443,7 @@
Mesazhi u fshi
Shfaq mesazhe të hequr
Shfaq një vendmbajtëse për mesazhe të hequr
- Ju dërguam një email ripohimi te %s, ju lutemi, së pari, shihni email-in tuaj dhe klikoni mbi lidhjen e ripohimit
+ Ju dërguam një email te %s, ju lutemi, së pari, shihni email-in tuaj dhe klikoni mbi lidhjen e ripohimit
Kodi i verifikimit s’është i saktë.
MEDIA
S’ka media në këtë dhomë
@@ -1518,9 +1516,7 @@
\n
\nKëtë veprim mund ta zhbëni në çfarëdo kohe, te rregullimet e përgjithshme.
Hiqe shpërfilljen e përdoruesit
- Heqja e shpërfilljes së këtij përdoruesi do të shfaqë sërish krejt mesazhet prej tij.
-\n
-\nKini parasysh se ky veprim do të sjellë rinisjen e aplikacionit dhe do të hajë ca kohë.
+ Heqja e shpërfilljes së këtij përdoruesi do të shfaqë sërish krejt mesazhet prej tij.
Anuloje ftesën
Jeni i sigurt se doni të anulohet ftesa për këtë përdorues\?
Përzëre përdoruesin
@@ -1534,7 +1530,7 @@
Heqja e dëbimit përdoruesit do t’i lejojë të marrë pjesë sërish në dhomë.
Te llogaria juaj s’është shtuar ndonjë numër telefoni
Adresa email
- Te llogaria juaj s’është shtuar ndonjë email
+ Te llogaria juaj s’është shtuar ndonjë adresë email
Numra telefoni
Të hiqet %s\?
Sigurohuni që keni klikuar te lidhja në email-in që ju kemi dërguar.
@@ -1552,7 +1548,7 @@
Integrimet janë të çaktivizuara
Që të bëhet kjo, aktivizoni “Lejo integrime”, te Rregullimet.
Email-e dhe numra telefonash
- Administroni email-e dhe numra telefonash të lidhur me llogarinë tuaj Matrix
+ Administroni adresa email dhe numra telefonash të lidhur me llogarinë tuaj Matrix
- %d përdorues i dëbuar
- %d përdorues të dëbuar
@@ -1605,7 +1601,7 @@
Kjo llogari është çaktivizuar.
S’u ruajt dot kartelë media
Ripohoni identitetin tuaj duke verifikuar këto kredenciale hyrjeje, duke i akorduar hyrje te mesazhe të fshehtëzuar.
- Për privatësinë tuaj, ${app_name}-i mbulon vetëm dërgim email-esh dhe numrash telefoni përdoruesi të koduar.
+ Për privatësinë tuaj, ${app_name}-i mbulon vetëm dërgim adresash email dhe numrash telefoni përdoruesi të koduar.
Caktoni rol
Rol
Hapni fjalosje
@@ -1769,7 +1765,7 @@
%1$d nga %2$d
Jepe pranimin
Shfuqizoje pranimin tim
- Keni dhënë pranimin tuaj për të dërguar email-e dhe numra telefonash te ky shërbyes identitetesh që të zbulojë përdorues të tjerë prej kontakteve tuaj.
+ Keni dhënë pranimin tuaj për të dërguar adresa email-e dhe numra telefonash te ky shërbyes identitetesh që të zbulojë përdorues të tjerë prej kontakteve tuaj.
Dërgo email-e dhe numra telefonash
Sugjerime
Përdorues të Ditur
@@ -2135,7 +2131,7 @@
Përmendje dhe Fjalëkyçe
Njoftime Parazgjedhje
%s te Rregullimet, që të merrni ftesa drejt e në ${app_name}.
- Lidheni këtë email me llogarinë tuaj
+ Lidheni këtë adresë email me llogarinë tuaj
Kjo ftesë për te kjo hapësirë u dërgua te %s që s’është i përshoqëruar me llogarinë tuaj
Kjo ftesë për te kjo dhomë qe dërguar për %s që s’është i përshoqëruar me llogarinë tuaj
Krejt dhomat ku gjendeni do të shfaqen te Home.
@@ -2203,7 +2199,7 @@
Hyrje në hapësirë
Kush mund të hyjë\?
Aktivizo njoftime me email për %s
- Që të merrni email me njoftim, ju lutemi, përshoqërojini llogarisë tuaj Matrix një email
+ Që të merrni email me njoftim, ju lutemi, përshoqërojini llogarisë tuaj Matrix një adresë email
Njoftim me email
Të përmirësojë hapësirën
Të ndryshojë emrin e hapësirës
@@ -2249,8 +2245,8 @@
Pyetje ose temë pyetësori
Krijoni Pyetësor
A pranoni të dërgohen këto hollësi\?
- Për të zbuluar kontakte ekzistuese, duhet të dërgoni hollësi kontakti (email-e dhe numra telefonash) te shërbyesi juaj i identiteteve. Para dërgimit, i fshehtëzojmë të dhënat tuaja, për privatësi.
- Dërgo email-e dhe numra telefonash te %s
+ Për të zbuluar kontakte ekzistuese, duhet të dërgoni hollësi kontakti (adresa email dhe numra telefonash) te shërbyesi juaj i identiteteve. Para dërgimit, i fshehtëzojmë të dhënat tuaja, për privatësi.
+ Dërgo adresa email dhe numra telefonash te %s
Kontaktet tuaja janë private. Për të zbuluar përdorues prej kontakteve tuaja, na duhet leja juaj për të dërguar hollësi kontakti te shërbyesi juaj i identiteteve.
Është bërë dalja nga sesioni!
U dol nga dhoma!
@@ -2355,7 +2351,7 @@
Bashkësi
Ekipe
Shokë dhe familje
- Do t’ju ndihmojmë të lidheni.
+ Do t’ju ndihmojmë të lidheni
Me kë do të bisedoni më shumë\?
Po e shihni tashmë këtë rrjedhë!
Shiheni në Dhomë
@@ -2411,15 +2407,15 @@
Shërbyesi Home s’pranon emër përdorues vetëm me shifra.
Anashkalojeni këtë hap
Ruajeni dhe vazhdoni
- Parapëlqimet tuaja u ruajtën.
+ Kaloni te rregullimet, kur të doni, që të përditësoni profilin tuaj
Kaq qe!
Shkojmë
- Këtë mund ta ndryshoni kurdo.
+ Erdh koha t’i jepet surrat emrit
Shtoni një foto profili
Këtë mund ta ndryshoni më vonë
Emër Në Ekran
Zgjidhni një emër për në ekran
- Llogaria juaj %s u krijua.
+ Llogaria juaj %s u krijua
Përgëzime!
Shpjemëni në shtëpi
Personalizoni profil
@@ -2450,4 +2446,411 @@
Prani
Mësoni më tepër
Provojeni
-
+ Aktivizo shkurtore lejesh për Thirrje Element
+ S’u gjet metodë tjetër veç njëkohësimit në prapaskenë.
+ ${app_name}-it i duhet një fshehtinë e pastër, për të qenë i përditësuar, për arsyen vijuese:
+\n%s
+\n
+\nKini parasysh se ky veprim do të sjellë rinisjen e aplikacionit dhe mund të dojë ca kohë.
+ Regjistro emrin, versionin dhe URL-në e klientit, për të dalluar më kollaj sesionet te përgjegjës sesionesh.
+ Veprimtaria e fundit më %1$s
+ Apliko format me të nënvizuara
+ Apliko format me të hequravije
+ Apliko format me të pjerrta
+ Apliko format me të trasha
+ Ju lutemi, sigurohuni se e dini origjinën e këtij kodi. Duke lidhur pajisje, do t’i jepni dikujt hyrje të plotë në llogarinë tuaj.
+ Ripohojeni
+ Riprovoni
+ Pa përputhje\?
+ Po bëhet hyrja juaj
+ Po lidhet me pajisjen
+ Skanoni kodin QR
+ Po bëhet hyrja te një pajisje celulare\?
+ Shfaq kod QR te kjo pajisje
+ Përzgjidhni “Skanoni kod QR”
+ Filloja në skenën e hyrjes
+ Përzgjidhni “Hyni me kod QR”
+ Filloja në skenën e hyrjes
+ Përzgjidhni “Shfaq kod QR”
+ Kaloni te Rregullime -> Siguri & Privatësi
+ Hapeni aplikacionin në pajisjen tuaj tjetër
+ Hyrja u anulua në pajisjen tuaj tjetër.
+ Ai kod QR është i pavlefshëm.
+ Duhet bërë hyrja te pajisja tjetër.
+ Nga pajisja tjetër është bërë tashmë hyrja.
+ Kërkesa dështoi.
+ Kërkesa u hodh poshtë në pajisjen tjetër.
+ Lidhja me këtë pajisje nuk mbulohet.
+ Lidhje e pasuksesshme
+ U vendos lidhje e siguruar
+ Hyni me kod QR
+ Skanoni kodin QR
+ 3
+ 2
+ 1
+ Provojeni
+ Prekeni djathtas në krye që të shihni mundësinë për dhënie përshtypjesh.
+ Jepni Përshtypje
+ Hyni në Hapësirat tuaja (poshtë djathtas) më shpejt dhe më kollaj se kurrë më parë.
+ Hyni Në Hapësira
+ Që të thjeshtohet ${app_name} juaj, skedat tanimë janë opsionale. Administrojini duke përdorur menunë djathtas në krye.
+ Mirë se vini te një pamje e re!
+ Ky është vendi ku do të shfaqen mesazhet tuaj të palexuar, kur të ketë të tillë.
+ S’ka gjë për ta raportuar.
+ Aplikacioni “all-in-one” i fjalosjeve të siguruara, për ekipe, shokë dhe ente. Që t’ia filloni, krijoni një fjalosje, ose hyni në një dhomë ekzistuese.
+ Mirë se vini te ${app_name},
+\n%s.
+ Hapësirat janë një mënyrë e re për të grupuar dhoma dhe persona. Shtoni një dhomë ekzistuese, ose krijoni një të re, duke përdorur butonin poshtë djathtas.
+ %s
+\nduket paksa si i zbrazët.
+ Jini në gjendje të incizoni dhe dërgoni transmetim zanor në rrjedhën kohore të dhomës.
+ Aktivizoni transmetim zanor (nën zhvillim aktiv)
+ Aktivizo regjistrim hollësish klienti
+ Shihini më qartë dhe kontrolloni më mirë krejt sesionet tuaj.
+ Aktivizo përgjegjës të ri sesionesh
+ Përdorues të tjerë në mesazhe të drejtpërdrejtë dhe dhoma ku hyni janë në gjendje të shohin një listë të plotë të sesioneve tuaj.
+\n
+\nKjo u jep atyre besim se po flasin vërtet me ju, por do të thotë gjithashtu që mund shohin emrin e sesionit që jepni këtu.
+ Riemërtim sesionesh
+ Sesionet e verifikuar përfaqësojnë sesione ku është bërë hyrja dhe janë verifikuar, ose duke përdorur togfjalëshin tuaj të sigurt, ose me verifikim.
+\n
+\nKjo do të thotë se zotërojnë kyçe fshehtëzimi për mesazhe tuajt të mëparshëm dhe u ripohojnë përdoruesve të tjerë, me të cilët po komunikoni, se këto sesione ju takojnë juve.
+ Sesione të verifikuar
+ Sesionet e paverifikuar janë sesione në të cilët është bërë hyrja me kredencialet tuaja, por pa u bërë verifikim.
+\n
+\nDuhet të jeni posaçërisht të qartë se i njihni këto sesione, ngaqë mund të përbëjnë përdorim të paautorizuar të llogarisë tuaj.
+ Sesione të paverifikuar
+ Sesioni joaktive janë sesione që keni ca kohë që s’i përdorni, por që vazhdojnë të marrin kyçe fshehtëzimi.
+\n
+\nHeqja e sesioneve joaktive përmirëson sigurinë dhe punimin dhe e bën më të lehtë për ju të pikasni nëse një sesion i ri është i dyshimtë.
+ Sesione joaktive
+ Mund të përdorni këtë pajisje për të bërë hyrjen në një pajisje celulare apo web me një kod QR. Për ta bërë këtë ka dy mënyra:
+ Hyni me Kod QR
+ Ju lutemi, kini parasysh se emrat e sesioneve janë të dukshëm edhe për personat me të cilët komunikoni.
+ Emra vetjakë sesionesh mund t’ju ndihmojnë të njihni më kollaj pajisjet tuaja.
+ Emër sesioni
+ Riemërtoni sesionin
+ Adresë IP
+ Sistem operativ
+ Model
+ Shfletues
+ URL
+ Version
+ Ëmër
+ Aplikacion
+ Veprimtaria e fundit
+ Emër sesioni
+ Merrni njoftime push për këtë sesion.
+ Njoftime Push
+ Hollësi aplikacioni, pajisjeje dhe veprimtarie.
+ Hollësi sesioni
+ Dilni nga ky sesion
+ Përzgjidhni sesione
+ Spastroje Filtrin
+ S’u gjetën sesione joaktive.
+ S’u gjetën seanca të paverifikuara.
+ S’u gjetën sesione të verifikuara.
+
+ - Shihni mundësinë e daljes nga sesione të vjetër (%1$d ditë ose më tepër) të cilët s’i përdorni më.
+ - Shihni mundësinë e daljes nga sesione të vjetër (%1$d ditë ose më tepër) të cilët s’i përdorni më.
+
+ Joaktive
+ Verifikoni sesionet tuaj, për shkëmbim më të sigurt mesazhesh, ose dilni prej atyre që nuk i njihni, apo përdorni më.
+ Të paverifikuar
+ Për sigurinë më të mirë, dilni nga çfarëdo sesioni që nuk e njihni apo përdorni më.
+ Të verifikuar
+ Filtroji
+
+ - Joaktiv për %1$d ditë, ose më gjatë
+ - Joaktiv për %1$d ditë, ose më gjatë
+
+ Jo aktiv
+ Jo gati për shkëmbim të sigurt mesazhesh
+ E paverifikuar
+ Gati për shkëmbim të sigurt mesazhesh
+ E verifikuar
+ Krejt sesionet
+ Filtroji
+ Pajisje
+ Sesion
+ Sesioni i Tanishëm
+
+ - Shihni mundësinë e daljes nga sesione të vjetër (%1$d ditë ose më tepër) të cilët s’i përdorni më.
+ - Shihni mundësinë e daljes nga sesione të vjetër (%1$d ditë ose më tepër) të cilët s’i përdorni më.
+
+ Sesione joaktive
+ Verifikojini, ose dilni nga sesione të paverifikuar.
+ Sesione të paverifikuar
+ Përmirësoni sigurinë e llogarisë tuaj duke ndjekur këto rekomandime.
+ Rekomandime sigurie
+
+ - Joaktiv për %1$d+ ditë (%2$s)
+ - Joaktiv për %1$d+ ditë (%2$s)
+
+ I paverifikuar · Sesioni juaj i tanishëm
+ I paverifikuar · Veprimtari së fundi më %1$s
+ I verifikuar · Veprimtaria e fundit më %1$s
+ Shihni Krejt (%1$d)
+ Shihni Hollësitë
+ Verifiko Sesion
+ Verifikoni sesionin tuaj të tanishëm, që të shfaqni gjendjen e verifikimit të këtij sesioni.
+ Për sigurinë dhe besueshmërinë më të mirë, verifikojeni, ose dilni nga ky sesion.
+ Verifikoni sesionin tuaj të tanishëm, për shkëmbim më të sigurt të mesazheve.
+ Ky sesion është gati për shkëmbim të sigurt mesazhesh.
+ Sesioni juaj i tanishëm është gati për shkëmbim të sigurt mesazhesh.
+ Gjendje e panjohur verifikimi
+ Sesion i paverifikuar
+ Sesion i verifikuar
+ Lloj i panjohur pajisjeje
+ Desktop
+ Web
+ Celular
+ Për sigurinë më të mirë, verifikoni sesionet tuaja dhe dilni nga çfarëdo sesioni që s’e njihni, ose s’e përdorni më.
+ Sesione të tjera
+
+ - U hoq %d mesazh
+ - U hoqë %d mesazhe
+
+ Aktivizoni tregim vendndodhjeje
+ Ju lutemi, kini parasysh: kjo është një veçori në zhvillim, që përdor një sendërtim të përkohshëm. Kjo do të thotë se s’do të jeni në gjendje të fshini historikun e vendndodhjeve tuaja dhe përdoruesit e përparuar do të jenë në gjendje të shohin historikun e vendndodhjeve tuaja, edhe pasi të keni ndalur dhënien “live” për këtë dhomë të vendndodhjes tuaj.
+ Tregim “live” vendndodhjeje
+ Kanal i tanishëm: %s
+ Kanal
+ S’gjendet pikëmbarimi.
+ Pikëmbarim i tanishëm: %s
+ Pikëmbarim
+ Hëpërhë po përdoret %s.
+ Metodë
+
+ - U gjet %d metodë.
+ - U gjetën %d metoda.
+
+ S’u gjet metodë tjetër veç Google Play Service.
+ Metoda të gatshme
+ Metodë njoftimi
+ Njëkohësim në prapaskenë
+ Shërbime Google
+ Zgjidhni si të merren njoftime
+ Tregimi i ekranit është në punë e sipër
+ Tregim Ekrani ${app_name}
+ Kontakt
+ Kamerë
+ Vendndodhje
+ Pyetësorë
+ Transmetim zanor
+ Bashkëngjitje
+ Ngjitës
+ Fototekë
+ Nisni një transmetim zanor
+ Vendndodhje drejtpërsëdrejti
+ Jepe vendndodhjen
+ Që të mund të ndani drejtpërsëdrejti vendndodhje me të tjerë në këtë dhomë, lypset të keni lejet e duhura.
+ S’keni leje të tregoni vendndodhje drejtpërsëdrejti
+ Përditësuar %1$s më parë
+ Sendërtim i përkohshëm: vendndodhjet mbeten në historikun e dhomës
+ Aktivizo Tregim Vendndodhjeje “Live”
+ Vendndodhje Drejtpërsëdrejti ${app_name}
+ Edhe %1$s
+ “Live” deri më %1$s
+ Shihni vendndodhje “live”
+ Tregimi “live” i vendndodhjes përfundoi
+ Po ngarkohet vendndodhje “live”…
+ S’arrihet të ngarkohet hartë
+\nKy shërbyes Home mund të mos jetë formësuar të shfaqë harta.
+ Përfundimet do të jenë të dukshme pasi të ketë përfunduar pyetësori
+ Kur bëhet ftesë në një dhomë të fshehtëzuar që ka historik ndarjesh me të tjerët, historiku i fshehtëzuar do të jetë i dukshëm.
+
+ Ndal transmetim zanor
+ Luani ose vazhdoni luajtje transmetimi zanor
+ Ndal incizim transmetimi zanor
+ Ndal incizim transmetimi zanor
+ Vazhdo incizim transmetimi zanor
+ Drejtpërdrejt
+ Shfaq hollësitë më të reja të përdoruesit
+ Disa përfundime mund të jenë të fshehura, ngaqë janë private dhe ju duhet një ftesë për to.
+ S’u gjetën përfundime
+ Mos braktis ndonjë
+ Braktisi krejt
+ Gjëra në këtë hapësirë
+ I zënë
+ Hap rregullimet
+ S’u aktivizua dot mirëfilltësim biometrik.
+ Mirëfilltësimi biometrik qe çaktivizuar ngaqë tani së fundi është shtuar një metodë e re mirëfilltësimi biometrik. Mund ta riaktivizoni që nga Rregullimet.
+ S’mund të garantohet mirëfilltësia e këtij mesazhi të fshehtëzuar në këtë pajisje.
+ Tastierë inkonjito
+ Dërgoni mesazhin tuaj të parë për të ftuar në fjalosje %s
+ Mesazhet në këtë fjalosje do të jenë të fshehtëzuar skaj-më-skaj.
+ S’do të jeni në gjendje të shihni historikun e mesazheve të fshehtëzuara. Që t’ia rifilloni nga e para, ricaktoni kyçet tuaja për Kopjeruajtje të Sigurt Mesazhesh dhe kyçe verifikimi.
+ S’arrihet të verifikohet kjo pajisje
+ Sesione
+ Tregoi vendndodhjen e vet drejtpërsëdrejti
+ E paraprin një mesazh tekst i thjeshtë me (╯°□°)╯︵ ┻━┻
+ S’hapet dot kjo lidhje: bashkësitë janë zëvendësuar nga hapësirat
+ Skanoni kodin QR
+ Emër përdoruesi / Email / Telefon
+ Jeni qenie njerëzore\?
+ Ndiqni udhëzimet e dërguara te %s
+ Ricaktim fjalëkalimi
+ Harrova fjalëkalimin
+ Ridërgo email
+ S’morët email\?
+ Ndiqni udhëzimet e dërguara te %s
+ Verifikoni email-in tuaj
+ Ridërgomëni kodin
+ Te %s u dërgua një kod
+ Ripohoni numrin e telefonit tuaj
+ Dil nga krejt pajisjet
+ Ricaktoni fjalëkalimin
+ Sigurohuni të jetë 8 ose më shumë shenja.
+ Zgjidhni një fjalëkalim të ri
+ Fjalëkalim i Ri
+ Kontrolloni email-in tuaj.
+ %s do t’ju dërgojë një lidhje verifikimi
+ Kod ripohimi
+ Numër Telefoni
+ %s lyp verifikimin e llogarisë tuaj
+ Jepni numrin e telefonit tuaj
+ Email
+ %s lyp verifikimin e llogarisë tuaj
+ Jepni email-in tuaj
+ Ju lutemi, lexoni kushte dhe rregulla të %s
+ Rregulla shërbyesi
+ Lidhuni
+ Element Matrix Services (EMS) është një shërbim strehimi i fuqishëm dhe i besueshëm, për komunikim të shpejtë, të sigurt dhe të atypëratyshëm. Shihni më tepër se si, teelement.io/ems
+ Doni të strehoni shërbyesin tuaj\?
+ URL Shërbyesi
+ Cila është adresa e shërbyesit tuaj\?
+ Cila është adresa e shërbyesit tuaj\? Kjo është si një shtëpi për krejt të dhënat tuaja
+ Përzgjidhni shërbyesin tuaj
+ Mirë se u kthyet!
+ Përpunojeni
+ Ose
+ Ku gjenden bisedat tuaja
+ Ku do të gjenden bisedat tuaja
+ Duhet të jetë 8 ose më shumë shenja
+ Të tjerët mund t’ju zbulojnë %s
+ Krijoni llogarinë tuaj
+ Transmetim Zanor
+ Hap listë hapësirash
+ Krijoni një bisedë ose dhomë të re
+ Ricaktoni metodë njoftimesh
+ Të aktivizuara:
+ Etiketë profili:
+ ID sesioni:
+ Jepi
+ Po përditësohen të dhënat tuaja…
+ Diç shkoi ters. Ju lutemi, kontrolloni lidhjen tuaj në rrjet dhe riprovoni.
+ Persona
+ Të parapëlqyera
+ Të palexuara
+ Krejt
+ Kopjeruajtja ka një nënshkrim të vlefshëm prej këtij përdoruesi.
+ Hap skenën e mjeteve të zhvilluesit
+ Na ndjeni, kjo dhomë s’u gjet.
+\nJu lutemi, riprovoni më vonë.%s
+ Përdor parazgjedhje sistemi
+ Zgjidheni dorazi
+ Caktoje vetvetiu
+ Zgjidhni madhësi shkronjash
+ ⚠ Në këtë dhomë ka pajisje të paverifikuara, ato s’do të jenë në gjendje të shfshehtëzojnë mesazhet që dërgoni.
+ Mos dërgo kurrë prej këtij sesioni mesazhe të fshehtëzuar te sesione të paverifikuar në këtë dhomë.
+ Figurat e animuara vetëluaji
+ S’u arrit të regjistrohej token pikëmbarimi te shërbyesi Home:
+\n%1$s
+ Pikëmbarim i regjistruar me sukses te shërbyesi Home.
+ Regjistrim Pikëmbarimi
+ Akordojini Leje
+ ${app_name} lyp lejen për shfaqje njoftimesh.
+\nJu lutemi, akordoni lejen.
+
+ - %1$s dhe %2$d tjetër
+ - %1$s dhe %2$d të tjerë
+
+ %1$s dhe %2$s
+ ${app_name} lyp leje të shfaqë njoftime. Njoftimet mund të shfaqin mesazhet tuaja, ftesa tuajat, etj.
+\n
+\nJu lutemi, lejoni përdorimin e tyre te flluska pasuese, që të jeni në gjendje të shihni njoftime.
+ Email jo i verifikuar, kontrolloni te Të marrët tuaj
+ Reshtni tregimin e ekranit tuaj
+ Tregojuani ekranin të tjerëve
+ Ky është vendi ku do të gjenden kërkesat dhe ftesat tuaja të reja.
+ S’ka gjë të re.
+ Ftesa
+ Hapësirat janë një mënyrë e re për të grupuar dhoma dhe njerëz. Që t’ia filloni, krijoni një hapësirë.
+ Ende pa hapësira.
+ Provoni përpunuesin e teksteve të pasur (për tekst të thjeshtë vjen së shpejti)
+ Aktivizo përpunues teksti të pasur
+ Krijo MD vetëm për mesazhin e parë
+ Një Element i thjeshtuar, me skeda opsionale
+ Aktivizo skemë të re
+ A - Z
+ Veprimtari
+ Renditi sipas
+ Shfaq të freskëta
+ Shfaq filtra
+ Parapëlqime skeme grafike
+ Shpërzgjidhi krejt
+ Përzgjidhi krejt
+ E mora
+ Më pas
+ Rifillo
+ sek
+ min
+ h
+ - Për disa përdorues u hoq shpërfillja
+ Kërkesë njëkohësimi fillestar
+ Eksploroni Dhoma
+ Ndërroni Hapësire
+ Krijo Dhomë
+ Filloni Fjalosje
+ Krejt Fjalosjet
+
+ - %1$d i përzgjedhura
+ - %1$d të përzgjedhura
+
+ Shërbyesi Home nuk mbulon hyrje me kod QR.
+ U has një problem sigurie, kur ujdisej shkëmbim i siguruar mesazhesh. Mund të jetë komprometuar një nga sa vijon: shërbyesi juaj Home; lidhja(et) tuaja internet; pajisja(et) tuaja;
+ Lidhja s’u plotësua në kohën e duhur.
+ Kontrolloni pajisjen ku jeni i futur, duhet të shfaqet kodi më poshtë. Sigurohuni se kodi më poshtë përputhet me atë pajisje:
+ Skanoni kodin QR më poshtë me pajisjen tuaj prej nga është dalë nga llogaria.
+ Përdorni pajisjen tuaj ku jeni brenda llogarisë që të skanoni kodin QR më poshtë:
+ Përdorni kamerën në këtë pajisje që të skanoni kodin QR të shfaqur në pajisjen tuaj tjetër:
+ Mirato vetvetiu widget-e Thirrjesh Element Call dhe akordo përdorim kamere / mikfrofoni
+ MSC3061: Po jepen kyçe dhome për mesazhe të dikurshëm
+ Shfaq hollësitë më të reja të profileve (avatar dhe emër në ekran) për krejt mesazhet.
+ Kërko doemos që tastiera të mos përditësojë ndonjë të dhënë të personalizuar, bie fjala, historik shtypjeje në të dhe fjalor bazuar në ç’keni shtypur në biseda. Kini parasysh se disa tastiera mund të mos e respektojnë këtë rregullim.
+ Ky kod QR duket i formuar keq. Ju lutemi, provoni ta verifikoni me tjetër metodë.
+ 🔒 Keni aktivizuar fshehtëzim për sesionie të verifikuar vetëm për krejt dhomat, që nga Rregullime Sigurie.
+ Luaj figura të animuara te rrjedha kohora sapo zënë të duken
+ krijoi një pyetësor.
+ dërgoi një ngjitës.
+ dërgoi një video.
+ dërgoi një figurë.
+ dërgoi një mesazh zanor.
+ dërgoi një kartelë audio.
+ dërgoi një kartelë.
+ Në përgjigje të
+ Hyni/Dilni nga mënyra “Sa krejt ekrani”
+ Sesionet e verifikuar janë kudo ku përdorni këtë llogari pas dhënies së frazëkalimit tuaj, apo ripohimit të identitetit tuaj me një sesion tjetër të verifikuar.
+\n
+\nKjo do të thotë se keni krejt kyçet e nevojshëm për të shkyçur mesazhet tuaj të fshehtëzuar dhe për të ripohuar se e besoni këtë sesion.
+ Fshihe adresën IP
+ Shfaq adresë IP
+
+ - Dilni nga %1$d sesion
+ - Dilni nga %1$d sesione
+
+ Dilni
+ Formatim teksti
+ Edhe %1$s
+ Jeni duke incizuar tashmë një transmetim zanor. Ju lutemi, që të nisni një të ri, përfundoni transmetimin tuaj aktual zanor.
+ Dikush tjetër është tashmë duke incizuar një transmetim zanor. Prisni që të përfundojë transmetimi zanor i tij, pa të filloni një të ri.
+ S’keni lejet e domosdoshme për të nisur një transmetim zanor në këtë dhomë. Lidhuni me një përgjegjës dhome që të përmirësojë lejet tuaja.
+ S’mund të niset një transmetim i ri zanor
+ Shtyrje përpara 30 sekonda
+ Kthim prapa 30 sekonda
+ Si përgjigje për %s
+ Aktivizo MD të lënë për më vonë
+ Tkurr pjella të %s
+ Zgjero pjella të %s
+
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-sv/strings.xml b/library/ui-strings/src/main/res/values-sv/strings.xml
index eaa327e977..45cfe4338b 100644
--- a/library/ui-strings/src/main/res/values-sv/strings.xml
+++ b/library/ui-strings/src/main/res/values-sv/strings.xml
@@ -2836,4 +2836,34 @@
- %1$d vald
- %1$d valda
+ Växla fullskärmsläge
+ Verifierade sessioner är alla ställen där du använder det här kontot efter att ha angett din lösenfras eller bekräftat din identitet med en annan verifierad session.
+\n
+\nDetta betyder att du har alla nycklar som krävs för att låsa upp dina krypterade meddelanden att bekräfta för andra användare att du litar på den här sessionen.
+
+ - Logga ut ur %1$d session
+ - Logga ut ur %1$d sessioner
+
+ Logga ut
+ Textformatering
+ Du spelar redan in en röstsändning. Avsluta din nuvarande röstsändning för att starta en ny.
+ Någon annan spelar redan in en röstsändning. Vänta på att deras röstsändning avslutas för att starta en ny.
+ Du är inte behörig att starta en ny röstsändning i det här rummet. Kontakta en rumsadministratör för att uppgradera dina behörigheter.
+ Kan inte starta en ny röstsändning
+ Spola framåt 30 sekunder
+ Spola tillbaka 30 sekunder
+ skickade en omröstning.
+ skickade en dekal.
+ skickade en video.
+ skickade en bild.
+ skickade ett röstmeddelande.
+ skickade en ljudfil.
+ skickade en fil.
+ Svar på
+ Dölj IP-adress
+ Visa IP-adress
+ %1$s kvar
+ Citerar
+ Besvarar %s
+ Redigerar
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-uk/strings.xml b/library/ui-strings/src/main/res/values-uk/strings.xml
index f633a0ef2f..6a1c5355ab 100644
--- a/library/ui-strings/src/main/res/values-uk/strings.xml
+++ b/library/ui-strings/src/main/res/values-uk/strings.xml
@@ -2839,12 +2839,12 @@
Перейменувати сеанс
Вийти з цього сеансу
Не звірений - Ваш поточний сеанс
- Розпочати трансляцію голосового повідомлення
+ Розпочати голосову трансляцію
Справжність цього зашифрованого повідомлення не може бути гарантована на цьому пристрої.
Заборонити клавіатурі оновлювати будь-які персоналізовані дані, як-от історію набору тексту та словник, на основі того, що ви набрали в розмовах. Зверніть увагу, що деякі клавіатури можуть не дотримуватися цього налаштування.
Клавіатура інкогніто
Надсилає (╯°□°)╯︵ ┻━┻ на початку текстового повідомлення
- Голосові повідомлення
+ Голосові трансляції
Відкрийте інструменти розробника
🔒 Ви увімкнули шифрування лише для перевірених сеансів для всіх кімнат у налаштуваннях безпеки.
⚠ У цій кімнаті є неперевірені пристрої, вони не зможуть розшифрувати повідомлення, які ви надсилаєте.
@@ -2920,21 +2920,21 @@
Вхід з іншого пристрою вже виконано.
Під час налаштування захищеного обміну повідомленнями виникла проблема з безпекою. Можливо, порушено одне з таких налаштувань: Ваш домашній сервер; Ваше інтернет-з\'єднання; Ваш пристрій;
Запит не виконаний.
- Можливість записувати та надсилати голосові повідомлення до стрічки кімнати.
- Увімкнути голосові повідомлення (в активній розробці)
- Буферизація
- Призупинити голосове повідомлення
- Відтворити або поновити відтворення голосового повідомлення
- Припинити запис голосового повідомлення
- Призупинити запис голосового повідомлення
- Відновити запис голосового повідомлення
+ Можливість записувати та надсилати голосові трансляції до стрічки кімнати.
+ Увімкнути голосові трансляції (в активній розробці)
+ Буферизація…
+ Призупинити голосову трансляцію
+ Відтворити або поновити відтворення голосової трансляції
+ Припинити запис голосової трансляції
+ Призупинити запис голосової трансляції
+ Відновити запис голосової трансляції
Наживо
Вибрати сеанси
Контакт
Камера
Місце перебування
Опитування
- Голосові повідомлення
+ Голосові трансляції
Вкладення
Наліпки
Фотобібліотека
@@ -2946,4 +2946,38 @@
- Вибрано %1$d
Вибрати все
+ Перемкнути повноекранний режим
+ Форматування тексту
+ Ви вже записуєте голосову трансляцію. Завершіть поточну трансляцію, щоб розпочати нову.
+ Хтось інший вже записує голосову трансляцію. Зачекайте, поки вона завершиться, щоб розпочати нову.
+ Ви не маєте необхідних дозволів для початку голосової трансляції в цю кімнату. Зверніться до адміністратора кімнати, щоб оновити ваші дозволи.
+ Не вдалося розпочати нову голосову трансляцію
+ Перемотати вперед на 30 секунд
+ Перемотати назад на 30 секунд
+ Звірені сеанси — це будь-який пристрій, на якому ви використовуєте цей обліковий запис після введення парольної фрази або підтвердження вашої особи за допомогою іншого звіреного сеансу.
+\n
+\nЦе означає, що ви маєте всі ключі, необхідні для розблокування ваших зашифрованих повідомлень і підтвердження іншим користувачам, що ви довіряєте цьому сеансу.
+
+ - Вийти з %1$d сеансу
+ - Вийти з %1$d сеансів
+ - Вийти з %1$d сеансів
+ - Вийти з %1$d сеансів
+
+ Вийти
+ Залишилося %1$s
+ надсилає аудіофайл.
+ надсилає файл.
+ У відповідь на
+ Сховати IP-адресу
+ створює опитування.
+ надсилає наліпку.
+ надсилає відео.
+ надсилає зображення.
+ надсилає голосове повідомлення.
+ Показати IP-адресу
+ Цитуючи
+ У відповідь %s
+ Редагування
+ Показувати останні бесіди в системному меню загального доступу
+ Увімкнути пряме поширення
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml
index 688652265b..0a01610c36 100644
--- a/library/ui-strings/src/main/res/values-zh-rCN/strings.xml
+++ b/library/ui-strings/src/main/res/values-zh-rCN/strings.xml
@@ -30,7 +30,7 @@
发送者的设备没有向我们发送此消息的密钥。
无法发送消息
Matrix 错误
- 电子邮箱地址
+ 电子邮件地址
手机号码
%1$s 撤回了对 %2$s 的邀请
%1$s 让未来的房间历史记录对 %2$s 可见
@@ -214,8 +214,8 @@
登录
提交
错误的用户名和/或密码
- 此电子邮箱地址似乎无效
- 此电子邮箱地址已被使用。
+ 此电子邮件地址似乎无效
+ 此电子邮件地址已被使用。
忘记密码?
请输入有效的 URL
没有包含有效的 JSON
@@ -228,7 +228,7 @@
搜索
过滤房间成员
没有结果
- 添加电子邮箱地址
+ 添加电子邮件地址
添加手机号码
版本
olm 版本
@@ -257,7 +257,7 @@
开始视频通话
拍摄照片或视频
此主服务器想确认你不是机器人
- 电子邮箱地址验证失败:请确保你已点击邮件中的链接
+ 电子邮件地址验证失败:请确保你已点击邮件中的链接
原始
通话正在连接……
${app_name} 需要权限以访问你的麦克风来进行语音通话。
@@ -348,11 +348,11 @@
显示系统设置中的应用程序信息。
通话请求
使用条款
- 其他
+ 其它
通知目标
登录为
- 请检查你的电子邮箱并点击里面包含的链接。完成时请点击继续。
- 此电子邮箱地址已被使用。
+ 请检查你的电子邮件并点击里面包含的链接。完成时请点击继续。
+ 此电子邮件地址已被使用。
此手机号码已被使用。
设置为主要地址
取消设置为主要地址
@@ -434,7 +434,7 @@
你添加了一个新会话“%s”,它正在请求加密密钥。
你的未验证会话“%s”正在请求加密密钥。
开始验证
- bug报告
+ 错误报告
拍摄照片
拍摄视频
使用原生相机
@@ -828,7 +828,7 @@
撤消
断开连接
拒绝
- 这不是有效的Matrix服务器地址
+ 这不是有效的 Matrix 服务器地址
无法在此 URL 找到主服务器,请检查
播放
忽略
@@ -990,13 +990,13 @@
更改身份服务器
你正在使用 %1$s 与你知道的现有联系人相互发现。
你当前未使用身份服务器。若要与你知道的现有联系人相互发现,请在下方配置。
- 可发现电子邮件地址
+ 可发现的电子邮件地址
发现选项将在你添加电子邮件地址后出现。
发现选项将在你添加电话号码后出现。
- 与你的身份服务器断开意味着你将无法被其它用户发现并且无法通过电子邮件和电话邀请他人。
+ 与您的身份服务器断开连接意味着您将不会被其他用户发现,并且您将无法通过电子邮件或电话邀请其他人。
可发现电话号码
我们向%s发送了一封电子邮件,请检查你的电子邮件并点击确认链接
- 我们向%s发送了电子邮件,请先检查你的电子邮件并点击确认链接
+ 我们向 %s 发送了一封电子邮件,请先检查您的电子邮件并点击确认链接
输入身份服务器 URL
无法连接到身份服务器
请输入身份服务器 url
@@ -1007,7 +1007,7 @@
您当前在身份服务器 %1$s 上共享电子邮件地址或电话号码。您需要重新连接到 %2$s 才能停止共享它们。
同意身份服务器 (%s) 服务条款使你可以通过电子邮件地址或电话号码被发现。
启用详细日志。
- 详细日志将通过在您发送 RageShake 时提供更多日志来帮助开发人员。即使启用,应用程序也不会记录消息内容或任何其他私人数据。
+ 详细日志将通过在您发送愤怒摇动(RageShake)时提供更多日志来帮助开发人员。即使启用,应用程序也不会记录消息内容或任何其他私人数据。
接收你的主服务器条款和条件后请重试。
服务器似乎响应时间太长,这可能是由于连接不良或服务器错误引起的。请稍后再试。
发送附件
@@ -1143,14 +1143,14 @@
输入验证码
重新发送
下一个
- 国际电话号码必须以 ‘+’ 开头
+ 国际电话号码必须以“+”开头
电话号码似乎无效。请检查
在 %1$s 上注册
用户名或电子邮件
用户名
密码
下一个
- 用户名已占用
+ 该用户名已被使用
警告
你的账户尚未创建。是否中止注册过程?
选择 matrix.org
@@ -1171,7 +1171,7 @@
如果你在主服务器上设置了账户,在下方使用你的 Matrix ID(例 @user:domain.com)和密码。
Matrix ID
如果你不知道你的密码,返回并重置。
- 这不是一个有效的用户标识符。期望的格式:\'@user:homeserver.org\'
+ 这不是有效的用户标识符。预期格式:\'@user:homeserver.org\'
无法找到有效的主服务器。请检查你的标识符
你已登出
这可能由于多种原因:
@@ -1199,13 +1199,13 @@
除非你登录以恢复加密密钥,否则你将无法访问安全消息。
当前会话用于用户 %1$s 而你提供了用户 %2$s 的凭证。${app_name} 不支持此功能。
\n请先清除数据,然后重新登录另一个账户。
- 你的 matrix.to 链接更是不正确
+ 您的 matrix.to 链接格式错误
描述太短
初始同步…
高级设置
开发者模式
开发者模式激活隐藏的功能,也可能使应用不稳定。仅供开发者使用!
- 摇一摇
+ 愤怒摇动(Rageshake)
检测阈值
摇动手机以测试检测阈值
检测到摇动!
@@ -1213,7 +1213,7 @@
当前会话
其它会话
仅显示第一个结果,请输入更多字符…
- 快速失败
+ 快速失败(Fail-fast)
发生意外错误时,${app_name} 可能更经常崩溃
在明文消息前添加 ¯\\_(ツ)_/¯
启用加密
@@ -1531,7 +1531,7 @@
你无法访问此消息因为发送者有意不发送密钥
正在等待加密历史
Riot 现已成为 Element!
- 我们很高兴地宣布我们改名了!你的应用已经更新到最新版本,并且你已登录你的账户。
+ 我们很高兴地宣布我们已经更名了!您的应用程序是最新的,并且您已登录到您的帐户。
明白了
了解更多
将恢复密钥保存到
@@ -1588,9 +1588,9 @@
移除 %s?
请确认你已点击我们向你发送的电子邮件中的链接。
电子邮件和电话号码
- 管理链接到你的Matrix账户的电子邮件地址和电话号码
+ 管理与您的 Matrix 帐户链接的电子邮件地址和电话号码
代码
- 请使用国际格式(电话号码必须以“+”开始)
+ 请使用国际格式(电话号码必须以“+”开头)
验证此登录来确认你的身份,授权其访问加密消息。
无法打开你被封禁的房间。
无法找到此房间。请确认它存在。
@@ -1714,7 +1714,7 @@
建议
已知用户
二维码
- 通过QR码添加
+ 通过二维码添加
房间设置
话题
房间话题(可选)
@@ -1804,7 +1804,7 @@
- %d 个条目
- 不是有效的 Matrix 二维码
+ 这不是有效的 Matrix 二维码
扫描二维码
添加人员
邀请朋友
@@ -2099,15 +2099,15 @@
我的用户名
我的显示名称
通知事项
- 其他
+ 其它
提及和关键词
默认通知
可用视频通话
可用语音通话
在 ${app_name} 中直接接收邀请的设置 %s。
- 将此电子邮件地址与您的帐户相关联
- 加入这个空间的邀请被发送至 %s,此邮箱未与您的账户相关联
- 加入这个房间的邀请被发送至 %s,此邮箱未与您的账户相关联
+ 将此电子邮件地址与您的帐户链接
+ 此空间的邀请已发送至与您的帐户无关的 %s
+ 此房间的邀请已发送至与您的帐户无关的 %s
你所在的全部房间将显示在主页上。
在主页上显示所有房间
滑动结束通话
@@ -2171,7 +2171,7 @@
空间访问
谁可以访问?
为 %s 启用电子邮件通知
- 要接收通知邮件,请将一个电子邮件地址关联到你的Matrix账户
+ 要接收带有通知的电子邮件,请将电子邮件地址链接到您的 Matrix 帐户
电子邮件通知
升级空间
更改空间名称
@@ -2303,7 +2303,7 @@
BETA
共享你的实时位置
缩放到当前位置
- 地图上选定位置的图钉
+ 地图上选定位置的固定标记
无投票
验证你的电子邮件
@@ -2336,12 +2336,12 @@
共享位置
您需要拥有正确的权限才能在此房间中共享实时位置。
你没有权限共享实时位置
- %1$s前已更新
+ %1$s 前已更新
临时执行:地点在房间历史中持续存在
启用实时位置共享
位置共享正在进行中
- ${app_name}实时位置
- 剩余%1$s
+ ${app_name} 实时位置
+ 剩余 %1$s
停止
实时共享直到 %1$s
查看实时位置
@@ -2350,14 +2350,14 @@
启用实时位置
加载地图失败
打开,用
- ${app_name}无法访问你的位置。请稍后再试。
- ${app_name}无法访问你的位置
+ ${app_name} 无法访问你的位置。请稍后再试。
+ ${app_name} 无法访问你的位置
在房间中查看
MSC3061:为过去的消息共享房间密钥
在共享历史的加密房间中邀请时,加密历史将可见。
- 8小时
- 1小时
- 15分钟
+ 8 小时
+ 1 小时
+ 15 分钟
共享此位置
共享此位置
共享实时位置
@@ -2409,7 +2409,7 @@
发送图片和视频
打开相机
服务器政策
- Element Matrix Services(EMS)是一个健壮且可靠的主机托管服务,可实现快速、安全和实时的通信。在<a href=\"${ftue_ems_url}\">element.io/ems</a>上了解如何使用
+ Element Matrix Services (EMS) 是一种强大且可靠的托管服务,可实现快速、安全和实时的通信。 了解如何在 <a href=\"${ftue_ems_url}\">element.io/ems</a>
想架设自己的服务器?
服务器URL
选择你的服务器
@@ -2539,13 +2539,13 @@
自动允许 Element 通话小部件并授予相机/麦克风访问权限
启用 Element 通话权限快捷方式
实时位置
- 这个QR码看起来不正常。请尝试用另一个方法验证。
+ 此二维码看起来格式不正确。请尝试使用其它方法进行验证。
你无法访问加密消息历史。重置你的安全消息备份和验证密钥以重新开始。
无法验证此设备
你的服务器地址是什么?
你的对话发生的地方
%1$s 和 %2$s
- 电子邮件未确认,检查你的收件箱
+ 电子邮件未验证,请检查您的收件箱
无法加载地图
\n此主服务器可能没有设置好显示地图。
打开设置
@@ -2562,7 +2562,7 @@
A—Z
活动
排序方式
- 显示最近的
+ 显示最近
显示过滤条件
布局偏好
探索房间
@@ -2622,7 +2622,7 @@
你当前的会话已准备好安全地收发消息。
仅在首条消息创建私聊消息
启用延迟的私聊消息
- 简化的Element,带有可选的标签
+ 简化的 Element,带有可选的标签
无痕键盘
请求键盘不要根据您在对话中输入的内容更新任何个性化数据,例如输入历史记录和字典。 请注意,某些键盘可能不遵守此设置。
${app_name}需要权限来显示通知。通知可以显示消息、邀请等。
@@ -2694,7 +2694,7 @@
验证您当前的会话以显示此会话的验证状态。
未知的验证状态
开始语音广播
- 缓冲
+ 正在缓冲……
暂停语音广播
实时
知道了
@@ -2762,9 +2762,46 @@
停止语音广播录制
暂停语音广播录制
继续语音广播录制
- 扫描QR码
+ 扫描二维码
语音广播
已启用:
会话ID:
出了点差错。请检查您的网络连接并重试。
+ 联系人
+ 切换全屏模式
+ 选择会话
+ 文本格式
+ 相机
+ 位置
+ 投票
+ 语音广播
+ 附件
+ 贴纸
+ 照片库
+ 您没有在此房间内开始语音广播所需的权限。联系房间管理员升级您的权限。
+ 其他人已经在录制语音广播。等待他们的语音广播结束以开始新的广播。
+ 您已经在录制语音广播。请结束您当前的语音广播以开始新的语音广播。
+ 无法开始新的语音广播
+ 快进 30 秒
+ 快退 30 秒
+ 取消全选
+ 全选
+
+ - 已选择 %1$d
+
+ 已创建投票。
+ 已发送贴纸。
+ 已发送视频。
+ 已发送图片。
+ 已发送语音消息。
+ 已发送音频文件。
+ 已发送文件。
+ 已验证的会话是在输入你的口令词组或用另一个已验证的会话确认你的身份之后你使用此账户的任何地方。
+\n
+\n这意味着你拥有解锁你的已加密消息和向其他用户证明你信任此会话所需的全部密钥。
+
+ - 登出%1$d个会话
+
+ 登出
+ 剩余%1$s
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml
index 739ea09755..9a5439b2ae 100644
--- a/library/ui-strings/src/main/res/values-zh-rTW/strings.xml
+++ b/library/ui-strings/src/main/res/values-zh-rTW/strings.xml
@@ -2760,7 +2760,7 @@
請求失敗。
可以在聊天室時間軸中錄製並傳送語音廣播。
啟用語音廣播(正在積極開發中)
- 正在緩衝
+ 正在緩衝……
暫停語音廣播
播放或繼續語音廣播
停止語音廣播錄製
@@ -2781,4 +2781,35 @@
- 已選取 %1$d
+ 切換全螢幕模式
+ 文字格式化
+ 您已在錄製語音廣播。請結束您目前的語音廣播以開始新的。
+ 其他人已在錄製語音廣播。等待他們的語音廣播結束以開始新的。
+ 您沒有在此聊天室中開始語音廣播的必要權限。請聯絡聊天室管理員以升級您的權限。
+ 無法開始新的語音廣播
+ 快轉30秒
+ 快退30秒
+ 已驗證的工作階段是您輸入通關密語或透過另一個已驗證工作階段確認您的身份後使用此帳號的任何地方。
+\n
+\n這代表了您擁有解鎖加密訊息並向其他使用者確認您信任此工作階段所需的所有金鑰。
+
+ - 登出 %1$d 個工作階段
+
+ 登出
+ 剩餘 %1$s
+ 已建立投票。
+ 已傳送貼圖。
+ 已傳送影片。
+ 已傳送圖片。
+ 已傳送語音訊息。
+ 已傳送音訊檔。
+ 已傳送檔案。
+ 回覆給
+ 隱藏 IP 位置
+ 顯示 IP 位置
+ 引用
+ 回覆給 %s
+ 正在編輯
+ 在系統分享選單中顯示最近聊天
+ 啟用直接分享
\ No newline at end of file
diff --git a/library/ui-strings/src/main/res/values/donottranslate.xml b/library/ui-strings/src/main/res/values/donottranslate.xml
index 741d23dbc6..bfe751ef5a 100755
--- a/library/ui-strings/src/main/res/values/donottranslate.xml
+++ b/library/ui-strings/src/main/res/values/donottranslate.xml
@@ -2,6 +2,7 @@
…
+ –
Not implemented yet in ${app_name}
diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml
index a5ee918fb5..822b9dd901 100644
--- a/library/ui-strings/src/main/res/values/strings.xml
+++ b/library/ui-strings/src/main/res/values/strings.xml
@@ -134,6 +134,9 @@
** Unable to decrypt: %s **
The sender\'s device has not sent us the keys for this message.
+ %1$s ended a voice broadcast.
+ You ended a voice broadcast.
+
@@ -416,6 +419,7 @@
Got it
Select all
Deselect all
+ Yes, Stop
Copied to clipboard
@@ -1032,6 +1036,8 @@
Use /confetti command or send a message containing ❄️ or 🎉
Autoplay animated images
Play animated images in the timeline as soon as they are visible
+ Enable direct share
+ Show recent chats in the system share menu
Show join and leave events
Invites, removes, and bans are unaffected.
Show account events
@@ -1643,7 +1649,10 @@
It looks like you’re trying to connect to another homeserver. Do you want to sign out?
Edit
+ Editing
Reply
+ Replying to %s
+ Quoting
Reply in thread
View In Room
@@ -1680,7 +1689,8 @@
Create New Room
Create New Space
No network. Please check your Internet connection.
- Something went wrong. Please check your network connection and try again.
+
+ Something went wrong. Please check your network connection and try again.
"Change network"
"Please wait…"
Updating your data…
@@ -2482,6 +2492,9 @@
Key Requests
Export Audit
+ Nightly build
+ Get the latest build (note: you may have trouble to sign in)
+
Unlock encrypted messages history
Refresh
@@ -2644,8 +2657,12 @@
Unencrypted
Encrypted by an unverified device
The authenticity of this encrypted message can\'t be guaranteed on this device.
- Review where you’re logged in
- Verify all your sessions to ensure your account & messages are safe
+
+ Review where you’re logged in
+
+ Verify all your sessions to ensure your account & messages are safe
+ You have unverified sessions
+ Review to ensure your account is safe
Verify the new login accessing your account: %1$s
@@ -3020,7 +3037,7 @@
Auto Report Decryption Errors.
Your system will automatically send logs when an unable to decrypt error occurs
- Enable Thread Messages
+ Enable threaded messages
Note: app will be restarted
Show latest user info
Show the latest profile info (avatar and display name) for all the messages.
@@ -3089,12 +3106,24 @@
(%1$s)
Live
+ Live broadcast
+
+ Buffering…
Resume voice broadcast record
Pause voice broadcast record
Stop voice broadcast record
Play or resume voice broadcast
Pause voice broadcast
- Buffering
+ Fast backward 30 seconds
+ Fast forward 30 seconds
+ Can’t start a new voice broadcast
+ You don’t have the required permissions to start a voice broadcast in this room. Contact a room administrator to upgrade your permissions.
+ Someone else is already recording a voice broadcast. Wait for their voice broadcast to end to start a new one.
+ You are already recording a voice broadcast. Please end your current voice broadcast to start a new one.
+
+ %1$s left
+ Stop live broadcasting?
+ Are you sure you want to stop your live broadcast? This will end the broadcast and the full recording will be available in the room.
Anyone in %s will be able to find and join this room - no need to manually invite everyone. You’ll be able to change this in room settings anytime.
Anyone in a parent space will be able to find and join this room - no need to manually invite everyone. You’ll be able to change this in room settings anytime.
@@ -3223,6 +3252,7 @@
Location
Camera
Contact
+ Text formatting
Show less
@@ -3286,6 +3316,7 @@
Verify your current session for enhanced secure messaging.
Verify or sign out from this session for best security and reliability.
Verify your current session to reveal this session\'s verification status.
+ This session doesn\'t support encryption and thus can\'t be verified.
Verify Session
View Details
View All (%1$d)
@@ -3308,7 +3339,7 @@
- Consider signing out from old sessions (%1$d day or more) that you don’t use anymore.
- Consider signing out from old sessions (%1$d days or more) that you don’t use anymore.
- Current Session
+ Current session
Session
Device
@@ -3339,6 +3370,14 @@
No inactive sessions found.
Clear Filter
Select sessions
+ Sign out
+
+ - Sign out of %1$d session
+ - Sign out of %1$d sessions
+
+ Sign out of all other sessions
+ Show IP address
+ Hide IP address
Sign out of this session
Session details
Application, device, and activity information.
@@ -3367,7 +3406,10 @@
Unverified sessions
Unverified sessions are sessions that have logged in with your credentials but not been cross-verified.\n\nYou should make especially certain that you recognise these sessions as they could represent an unauthorised use of your account.
Verified sessions
- Verified sessions have logged in with your credentials and then been verified, either using your secure passphrase or by cross-verifying.\n\nThis means they hold encryption keys for your previous messages, and confirm to other users you are communicating with that these sessions are really you.
+
+ Verified sessions have logged in with your credentials and then been verified, either using your secure passphrase or by cross-verifying.\n\nThis means they hold encryption keys for your previous messages, and confirm to other users you are communicating with that these sessions are really you.
+ Verified sessions are anywhere you are using this account after entering your passphrase or confirming your identity with another verified session.\n\nThis means that you have all the keys needed to unlock your encrypted messages and confirm to other users that you trust this session.
+ This session doesn\'t support encryption, so it can\'t be verified.\n\nYou won\'t be able to participate in rooms where encryption is enabled when using this session.\n\nFor best security and privacy, it is recommended to use Matrix clients that support encryption.
Renaming sessions
Other users in direct messages and rooms that you join are able to view a full list of your sessions.\n\nThis provides them with confidence that they are really speaking to you, but it also means they can see the session name you enter here.
Enable new session manager
@@ -3438,10 +3480,26 @@
Confirm
Please ensure that you know the origin of this code. By linking devices, you will provide someone with full access to your account.
-
+
Apply bold format
Apply italic format
Apply strikethrough format
Apply underline format
-
+ Set link
+ Toggle full screen mode
+
+ Text
+ Link
+ Create a link
+ Edit link
+
+
+ In reply to
+ sent a file.
+ sent an audio file.
+ sent a voice message.
+ sent an image.
+ sent a video.
+ sent a sticker.
+ created a poll.
diff --git a/library/ui-styles/src/main/res/values/dimens.xml b/library/ui-styles/src/main/res/values/dimens.xml
index 50d5aaf014..4c911c9e97 100644
--- a/library/ui-styles/src/main/res/values/dimens.xml
+++ b/library/ui-styles/src/main/res/values/dimens.xml
@@ -49,6 +49,7 @@
1dp
28dp
14dp
+ 44dp
28dp
6dp
@@ -74,7 +75,8 @@
22dp
- 48dp
+ 48dp
+ 36dp
112dp
diff --git a/library/ui-styles/src/main/res/values/stylable_sessions_list_header_view.xml b/library/ui-styles/src/main/res/values/stylable_sessions_list_header_view.xml
index 098ec263fc..c1a51000b7 100644
--- a/library/ui-styles/src/main/res/values/stylable_sessions_list_header_view.xml
+++ b/library/ui-styles/src/main/res/values/stylable_sessions_list_header_view.xml
@@ -5,6 +5,7 @@
+
diff --git a/library/ui-styles/src/main/res/values/stylable_voice_broadcast_metadata_view.xml b/library/ui-styles/src/main/res/values/stylable_voice_broadcast_metadata_view.xml
new file mode 100644
index 0000000000..1f72eeb396
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/stylable_voice_broadcast_metadata_view.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
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
index b640fc49d9..94f4d86160 100644
--- a/library/ui-styles/src/main/res/values/styles_edit_text.xml
+++ b/library/ui-styles/src/main/res/values/styles_edit_text.xml
@@ -4,7 +4,7 @@
diff --git a/library/ui-styles/src/main/res/values/styles_voice_broadcast.xml b/library/ui-styles/src/main/res/values/styles_voice_broadcast.xml
new file mode 100644
index 0000000000..eb85378141
--- /dev/null
+++ b/library/ui-styles/src/main/res/values/styles_voice_broadcast.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
diff --git a/library/ui-styles/src/main/res/values/theme_dark.xml b/library/ui-styles/src/main/res/values/theme_dark.xml
index 6b3bca924c..308fd85fe9 100644
--- a/library/ui-styles/src/main/res/values/theme_dark.xml
+++ b/library/ui-styles/src/main/res/values/theme_dark.xml
@@ -55,7 +55,7 @@
- ?vctr_content_quinary
- ?vctr_system
- ?vctr_system
- - ?vctr_content_tertiary
+ - ?vctr_notice_secondary
- @color/element_accent_dark
diff --git a/library/ui-styles/src/main/res/values/theme_light.xml b/library/ui-styles/src/main/res/values/theme_light.xml
index a9dcae0436..73edab6894 100644
--- a/library/ui-styles/src/main/res/values/theme_light.xml
+++ b/library/ui-styles/src/main/res/values/theme_light.xml
@@ -55,7 +55,7 @@
- ?vctr_content_quinary
- ?vctr_system
- ?vctr_system
- - ?vctr_content_tertiary
+ - ?vctr_notice_secondary
- @color/element_accent_light
diff --git a/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt b/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt
index a6b4cc98a6..94f09e0bf5 100644
--- a/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt
+++ b/matrix-sdk-android-flow/src/main/java/org/matrix/android/sdk/flow/FlowRoom.kt
@@ -31,7 +31,6 @@ 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.notification.RoomNotificationState
import org.matrix.android.sdk.api.session.room.send.UserDraft
-import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
import org.matrix.android.sdk.api.session.room.timeline.TimelineEvent
import org.matrix.android.sdk.api.util.Optional
import org.matrix.android.sdk.api.util.toOptional
@@ -100,8 +99,8 @@ class FlowRoom(private val room: Room) {
return room.readService().getReadMarkerLive().asFlow()
}
- fun liveReadReceipt(): Flow> {
- return room.readService().getMyReadReceiptLive().asFlow()
+ fun liveReadReceipt(threadId: String?): Flow> {
+ return room.readService().getMyReadReceiptLive(threadId).asFlow()
}
fun liveEventReadReceipts(eventId: String): Flow> {
@@ -119,13 +118,6 @@ class FlowRoom(private val room: Room) {
return room.roomPushRuleService().getLiveRoomNotificationState().asFlow()
}
- fun liveThreadSummaries(): Flow> {
- return room.threadsService().getAllThreadSummariesLive().asFlow()
- .startWith(room.coroutineDispatchers.io) {
- room.threadsService().getAllThreadSummaries()
- }
- }
-
fun liveThreadList(): Flow> {
return room.threadsLocalService().getAllThreadsLive().asFlow()
.startWith(room.coroutineDispatchers.io) {
diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle
index b9603dbd65..9a4fafebdb 100644
--- a/matrix-sdk-android/build.gradle
+++ b/matrix-sdk-android/build.gradle
@@ -62,7 +62,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
- buildConfigField "String", "SDK_VERSION", "\"1.5.7\""
+ buildConfigField "String", "SDK_VERSION", "\"1.5.18\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
diff --git a/matrix-sdk-android/src/androidTest/assets/crypto_store_20.realm b/matrix-sdk-android/src/androidTest/assets/crypto_store_20.realm
new file mode 100644
index 0000000000..cfdd2e6da6
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/assets/crypto_store_20.realm
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7acd69f37612bab0a1ab7f456656712d7ba19dbb679f81b97b58ef44e239f42
+size 8523776
diff --git a/matrix-sdk-android/src/androidTest/assets/session_42.realm b/matrix-sdk-android/src/androidTest/assets/session_42.realm
new file mode 100644
index 0000000000..9268111699
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/assets/session_42.realm
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ab134a3d77862db7097a507ec363ae17c60b183c98dac460bc7fb227bfd51f2e
+size 270336
diff --git a/matrix-sdk-android/src/androidTest/assets/tchap_session_41.realm b/matrix-sdk-android/src/androidTest/assets/tchap_session_41.realm
new file mode 100644
index 0000000000..4376e55dc6
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/assets/tchap_session_41.realm
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ef28ea4c5ab665398911f48437441a6c5d68593cde1e2c79c4ef6572578473ff
+size 270336
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
index af2d57f9ce..a74f5010c2 100644
--- 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
@@ -16,7 +16,7 @@
package org.matrix.android.sdk.common
-import org.matrix.android.sdk.api.RoomDisplayNameFallbackProvider
+import org.matrix.android.sdk.api.provider.RoomDisplayNameFallbackProvider
class TestRoomDisplayNameFallbackProvider : RoomDisplayNameFallbackProvider {
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/CryptoSanityMigrationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/CryptoSanityMigrationTest.kt
new file mode 100644
index 0000000000..2643bf643a
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/CryptoSanityMigrationTest.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2022 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.database
+
+import android.content.Context
+import androidx.test.platform.app.InstrumentationRegistry
+import io.realm.Realm
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.matrix.android.sdk.internal.crypto.store.db.RealmCryptoStoreMigration
+import org.matrix.android.sdk.internal.crypto.store.db.RealmCryptoStoreModule
+import org.matrix.android.sdk.internal.util.time.Clock
+
+class CryptoSanityMigrationTest {
+ @get:Rule val configurationFactory = TestRealmConfigurationFactory()
+
+ lateinit var context: Context
+ var realm: Realm? = null
+
+ @Before
+ fun setUp() {
+ context = InstrumentationRegistry.getInstrumentation().context
+ }
+
+ @After
+ fun tearDown() {
+ realm?.close()
+ }
+
+ @Test
+ fun cryptoDatabaseShouldMigrateGracefully() {
+ val realmName = "crypto_store_20.realm"
+ val migration = RealmCryptoStoreMigration(object : Clock {
+ override fun epochMillis(): Long {
+ return 0L
+ }
+ })
+ val realmConfiguration = configurationFactory.createConfiguration(
+ realmName,
+ "7b9a21a8a311e85d75b069a343c23fc952fc3fec5e0c83ecfa13f24b787479c487c3ed587db3dd1f5805d52041fc0ac246516e94b27ffa699ff928622e621aca",
+ RealmCryptoStoreModule(),
+ migration.schemaVersion,
+ migration
+ )
+ configurationFactory.copyRealmFromAssets(context, realmName, realmName)
+
+ realm = Realm.getInstance(realmConfiguration)
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration43Test.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration43Test.kt
new file mode 100644
index 0000000000..e5ff7a73eb
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/RealmSessionStoreMigration43Test.kt
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2022 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.database
+
+import android.content.Context
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import io.realm.Realm
+import org.amshove.kluent.fail
+import org.amshove.kluent.shouldBe
+import org.amshove.kluent.shouldBeEqualTo
+import org.amshove.kluent.shouldNotBe
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+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.internal.database.mapper.EventMapper
+import org.matrix.android.sdk.internal.database.model.EventAnnotationsSummaryEntity
+import org.matrix.android.sdk.internal.database.model.SessionRealmModule
+import org.matrix.android.sdk.internal.database.query.where
+import org.matrix.android.sdk.internal.util.Normalizer
+
+@RunWith(AndroidJUnit4::class)
+class RealmSessionStoreMigration43Test {
+
+ @get:Rule val configurationFactory = TestRealmConfigurationFactory()
+
+ lateinit var context: Context
+ var realm: Realm? = null
+
+ @Before
+ fun setUp() {
+ context = InstrumentationRegistry.getInstrumentation().context
+ }
+
+ @After
+ fun tearDown() {
+ realm?.close()
+ }
+
+ // Tchap: Use custom realm database
+ @Test
+ fun migrationShouldBeNeeed() {
+ val realmName = "tchap_session_41.realm"
+ val realmConfiguration = configurationFactory.createConfiguration(
+ realmName,
+ "2948ff8106ad80ca8aeba7ef59775075258d8805f9f6eb306add6c3097154bf5c99bbc965931a29e4512f0b3981d3a562c4c86b860846bac2312e1ab61026762",
+ SessionRealmModule(),
+ 43,
+ null
+ )
+ configurationFactory.copyRealmFromAssets(context, realmName, realmName)
+
+ try {
+ realm = Realm.getInstance(realmConfiguration)
+ fail("Should need a migration")
+ } catch (failure: Throwable) {
+ // nop
+ }
+ }
+
+ // Tchap: Use custom realm database
+ // Database key for alias `session_db_feb3823dd11e8b4b0b19d5d1d9e3b864`: 2948ff8106ad80ca8aeba7ef59775075258d8805f9f6eb306add6c3097154bf5c99bbc965931a29e4512f0b3981d3a562c4c86b860846bac2312e1ab61026762
+ // $167541532417nKwjC:agent2.tchap.incubateur.net
+ // $167541543920SxkBP:agent2.tchap.incubateur.net
+ @Test
+ fun testMigration43() {
+ val realmName = "tchap_session_41.realm"
+ val migration = RealmSessionStoreMigration(Normalizer())
+ val realmConfiguration = configurationFactory.createConfiguration(
+ realmName,
+ "2948ff8106ad80ca8aeba7ef59775075258d8805f9f6eb306add6c3097154bf5c99bbc965931a29e4512f0b3981d3a562c4c86b860846bac2312e1ab61026762",
+ SessionRealmModule(),
+ 43,
+ migration
+ )
+ configurationFactory.copyRealmFromAssets(context, realmName, realmName)
+
+ realm = Realm.getInstance(realmConfiguration)
+
+ // assert that the edit from 42 are migrated
+ val editions = EventAnnotationsSummaryEntity
+ .where(realm!!, "\$167541532417nKwjC:agent2.tchap.incubateur.net")
+ .findFirst()
+ ?.editSummary
+ ?.editions
+
+ editions shouldNotBe null
+ editions!!.size shouldBe 1
+ val firstEdition = editions.first()
+ firstEdition?.eventId shouldBeEqualTo "\$167541534818YsPGX:agent2.tchap.incubateur.net"
+ firstEdition?.isLocalEcho shouldBeEqualTo false
+
+ val editEvent = EventMapper.map(firstEdition!!.event!!)
+ val body = editEvent.content.toModel()?.body
+ body shouldBeEqualTo "* Message 2 with edit"
+
+ // assert that the edit from 42 are migrated
+ val editionsOfE2E = EventAnnotationsSummaryEntity
+ .where(realm!!, "\$167541543920SxkBP:agent2.tchap.incubateur.net")
+ .findFirst()
+ ?.editSummary
+ ?.editions
+
+ editionsOfE2E shouldNotBe null
+ editionsOfE2E!!.size shouldBe 1
+ val firstEditionE2E = editionsOfE2E.first()
+ firstEditionE2E?.eventId shouldBeEqualTo "\$167541545321BMCNj:agent2.tchap.incubateur.net"
+ firstEditionE2E?.isLocalEcho shouldBeEqualTo false
+
+ val editEventE2E = EventMapper.map(firstEditionE2E!!.event!!)
+ val body2 = editEventE2E.getClearContent().toModel()?.body
+ body2 shouldBeEqualTo "* Message 2, e2e edit"
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/SessionSanityMigrationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/SessionSanityMigrationTest.kt
new file mode 100644
index 0000000000..c916ffc303
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/SessionSanityMigrationTest.kt
@@ -0,0 +1,65 @@
+/*
+ * 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.database
+
+import android.content.Context
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.platform.app.InstrumentationRegistry
+import io.realm.Realm
+import org.junit.After
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.matrix.android.sdk.internal.database.model.SessionRealmModule
+import org.matrix.android.sdk.internal.util.Normalizer
+
+@RunWith(AndroidJUnit4::class)
+class SessionSanityMigrationTest {
+
+ @get:Rule val configurationFactory = TestRealmConfigurationFactory()
+
+ lateinit var context: Context
+ var realm: Realm? = null
+
+ @Before
+ fun setUp() {
+ context = InstrumentationRegistry.getInstrumentation().context
+ }
+
+ @After
+ fun tearDown() {
+ realm?.close()
+ }
+
+ // Tchap: use custom realm database
+ @Test
+ fun sessionDatabaseShouldMigrateGracefully() {
+ val realmName = "tchap_session_41.realm"
+ val migration = RealmSessionStoreMigration(Normalizer())
+ val realmConfiguration = configurationFactory.createConfiguration(
+ realmName,
+ "2948ff8106ad80ca8aeba7ef59775075258d8805f9f6eb306add6c3097154bf5c99bbc965931a29e4512f0b3981d3a562c4c86b860846bac2312e1ab61026762",
+ SessionRealmModule(),
+ migration.schemaVersion,
+ migration
+ )
+ configurationFactory.copyRealmFromAssets(context, realmName, realmName)
+
+ realm = Realm.getInstance(realmConfiguration)
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/TestRealmConfigurationFactory.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/TestRealmConfigurationFactory.kt
new file mode 100644
index 0000000000..fc5a017287
--- /dev/null
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/internal/database/TestRealmConfigurationFactory.kt
@@ -0,0 +1,196 @@
+/*
+ * Copyright 2022 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.database
+
+import android.content.Context
+import androidx.test.platform.app.InstrumentationRegistry
+import io.realm.Realm
+import io.realm.RealmConfiguration
+import io.realm.RealmMigration
+import org.junit.rules.TemporaryFolder
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+import java.io.File
+import java.io.FileOutputStream
+import java.io.IOException
+import java.io.InputStream
+import java.lang.IllegalStateException
+import java.util.Collections
+import java.util.Locale
+import java.util.concurrent.ConcurrentHashMap
+import kotlin.Throws
+
+/**
+ * Based on https://github.com/realm/realm-java/blob/master/realm/realm-library/src/testUtils/java/io/realm/TestRealmConfigurationFactory.java
+ */
+class TestRealmConfigurationFactory : TemporaryFolder() {
+ private val map: Map = ConcurrentHashMap()
+ private val configurations = Collections.newSetFromMap(map)
+ @get:Synchronized private var isUnitTestFailed = false
+ private var testName = ""
+ private var tempFolder: File? = null
+
+ override fun apply(base: Statement, description: Description): Statement {
+ return object : Statement() {
+ @Throws(Throwable::class)
+ override fun evaluate() {
+ setTestName(description)
+ before()
+ try {
+ base.evaluate()
+ } catch (throwable: Throwable) {
+ setUnitTestFailed()
+ throw throwable
+ } finally {
+ after()
+ }
+ }
+ }
+ }
+
+ @Throws(Throwable::class)
+ override fun before() {
+ Realm.init(InstrumentationRegistry.getInstrumentation().targetContext)
+ super.before()
+ }
+
+ override fun after() {
+ try {
+ for (configuration in configurations) {
+ Realm.deleteRealm(configuration)
+ }
+ } catch (e: IllegalStateException) {
+ // Only throws the exception caused by deleting the opened Realm if the test case itself doesn't throw.
+ if (!isUnitTestFailed) {
+ throw e
+ }
+ } finally {
+ // This will delete the temp directory.
+ super.after()
+ }
+ }
+
+ @Throws(IOException::class)
+ override fun create() {
+ super.create()
+ tempFolder = File(super.getRoot(), testName)
+ check(!(tempFolder!!.exists() && !tempFolder!!.delete())) { "Could not delete folder: " + tempFolder!!.absolutePath }
+ check(tempFolder!!.mkdir()) { "Could not create folder: " + tempFolder!!.absolutePath }
+ }
+
+ override fun getRoot(): File {
+ checkNotNull(tempFolder) { "the temporary folder has not yet been created" }
+ return tempFolder!!
+ }
+
+ /**
+ * To be called in the [.apply].
+ */
+ protected fun setTestName(description: Description) {
+ testName = description.displayName
+ }
+
+ @Synchronized
+ fun setUnitTestFailed() {
+ isUnitTestFailed = true
+ }
+
+ // This builder creates a configuration that is *NOT* managed.
+ // You have to delete it yourself.
+ private fun createConfigurationBuilder(): RealmConfiguration.Builder {
+ return RealmConfiguration.Builder().directory(root)
+ }
+
+ fun String.decodeHex(): ByteArray {
+ check(length % 2 == 0) { "Must have an even length" }
+ return chunked(2)
+ .map { it.toInt(16).toByte() }
+ .toByteArray()
+ }
+
+ fun createConfiguration(
+ name: String,
+ key: String?,
+ module: Any,
+ schemaVersion: Long,
+ migration: RealmMigration?
+ ): RealmConfiguration {
+ val builder = createConfigurationBuilder()
+ builder
+ .directory(root)
+ .name(name)
+ .apply {
+ if (key != null) {
+ encryptionKey(key.decodeHex())
+ }
+ }
+ .modules(module)
+ // Allow writes on UI
+ .allowWritesOnUiThread(true)
+ .schemaVersion(schemaVersion)
+ .apply {
+ migration?.let { migration(it) }
+ }
+ val configuration = builder.build()
+ configurations.add(configuration)
+ return configuration
+ }
+
+ // Copies a Realm file from assets to temp dir
+ @Throws(IOException::class)
+ fun copyRealmFromAssets(context: Context, realmPath: String, newName: String) {
+ val config = RealmConfiguration.Builder()
+ .directory(root)
+ .name(newName)
+ .build()
+ copyRealmFromAssets(context, realmPath, config)
+ }
+
+ @Throws(IOException::class)
+ fun copyRealmFromAssets(context: Context, realmPath: String, config: RealmConfiguration) {
+ check(!File(config.path).exists()) { String.format(Locale.ENGLISH, "%s exists!", config.path) }
+ val outFile = File(config.realmDirectory, config.realmFileName)
+ copyFileFromAssets(context, realmPath, outFile)
+ }
+
+ @Throws(IOException::class)
+ fun copyFileFromAssets(context: Context, assetPath: String?, outFile: File?) {
+ var stream: InputStream? = null
+ var os: FileOutputStream? = null
+ try {
+ stream = context.assets.open(assetPath!!)
+ os = FileOutputStream(outFile)
+ val buf = ByteArray(1024)
+ var bytesRead: Int
+ while (stream.read(buf).also { bytesRead = it } > -1) {
+ os.write(buf, 0, bytesRead)
+ }
+ } finally {
+ if (stream != null) {
+ try {
+ stream.close()
+ } catch (ignore: IOException) {
+ }
+ }
+ if (os != null) {
+ try {
+ os.close()
+ } catch (ignore: IOException) {
+ }
+ }
+ }
+ }
+}
diff --git a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/PollAggregationTest.kt b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/PollAggregationTest.kt
index a37d2ce015..a52e3cd7c7 100644
--- a/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/PollAggregationTest.kt
+++ b/matrix-sdk-android/src/androidTest/java/org/matrix/android/sdk/session/room/timeline/PollAggregationTest.kt
@@ -66,7 +66,7 @@ class PollAggregationTest : InstrumentedTest {
val aliceEventsListener = object : Timeline.Listener {
override fun onTimelineUpdated(snapshot: List) {
- snapshot.firstOrNull { it.root.getClearType() in EventType.POLL_START }?.let { pollEvent ->
+ snapshot.firstOrNull { it.root.getClearType() in EventType.POLL_START.values }?.let { pollEvent ->
val pollEventId = pollEvent.eventId
val pollContent = pollEvent.root.content?.toModel()
val pollSummary = pollEvent.annotations?.pollResponseSummary
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 00d74ab446..68b6a2ddf8 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
@@ -20,6 +20,9 @@ import okhttp3.ConnectionSpec
import okhttp3.Interceptor
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
import org.matrix.android.sdk.api.metrics.MetricPlugin
+import org.matrix.android.sdk.api.provider.CustomEventTypesProvider
+import org.matrix.android.sdk.api.provider.MatrixItemDisplayNameFallbackProvider
+import org.matrix.android.sdk.api.provider.RoomDisplayNameFallbackProvider
import java.net.Proxy
data class MatrixConfiguration(
@@ -66,7 +69,7 @@ data class MatrixConfiguration(
/**
* Thread messages default enable/disabled value.
*/
- val threadMessagesEnabledDefault: Boolean = false,
+ val threadMessagesEnabledDefault: Boolean = true,
/**
* List of network interceptors, they will be added when building an OkHttp client.
*/
@@ -75,9 +78,12 @@ data class MatrixConfiguration(
* Sync configuration.
*/
val syncConfig: SyncConfig = SyncConfig(),
-
/**
* Metrics plugin that can be used to capture metrics from matrix-sdk-android.
*/
- val metricPlugins: List = emptyList()
+ val metricPlugins: List = emptyList(),
+ /**
+ * CustomEventTypesProvider to provide custom event types to the sdk which should be processed with internal events.
+ */
+ val customEventTypesProvider: CustomEventTypesProvider? = null,
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt
index a9753e2407..84650da72f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/SyncConfig.kt
@@ -16,9 +16,13 @@
package org.matrix.android.sdk.api
+import org.matrix.android.sdk.api.session.sync.filter.SyncFilterParams
+
data class SyncConfig(
/**
* Time to keep sync connection alive for before making another request in milliseconds.
*/
val longPollTimeout: Long = 30_000L,
+
+ val syncFilterParams: SyncFilterParams = SyncFilterParams()
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/account/LocalNotificationSettingsContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/account/LocalNotificationSettingsContent.kt
index 2a95ccce7a..75d04f340a 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/account/LocalNotificationSettingsContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/account/LocalNotificationSettingsContent.kt
@@ -21,5 +21,6 @@ import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class LocalNotificationSettingsContent(
- @Json(name = "is_silenced") val isSilenced: Boolean = false
+ @Json(name = "is_silenced")
+ val isSilenced: Boolean?
)
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 f1f48adaf5..668b24a119 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
@@ -131,12 +131,6 @@ interface AuthenticationService {
*/
suspend fun getPasswordPolicy(homeServerConnectionConfig: HomeServerConnectionConfig): PasswordPolicy
- /**
- * @param homeServerConnectionConfig the information about the homeserver and other configuration
- * Return true if qr code login is supported by the server, false otherwise.
- */
- suspend fun isQrLoginSupported(homeServerConnectionConfig: HomeServerConnectionConfig): Boolean
-
/**
* Authenticate using m.login.token method during sign in with QR code.
* @param homeServerConnectionConfig the information about the homeserver and other configuration
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 5b6c1897bf..5de83033e1 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
@@ -22,5 +22,6 @@ data class LoginFlowResult(
val isLoginAndRegistrationSupported: Boolean,
val homeServerUrl: String,
val isOutdatedHomeserver: Boolean,
- val isLogoutDevicesSupported: Boolean
+ val isLogoutDevicesSupported: Boolean,
+ val isLoginWithQrSupported: Boolean,
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/extensions/MetricsExtensions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/extensions/MetricsExtensions.kt
index 9487a27086..7f0e828f62 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/extensions/MetricsExtensions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/extensions/MetricsExtensions.kt
@@ -17,25 +17,51 @@
package org.matrix.android.sdk.api.extensions
import org.matrix.android.sdk.api.metrics.MetricPlugin
+import org.matrix.android.sdk.api.metrics.SpannableMetricPlugin
import kotlin.contracts.ExperimentalContracts
import kotlin.contracts.InvocationKind
import kotlin.contracts.contract
/**
* Executes the given [block] while measuring the transaction.
+ *
+ * @param block Action/Task to be executed within this span.
+ */
+@OptIn(ExperimentalContracts::class)
+inline fun List.measureMetric(block: () -> Unit) {
+ contract {
+ callsInPlace(block, InvocationKind.EXACTLY_ONCE)
+ }
+ try {
+ this.forEach { plugin -> plugin.startTransaction() } // Start the transaction.
+ block()
+ } catch (throwable: Throwable) {
+ this.forEach { plugin -> plugin.onError(throwable) } // Capture if there is any exception thrown.
+ throw throwable
+ } finally {
+ this.forEach { plugin -> plugin.finishTransaction() } // Finally, finish this transaction.
+ }
+}
+
+/**
+ * Executes the given [block] while measuring a span.
+ *
+ * @param operation Name of the new span.
+ * @param description Description of the new span.
+ * @param block Action/Task to be executed within this span.
*/
@OptIn(ExperimentalContracts::class)
-inline fun measureMetric(metricMeasurementPlugins: List, block: () -> Unit) {
+inline fun List.measureSpan(operation: String, description: String, block: () -> Unit) {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
try {
- metricMeasurementPlugins.forEach { plugin -> plugin.startTransaction() } // Start the transaction.
+ this.forEach { plugin -> plugin.startSpan(operation, description) } // Start the transaction.
block()
} catch (throwable: Throwable) {
- metricMeasurementPlugins.forEach { plugin -> plugin.onError(throwable) } // Capture if there is any exception thrown.
+ this.forEach { plugin -> plugin.onError(throwable) } // Capture if there is any exception thrown.
throw throwable
} finally {
- metricMeasurementPlugins.forEach { plugin -> plugin.finishTransaction() } // Finally, finish this transaction.
+ this.forEach { plugin -> plugin.finishSpan() } // Finally, finish this transaction.
}
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/SpannableMetricPlugin.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/SpannableMetricPlugin.kt
new file mode 100644
index 0000000000..54aa21877e
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/SpannableMetricPlugin.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2022 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.metrics
+
+/**
+ * A plugin that tracks span along with transactions.
+ */
+interface SpannableMetricPlugin : MetricPlugin {
+
+ /**
+ * Starts the span for a sub-task.
+ *
+ * @param operation Name of the new span.
+ * @param description Description of the new span.
+ */
+ fun startSpan(operation: String, description: String)
+
+ /**
+ * Finish the span when sub-task is completed.
+ */
+ fun finishSpan()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/SyncDurationMetricPlugin.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/SyncDurationMetricPlugin.kt
new file mode 100644
index 0000000000..79ece002e9
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/metrics/SyncDurationMetricPlugin.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2022 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.metrics
+
+import org.matrix.android.sdk.api.logger.LoggerTag
+import timber.log.Timber
+
+private val loggerTag = LoggerTag("SyncDurationMetricPlugin", LoggerTag.CRYPTO)
+
+/**
+ * An spannable metric plugin for sync response handling task.
+ */
+interface SyncDurationMetricPlugin : SpannableMetricPlugin {
+
+ override fun logTransaction(message: String?) {
+ Timber.tag(loggerTag.value).v("## syncResponseHandler() : $message")
+ }
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/provider/CustomEventTypesProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/provider/CustomEventTypesProvider.kt
new file mode 100644
index 0000000000..c0f66dc1c2
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/provider/CustomEventTypesProvider.kt
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2022 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.provider
+
+import org.matrix.android.sdk.api.session.room.model.RoomSummary
+
+/**
+ * Provide custom event types which should be processed with the internal event types.
+ */
+interface CustomEventTypesProvider {
+
+ /**
+ * Custom event types to include when computing [RoomSummary.latestPreviewableEvent].
+ */
+ val customPreviewableEventTypes: List
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixItemDisplayNameFallbackProvider.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/provider/MatrixItemDisplayNameFallbackProvider.kt
similarity index 94%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixItemDisplayNameFallbackProvider.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/provider/MatrixItemDisplayNameFallbackProvider.kt
index 82008cda8c..971845eae7 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixItemDisplayNameFallbackProvider.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/provider/MatrixItemDisplayNameFallbackProvider.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api
+package org.matrix.android.sdk.api.provider
import org.matrix.android.sdk.api.util.MatrixItem
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/provider/RoomDisplayNameFallbackProvider.kt
similarity index 97%
rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/RoomDisplayNameFallbackProvider.kt
rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/provider/RoomDisplayNameFallbackProvider.kt
index 3c376b55ee..37d9b46b0b 100644
--- 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/provider/RoomDisplayNameFallbackProvider.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.matrix.android.sdk.api
+package org.matrix.android.sdk.api.provider
/**
* This interface exists to let the implementation provide localized room display name fallback.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/Rendezvous.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/Rendezvous.kt
index f724ac4b62..e5b2d6bf12 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/Rendezvous.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/rendezvous/Rendezvous.kt
@@ -35,7 +35,10 @@ import org.matrix.android.sdk.api.session.crypto.crosssigning.KEYBACKUP_SECRET_S
import org.matrix.android.sdk.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import org.matrix.android.sdk.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
+import org.matrix.android.sdk.api.session.crypto.model.CryptoDeviceInfo
+import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
import org.matrix.android.sdk.api.util.MatrixJsonParser
+import org.matrix.android.sdk.api.util.awaitCallback
import timber.log.Timber
/**
@@ -147,6 +150,14 @@ class Rendezvous(
val deviceKey = crypto.getMyDevice().fingerprint()
send(Payload(PayloadType.PROGRESS, outcome = Outcome.SUCCESS, deviceId = deviceId, deviceKey = deviceKey))
+ try {
+ // explicitly download keys for ourself rather than racing with initial sync which might not complete in time
+ awaitCallback> { crypto.downloadKeys(listOf(userId), false, it) }
+ } catch (e: Throwable) {
+ // log as warning and continue as initial sync might still complete
+ Timber.tag(TAG).w(e, "Failed to download keys for self")
+ }
+
// await confirmation of verification
val verificationResponse = receive()
if (verificationResponse?.outcome == Outcome.VERIFIED) {
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 94617ab7e6..54558337da 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
@@ -52,7 +52,6 @@ import org.matrix.android.sdk.api.session.securestorage.SharedSecretStorageServi
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.statistics.StatisticsListener
-import org.matrix.android.sdk.api.session.sync.FilterService
import org.matrix.android.sdk.api.session.sync.SyncService
import org.matrix.android.sdk.api.session.terms.TermsService
import org.matrix.android.sdk.api.session.thirdparty.ThirdPartyService
@@ -165,11 +164,6 @@ interface Session {
*/
fun signOutService(): SignOutService
- /**
- * Returns the FilterService associated with the session.
- */
- fun filterService(): FilterService
-
/**
* Returns the PushRuleService associated with the session.
*/
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
index a22dd33774..8addb0782e 100644
--- 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
@@ -63,4 +63,17 @@ interface SessionAccountDataService {
* Update the account data with the provided type and the provided account data content.
*/
suspend fun updateUserAccountData(type: String, content: Content)
+
+ /**
+ * Retrieve user account data list whose type starts with the given type.
+ * @param type the type or the starting part of a type
+ * @return list of account data whose type starts with the given type
+ */
+ fun getUserAccountDataEventsStartWith(type: String): List
+
+ /**
+ * Deletes user account data of the given type.
+ * @param type the type to delete from user account data
+ */
+ suspend fun deleteUserAccountData(type: String)
}
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 d2aa8020e8..971d04261e 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
@@ -17,6 +17,7 @@
package org.matrix.android.sdk.api.session.crypto
import android.content.Context
+import androidx.annotation.Size
import androidx.lifecycle.LiveData
import androidx.paging.PagedList
import org.matrix.android.sdk.api.MatrixCallback
@@ -55,6 +56,8 @@ interface CryptoService {
fun deleteDevice(deviceId: String, userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor, callback: MatrixCallback)
+ fun deleteDevices(@Size(min = 1) deviceIds: List, userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor, callback: MatrixCallback)
+
fun getCryptoVersion(context: Context, longFormat: Boolean): String
fun isCryptoEnabled(): Boolean
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedAnnotation.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedAnnotation.kt
index 239f749993..5b2ab77467 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedAnnotation.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedAnnotation.kt
@@ -38,5 +38,4 @@ data class AggregatedAnnotation(
override val limited: Boolean? = false,
override val count: Int? = 0,
val chunk: List? = null
-
) : UnsignedRelationInfo
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedRelations.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedRelations.kt
index ae8ed3941f..6577a9b41e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedRelations.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedRelations.kt
@@ -19,7 +19,8 @@ import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
/**
- *
+ * Server side relation aggregation.
+ * ```
* {
* "m.annotation": {
* "chunk": [
@@ -43,12 +44,13 @@ import com.squareup.moshi.JsonClass
* "count": 1
* }
* }
- *
+ * ```
*/
@JsonClass(generateAdapter = true)
data class AggregatedRelations(
@Json(name = "m.annotation") val annotations: AggregatedAnnotation? = null,
@Json(name = "m.reference") val references: DefaultUnsignedRelationInfo? = null,
+ @Json(name = "m.replace") val replaces: AggregatedReplace? = null,
@Json(name = RelationType.THREAD) val latestThread: LatestThreadUnsignedRelation? = null
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedReplace.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedReplace.kt
new file mode 100644
index 0000000000..2ae091a1a4
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/AggregatedReplace.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2022 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.model
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+/**
+ * Note that there can be multiple events with an m.replace relationship to a given event (for example, if an event is edited multiple times).
+ * These should be aggregated by the homeserver.
+ * https://spec.matrix.org/v1.4/client-server-api/#server-side-aggregation-of-mreplace-relationships
+ *
+ */
+@JsonClass(generateAdapter = true)
+data class AggregatedReplace(
+ @Json(name = "event_id") val eventId: String? = null,
+ @Json(name = "origin_server_ts") val originServerTs: Long? = null,
+ @Json(name = "sender") val senderId: String? = null,
+)
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 1f16041b54..9b5f4ac19f 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
@@ -26,13 +26,12 @@ import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult
import org.matrix.android.sdk.api.session.events.model.content.EncryptedEventContent
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
-import org.matrix.android.sdk.api.session.room.model.message.MessageBeaconLocationDataContent
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
import org.matrix.android.sdk.api.session.room.model.message.MessagePollContent
-import org.matrix.android.sdk.api.session.room.model.message.MessageStickerContent
import org.matrix.android.sdk.api.session.room.model.message.MessageType
import org.matrix.android.sdk.api.session.room.model.message.asMessageAudioEvent
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
+import org.matrix.android.sdk.api.session.room.model.relation.isReply
import org.matrix.android.sdk.api.session.room.model.relation.shouldRenderInThread
import org.matrix.android.sdk.api.session.room.send.SendState
import org.matrix.android.sdk.api.session.threads.ThreadDetails
@@ -53,7 +52,7 @@ inline fun Content?.toModel(catchError: Boolean = true): T? {
val moshiAdapter = moshi.adapter(T::class.java)
return try {
moshiAdapter.fromJsonValue(this)
- } catch (e: Exception) {
+ } catch (e: Throwable) {
if (catchError) {
Timber.e(e, "To model failed : $e")
null
@@ -228,11 +227,14 @@ data class Event(
return when {
isReplyRenderedInThread() || isQuote() -> ContentUtils.extractUsefulTextFromReply(text)
isFileMessage() -> "sent a file."
+ isVoiceMessage() -> "sent a voice message."
isAudioMessage() -> "sent an audio file."
isImageMessage() -> "sent an image."
isVideoMessage() -> "sent a video."
- isSticker() -> "sent a sticker"
+ isSticker() -> "sent a sticker."
isPoll() -> getPollQuestion() ?: "created a poll."
+ isLiveLocation() -> "Live location."
+ isLocationMessage() -> "has shared their location."
else -> text
}
}
@@ -386,24 +388,24 @@ fun Event.isLocationMessage(): Boolean {
}
}
-fun Event.isPoll(): Boolean = getClearType() in EventType.POLL_START || getClearType() in EventType.POLL_END
+fun Event.isPoll(): Boolean = isPollStart() || isPollEnd()
+
+fun Event.isPollStart(): Boolean = getClearType() in EventType.POLL_START.values
+
+fun Event.isPollResponse(): Boolean = getClearType() in EventType.POLL_RESPONSE.values
+
+fun Event.isPollEnd(): Boolean = getClearType() in EventType.POLL_END.values
fun Event.isSticker(): Boolean = getClearType() == EventType.STICKER
-fun Event.isLiveLocation(): Boolean = getClearType() in EventType.STATE_ROOM_BEACON_INFO
+fun Event.isLiveLocation(): Boolean = getClearType() in EventType.STATE_ROOM_BEACON_INFO.values
fun Event.getRelationContent(): RelationDefaultContent? {
return if (isEncrypted()) {
content.toModel()?.relatesTo
} else {
- content.toModel()?.relatesTo ?: run {
- // Special cases when there is only a local msgtype for some event types
- when (getClearType()) {
- EventType.STICKER -> getClearContent().toModel()?.relatesTo
- in EventType.BEACON_LOCATION_DATA -> getClearContent().toModel()?.relatesTo
- else -> getClearContent()?.get("m.relates_to")?.toContent().toModel()
- }
- }
+ content.toModel()?.relatesTo
+ ?: getClearContent()?.get("m.relates_to")?.toContent().toModel() // Special cases when there is only a local msgtype for some event types
}
}
@@ -420,7 +422,7 @@ fun Event.getRelationContentForType(type: String): RelationDefaultContent? =
getRelationContent()?.takeIf { it.type == type }
fun Event.isReply(): Boolean {
- return getRelationContent()?.inReplyTo?.eventId != null
+ return getRelationContent().isReply()
}
fun Event.isReplyRenderedInThread(): Boolean {
@@ -443,11 +445,11 @@ fun Event.isInvitation(): Boolean = type == EventType.STATE_ROOM_MEMBER &&
content?.toModel()?.membership == Membership.INVITE
fun Event.getPollContent(): MessagePollContent? {
- return content.toModel()
+ return getClearContent().toModel()
}
fun Event.supportsNotification() =
- this.getClearType() in EventType.MESSAGE + EventType.POLL_START + EventType.STATE_ROOM_BEACON_INFO
+ this.getClearType() in EventType.MESSAGE + EventType.POLL_START.values + EventType.STATE_ROOM_BEACON_INFO.values
fun Event.isContentReportable() =
- this.getClearType() in EventType.MESSAGE + EventType.STATE_ROOM_BEACON_INFO
+ this.getClearType() in EventType.MESSAGE + EventType.STATE_ROOM_BEACON_INFO.values
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventExt.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventExt.kt
new file mode 100644
index 0000000000..32d5ebed8c
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/EventExt.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2022 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.model
+
+fun Event.toValidDecryptedEvent(): ValidDecryptedEvent? {
+ if (!this.isEncrypted()) return null
+ val decryptedContent = this.getDecryptedContent() ?: return null
+ val eventId = this.eventId ?: return null
+ val roomId = this.roomId ?: return null
+ val type = this.getDecryptedType() ?: return null
+ val senderKey = this.getSenderKey() ?: return null
+ val algorithm = this.content?.get("algorithm") as? String ?: return null
+
+ // copy the relation as it's in clear in the encrypted content
+ val updatedContent = this.content.get("m.relates_to")?.let {
+ decryptedContent.toMutableMap().apply {
+ put("m.relates_to", it)
+ }
+ } ?: decryptedContent
+ return ValidDecryptedEvent(
+ type = type,
+ eventId = eventId,
+ clearContent = updatedContent,
+ prevContent = this.prevContent,
+ originServerTs = this.originServerTs ?: 0,
+ cryptoSenderKey = senderKey,
+ roomId = roomId,
+ unsignedData = this.unsignedData,
+ redacts = this.redacts,
+ algorithm = algorithm
+ )
+}
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 3ad4f3a87f..013b452ced 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
@@ -16,6 +16,8 @@
package org.matrix.android.sdk.api.session.events.model
+import org.matrix.android.sdk.api.session.room.model.message.MessageType.MSGTYPE_VERIFICATION_REQUEST
+
/**
* Constants defining known event types from Matrix specifications.
*/
@@ -49,11 +51,10 @@ object EventType {
const val STATE_ROOM_JOIN_RULES = "m.room.join_rules"
const val STATE_ROOM_GUEST_ACCESS = "m.room.guest_access"
const val STATE_ROOM_POWER_LEVELS = "m.room.power_levels"
- val STATE_ROOM_BEACON_INFO = listOf("org.matrix.msc3672.beacon_info", "m.beacon_info")
- val BEACON_LOCATION_DATA = listOf("org.matrix.msc3672.beacon", "m.beacon")
+ val STATE_ROOM_BEACON_INFO = StableUnstableId(stable = "m.beacon_info", unstable = "org.matrix.msc3672.beacon_info")
+ val BEACON_LOCATION_DATA = StableUnstableId(stable = "m.beacon", unstable = "org.matrix.msc3672.beacon")
const val STATE_SPACE_CHILD = "m.space.child"
-
const val STATE_SPACE_PARENT = "m.space.parent"
/**
@@ -81,8 +82,7 @@ object EventType {
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"
+ val CALL_ASSERTED_IDENTITY = StableUnstableId(stable = "m.call.asserted_identity", unstable = "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"
@@ -90,10 +90,7 @@ object EventType {
// Key share events
const val ROOM_KEY_REQUEST = "m.room_key_request"
const val FORWARDED_ROOM_KEY = "m.forwarded_room_key"
- val ROOM_KEY_WITHHELD = StableUnstableId(
- stable = "m.room_key.withheld",
- unstable = "org.matrix.room_key.withheld"
- )
+ val ROOM_KEY_WITHHELD = StableUnstableId(stable = "m.room_key.withheld", unstable = "org.matrix.room_key.withheld")
const val REQUEST_SECRET = "m.secret.request"
const val SEND_SECRET = "m.secret.send"
@@ -111,9 +108,9 @@ object EventType {
const val REACTION = "m.reaction"
// Poll
- val POLL_START = listOf("org.matrix.msc3381.poll.start", "m.poll.start")
- val POLL_RESPONSE = listOf("org.matrix.msc3381.poll.response", "m.poll.response")
- val POLL_END = listOf("org.matrix.msc3381.poll.end", "m.poll.end")
+ val POLL_START = StableUnstableId(stable = "m.poll.start", unstable = "org.matrix.msc3381.poll.start")
+ val POLL_RESPONSE = StableUnstableId(stable = "m.poll.response", unstable = "org.matrix.msc3381.poll.response")
+ val POLL_END = StableUnstableId(stable = "m.poll.end", unstable = "org.matrix.msc3381.poll.end")
// Unwedging
internal const val DUMMY = "m.dummy"
@@ -131,6 +128,7 @@ object EventType {
fun isVerificationEvent(type: String): Boolean {
return when (type) {
+ MSGTYPE_VERIFICATION_REQUEST,
KEY_VERIFICATION_START,
KEY_VERIFICATION_ACCEPT,
KEY_VERIFICATION_KEY,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/ValidDecryptedEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/ValidDecryptedEvent.kt
new file mode 100644
index 0000000000..b305bf19b0
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/events/model/ValidDecryptedEvent.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2022 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.model
+
+import org.matrix.android.sdk.api.session.room.model.message.MessageRelationContent
+import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
+
+data class ValidDecryptedEvent(
+ val type: String,
+ val eventId: String,
+ val clearContent: Content,
+ val prevContent: Content? = null,
+ val originServerTs: Long,
+ val cryptoSenderKey: String,
+ val roomId: String,
+ val unsignedData: UnsignedData? = null,
+ val redacts: String? = null,
+ val algorithm: String,
+)
+
+fun ValidDecryptedEvent.getRelationContent(): RelationDefaultContent? {
+ return clearContent.toModel()?.relatesTo
+}
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 773e870ffd..11638837cc 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
@@ -70,6 +70,11 @@ data class HomeServerCapabilities(
* True if the home server supports threaded read receipts and unread notifications.
*/
val canUseThreadReadReceiptsAndNotifications: Boolean = false,
+
+ /**
+ * True if the home server supports remote toggle of Pusher for a given device.
+ */
+ val canRemotelyTogglePushNotificationsOfDevices: Boolean = false,
) {
enum class RoomCapabilitySupport {
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 9d2c48e194..c65a5382fb 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
@@ -16,6 +16,9 @@
package org.matrix.android.sdk.api.session.homeserver
+import androidx.lifecycle.LiveData
+import org.matrix.android.sdk.api.util.Optional
+
/**
* This interface defines a method to retrieve the homeserver capabilities.
*/
@@ -30,4 +33,9 @@ interface HomeServerCapabilitiesService {
* Get the HomeServer capabilities.
*/
fun getHomeServerCapabilities(): HomeServerCapabilities
+
+ /**
+ * Get a LiveData on the HomeServer capabilities.
+ */
+ fun getHomeServerCapabilitiesLive(): LiveData>
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/location/LocationSharingService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/location/LocationSharingService.kt
index cd8acbcccc..93208be27b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/location/LocationSharingService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/location/LocationSharingService.kt
@@ -47,10 +47,9 @@ interface LocationSharingService {
/**
* Starts sharing live location in the room.
* @param timeoutMillis timeout of the live in milliseconds
- * @param description description of the live for text fallback
* @return the result of the update of the live
*/
- suspend fun startLiveLocationShare(timeoutMillis: Long, description: String): UpdateLiveLocationShareResult
+ suspend fun startLiveLocationShare(timeoutMillis: Long): UpdateLiveLocationShareResult
/**
* Stops sharing live location in the room.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt
index 67bab626cb..7d445a5cc6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/EditAggregatedSummary.kt
@@ -15,10 +15,10 @@
*/
package org.matrix.android.sdk.api.session.room.model
-import org.matrix.android.sdk.api.session.events.model.Content
+import org.matrix.android.sdk.api.session.events.model.Event
data class EditAggregatedSummary(
- val latestContent: Content? = null,
+ val latestEdit: Event? = null,
// The list of the eventIDs used to build the summary (might be out of sync if chunked received from message chunk)
val sourceEvents: List,
val localEchos: List,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReadReceipt.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReadReceipt.kt
index 5639730219..da7e4ea928 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReadReceipt.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/ReadReceipt.kt
@@ -18,5 +18,6 @@ package org.matrix.android.sdk.api.session.room.model
data class ReadReceipt(
val roomMember: RoomMemberSummary,
- val originServerTs: Long
+ val originServerTs: Long,
+ val threadId: String?
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt
index f8c1c0d798..627ce53df6 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/message/MessageStickerContent.kt
@@ -34,7 +34,7 @@ data class MessageStickerContent(
* Required. A textual representation of the image. This could be the alt text of the image, the filename of the image,
* or some kind of content description for accessibility e.g. 'image attachment'.
*/
- @Json(name = "body") override val body: String,
+ @Json(name = "body") override val body: String = "",
/**
* Metadata about the image referred to in url.
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationDefaultContent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationDefaultContent.kt
index 5dcb1b4323..b9f9335dbd 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationDefaultContent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/relation/RelationDefaultContent.kt
@@ -28,3 +28,5 @@ data class RelationDefaultContent(
) : RelationContent
fun RelationDefaultContent.shouldRenderInThread(): Boolean = isFallingBack == false
+
+fun RelationDefaultContent?.isReply(): Boolean = this?.inReplyTo?.eventId != null
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt
index dac1a1a773..83680ec2d8 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/read/ReadService.kt
@@ -34,12 +34,14 @@ interface ReadService {
/**
* Force the read marker to be set on the latest event.
*/
- suspend fun markAsRead(params: MarkAsReadParams = MarkAsReadParams.BOTH)
+ suspend fun markAsRead(params: MarkAsReadParams = MarkAsReadParams.BOTH, mainTimeLineOnly: Boolean = true)
/**
* Set the read receipt on the event with provided eventId.
+ * @param eventId the id of the event where read receipt will be set
+ * @param threadId the id of the thread in which read receipt will be set. For main thread use [ReadService.THREAD_ID_MAIN] constant
*/
- suspend fun setReadReceipt(eventId: String)
+ suspend fun setReadReceipt(eventId: String, threadId: String)
/**
* Set the read marker on the event with provided eventId.
@@ -59,10 +61,10 @@ interface ReadService {
/**
* Returns a live read receipt id for the room.
*/
- fun getMyReadReceiptLive(): LiveData>
+ fun getMyReadReceiptLive(threadId: String?): LiveData>
/**
- * Get the eventId where the read receipt for the provided user is.
+ * Get the eventId from the main timeline where the read receipt for the provided user is.
* @param userId the id of the user to look for
*
* @return the eventId where the read receipt for the provided user is attached, or null if not found
@@ -74,4 +76,8 @@ interface ReadService {
* @param eventId the event
*/
fun getEventReadReceiptsLive(eventId: String): LiveData>
+
+ companion object {
+ const val THREAD_ID_MAIN = "main"
+ }
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/summary/RoomSummaryConstants.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/summary/RoomSummaryConstants.kt
index 8f214e0f89..634e71c43b 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/summary/RoomSummaryConstants.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/summary/RoomSummaryConstants.kt
@@ -33,5 +33,7 @@ object RoomSummaryConstants {
EventType.ENCRYPTED,
EventType.STICKER,
EventType.REACTION
- ) + EventType.POLL_START + EventType.STATE_ROOM_BEACON_INFO
+ ) +
+ EventType.POLL_START.values +
+ EventType.STATE_ROOM_BEACON_INFO.values
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/FetchThreadsResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/FetchThreadsResult.kt
new file mode 100644
index 0000000000..5d4d67a65e
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/FetchThreadsResult.kt
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2022 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.session.room.threads
+
+sealed class FetchThreadsResult {
+ data class ShouldFetchMore(val nextBatch: String) : FetchThreadsResult()
+ object ReachedEnd : FetchThreadsResult()
+ object Failed : FetchThreadsResult()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadFilter.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadFilter.kt
new file mode 100644
index 0000000000..3f3576728f
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadFilter.kt
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2022 The Matrix.org Foundation C.I.C.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.matrix.android.sdk.api.session.room.threads
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+@JsonClass(generateAdapter = false)
+enum class ThreadFilter {
+ @Json(name = "all") ALL,
+ @Json(name = "participated") PARTICIPATED,
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadLivePageResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadLivePageResult.kt
new file mode 100644
index 0000000000..7693dc6fde
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadLivePageResult.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.session.room.threads
+
+import androidx.lifecycle.LiveData
+import androidx.paging.PagedList
+import org.matrix.android.sdk.api.session.room.ResultBoundaries
+import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
+
+data class ThreadLivePageResult(
+ val livePagedList: LiveData>,
+ val liveBoundaries: LiveData
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt
index 9587be68f1..bb6f6b51d3 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/threads/ThreadsService.kt
@@ -16,7 +16,7 @@
package org.matrix.android.sdk.api.session.room.threads
-import androidx.lifecycle.LiveData
+import androidx.paging.PagedList
import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
/**
@@ -27,15 +27,14 @@ import org.matrix.android.sdk.api.session.room.threads.model.ThreadSummary
*/
interface ThreadsService {
- /**
- * Returns a [LiveData] list of all the [ThreadSummary] that exists at the room level.
- */
- fun getAllThreadSummariesLive(): LiveData>
+ suspend fun getPagedThreadsList(userParticipating: Boolean, pagedListConfig: PagedList.Config): ThreadLivePageResult
+
+ suspend fun fetchThreadList(nextBatchId: String?, limit: Int, filter: ThreadFilter = ThreadFilter.ALL): FetchThreadsResult
/**
* Returns a list of all the [ThreadSummary] that exists at the room level.
*/
- fun getAllThreadSummaries(): List
+ suspend fun getAllThreadSummaries(): List
/**
* Enhance the provided ThreadSummary[List] by adding the latest
@@ -51,9 +50,4 @@ interface ThreadsService {
* @param limit defines the number of max results the api will respond with
*/
suspend fun fetchThreadTimeline(rootThreadEventId: String, from: String, limit: Int)
-
- /**
- * Fetch all thread summaries for the current room using the enhanced /messages api.
- */
- suspend fun fetchThreadSummaries()
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
index 223acd1b9c..9053425a39 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/timeline/TimelineEvent.kt
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.api.session.room.timeline
import org.matrix.android.sdk.BuildConfig
import org.matrix.android.sdk.api.extensions.orFalse
+import org.matrix.android.sdk.api.session.events.model.Content
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.RelationType
@@ -142,13 +143,21 @@ fun TimelineEvent.getEditedEventId(): String? {
fun TimelineEvent.getLastMessageContent(): MessageContent? {
return when (root.getClearType()) {
EventType.STICKER -> root.getClearContent().toModel()
- in EventType.POLL_START -> (annotations?.editSummary?.latestContent ?: root.getClearContent()).toModel()
- in EventType.STATE_ROOM_BEACON_INFO -> (annotations?.editSummary?.latestContent ?: root.getClearContent()).toModel()
- in EventType.BEACON_LOCATION_DATA -> (annotations?.editSummary?.latestContent ?: root.getClearContent()).toModel()
- else -> (annotations?.editSummary?.latestContent ?: root.getClearContent()).toModel()
+ // XXX
+ // Polls/Beacon are not message contents like others as there is no msgtype subtype to discriminate moshi parsing
+ // so toModel won't parse them correctly
+ // It's discriminated on event type instead. Maybe it shouldn't be MessageContent at all to avoid confusion?
+ in EventType.POLL_START.values -> (getLastEditNewContent() ?: root.getClearContent()).toModel()
+ in EventType.STATE_ROOM_BEACON_INFO.values -> (getLastEditNewContent() ?: root.getClearContent()).toModel()
+ in EventType.BEACON_LOCATION_DATA.values -> (getLastEditNewContent() ?: root.getClearContent()).toModel()
+ else -> (getLastEditNewContent() ?: root.getClearContent()).toModel()
}
}
+fun TimelineEvent.getLastEditNewContent(): Content? {
+ return annotations?.editSummary?.latestEdit?.getClearContent()?.toModel()?.newContent
+}
+
/**
* Returns true if it's a reply.
*/
@@ -180,11 +189,13 @@ fun TimelineEvent.isRootThread(): Boolean {
/**
* Get the latest message body, after a possible edition, stripping the reply prefix if necessary.
+ * @param formatted Indicates whether the formatted HTML body of the message should be retrieved of the plain text one.
+ * @return If [formatted] is `true`, the HTML body of the message will be retrieved if available. Otherwise, the plain text/markdown version will be returned.
*/
fun TimelineEvent.getTextEditableContent(formatted: Boolean): String {
val lastMessageContent = getLastMessageContent()
val lastContentBody = if (formatted && lastMessageContent is MessageContentWithFormattedBody) {
- lastMessageContent.formattedBody
+ lastMessageContent.formattedBody ?: lastMessageContent.body
} else {
lastMessageContent?.body
} ?: return ""
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/filter/SyncFilterParams.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/filter/SyncFilterParams.kt
new file mode 100644
index 0000000000..02c5b0f8ef
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/sync/filter/SyncFilterParams.kt
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2022 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.sync.filter
+
+data class SyncFilterParams(
+ val lazyLoadMembersForStateEvents: Boolean? = null,
+ val lazyLoadMembersForMessageEvents: Boolean? = null,
+ val useThreadNotifications: Boolean? = null,
+ val listOfSupportedEventTypes: List? = null,
+ val listOfSupportedStateEventTypes: List? = null,
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
index d1d32e7945..362bb7cf2d 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt
@@ -31,7 +31,6 @@ import org.matrix.android.sdk.api.auth.data.PasswordPolicy
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.extensions.orFalse
import org.matrix.android.sdk.api.failure.Failure
import org.matrix.android.sdk.api.failure.MatrixIdFailure
import org.matrix.android.sdk.api.session.Session
@@ -300,7 +299,8 @@ internal class DefaultAuthenticationService @Inject constructor(
isLoginAndRegistrationSupported = versions.isLoginAndRegistrationSupportedBySdk(),
homeServerUrl = homeServerUrl,
isOutdatedHomeserver = !versions.isSupportedBySdk(),
- isLogoutDevicesSupported = versions.doesServerSupportLogoutDevices()
+ isLogoutDevicesSupported = versions.doesServerSupportLogoutDevices(),
+ isLoginWithQrSupported = versions.doesServerSupportQrCodeLogin(),
)
}
@@ -417,20 +417,6 @@ internal class DefaultAuthenticationService @Inject constructor(
}
}
- override suspend fun isQrLoginSupported(homeServerConnectionConfig: HomeServerConnectionConfig): Boolean {
- val authAPI = buildAuthAPI(homeServerConnectionConfig)
- val versions = runCatching {
- executeRequest(null) {
- authAPI.versions()
- }
- }
- return if (versions.isSuccess) {
- versions.getOrNull()?.doesServerSupportQrCodeLogin().orFalse()
- } else {
- false
- }
- }
-
override suspend fun loginUsingQrLoginToken(
homeServerConnectionConfig: HomeServerConnectionConfig,
loginToken: String,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt
index 1245d8df4b..f4de6a9ae9 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/version/Versions.kt
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.auth.version
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.extensions.orFalse
/**
* Model for https://matrix.org/docs/spec/client_server/latest#get-matrix-client-versions.
@@ -56,6 +57,7 @@ private const val FEATURE_THREADS_MSC3440_STABLE = "org.matrix.msc3440.stable"
private const val FEATURE_QR_CODE_LOGIN = "org.matrix.msc3882"
private const val FEATURE_THREADS_MSC3771 = "org.matrix.msc3771"
private const val FEATURE_THREADS_MSC3773 = "org.matrix.msc3773"
+private const val FEATURE_REMOTE_TOGGLE_PUSH_NOTIFICATIONS_MSC3881 = "org.matrix.msc3881"
/**
* Return true if the SDK supports this homeserver version.
@@ -142,3 +144,12 @@ private fun Versions.getMaxVersion(): HomeServerVersion {
?.maxOrNull()
?: HomeServerVersion.r0_0_0
}
+
+/**
+ * Indicate if the server supports MSC3881: https://github.com/matrix-org/matrix-spec-proposals/pull/3881.
+ *
+ * @return true if remote toggle of push notifications is supported
+ */
+internal fun Versions.doesServerSupportRemoteToggleOfPushNotifications(): Boolean {
+ return unstableFeatures?.get(FEATURE_REMOTE_TOGGLE_PUSH_NOTIFICATIONS_MSC3881).orFalse()
+}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt
index 9c3e0ba1c5..7862da1c17 100755
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DefaultCryptoService.kt
@@ -242,8 +242,12 @@ internal class DefaultCryptoService @Inject constructor(
}
override fun deleteDevice(deviceId: String, userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor, callback: MatrixCallback) {
+ deleteDevices(listOf(deviceId), userInteractiveAuthInterceptor, callback)
+ }
+
+ override fun deleteDevices(deviceIds: List, userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor, callback: MatrixCallback) {
deleteDeviceTask
- .configureWith(DeleteDeviceTask.Params(deviceId, userInteractiveAuthInterceptor, null)) {
+ .configureWith(DeleteDeviceTask.Params(deviceIds, userInteractiveAuthInterceptor, null)) {
this.executionThread = TaskThread.CRYPTO
this.callback = callback
}
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt
index 2ac6b8c854..7e9e156003 100755
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/DeviceListManager.kt
@@ -355,7 +355,7 @@ internal class DeviceListManager @Inject constructor(
val relevantPlugins = metricPlugins.filterIsInstance()
val response: KeysQueryResponse
- measureMetric(relevantPlugins) {
+ relevantPlugins.measureMetric {
response = try {
downloadKeysForUsersTask.execute(params)
} catch (throwable: Throwable) {
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt
index bc3309132a..c9eabeab48 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/EventDecryptor.kt
@@ -24,10 +24,12 @@ import kotlinx.coroutines.withContext
import org.matrix.android.sdk.api.MatrixCallback
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.crypto.MXCRYPTO_ALGORITHM_OLM
+import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.logger.LoggerTag
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
import org.matrix.android.sdk.api.session.crypto.model.MXEventDecryptionResult
import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
+import org.matrix.android.sdk.api.session.crypto.model.OlmDecryptionResult
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.content.OlmEventContent
@@ -85,6 +87,27 @@ internal class EventDecryptor @Inject constructor(
return internalDecryptEvent(event, timeline)
}
+ /**
+ * Decrypt an event and save the result in the given event.
+ *
+ * @param event the raw event.
+ * @param timeline the id of the timeline where the event is decrypted. It is used to prevent replay attack.
+ */
+ suspend fun decryptEventAndSaveResult(event: Event, timeline: String) {
+ tryOrNull(message = "Unable to decrypt the event") {
+ decryptEvent(event, timeline)
+ }
+ ?.let { result ->
+ event.mxDecryptionResult = OlmDecryptionResult(
+ payload = result.clearEvent,
+ senderKey = result.senderCurve25519Key,
+ keysClaimed = result.claimedEd25519Key?.let { mapOf("ed25519" to it) },
+ forwardingCurve25519KeyChain = result.forwardingCurve25519KeyChain,
+ isSafe = result.isSafe
+ )
+ }
+ }
+
/**
* Decrypt an event asynchronously.
*
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/api/CryptoApi.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/api/CryptoApi.kt
index d5a8bdfd7c..cfe4681bfd 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/api/CryptoApi.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/api/CryptoApi.kt
@@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.crypto.api
import org.matrix.android.sdk.api.session.crypto.model.DeviceInfo
import org.matrix.android.sdk.api.session.crypto.model.DevicesListResponse
import org.matrix.android.sdk.internal.crypto.model.rest.DeleteDeviceParams
+import org.matrix.android.sdk.internal.crypto.model.rest.DeleteDevicesParams
import org.matrix.android.sdk.internal.crypto.model.rest.KeyChangesResponse
import org.matrix.android.sdk.internal.crypto.model.rest.KeysClaimBody
import org.matrix.android.sdk.internal.crypto.model.rest.KeysClaimResponse
@@ -136,6 +137,17 @@ internal interface CryptoApi {
@Body params: DeleteDeviceParams
)
+ /**
+ * Deletes the given devices, and invalidates any access token associated with them.
+ * Doc: https://spec.matrix.org/v1.4/client-server-api/#post_matrixclientv3delete_devices
+ *
+ * @param params the deletion parameters
+ */
+ @POST(NetworkConstants.URI_API_PREFIX_PATH_V3 + "delete_devices")
+ suspend fun deleteDevices(
+ @Body params: DeleteDevicesParams
+ )
+
/**
* Update the device information.
* Doc: https://matrix.org/docs/spec/client_server/r0.4.0.html#put-matrix-client-r0-devices-deviceid
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/crosssigning/CrossSigningOlm.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/crosssigning/CrossSigningOlm.kt
index 3218b99948..0f29404d4f 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/crosssigning/CrossSigningOlm.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/crosssigning/CrossSigningOlm.kt
@@ -83,9 +83,7 @@ internal class CrossSigningOlm @Inject constructor(
val signaturesMadeByMyKey = signatures[myUserID] // Signatures made by me
?.get("ed25519:$pubKey")
- if (signaturesMadeByMyKey.isNullOrBlank()) {
- throw IllegalArgumentException("Not signed with my key $type")
- }
+ require(signaturesMadeByMyKey.orEmpty().isNotBlank()) { "Not signed with my key $type" }
// Check that Alice USK signature of Bob MSK is valid
olmUtility.verifyEd25519Signature(signaturesMadeByMyKey, pubKey, JsonCanonicalizer.getCanonicalJson(Map::class.java, signable))
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/DeleteDeviceParams.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/DeleteDeviceParams.kt
index c26c6107c4..24dccc4d90 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/DeleteDeviceParams.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/DeleteDeviceParams.kt
@@ -23,6 +23,9 @@ import com.squareup.moshi.JsonClass
*/
@JsonClass(generateAdapter = true)
internal data class DeleteDeviceParams(
+ /**
+ * Additional authentication information for the user-interactive authentication API.
+ */
@Json(name = "auth")
- val auth: Map? = null
+ val auth: Map? = null,
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/DeleteDevicesParams.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/DeleteDevicesParams.kt
new file mode 100644
index 0000000000..19b33b2a69
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/model/rest/DeleteDevicesParams.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2022 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.model.rest
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+
+/**
+ * This class provides the parameter to delete several devices.
+ */
+@JsonClass(generateAdapter = true)
+internal data class DeleteDevicesParams(
+ /**
+ * Additional authentication information for the user-interactive authentication API.
+ */
+ @Json(name = "auth")
+ val auth: Map? = null,
+
+ /**
+ * Required: The list of device IDs to delete.
+ */
+ @Json(name = "devices")
+ val deviceIds: List,
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/DeleteDeviceTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/DeleteDeviceTask.kt
index 0a77d33acc..549122447e 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/DeleteDeviceTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/DeleteDeviceTask.kt
@@ -16,12 +16,14 @@
package org.matrix.android.sdk.internal.crypto.tasks
+import androidx.annotation.Size
import org.matrix.android.sdk.api.auth.UIABaseAuth
import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor
import org.matrix.android.sdk.api.session.uia.UiaResult
import org.matrix.android.sdk.internal.auth.registration.handleUIA
import org.matrix.android.sdk.internal.crypto.api.CryptoApi
import org.matrix.android.sdk.internal.crypto.model.rest.DeleteDeviceParams
+import org.matrix.android.sdk.internal.crypto.model.rest.DeleteDevicesParams
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.task.Task
@@ -30,7 +32,7 @@ import javax.inject.Inject
internal interface DeleteDeviceTask : Task {
data class Params(
- val deviceId: String,
+ @Size(min = 1) val deviceIds: List,
val userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor?,
val userAuthParam: UIABaseAuth?
)
@@ -42,9 +44,24 @@ internal class DefaultDeleteDeviceTask @Inject constructor(
) : DeleteDeviceTask {
override suspend fun execute(params: DeleteDeviceTask.Params) {
+ require(params.deviceIds.isNotEmpty())
+
try {
executeRequest(globalErrorReceiver) {
- cryptoApi.deleteDevice(params.deviceId, DeleteDeviceParams(params.userAuthParam?.asMap()))
+ val userAuthParam = params.userAuthParam?.asMap()
+ if (params.deviceIds.size == 1) {
+ cryptoApi.deleteDevice(
+ deviceId = params.deviceIds.first(),
+ DeleteDeviceParams(auth = userAuthParam)
+ )
+ } else {
+ cryptoApi.deleteDevices(
+ DeleteDevicesParams(
+ auth = userAuthParam,
+ deviceIds = params.deviceIds
+ )
+ )
+ }
}
} catch (throwable: Throwable) {
if (params.userInteractiveAuthInterceptor == null ||
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt
index f93da74507..5d2797a6af 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/EncryptEventTask.kt
@@ -47,9 +47,8 @@ internal class DefaultEncryptEventTask @Inject constructor(
// don't want to wait for any query
// if (!params.crypto.isRoomEncrypted(params.roomId)) return params.event
val localEvent = params.event
- if (localEvent.eventId == null || localEvent.type == null) {
- throw IllegalArgumentException()
- }
+ require(localEvent.eventId != null)
+ require(localEvent.type != null)
localEchoRepository.updateSendState(localEvent.eventId, localEvent.roomId, SendState.ENCRYPTING)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendToDeviceTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendToDeviceTask.kt
index fc4d422360..a7e93202ef 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendToDeviceTask.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/crypto/tasks/SendToDeviceTask.kt
@@ -17,14 +17,22 @@
package org.matrix.android.sdk.internal.crypto.tasks
import org.matrix.android.sdk.api.session.crypto.model.MXUsersDevicesMap
+import org.matrix.android.sdk.api.session.events.model.Event
+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.internal.crypto.api.CryptoApi
import org.matrix.android.sdk.internal.crypto.model.rest.SendToDeviceBody
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
import org.matrix.android.sdk.internal.network.executeRequest
import org.matrix.android.sdk.internal.task.Task
+import timber.log.Timber
import java.util.UUID
import javax.inject.Inject
+const val TO_DEVICE_TRACING_ID_KEY = "org.matrix.msgid"
+
+fun Event.toDeviceTracingId(): String? = content?.get(TO_DEVICE_TRACING_ID_KEY) as? String
+
internal interface SendToDeviceTask : Task {
data class Params(
// the type of event to send
@@ -32,7 +40,9 @@ internal interface SendToDeviceTask : Task {
// the content to send. Map from user_id to device_id to content dictionary.
val contentMap: MXUsersDevicesMap,
// the transactionId. If not provided, a transactionId will be created by the task
- val transactionId: String? = null
+ val transactionId: String? = null,
+ // add tracing id, notice that to device events that do signature on content might be broken by it
+ val addTracingIds: Boolean = !EventType.isVerificationEvent(eventType),
)
}
@@ -42,15 +52,22 @@ internal class DefaultSendToDeviceTask @Inject constructor(
) : SendToDeviceTask {
override suspend fun execute(params: SendToDeviceTask.Params) {
- val sendToDeviceBody = SendToDeviceBody(
- messages = params.contentMap.map
- )
-
// If params.transactionId is not provided, we create a unique txnId.
// It's important to do that outside the requestBlock parameter of executeRequest()
// to use the same value if the request is retried
val txnId = params.transactionId ?: createUniqueTxnId()
+ // add id tracing to debug
+ val decorated = if (params.addTracingIds) {
+ decorateWithToDeviceTracingIds(params)
+ } else {
+ params.contentMap.map to emptyList()
+ }
+
+ val sendToDeviceBody = SendToDeviceBody(
+ messages = decorated.first
+ )
+
return executeRequest(
globalErrorReceiver,
canRetry = true,
@@ -61,8 +78,35 @@ internal class DefaultSendToDeviceTask @Inject constructor(
transactionId = txnId,
body = sendToDeviceBody
)
+ Timber.i("Sent to device type=${params.eventType} txnid=$txnId [${decorated.second.joinToString(",")}]")
}
}
+
+ /**
+ * To make it easier to track down where to-device messages are getting lost,
+ * add a custom property to each one, and that will be logged after sent and on reception. Synapse will also log
+ * this property.
+ * @return A pair, first is the decorated content, and second info to log out after sending
+ */
+ private fun decorateWithToDeviceTracingIds(params: SendToDeviceTask.Params): Pair