diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 81262f1e9f..cd7e26f3cf 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -1,9 +1,9 @@
name: Test
on:
- pull_request: {}
+ pull_request: { }
push:
- branches: [main, develop]
+ branches: [ main, develop ]
# Enrich gradle.properties for CI/CD
env:
@@ -48,12 +48,12 @@ jobs:
emulator-options: -no-snapshot-save -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
disable-animations: true
emulator-build: 7425822
- script: |
+ script: |
./gradlew gatherGplayDebugStringTemplates $CI_GRADLE_ARG_PROPERTIES
./gradlew unitTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport $CI_GRADLE_ARG_PROPERTIES
-# NB: continue-on-error marks steps.tests.conclusion = 'success' but leaves stes.tests.outcome = 'failure'
+ # NB: continue-on-error marks steps.tests.conclusion = 'success' but leaves stes.tests.outcome = 'failure'
- name: Run all the codecoverage tests at once (retry if emulator failed)
uses: reactivecircus/android-emulator-runner@v2
if: always() && steps.tests.outcome == 'failure' # don't run if previous step succeeded.
@@ -70,12 +70,15 @@ jobs:
./gradlew unitTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew instrumentationTestsWithCoverage $CI_GRADLE_ARG_PROPERTIES
./gradlew generateCoverageReport $CI_GRADLE_ARG_PROPERTIES
- - run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES
- if: always() # we may have failed a previous step and retried, that's OK
+
+ # we may have failed a previous step and retried, that's OK
+ - name: Publish results to Sonar
env:
GITHUB_TOKEN: ${{ secrets.SONARQUBE_GITHUB_API_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
ORG_GRADLE_PROJECT_SONAR_LOGIN: ${{ secrets.SONAR_TOKEN }}
+ if: ${{ always() && env.GITHUB_TOKEN != '' && env.SONAR_TOKEN != '' && env.ORG_GRADLE_PROJECT_SONAR_LOGIN != '' }}
+ run: ./gradlew sonarqube $CI_GRADLE_ARG_PROPERTIES
- name: Format unit test results
if: always()
diff --git a/.github/workflows/triage-priority-bugs.yml b/.github/workflows/triage-priority-bugs.yml
index 6cde154370..e762102226 100644
--- a/.github/workflows/triage-priority-bugs.yml
+++ b/.github/workflows/triage-priority-bugs.yml
@@ -27,7 +27,7 @@ jobs:
- uses: alex-page/github-project-automation-plus@bb266ff4dde9242060e2d5418e120a133586d488
with:
project: Android App Team
- column: P1
+ column: Important Issues & Topics (P1)
repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }}
P1_issues_to_crypto_team_workboard:
diff --git a/CHANGES.md b/CHANGES.md
index 4615ec8ff0..518bbd8b67 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,69 @@
+Changes in Element v1.4.36 (2022-09-10)
+=======================================
+
+New App Layout can be enabled in the Labs settings. Please give it a try!
+
+Features ✨
+----------
+ - Adds New App Layout into Labs ([#7038](https://github.com/vector-im/element-android/issues/7038))
+ - Try to detect devices that lack Opus encoder support, use bundled libopus library for those. ([#7010](https://github.com/vector-im/element-android/issues/7010))
+ - Suggest @room when @channel, @everyone, or @here is typed in composer ([#6529](https://github.com/vector-im/element-android/issues/6529))
+
+Bugfixes 🐛
+----------
+ - Fix long incremental sync. ([#6917](https://github.com/vector-im/element-android/issues/6917))
+ - Fix push with FCM ([#7068](https://github.com/vector-im/element-android/issues/7068))
+ - FTUE - Fixes optional email registration step always being mandatory ([#6969](https://github.com/vector-im/element-android/issues/6969))
+ - Fixes /addToSpace and /joinSpace commands showing invalid syntax warnings ([#6844](https://github.com/vector-im/element-android/issues/6844))
+ - Fix low occurrence crashes. ([#6967](https://github.com/vector-im/element-android/issues/6967))
+ - Fix crash when opening an unknown room ([#6978](https://github.com/vector-im/element-android/issues/6978))
+ - Fix crash on PIN code settings screen. ([#6979](https://github.com/vector-im/element-android/issues/6979))
+ - Fix autoplayed animated stickers ([#6982](https://github.com/vector-im/element-android/issues/6982))
+ - Catch race condition crash in voice recording ([#6989](https://github.com/vector-im/element-android/issues/6989))
+ - Fix invite to room when in a space buttons not working. ([#7054](https://github.com/vector-im/element-android/issues/7054))
+
+In development 🚧
+----------------
+ - Create DM room only on first message - Create the DM and navigate to the new room after sending an event ([#5525](https://github.com/vector-im/element-android/issues/5525))
+ - [App Layout] New empty states for home screen ([#6835](https://github.com/vector-im/element-android/issues/6835))
+ - [App Layout] Bottom navigation tabs are removed for new home screen ([#6565](https://github.com/vector-im/element-android/issues/6565))
+ - [App Layout] fixed space switching dialog measured with wrong height sometimes ([#6750](https://github.com/vector-im/element-android/issues/6750))
+ - [App Layout] Fabs doesn't go off screen anymore ([#6765](https://github.com/vector-im/element-android/issues/6765))
+ - [New Layout] Adds back navigation through spaces ([#6877](https://github.com/vector-im/element-android/issues/6877))
+ - [App Layout] new room invites screen ([#6889](https://github.com/vector-im/element-android/issues/6889))
+ - [App Layout] - Invites now show empty screen after you reject last invite ([#6876](https://github.com/vector-im/element-android/issues/6876))
+ - [App Layout] - space switcher now has empty state ([#6754](https://github.com/vector-im/element-android/issues/6754))
+ - [App Layout] - Improves Developer Mode Debug Button UX and adds it to New App Layout ([#6871](https://github.com/vector-im/element-android/issues/6871))
+ - [New Layout] Changes space sheet to accordion-style with expandable subspaces ([#6907](https://github.com/vector-im/element-android/issues/6907))
+ - [New Layout] Adds space invites ([#6924](https://github.com/vector-im/element-android/issues/6924))
+ - [App Layout] fixed invites count badge bottom margin on a home screen ([#6947](https://github.com/vector-im/element-android/issues/6947))
+ - [New Layout] Improves talkback accessibility ([#7016](https://github.com/vector-im/element-android/issues/7016))
+ - [New Layout] Changes space icon in fab and in release notes screen ([#7039](https://github.com/vector-im/element-android/issues/7039))
+ - [New Layout] Adds header to spaces bottom sheet ([#7040](https://github.com/vector-im/element-android/issues/7040))
+ - [App Layout] New App Layout is enabled by default (Edit: has to be enabled in Labs) ([#6958](https://github.com/vector-im/element-android/issues/6958))
+ - [App Layout] Obsolete settings are not shown when App Layout flag is enabled ([#6646](https://github.com/vector-im/element-android/issues/6646))
+ - [Devices Management] Session overview screen ([#6961](https://github.com/vector-im/element-android/issues/6961))
+ - [Devices Management] Refactor some code to improve testability ([#7043](https://github.com/vector-im/element-android/issues/7043))
+ - [Device Manager] Current Session Section ([#6902](https://github.com/vector-im/element-android/issues/6902))
+ - [Device Manager] Other Sessions Section ([#6945](https://github.com/vector-im/element-android/issues/6945))
+ - [Device Manager] Render Security Recommendations ([#6964](https://github.com/vector-im/element-android/issues/6964))
+
+Improved Documentation 📚
+------------------------
+ - Clarify that setting up a FCM Rewrite Proxy is not necessary for use of the UnifiedPush FCM distributor. ([#6727](https://github.com/vector-im/element-android/issues/6727))
+
+Other changes
+-------------
+ - Increase sticker size ([#6982](https://github.com/vector-im/element-android/issues/6982))
+ - Focus input field when editing homeserver address to speed up login and registration. ([#6926](https://github.com/vector-im/element-android/issues/6926))
+ - Log basic Http information in production. ([#6925](https://github.com/vector-im/element-android/issues/6925))
+ - Converts the vector module to a library with a parent vector-app application module ([#6407](https://github.com/vector-im/element-android/issues/6407))
+ - Creates a dedicated strings module ([#3955](https://github.com/vector-im/element-android/issues/3955))
+ - Remove FragmentModule and the Fragment factory. No need to Inject the constructor on your Fragment, just add @AndroidEntryPoint annotation and @Inject class members. ([#6894](https://github.com/vector-im/element-android/issues/6894))
+ - Small refactor of UnifiedPushHelper ([#6936](https://github.com/vector-im/element-android/issues/6936))
+ - CI: only run sonarqube task when token is known ([#7057](https://github.com/vector-im/element-android/issues/7057))
+
+
Changes in Element v1.4.34 (2022-08-23)
=======================================
diff --git a/build.gradle b/build.gradle
index 71875c49f1..a40790d441 100644
--- a/build.gradle
+++ b/build.gradle
@@ -45,7 +45,7 @@ plugins {
id "io.gitlab.arturbosch.detekt" version "1.21.0"
// Dependency Analysis
- id 'com.autonomousapps.dependency-analysis' version "1.12.0"
+ id 'com.autonomousapps.dependency-analysis' version "1.13.1"
}
// https://github.com/jeremylong/DependencyCheck
diff --git a/changelog.d/3955.misc b/changelog.d/3955.misc
deleted file mode 100644
index 4e8fbeb4d8..0000000000
--- a/changelog.d/3955.misc
+++ /dev/null
@@ -1 +0,0 @@
-Creates a dedicated strings module
diff --git a/changelog.d/5424.bugfix b/changelog.d/5424.bugfix
new file mode 100644
index 0000000000..88ebd828f1
--- /dev/null
+++ b/changelog.d/5424.bugfix
@@ -0,0 +1 @@
+Fix text margin in QR code view when no display name is set
\ No newline at end of file
diff --git a/changelog.d/5525.wip b/changelog.d/5525.wip
deleted file mode 100644
index 0d54c06b6a..0000000000
--- a/changelog.d/5525.wip
+++ /dev/null
@@ -1 +0,0 @@
-Create DM room only on first message - Create the DM and navigate to the new room after sending an event
diff --git a/changelog.d/6407.misc b/changelog.d/6407.misc
deleted file mode 100644
index 3f7a27fc01..0000000000
--- a/changelog.d/6407.misc
+++ /dev/null
@@ -1 +0,0 @@
-Converts the vector module to a library with a parent vector-app application module
diff --git a/changelog.d/6565.wip b/changelog.d/6565.wip
deleted file mode 100644
index 0e89c63e75..0000000000
--- a/changelog.d/6565.wip
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] Bottom navigation tabs are removed for new home screen
diff --git a/changelog.d/6646.misc b/changelog.d/6646.misc
deleted file mode 100644
index 0f2e3f0881..0000000000
--- a/changelog.d/6646.misc
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] Obsolete settings are not shown when App Layout flag is enabled
diff --git a/changelog.d/6750.wip b/changelog.d/6750.wip
deleted file mode 100644
index 2e18110c97..0000000000
--- a/changelog.d/6750.wip
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] fixed space switching dialog measured with wrong height sometimes
diff --git a/changelog.d/6754.bugfix b/changelog.d/6754.bugfix
deleted file mode 100644
index e9f6960595..0000000000
--- a/changelog.d/6754.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] - space switcher now has empty state
diff --git a/changelog.d/6765.wip b/changelog.d/6765.wip
deleted file mode 100644
index ccdc1c025f..0000000000
--- a/changelog.d/6765.wip
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] Fabs doesn't go off screen anymore
diff --git a/changelog.d/6835.feature b/changelog.d/6835.feature
deleted file mode 100644
index e4e610f7e0..0000000000
--- a/changelog.d/6835.feature
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] New empty states for home screen
diff --git a/changelog.d/6844.bugfix b/changelog.d/6844.bugfix
deleted file mode 100644
index a2babaaa6d..0000000000
--- a/changelog.d/6844.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fixes /addToSpace and /joinSpace commands showing invalid syntax warnings
diff --git a/changelog.d/6871.feature b/changelog.d/6871.feature
deleted file mode 100644
index 313be1a602..0000000000
--- a/changelog.d/6871.feature
+++ /dev/null
@@ -1 +0,0 @@
-Improves Developer Mode Debug Button UX and adds it to New App Layout
diff --git a/changelog.d/6876.feature b/changelog.d/6876.feature
deleted file mode 100644
index 12a2b78a1e..0000000000
--- a/changelog.d/6876.feature
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] - Invites now show empty screen after you reject last invite
diff --git a/changelog.d/6877.wip b/changelog.d/6877.wip
deleted file mode 100644
index d1e1c7c82d..0000000000
--- a/changelog.d/6877.wip
+++ /dev/null
@@ -1 +0,0 @@
-[New Layout] Adds back navigation through spaces
diff --git a/changelog.d/6889.wip b/changelog.d/6889.wip
deleted file mode 100644
index 067973aad9..0000000000
--- a/changelog.d/6889.wip
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] new room invites screen
diff --git a/changelog.d/6894.misc b/changelog.d/6894.misc
deleted file mode 100644
index abb1a69a71..0000000000
--- a/changelog.d/6894.misc
+++ /dev/null
@@ -1 +0,0 @@
-Remove FragmentModule and the Fragment factory. No need to Inject the constructor on your Fragment, just add @AndroidEntryPoint annotation and @Inject class members.
diff --git a/changelog.d/6902.wip b/changelog.d/6902.wip
deleted file mode 100644
index 8c982cc9ae..0000000000
--- a/changelog.d/6902.wip
+++ /dev/null
@@ -1 +0,0 @@
-[Device Manager] Current Session Section
diff --git a/changelog.d/6907.wip b/changelog.d/6907.wip
deleted file mode 100644
index a8d887c66b..0000000000
--- a/changelog.d/6907.wip
+++ /dev/null
@@ -1 +0,0 @@
-[New Layout] Changes space sheet to accordion-style with expandable subspaces
diff --git a/changelog.d/6917.bugfix b/changelog.d/6917.bugfix
deleted file mode 100644
index 7ddcc16d9a..0000000000
--- a/changelog.d/6917.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fix long incremental sync.
diff --git a/changelog.d/6924.wip b/changelog.d/6924.wip
deleted file mode 100644
index 11ff4a1eb2..0000000000
--- a/changelog.d/6924.wip
+++ /dev/null
@@ -1 +0,0 @@
-[New Layout] Adds space invites
diff --git a/changelog.d/6925.misc b/changelog.d/6925.misc
deleted file mode 100644
index f494b76b56..0000000000
--- a/changelog.d/6925.misc
+++ /dev/null
@@ -1 +0,0 @@
-Log basic Http information in production.
diff --git a/changelog.d/6926.misc b/changelog.d/6926.misc
deleted file mode 100644
index dc1330d9fc..0000000000
--- a/changelog.d/6926.misc
+++ /dev/null
@@ -1 +0,0 @@
-Focus input field when editing homeserver address to speed up login and registration.
\ No newline at end of file
diff --git a/changelog.d/6945.wip b/changelog.d/6945.wip
deleted file mode 100644
index 6f5916a8c2..0000000000
--- a/changelog.d/6945.wip
+++ /dev/null
@@ -1 +0,0 @@
-[Device Manager] Other Sessions Section
diff --git a/changelog.d/6947.wip b/changelog.d/6947.wip
deleted file mode 100644
index 9a3e13cddb..0000000000
--- a/changelog.d/6947.wip
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] fixed invites count badge bottom margin on a home screen
diff --git a/changelog.d/6958.feature b/changelog.d/6958.feature
deleted file mode 100644
index b508ff19a9..0000000000
--- a/changelog.d/6958.feature
+++ /dev/null
@@ -1 +0,0 @@
-[App Layout] New App Layout is enabled by default
diff --git a/changelog.d/6961.wip b/changelog.d/6961.wip
deleted file mode 100644
index 2d271da8c1..0000000000
--- a/changelog.d/6961.wip
+++ /dev/null
@@ -1 +0,0 @@
-[Devices Management] Session overview screen
diff --git a/changelog.d/6964.wip b/changelog.d/6964.wip
deleted file mode 100644
index f96dfe41ed..0000000000
--- a/changelog.d/6964.wip
+++ /dev/null
@@ -1 +0,0 @@
-[Device Manager] Render Security Recommendations
diff --git a/changelog.d/6967.bugfix b/changelog.d/6967.bugfix
deleted file mode 100644
index e2a1f70532..0000000000
--- a/changelog.d/6967.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fix low occurrence crashes.
diff --git a/changelog.d/6969.bugfix b/changelog.d/6969.bugfix
deleted file mode 100644
index 4f3a161b41..0000000000
--- a/changelog.d/6969.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-FTUE - Fixes optional email registration step always being mandatory
diff --git a/changelog.d/6978.bugfix b/changelog.d/6978.bugfix
deleted file mode 100644
index 878730062b..0000000000
--- a/changelog.d/6978.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fix crash when opening an unknown room
diff --git a/changelog.d/6979.bugfix b/changelog.d/6979.bugfix
deleted file mode 100644
index ee43e83e96..0000000000
--- a/changelog.d/6979.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Fix crash on PIN code settings screen.
diff --git a/changelog.d/6982.bugfix b/changelog.d/6982.bugfix
deleted file mode 100644
index baa75d9c15..0000000000
--- a/changelog.d/6982.bugfix
+++ /dev/null
@@ -1,2 +0,0 @@
-Fix autoplayed animated stickers
-Increase sticker size
diff --git a/changelog.d/6989.bugfix b/changelog.d/6989.bugfix
deleted file mode 100644
index cf740ca741..0000000000
--- a/changelog.d/6989.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-Catch race condition crash in voice recording
diff --git a/changelog.d/7010.feature b/changelog.d/7010.feature
deleted file mode 100644
index d6c7c85b3e..0000000000
--- a/changelog.d/7010.feature
+++ /dev/null
@@ -1 +0,0 @@
-Try to detect devices that lack Opus encoder support, use bundled libopus library for those.
diff --git a/changelog.d/7016.wip b/changelog.d/7016.wip
deleted file mode 100644
index 6918991a86..0000000000
--- a/changelog.d/7016.wip
+++ /dev/null
@@ -1 +0,0 @@
-[New Layout] Improves talkback accessibility
diff --git a/changelog.d/7035.misc b/changelog.d/7035.misc
new file mode 100644
index 0000000000..0a446b09d5
--- /dev/null
+++ b/changelog.d/7035.misc
@@ -0,0 +1 @@
+Ensure that we do not expect all the Event fields when requesting `rooms/{roomId}/hierarchy` endpoint.
diff --git a/dependencies.gradle b/dependencies.gradle
index e25e7b42cb..c7b441738b 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -22,7 +22,7 @@ def markwon = "4.6.2"
def moshi = "1.13.0"
def lifecycle = "2.5.1"
def flowBinding = "1.2.0"
-def flipper = "0.162.0"
+def flipper = "0.164.0"
def epoxy = "4.6.2"
def mavericks = "2.7.0"
def glide = "4.13.2"
@@ -86,7 +86,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.54"
+ 'phonenumber' : "com.googlecode.libphonenumber:libphonenumber:8.12.55"
],
dagger : [
'dagger' : "com.google.dagger:dagger:$dagger",
diff --git a/docs/unifiedpush.md b/docs/unifiedpush.md
index 2851644e66..9f44c6b2f9 100644
--- a/docs/unifiedpush.md
+++ b/docs/unifiedpush.md
@@ -18,7 +18,7 @@ The recently started UnifiedPush project is an Android protocol and library for
The *F-Droid* and *Gplay* flavors of Element Android support UnifiedPush, so the user can use any distributor installed on their devices. This would make it possible to have push notifications without depending on Google services or libraries. Currently, the main distributors are [ntfy](https://ntfy.sh) which does not require any setup (like manual registration) to use the public server and [NextPush](https://github.com/UP-NextPush/android), available as a nextcloud application.
-The *Gplay* variant uses a UnifiedPush library which basically embed a FCM distributor built into the application (so a user doesn't need to do anything other than install the app to get FCM notifications). This variant uses Google Services to receive notifications if the user has not installed any distributor.
+The *Gplay* variant uses a UnifiedPush library which basically embed a FCM distributor built into the application (so a user doesn't need to do anything other than install the app to get FCM notifications). This variant uses Google Services to receive notifications if the user has not installed any distributor. A [FCM Rewrite Proxy](https://unifiedpush.org/developers/embedded_fcm/#fcm-rewrite-proxy) is not required for Element Android's implementation of the FCM distributor - it will work with an existing Matrix push provider, such as [Sygnal](https://github.com/matrix-org/sygnal).
The *F-Droid* variant does not use this library to avoid any proprietary blob. It will use a polling service if the user has not installed any distributor.
diff --git a/fastlane/metadata/android/cs-CZ/changelogs/40104340.txt b/fastlane/metadata/android/cs-CZ/changelogs/40104340.txt
new file mode 100644
index 0000000000..578549ce6c
--- /dev/null
+++ b/fastlane/metadata/android/cs-CZ/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Hlavní změny v této verzi: Opravy různých chyb a vylepšení stability.
+Úplný seznam změn: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/de-DE/changelogs/40104340.txt b/fastlane/metadata/android/de-DE/changelogs/40104340.txt
new file mode 100644
index 0000000000..50b5647608
--- /dev/null
+++ b/fastlane/metadata/android/de-DE/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Die wichtigsten Änderungen in dieser Version: Verschiedene Fehlerbehebungen und Stabilitätsverbesserungen.
+Vollständiges Änderungsprotokoll: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/en-US/changelogs/40104360.txt b/fastlane/metadata/android/en-US/changelogs/40104360.txt
new file mode 100644
index 0000000000..da03f28760
--- /dev/null
+++ b/fastlane/metadata/android/en-US/changelogs/40104360.txt
@@ -0,0 +1,3 @@
+New App Layout can be enabled in the Labs settings. Please give it a try!
+Fix issues about missing notification, and long incremental sync.
+Full changelog: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/et/changelogs/40104340.txt b/fastlane/metadata/android/et/changelogs/40104340.txt
new file mode 100644
index 0000000000..1df5ac4176
--- /dev/null
+++ b/fastlane/metadata/android/et/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Põhilised muutused selles versioonis: erinevate vigade parandused ja stabiilsust edendavad kohendused.
+Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fa/changelogs/40104340.txt b/fastlane/metadata/android/fa/changelogs/40104340.txt
new file mode 100644
index 0000000000..29efb95925
--- /dev/null
+++ b/fastlane/metadata/android/fa/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+تغییرات عمده در این نگارش: رفع اشکالهای مختلف و بهبودهای پایداری.
+گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/fr-FR/changelogs/40104340.txt b/fastlane/metadata/android/fr-FR/changelogs/40104340.txt
new file mode 100644
index 0000000000..fe61fd021c
--- /dev/null
+++ b/fastlane/metadata/android/fr-FR/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Principaux changements pour cette version : Plusieurs corrections de bogues et d’améliorations de stabilité.
+Intégralité des changements : https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104100.txt b/fastlane/metadata/android/hu-HU/changelogs/40104100.txt
new file mode 100644
index 0000000000..97746bdcc6
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104100.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Görgetés a hangüzenetben. Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104110.txt b/fastlane/metadata/android/hu-HU/changelogs/40104110.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104110.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104120.txt b/fastlane/metadata/android/hu-HU/changelogs/40104120.txt
new file mode 100644
index 0000000000..79df59cf5e
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104120.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Lehetővé teszi a felhasználók számára, hogy offline jelenjenek meg, és audio lejátszót ad hozzá a hangmellékletekhez.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104130.txt b/fastlane/metadata/android/hu-HU/changelogs/40104130.txt
new file mode 100644
index 0000000000..79df59cf5e
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104130.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Lehetővé teszi a felhasználók számára, hogy offline jelenjenek meg, és audio lejátszót ad hozzá a hangmellékletekhez.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104140.txt b/fastlane/metadata/android/hu-HU/changelogs/40104140.txt
new file mode 100644
index 0000000000..2ea8acda97
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104140.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: A figyelmen kívül hagyott felhasználók kezelésének javítása. Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104160.txt b/fastlane/metadata/android/hu-HU/changelogs/40104160.txt
new file mode 100644
index 0000000000..d92018adb0
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104160.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: A titkosított üzenetek jobb kezelése. Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104180.txt b/fastlane/metadata/android/hu-HU/changelogs/40104180.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104180.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104190.txt b/fastlane/metadata/android/hu-HU/changelogs/40104190.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104190.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104200.txt b/fastlane/metadata/android/hu-HU/changelogs/40104200.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104200.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104220.txt b/fastlane/metadata/android/hu-HU/changelogs/40104220.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104220.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104230.txt b/fastlane/metadata/android/hu-HU/changelogs/40104230.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104230.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104240.txt b/fastlane/metadata/android/hu-HU/changelogs/40104240.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104240.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104250.txt b/fastlane/metadata/android/hu-HU/changelogs/40104250.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104250.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104260.txt b/fastlane/metadata/android/hu-HU/changelogs/40104260.txt
new file mode 100644
index 0000000000..54d881323f
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104260.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: UnifiedPush használata, és lehetővé teszi a felhasználó számára, hogy FCM nélkül tolja.
+Teljes változásnapló: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104270.txt b/fastlane/metadata/android/hu-HU/changelogs/40104270.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104270.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104280.txt b/fastlane/metadata/android/hu-HU/changelogs/40104280.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104280.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104300.txt b/fastlane/metadata/android/hu-HU/changelogs/40104300.txt
new file mode 100644
index 0000000000..9882e09368
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104300.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Lehetővé teszi a továbbfejlesztett bejelentkezési és regisztrációs utakat.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104310.txt b/fastlane/metadata/android/hu-HU/changelogs/40104310.txt
new file mode 100644
index 0000000000..9882e09368
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104310.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Lehetővé teszi a továbbfejlesztett bejelentkezési és regisztrációs utakat.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104320.txt b/fastlane/metadata/android/hu-HU/changelogs/40104320.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104320.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/hu-HU/changelogs/40104340.txt b/fastlane/metadata/android/hu-HU/changelogs/40104340.txt
new file mode 100644
index 0000000000..25772a8ea1
--- /dev/null
+++ b/fastlane/metadata/android/hu-HU/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Főbb változások ebben a verzióban: Különböző hibajavítások és stabilitásjavítások.
+Teljes változásjegyzék: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/id/changelogs/40104340.txt b/fastlane/metadata/android/id/changelogs/40104340.txt
new file mode 100644
index 0000000000..1017951d47
--- /dev/null
+++ b/fastlane/metadata/android/id/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Perubahan utama dalam versi ini: Banyak perbaikan kutu dan perbaikan stabilitas.
+Catatan perubahan lanjutan: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/it-IT/changelogs/40104340.txt b/fastlane/metadata/android/it-IT/changelogs/40104340.txt
new file mode 100644
index 0000000000..556a6fc7ea
--- /dev/null
+++ b/fastlane/metadata/android/it-IT/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Modifiche principali in questa versione: varie correzioni di errori e miglioramenti della stabilità.
+Cronologia completa: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/pl-PL/changelogs/40104340.txt b/fastlane/metadata/android/pl-PL/changelogs/40104340.txt
new file mode 100644
index 0000000000..e175a61725
--- /dev/null
+++ b/fastlane/metadata/android/pl-PL/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Główne zmiany w tej wersji: Rozmaite poprawki błędów i usprawnienia stabilności.
+Pełna lista zmian: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/pt-BR/changelogs/40104340.txt b/fastlane/metadata/android/pt-BR/changelogs/40104340.txt
new file mode 100644
index 0000000000..6e11e92579
--- /dev/null
+++ b/fastlane/metadata/android/pt-BR/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Principais mudanças nesta versão: Vários consertos de bugs e melhorias de estabilidade.
+Changelog completo: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/sk/changelogs/40104340.txt b/fastlane/metadata/android/sk/changelogs/40104340.txt
new file mode 100644
index 0000000000..50670f18c2
--- /dev/null
+++ b/fastlane/metadata/android/sk/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Hlavné zmeny v tejto verzii: Rôzne opravy chýb a vylepšenia stability.
+Úplný zoznam zmien: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/uk/changelogs/40104340.txt b/fastlane/metadata/android/uk/changelogs/40104340.txt
new file mode 100644
index 0000000000..9664c615c1
--- /dev/null
+++ b/fastlane/metadata/android/uk/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+Основні зміни в цій версії: Усунуто різні вади й поліпшено стабільність.
+Перелік усіх змін: https://github.com/vector-im/element-android/releases
diff --git a/fastlane/metadata/android/zh-TW/changelogs/40104340.txt b/fastlane/metadata/android/zh-TW/changelogs/40104340.txt
new file mode 100644
index 0000000000..4bcca9a0b8
--- /dev/null
+++ b/fastlane/metadata/android/zh-TW/changelogs/40104340.txt
@@ -0,0 +1,2 @@
+此版本中的主要變動:多個臭蟲修復與穩定性改善。
+完整的變更紀錄:https://github.com/vector-im/element-android/releases
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 0c61cdf6c6..13a5b6c119 100644
--- a/library/ui-strings/src/main/res/values-ca/strings.xml
+++ b/library/ui-strings/src/main/res/values-ca/strings.xml
@@ -2619,4 +2619,21 @@
Mostra totes les sessions (V2, WIP)Crea salaInicia xat
+ Verifica la teva sessió actual per a missatges segurs millorats.
+ Verificada · Última activitat %1$s
+ No verificada · Última activitat %1$s
+ Veure-ho tot (%1$d)
+ Sessió actual
+ Veure detalls
+ Verifica sessió
+ La sessió actual està llesta per la missatgeria segura.
+ Sessió no verificada
+ Sessió verificada
+ Tipus de dispositiu desconegut
+ Ordinador
+ Web
+ Mòbil
+ Aquesta sala no s\'ha trobat.
+\nTorna-ho a provar més tard.%s
+ Invitacions
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 200480ffa2..b7bfeac444 100644
--- a/library/ui-strings/src/main/res/values-cs/strings.xml
+++ b/library/ui-strings/src/main/res/values-cs/strings.xml
@@ -2669,4 +2669,21 @@
Prozkoumat místnostiVytvořit místnostZahájit konverzaci
+ Neověřeno · Poslední aktivita %1$s
+ Ověřeno · Poslední aktivita %1$s
+ Zobrazit všechny (%1$d)
+ Aktuální relace
+ Zobrazit podrobnosti
+ Ověřit relaci
+ Ověřte svou aktuální relaci pro vylepšené zabezpečené zasílání zpráv.
+ Vaše aktuální relace je připravena pro bezpečné zasílání zpráv.
+ Neověřená relace
+ Ověřená relace
+ Neznámý typ zařízení
+ Desktop
+ Web
+ Mobil
+ Je nám líto, tato místnost nebyla nalezena.
+\nZkuste to prosím později.%s
+ Pozvánky
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 527b21ad56..8e502a6392 100644
--- a/library/ui-strings/src/main/res/values-de/strings.xml
+++ b/library/ui-strings/src/main/res/values-de/strings.xml
@@ -834,9 +834,9 @@
\nSitzungsname: %1$s
\nZuletzt gesehen: %2$s
\nWenn du nicht mit einer anderen Sitzung angemeldet bist, ignoriere diese Anfrage.
- Eine unverifizierte Sitzung fordert Verschlüsselungs-Schlüssel an.
-\nSitzungsname: %1$s
-\nZuletzt gesehen: %2$s
+ Eine nicht verifizierte Sitzung fordert Verschlüsselungs-Schlüssel an.
+\nSitzungsname: %1$s
+\nZuletzt gesehen: %2$s
\nWenn du nicht eine andere Sitzung angemeldet hast, ignoriere diese Anfrage.TeilenIgnorieren
@@ -1426,7 +1426,7 @@
Wähle deinen Wiederherstellungsschlüssel, gib ihn ein oder füge ihn aus der Zwischenablage einKonnte nicht auf gesicherten Speicher zugreifenUnverschlüsselt
- Verschlüsselt von einem unbekannten Gerät
+ Verschlüsselt von einem nicht verifiziertem GerätÜberprüfe, wo du angemeldet bistVerifiziere alle deine Sitzungen, um sicherzustellen, dass dein Konto und deine Nachrichten sicher sindBestätige neue Anmeldung zu deinem Konto: %1$s
@@ -2614,4 +2614,12 @@
Kontakt aufnehmenElement Matrix Services (EMS) ist ein robuster und zuverlässiger Hosting-Dienst für schnelle und sichere Echtzeitkommunikation. Erfahre mehr unter element.io/emsWillst du deinen eigenen Server betreiben\?
+ Web
+ Mobil
+ Entschuldigung, dieser Raum wurde nicht gefunden.
+\nBitte versuche es später erneut.%s
+ Einladungen
+ Nicht verifiziert · Letzte Aktivität %1$s
+ Verifiziere deine aktuelle Sitzung für besonders sichere Nachrichtenübertragung.
+ Nicht verifizierte Sitzung
\ 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 a476ec4b3a..55fb9dfef0 100644
--- a/library/ui-strings/src/main/res/values-et/strings.xml
+++ b/library/ui-strings/src/main/res/values-et/strings.xml
@@ -2610,4 +2610,21 @@
Tutvu jututubadegaLoo jututubaAlusta vestlust
+ Verifitseerimata · Viimati kasutusel %1$s
+ Verifitseeritud · Viimati kasutusel %1$s
+ Näita kõiki (%1$d)
+ Praegune sessioon
+ Vaata lisateavet
+ Verifitseeri sessioon
+ Turvalise sõnumivahetuse nimel palun verifitseeri oma praegune sessioon.
+ Sinu praegune sessioon on valmis turvaliseks sõnumivahetuseks.
+ Verifitseerimata sessioon
+ Verifitseeritud sessioon
+ Tundmatu seadme tüüp
+ Töölauarakendus
+ Veebiliides
+ Mobiiltelefon
+ Vabandust, aga seda jututuba ei õnnestu leida.
+\nPalun proovi hiljem uuesti.%s
+ Kutsed
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 d1dbb57593..e104225389 100644
--- a/library/ui-strings/src/main/res/values-fa/strings.xml
+++ b/library/ui-strings/src/main/res/values-fa/strings.xml
@@ -2619,4 +2619,21 @@
کاوش اتاقهاایجاد اتاقآغاز گپ
+ تأیید نشده · آخرین فعّالیت %1$s
+ تأیید شده · آخرین فعّالیت %1$s
+ دیدن همه (%1$d)
+ نشست کنونی
+ دیدن جزییات
+ تأیید نشست
+ نشست کنونیتان را برای پیامرسانی امن بهبود یافته تأیید کنید.
+ نشست کنونیتان برای پیامرسانی امن آماده است.
+ نشست تأیید نشده
+ نشست تأیید شده
+ گونهٔ افزاره ناشناخته
+ میزکار
+ وب
+ تلفن همراه
+ متأسفانه این اتاق پیدا نشد.
+\nلطفاً بعداً دوباره تلاش کنید.%s
+ دعوتها
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 0bc033c93a..55b5f88134 100644
--- a/library/ui-strings/src/main/res/values-fr/strings.xml
+++ b/library/ui-strings/src/main/res/values-fr/strings.xml
@@ -2619,4 +2619,21 @@
Parcourir les salonsCréer un salonCommencer une discussion
+ Non vérifiée · Dernière activité %1$s
+ Vérifié · Dernière activité %1$s
+ Tout voir (%1$d)
+ Cette session
+ Voir les détails
+ Vérifier la session
+ Vérifiez votre session pour une sécurité renforcée de votre messagerie.
+ Votre session est prête pour l’envoi de messages sécurisés.
+ Session non vérifiée
+ Session vérifiée
+ Type de périphérique inconnu
+ Ordinateur
+ Web
+ Portable
+ Désolé, impossible de trouver ce salon.
+\nVeuillez réessayer plus tard.%s
+ Invitations
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 a35595fb36..af8bf26b2e 100644
--- a/library/ui-strings/src/main/res/values-hu/strings.xml
+++ b/library/ui-strings/src/main/res/values-hu/strings.xml
@@ -157,7 +157,7 @@
%s megváltoztatta a szerver ACL-eket ehhez a szobához.• IP címet hosztnévként használó szerverek tiltva vannak.• IP címet hosztnévként használó szerverek engedélyezve vannak.
- • Engedélyezve vannak azok a szerverek, amik illeszkednek erre: %s
+ • Engedélyezve vannak azok a szerverek, amik illeszkednek erre: %s.• Tiltva vannak azok a szerverek, amik illeszkednek erre: %sBeállítottad a szerver ACL-eket ehhez a szobához.%s beállította a szerver ACL-eket ehhez a szobához.
@@ -2600,4 +2600,40 @@ A Visszaállítási Kulcsot tartsd biztonságos helyen, mint pl. egy jelszókeze
%1$s és %2$sMinden beszélgetés
+ Nem ellenőrzött - Utolsó aktivitás %1$s
+ Ellenőrzött - Utolsó tevékenység %1$s
+ Összes megtekintése (%1$d)
+ Jelenlegi munkamenet
+ Részletek megtekintése
+ Munkamenet hitelesítése
+ Az aktuális munkamenet készen áll a biztonságos üzenetküldésre.
+ Az aktuális munkamenet készen áll a biztonságos üzenetküldésre.
+ Ellenőrizetlen munkamenet
+ Ellenőrzött munkamenet
+ Ismeretlen eszköztípus
+ Asztali
+ Web
+ Mobil
+ Minden munkamenet megjelenítése (V2, WIP)
+ A legjobb biztonság érdekében ellenőrizd a munkameneteket, és jelentkezz ki minden olyan munkamenetből, melyet már nem ismersz fel vagy nem használsz.
+ Más munkamenetek
+ Munkamenetek
+ Nyitott területek listája
+ Új beszélgetés vagy szoba létrehozása
+ Résztvevők
+ Kedvencek
+ Olvasatlan
+ Mind
+ Sajnáljuk, ez a szoba nem található.
+\nKérjük, próbáld meg később újra.%s
+ Meghívók
+ A - Z
+ Aktivitás
+ Rendezés
+ Legfrissebbek megjelenítése
+ Szűrők megjelenítése
+ Elrendezési beállítások
+ Szobák felfedezése
+ Szoba létrehozása
+ Chat indítása
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 031e13ed63..d1e68b4529 100644
--- a/library/ui-strings/src/main/res/values-in/strings.xml
+++ b/library/ui-strings/src/main/res/values-in/strings.xml
@@ -47,8 +47,8 @@
Hanya kontak MatrixRuanganLaporan kutu
- Aplikasi gagal saat terakhir digunakan. Apakah Anda ingin membuka halaman laporan kegagalan\?
- Gabung di Ruangan
+ Aplikasi mogok saat terakhir digunakan. Apakah Anda ingin membuka halaman laporan kemogokan\?
+ Bergabung ke RuanganMulai Panggilan SuaraMasukMulai Panggilan Video
@@ -69,7 +69,7 @@
TIDAKLanjutHapus
- Gabung
+ BergabungTolakNantiKirim catatan gangguan
@@ -88,7 +88,7 @@
Kirim tampilan layarMohon uraikan kutu tersebut. Apa yang Anda lakukan\? Apa yang Anda harapkan terjadi\? Apa yang sebenarnya terjadi\?Catatan dari klien akan dikirim bersama laporan gangguan ini untuk mendalami kendala yang Anda temukan. Laporan gangguan ini, termasuk catatan dan tangkapan layar, tidak akan terlihat secara umum. Jika Anda hanya ingin mengirimkan tulisan di atas, silakan hapus centang:
- Sepertinya Anda mengguncang ponsel akibat frustrasi. Apakah Anda ingin membuka halaman laporan kutu\?
+ Sepertinya Anda mengguncang ponsel akibat emosi. Apakah Anda ingin membuka halaman laporan kutu\?Pengiriman laporan kutu gagal (%s)Kemajuan (%s%%)Nama Pengguna
@@ -122,9 +122,9 @@
Kirim StickerAmbil fotoAmbil video
- Saat ini Anda belum memiliki pak stiker.
+ Saat ini Anda belum memiliki paket stiker apa pun.
\n
-\nMau tambah sekarang\?
+\nIngin tambah sekarang\?Maaf, tidak ada aplikasi eksternal yang mendukung apa yang ingin dilakukan.Meminta ulang kunci enkripsi dari perangkat Anda yang lain.Jalankan ${app_name} di perangkat yang dapat mendekripsi pesan tersebut agar kunci dapat dikirim ke perangkat ini.
@@ -146,8 +146,8 @@
Sembunyikan semua pesan dari pengguna iniTunjukkan semua pesan dari pengguna iniSebut
- Anda tidak akan dapat mengembalikan perubahan ini setelah Anda mengangkat pengguna ini agar memiliki kuasa yang setara dengan Anda.
-\nApakah anda yakin untuk melanjutkan\?
+ Anda tidak akan dapat mengembalikan perubahan ini setelah Anda mengangkat pengguna ini agar memiliki daya yang setara dengan Anda.
+\nApakah Anda yakin untuk melanjutkan\?Melakukan pencekalan pengguna akan mengeluarkannya dari ruangan ini dan mencegahnya untuk kembali masuk.Gagal terjawab oleh pihak lain.%s sedang mengetik…
@@ -210,7 +210,7 @@
Tidak dapat membuat widget.Gagal mengirim permohonan.Tingkat energi harus bilangan positif.
- Anda tidak tergabung dengan ruangan ini.
+ Anda tidak di ruangan ini.Anda tidak memiliki permisi untuk melakukan itu di ruangan ini.Tidak ada room_id dalam permohonan.Tidak ada user_id dalam permohonan.
@@ -228,7 +228,7 @@
Menghapus cekalan pengguna dengan id berikutTentukan tingkat kuasa seorang penggunaUndang pengguna dengan id berikut bergabung ke ruangan ini
- Gabung ke ruangan dengan alamat berikut
+ Bergabung ke ruangan dengan alamat berikutTinggalkan ruangTentukan topik ruangKeluarkan pengguna dengan id berikut
@@ -251,10 +251,10 @@
Nonaktifkan AkunIni akan mengakibatkan akun Anda tidak dapat digunakan secara permanen. Anda tidak akan dapat masuk dan orang lain tidak dapat mendaftar ulang dengan ID pengguna yang sama. Ini akan mengakibatkan akun Anda keluar dari semua ruangan tempat Anda berpartisipasi serta menghapus semua detail akun dari server identitas Anda. Tindakan ini tidak dapat diubah.
\n
-\nMenonaktifkan akun Anda tidak membuat kami melupakan pesan-pesan yang Anda kirim secara default. Jika Anda ingin kami melupakan pesan-pesan Anda, mohon centang kotak berikut.
+\nMenonaktifkan akun Anda tidak membuat kami melupakan pesan-pesan yang Anda kirim secara bawaan. Jika Anda ingin kami melupakan pesan-pesan Anda, mohon centang kotak berikut.
\n
\nKeterbacaan pesan di Matrix serupa dengan email. Dengan kami melupakan pesan-pesan Anda berarti pesan-pesan yang Anda kirim tidak akan dibagikan kepada pengguna baru ataupun yang belum terdaftar, tetapi pengguna yang terdaftar yang mempunyai mengakses pesan-pesan tersebut masih dapat mengakses salinan mereka.
- Mohon lupakan semua pesan yang telah saya kirim ketika akun saya dideaktivasi (Peringatan: ini akan mengakibatkan pengguna di masa depan melihat percakapan yang tidak lengkap)
+ Mohon lupakan semua pesan yang telah saya kirim ketika akun saya dinonaktifkan (Peringatan: ini akan mengakibatkan pengguna di masa depan melihat percakapan yang tidak lengkap)Nonaktifkan AkunMohon masukkan kata sandi Anda.Ruangan ini telah berubah dan tidak lagi aktif.
@@ -276,7 +276,7 @@
Jangan kirim pesan terenkripsi ke perangkat yang tidak terverifikasi dari perangkat ini.TIDAK terverifikasiVerifikasi
- Untuk memastikan perangkat dapat dipercaya, mohon kontak pengguna dengan medium lain (misalnya tatap muka atau panggilan telepon) dan tanya apakah kunci yang mereka lihat di Pengaturan Pengguna untuk perangkat ini cocok dengan kunci berikut:
+ Konfirmasi dengan membandingkan berikut ini dengan Pengaturan Pengguna di sesi Anda yang lain:Apabila cocok, tekan tombol verifikasi berikut.
Apabila tidak, seseorang sedang menyadap perangkat ini dan mungkin perlu diblokir.
Di masa mendatang proses verifikasi ini akan dimutakhirkan.
@@ -290,7 +290,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Siapa punHanya anggota (dimulai sejak opsi ini dipilih)Hanya anggota (dimulai sejak mereka diundang)
- Hanya anggota (dimulai sejak mereka bergabung)
+ Hanya anggota (sejak mereka bergabung)Pengguna yang dicekalLanjutanID internal ruangan ini
@@ -378,11 +378,11 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
KeluarkanPeriksa Keadaan PemberitahuanHasil diagnosa pemeriksaan keadaan
- Lansungkan Ujicoba
+ Jalankan PengujianBerlangsung… (%1$d of %2$d)Diagnosa dasar berlangsung lancar. Apabila Anda masih belum dapat menerima pemberitahuan, mohon kirim laporan kutu untuk kami selidiki.
- Satu atau beberapa ujicoba gagal, coba sugesti yang kami tawarkan.
- Satu atau beberapa ujicoba gagal, mohon kirim laporan kutu untuk kami selidiki.
+ Satu atau beberapa ujian gagal, coba saran yang kami tawarkan.
+ Satu atau beberapa ujian gagal, mohon kirim laporan kutu untuk kami selidiki.Pengaturan Sistem.Pemberitahuan diperbolehkan dalam pengaturan sistem.Notifikasi dinonaktifkan dalam pengaturan sistem.
@@ -400,7 +400,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.PerbolehkanPemeriksaan Layanan Google PlayAPK Layanan Google Play ditemukan dan telah diperbaharui.
- ${app_name} menggunakan Layanan Google Play untuk mendorong pesan tapi tampaknya tidak diatur sebagaimana harusnya.
+ ${app_name} menggunakan Layanan Google Play untuk mendorong pesan tapi tampaknya tidak diatur sebagaimana harusnya:
\n%1$sPerbaiki Layanan Google PlayToken Firebase
@@ -417,7 +417,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Layanan tidak akan mulai ketika perangkat dinyalakan kembali, Anda tidak akan menerima pemberitahuan hingga Anda membuka ${app_name}.Perbolehkan memulai ketika perangkat dinyalakanPeriksa halangan di balik layar
- Larangan background dinonaktifkan untuk ${app_name}. Percobaan ini sebaiknya dijalankan menggunakan jaringan mobile data (bukan WIFI).
+ Larangan latar belakang dinonaktifkan untuk ${app_name}. Percobaan ini sebaiknya dijalankan menggunakan jaringan data ponsel (bukan WiFi).
\n%1$sLarangan background dinonaktifkan untuk ${app_name}.
\nAktivitas yang dilakukan aplikasi ini akan terhalang ketika beroperasi di balik layar, dan ini dapat mempengaruhi pemunculan notifikasi.
@@ -446,7 +446,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.[%1$s]
\nError ini di luar kendali ${app_name} dan menurut Google, error ini muncul ketika terlalu banyak aplikasi terdaftar dengan FCM pada perangkat tersebut. Error ini tidak seharusnya mempengaruhi pengguna biasa.[%1$s]
-\nError ini di luar kendali ${app_name}, dan dapat muncul karena berbagai alasan. Coba lagi nanti, atau Anda juga dapat memeriksa apabila penggunaan jaringan data Layanan Google Play tidak terhalang oleh sistem, atau waktu pada perangkat sudah benar, atau ini dapat terjadi pada ROM tidak resmi.
+\nKesalahan ini di luar kendali ${app_name}, dan dapat muncul karena berbagai alasan. Coba lagi nanti, atau Anda juga dapat memeriksa apabila penggunaan jaringan data Layanan Google Play tidak terhalang oleh sistem, atau waktu pada perangkat sudah benar, atau ini dapat terjadi pada ROM tidak resmi.[%1$s]
\nError ini di luar kendali ${app_name}. Tidak terdapat akun Google pada perangkat. Mohon buka pengelola akun dan tambahkan akun Google.Tambah Akun
@@ -493,7 +493,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
%s melakukan panggilan suara.Anda melakukan panggilan video.%s melakukan panggilan video.
- Anda mengubah nama kamar menjadi: %1$s
+ Anda mengubah nama ruangan menjadi: %1$s%1$s mengubah nama ruangan menjadi: %2$sAnda mengubah avatar ruangan ini%1$s mengubah avatar ruangan ini
@@ -546,7 +546,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Aplikasi ini sedang menunggu pushAplikasi ini menerima pushGagal menerima push. Solusinya adalah untuk menginstal ulang aplikasi.
- Percobaan Push
+ Percobaan DoronganPastikan Anda mengeklik tautan di email yang telah kami kirimkan kepada Anda.Hapus %s\?Tidak ada nomor telepon yang ditambahkan ke akun Anda
@@ -578,7 +578,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Batalkan pencekalan penggunaAlasan untuk mencekalCekal pengguna
- Pengguna yang dikeluarkan akan menghilangkannya dari ruangan ini.
+ Pengguna akan dikeluarkan dari ruangan ini.
\n
\nUntuk mencegah mereka bergabung lagi, Anda seharusnya mencekalnya.Alasan untuk mengeluarkan
@@ -657,7 +657,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Gagal menambahkan widgetAnda tidak dapat melakukan panggilan dengan diri sendiri, tunggu untuk peserta untuk menerima undanganAnda tidak dapat melakukan panggilan dengan diri sendiri
- Pertemuan menggunakan kebijakan keamanan dan izin Jitsi. Semua orang saat ini berada di ruangan akan melihat undangan untuk bergabung saat pertemuan Anda sedang berlangsung.
+ Pertemuan menggunakan kebijakan keamanan dan perizinan Jitsi. Semua orang saat ini berada di ruangan akan melihat undangan untuk bergabung saat pertemuan Anda sedang berlangsung.Mulai rapat videoMulai rapat audioAnda tidak memiliki izin untuk memulai panggilan
@@ -675,19 +675,19 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
PutuskanBatalkanTidak Ada
- Standar Sistem
+ Bawaan SistemAnda mengaktifkan enkripsi ujung-ke-ujung. (algoritma tidak dikenali %1$s).%1$s mengaktifkan enkripsi ujung-ke-ujung. (algoritma tidak dikenali %2$s).Anda mengaktifkan enkripsi ujung-ke-ujung.%1$s mengaktifkan enkripsi ujung-ke-ujung.
- Anda telah mencegah para tamu untuk bergabung ruangan.
- %1$s telah mencegah para tamu untuk bergabung ruangan.
- Anda telah mencegah para tamu untuk bergabung ruangan.
- %1$s telah mencegah para tamu untuk bergabung ruangan.
- %1$s telah mengizinkan para tamu untuk bergabung ruangan.
- Anda telah mengizinkan para tamu untuk bergabung ruangan.
- Anda telah mengizinkan para tamu untuk bergabung disini.
- %1$s telah mengizinkan para tamu untuk bergabung disini.
+ Anda telah mencegah para tamu untuk bergabung ke ruangan.
+ %1$s telah mencegah para tamu untuk bergabung ke ruangan.
+ Anda telah mencegah para tamu untuk bergabung ke ruangan.
+ %1$s telah mencegah para tamu untuk bergabung ke ruangan.
+ %1$s telah mengizinkan para tamu untuk bergabung ke ruangan.
+ Anda telah mengizinkan para tamu untuk bergabung ke ruangan.
+ Anda telah mengizinkan para tamu untuk bergabung di sini.
+ %1$s telah mengizinkan para tamu untuk bergabung di sini.Anda mengubah alamat untuk ruangan ini.%1$s mengubah alamat untuk ruangan ini.Anda mengubah alamat utama dan alamat alternatif untuk ruangan ini.
@@ -740,12 +740,12 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
%1$s meninggalkan ruangan. Alasan: %2$sAnda meninggalkan ruangan. Alasan: %1$s%1$s meninggalkan ruangan. Alasan: %2$s
- Anda bergabung. Alasan %1$s
- %1$s bergabung. Alasan %2$s
- %1$s bergabung ruangan. Alasan: %2$s
+ Anda bergabung. Alasan: %1$s
+ %1$s bergabung. Alasan: %2$s
+ %1$s bergabung ke ruangan. Alasan: %2$s%1$s mengundang Anda. Alasan: %2$sAnda mengundang %1$s. Alasan: %2$s
- Anda bergabung ruangan. Alasan %1$s
+ Anda bergabung ke ruangan. Alasan: %1$s%1$s mengundang %2$s. Alasan: %3$sUndangan Anda. Alasan: %1$sUndangan %1$s. Alasan: %2$s
@@ -800,12 +800,12 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
%1$s menerima undangan untuk %2$sAnda membatalkan undangan untuk %1$s%1$s membatalkan undangan untuk %2$s
- Anda membatalkan undangan untuk %1$s untuk bergabung ruangan
- %1$s membatalkan undangan untuk %2$s untuk bergabung ruangan
+ Anda membatalkan undangan untuk %1$s untuk bergabung ke ruangan
+ %1$s membatalkan undangan untuk %2$s untuk bergabung ke ruanganAnda mengundang %1$s%1$s mengundang %2$s
- Anda mengirimkan undangan ke %1$s untuk bergabung ruangan
- %1$s mengirimkan undangan ke %2$s untuk bergabung ruangan
+ Anda mengirimkan undangan ke %1$s untuk bergabung ke ruangan
+ %1$s mengirimkan undangan ke %2$s untuk bergabung ke ruanganAnda menghapus avatar ruangan%1$s menghapus avatar ruanganAnda menghapus topik ruangan
@@ -833,8 +833,8 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Maaf, terjadi kesalahanMohon masukkan nama pengguna.Diam
- Penurunan harga telah dinonaktifkan.
- Penurunan harga telah diaktifkan.
+ Markdown telah dinonaktifkan.
+ Markdown telah diaktifkan.Perintah \"%s\" membutuhkan parameter tambahan, atau beberapa parameter salah.AbaikanPermintaan Pembagian Kunci
@@ -965,9 +965,9 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Beritahu saya untukPutar suara ranaPilih
- Sumber media default
+ Sumber media bawaanPilih
- Kompresi default
+ Kompresi bawaanMediaKelola email dan nomor telepon yang ditautkan ke akun Matrix AndaEmail dan nomor telepon
@@ -992,7 +992,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Gunakan perintah /confetti atau kirim pesan yang berisi ❄️ atau 🎉Tampilkan efek chatGunakan pengelola integrasi untuk mengelola bot, jembatan, widget, dan paket stiker.
-\nPengelola integrasi menerima data konfigurasi, dan dapat memodifikasi widget, mengirim undangan ruang, dan mengatur tingkat daya dengan sepengetahuan Anda.
+\nPengelola integrasi menerima data konfigurasi, dan dapat memodifikasi widget, mengirim undangan ruang, dan mengatur tingkat daya dengan pengetahuan Anda.
Integrasi%d detik
@@ -1047,11 +1047,11 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Email ini tidak terkait dengan akun apa pun.Aplikasi tidak dapat membuat akun di homeserver ini.
\n
-\nApakah Anda ingin mendaftar menggunakan client web\?
+\nApakah Anda ingin mendaftar menggunakan klien web\?
Maaf, server ini tidak menerima akun baru.Aplikasi tidak dapat masuk ke homeserver ini. Homeserver mendukung jenis masuk berikut: %1$s.
\n
-\nApakah Anda ingin masuk menggunakan client web\?
+\nApakah Anda ingin masuk menggunakan klien web\?
Ada kesalahan terjadi saat memuat halaman: %1$s (%2$d)Masukkan alamat server yang ingin Anda gunakanMasukkan alamat Modular Element atau Server yang ingin Anda gunakan
@@ -1076,7 +1076,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
LainnyaPelajari lebih lanjutHosting premium untuk organisasi
- Bergabunglah dengan jutaan orang secara gratis di server publik terbesar
+ Bergabung dengan jutaan orang secara gratis di server publik terbesarSama seperti email, akun memiliki satu tempat, tetapi Anda dapat berkomunikasi dengan siapa sajaPilih serverMulai
@@ -1374,7 +1374,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
BUATPesan LangsungRuangan
- Ruangan ini tidak dapat ditampilkan. Apakah Anda masih mau bergabung\?
+ Ruangan ini tidak dapat ditampilkan. Apakah Anda masih ingin bergabung\?Ruangan ini tidak dapat di akses di waktu ini.
\nCoba lagi nanti, atau tanya admin ruangan untuk memeriksa jika Anda punya akses.Ruangan ini tidak dapat di tampilkan
@@ -1424,7 +1424,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Tidak ada informasi cryptographicunstablestable
- Versi Default
+ Versi BawaanVersi Ruangan 👓Batas tidak diketahui.Homeserver Anda menerima lampiran (file, media, dsb.) dengan ukuran hingga %s.
@@ -1435,7 +1435,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Kelola SesiTampilkan Semua SesiSesi Aktif
- Admin server Anda telah menonaktifkan enkripsi ujung-ke-ujung secara default di kamar pribadi & pesan langsung.
+ Admin server Anda telah menonaktifkan enkripsi ujung-ke-ujung secara bawaan di ruangan & Pesan Langsung privat.Tanda Tangan Silang dinonaktifkanTanda Tangan Silang diaktifkan.
\nKunci dipercaya.
@@ -1710,7 +1710,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.Tambahkan ruangan dan space yang sudah adaAnda adalah admin satu-satunya di space ini. Meninggalkannya berarti siapa saja tidak akan mempunyai kontrol atas space-nya.Anda tidak akan dapat bergabung lagi kecuali jika Anda diundang lagi.
- Anda orang satu-satunya di sini. Jika Anda tinggalkan, siapa saja tidak dapat bergabung di masa depan, termasuk Anda.
+ Anda adalah orang satu-satunya di sini. Jika Anda tinggalkan, siapa saja tidak dapat bergabung di masa depan, termasuk Anda.Apakah Anda yakin untuk meninggalkan %s\?TinggalkanTambahkan ruangan
@@ -2015,7 +2015,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Gagal mengimpor kunciMenunggu untuk %s…Hampir selesai! Menunggu untuk konfirmasi…
- Hampir selesai! Apakah perangkat yang lain menunjukkan centang yang sama\?
+ Hampir selesai! Apakah perangkat yang lain menunjukkan sebuah centang\?"Topik: "Tambahkan topik%s untuk memberi tahu orang-orang tentang ruangan ini.
@@ -2043,7 +2043,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Mengsinkronisasikan Kunci Penandatanganan DiriMengsinkronisasikan Kunci PenggunaMengsinkronisasikan Kunci Utama
- Mendefinisikan Kunci SSSS default
+ Mendefinisikan Kunci SSSS bawaanMembuat kunci aman dari frasa sandiMempublikasikan kunci identitas yang telah dibuatSelesai
@@ -2071,7 +2071,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Jika Anda batalkan, Anda tidak dapat membaca pesan terenkripsi di perangkat ini dan pengguna lain tidak akan mempercayainyaAkun Anda mungkin dikompromikanIni bukan saya
- Login baru. Apakah itu Anda\?
+ Pemasukan baru. Apakah itu Anda\?SegarkanAkses riwayat pesan terenkripsiEkspor Audit
@@ -2091,13 +2091,13 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Kirim gambar dengan ukuran asli
- Apakah Anda mau mengirim lampiran ini ke %1$s\?
+ Apakah Anda ingin mengirim lampiran ini ke %1$s\?Hapus…Tidak dapat menemukan rahasia di penyimpananJika Anda tidak dapat mengakses sesi yang sudah adaPeringatan tingkat kepercayaanLevel kepercayaan peringatan
- Level kepercayaan default
+ Level kepercayaan bawaanDipilihVideomempunyai draf yang belum dikirim
@@ -2109,7 +2109,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Buka widgetTangkap layarGagal mengotentikasi
- ${app_name} meminta Anda untuk memasukkan kredential untuk melakukan aksi ini.
+ ${app_name} meminta Anda untuk memasukkan kredensial untuk melakukan tindakan ini.Otentikasi Ulang DibutuhkanGeser untuk mengakhirkan panggilanOrang tak dikenal
@@ -2155,7 +2155,7 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Koneksi ke server telah hilangTidakYa
- Hampir selesai! Apakah %s menampilkan centang yang sama\?
+ Hampir selesai! Apakah %s menampilkan sebuah centang\?Kode QRAtur Ulang KunciMemulai Tanda Tangan Silang
@@ -2186,9 +2186,9 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Izin spaceMenghapus cekalan akan mengizinkan pengguna untuk bergabung ke space lagi.Mencekal pengguna akan mengeluarkan pengguna dari space ini dan mencegah pengguna untuk bergabung lagi.
- mengeluarkan pengguna akan mengeluarkannya dari space ini.
+ Pengguna akan dikeluarkan dari space ini.
\n
-\nUntuk mencegah pengguna untuk bergabung lagi, Anda seharusnya cekal pengguna itu saja.
+\nUntuk mencegah mereka untuk bergabung lagi, Anda seharusnya mencekalnya.Berhenti MerekamMenambahkan ( ͡° ͜ʖ ͡°) ke pesan teks biasaTidak ada kebijakan yang disediakan oleh server identitasnya
@@ -2571,4 +2571,21 @@ Di masa mendatang proses verifikasi ini akan dimutakhirkan.
Jelajahi RuanganBuat RuanganMulai Obrolan
+ Maaf, ruangan ini tidak ditemukan.
+\nMohon coba lagi nanti.%s
+ Belum diverifikasi · Aktivitas terakhir %1$s
+ Terverifikasi · Aktivitas terakhir %1$s
+ Tampilkan Semua (%1$d)
+ Sesi Saat Ini
+ Tampilkan Detail
+ Verifikasi Sesi
+ Verifikasi sesi Anda saat ini untuk perpesanan yang aman.
+ Sesi Anda saat ini siap untuk perpesanan yang aman.
+ Sesi belum diverifikasi
+ Sesi terverifikasi
+ Tipe perangkat tidak diketahui
+ Desktop
+ Web
+ Ponsel
+ Undangan
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 5dd17d5cbe..ecb29d1586 100644
--- a/library/ui-strings/src/main/res/values-it/strings.xml
+++ b/library/ui-strings/src/main/res/values-it/strings.xml
@@ -2610,4 +2610,21 @@
Esplora le stanzeCrea una stanzaInizia una chat
+ Non verificata · Ultima attività %1$s
+ Verificata · Ultima attività %1$s
+ Vedi tutte (%1$d)
+ Sessione attuale
+ Vedi dettagli
+ Verifica la sessione
+ Verifica la tua sessione attuale per messaggi più sicuri.
+ La tua sessione attuale è pronta per i messaggi sicuri.
+ Sessione non verificata
+ Sessione verificata
+ Tipo di dispositivo sconosciuto
+ Desktop
+ Web
+ Mobile
+ Spiacenti, questa stanza non è stata trovata.
+\nRiprova più tardi.%s
+ Inviti
diff --git a/library/ui-strings/src/main/res/values-lt/strings.xml b/library/ui-strings/src/main/res/values-lt/strings.xml
index 454bf8a4db..c33f8257c6 100644
--- a/library/ui-strings/src/main/res/values-lt/strings.xml
+++ b/library/ui-strings/src/main/res/values-lt/strings.xml
@@ -447,4 +447,238 @@
%d praleistų balso skambučiųSkambutis baigtas
-
+ ${app_name} reikia leidimo prieiti prie jūsų mikrofono, kad galėtumėte atlikti garso skambučius.
+ Baigiamas skambutis…
+ Nuotolinio ryšio pusėje nepavyko prisijungti.
+ Jokio atsakymo
+ Naudotojas, kuriam skambinote, yra užimtas.
+ Naudotojas užimtas
+ Sulaikėte skambutį
+ %s sulaikė skambutį
+ Sulaikyti
+ Tęsti
+ Balso skambutis su %s
+ Vaizdo skambutis su %s
+ Vaizdo skambutis vyksta…
+ Skambutis vyksta…
+ Įeinantis balso skambutis
+ Įeinantis vaizdo skambutis
+
+ Praleistas vaizdo skambutis
+ %d praleisti vaizdo skambučiai
+ %d praleistų vaizdo skambučių
+
+ Skambutis skamba…
+ Jungiamasi prie skambučio…
+ Pasirinkite skambučių melodiją:
+ Įeinančio skambučio melodija
+ Įeinantiems skambučiams naudoti numatytąją ${app_name} melodiją
+ Prieš pradedant skambutį prašyti patvirtinimo
+ Užkirsti kelią atsitiktiniam skambučiui
+ Mažas
+ Vidutinis
+ Didelis
+ Originalas
+
+ %d narystės pokytis
+ %d narystės pokyčiai
+ %d narystės pokyčių
+
+ Prašome paleisti ${app_name} kitame įrenginyje, kuris gali iššifruoti žinutę, kad galėtų išsiųsti raktus į šią sesiją.
+ Pakartotinai paprašykite šifravimo raktų iš kitų seansų.
+ Išsiųsta per daug užklausų
+ Nebuvo tinkamo JSON
+ Klaidingas JSON
+ Neautorizuotas, trūksta galiojančių tapatumo duomenų
+ SSL klaida.
+ SSL klaida: bendrakeleivio tapatybė nepatvirtinta.
+ Pasirinkti namų serverį
+ Nepavyko pasiekti namų serverio URL adresu %s. Patikrinkite nuorodą arba pasirinkite namų serverį rankiniu būdu.
+ Nepavyko pasiekti namų serverio šiuo URL adresu, prašome jį patikrinti
+ Tai nėra galiojantis \"Matrix\" serverio adresas
+ Prašome įvesti tinkamą URL adresą
+ Peržiūrėkite ir sutikite su šio namų serverio taisyklėmis:
+ %1$s išėjo iš kambario. Priežastis: %2$s
+ Prisijungėte. Priežastis: %1$s
+ %1$s prisijungė. Priežastis: %2$s
+ Prisijungėte prie kambario. Priežastis: %1$s
+ %1$s prisijungė prie kambario. Priežastis: %2$s
+ Siunčiama žinutė…
+ Žinutė išsiųsta
+ - Kai kurie naudotojai nebeignoruojami
+ ${app_name} turi išvalyti talpyklą, kad ji būtų atnaujinta dėl šios priežasties:
+\n%s
+\n
+\nAtkreipkite dėmesį, kad atlikus šį veiksmą programa bus paleista iš naujo ir tai gali šiek tiek užtrukti.
+ Pradinio sinchronizavimo užklausa
+ Pradinė sinchronizacija:
+\nImportuojame paskyros duomenis
+ Pradinė sinchronizacija:
+\nImportuojame išeitus kambarius
+ Pradinė sinchronizacija:
+\nImportuojame kambarių kvietimus
+ Pradinė sinchronizacija:
+\nĮkeliame jūsų pokalbius
+\nJei prisijungėte prie daugybės kambarių, tai gali užtrukti
+ Pradinė sinchronizacija:
+\nImportuojame kambarius
+ Pradinė sinchronizacija:
+\nImportuojame kriptografija
+ Pradinė sinchronizacija:
+\nImportuojame paskyrą…
+ Pradinė sinchronizacija:
+\nLaukiame serverio atsakymo…
+ Pradinė sinchronizacija:
+\nAtsisiunčiame duomenis…
+ Tuščias kambarys (buvo %s)
+ Tuščias kambarys
+
+ %1$s, %2$s, %3$s ir %4$d kitas
+ %1$s, %2$s, %3$s ir %4$d kiti
+ %1$s, %2$s, %3$s ir %4$d kitų
+
+ %1$s, %2$s, %3$s ir %4$s
+ %1$s, %2$s ir %3$s
+ %1$s ir %2$s
+ Kvietimas į kambarį
+ Telefono numeris
+ El. pašto adresas
+ Jums neleidžiama prisijungti prie šio kambario
+ Sukurti kambarį
+ Naršyti kambarius
+ Jūs atnaujinote čia.
+ El. paštas nepatvirtintas, patikrinkite savo pašto dėžutę
+ Nepavyko patvirtinti el. pašto adreso: įsitikinkite, kad paspaudėte el. laiške esančią nuorodą
+ Šis namų serveris norėtų įsitikinti, kad nesate robotas
+ Pamiršote slaptažodį\?
+ Šis telefono numeris jau yra įrašytas.
+ Šis el. pašto adresas jau yra įrašytas.
+ Tai neatrodo kaip tinkamas el. pašto adresas
+ Neteisingas naudotojo vardas ir (arba) slaptažodis
+ Pateikti
+ Prisijungimas vienkartiniu prisijungimu
+ Prisijungti
+ Atsiprašome, nerastos jokios išorinės programos šiam veiksmui atlikti.
+ Šiuo metu nėra įjungti jokie lipdukų paketai.
+\n
+\nAr norite pridėti keletą dabar\?
+ Naudoti kaip numatytąjį ir daugiau neklausti
+ Filmuoti
+ Fotografuoti
+ Fotografuoti arba filmuoti
+ Siųsti lipduką
+ Siųsti failus
+ Sustabdyti ekrano bendrinimą
+ Bendrinti ekraną
+ Įjungti HD
+ Išjungti HD
+ Atgalinė
+ Priekinė
+ Perjungti kamerą
+ Pasirinkite garso įrenginį
+ Kvietimai
+ A - Z
+ Veikla
+ Rikiuoti pagal
+ Rodyti naujausius
+ Rodyti filtrus
+ Išdėstymo parinktys
+ Kitas
+ min
+ val
+ %1$s pakeitė alternatyvius šio kambario adresus.
+
+ Pašalinote alternatyvų šio kambario adresą %1$s.
+ Pašalinote alternatyvius šio kambario adresus %1$s.
+ Pašalinote alternatyvius šio kambario adresus %1$s.
+
+
+ %1$s pašalino alternatyvų šio kambario adresą %2$s.
+ %1$s pašalino alternatyvius šio kambario adresus %2$s.
+ %1$s pašalino alternatyvius šio kambario adresus %2$s.
+
+
+ Pridėjote alternatyvų šio kambario adresą %1$s.
+ Pridėjote alternatyvius šio kambario adresus %1$s.
+ Pridėjote alternatyvius šio kambario adresus %1$s.
+
+
+ %1$s pridėjo alternatyvų šio kambario adresą %2$s.
+ %1$s pridėjo alternatyvius šio kambario adresus %2$s.
+ %1$s pridėjo alternatyvius šio kambario adresus %2$s.
+
+ Pašalinote pagrindinį šio kambario adresą.
+ %1$s pašalino pagrindinį šio kambario adresą.
+ Nustatėte pagrindinį šio kambario adresą į %1$s.
+ %1$s nustatė pagrindinį šio kambario adresą į %2$s.
+ Pridėjote %1$s ir pašalinote %2$s kaip šio kambario adresus.
+ %1$s pridėjo %2$s ir pašalino %3$s kaip šio kambario adresus.
+
+ Pašalinote %1$s kaip šio kambario adresą.
+ Pašalinote %1$s iš šio kambario adresų.
+ Pašalinote %1$s iš šio kambario adresų.
+
+
+ %1$s pašalino %2$s kaip šio kambario adresą.
+ %1$s pašalino %2$s iš šio kambario adresų.
+ %1$s pašalino %2$s iš šio kambario adresų.
+
+
+ Pridėjote %1$s kaip šio kambario adresą.
+ Pridėjote %1$s kaip šio kambario adresus.
+ Pridėjote %1$s kaip šio kambario adresus.
+
+
+ %1$s pridėjo %2$s kaip šio kambario adresą.
+ %1$s pridėjo %2$s kaip šio kambario adresus.
+ %1$s pridėjo %2$s kaip šio kambario adresus.
+
+ Atšaukėte %1$s kvietimą. Priežastis: %2$s
+ %1$s atšaukė %2$s kvietimą. Priežastis: %3$s
+ Priėmėte %1$s kvietimą. Priežastis: %2$s
+ %1$s priėmė %2$s kvietimą. Priežastis: %3$s
+ Jūs užblokavote %1$s. Priežastis: %2$s
+ %1$s užblokavo %2$s. Priežastis: %3$s
+ Atblokavote %1$s. Priežastis: %2$s
+ %1$s atblokavo %2$s. Priežastis: %3$s
+ Pašalinote %1$s. Priežastis: %2$s
+ %1$s pašalino %2$s. Priežastis: %3$s
+ Kvietimą atmetėte. Priežastis: %1$s
+ %1$s atmetė kvietimą. Priežastis: %2$s
+ Išėjote. Priežastis: %1$s
+ %1$s išėjo. Priežastis: %2$s
+ Išėjote iš kambario. Priežastis: %1$s
+ Visi pokalbiai
+ Matricos klaida
+ Nepavyksta išsiųsti žinutės
+ Siuntėjo įrenginys neatsiuntė mums šios žinutės raktų.
+ ** Nepavyksta iššifruoti: %s **
+ %1$s nuo %2$s iki %3$s
+ %1$s pakeitė %2$s galios lygį.
+ Pakeitėte %1$s galios lygį.
+ Pasirinktinis
+ Pasirinktinis (%1$d)
+ Standartinis
+ Moderatorius
+ Adminas
+ Pakeitėte %1$s valdiklį
+ %1$s pakeitė %2$s valdiklį
+ Pašalinote %1$s valdiklį
+ %1$s pašalino %2$s valdiklį
+ Pridėjote %1$s valdiklį
+ %1$s pridėjo %2$s valdiklį
+ %1$s išsiuntė kvietimą %2$s prisijungti prie kambario
+ %1$s atšaukė %2$s kvietimą prisijungti prie kambario
+ Priėmėte kvietimą į %1$s
+ %1$s priėmė kvietimą į %2$s
+ Atšaukėte kvietimą %1$s
+ %1$s atšaukė %2$s kvietimą
+ Atšaukėte %1$s kvietimą prisijungti prie kambario
+ Pakeitimų nėra.
+ • Serveriai atitinkantys %s buvo pašalinti iš leidžiamų sąrašo.
+ • Serveriai atitinkantys %s dabar yra leidžiami.
+ • Serveriai atitinkantys %s buvo pašalinti iš draudimų sąrašo.
+ • Serveriai atitinkantys %s dabar yra uždrausti.
+ • Serveriai atitinkantys %s yra leidžiami.
+ • Serveriai atitinkantys %s yra uždrausti.
+
\ 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 682fd1df1e..18b0de078c 100644
--- a/library/ui-strings/src/main/res/values-pl/strings.xml
+++ b/library/ui-strings/src/main/res/values-pl/strings.xml
@@ -735,7 +735,7 @@
Ustal jak inni mogą odnaleść twoje konto.MediaDomyślne źródło mediów
- Odzyskiwanie zaszyforwanych wiadomości
+ Odzyskiwanie zaszyfrowanych wiadomości%1$s: %2$d wiadomość%1$s: %2$d wiadomości
@@ -1058,12 +1058,12 @@
Zaakceptowałeś(-łaś)Żądanie weryfikacji wysłaneŻądanie weryfikacji
- Zweryfikuj tą sesję
+ Zweryfikuj tę sesjęZeskanuj kod z urządzenia innego użytkownika aby bezpiecznie zweryfikować siebie nawzajemZeskanuj ich kodNie można zeskanowaćJeżeli nie jesteś z tą osobą, zamiast tego porównaj emoji
- Zweryfikuj porównując emoji
+ Zweryfikuj porównując emotikonyZweryfikuj %sZweryfikowano %sOczekiwanie na %s…
@@ -1099,7 +1099,7 @@
Aktywować szyfrowanie\?Raz włączone szyfrowanie w pokoju nie może zostać wyłączone. Wiadomości wysłane w zaszyfrowanym pokoju nie są widziane przez serwer, a jedynie przez uczestników w pokoju. Aktywowanie szyfrowania może uniemożliwić wielu botom i mostkom prawidłowe działanie.Aktywuj szyfrowanie
- Aby być bezpiecznym, zweryfikuj %s poprzez sprawdzenie jednorazowego kodu.
+ Aby zachować bezpieczeństwo, zweryfikuj %s poprzez sprawdzenie jednorazowego kodu.Aby być bezpiecznym, zrób to osobiście lub użyj innej metody komunikacji.Porównaj unikalny ciąg emoji, upewniając się, że pojawiają się w identycznym porządku.Porównaj kod wyświetlany na ekranie innego użytkownika.
@@ -1120,7 +1120,7 @@
Wyloguj z tej sesjiBrak dostępnej informacji o kryptografiiTa sesja jest zaufana dla bezpiecznej wymiany wiadomości, ponieważ ją zweryfikowałeś(-łaś):
- Zweryfikuj tą sesję aby oznaczyć ją jako zaufaną i przyznać jej dostęp do zaszyfrowanych wiadomości. Jeżeli nie logowałeś(-łaś) się do tej sesji, twoje konto mogło zostać naruszone:
+ Zweryfikuj tę sesję aby oznaczyć ją jako zaufaną i przyznać jej dostęp do zaszyfrowanych wiadomości. Jeżeli nie logowałeś(-łaś) się do tej sesji, twoje konto mogło zostać zaatakowane:%d aktywna sesja%d aktywne sesje
@@ -1330,12 +1330,12 @@
Hasło odzyskiwaniaWeryfikacja anulowanaWeryfikacja anulowana. Możesz rozpocząć jej proces ponownie.
- Jedno z poniższych mogło zostać skompromitowane:
+ Jedno z poniższych może być zagrożone:
\n
-\n-Twoje hasło
-\n-Twój serwer domowy
-\n-To urządzenie albo inne urządzenie
-\n-Połączenie internetowe używane przez urządzenie
+\n- Twoje hasło
+\n- Twój serwer domowy
+\n- To lub drugie urządzenie
+\n- Połączenie internetowe używane przez dowolne z urządzeń
\n
\nZalecamy natychmiastową zmianę Twojego hasła oraz klucza odzyskiwania w Ustawieniach.Jeżeli anulujesz, nie będziesz w stanie czytać zaszyfrowanych wiadomości na nowym urządzeniu, a inni użytkownicy nie będą mu ufali
@@ -1388,7 +1388,7 @@
Zablokuj wszystkich nie będących członkami %s przed dołączeniem do tego pokojuUkryj zaawansowanePokaż zaawansowane
- Nie można znaleźć właściwego serwera domowego. Zweryfikuj swój identyfikator
+ Nie można znaleźć właściwego serwera domowego. Sprawdź swój identyfikatorTo nie jest prawidłowy identyfikator użytkownika. Oczekiwany format: \"@user:homeserver.org\"Jeżeli nie pamiętasz hasła, cofnij się aby je zresetować.Matrix ID
@@ -1492,7 +1492,7 @@
Włącz \"Zezwalaj na integracje\" w Ustawieniach żeby to zrobić.Integracje są zablokowaneTo zastąpi obecny Klucz bądź Hasło.
- Wygeneruj nowy Klucz Bezpieczeństwa albo Hasło dla istniejącej kopii zapasowej.
+ Wygeneruj nowy klucz bezpieczeństwa albo hasło dla istniejącej kopii zapasowej.Zabezpiecza przeciwko utracie dostępu do zaszyfrowanych wiadomości oraz danych poprzez zapisanie zaszyfrowanych kluczy na Twoim serwerze.Powiadomienie zostało kliknięte!Proszę kliknąć na powiadomieniu, Jeżeli nie widzisz powiadomienia, sprawdź ustawienia systemowe.
@@ -1649,7 +1649,7 @@
Mój kodUdostępnij mój kodZeskanuj kod QR
- Nie możemy zaprosić użytkowników. Zweryfikuj osoby, które chcesz zaprosić i spróbuj ponownie.
+ Nie udało się zaprosić użytkowników. Sprawdź osoby, które chcesz zaprosić i spróbuj ponownie.Zaproszenia wysłane do %1$s i jeszcze jednej osobyZaproszenia wysłane do %1$s i %2$d innych osób
@@ -1985,7 +1985,7 @@
Udostępnij linkZaproś przez nazwę użytkownika lub emailZaproś przez email
- Aktualnie jesteś tylko Ty. %s będzie jeszcze lepsza kiedy dołączą inni.
+ Aktualnie jesteś tu tylko ty. %s będzie jeszcze lepszą przestrzenią, gdy dołączą do niej inni.Zaproś do %sZaproś osobyZaproś osoby do Twojej przestrzeni
@@ -2127,7 +2127,7 @@
Limit wielkości pliku na serwerzeWersja serweraNazwa serwera
- Zweryfikuj zgodność wyświetlonych emotikon
+ Zamiast tego, zweryfikuj porównując emotikonyZeskanuj za pomocą tego urządzeniaZeskanuj kod Twoim drugim urządzeniem lub przełącz się i zeskanuj za pomocą tego urządzeniaGłos
@@ -2311,8 +2311,8 @@
Zastąp kolor wyświetlanej nazwyPosiadam już konto
- Połącz się z każdym.
- Ty jesteś w kontroli.
+ Bezpieczna komunikacja.
+ Masz wszystko pod kontrolą.Przejmij swoje konwersacje.By odkryć istniejące kontakty, musisz najpierw przesłać swoje dane kontaktowe (adresy e-mail i numer telefonu) do serwera tożsamości. Przed wysłaniem Twoje dane zostaną zaszyfrowane w celu zachowania prywatności.Uzyskaj pomoc w korzystaniu z ${app_name}
@@ -2392,12 +2392,12 @@
SpołecznościZespołyPrzyjaciele i rodzina
- Pomożemy Ci się połączyć
+ Pomożemy Ci nawiązać kontaktZ kim będziesz najczęściej rozmawiać\?
- Szyfrowane od-końca-do-końca i nie wymaga numeru telefonu. Brak reklam i dataminingu.
+ Szyfrowane od-końca-do-końca, bez konieczności podawania numeru telefonu. Zero reklam i dataminingu.Wybierz, gdzie prowadzone są Twoje rozmowy, dając Ci kontrolę i niezależność. Połączenie przez sieć Matrix.Bezpieczna i niezależna komunikacja, która zapewnia ten sam poziom prywatności, co rozmowa twarzą w twarz we własnym domu.
- Wiadomości dla Twojego zespołu.
+ Komunikacja dla Twojego zespołu.PołożenieZagadnienia prawneJuż przeglądasz ten wątek!
@@ -2521,7 +2521,7 @@
Każdy w przestrzeni nadrzędnej będzie mógł znaleźć ten pokój i dołączyć do niego — nie ma potrzeby ręcznego zapraszania wszystkich. W każdej chwili możesz to zmienić w ustawieniach pokoju.Automatycznie aktualizuj nadrzędną przestrzeńTwój system automatycznie wyśle dzienniki, gdy wystąpi błąd niemożności odszyfrowania
- Błędy automatycznego deszyfrowania raportów.
+ Automatycznie zgłaszaj błędy deszyfrowania.Opuść pokój o podanym identyfikatorze (lub aktualny pokój, jeśli null)Udostępnili swoją lokalizacjęPowiadom cały pokój
@@ -2718,4 +2718,20 @@
Utwórz pokójZacznij rozmawiaćWszystkie rozmowy
-
+ Nie zweryfikowano · Ostatnia aktywność %1$s
+ Zweryfikowano · Ostatnia aktywność %1$s
+ Pokaż wszystkie (%1$d)
+ Obecna sesja
+ Pokaż szczegóły
+ Zweryfikuj sesję
+ Twoja obecna sesja jest przygotowana do bezpiecznej komunikacji.
+ Niezweryfikowana sesja
+ Zweryfikowana sesja
+ Nieznany typ urządzenia
+ Komputer
+ Przeglądarka
+ Urządzenie przenośne
+ Niestety, ten pokój nie został znaleziony.
+\nSpróbuj ponownie później.%s
+ Zaproszenia
+
\ 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 23dd6ae75f..08c41db365 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
@@ -2619,4 +2619,21 @@
Explorar SalasCriar SalaComeçar Chat
+ Não-verificada · Última atividade %1$s
+ Verificada · Última atividade %1$s
+ Ver Todas (%1$d)
+ Sessão Atual
+ Visualizar Detalhes
+ Verificar Sessão
+ Verifique sua sessão atual para mensageria segura melhorada.
+ Sua sessão atual está pronta para mensageria segura.
+ Sessão não-verificada
+ Sessão verificada
+ Tipo de dispositivo desconhecido
+ Desktop
+ Mobile
+ Web
+ Desculpe, esta sala não tem sido encontrada.
+\nPor favor retente mais tarde.%s
+ Convites
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 68663b3b9c..2cc2d0280e 100644
--- a/library/ui-strings/src/main/res/values-sk/strings.xml
+++ b/library/ui-strings/src/main/res/values-sk/strings.xml
@@ -2669,4 +2669,21 @@
Preskúmať miestnostiVytvoriť miestnosťZačať konverzáciu
+ Neoverené - Posledná aktivita %1$s
+ Overené - Posledná aktivita %1$s
+ Zobraziť všetky (%1$d)
+ Aktuálna relácia
+ Zobraziť podrobnosti
+ Overiť reláciu
+ Overte svoju aktuálnu reláciu pre vylepšené bezpečné zasielanie správ.
+ Vaša aktuálna relácia je pripravená na bezpečné zasielanie správ.
+ Neoverená relácia
+ Overená relácia
+ Neznámy typ zariadenia
+ Stolný počítač
+ Web
+ Mobil
+ Je nám ľúto, táto miestnosť nebola nájdená.
+\nProsím, skúste to neskôr.%s
+ Pozvánky
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 47f15c9a27..1c809fff3e 100644
--- a/library/ui-strings/src/main/res/values-uk/strings.xml
+++ b/library/ui-strings/src/main/res/values-uk/strings.xml
@@ -2719,4 +2719,21 @@
Знайти кімнатиСтворити кімнатуРозпочати бесіду
+ Не звірений · Остання активність %1$s
+ Звірений · Остання активність %1$s
+ Переглянути всі (%1$d)
+ Поточний сеанс
+ Переглянути подробиці
+ Звірити сеанс
+ Звірте свій поточний сеанс для безпечнішого обміну повідомленнями.
+ Ваш поточний сеанс готовий для безпечного обміну повідомленнями.
+ Не звірений сеанс
+ Звірений сеанс
+ Невідомий тип пристрою
+ Комп\'ютер
+ Браузер
+ Мобільний
+ Перепрошуємо, цю кімнату не знайдено.
+\nСпробуйте пізніше.%s
+ Запрошення
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 6f7151167f..4e1c8e61c8 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
@@ -1682,7 +1682,7 @@
"话题: "添加一个话题%s让人们知道此房间是关于什么的。
- 这是你和 %s 的私聊消息历史记录的开始。
+ 这是你和%s的私聊消息历史的开始。这是此对话的开始。这是 %s 的开始。导出审计
@@ -2569,4 +2569,18 @@
探索房间创建房间开始聊天
-
+ 抱歉,未发现此房间。
+\n请晚些重试。%s
+ 未验证 · 上次活跃 %1$s
+ 已验证 · 上次活跃 %1$s
+ 查看全部(%1$d)
+ 当前会话
+ 查看详情
+ 验证会话
+ 为了获得增强的安全的消息传送,请验证你当前的会话。
+ 你的当前会话已准备好安全地收发消息。
+ 未验证的会话
+ 已验证的会话
+ 未知的设备类型
+ 邀请
+
\ 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 93b4a8d4c6..0f5208bcde 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
@@ -2569,4 +2569,21 @@
探索聊天室建立聊天室開始聊天
+ 未驗證 · 最後活動 %1$s
+ 已驗證 · 最後活動 %1$s
+ 檢視全部 (%1$d)
+ 目前工作階段
+ 檢視詳細資訊
+ 驗證工作階段
+ 驗證您目前的工作階段以強化安全通訊。
+ 您目前的工作階段已準備好進行安全通訊。
+ 未驗證的工作階段
+ 已驗證的工作階段
+ 未知的裝置類型
+ 桌面
+ 網頁
+ 行動裝置
+ 抱歉,找不到此聊天室。
+\n請稍後再試。%s
+ 邀請
diff --git a/library/ui-strings/src/main/res/values/strings.xml b/library/ui-strings/src/main/res/values/strings.xml
index b28c7c638c..cff1aaea1b 100644
--- a/library/ui-strings/src/main/res/values/strings.xml
+++ b/library/ui-strings/src/main/res/values/strings.xml
@@ -139,6 +139,7 @@
All ChatsStart ChatCreate Room
+ Change SpaceExplore RoomsExpand %s children
@@ -438,6 +439,9 @@
ActivityA - Z
+ Enable new layout
+ A simplified Element with optional tabs
+
InvitesLow priority
diff --git a/matrix-sdk-android/build.gradle b/matrix-sdk-android/build.gradle
index 7b06edb530..65f8baee7b 100644
--- a/matrix-sdk-android/build.gradle
+++ b/matrix-sdk-android/build.gradle
@@ -60,7 +60,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
- buildConfigField "String", "SDK_VERSION", "\"1.4.36\""
+ buildConfigField "String", "SDK_VERSION", "\"1.5.0\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
buildConfigField "String", "GIT_SDK_REVISION_UNIX_DATE", "\"${gitRevisionUnixDate()}\""
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/SpaceChildInfo.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/SpaceChildInfo.kt
index 7d3109fb6e..2388bee0ee 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/SpaceChildInfo.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/room/model/SpaceChildInfo.kt
@@ -34,5 +34,4 @@ data class SpaceChildInfo(
val canonicalAlias: String?,
val aliases: List?,
val worldReadable: Boolean
-
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceHierarchyData.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceHierarchyData.kt
index ecc3eb5224..d03f4c42cf 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceHierarchyData.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceHierarchyData.kt
@@ -16,13 +16,13 @@
package org.matrix.android.sdk.api.session.space
-import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo
+import org.matrix.android.sdk.api.session.space.model.SpaceChildSummaryEvent
data class SpaceHierarchyData(
val rootSummary: RoomSummary,
val children: List,
- val childrenState: List,
+ val childrenState: List,
val nextToken: String? = null
)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt
index c7a6405014..5d2a9412d1 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/SpaceService.kt
@@ -18,10 +18,10 @@ package org.matrix.android.sdk.api.session.space
import android.net.Uri
import androidx.lifecycle.LiveData
-import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.RoomSortOrder
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.model.RoomSummary
+import org.matrix.android.sdk.api.session.space.model.SpaceChildSummaryEvent
import org.matrix.android.sdk.api.session.space.peeking.SpacePeekResult
typealias SpaceSummaryQueryParams = RoomSummaryQueryParams
@@ -75,12 +75,12 @@ interface SpaceService {
suggestedOnly: Boolean? = null,
limit: Int? = null,
from: String? = null,
- knownStateList: List? = null
+ knownStateList: List? = null
): SpaceHierarchyData
/**
* Get a live list of space summaries. This list is refreshed as soon as the data changes.
- * @return the [LiveData] of List[SpaceSummary]
+ * @return the [LiveData] of List[RoomSummary]
*/
fun getSpaceSummariesLive(
queryParams: SpaceSummaryQueryParams,
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/SpaceChildSummaryEvent.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/SpaceChildSummaryEvent.kt
new file mode 100644
index 0000000000..13aa0336e5
--- /dev/null
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/session/space/model/SpaceChildSummaryEvent.kt
@@ -0,0 +1,30 @@
+/*
+ * 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.session.space.model
+
+import com.squareup.moshi.Json
+import com.squareup.moshi.JsonClass
+import org.matrix.android.sdk.api.session.events.model.Content
+
+@JsonClass(generateAdapter = true)
+data class SpaceChildSummaryEvent(
+ @Json(name = "type") val type: String? = null,
+ @Json(name = "state_key") val stateKey: String? = null,
+ @Json(name = "content") val content: Content? = null,
+ @Json(name = "sender") val senderId: String? = null,
+ @Json(name = "origin_server_ts") val originServerTs: Long? = null,
+)
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt
index d2f1b3202b..cd13b03017 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/DefaultSpaceService.kt
@@ -21,7 +21,6 @@ import androidx.lifecycle.LiveData
import kotlinx.coroutines.withContext
import org.matrix.android.sdk.api.MatrixCoroutineDispatchers
import org.matrix.android.sdk.api.query.QueryStringValue
-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.api.session.events.model.toModel
@@ -45,6 +44,7 @@ import org.matrix.android.sdk.api.session.space.SpaceHierarchyData
import org.matrix.android.sdk.api.session.space.SpaceService
import org.matrix.android.sdk.api.session.space.SpaceSummaryQueryParams
import org.matrix.android.sdk.api.session.space.model.SpaceChildContent
+import org.matrix.android.sdk.api.session.space.model.SpaceChildSummaryEvent
import org.matrix.android.sdk.api.session.space.model.SpaceParentContent
import org.matrix.android.sdk.api.session.space.peeking.SpacePeekResult
import org.matrix.android.sdk.internal.di.UserId
@@ -128,7 +128,7 @@ internal class DefaultSpaceService @Inject constructor(
suggestedOnly: Boolean?,
limit: Int?,
from: String?,
- knownStateList: List?
+ knownStateList: List?
): SpaceHierarchyData {
val spacesResponse = getSpacesResponse(spaceId, suggestedOnly, limit, from)
val spaceRootResponse = spacesResponse.getRoot(spaceId)
@@ -180,7 +180,7 @@ internal class DefaultSpaceService @Inject constructor(
private fun List?.mapSpaceChildren(
spaceId: String,
spaceRootResponse: SpaceChildSummaryResponse?,
- knownStateList: List?,
+ knownStateList: List?,
) = this?.filterIdIsNot(spaceId)
?.toSpaceChildInfoList(spaceId, spaceRootResponse, knownStateList)
.orEmpty()
@@ -190,7 +190,7 @@ internal class DefaultSpaceService @Inject constructor(
private fun List.toSpaceChildInfoList(
spaceId: String,
rootRoomResponse: SpaceChildSummaryResponse?,
- knownStateList: List?,
+ knownStateList: List?,
) = flatMap { spaceChildSummary ->
(rootRoomResponse?.childrenState ?: knownStateList)
?.filter { it.isChildOf(spaceChildSummary) }
@@ -198,10 +198,14 @@ internal class DefaultSpaceService @Inject constructor(
.orEmpty()
}
- private fun Event.isChildOf(space: SpaceChildSummaryResponse) = stateKey == space.roomId && type == EventType.STATE_SPACE_CHILD
+ private fun SpaceChildSummaryEvent.isChildOf(space: SpaceChildSummaryResponse): Boolean {
+ return stateKey == space.roomId && type == EventType.STATE_SPACE_CHILD
+ }
- private fun Event.toSpaceChildInfo(spaceId: String, summary: SpaceChildSummaryResponse) = content.toModel()?.let { content ->
- createSpaceChildInfo(spaceId, summary, content)
+ private fun SpaceChildSummaryEvent.toSpaceChildInfo(spaceId: String, summary: SpaceChildSummaryResponse): SpaceChildInfo? {
+ return content.toModel()?.let { content ->
+ createSpaceChildInfo(spaceId, summary, content)
+ }
}
private fun createSpaceChildInfo(
@@ -255,7 +259,7 @@ internal class DefaultSpaceService @Inject constructor(
stateKey = QueryStringValue.IsEmpty
)
val powerLevelsContent = powerLevelsEvent?.content?.toModel()
- ?: throw UnsupportedOperationException("Cannot add canonical child, missing powerlevel")
+ ?: throw UnsupportedOperationException("Cannot add canonical child, missing power level")
val powerLevelsHelper = PowerLevelsHelper(powerLevelsContent)
if (!powerLevelsHelper.isUserAllowedToSend(userId, true, EventType.STATE_SPACE_CHILD)) {
throw UnsupportedOperationException("Cannot add canonical child, not enough power level")
diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/SpaceChildSummaryResponse.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/SpaceChildSummaryResponse.kt
index e3f8977ac5..0419c5acf1 100644
--- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/SpaceChildSummaryResponse.kt
+++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/space/SpaceChildSummaryResponse.kt
@@ -18,7 +18,7 @@ package org.matrix.android.sdk.internal.session.space
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
-import org.matrix.android.sdk.api.session.events.model.Event
+import org.matrix.android.sdk.api.session.space.model.SpaceChildSummaryEvent
/**
* The fields are the same as those returned by /publicRooms (see spec), with the addition of:
@@ -36,10 +36,11 @@ internal data class SpaceChildSummaryResponse(
*/
@Json(name = "room_type") val roomType: String? = null,
- /** The m.space.child events of the room. For each event, only the following fields are included:
- * type, state_key, content, room_id, sender, with the addition of origin_server_ts.
+ /**
+ * The m.space.child events of the room. For each event, only the following fields are included:
+ * type, state_key, content, sender, and of origin_server_ts.
*/
- @Json(name = "children_state") val childrenState: List? = null,
+ @Json(name = "children_state") val childrenState: List? = null,
/**
* Aliases of the room. May be empty.
diff --git a/tools/emojis/emoji_picker_datasource_formatted.json b/tools/emojis/emoji_picker_datasource_formatted.json
index 41465a442f..551ec824b7 100644
--- a/tools/emojis/emoji_picker_datasource_formatted.json
+++ b/tools/emojis/emoji_picker_datasource_formatted.json
@@ -2368,7 +2368,8 @@
"stare",
"scared",
"frightening",
- "embarrassing"
+ "embarrassing",
+ "shy"
]
},
"shushing-face": {
@@ -9662,7 +9663,8 @@
"flower",
"wilted",
"plant",
- "nature"
+ "nature",
+ "rose"
]
},
"hibiscus": {
@@ -11080,7 +11082,8 @@
"tea",
"caffeine",
"latte",
- "espresso"
+ "espresso",
+ "mug"
]
},
"teapot": {
diff --git a/vector-app/build.gradle b/vector-app/build.gradle
index a8262fde40..235c92cfc5 100644
--- a/vector-app/build.gradle
+++ b/vector-app/build.gradle
@@ -32,11 +32,11 @@ knit {
// Note: 2 digits max for each value
ext.versionMajor = 1
-ext.versionMinor = 4
+ext.versionMinor = 5
// Note: even values are reserved for regular release, odd values for hotfix release.
// When creating a hotfix, you should decrease the value, since the current value
// is the value for the next regular release.
-ext.versionPatch = 36
+ext.versionPatch = 0
static def getGitTimestamp() {
def cmd = 'git show -s --format=%ct'
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt b/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
index 9434006060..d4878b8dcc 100644
--- a/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/UiAllScreensSanityTest.kt
@@ -21,6 +21,7 @@ import androidx.test.espresso.IdlingPolicies
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import im.vector.app.R
import im.vector.app.espresso.tools.ScreenshotFailureRule
@@ -28,6 +29,7 @@ import im.vector.app.features.MainActivity
import im.vector.app.getString
import im.vector.app.ui.robot.ElementRobot
import im.vector.app.ui.robot.settings.labs.LabFeature
+import im.vector.app.ui.robot.settings.labs.LabFeaturesPreferences
import im.vector.app.ui.robot.withDeveloperMode
import org.junit.Rule
import org.junit.Test
@@ -49,7 +51,14 @@ class UiAllScreensSanityTest {
.around(GrantPermissionRule.grant(Manifest.permission.WRITE_EXTERNAL_STORAGE))
.around(ScreenshotFailureRule())
- private val elementRobot = ElementRobot()
+ private val elementRobot = ElementRobot(
+ LabFeaturesPreferences(
+ InstrumentationRegistry.getInstrumentation()
+ .targetContext
+ .resources
+ .getBoolean(R.bool.settings_labs_new_app_layout_default)
+ )
+ )
// Last passing:
// 2020-11-09
@@ -101,11 +110,11 @@ class UiAllScreensSanityTest {
val spaceName = UUID.randomUUID().toString()
elementRobot.space {
- createSpace {
+ createSpace(true) {
createAndCrawl(spaceName)
}
val publicSpaceName = UUID.randomUUID().toString()
- createSpace {
+ createSpace(false) {
createPublicSpace(publicSpaceName)
}
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt
index 528589d616..b70fcfec25 100644
--- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/ElementRobot.kt
@@ -37,8 +37,6 @@ import im.vector.app.espresso.tools.clickOnPreference
import im.vector.app.espresso.tools.waitUntilActivityVisible
import im.vector.app.espresso.tools.waitUntilDialogVisible
import im.vector.app.espresso.tools.waitUntilViewVisible
-import im.vector.app.features.DefaultVectorFeatures
-import im.vector.app.features.VectorFeatures
import im.vector.app.features.createdirect.CreateDirectRoomActivity
import im.vector.app.features.home.HomeActivity
import im.vector.app.features.onboarding.OnboardingActivity
@@ -46,14 +44,14 @@ import im.vector.app.features.settings.VectorSettingsActivity
import im.vector.app.initialSyncIdlingResource
import im.vector.app.ui.robot.settings.SettingsRobot
import im.vector.app.ui.robot.settings.labs.LabFeature
+import im.vector.app.ui.robot.settings.labs.LabFeaturesPreferences
import im.vector.app.ui.robot.space.SpaceRobot
import im.vector.app.withIdlingResource
import timber.log.Timber
-class ElementRobot {
-
- var features: VectorFeatures = DefaultVectorFeatures()
-
+class ElementRobot(
+ private val labsPreferences: LabFeaturesPreferences = LabFeaturesPreferences(false)
+) {
fun onboarding(block: OnboardingRobot.() -> Unit) {
block(OnboardingRobot())
}
@@ -84,34 +82,57 @@ class ElementRobot {
}
fun settings(shouldGoBack: Boolean = true, block: SettingsRobot.() -> Unit) {
- openDrawer()
- clickOn(R.id.homeDrawerHeaderSettingsView)
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ onView(withId((R.id.avatar))).perform(click())
+ } else {
+ openDrawer()
+ clickOn(R.id.homeDrawerHeaderSettingsView)
+ }
+
block(SettingsRobot())
if (shouldGoBack) pressBack()
waitUntilViewVisible(withId(R.id.roomListContainer))
}
fun newDirectMessage(block: NewDirectMessageRobot.() -> Unit) {
- clickOn(R.id.bottom_action_people)
- clickOn(R.id.createChatRoomButton)
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ clickOn(R.id.newLayoutCreateChatButton)
+ waitUntilDialogVisible(withId(R.id.start_chat))
+ clickOn(R.id.start_chat)
+ } else {
+ clickOn(R.id.bottom_action_people)
+ clickOn(R.id.createChatRoomButton)
+ }
+
waitUntilActivityVisible {
waitUntilViewVisible(withId(R.id.userListSearch))
}
closeSoftKeyboard()
block(NewDirectMessageRobot())
pressBack()
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ pressBack() // close create dialog
+ }
waitUntilViewVisible(withId(R.id.roomListContainer))
}
fun newRoom(block: NewRoomRobot.() -> Unit) {
- clickOn(R.id.bottom_action_rooms)
- RoomListRobot().newRoom { block() }
+ if (!labsPreferences.isNewAppLayoutEnabled) {
+ clickOn(R.id.bottom_action_rooms)
+ }
+ RoomListRobot(labsPreferences).newRoom { block() }
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ pressBack() // close create dialog
+ }
waitUntilViewVisible(withId(R.id.roomListContainer))
}
fun roomList(block: RoomListRobot.() -> Unit) {
- clickOn(R.id.bottom_action_rooms)
- block(RoomListRobot())
+ if (!labsPreferences.isNewAppLayoutEnabled) {
+ clickOn(R.id.bottom_action_rooms)
+ }
+
+ block(RoomListRobot(labsPreferences))
waitUntilViewVisible(withId(R.id.roomListContainer))
}
@@ -152,7 +173,7 @@ class ElementRobot {
}
fun signout(expectSignOutWarning: Boolean) {
- if (features.isNewAppLayoutEnabled()) {
+ if (labsPreferences.isNewAppLayoutEnabled) {
onView(withId((R.id.avatar)))
.perform(click())
waitUntilActivityVisible {
@@ -202,7 +223,7 @@ class ElementRobot {
}
fun space(block: SpaceRobot.() -> Unit) {
- block(SpaceRobot())
+ block(SpaceRobot(labsPreferences))
}
}
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/NewRoomRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/NewRoomRobot.kt
index 09ff1162c0..0cea26d5cc 100644
--- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/NewRoomRobot.kt
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/NewRoomRobot.kt
@@ -21,10 +21,15 @@ import androidx.test.espresso.matcher.ViewMatchers.withId
import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn
import im.vector.app.R
import im.vector.app.espresso.tools.waitUntilViewVisible
+import im.vector.app.features.DefaultVectorFeatures
+import im.vector.app.features.VectorFeatures
+import im.vector.app.ui.robot.settings.labs.LabFeaturesPreferences
class NewRoomRobot(
- var createdRoom: Boolean = false
+ var createdRoom: Boolean = false,
+ private val labsPreferences: LabFeaturesPreferences
) {
+ private val features: VectorFeatures = DefaultVectorFeatures()
fun createNewRoom(block: CreateNewRoomRobot.() -> Unit) {
clickOn(R.string.create_new_room)
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt
index e72535c116..1f1a799db3 100644
--- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/OnboardingRobot.kt
@@ -33,7 +33,6 @@ import im.vector.app.features.DefaultVectorFeatures
import im.vector.app.waitForView
class OnboardingRobot {
-
private val defaultVectorFeatures = DefaultVectorFeatures()
fun crawl() {
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt
index dc07f06202..e4984aeed0 100644
--- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/RoomListRobot.kt
@@ -27,9 +27,11 @@ import com.adevinta.android.barista.assertion.BaristaVisibilityAssertions
import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn
import im.vector.app.R
import im.vector.app.espresso.tools.waitUntilActivityVisible
+import im.vector.app.espresso.tools.waitUntilDialogVisible
import im.vector.app.features.roomdirectory.RoomDirectoryActivity
+import im.vector.app.ui.robot.settings.labs.LabFeaturesPreferences
-class RoomListRobot {
+class RoomListRobot(private val labsPreferences: LabFeaturesPreferences) {
fun openRoom(roomName: String, block: RoomDetailRobot.() -> Unit) {
clickOn(roomName)
@@ -49,11 +51,17 @@ class RoomListRobot {
}
fun newRoom(block: NewRoomRobot.() -> Unit) {
- clickOn(R.id.createGroupRoomButton)
- waitUntilActivityVisible {
- BaristaVisibilityAssertions.assertDisplayed(R.id.publicRoomsList)
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ clickOn(R.id.newLayoutCreateChatButton)
+ waitUntilDialogVisible(ViewMatchers.withId(R.id.create_room))
+ clickOn(R.id.create_room)
+ } else {
+ clickOn(R.id.createGroupRoomButton)
+ waitUntilActivityVisible {
+ BaristaVisibilityAssertions.assertDisplayed(R.id.publicRoomsList)
+ }
}
- val newRoomRobot = NewRoomRobot()
+ val newRoomRobot = NewRoomRobot(false, labsPreferences)
block(newRoomRobot)
if (!newRoomRobot.createdRoom) {
pressBack()
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/settings/labs/LabFeaturesPreferences.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/settings/labs/LabFeaturesPreferences.kt
new file mode 100644
index 0000000000..8f36e7ae23
--- /dev/null
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/settings/labs/LabFeaturesPreferences.kt
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2022 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.app.ui.robot.settings.labs
+
+data class LabFeaturesPreferences(val isNewAppLayoutEnabled: Boolean)
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt
index 018f3097ba..e5147c2085 100644
--- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceCreateRobot.kt
@@ -31,6 +31,7 @@ import im.vector.app.espresso.tools.waitUntilActivityVisible
import im.vector.app.espresso.tools.waitUntilDialogVisible
import im.vector.app.espresso.tools.waitUntilViewVisible
import im.vector.app.features.home.HomeActivity
+import im.vector.app.features.home.room.detail.RoomDetailActivity
import im.vector.app.features.spaces.manage.SpaceManageActivity
class SpaceCreateRobot {
@@ -85,7 +86,9 @@ class SpaceCreateRobot {
clickOn(R.id.nextButton)
waitUntilViewVisible(withId(R.id.recyclerView))
clickOn(R.id.nextButton)
- waitUntilDialogVisible(withId(R.id.inviteByMxidButton))
+ waitUntilActivityVisible {
+ waitUntilDialogVisible(withId(R.id.inviteByMxidButton))
+ }
// close invite dialog
pressBack()
waitUntilViewVisible(withId(R.id.timelineRecyclerView))
diff --git a/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt b/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt
index b8a2f4313b..e8ff58ba6a 100644
--- a/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt
+++ b/vector-app/src/androidTest/java/im/vector/app/ui/robot/space/SpaceRobot.kt
@@ -18,6 +18,8 @@ package im.vector.app.ui.robot.space
import androidx.recyclerview.widget.RecyclerView
import androidx.test.espresso.Espresso
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.action.ViewActions.longClick
import androidx.test.espresso.contrib.RecyclerViewActions
import androidx.test.espresso.matcher.ViewMatchers
import com.adevinta.android.barista.interaction.BaristaClickInteractions.clickOn
@@ -26,18 +28,44 @@ import com.adevinta.android.barista.internal.viewaction.ClickChildAction
import im.vector.app.R
import im.vector.app.espresso.tools.waitUntilDialogVisible
import im.vector.app.espresso.tools.waitUntilViewVisible
+import im.vector.app.features.DefaultVectorFeatures
+import im.vector.app.features.VectorFeatures
+import im.vector.app.ui.robot.settings.labs.LabFeaturesPreferences
import org.hamcrest.Matchers
-class SpaceRobot {
+class SpaceRobot(private val labsPreferences: LabFeaturesPreferences) {
+ private val features: VectorFeatures = DefaultVectorFeatures()
- fun createSpace(block: SpaceCreateRobot.() -> Unit) {
- openDrawer()
- clickOn(R.string.create_space)
+ fun createSpace(isFirstSpace: Boolean, block: SpaceCreateRobot.() -> Unit) {
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ clickOn(R.id.newLayoutOpenSpacesButton)
+ if (isFirstSpace) {
+ waitUntilDialogVisible(ViewMatchers.withId(R.id.spaces_empty_group))
+ clickOn(R.id.spaces_empty_button)
+ } else {
+ waitUntilDialogVisible(ViewMatchers.withId(R.id.groupListView))
+ Espresso.onView(ViewMatchers.withId(R.id.groupListView))
+ .perform(
+ RecyclerViewActions.actionOnItem(
+ ViewMatchers.hasDescendant(ViewMatchers.withId(R.id.plus)),
+ click()
+ ).atPosition(0)
+ )
+ }
+ } else {
+ openDrawer()
+ clickOn(R.string.create_space)
+ }
block(SpaceCreateRobot())
}
fun spaceMenu(spaceName: String, block: SpaceMenuRobot.() -> Unit) {
- openDrawer()
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ clickOn(R.id.newLayoutOpenSpacesButton)
+ waitUntilDialogVisible(ViewMatchers.withId(R.id.groupListView))
+ } else {
+ openDrawer()
+ }
with(SpaceMenuRobot()) {
openMenu(spaceName)
block()
@@ -46,19 +74,32 @@ class SpaceRobot {
fun openMenu(spaceName: String) {
waitUntilViewVisible(ViewMatchers.withId(R.id.groupListView))
- Espresso.onView(ViewMatchers.withId(R.id.groupListView))
- .perform(
- RecyclerViewActions.actionOnItem(
- ViewMatchers.hasDescendant(Matchers.allOf(ViewMatchers.withId(R.id.groupNameView), ViewMatchers.withText(spaceName))),
- ClickChildAction.clickChildWithId(R.id.groupTmpLeave)
- ).atPosition(0)
- )
+ if (labsPreferences.isNewAppLayoutEnabled) {
+ Espresso.onView(ViewMatchers.withId(R.id.groupListView))
+ .perform(
+ RecyclerViewActions.actionOnItem(
+ ViewMatchers.hasDescendant(Matchers.allOf(ViewMatchers.withId(R.id.name), ViewMatchers.withText(spaceName))),
+ longClick()
+ ).atPosition(0)
+ )
+ } else {
+ Espresso.onView(ViewMatchers.withId(R.id.groupListView))
+ .perform(
+ RecyclerViewActions.actionOnItem(
+ ViewMatchers.hasDescendant(Matchers.allOf(ViewMatchers.withId(R.id.groupNameView), ViewMatchers.withText(spaceName))),
+ ClickChildAction.clickChildWithId(R.id.groupTmpLeave)
+ ).atPosition(0)
+ )
+ }
+
waitUntilDialogVisible(ViewMatchers.withId(R.id.spaceNameView))
}
fun selectSpace(spaceName: String) {
- openDrawer()
- waitUntilViewVisible(ViewMatchers.withId(R.id.groupListView))
+ if (!labsPreferences.isNewAppLayoutEnabled) {
+ openDrawer()
+ waitUntilViewVisible(ViewMatchers.withId(R.id.groupListView))
+ }
clickOn(spaceName)
}
}
diff --git a/vector-app/src/gplay/AndroidManifest.xml b/vector-app/src/gplay/AndroidManifest.xml
index a5f0eae6be..0ac14f9cd3 100755
--- a/vector-app/src/gplay/AndroidManifest.xml
+++ b/vector-app/src/gplay/AndroidManifest.xml
@@ -1,5 +1,6 @@
-
+
@@ -8,18 +9,14 @@
android:name="firebase_analytics_collection_deactivated"
android:value="true" />
-
-
+
+
-
-
+
-
-
-
+
diff --git a/vector-config/src/main/res/values/config-settings.xml b/vector-config/src/main/res/values/config-settings.xml
index b2cd21c3de..1701fd45b0 100755
--- a/vector-config/src/main/res/values/config-settings.xml
+++ b/vector-config/src/main/res/values/config-settings.xml
@@ -38,6 +38,7 @@
false
+ falsetruefalse
diff --git a/vector/build.gradle b/vector/build.gradle
index 65adc7089c..a5538053fc 100644
--- a/vector/build.gradle
+++ b/vector/build.gradle
@@ -257,7 +257,7 @@ dependencies {
// UnifiedPush
implementation 'com.github.UnifiedPush:android-connector:2.0.1'
// UnifiedPush gplay flavor only
- gplayImplementation('com.github.UnifiedPush:android-embedded_fcm_distributor:2.1.3') {
+ gplayImplementation('com.google.firebase:firebase-messaging:23.0.8') {
exclude group: 'com.google.firebase', module: 'firebase-core'
exclude group: 'com.google.firebase', module: 'firebase-analytics'
exclude group: 'com.google.firebase', module: 'firebase-measurement-connector'
diff --git a/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt b/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt
index c127e3aed6..9b2711a8c3 100644
--- a/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt
+++ b/vector/src/debug/java/im/vector/app/features/debug/features/DebugFeaturesStateFactory.kt
@@ -88,7 +88,7 @@ class DebugFeaturesStateFactory @Inject constructor(
createBooleanFeature(
label = "Enable New App Layout",
key = DebugFeatureKeys.newAppLayoutEnabled,
- factory = VectorFeatures::isNewAppLayoutEnabled
+ factory = VectorFeatures::isNewAppLayoutFeatureEnabled
),
createBooleanFeature(
label = "Enable New Device Management",
diff --git a/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt b/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt
index 003b9b8084..bb4cae3201 100644
--- a/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt
+++ b/vector/src/debug/java/im/vector/app/features/debug/features/DebugVectorFeatures.kt
@@ -76,8 +76,8 @@ class DebugVectorFeatures(
override fun shouldStartDmOnFirstMessage(): Boolean = read(DebugFeatureKeys.startDmOnFirstMsg)
?: vectorFeatures.shouldStartDmOnFirstMessage()
- override fun isNewAppLayoutEnabled(): Boolean = read(DebugFeatureKeys.newAppLayoutEnabled)
- ?: vectorFeatures.isNewAppLayoutEnabled()
+ override fun isNewAppLayoutFeatureEnabled(): Boolean = read(DebugFeatureKeys.newAppLayoutEnabled)
+ ?: vectorFeatures.isNewAppLayoutFeatureEnabled()
override fun isNewDeviceManagementEnabled(): Boolean = read(DebugFeatureKeys.newDeviceManagementEnabled)
?: vectorFeatures.isNewDeviceManagementEnabled()
diff --git a/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsFragment.kt b/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsFragment.kt
index 38253fe7c2..be3d41e0e1 100644
--- a/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsFragment.kt
+++ b/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsFragment.kt
@@ -16,6 +16,8 @@
package im.vector.app.features.debug.settings
+import android.annotation.SuppressLint
+import android.content.Intent
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -24,6 +26,7 @@ import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
import im.vector.app.core.platform.VectorBaseFragment
import im.vector.app.databinding.FragmentDebugPrivateSettingsBinding
+import im.vector.app.features.home.room.list.home.release.ReleaseNotesActivity
class DebugPrivateSettingsFragment : VectorBaseFragment() {
@@ -35,7 +38,6 @@ class DebugPrivateSettingsFragment : VectorBaseFragment
viewModel.handle(DebugPrivateSettingsViewActions.SetForceLoginFallbackEnabled(isChecked))
}
+ views.releaseNotesActivityHasBeenDisplayedReset.setOnClickListener {
+ viewModel.handle(DebugPrivateSettingsViewActions.ResetReleaseNotesActivityHasBeenDisplayed)
+ }
+ views.showReleaseNotesActivity.setOnClickListener {
+ startActivity(Intent(requireActivity(), ReleaseNotesActivity::class.java))
+ }
}
override fun invalidate() = withState(viewModel) {
@@ -57,5 +65,7 @@ class DebugPrivateSettingsFragment : VectorBaseFragment(initialState) {
@AssistedFactory
@@ -43,6 +45,15 @@ class DebugPrivateSettingsViewModel @AssistedInject constructor(
init {
observeVectorOverrides()
+ observeReleaseNotesPreferencesStore()
+ }
+
+ private fun observeReleaseNotesPreferencesStore() {
+ releaseNotesPreferencesStore.appLayoutOnboardingShown.setOnEach {
+ copy(
+ releaseNotesActivityHasBeenDisplayed = it
+ )
+ }
}
private fun observeVectorOverrides() {
@@ -72,6 +83,13 @@ class DebugPrivateSettingsViewModel @AssistedInject constructor(
is DebugPrivateSettingsViewActions.SetForceLoginFallbackEnabled -> handleSetForceLoginFallbackEnabled(action)
is SetDisplayNameCapabilityOverride -> handleSetDisplayNameCapabilityOverride(action)
is SetAvatarCapabilityOverride -> handleSetAvatarCapabilityOverride(action)
+ DebugPrivateSettingsViewActions.ResetReleaseNotesActivityHasBeenDisplayed -> handleResetReleaseNotesActivityHasBeenDisplayed()
+ }
+ }
+
+ private fun handleResetReleaseNotesActivityHasBeenDisplayed() {
+ viewModelScope.launch {
+ releaseNotesPreferencesStore.setAppLayoutOnboardingShown(false)
}
}
diff --git a/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewState.kt b/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewState.kt
index 749b11a744..a390c94942 100644
--- a/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewState.kt
+++ b/vector/src/debug/java/im/vector/app/features/debug/settings/DebugPrivateSettingsViewState.kt
@@ -22,7 +22,8 @@ import im.vector.app.features.debug.settings.OverrideDropdownView.OverrideDropdo
data class DebugPrivateSettingsViewState(
val dialPadVisible: Boolean = false,
val forceLoginFallback: Boolean = false,
- val homeserverCapabilityOverrides: HomeserverCapabilityOverrides = HomeserverCapabilityOverrides()
+ val homeserverCapabilityOverrides: HomeserverCapabilityOverrides = HomeserverCapabilityOverrides(),
+ val releaseNotesActivityHasBeenDisplayed: Boolean = false,
) : MavericksState
data class HomeserverCapabilityOverrides(
diff --git a/vector/src/debug/res/layout/fragment_debug_private_settings.xml b/vector/src/debug/res/layout/fragment_debug_private_settings.xml
index c42ad68dce..55824930bc 100644
--- a/vector/src/debug/res/layout/fragment_debug_private_settings.xml
+++ b/vector/src/debug/res/layout/fragment_debug_private_settings.xml
@@ -49,6 +49,27 @@
android:layout_marginEnd="16dp"
android:layout_marginBottom="4dp" />
+
+
+
+
+
+
diff --git a/vector/src/fdroid/AndroidManifest.xml b/vector/src/fdroid/AndroidManifest.xml
index 29dac6533e..15db89ca13 100644
--- a/vector/src/fdroid/AndroidManifest.xml
+++ b/vector/src/fdroid/AndroidManifest.xml
@@ -28,20 +28,6 @@
android:enabled="true"
android:exported="false" />
-
-
-
-
-
-
-
@@ -425,6 +425,20 @@
+
+
+
+
+
+
+
diff --git a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
index 4e7b174772..c2c66ae69e 100644
--- a/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
+++ b/vector/src/main/java/im/vector/app/core/platform/VectorBaseActivity.kt
@@ -249,7 +249,7 @@ abstract class VectorBaseActivity : AppCompatActivity(), Maver
initUiAndData()
- if (vectorFeatures.isNewAppLayoutEnabled()) {
+ if (vectorPreferences.isNewAppLayoutEnabled()) {
tryOrNull { // Add to XML theme when feature flag is removed
val toolbarBackground = MaterialColors.getColor(views.root, R.attr.vctr_toolbar_background)
window.statusBarColor = toolbarBackground
diff --git a/vector/src/fdroid/java/im/vector/app/fdroid/receiver/KeepInternalDistributor.kt b/vector/src/main/java/im/vector/app/core/pushers/KeepInternalDistributor.kt
similarity index 96%
rename from vector/src/fdroid/java/im/vector/app/fdroid/receiver/KeepInternalDistributor.kt
rename to vector/src/main/java/im/vector/app/core/pushers/KeepInternalDistributor.kt
index 3feee8c63b..63725f01a3 100644
--- a/vector/src/fdroid/java/im/vector/app/fdroid/receiver/KeepInternalDistributor.kt
+++ b/vector/src/main/java/im/vector/app/core/pushers/KeepInternalDistributor.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package im.vector.app.fdroid.receiver
+package im.vector.app.core.pushers
import android.content.BroadcastReceiver
import android.content.Context
diff --git a/vector/src/main/java/im/vector/app/core/pushers/PushParser.kt b/vector/src/main/java/im/vector/app/core/pushers/PushParser.kt
index 6f141e3736..8c18295c45 100644
--- a/vector/src/main/java/im/vector/app/core/pushers/PushParser.kt
+++ b/vector/src/main/java/im/vector/app/core/pushers/PushParser.kt
@@ -24,28 +24,34 @@ import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.util.MatrixJsonParser
import javax.inject.Inject
+/**
+ * Parse the received data from Push. Json format are different depending on the source.
+ *
+ * Notifications received by FCM are formatted by the matrix gateway [1]. The data send to FCM is the content
+ * of the "notification" attribute of the json sent to the gateway [2][3].
+ * On the other side, with UnifiedPush, the content of the message received is the content posted to the push
+ * gateway endpoint [3].
+ *
+ * *Note*: If we want to get the same content with FCM and unifiedpush, we can do a new sygnal pusher [4].
+ *
+ * [1] https://github.com/matrix-org/sygnal/blob/main/sygnal/gcmpushkin.py
+ * [2] https://github.com/matrix-org/sygnal/blob/main/sygnal/gcmpushkin.py#L366
+ * [3] https://spec.matrix.org/latest/push-gateway-api/
+ * [4] https://github.com/p1gp1g/sygnal/blob/unifiedpush/sygnal/upfcmpushkin.py (Not tested for a while)
+ */
class PushParser @Inject constructor() {
- /**
- * Parse the received data from Push. Json format are different depending on the source.
- *
- * Notifications received by FCM are formatted by the matrix gateway [1]. The data send to FCM is the content
- * of the "notification" attribute of the json sent to the gateway [2][3].
- * On the other side, with UnifiedPush, the content of the message received is the content posted to the push
- * gateway endpoint [3].
- *
- * *Note*: If we want to get the same content with FCM and unifiedpush, we can do a new sygnal pusher [4].
- *
- * [1] https://github.com/matrix-org/sygnal/blob/main/sygnal/gcmpushkin.py
- * [2] https://github.com/matrix-org/sygnal/blob/main/sygnal/gcmpushkin.py#L366
- * [3] https://spec.matrix.org/latest/push-gateway-api/
- * [4] https://github.com/p1gp1g/sygnal/blob/unifiedpush/sygnal/upfcmpushkin.py (Not tested for a while)
- */
- fun parseData(message: String, firebaseFormat: Boolean): PushData? {
- val moshi = MatrixJsonParser.getMoshi()
- return if (firebaseFormat) {
- tryOrNull { moshi.adapter(PushDataFcm::class.java).fromJson(message) }?.toPushData()
- } else {
- tryOrNull { moshi.adapter(PushDataUnifiedPush::class.java).fromJson(message) }?.toPushData()
+ fun parsePushDataUnifiedPush(message: ByteArray): PushData? {
+ return MatrixJsonParser.getMoshi().let {
+ tryOrNull { it.adapter(PushDataUnifiedPush::class.java).fromJson(String(message)) }?.toPushData()
}
}
+
+ fun parsePushDataFcm(message: Map): PushData {
+ val pushDataFcm = PushDataFcm(
+ eventId = message["event_id"],
+ roomId = message["room_id"],
+ unread = message["unread"]?.let { tryOrNull { Integer.parseInt(it) } },
+ )
+ return pushDataFcm.toPushData()
+ }
}
diff --git a/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt b/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt
index 91ab58207d..c77f454ab0 100644
--- a/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt
+++ b/vector/src/main/java/im/vector/app/core/pushers/PushersManager.kt
@@ -29,7 +29,7 @@ import kotlin.math.abs
private const val DEFAULT_PUSHER_FILE_TAG = "mobile"
class PushersManager @Inject constructor(
- private val unifiedPushStore: UnifiedPushStore,
+ private val unifiedPushHelper: UnifiedPushHelper,
private val activeSessionHolder: ActiveSessionHolder,
private val localeProvider: LocaleProvider,
private val stringProvider: StringProvider,
@@ -39,9 +39,9 @@ class PushersManager @Inject constructor(
val currentSession = activeSessionHolder.getActiveSession()
currentSession.pushersService().testPush(
- unifiedPushStore.getPushGateway()!!,
+ unifiedPushHelper.getPushGateway() ?: return,
stringProvider.getString(R.string.pusher_app_id),
- unifiedPushStore.getEndpointOrToken().orEmpty(),
+ unifiedPushHelper.getEndpointOrToken().orEmpty(),
TEST_EVENT_ID
)
}
diff --git a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt
index 0993485471..aab94eca93 100644
--- a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt
+++ b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushHelper.kt
@@ -46,6 +46,9 @@ class UnifiedPushHelper @Inject constructor(
private val vectorFeatures: VectorFeatures,
private val fcmHelper: FcmHelper,
) {
+
+ // Called when the home activity starts
+ // or when notifications are enabled
fun register(
activity: FragmentActivity,
onDoneRunnable: Runnable? = null,
@@ -56,7 +59,14 @@ class UnifiedPushHelper @Inject constructor(
)
}
- fun reRegister(
+ // If registration is forced:
+ // * the current distributor (if any) is removed
+ // * The dialog is opened
+ //
+ // The registration is forced in 2 cases :
+ // * in the settings
+ // * in the troubleshoot list (doFix)
+ fun forceRegister(
activity: FragmentActivity,
pushersManager: PushersManager,
onDoneRunnable: Runnable? = null
@@ -86,7 +96,8 @@ class UnifiedPushHelper @Inject constructor(
// Un-register first
unregister(pushersManager)
}
- if (UnifiedPush.getDistributor(context).isNotEmpty()) {
+ // the !force should not be needed
+ if (!force && UnifiedPush.getDistributor(context).isNotEmpty()) {
UnifiedPush.registerApp(context)
onDoneRunnable?.run()
return@launch
@@ -94,45 +105,26 @@ class UnifiedPushHelper @Inject constructor(
val distributors = UnifiedPush.getDistributors(context)
- if (distributors.size == 1 && !force) {
+ if (!force && distributors.size == 1) {
UnifiedPush.saveDistributor(context, distributors.first())
UnifiedPush.registerApp(context)
onDoneRunnable?.run()
} else {
openDistributorDialogInternal(
activity = activity,
- pushersManager = pushersManager,
onDoneRunnable = onDoneRunnable,
- distributors = distributors,
- unregisterFirst = force,
- cancellable = !force
+ distributors = distributors
)
}
}
}
- fun openDistributorDialog(
- activity: FragmentActivity,
- pushersManager: PushersManager,
- onDoneRunnable: Runnable,
- ) {
- val distributors = UnifiedPush.getDistributors(activity)
- openDistributorDialogInternal(
- activity,
- pushersManager,
- onDoneRunnable, distributors,
- unregisterFirst = true,
- cancellable = true,
- )
- }
-
+ // There is no case where this function is called
+ // with a saved distributor and/or a pusher
private fun openDistributorDialogInternal(
activity: FragmentActivity,
- pushersManager: PushersManager?,
onDoneRunnable: Runnable?,
- distributors: List,
- unregisterFirst: Boolean,
- cancellable: Boolean,
+ distributors: List
) {
val internalDistributorName = stringProvider.getString(
if (fcmHelper.isFirebaseAvailable()) {
@@ -154,16 +146,8 @@ class UnifiedPushHelper @Inject constructor(
.setTitle(stringProvider.getString(R.string.unifiedpush_getdistributors_dialog_title))
.setItems(distributorsName.toTypedArray()) { _, which ->
val distributor = distributors[which]
- if (distributor == UnifiedPush.getDistributor(context)) {
- Timber.d("Same distributor selected again, no action")
- return@setItems
- }
activity.lifecycleScope.launch {
- if (unregisterFirst) {
- // Un-register first
- unregister(pushersManager)
- }
UnifiedPush.saveDistributor(context, distributor)
Timber.i("Saving distributor: $distributor")
UnifiedPush.registerApp(context)
@@ -176,7 +160,7 @@ class UnifiedPushHelper @Inject constructor(
UnifiedPush.registerApp(context)
onDoneRunnable?.run()
}
- .setCancelable(cancellable)
+ .setCancelable(true)
.show()
}
@@ -184,7 +168,10 @@ class UnifiedPushHelper @Inject constructor(
val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_REALTIME
vectorPreferences.setFdroidSyncBackgroundMode(mode)
try {
- pushersManager?.unregisterPusher(unifiedPushStore.getEndpointOrToken().orEmpty())
+ getEndpointOrToken()?.let {
+ Timber.d("Removing $it")
+ pushersManager?.unregisterPusher(it)
+ }
} catch (e: Exception) {
Timber.d(e, "Probably unregistering a non existing pusher")
}
@@ -253,15 +240,20 @@ class UnifiedPushHelper @Inject constructor(
}
fun isEmbeddedDistributor(): Boolean {
- return UnifiedPush.getDistributor(context) == context.packageName && fcmHelper.isFirebaseAvailable()
+ return isInternalDistributor() && fcmHelper.isFirebaseAvailable()
}
fun isBackgroundSync(): Boolean {
- return UnifiedPush.getDistributor(context) == context.packageName && !fcmHelper.isFirebaseAvailable()
+ return isInternalDistributor() && !fcmHelper.isFirebaseAvailable()
+ }
+
+ private fun isInternalDistributor(): Boolean {
+ return UnifiedPush.getDistributor(context).isEmpty() ||
+ UnifiedPush.getDistributor(context) == context.packageName
}
fun getPrivacyFriendlyUpEndpoint(): String? {
- val endpoint = unifiedPushStore.getEndpointOrToken()
+ val endpoint = getEndpointOrToken()
if (endpoint.isNullOrEmpty()) return null
if (isEmbeddedDistributor()) {
return endpoint
@@ -274,4 +266,14 @@ class UnifiedPushHelper @Inject constructor(
null
}
}
+
+ fun getEndpointOrToken(): String? {
+ return if (isEmbeddedDistributor()) fcmHelper.getFcmToken()
+ else unifiedPushStore.getEndpoint()
+ }
+
+ fun getPushGateway(): String? {
+ return if (isEmbeddedDistributor()) stringProvider.getString(R.string.pusher_http_url)
+ else unifiedPushStore.getPushGateway()
+ }
}
diff --git a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt
index 07d291a723..d9c6bf3159 100644
--- a/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt
+++ b/vector/src/main/java/im/vector/app/core/pushers/UnifiedPushStore.kt
@@ -22,7 +22,8 @@ import im.vector.app.core.di.DefaultSharedPreferences
import javax.inject.Inject
class UnifiedPushStore @Inject constructor(
- context: Context,
+ val context: Context,
+ val fcmHelper: FcmHelper
) {
private val defaultPrefs = DefaultSharedPreferences.getInstance(context)
@@ -31,7 +32,7 @@ class UnifiedPushStore @Inject constructor(
*
* @return the UnifiedPush Endpoint or null if not received
*/
- fun getEndpointOrToken(): String? {
+ fun getEndpoint(): String? {
return defaultPrefs.getString(PREFS_ENDPOINT_OR_TOKEN, null)
}
diff --git a/vector/src/main/java/im/vector/app/core/pushers/VectorMessagingReceiver.kt b/vector/src/main/java/im/vector/app/core/pushers/VectorPushHandler.kt
similarity index 58%
rename from vector/src/main/java/im/vector/app/core/pushers/VectorMessagingReceiver.kt
rename to vector/src/main/java/im/vector/app/core/pushers/VectorPushHandler.kt
index 8e88e44627..b74028d579 100644
--- a/vector/src/main/java/im/vector/app/core/pushers/VectorMessagingReceiver.kt
+++ b/vector/src/main/java/im/vector/app/core/pushers/VectorPushHandler.kt
@@ -20,20 +20,16 @@ import android.content.Context
import android.content.Intent
import android.os.Handler
import android.os.Looper
-import android.widget.Toast
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.localbroadcastmanager.content.LocalBroadcastManager
-import dagger.hilt.android.AndroidEntryPoint
import im.vector.app.core.di.ActiveSessionHolder
import im.vector.app.core.network.WifiDetector
import im.vector.app.core.pushers.model.PushData
import im.vector.app.core.resources.BuildMeta
-import im.vector.app.core.services.GuardServiceStarter
import im.vector.app.features.notifications.NotifiableEventResolver
import im.vector.app.features.notifications.NotificationActionIds
import im.vector.app.features.notifications.NotificationDrawerManager
-import im.vector.app.features.settings.BackgroundSyncMode
import im.vector.app.features.settings.VectorDataStore
import im.vector.app.features.settings.VectorPreferences
import kotlinx.coroutines.CoroutineScope
@@ -46,30 +42,22 @@ import org.matrix.android.sdk.api.logger.LoggerTag
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.session.getRoom
import org.matrix.android.sdk.api.session.room.getTimelineEvent
-import org.unifiedpush.android.connector.MessagingReceiver
import timber.log.Timber
import javax.inject.Inject
private val loggerTag = LoggerTag("Push", LoggerTag.SYNC)
-/**
- * Hilt injection happen at super.onReceive().
- */
-@AndroidEntryPoint
-class VectorMessagingReceiver : MessagingReceiver() {
- @Inject lateinit var notificationDrawerManager: NotificationDrawerManager
- @Inject lateinit var notifiableEventResolver: NotifiableEventResolver
- @Inject lateinit var pushersManager: PushersManager
- @Inject lateinit var activeSessionHolder: ActiveSessionHolder
- @Inject lateinit var vectorPreferences: VectorPreferences
- @Inject lateinit var vectorDataStore: VectorDataStore
- @Inject lateinit var wifiDetector: WifiDetector
- @Inject lateinit var guardServiceStarter: GuardServiceStarter
- @Inject lateinit var unifiedPushHelper: UnifiedPushHelper
- @Inject lateinit var unifiedPushStore: UnifiedPushStore
- @Inject lateinit var pushParser: PushParser
- @Inject lateinit var actionIds: NotificationActionIds
- @Inject lateinit var buildMeta: BuildMeta
+class VectorPushHandler @Inject constructor(
+ private val notificationDrawerManager: NotificationDrawerManager,
+ private val notifiableEventResolver: NotifiableEventResolver,
+ private val activeSessionHolder: ActiveSessionHolder,
+ private val vectorPreferences: VectorPreferences,
+ private val vectorDataStore: VectorDataStore,
+ private val wifiDetector: WifiDetector,
+ private val actionIds: NotificationActionIds,
+ private val context: Context,
+ private val buildMeta: BuildMeta
+) {
private val coroutineScope = CoroutineScope(SupervisorJob())
@@ -81,25 +69,19 @@ class VectorMessagingReceiver : MessagingReceiver() {
/**
* Called when message is received.
*
- * @param context the Android context
- * @param message the message
- * @param instance connection, for multi-account
+ * @param pushData the data received in the push.
*/
- override fun onMessage(context: Context, message: ByteArray, instance: String) {
- Timber.tag(loggerTag.value).d("## onMessage() received")
+ fun handle(pushData: PushData) {
+ Timber.tag(loggerTag.value).d("## handling pushData")
- val sMessage = String(message)
if (buildMeta.lowPrivacyLoggingEnabled) {
- Timber.tag(loggerTag.value).d("## onMessage() $sMessage")
+ Timber.tag(loggerTag.value).d("## pushData: $pushData")
}
runBlocking {
vectorDataStore.incrementPushCounter()
}
- val pushData = pushParser.parseData(sMessage, unifiedPushHelper.isEmbeddedDistributor())
- ?: return Unit.also { Timber.tag(loggerTag.value).w("Invalid received data Json format") }
-
// Diagnostic Push
if (pushData.eventId == PushersManager.TEST_EVENT_ID) {
val intent = Intent(actionIds.push)
@@ -117,51 +99,7 @@ class VectorMessagingReceiver : MessagingReceiver() {
// we are in foreground, let the sync do the things?
Timber.tag(loggerTag.value).d("PUSH received in a foreground state, ignore")
} else {
- coroutineScope.launch(Dispatchers.IO) { onMessageReceivedInternal(pushData) }
- }
- }
- }
-
- override fun onNewEndpoint(context: Context, endpoint: String, instance: String) {
- Timber.tag(loggerTag.value).i("onNewEndpoint: adding $endpoint")
- if (vectorPreferences.areNotificationEnabledForDevice() && activeSessionHolder.hasActiveSession()) {
- // If the endpoint has changed
- // or the gateway has changed
- if (unifiedPushStore.getEndpointOrToken() != endpoint) {
- unifiedPushStore.storeUpEndpoint(endpoint)
- coroutineScope.launch {
- unifiedPushHelper.storeCustomOrDefaultGateway(endpoint) {
- unifiedPushStore.getPushGateway()?.let {
- pushersManager.enqueueRegisterPusher(endpoint, it)
- }
- }
- }
- } else {
- Timber.tag(loggerTag.value).i("onNewEndpoint: skipped")
- }
- }
- val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_DISABLED
- vectorPreferences.setFdroidSyncBackgroundMode(mode)
- guardServiceStarter.stop()
- }
-
- override fun onRegistrationFailed(context: Context, instance: String) {
- Toast.makeText(context, "Push service registration failed", Toast.LENGTH_SHORT).show()
- val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_REALTIME
- vectorPreferences.setFdroidSyncBackgroundMode(mode)
- guardServiceStarter.start()
- }
-
- override fun onUnregistered(context: Context, instance: String) {
- Timber.tag(loggerTag.value).d("Unifiedpush: Unregistered")
- val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_REALTIME
- vectorPreferences.setFdroidSyncBackgroundMode(mode)
- guardServiceStarter.start()
- runBlocking {
- try {
- pushersManager.unregisterPusher(unifiedPushStore.getEndpointOrToken().orEmpty())
- } catch (e: Exception) {
- Timber.tag(loggerTag.value).d("Probably unregistering a non existing pusher")
+ coroutineScope.launch(Dispatchers.IO) { handleInternal(pushData) }
}
}
}
@@ -171,12 +109,12 @@ class VectorMessagingReceiver : MessagingReceiver() {
*
* @param pushData Object containing message data.
*/
- private suspend fun onMessageReceivedInternal(pushData: PushData) {
+ private suspend fun handleInternal(pushData: PushData) {
try {
if (buildMeta.lowPrivacyLoggingEnabled) {
- Timber.tag(loggerTag.value).d("## onMessageReceivedInternal() : $pushData")
+ Timber.tag(loggerTag.value).d("## handleInternal() : $pushData")
} else {
- Timber.tag(loggerTag.value).d("## onMessageReceivedInternal()")
+ Timber.tag(loggerTag.value).d("## handleInternal()")
}
val session = activeSessionHolder.getOrInitializeSession(startSync = false)
@@ -196,7 +134,7 @@ class VectorMessagingReceiver : MessagingReceiver() {
}
}
} catch (e: Exception) {
- Timber.tag(loggerTag.value).e(e, "## onMessageReceivedInternal() failed")
+ Timber.tag(loggerTag.value).e(e, "## handleInternal() failed")
}
}
diff --git a/vector/src/main/java/im/vector/app/core/pushers/VectorUnifiedPushMessagingReceiver.kt b/vector/src/main/java/im/vector/app/core/pushers/VectorUnifiedPushMessagingReceiver.kt
new file mode 100644
index 0000000000..838cbd5935
--- /dev/null
+++ b/vector/src/main/java/im/vector/app/core/pushers/VectorUnifiedPushMessagingReceiver.kt
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2022 New Vector Ltd
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package im.vector.app.core.pushers
+
+import android.content.Context
+import android.widget.Toast
+import dagger.hilt.android.AndroidEntryPoint
+import im.vector.app.core.di.ActiveSessionHolder
+import im.vector.app.core.services.GuardServiceStarter
+import im.vector.app.features.settings.BackgroundSyncMode
+import im.vector.app.features.settings.VectorPreferences
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.runBlocking
+import org.matrix.android.sdk.api.logger.LoggerTag
+import org.unifiedpush.android.connector.MessagingReceiver
+import timber.log.Timber
+import javax.inject.Inject
+
+private val loggerTag = LoggerTag("Push", LoggerTag.SYNC)
+
+/**
+ * Hilt injection happen at super.onReceive().
+ */
+@AndroidEntryPoint
+class VectorUnifiedPushMessagingReceiver : MessagingReceiver() {
+ @Inject lateinit var pushersManager: PushersManager
+ @Inject lateinit var pushParser: PushParser
+ @Inject lateinit var activeSessionHolder: ActiveSessionHolder
+ @Inject lateinit var vectorPreferences: VectorPreferences
+ @Inject lateinit var vectorPushHandler: VectorPushHandler
+ @Inject lateinit var guardServiceStarter: GuardServiceStarter
+ @Inject lateinit var unifiedPushStore: UnifiedPushStore
+ @Inject lateinit var unifiedPushHelper: UnifiedPushHelper
+
+ private val coroutineScope = CoroutineScope(SupervisorJob())
+
+ /**
+ * Called when message is received.
+ *
+ * @param context the Android context
+ * @param message the message
+ * @param instance connection, for multi-account
+ */
+ override fun onMessage(context: Context, message: ByteArray, instance: String) {
+ Timber.tag(loggerTag.value).d("New message")
+ pushParser.parsePushDataUnifiedPush(message)?.let {
+ vectorPushHandler.handle(it)
+ } ?: run {
+ Timber.tag(loggerTag.value).w("Invalid received data Json format")
+ }
+ }
+
+ override fun onNewEndpoint(context: Context, endpoint: String, instance: String) {
+ Timber.tag(loggerTag.value).i("onNewEndpoint: adding $endpoint")
+ if (vectorPreferences.areNotificationEnabledForDevice() && activeSessionHolder.hasActiveSession()) {
+ // If the endpoint has changed
+ // or the gateway has changed
+ if (unifiedPushHelper.getEndpointOrToken() != endpoint) {
+ unifiedPushStore.storeUpEndpoint(endpoint)
+ coroutineScope.launch {
+ unifiedPushHelper.storeCustomOrDefaultGateway(endpoint) {
+ unifiedPushHelper.getPushGateway()?.let {
+ pushersManager.enqueueRegisterPusher(endpoint, it)
+ }
+ }
+ }
+ } else {
+ Timber.tag(loggerTag.value).i("onNewEndpoint: skipped")
+ }
+ }
+ val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_DISABLED
+ vectorPreferences.setFdroidSyncBackgroundMode(mode)
+ guardServiceStarter.stop()
+ }
+
+ override fun onRegistrationFailed(context: Context, instance: String) {
+ Toast.makeText(context, "Push service registration failed", Toast.LENGTH_SHORT).show()
+ val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_REALTIME
+ vectorPreferences.setFdroidSyncBackgroundMode(mode)
+ guardServiceStarter.start()
+ }
+
+ override fun onUnregistered(context: Context, instance: String) {
+ Timber.tag(loggerTag.value).d("Unifiedpush: Unregistered")
+ val mode = BackgroundSyncMode.FDROID_BACKGROUND_SYNC_MODE_FOR_REALTIME
+ vectorPreferences.setFdroidSyncBackgroundMode(mode)
+ guardServiceStarter.start()
+ runBlocking {
+ try {
+ pushersManager.unregisterPusher(unifiedPushHelper.getEndpointOrToken().orEmpty())
+ } catch (e: Exception) {
+ Timber.tag(loggerTag.value).d("Probably unregistering a non existing pusher")
+ }
+ }
+ }
+}
diff --git a/vector/src/main/java/im/vector/app/core/pushers/model/PushDataFcm.kt b/vector/src/main/java/im/vector/app/core/pushers/model/PushDataFcm.kt
index 1b9c37ae0a..e78cdf5ff8 100644
--- a/vector/src/main/java/im/vector/app/core/pushers/model/PushDataFcm.kt
+++ b/vector/src/main/java/im/vector/app/core/pushers/model/PushDataFcm.kt
@@ -16,8 +16,6 @@
package im.vector.app.core.pushers.model
-import com.squareup.moshi.Json
-import com.squareup.moshi.JsonClass
import org.matrix.android.sdk.api.MatrixPatterns
/**
@@ -32,11 +30,10 @@ import org.matrix.android.sdk.api.MatrixPatterns
*
* .
*/
-@JsonClass(generateAdapter = true)
data class PushDataFcm(
- @Json(name = "event_id") val eventId: String?,
- @Json(name = "room_id") val roomId: String?,
- @Json(name = "unread") var unread: Int?,
+ val eventId: String?,
+ val roomId: String?,
+ var unread: Int?,
)
fun PushDataFcm.toPushData() = PushData(
diff --git a/vector/src/main/java/im/vector/app/features/VectorFeatures.kt b/vector/src/main/java/im/vector/app/features/VectorFeatures.kt
index 951cca6735..dbdb0ba1c7 100644
--- a/vector/src/main/java/im/vector/app/features/VectorFeatures.kt
+++ b/vector/src/main/java/im/vector/app/features/VectorFeatures.kt
@@ -18,6 +18,7 @@ package im.vector.app.features
import im.vector.app.config.Config
import im.vector.app.config.OnboardingVariant
+import im.vector.app.features.settings.VectorPreferences
interface VectorFeatures {
@@ -33,7 +34,13 @@ interface VectorFeatures {
fun isLocationSharingEnabled(): Boolean
fun forceUsageOfOpusEncoder(): Boolean
fun shouldStartDmOnFirstMessage(): Boolean
- fun isNewAppLayoutEnabled(): Boolean
+
+ /**
+ * This is only to enable if the labs flag should be visible and effective.
+ * If on the client-side you want functionality that should be enabled with the new layout,
+ * use [VectorPreferences.isNewAppLayoutEnabled] instead.
+ */
+ fun isNewAppLayoutFeatureEnabled(): Boolean
fun isNewDeviceManagementEnabled(): Boolean
}
@@ -50,6 +57,6 @@ class DefaultVectorFeatures : VectorFeatures {
override fun isLocationSharingEnabled() = Config.ENABLE_LOCATION_SHARING
override fun forceUsageOfOpusEncoder(): Boolean = false
override fun shouldStartDmOnFirstMessage(): Boolean = false
- override fun isNewAppLayoutEnabled(): Boolean = true
+ override fun isNewAppLayoutFeatureEnabled(): Boolean = true
override fun isNewDeviceManagementEnabled(): Boolean = false
}
diff --git a/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt b/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt
index a480b1c279..ff04a4db17 100644
--- a/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt
+++ b/vector/src/main/java/im/vector/app/features/autocomplete/member/AutocompleteMemberPresenter.kt
@@ -145,7 +145,12 @@ class AutocompleteMemberPresenter @AssistedInject constructor(
private fun createEveryoneItem(query: CharSequence?) =
room.roomSummary()
?.takeIf { canNotifyEveryone() }
- ?.takeIf { query.isNullOrBlank() || MatrixItem.NOTIFY_EVERYONE.startsWith("@$query") }
+ ?.takeIf {
+ query.isNullOrBlank() ||
+ SUGGEST_ROOM_KEYWORDS.any {
+ it.startsWith("@$query")
+ }
+ }
?.let {
AutocompleteMemberItem.Everyone(it)
}
@@ -165,6 +170,7 @@ class AutocompleteMemberPresenter @AssistedInject constructor(
companion object {
private const val ID_HEADER_MEMBERS = "ID_HEADER_MEMBERS"
private const val ID_HEADER_EVERYONE = "ID_HEADER_EVERYONE"
+ private val SUGGEST_ROOM_KEYWORDS = setOf(MatrixItem.NOTIFY_EVERYONE, "@channel", "@everyone", "@here")
}
}
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
index 78b4364f38..46b7efbb97 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeActivity.kt
@@ -128,7 +128,7 @@ class HomeActivity :
@Inject lateinit var activeSessionHolder: ActiveSessionHolder
@Inject lateinit var vectorUncaughtExceptionHandler: VectorUncaughtExceptionHandler
- @Inject lateinit var pushManager: PushersManager
+ @Inject lateinit var pushersManager: PushersManager
@Inject lateinit var notificationDrawerManager: NotificationDrawerManager
@Inject lateinit var vectorPreferences: VectorPreferences
@Inject lateinit var popupAlertManager: PopupAlertManager
@@ -201,14 +201,14 @@ class HomeActivity :
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- isNewAppLayoutEnabled = vectorFeatures.isNewAppLayoutEnabled()
+ isNewAppLayoutEnabled = vectorPreferences.isNewAppLayoutEnabled()
analyticsScreenName = MobileScreen.ScreenName.Home
supportFragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleCallbacks, false)
unifiedPushHelper.register(this) {
if (unifiedPushHelper.isEmbeddedDistributor()) {
fcmHelper.ensureFcmTokenIsRetrieved(
this,
- pushManager,
+ pushersManager,
vectorPreferences.areNotificationEnabledForDevice()
)
}
@@ -217,12 +217,13 @@ class HomeActivity :
roomListSharedActionViewModel = viewModelProvider[RoomListSharedActionViewModel::class.java]
views.drawerLayout.addDrawerListener(drawerListener)
if (isFirstCreation()) {
- if (vectorFeatures.isNewAppLayoutEnabled()) {
+ if (vectorPreferences.isNewAppLayoutEnabled()) {
views.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
replaceFragment(views.homeDetailFragmentContainer, NewHomeDetailFragment::class.java)
} else {
replaceFragment(views.homeDetailFragmentContainer, HomeDetailFragment::class.java)
replaceFragment(views.homeDrawerFragmentContainer, HomeDrawerFragment::class.java)
+ views.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED)
}
}
@@ -377,7 +378,7 @@ class HomeActivity :
lifecycleScope.launch {
val isHandled = permalinkHandler.launch(
- context = this@HomeActivity,
+ fragmentActivity = this@HomeActivity,
deepLink = resolvedLink,
navigationInterceptor = this@HomeActivity,
buildTask = true
@@ -581,12 +582,12 @@ class HomeActivity :
}
private fun checkNewAppLayoutFlagChange() {
- if (buildMeta.isDebug && vectorFeatures.isNewAppLayoutEnabled() != isNewAppLayoutEnabled) {
+ if (vectorPreferences.isNewAppLayoutEnabled() != isNewAppLayoutEnabled) {
restart()
}
}
- override fun getMenuRes() = if (vectorFeatures.isNewAppLayoutEnabled()) R.menu.menu_new_home else R.menu.menu_home
+ override fun getMenuRes() = if (vectorPreferences.isNewAppLayoutEnabled()) R.menu.menu_new_home else R.menu.menu_home
override fun handlePrepareMenu(menu: Menu) {
menu.findItem(R.id.menu_home_init_sync_legacy).isVisible = vectorPreferences.developerMode()
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt
index dd54285fb5..6aba9eefcf 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeActivityViewModel.kt
@@ -120,10 +120,9 @@ class HomeActivityViewModel @AssistedInject constructor(
private fun observeReleaseNotes() = withState { state ->
// we don't want to show release notes for new users or after relogin
- if (state.authenticationDescription == null && vectorFeatures.isNewAppLayoutEnabled()) {
+ if (state.authenticationDescription == null && vectorPreferences.isNewAppLayoutEnabled()) {
releaseNotesPreferencesStore.appLayoutOnboardingShown.onEach { isAppLayoutOnboardingShown ->
if (!isAppLayoutOnboardingShown) {
- releaseNotesPreferencesStore.setAppLayoutOnboardingShown(true)
_viewEvents.post(HomeActivityViewEvents.ShowReleaseNotes)
}
}.launchIn(viewModelScope)
diff --git a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt
index 5141923e65..8eab759fcd 100644
--- a/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/HomeDetailFragment.kt
@@ -232,9 +232,10 @@ class HomeDetailFragment :
viewBinder = VerificationVectorAlert.ViewBinder(user, avatarRenderer)
colorInt = colorProvider.getColorFromAttribute(R.attr.colorPrimary)
contentAction = Runnable {
- (weakCurrentActivity?.get() as? VectorBaseActivity<*>)
- ?.navigator
- ?.requestSessionVerification(requireContext(), newest.deviceId ?: "")
+ (weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let { vectorBaseActivity ->
+ vectorBaseActivity.navigator
+ .requestSessionVerification(vectorBaseActivity, newest.deviceId ?: "")
+ }
unknownDeviceDetectorSharedViewModel.handle(
UnknownDeviceDetectorSharedViewModel.Action.IgnoreDevice(newest.deviceId?.let { listOf(it) }.orEmpty())
)
diff --git a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt
index 12dee92430..3681ba4c15 100644
--- a/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/NewHomeDetailFragment.kt
@@ -250,9 +250,10 @@ class NewHomeDetailFragment :
viewBinder = VerificationVectorAlert.ViewBinder(user, avatarRenderer)
colorInt = colorProvider.getColorFromAttribute(R.attr.colorPrimary)
contentAction = Runnable {
- (weakCurrentActivity?.get() as? VectorBaseActivity<*>)
- ?.navigator
- ?.requestSessionVerification(requireContext(), newest.deviceId ?: "")
+ (weakCurrentActivity?.get() as? VectorBaseActivity<*>)?.let { vectorBaseActivity ->
+ vectorBaseActivity.navigator
+ .requestSessionVerification(vectorBaseActivity, newest.deviceId ?: "")
+ }
unknownDeviceDetectorSharedViewModel.handle(
UnknownDeviceDetectorSharedViewModel.Action.IgnoreDevice(newest.deviceId?.let { listOf(it) }.orEmpty())
)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
index 350748097c..8b6429abb1 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/detail/TimelineFragment.kt
@@ -497,7 +497,7 @@ class TimelineFragment :
RoomDetailViewEvents.HideWaitingView -> vectorBaseActivity.hideWaitingView()
is RoomDetailViewEvents.RequestNativeWidgetPermission -> requestNativeWidgetPermission(it)
is RoomDetailViewEvents.OpenRoom -> handleOpenRoom(it)
- RoomDetailViewEvents.OpenInvitePeople -> navigator.openInviteUsersToRoom(requireContext(), timelineArgs.roomId)
+ RoomDetailViewEvents.OpenInvitePeople -> navigator.openInviteUsersToRoom(requireActivity(), timelineArgs.roomId)
RoomDetailViewEvents.OpenSetRoomAvatarDialog -> galleryOrCameraDialogHelper.show()
RoomDetailViewEvents.OpenRoomSettings -> handleOpenRoomSettings(RoomProfileActivity.EXTRA_DIRECT_ACCESS_ROOM_SETTINGS)
RoomDetailViewEvents.OpenRoomProfile -> handleOpenRoomSettings()
@@ -2190,7 +2190,7 @@ class TimelineFragment :
override fun onRoomCreateLinkClicked(url: String) {
viewLifecycleOwner.lifecycleScope.launchWhenResumed {
permalinkHandler
- .launch(requireContext(), url, object : NavigationInterceptor {
+ .launch(requireActivity(), url, object : NavigationInterceptor {
override fun navToRoom(roomId: String?, eventId: String?, deepLink: Uri?, rootThreadEventId: String?): Boolean {
requireActivity().finish()
return false
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
index de51101804..2c876273ea 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/RoomListFragment.kt
@@ -188,7 +188,7 @@ class RoomListFragment :
}
private fun handleShowMxToLink(link: String) {
- navigator.openMatrixToBottomSheet(requireContext(), link, OriginOfMatrixTo.ROOM_LIST)
+ navigator.openMatrixToBottomSheet(requireActivity(), link, OriginOfMatrixTo.ROOM_LIST)
}
override fun onDestroyView() {
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/filter/HomeFilteredRoomsController.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt
similarity index 80%
rename from vector/src/main/java/im/vector/app/features/home/room/list/home/filter/HomeFilteredRoomsController.kt
rename to vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt
index 789c9e9985..ae0f9d328f 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/home/filter/HomeFilteredRoomsController.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeFilteredRoomsController.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package im.vector.app.features.home.room.list.home.filter
+package im.vector.app.features.home.room.list.home
import com.airbnb.epoxy.EpoxyModel
import com.airbnb.epoxy.paging.PagedListEpoxyController
@@ -24,11 +24,11 @@ import im.vector.app.features.home.RoomListDisplayMode
import im.vector.app.features.home.room.list.RoomListListener
import im.vector.app.features.home.room.list.RoomSummaryItemFactory
import im.vector.app.features.home.room.list.RoomSummaryItemPlaceHolder_
-import im.vector.app.features.home.room.list.home.roomListEmptyItem
import org.matrix.android.sdk.api.session.room.members.ChangeMembershipState
import org.matrix.android.sdk.api.session.room.model.RoomSummary
+import javax.inject.Inject
-class HomeFilteredRoomsController(
+class HomeFilteredRoomsController @Inject constructor(
private val roomSummaryItemFactory: RoomSummaryItemFactory,
) : PagedListEpoxyController(
// Important it must match the PageList builder notify Looper
@@ -43,22 +43,11 @@ class HomeFilteredRoomsController(
}
var listener: RoomListListener? = null
- var onFilterChanged: ((HomeRoomFilter) -> Unit)? = null
- private var filtersData: List? = null
private var emptyStateData: StateView.State.Empty? = null
private var currentState: StateView.State = StateView.State.Content
override fun addModels(models: List>) {
- val host = this
- if (host.filtersData != null) {
- roomFilterHeaderItem {
- id("filter_header")
- filtersData(host.filtersData)
- onFilterChangedListener(host.onFilterChanged)
- }
- }
-
if (models.isEmpty() && emptyStateData != null) {
emptyStateData?.let { emptyState ->
roomListEmptyItem {
@@ -77,10 +66,6 @@ class HomeFilteredRoomsController(
this.emptyStateData = state
}
- fun submitFiltersData(data: List?) {
- this.filtersData = data
- requestForcedModelBuild()
- }
override fun buildItemModel(currentPosition: Int, item: RoomSummary?): EpoxyModel<*> {
item ?: return RoomSummaryItemPlaceHolder_().apply { id(currentPosition) }
return roomSummaryItemFactory.create(item, roomChangeMembershipStates.orEmpty(), emptySet(), RoomListDisplayMode.ROOMS, listener)
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListAction.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListAction.kt
index 6d17792969..b7ade559da 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListAction.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListAction.kt
@@ -17,7 +17,7 @@
package im.vector.app.features.home.room.list.home
import im.vector.app.core.platform.VectorViewModelAction
-import im.vector.app.features.home.room.list.home.filter.HomeRoomFilter
+import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.notification.RoomNotificationState
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
index edb619cd90..a4738a550c 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListFragment.kt
@@ -25,7 +25,6 @@ import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.ConcatAdapter
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import com.airbnb.epoxy.EpoxyControllerAdapter
import com.airbnb.epoxy.OnModelBuildFinishedListener
import com.airbnb.mvrx.fragmentViewModel
import com.airbnb.mvrx.withState
@@ -41,15 +40,12 @@ import im.vector.app.databinding.FragmentRoomListBinding
import im.vector.app.features.analytics.plan.ViewRoom
import im.vector.app.features.home.room.list.RoomListAnimator
import im.vector.app.features.home.room.list.RoomListListener
-import im.vector.app.features.home.room.list.RoomSummaryItemFactory
import im.vector.app.features.home.room.list.actions.RoomListQuickActionsBottomSheet
import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedAction
import im.vector.app.features.home.room.list.actions.RoomListQuickActionsSharedActionViewModel
-import im.vector.app.features.home.room.list.home.filter.HomeFilteredRoomsController
-import im.vector.app.features.home.room.list.home.filter.HomeRoomFilter
+import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
+import im.vector.app.features.home.room.list.home.header.HomeRoomsHeadersController
import im.vector.app.features.home.room.list.home.invites.InvitesActivity
-import im.vector.app.features.home.room.list.home.invites.InvitesCounterController
-import im.vector.app.features.home.room.list.home.recent.RecentRoomCarouselController
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import org.matrix.android.sdk.api.session.room.model.RoomSummary
@@ -63,10 +59,9 @@ class HomeRoomListFragment :
VectorBaseFragment(),
RoomListListener {
- @Inject lateinit var roomSummaryItemFactory: RoomSummaryItemFactory
@Inject lateinit var userPreferencesProvider: UserPreferencesProvider
- @Inject lateinit var recentRoomCarouselController: RecentRoomCarouselController
- @Inject lateinit var invitesCounterController: InvitesCounterController
+ @Inject lateinit var headersController: HomeRoomsHeadersController
+ @Inject lateinit var roomsController: HomeFilteredRoomsController
private val roomListViewModel: HomeRoomListViewModel by fragmentViewModel()
private lateinit var sharedQuickActionsViewModel: RoomListQuickActionsSharedActionViewModel
@@ -143,10 +138,25 @@ class HomeRoomListFragment :
modelBuildListener = OnModelBuildFinishedListener { it.dispatchTo(stateRestorer) }
- roomListViewModel.sections.onEach { sections ->
- setUpAdapters(sections)
+ roomListViewModel.onEach(HomeRoomListViewState::headersData) {
+ headersController.submitData(it)
+ }
+
+ roomListViewModel.onEach(HomeRoomListViewState::roomsLivePagedList) { roomsListLive ->
+ roomsListLive?.observe(viewLifecycleOwner) { roomsList ->
+ roomsController.submitList(roomsList)
+ if (roomsList.isEmpty()) {
+ roomsController.requestForcedModelBuild()
+ }
+ }
+ }
+
+ roomListViewModel.emptyStateFlow.onEach { emptyStateOptional ->
+ roomsController.submitEmptyStateData(emptyStateOptional.getOrNull())
}.launchIn(lifecycleScope)
+ setUpAdapters()
+
views.roomListView.adapter = concatAdapter
// we need to force scroll when recents/filter tabs are added to make them visible
@@ -163,13 +173,20 @@ class HomeRoomListFragment :
views.stateView.state = state.state
}
- private fun setUpAdapters(sections: Set) {
- concatAdapter.adapters.forEach {
- concatAdapter.removeAdapter(it)
- }
- sections.forEach {
- concatAdapter.addAdapter(getAdapterForData(it))
- }
+ private fun setUpAdapters() {
+ val headersAdapter = headersController.also { controller ->
+ controller.invitesClickListener = ::onInvitesCounterClicked
+ controller.onFilterChangedListener = ::onRoomFilterChanged
+ controller.recentsRoomListener = this
+ }.adapter
+
+ val roomsAdapter = roomsController
+ .also { controller ->
+ controller.listener = this
+ }.adapter
+
+ concatAdapter.addAdapter(headersAdapter)
+ concatAdapter.addAdapter(roomsAdapter)
}
private fun promptLeaveRoom(roomId: String) {
@@ -191,43 +208,6 @@ class HomeRoomListFragment :
.show()
}
- private fun getAdapterForData(section: HomeRoomSection): EpoxyControllerAdapter {
- return when (section) {
- is HomeRoomSection.RoomSummaryData -> {
- HomeFilteredRoomsController(
- roomSummaryItemFactory,
- ).also { controller ->
- controller.listener = this
- controller.onFilterChanged = ::onRoomFilterChanged
- roomListViewModel.emptyStateFlow.onEach { emptyStateOptional ->
- controller.submitEmptyStateData(emptyStateOptional.getOrNull())
- }.launchIn(lifecycleScope)
- section.filtersData.onEach {
- controller.submitFiltersData(it.getOrNull())
- }.launchIn(lifecycleScope)
- section.list.observe(viewLifecycleOwner) { list ->
- controller.submitList(list)
- if (list.isEmpty()) {
- controller.requestForcedModelBuild()
- }
- }
- }.adapter
- }
- is HomeRoomSection.RecentRoomsData -> recentRoomCarouselController.also { controller ->
- controller.listener = this
- section.list.observe(viewLifecycleOwner) { list ->
- controller.submitList(list)
- }
- }.adapter
- is HomeRoomSection.InvitesCountData -> invitesCounterController.also { controller ->
- controller.clickListener = ::onInvitesCounterClicked
- section.count.observe(viewLifecycleOwner) { count ->
- controller.submitData(count)
- }
- }.adapter
- }
- }
-
private fun onInvitesCounterClicked() {
startActivity(Intent(activity, InvitesActivity::class.java))
}
@@ -247,8 +227,13 @@ class HomeRoomListFragment :
override fun onDestroyView() {
views.roomListView.cleanup()
- recentRoomCarouselController.listener = null
- invitesCounterController.clickListener = null
+
+ headersController.recentsRoomListener = null
+ headersController.invitesClickListener = null
+ headersController.onFilterChangedListener = null
+
+ roomsController.listener = null
+
super.onDestroyView()
}
@@ -266,21 +251,13 @@ class HomeRoomListFragment :
return true
}
- override fun onRejectRoomInvitation(room: RoomSummary) {
- TODO("Not yet implemented")
- }
+ override fun onRejectRoomInvitation(room: RoomSummary) = Unit
- override fun onAcceptRoomInvitation(room: RoomSummary) {
- TODO("Not yet implemented")
- }
+ override fun onAcceptRoomInvitation(room: RoomSummary) = Unit
- override fun onJoinSuggestedRoom(room: SpaceChildInfo) {
- TODO("Not yet implemented")
- }
+ override fun onJoinSuggestedRoom(room: SpaceChildInfo) = Unit
- override fun onSuggestedRoomClicked(room: SpaceChildInfo) {
- TODO("Not yet implemented")
- }
+ override fun onSuggestedRoomClicked(room: SpaceChildInfo) = Unit
// endregion
}
diff --git a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt
index b52c4e0190..83ffc482ad 100644
--- a/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt
+++ b/vector/src/main/java/im/vector/app/features/home/room/list/home/HomeRoomListViewModel.kt
@@ -17,8 +17,8 @@
package im.vector.app.features.home.room.list.home
import android.widget.ImageView
-import androidx.lifecycle.map
import androidx.paging.PagedList
+import arrow.core.Option
import arrow.core.toOption
import com.airbnb.mvrx.MavericksViewModelFactory
import dagger.assisted.Assisted
@@ -32,22 +32,22 @@ import im.vector.app.core.platform.StateView
import im.vector.app.core.platform.VectorViewModel
import im.vector.app.core.resources.DrawableProvider
import im.vector.app.core.resources.StringProvider
-import im.vector.app.features.home.room.list.home.filter.HomeRoomFilter
+import im.vector.app.features.home.room.list.home.header.HomeRoomFilter
import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.asSharedFlow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flatMapLatest
+import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.launch
import org.matrix.android.sdk.api.extensions.orFalse
-import org.matrix.android.sdk.api.query.QueryStringValue
import org.matrix.android.sdk.api.query.RoomCategoryFilter
import org.matrix.android.sdk.api.query.RoomTagQueryFilter
import org.matrix.android.sdk.api.query.toActiveSpaceOrNoFilter
@@ -80,6 +80,7 @@ class HomeRoomListViewModel @AssistedInject constructor(
companion object : MavericksViewModelFactory by hiltMavericksViewModelFactory()
+ private var roomsFlow: Flow