Browse Source

Merge branch 'release/0.4.5' into main

pull/2457/head v0.4.5
ganfra 7 months ago
parent
commit
cb1bc677c6
  1. 6
      .github/workflows/build.yml
  2. 19
      .github/workflows/maestro.yml
  3. 4
      .github/workflows/nightly.yml
  4. 4
      .github/workflows/nightlyReports.yml
  5. 4
      .github/workflows/quality.yml
  6. 2
      .github/workflows/recordScreenshots.yml
  7. 4
      .github/workflows/release.yml
  8. 4
      .github/workflows/sonar.yml
  9. 4
      .github/workflows/tests.yml
  10. 13
      .maestro/README.md
  11. 2
      .maestro/allTests.yaml
  12. 13
      .maestro/scripts/checkEnv.js
  13. 2
      .maestro/tests/account/changeServer.yaml
  14. 7
      .maestro/tests/account/login.yaml
  15. 2
      .maestro/tests/account/logout.yaml
  16. 11
      .maestro/tests/account/verifySession.yaml
  17. 2
      .maestro/tests/assertions/assertAnalyticsDisplayed.yaml
  18. 4
      .maestro/tests/assertions/assertHomeDisplayed.yaml
  19. 2
      .maestro/tests/assertions/assertInitDisplayed.yaml
  20. 2
      .maestro/tests/assertions/assertLoginDisplayed.yaml
  21. 4
      .maestro/tests/assertions/assertRoomListSynced.yaml
  22. 2
      .maestro/tests/assertions/assertWelcomeScreenDisplayed.yaml
  23. 2
      .maestro/tests/init.yaml
  24. 7
      .maestro/tests/roomList/createAndDeleteDM.yaml
  25. 10
      .maestro/tests/roomList/createAndDeleteRoom.yaml
  26. 6
      .maestro/tests/roomList/roomContextMenu.yaml
  27. 2
      .maestro/tests/roomList/roomList.yaml
  28. 6
      .maestro/tests/roomList/searchRoomList.yaml
  29. 2
      .maestro/tests/roomList/timeline/messages/location.yaml
  30. 2
      .maestro/tests/roomList/timeline/messages/poll.yaml
  31. 2
      .maestro/tests/roomList/timeline/messages/text.yaml
  32. 4
      .maestro/tests/roomList/timeline/timeline.yaml
  33. 2
      .maestro/tests/settings/settings.yaml
  34. 23
      CHANGES.md
  35. 34
      appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt
  36. 6
      appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt
  37. 47
      appnav/src/main/kotlin/io/element/android/appnav/loggedin/SyncStateView.kt
  38. 2
      build.gradle.kts
  39. 2
      fastlane/metadata/android/en-US/changelogs/40004050.txt
  40. 2
      features/analytics/api/src/main/res/values-be/translations.xml
  41. 7
      features/analytics/api/src/main/res/values-bg/translations.xml
  42. 2
      features/analytics/api/src/main/res/values-cs/translations.xml
  43. 2
      features/analytics/api/src/main/res/values-de/translations.xml
  44. 2
      features/analytics/api/src/main/res/values-es/translations.xml
  45. 2
      features/analytics/api/src/main/res/values-fr/translations.xml
  46. 2
      features/analytics/api/src/main/res/values-hu/translations.xml
  47. 2
      features/analytics/api/src/main/res/values-in/translations.xml
  48. 2
      features/analytics/api/src/main/res/values-it/translations.xml
  49. 2
      features/analytics/api/src/main/res/values-ro/translations.xml
  50. 2
      features/analytics/api/src/main/res/values-ru/translations.xml
  51. 2
      features/analytics/api/src/main/res/values-sk/translations.xml
  52. 7
      features/analytics/api/src/main/res/values-sv/translations.xml
  53. 7
      features/analytics/api/src/main/res/values-uk/translations.xml
  54. 2
      features/analytics/api/src/main/res/values-zh-rTW/translations.xml
  55. 2
      features/analytics/api/src/main/res/values/localazy.xml
  56. 10
      features/analytics/impl/src/main/res/values-bg/translations.xml
  57. 10
      features/analytics/impl/src/main/res/values-sv/translations.xml
  58. 10
      features/analytics/impl/src/main/res/values-uk/translations.xml
  59. 6
      features/call/src/main/res/values-ro/translations.xml
  60. 6
      features/call/src/main/res/values-sv/translations.xml
  61. 6
      features/call/src/main/res/values-uk/translations.xml
  62. 6
      features/createroom/impl/src/main/res/values-be/translations.xml
  63. 14
      features/createroom/impl/src/main/res/values-bg/translations.xml
  64. 6
      features/createroom/impl/src/main/res/values-cs/translations.xml
  65. 4
      features/createroom/impl/src/main/res/values-de/translations.xml
  66. 4
      features/createroom/impl/src/main/res/values-es/translations.xml
  67. 6
      features/createroom/impl/src/main/res/values-fr/translations.xml
  68. 6
      features/createroom/impl/src/main/res/values-hu/translations.xml
  69. 6
      features/createroom/impl/src/main/res/values-in/translations.xml
  70. 4
      features/createroom/impl/src/main/res/values-it/translations.xml
  71. 6
      features/createroom/impl/src/main/res/values-ro/translations.xml
  72. 6
      features/createroom/impl/src/main/res/values-ru/translations.xml
  73. 4
      features/createroom/impl/src/main/res/values-sk/translations.xml
  74. 15
      features/createroom/impl/src/main/res/values-sv/translations.xml
  75. 15
      features/createroom/impl/src/main/res/values-uk/translations.xml
  76. 2
      features/createroom/impl/src/main/res/values-zh-rTW/translations.xml
  77. 4
      features/createroom/impl/src/main/res/values/localazy.xml
  78. 7
      features/ftue/impl/src/main/res/values-bg/translations.xml
  79. 2
      features/ftue/impl/src/main/res/values-ro/translations.xml
  80. 11
      features/ftue/impl/src/main/res/values-sv/translations.xml
  81. 11
      features/ftue/impl/src/main/res/values-uk/translations.xml
  82. 2
      features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt
  83. 7
      features/invitelist/impl/src/main/res/values-bg/translations.xml
  84. 9
      features/invitelist/impl/src/main/res/values-sv/translations.xml
  85. 9
      features/invitelist/impl/src/main/res/values-uk/translations.xml
  86. 34
      features/invitelist/impl/src/test/kotlin/io/element/android/features/invitelist/impl/InviteListPresenterTests.kt
  87. 4
      features/leaveroom/api/src/main/res/values-bg/translations.xml
  88. 1
      features/leaveroom/api/src/main/res/values-ro/translations.xml
  89. 6
      features/leaveroom/api/src/main/res/values-sv/translations.xml
  90. 7
      features/leaveroom/api/src/main/res/values-uk/translations.xml
  91. 10
      features/location/impl/build.gradle.kts
  92. 87
      features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt
  93. 8
      features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt
  94. 155
      features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationViewTest.kt
  95. 20
      features/lockscreen/impl/src/main/res/values-be/translations.xml
  96. 25
      features/lockscreen/impl/src/main/res/values-bg/translations.xml
  97. 20
      features/lockscreen/impl/src/main/res/values-cs/translations.xml
  98. 16
      features/lockscreen/impl/src/main/res/values-de/translations.xml
  99. 16
      features/lockscreen/impl/src/main/res/values-es/translations.xml
  100. 16
      features/lockscreen/impl/src/main/res/values-fr/translations.xml
  101. Some files were not shown because too many files have changed in this diff Show More

6
.github/workflows/build.yml

@ -9,8 +9,8 @@ on: @@ -9,8 +9,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3584m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx8g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8 --no-daemon
jobs:
debug:
@ -56,7 +56,7 @@ jobs: @@ -56,7 +56,7 @@ jobs:
path: |
app/build/outputs/apk/gplay/debug/*.apk
app/build/outputs/apk/fdroid/debug/*.apk
- uses: rnkdsh/action-upload-diawi@v1.5.4
- uses: rnkdsh/action-upload-diawi@v1.5.5
id: diawi
# Do not fail the whole build if Diawi upload fails
continue-on-error: true

19
.github/workflows/maestro.yml

@ -8,8 +8,8 @@ on: @@ -8,8 +8,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3584m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx6g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8 --no-daemon
jobs:
maestro-cloud:
@ -47,7 +47,7 @@ jobs: @@ -47,7 +47,7 @@ jobs:
ELEMENT_ANDROID_MAPTILER_API_KEY: ${{ secrets.MAPTILER_KEY }}
ELEMENT_ANDROID_MAPTILER_LIGHT_MAP_ID: ${{ secrets.MAPTILER_LIGHT_MAP_ID }}
ELEMENT_ANDROID_MAPTILER_DARK_MAP_ID: ${{ secrets.MAPTILER_DARK_MAP_ID }}
- uses: mobile-dev-inc/action-maestro-cloud@v1.8.0
- uses: mobile-dev-inc/action-maestro-cloud@v1.8.1
if: (github.event_name == 'pull_request' && github.event.pull_request.fork == null) || github.event_name == 'workflow_dispatch'
with:
api-key: ${{ secrets.MAESTRO_CLOUD_API_KEY }}
@ -55,9 +55,10 @@ jobs: @@ -55,9 +55,10 @@ jobs:
# app-file should point to an x86 compatible APK file, so upload the x86_64 one (much smaller than the universal APK).
app-file: app/build/outputs/apk/gplay/debug/app-gplay-x86_64-debug.apk
env: |
USERNAME=maestroelement
PASSWORD=${{ secrets.MATRIX_MAESTRO_ACCOUNT_PASSWORD }}
ROOM_NAME=MyRoom
INVITEE1_MXID=@maestroelement2:matrix.org
INVITEE2_MXID=@maestroelement3:matrix.org
APP_ID=io.element.android.x.debug
MAESTRO_USERNAME=maestroelement
MAESTRO_PASSWORD=${{ secrets.MATRIX_MAESTRO_ACCOUNT_PASSWORD }}
MAESTRO_RECOVERY_KEY=${{ secrets.MATRIX_MAESTRO_ACCOUNT_RECOVERY_KEY }}
MAESTRO_ROOM_NAME=MyRoom
MAESTRO_INVITEE1_MXID=@maestroelement2:matrix.org
MAESTRO_INVITEE2_MXID=@maestroelement3:matrix.org
MAESTRO_APP_ID=io.element.android.x.debug

4
.github/workflows/nightly.yml

@ -7,8 +7,8 @@ on: @@ -7,8 +7,8 @@ on:
- cron: "0 4 * * *"
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx6g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8 --no-daemon
jobs:
nightly:

4
.github/workflows/nightlyReports.yml

@ -8,8 +8,8 @@ on: @@ -8,8 +8,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx2560m" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 4
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx6g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.daemon.jvm.options="-Xmx3g" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8
jobs:
nightlyReports:

4
.github/workflows/quality.yml

@ -9,8 +9,8 @@ on: @@ -9,8 +9,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3584m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon --warn
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx6g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8 --no-daemon --warn
jobs:
checkScript:

2
.github/workflows/recordScreenshots.yml

@ -7,7 +7,7 @@ on: @@ -7,7 +7,7 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3584m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx5g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
jobs:
record:

4
.github/workflows/release.yml

@ -7,8 +7,8 @@ on: @@ -7,8 +7,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3584m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 2 --no-daemon
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx6g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8 --no-daemon
jobs:
release:

4
.github/workflows/sonar.yml

@ -9,8 +9,8 @@ on: @@ -9,8 +9,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3584m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -XX:MaxMetaspaceSize=512m -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 4 --no-daemon --warn
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx6g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -XX:MaxMetaspaceSize=512m -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8 --no-daemon --warn
jobs:
sonar:

4
.github/workflows/tests.yml

@ -9,8 +9,8 @@ on: @@ -9,8 +9,8 @@ on:
# Enrich gradle.properties for CI/CD
env:
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx3584m -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 4 --warn
GRADLE_OPTS: -Dorg.gradle.jvmargs="-Xmx8g -Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError" -Dkotlin.incremental=false -XX:+UseParallelGC
CI_GRADLE_ARG_PROPERTIES: --stacktrace -PpreDexEnable=false --max-workers 8 --warn
jobs:
tests:

13
.maestro/README.md

@ -22,12 +22,13 @@ From root dir of the project @@ -22,12 +22,13 @@ From root dir of the project
```shell
maestro test \
-e APP_ID=io.element.android.x.debug \
-e USERNAME=user1 \
-e PASSWORD=123 \
-e ROOM_NAME="MyRoom" \
-e INVITEE1_MXID=user2 \
-e INVITEE2_MXID=user3 \
-e MAESTRO_APP_ID=io.element.android.x.debug \
-e MAESTRO_USERNAME=user1 \
-e MAESTRO_PASSWORD=123 \
-e MAESTRO_RECOVERY_KEY=ABC \
-e MAESTRO_ROOM_NAME="MyRoom" \
-e MAESTRO_INVITEE1_MXID=user2 \
-e MAESTRO_INVITEE2_MXID=user3 \
.maestro/allTests.yaml
```

2
.maestro/allTests.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
## Check that all env variables required in the whole test suite are declared (to fail faster)
- runScript: ./scripts/checkEnv.js

13
.maestro/scripts/checkEnv.js

@ -1,9 +1,10 @@ @@ -1,9 +1,10 @@
// This array contains all the required environment variable. When adding a variable, add it here also.
// If a variable is missing, an error will occur.
if (APP_ID == null) throw "Fatal: missing env variable APP_ID"
if (USERNAME == null) throw "Fatal: missing env variable USERNAME"
if (PASSWORD == null) throw "Fatal: missing env variable PASSWORD"
if (ROOM_NAME == null) throw "Fatal: missing env variable ROOM_NAME"
if (INVITEE1_MXID == null) throw "Fatal: missing env variable INVITEE1_MXID"
if (INVITEE2_MXID == null) throw "Fatal: missing env variable INVITEE2_MXID"
if (MAESTRO_APP_ID == null) throw "Fatal: missing env variable MAESTRO_APP_ID"
if (MAESTRO_USERNAME == null) throw "Fatal: missing env variable MAESTRO_USERNAME"
if (MAESTRO_PASSWORD == null) throw "Fatal: missing env variable MAESTRO_PASSWORD"
if (MAESTRO_RECOVERY_KEY == null) throw "Fatal: missing env variable MAESTRO_RECOVERY_KEY"
if (MAESTRO_ROOM_NAME == null) throw "Fatal: missing env variable MAESTRO_ROOM_NAME"
if (MAESTRO_INVITEE1_MXID == null) throw "Fatal: missing env variable MAESTRO_INVITEE1_MXID"
if (MAESTRO_INVITEE2_MXID == null) throw "Fatal: missing env variable MAESTRO_INVITEE2_MXID"

2
.maestro/tests/account/changeServer.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- tapOn:
id: "login-change_server"

7
.maestro/tests/account/login.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- tapOn: "Continue"
- runFlow: ../assertions/assertLoginDisplayed.yaml
@ -9,7 +9,7 @@ appId: ${APP_ID} @@ -9,7 +9,7 @@ appId: ${APP_ID}
id: "login-continue"
- tapOn:
id: "login-email_username"
- inputText: ${USERNAME}
- inputText: ${MAESTRO_USERNAME}
- pressKey: Enter
- tapOn:
id: "login-password"
@ -20,7 +20,7 @@ appId: ${APP_ID} @@ -20,7 +20,7 @@ appId: ${APP_ID}
- tapOn:
id: "login-password"
- eraseText: 20
- inputText: ${PASSWORD}
- inputText: ${MAESTRO_PASSWORD}
- pressKey: Enter
- tapOn: "Continue"
- runFlow: ../assertions/assertWelcomeScreenDisplayed.yaml
@ -28,3 +28,4 @@ appId: ${APP_ID} @@ -28,3 +28,4 @@ appId: ${APP_ID}
- runFlow: ../assertions/assertAnalyticsDisplayed.yaml
- tapOn: "Not now"
- runFlow: ../assertions/assertHomeDisplayed.yaml
- runFlow: ./verifySession.yaml

2
.maestro/tests/account/logout.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- tapOn:
id: "home_screen-settings"

11
.maestro/tests/account/verifySession.yaml

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
appId: ${MAESTRO_APP_ID}
---
- tapOn: "Continue"
- takeScreenshot: build/maestro/150-Verify
- tapOn: "Enter recovery key"
- tapOn:
id: "verification-recovery_key"
- inputText: ${MAESTRO_RECOVERY_KEY}
- hideKeyboard
- tapOn: "Confirm"
- runFlow: ../assertions/assertHomeDisplayed.yaml

2
.maestro/tests/assertions/assertAnalyticsDisplayed.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- extendedWaitUntil:
visible: "Help improve Element X dbg"

4
.maestro/tests/assertions/assertHomeDisplayed.yaml

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- extendedWaitUntil:
visible: "All Chats"
visible: "Chats"
timeout: 10000

2
.maestro/tests/assertions/assertInitDisplayed.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- extendedWaitUntil:
visible: "Be in your element"

2
.maestro/tests/assertions/assertLoginDisplayed.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- extendedWaitUntil:
visible: "Change account provider"

4
.maestro/tests/assertions/assertRoomListSynced.yaml

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- extendedWaitUntil:
visible: ${ROOM_NAME}
visible: ${MAESTRO_ROOM_NAME}
timeout: 10000

2
.maestro/tests/assertions/assertWelcomeScreenDisplayed.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- extendedWaitUntil:
visible:

2
.maestro/tests/init.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- clearState
- launchApp:

7
.maestro/tests/roomList/createAndDeleteDM.yaml

@ -1,13 +1,14 @@ @@ -1,13 +1,14 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
# Purpose: Test the creation and deletion of a DM room.
- tapOn: "Create a new conversation or room"
- tapOn: "Search for someone"
- inputText: ${INVITEE1_MXID}
- inputText: ${MAESTRO_INVITEE1_MXID}
- tapOn:
text: ${INVITEE1_MXID}
text: ${MAESTRO_INVITEE1_MXID}
index: 1
- takeScreenshot: build/maestro/330-createAndDeleteDM
- tapOn: "maestroelement2"
- scroll
- tapOn: "Leave conversation"
- tapOn: "Leave"

10
.maestro/tests/roomList/createAndDeleteRoom.yaml

@ -1,12 +1,12 @@ @@ -1,12 +1,12 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
# Purpose: Test the creation and deletion of a room
- tapOn: "Create a new conversation or room"
- tapOn: "New room"
- tapOn: "Search for someone"
- inputText: ${INVITEE1_MXID}
- inputText: ${MAESTRO_INVITEE1_MXID}
- tapOn:
text: ${INVITEE1_MXID}
text: ${MAESTRO_INVITEE1_MXID}
index: 1
- tapOn: "Next"
- tapOn: "e.g. your project name"
@ -19,9 +19,9 @@ appId: ${APP_ID} @@ -19,9 +19,9 @@ appId: ${APP_ID}
- tapOn: "Invite people"
# assert there's 1 member and 1 invitee
- tapOn: "Search for someone"
- inputText: ${INVITEE2_MXID}
- inputText: ${MAESTRO_INVITEE2_MXID}
- tapOn:
text: ${INVITEE2_MXID}
text: ${MAESTRO_INVITEE2_MXID}
index: 1
- tapOn: "Invite"
- tapOn: "Back"

6
.maestro/tests/roomList/roomContextMenu.yaml

@ -1,13 +1,13 @@ @@ -1,13 +1,13 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
# Purpose: Test the context menu of a room in the room list
- longPressOn: ${ROOM_NAME}
- longPressOn: ${MAESTRO_ROOM_NAME}
- takeScreenshot: build/maestro/310-RoomList-ContextMenu
- tapOn:
text: "Settings"
index: 0
- tapOn: "Back"
- longPressOn: ${ROOM_NAME}
- longPressOn: ${MAESTRO_ROOM_NAME}
- tapOn:
text: "Leave room"
index: 0

2
.maestro/tests/roomList/roomList.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- runFlow: searchRoomList.yaml
- takeScreenshot: build/maestro/300-RoomList

6
.maestro/tests/roomList/searchRoomList.yaml

@ -1,10 +1,10 @@ @@ -1,10 +1,10 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- runFlow: ../assertions/assertRoomListSynced.yaml
- tapOn: "search"
- inputText: ${ROOM_NAME.substring(0, 3)}
- inputText: ${MAESTRO_ROOM_NAME.substring(0, 3)}
- takeScreenshot: build/maestro/400-SearchRoom
- tapOn: ${ROOM_NAME}
- tapOn: ${MAESTRO_ROOM_NAME}
# Back from timeline
- back
- assertVisible: "MyR"

2
.maestro/tests/roomList/timeline/messages/location.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- takeScreenshot: build/maestro/520-Timeline
- tapOn: "Add attachment"

2
.maestro/tests/roomList/timeline/messages/poll.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- takeScreenshot: build/maestro/530-Timeline
- tapOn: "Add attachment"

2
.maestro/tests/roomList/timeline/messages/text.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- takeScreenshot: build/maestro/510-Timeline
- tapOn:

4
.maestro/tests/roomList/timeline/timeline.yaml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
# This is the name of one room
- tapOn: ${ROOM_NAME}
- tapOn: ${MAESTRO_ROOM_NAME}
- takeScreenshot: build/maestro/500-Timeline
- runFlow: messages/text.yaml
- runFlow: messages/location.yaml

2
.maestro/tests/settings/settings.yaml

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
appId: ${APP_ID}
appId: ${MAESTRO_APP_ID}
---
- tapOn:
id: "home_screen-settings"

23
CHANGES.md

@ -1,3 +1,26 @@ @@ -1,3 +1,26 @@
Changes in Element X v0.4.5 (2024-02-28)
========================================
Features ✨
----------
- Mark a room or dm as favourite. ([#2208](https://github.com/element-hq/element-x-android/issues/2208))
- Add moderation to rooms:
- Sort member in room member list by powerlevel, display their roles.
- Display banner users in room member list for users with enough power level to ban/unban. ([#2256](https://github.com/element-hq/element-x-android/issues/2256))
- MediaViewer : introduce fullscreen and flick to dismiss behavior. ([#2390](https://github.com/element-hq/element-x-android/issues/2390))
- Allow user-installed certificates to be used by the HTTP client ([#2992](https://github.com/element-hq/element-x-android/issues/2992))
Bugfixes 🐛
----------
- Do not display empty room list state before the loading one when we still don't have any items ([#+do-not-display-empty-state-before-loading-roomlist](https://github.com/element-hq/element-x-android/issues/+do-not-display-empty-state-before-loading-roomlist))
- Improve how Talkback works with the timeline. Sadly, it's still not 100% working, but there is some issue with the `LazyColumn` using `reverseLayout` that only Google can fix. ([#+improve-accessibility-in-timeline](https://github.com/element-hq/element-x-android/issues/+improve-accessibility-in-timeline))
- Add ability to enter a recovery key to verify the session. Also fixes some refresh issues with the verification session state. ([#2421](https://github.com/element-hq/element-x-android/issues/2421))
Other changes
-------------
- Provide the current system proxy setting to the Rust SDK. ([#2420](https://github.com/element-hq/element-x-android/issues/2420))
Changes in Element X v0.4.4 (2024-02-15)
========================================

34
appnav/src/main/kotlin/io/element/android/appnav/LoggedInFlowNode.kt

@ -216,7 +216,9 @@ class LoggedInFlowNode @AssistedInject constructor( @@ -216,7 +216,9 @@ class LoggedInFlowNode @AssistedInject constructor(
data object VerifySession : NavTarget
@Parcelize
data object SecureBackup : NavTarget
data class SecureBackup(
val initialElement: SecureBackupEntryPoint.InitialTarget = SecureBackupEntryPoint.InitialTarget.Root
) : NavTarget
@Parcelize
data object InviteList : NavTarget
@ -253,6 +255,10 @@ class LoggedInFlowNode @AssistedInject constructor( @@ -253,6 +255,10 @@ class LoggedInFlowNode @AssistedInject constructor(
backstack.push(NavTarget.VerifySession)
}
override fun onSessionConfirmRecoveryKeyClicked() {
backstack.push(NavTarget.SecureBackup(initialElement = SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey))
}
override fun onInvitesClicked() {
backstack.push(NavTarget.InviteList)
}
@ -298,7 +304,7 @@ class LoggedInFlowNode @AssistedInject constructor( @@ -298,7 +304,7 @@ class LoggedInFlowNode @AssistedInject constructor(
}
override fun onSecureBackupClicked() {
backstack.push(NavTarget.SecureBackup)
backstack.push(NavTarget.SecureBackup())
}
override fun onOpenRoomNotificationSettings(roomId: RoomId) {
@ -324,10 +330,28 @@ class LoggedInFlowNode @AssistedInject constructor( @@ -324,10 +330,28 @@ class LoggedInFlowNode @AssistedInject constructor(
.build()
}
NavTarget.VerifySession -> {
verifySessionEntryPoint.createNode(this, buildContext)
val callback = object : VerifySessionEntryPoint.Callback {
override fun onEnterRecoveryKey() {
backstack.replace(
NavTarget.SecureBackup(
initialElement = SecureBackupEntryPoint.InitialTarget.EnterRecoveryKey
)
)
}
override fun onDone() {
backstack.pop()
}
}
verifySessionEntryPoint
.nodeBuilder(this, buildContext)
.callback(callback)
.build()
}
NavTarget.SecureBackup -> {
secureBackupEntryPoint.createNode(this, buildContext)
is NavTarget.SecureBackup -> {
secureBackupEntryPoint.nodeBuilder(this, buildContext)
.params(SecureBackupEntryPoint.Params(initialElement = navTarget.initialElement))
.build()
}
NavTarget.InviteList -> {
val callback = object : InviteListEntryPoint.Callback {

6
appnav/src/main/kotlin/io/element/android/appnav/loggedin/LoggedInView.kt

@ -18,13 +18,11 @@ package io.element.android.appnav.loggedin @@ -18,13 +18,11 @@ package io.element.android.appnav.loggedin
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.unit.dp
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
@ -39,9 +37,7 @@ fun LoggedInView( @@ -39,9 +37,7 @@ fun LoggedInView(
.systemBarsPadding()
) {
SyncStateView(
modifier = Modifier
.padding(top = 8.dp)
.align(Alignment.TopCenter),
modifier = Modifier.align(Alignment.TopCenter),
isVisible = state.showSyncSpinner,
)
}

47
appnav/src/main/kotlin/io/element/android/appnav/loggedin/SyncStateView.kt

@ -20,25 +20,15 @@ import androidx.compose.animation.AnimatedVisibility @@ -20,25 +20,15 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.core.spring
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.progressSemantics
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import io.element.android.compound.theme.ElementTheme
import io.element.android.libraries.designsystem.components.async.AsyncIndicator
import io.element.android.libraries.designsystem.preview.ElementPreview
import io.element.android.libraries.designsystem.preview.PreviewsDayNight
import io.element.android.libraries.designsystem.theme.components.CircularProgressIndicator
import io.element.android.libraries.designsystem.theme.components.Surface
import io.element.android.libraries.designsystem.theme.components.Text
import io.element.android.libraries.ui.strings.CommonStrings
@Composable
@ -46,38 +36,15 @@ fun SyncStateView( @@ -46,38 +36,15 @@ fun SyncStateView(
isVisible: Boolean,
modifier: Modifier = Modifier
) {
val animationSpec = spring<Float>(stiffness = 500F)
AnimatedVisibility(
modifier = modifier,
visible = isVisible,
enter = fadeIn(animationSpec = animationSpec),
exit = fadeOut(animationSpec = animationSpec),
modifier = modifier,
enter = fadeIn(spring(stiffness = 500F)),
exit = fadeOut(spring(stiffness = 500F)),
) {
Surface(
shape = RoundedCornerShape(24.dp),
shadowElevation = 8.dp,
) {
Row(
modifier = Modifier
.background(color = ElementTheme.colors.bgSubtleSecondary)
.padding(horizontal = 24.dp, vertical = 10.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.spacedBy(10.dp)
) {
CircularProgressIndicator(
modifier = Modifier
.progressSemantics()
.size(12.dp),
color = ElementTheme.colors.textPrimary,
strokeWidth = 1.5.dp,
)
Text(
text = stringResource(id = CommonStrings.common_syncing),
color = ElementTheme.colors.textPrimary,
style = ElementTheme.typography.fontBodyMdMedium
)
}
}
AsyncIndicator.Loading(
text = stringResource(id = CommonStrings.common_syncing),
)
}
}

2
build.gradle.kts

@ -153,7 +153,7 @@ allprojects { @@ -153,7 +153,7 @@ allprojects {
val isScreenshotTest = project.gradle.startParameter.taskNames.any { it.contains("paparazzi", ignoreCase = true) }
if (isScreenshotTest) {
// Increase heap size for screenshot tests
maxHeapSize = "1g"
maxHeapSize = "2g"
} else {
// Disable screenshot tests by default
exclude("ui/S.class")

2
fastlane/metadata/android/en-US/changelogs/40004050.txt

@ -0,0 +1,2 @@ @@ -0,0 +1,2 @@
Main changes in this version: Moderation to roomss, mark room as favourite.
Full changelog: https://github.com/element-hq/element-x-android/releases

2
features/analytics/api/src/main/res/values-be/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Дзяліцеся дадзенымі аналітыкі"</string>
<string name="screen_analytics_settings_help_us_improve">"Даваць ананімныя дадзеныя аб выкарыстанні, каб дапамагчы нам выявіць праблемы."</string>
<string name="screen_analytics_settings_read_terms">"Вы можаце азнаёміцца з усімі нашымі ўмовамі %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"тут"</string>
<string name="screen_analytics_settings_share_data">"Дзяліцеся дадзенымі аналітыкі"</string>
</resources>

7
features/analytics/api/src/main/res/values-bg/translations.xml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_help_us_improve">"Споделяне на анонимни данни за използване, за да ни помогнете да идентифицираме проблеми."</string>
<string name="screen_analytics_settings_read_terms">"Можете да прочетете всички наши условия %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"тук"</string>
<string name="screen_analytics_settings_share_data">"Споделяне на статистически данни"</string>
</resources>

2
features/analytics/api/src/main/res/values-cs/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Sdílet analytická data"</string>
<string name="screen_analytics_settings_help_us_improve">"Sdílejte anonymní údaje o používání, které nám pomohou identifikovat problémy."</string>
<string name="screen_analytics_settings_read_terms">"Můžete si přečíst všechny naše podmínky %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"zde"</string>
<string name="screen_analytics_settings_share_data">"Sdílet analytická data"</string>
</resources>

2
features/analytics/api/src/main/res/values-de/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Analysedaten teilen"</string>
<string name="screen_analytics_settings_help_us_improve">"Teile anonyme Nutzungsdaten, um uns bei der Identifizierung von Problemen zu helfen."</string>
<string name="screen_analytics_settings_read_terms">"Du kannst alle unsere Bedingungen lesen %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"hier"</string>
<string name="screen_analytics_settings_share_data">"Analysedaten teilen"</string>
</resources>

2
features/analytics/api/src/main/res/values-es/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Compartir datos analíticos"</string>
<string name="screen_analytics_settings_help_us_improve">"Compartir datos de uso anónimos para ayudarnos a identificar problemas."</string>
<string name="screen_analytics_settings_read_terms">"Puedes leer todos nuestros términos %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"aquí"</string>
<string name="screen_analytics_settings_share_data">"Compartir datos analíticos"</string>
</resources>

2
features/analytics/api/src/main/res/values-fr/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Partagez des données de statistiques d’utilisation"</string>
<string name="screen_analytics_settings_help_us_improve">"Partagez des données d’utilisation anonymes pour nous aider à identifier les problèmes."</string>
<string name="screen_analytics_settings_read_terms">"Vous pouvez lire toutes nos conditions %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"ici"</string>
<string name="screen_analytics_settings_share_data">"Partagez des données de statistiques d’utilisation"</string>
</resources>

2
features/analytics/api/src/main/res/values-hu/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Elemzési adatok megosztása"</string>
<string name="screen_analytics_settings_help_us_improve">"Anonim használati adatok megosztása a problémák azonosítása érdekében."</string>
<string name="screen_analytics_settings_read_terms">"%1$s olvashatja el a feltételeinket."</string>
<string name="screen_analytics_settings_read_terms_content_link">"Itt"</string>
<string name="screen_analytics_settings_share_data">"Elemzési adatok megosztása"</string>
</resources>

2
features/analytics/api/src/main/res/values-in/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Bagikan data analitik"</string>
<string name="screen_analytics_settings_help_us_improve">"Bagikan data penggunaan anonim untuk membantu kami mengidentifikasi masalah."</string>
<string name="screen_analytics_settings_read_terms">"Anda dapat membaca semua persyaratan kami %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"di sini"</string>
<string name="screen_analytics_settings_share_data">"Bagikan data analitik"</string>
</resources>

2
features/analytics/api/src/main/res/values-it/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Condividi dati statistici"</string>
<string name="screen_analytics_settings_help_us_improve">"Condividi dati di utilizzo anonimi per aiutarci a identificare problemi."</string>
<string name="screen_analytics_settings_read_terms">"Puoi leggere tutti i nostri termini %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"qui"</string>
<string name="screen_analytics_settings_share_data">"Condividi dati statistici"</string>
</resources>

2
features/analytics/api/src/main/res/values-ro/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Partajați datele analitice"</string>
<string name="screen_analytics_settings_help_us_improve">"Distribuiți date anonime de utilizare pentru a ne ajuta să identificăm probleme."</string>
<string name="screen_analytics_settings_read_terms">"Puteți citi toate condițiile noastre %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"aici"</string>
<string name="screen_analytics_settings_share_data">"Partajați datele analitice"</string>
</resources>

2
features/analytics/api/src/main/res/values-ru/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Делитесь данными аналитики"</string>
<string name="screen_analytics_settings_help_us_improve">"Предоставлять анонимные данные об использовании, чтобы помочь нам выявить проблемы."</string>
<string name="screen_analytics_settings_read_terms">"Вы можете ознакомиться со всеми нашими условиями %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"здесь"</string>
<string name="screen_analytics_settings_share_data">"Делитесь данными аналитики"</string>
</resources>

2
features/analytics/api/src/main/res/values-sk/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Zdieľať analytické údaje"</string>
<string name="screen_analytics_settings_help_us_improve">"Zdieľajte anonymné údaje o používaní, aby sme mohli identifikovať problémy."</string>
<string name="screen_analytics_settings_read_terms">"Môžete si prečítať všetky naše podmienky %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"tu"</string>
<string name="screen_analytics_settings_share_data">"Zdieľať analytické údaje"</string>
</resources>

7
features/analytics/api/src/main/res/values-sv/translations.xml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_help_us_improve">"Dela anonyma användningsdata för att hjälpa oss att identifiera problem."</string>
<string name="screen_analytics_settings_read_terms">"Du kan läsa alla våra villkor %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"här"</string>
<string name="screen_analytics_settings_share_data">"Dela analysdata"</string>
</resources>

7
features/analytics/api/src/main/res/values-uk/translations.xml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_help_us_improve">"Ділитися анонімними даними про використання, щоб допомогати нам виявляти проблеми."</string>
<string name="screen_analytics_settings_read_terms">"Ви можете прочитати всі наші умови %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"тут"</string>
<string name="screen_analytics_settings_share_data">"Поділитися аналітичними даними"</string>
</resources>

2
features/analytics/api/src/main/res/values-zh-rTW/translations.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"提供分析數據"</string>
<string name="screen_analytics_settings_help_us_improve">"提供匿名的使用數據以協助我們釐清問題。"</string>
<string name="screen_analytics_settings_read_terms">"您可以到%1$s閱讀我們的條款。"</string>
<string name="screen_analytics_settings_read_terms_content_link">"這裡"</string>
<string name="screen_analytics_settings_share_data">"提供分析數據"</string>
</resources>

2
features/analytics/api/src/main/res/values/localazy.xml

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_settings_share_data">"Share analytics data"</string>
<string name="screen_analytics_settings_help_us_improve">"Share anonymous usage data to help us identify issues."</string>
<string name="screen_analytics_settings_read_terms">"You can read all our terms %1$s."</string>
<string name="screen_analytics_settings_read_terms_content_link">"here"</string>
<string name="screen_analytics_settings_share_data">"Share analytics data"</string>
</resources>

10
features/analytics/impl/src/main/res/values-bg/translations.xml

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_prompt_data_usage">"Няма да записваме или профилираме лични данни"</string>
<string name="screen_analytics_prompt_help_us_improve">"Споделяне на анонимни данни за използване, за да ни помогнете да идентифицираме проблеми."</string>
<string name="screen_analytics_prompt_read_terms">"Можете да прочетете всички наши условия %1$s."</string>
<string name="screen_analytics_prompt_read_terms_content_link">"тук"</string>
<string name="screen_analytics_prompt_settings">"Можете да изключите това по всяко време"</string>
<string name="screen_analytics_prompt_third_party_sharing">"Няма да споделяме данни ви с трети страни"</string>
<string name="screen_analytics_prompt_title">"Помогнете за подобряването на %1$s"</string>
</resources>

10
features/analytics/impl/src/main/res/values-sv/translations.xml

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_prompt_data_usage">"Vi kommer inte att registrera eller profilera några personuppgifter"</string>
<string name="screen_analytics_prompt_help_us_improve">"Dela anonyma användningsdata för att hjälpa oss att identifiera problem."</string>
<string name="screen_analytics_prompt_read_terms">"Du kan läsa alla våra villkor %1$s."</string>
<string name="screen_analytics_prompt_read_terms_content_link">"här"</string>
<string name="screen_analytics_prompt_settings">"Du kan stänga av detta när som helst"</string>
<string name="screen_analytics_prompt_third_party_sharing">"Vi delar inte dina uppgifter med tredje part"</string>
<string name="screen_analytics_prompt_title">"Hjälp till att förbättra %1$s"</string>
</resources>

10
features/analytics/impl/src/main/res/values-uk/translations.xml

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_analytics_prompt_data_usage">"Ми не записуватимемо та не профілюватимемо жодні персональні дані"</string>
<string name="screen_analytics_prompt_help_us_improve">"Ділитися анонімними даними про використання, щоб допомогати нам виявляти проблеми."</string>
<string name="screen_analytics_prompt_read_terms">"Ви можете прочитати всі наші умови %1$s."</string>
<string name="screen_analytics_prompt_read_terms_content_link">"тут"</string>
<string name="screen_analytics_prompt_settings">"Ви можете вимкнути цю функцію в будь-який час"</string>
<string name="screen_analytics_prompt_third_party_sharing">"Ми не передаватимемо Ваші дані третім особам"</string>
<string name="screen_analytics_prompt_title">"Допоможіть покращити %1$s"</string>
</resources>

6
features/call/src/main/res/values-ro/translations.xml

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="call_foreground_service_channel_title_android">"Apel în curs"</string>
<string name="call_foreground_service_message_android">"Atingeți pentru a reveni la apel."</string>
<string name="call_foreground_service_title_android">"☎ Apel în curs"</string>
</resources>

6
features/call/src/main/res/values-sv/translations.xml

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="call_foreground_service_channel_title_android">"Pågående samtal"</string>
<string name="call_foreground_service_message_android">"Tryck för att återgå till samtalet"</string>
<string name="call_foreground_service_title_android">"☎ Samtal pågår"</string>
</resources>

6
features/call/src/main/res/values-uk/translations.xml

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="call_foreground_service_channel_title_android">"Поточний дзвінок"</string>
<string name="call_foreground_service_message_android">"Натисніть, щоб повернутися до виклику"</string>
<string name="call_foreground_service_title_android">"☎ Триває дзвінок"</string>
</resources>

6
features/createroom/impl/src/main/res/values-be/translations.xml

@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Новы пакой"</string>
<string name="screen_create_room_action_invite_people">"Запрасіце сяброў у Element"</string>
<string name="screen_create_room_add_people_title">"Запрасіць людзей"</string>
<string name="screen_create_room_add_people_title">"Запрасіць карыстальникаў"</string>
<string name="screen_create_room_error_creating_room">"Пры стварэнні пакоя адбылася памылка"</string>
<string name="screen_create_room_private_option_description">"Паведамленні ў гэтым пакоі зашыфраваны. Гэта шыфраванне нельга адключыць."</string>
<string name="screen_create_room_private_option_title">"Прыватны пакой (толькі па запрашэнні)"</string>
<string name="screen_create_room_public_option_description">"Паведамленні не зашыфраваны, і кожны можа іх прачытаць. Вы можаце ўключыць шыфраванне пазней."</string>
<string name="screen_create_room_public_option_title">"Адкрыты пакой (для ўсіх)"</string>
<string name="screen_create_room_topic_label">"Тэма (неабавязкова)"</string>
<string name="screen_start_chat_error_starting_chat">"Пры спробе пачаць чат адбылася памылка"</string>
<string name="screen_create_room_room_name_label">"Назва пакоя"</string>
<string name="screen_create_room_title">"Стварыце пакой"</string>
<string name="screen_create_room_topic_label">"Тэма (неабавязкова)"</string>
<string name="screen_start_chat_error_starting_chat">"Пры спробе пачаць чат адбылася памылка"</string>
</resources>

14
features/createroom/impl/src/main/res/values-bg/translations.xml

@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Нова стая"</string>
<string name="screen_create_room_action_invite_people">"Поканване на хора в Element"</string>
<string name="screen_create_room_add_people_title">"Поканване на хора"</string>
<string name="screen_create_room_error_creating_room">"Възникна грешка при създаването на стаята"</string>
<string name="screen_create_room_private_option_description">"Съобщенията в тази стая са шифровани. Шифроването не може да бъде изключено впоследствие."</string>
<string name="screen_create_room_private_option_title">"Частна стая (само с покана)"</string>
<string name="screen_create_room_public_option_description">"Съобщенията не са шифровани и всеки може да ги прочете. Можете да активирате шифроването на по-късна дата."</string>
<string name="screen_create_room_public_option_title">"Публична стая (всеки)"</string>
<string name="screen_create_room_room_name_label">"Име на стаята"</string>
<string name="screen_create_room_title">"Създаване на стая"</string>
<string name="screen_create_room_topic_label">"Тема за разговор (незадължително)"</string>
</resources>

6
features/createroom/impl/src/main/res/values-cs/translations.xml

@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Nová místnost"</string>
<string name="screen_create_room_action_invite_people">"Pozvat přátele do Elementu"</string>
<string name="screen_create_room_add_people_title">"Pozvat lidi"</string>
<string name="screen_create_room_add_people_title">"Pozvat přátele"</string>
<string name="screen_create_room_error_creating_room">"Při vytváření místnosti došlo k chybě"</string>
<string name="screen_create_room_private_option_description">"Zprávy v této místnosti jsou šifrované. Šifrování nelze později vypnout."</string>
<string name="screen_create_room_private_option_title">"Soukromá místnost (jen pro pozvané)"</string>
<string name="screen_create_room_public_option_description">"Zprávy nejsou šifrované a může si je přečíst kdokoli. Šifrování můžete povolit později."</string>
<string name="screen_create_room_public_option_title">"Veřejná místnost (kdokoli)"</string>
<string name="screen_create_room_topic_label">"Téma (nepovinné)"</string>
<string name="screen_start_chat_error_starting_chat">"Při pokusu o zahájení chatu došlo k chybě"</string>
<string name="screen_create_room_room_name_label">"Název místnosti"</string>
<string name="screen_create_room_title">"Vytvořit místnost"</string>
<string name="screen_create_room_topic_label">"Téma (nepovinné)"</string>
<string name="screen_start_chat_error_starting_chat">"Při pokusu o zahájení chatu došlo k chybě"</string>
</resources>

4
features/createroom/impl/src/main/res/values-de/translations.xml

@ -8,8 +8,8 @@ @@ -8,8 +8,8 @@
<string name="screen_create_room_private_option_title">"Privater Raum (nur auf Einladung)"</string>
<string name="screen_create_room_public_option_description">"Die Nachrichten sind nicht verschlüsselt und können von jedem gelesen werden. Die Verschlüsselung kann zu einem späteren Zeitpunkt aktiviert werden."</string>
<string name="screen_create_room_public_option_title">"Öffentlicher Raum (für alle)"</string>
<string name="screen_create_room_topic_label">"Thema (optional)"</string>
<string name="screen_start_chat_error_starting_chat">"Beim Versuch, einen Chat zu starten, ist ein Fehler aufgetreten"</string>
<string name="screen_create_room_room_name_label">"Raumname"</string>
<string name="screen_create_room_title">"Raum erstellen"</string>
<string name="screen_create_room_topic_label">"Thema (optional)"</string>
<string name="screen_start_chat_error_starting_chat">"Beim Versuch, einen Chat zu starten, ist ein Fehler aufgetreten"</string>
</resources>

4
features/createroom/impl/src/main/res/values-es/translations.xml

@ -8,8 +8,8 @@ @@ -8,8 +8,8 @@
<string name="screen_create_room_private_option_title">"Sala privada (sólo con invitación)"</string>
<string name="screen_create_room_public_option_description">"Los mensajes no están cifrados y cualquiera puede leerlos. Puedes activar la encriptación más adelante."</string>
<string name="screen_create_room_public_option_title">"Sala pública (cualquiera)"</string>
<string name="screen_create_room_topic_label">"Tema (opcional)"</string>
<string name="screen_start_chat_error_starting_chat">"Se ha producido un error al intentar iniciar un chat"</string>
<string name="screen_create_room_room_name_label">"Nombre de la sala"</string>
<string name="screen_create_room_title">"Crear una sala"</string>
<string name="screen_create_room_topic_label">"Tema (opcional)"</string>
<string name="screen_start_chat_error_starting_chat">"Se ha producido un error al intentar iniciar un chat"</string>
</resources>

6
features/createroom/impl/src/main/res/values-fr/translations.xml

@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Nouveau salon"</string>
<string name="screen_create_room_action_invite_people">"Inviter des amis sur Element"</string>
<string name="screen_create_room_add_people_title">"Inviter des personnes"</string>
<string name="screen_create_room_add_people_title">"Inviter des amis"</string>
<string name="screen_create_room_error_creating_room">"Une erreur s’est produite lors de la création du salon"</string>
<string name="screen_create_room_private_option_description">"Les messages dans ce salon sont chiffrés. Le chiffrement ne pourra pas être désactivé par la suite."</string>
<string name="screen_create_room_private_option_title">"Salon privé (sur invitation seulement)"</string>
<string name="screen_create_room_public_option_description">"Les messages ne sont pas chiffrés et n’importe qui peut les lire. Vous pouvez activer le chiffrement ultérieurement."</string>
<string name="screen_create_room_public_option_title">"Salon public (tout le monde)"</string>
<string name="screen_create_room_topic_label">"Sujet (facultatif)"</string>
<string name="screen_start_chat_error_starting_chat">"Une erreur s’est produite lors de la tentative de création de la discussion"</string>
<string name="screen_create_room_room_name_label">"Nom du salon"</string>
<string name="screen_create_room_title">"Créer un salon"</string>
<string name="screen_create_room_topic_label">"Sujet (facultatif)"</string>
<string name="screen_start_chat_error_starting_chat">"Une erreur s’est produite lors de la tentative de création de la discussion"</string>
</resources>

6
features/createroom/impl/src/main/res/values-hu/translations.xml

@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Új szoba"</string>
<string name="screen_create_room_action_invite_people">"Hívja meg ismerőseit az Elementbe"</string>
<string name="screen_create_room_add_people_title">"Emberek meghívása"</string>
<string name="screen_create_room_add_people_title">"Ismerősök meghívása"</string>
<string name="screen_create_room_error_creating_room">"Hiba történt a szoba létrehozásakor"</string>
<string name="screen_create_room_private_option_description">"A szobában lévő üzenetek titkosítottak. A titkosítást utólag nem lehet kikapcsolni."</string>
<string name="screen_create_room_private_option_title">"Privát szoba (csak meghívással)"</string>
<string name="screen_create_room_public_option_description">"Az üzenetek nincsenek titkosítva, és bárki elolvashatja őket. A titkosítást később is engedélyezheti."</string>
<string name="screen_create_room_public_option_title">"Nyilvános szoba (bárki)"</string>
<string name="screen_create_room_topic_label">"Téma (nem kötelező)"</string>
<string name="screen_start_chat_error_starting_chat">"Hiba történt a csevegés indításakor"</string>
<string name="screen_create_room_room_name_label">"Szoba neve"</string>
<string name="screen_create_room_title">"Szoba létrehozása"</string>
<string name="screen_create_room_topic_label">"Téma (nem kötelező)"</string>
<string name="screen_start_chat_error_starting_chat">"Hiba történt a csevegés indításakor"</string>
</resources>

6
features/createroom/impl/src/main/res/values-in/translations.xml

@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Ruangan baru"</string>
<string name="screen_create_room_action_invite_people">"Undang orang-orang ke Element"</string>
<string name="screen_create_room_add_people_title">"Undang seseorang"</string>
<string name="screen_create_room_add_people_title">"Undang orang-orang"</string>
<string name="screen_create_room_error_creating_room">"Terjadi kesalahan saat membuat ruangan"</string>
<string name="screen_create_room_private_option_description">"Pesan di ruangan ini dienkripsi. Enkripsi tidak dapat dinonaktifkan setelahnya."</string>
<string name="screen_create_room_private_option_title">"Ruangan pribadi (hanya undangan)"</string>
<string name="screen_create_room_public_option_description">"Pesan tidak dienkripsi dan siapa pun dapat membacanya. Anda dapat mengaktifkan enkripsi di kemudian hari."</string>
<string name="screen_create_room_public_option_title">"Ruang publik (siapa saja)"</string>
<string name="screen_create_room_topic_label">"Topik (opsional)"</string>
<string name="screen_start_chat_error_starting_chat">"Terjadi kesalahan saat mencoba memulai obrolan"</string>
<string name="screen_create_room_room_name_label">"Nama ruangan"</string>
<string name="screen_create_room_title">"Buat ruangan"</string>
<string name="screen_create_room_topic_label">"Topik (opsional)"</string>
<string name="screen_start_chat_error_starting_chat">"Terjadi kesalahan saat mencoba memulai obrolan"</string>
</resources>

4
features/createroom/impl/src/main/res/values-it/translations.xml

@ -8,8 +8,8 @@ @@ -8,8 +8,8 @@
<string name="screen_create_room_private_option_title">"Stanza privata (solo su invito)"</string>
<string name="screen_create_room_public_option_description">"I messaggi non sono cifrati e chiunque può leggerli. Puoi attivare la crittografia in un secondo momento."</string>
<string name="screen_create_room_public_option_title">"Stanza pubblica (chiunque)"</string>
<string name="screen_create_room_topic_label">"Argomento (facoltativo)"</string>
<string name="screen_start_chat_error_starting_chat">"Si è verificato un errore durante il tentativo di avviare una chat"</string>
<string name="screen_create_room_room_name_label">"Nome stanza"</string>
<string name="screen_create_room_title">"Crea una stanza"</string>
<string name="screen_create_room_topic_label">"Argomento (facoltativo)"</string>
<string name="screen_start_chat_error_starting_chat">"Si è verificato un errore durante il tentativo di avviare una chat"</string>
</resources>

6
features/createroom/impl/src/main/res/values-ro/translations.xml

@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Cameră nouă"</string>
<string name="screen_create_room_action_invite_people">"Invitați prieteni în Element"</string>
<string name="screen_create_room_add_people_title">"Invitați persoane"</string>
<string name="screen_create_room_add_people_title">"Invitați prieteni"</string>
<string name="screen_create_room_error_creating_room">"A apărut o eroare la crearea camerei"</string>
<string name="screen_create_room_private_option_description">"Mesajele din această cameră sunt criptate. Criptarea nu poate fi dezactivată ulterior."</string>
<string name="screen_create_room_private_option_title">"Cameră privată (doar pe bază de invitație)"</string>
<string name="screen_create_room_public_option_description">"Mesajele nu sunt criptate și oricine le poate citi. Puteți activa criptarea la o dată ulterioară."</string>
<string name="screen_create_room_public_option_title">"Cameră publică (oricine)"</string>
<string name="screen_create_room_topic_label">"Subiect (opțional)"</string>
<string name="screen_start_chat_error_starting_chat">"A apărut o eroare la încercarea începerii conversației"</string>
<string name="screen_create_room_room_name_label">"Numele camerei"</string>
<string name="screen_create_room_title">"Creați o cameră"</string>
<string name="screen_create_room_topic_label">"Subiect (opțional)"</string>
<string name="screen_start_chat_error_starting_chat">"A apărut o eroare la încercarea începerii conversației"</string>
</resources>

6
features/createroom/impl/src/main/res/values-ru/translations.xml

@ -2,14 +2,14 @@ @@ -2,14 +2,14 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Новая комната"</string>
<string name="screen_create_room_action_invite_people">"Пригласите друзей в Element"</string>
<string name="screen_create_room_add_people_title">"Пригласить людей"</string>
<string name="screen_create_room_add_people_title">"Пригласить друзей"</string>
<string name="screen_create_room_error_creating_room">"Произошла ошибка при создании комнаты"</string>
<string name="screen_create_room_private_option_description">"Сообщения в этой комнате зашифрованы. Отключить шифрование позже будет невозможно."</string>
<string name="screen_create_room_private_option_title">"Приватная комната (только по приглашению)"</string>
<string name="screen_create_room_public_option_description">"Сообщения не зашифрованы, каждый может их прочитать. Вы можете включить шифрование позже."</string>
<string name="screen_create_room_public_option_title">"Публичная комната (любой)"</string>
<string name="screen_create_room_topic_label">"Тема (необязательно)"</string>
<string name="screen_start_chat_error_starting_chat">"Произошла ошибка при попытке открытия комнаты"</string>
<string name="screen_create_room_room_name_label">"Название комнаты"</string>
<string name="screen_create_room_title">"Создать комнату"</string>
<string name="screen_create_room_topic_label">"Тема (необязательно)"</string>
<string name="screen_start_chat_error_starting_chat">"Произошла ошибка при попытке открытия комнаты"</string>
</resources>

4
features/createroom/impl/src/main/res/values-sk/translations.xml

@ -8,8 +8,8 @@ @@ -8,8 +8,8 @@
<string name="screen_create_room_private_option_title">"Súkromná miestnosť (len pre pozvaných)"</string>
<string name="screen_create_room_public_option_description">"Správy nie sú šifrované a môže si ich prečítať ktokoľvek. Šifrovanie môžete zapnúť neskôr."</string>
<string name="screen_create_room_public_option_title">"Verejná miestnosť (ktokoľvek)"</string>
<string name="screen_create_room_topic_label">"Téma (voliteľné)"</string>
<string name="screen_start_chat_error_starting_chat">"Pri pokuse o spustenie konverzácie sa vyskytla chyba"</string>
<string name="screen_create_room_room_name_label">"Názov miestnosti"</string>
<string name="screen_create_room_title">"Vytvoriť miestnosť"</string>
<string name="screen_create_room_topic_label">"Téma (voliteľné)"</string>
<string name="screen_start_chat_error_starting_chat">"Pri pokuse o spustenie konverzácie sa vyskytla chyba"</string>
</resources>

15
features/createroom/impl/src/main/res/values-sv/translations.xml

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Nytt rum"</string>
<string name="screen_create_room_action_invite_people">"Bjud in personer till Element"</string>
<string name="screen_create_room_add_people_title">"Bjud in personer"</string>
<string name="screen_create_room_error_creating_room">"Ett fel uppstod när rummet skapades"</string>
<string name="screen_create_room_private_option_description">"Meddelanden i det här rummet är krypterade. Kryptering kan inte inaktiveras efteråt."</string>
<string name="screen_create_room_private_option_title">"Privat rum (endast inbjudan)"</string>
<string name="screen_create_room_public_option_description">"Meddelanden är inte krypterade och vem som helst kan läsa dem. Du kan aktivera kryptering vid ett senare tillfälle."</string>
<string name="screen_create_room_public_option_title">"Offentligt rum (vem som helst)"</string>
<string name="screen_create_room_room_name_label">"Rumsnamn"</string>
<string name="screen_create_room_title">"Skapa ett rum"</string>
<string name="screen_create_room_topic_label">"Ämne (valfritt)"</string>
<string name="screen_start_chat_error_starting_chat">"Ett fel uppstod när du försökte starta en chatt"</string>
</resources>

15
features/createroom/impl/src/main/res/values-uk/translations.xml

@ -0,0 +1,15 @@ @@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_create_room_action_create_room">"Нова кімната"</string>
<string name="screen_create_room_action_invite_people">"Запросити людей до Element"</string>
<string name="screen_create_room_add_people_title">"Запросити людей"</string>
<string name="screen_create_room_error_creating_room">"Під час створення кімнати сталася помилка"</string>
<string name="screen_create_room_private_option_description">"Повідомлення в цій кімнаті зашифровані. Пізніше шифрування вимкнути не можна."</string>
<string name="screen_create_room_private_option_title">"Приватна кімната (тільки за запрошенням)"</string>
<string name="screen_create_room_public_option_description">"Повідомлення не шифруються, і будь-хто може їх прочитати. Шифрування можна ввімкнути пізніше."</string>
<string name="screen_create_room_public_option_title">"Загальна кімната (будь-хто)"</string>
<string name="screen_create_room_room_name_label">"Назва кімнати"</string>
<string name="screen_create_room_title">"Створити кімнату"</string>
<string name="screen_create_room_topic_label">"Тема (необов\'язково)"</string>
<string name="screen_start_chat_error_starting_chat">"Під час спроби почати чат сталася помилка"</string>
</resources>

2
features/createroom/impl/src/main/res/values-zh-rTW/translations.xml

@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
<string name="screen_create_room_private_option_title">"私密聊天室(僅限邀請)"</string>
<string name="screen_create_room_public_option_description">"訊息未加密,任何人都可以查看。您可以在之後啟用加密功能。"</string>
<string name="screen_create_room_public_option_title">"公開聊天室(任何人)"</string>
<string name="screen_create_room_topic_label">"主題(非必填)"</string>
<string name="screen_create_room_room_name_label">"聊天室名稱"</string>
<string name="screen_create_room_title">"建立聊天室"</string>
<string name="screen_create_room_topic_label">"主題(非必填)"</string>
</resources>

4
features/createroom/impl/src/main/res/values/localazy.xml

@ -8,8 +8,8 @@ @@ -8,8 +8,8 @@
<string name="screen_create_room_private_option_title">"Private room (invite only)"</string>
<string name="screen_create_room_public_option_description">"Messages are not encrypted and anyone can read them. You can enable encryption at a later date."</string>
<string name="screen_create_room_public_option_title">"Public room (anyone)"</string>
<string name="screen_create_room_topic_label">"Topic (optional)"</string>
<string name="screen_start_chat_error_starting_chat">"An error occurred when trying to start a chat"</string>
<string name="screen_create_room_room_name_label">"Room name"</string>
<string name="screen_create_room_title">"Create a room"</string>
<string name="screen_create_room_topic_label">"Topic (optional)"</string>
<string name="screen_start_chat_error_starting_chat">"An error occurred when trying to start a chat"</string>
</resources>

7
features/ftue/impl/src/main/res/values-bg/translations.xml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_notification_optin_subtitle">"Можете да промените настройките си по-късно."</string>
<string name="screen_notification_optin_title">"Разрешете известията и никога не пропускайте съобщение"</string>
<string name="screen_welcome_bullet_2">"Хронологията на съобщенията за шифровани стаи все още не е налична."</string>
<string name="screen_welcome_title">"Добре дошли в %1$s!"</string>
</resources>

2
features/ftue/impl/src/main/res/values-ro/translations.xml

@ -1,5 +1,7 @@ @@ -1,5 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_notification_optin_subtitle">"Puteți modifica setările mai târziu."</string>
<string name="screen_notification_optin_title">"Permiteți notificările și nu pierdeți niciodată un mesaj"</string>
<string name="screen_welcome_bullet_1">"Apelurile, sondajele, căutare și multe altele vor fi adăugate în cursul acestui an."</string>
<string name="screen_welcome_bullet_2">"Istoricul mesajelor pentru camerele criptate nu va fi disponibil în această actualizare."</string>
<string name="screen_welcome_bullet_3">"Ne-ar plăcea să auzim de la dumneavoastră, spuneți-ne ce părere aveți prin intermediul paginii de setări."</string>

11
features/ftue/impl/src/main/res/values-sv/translations.xml

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_notification_optin_subtitle">"Du kan ändra dina inställningar senare."</string>
<string name="screen_notification_optin_title">"Tillåt aviseringar och missa aldrig ett meddelande"</string>
<string name="screen_welcome_bullet_1">"Samtal, omröstningar, sökning och mer kommer att läggas till senare i år."</string>
<string name="screen_welcome_bullet_2">"Meddelandehistorik för krypterade rum är inte tillgänglig än."</string>
<string name="screen_welcome_bullet_3">"Vi vill gärna höra från dig, låt oss veta vad du tycker via inställningssidan."</string>
<string name="screen_welcome_button">"Nu kör vi!"</string>
<string name="screen_welcome_subtitle">"Här är vad du behöver veta:"</string>
<string name="screen_welcome_title">"Välkommen till %1$s!"</string>
</resources>

11
features/ftue/impl/src/main/res/values-uk/translations.xml

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_notification_optin_subtitle">"Ви можете змінити свої налаштування пізніше."</string>
<string name="screen_notification_optin_title">"Дозволити сповіщення і ніколи не пропускати повідомлення"</string>
<string name="screen_welcome_bullet_1">"Дзвінки, опитування, пошук тощо будуть додані пізніше цього року."</string>
<string name="screen_welcome_bullet_2">"Історія повідомлень для зашифрованих кімнат ще недоступна."</string>
<string name="screen_welcome_bullet_3">"Ми хотіли б почути вас, розкажіть нам, ваші враження та ідеї щодо застосунку, на сторінці налаштувань."</string>
<string name="screen_welcome_button">"Пішли!"</string>
<string name="screen_welcome_subtitle">"Ось що вам потрібно знати:"</string>
<string name="screen_welcome_title">"Ласкаво просимо до %1$s!"</string>
</resources>

2
features/invitelist/impl/src/main/kotlin/io/element/android/features/invitelist/impl/InviteListPresenter.kt

@ -58,7 +58,7 @@ class InviteListPresenter @Inject constructor( @@ -58,7 +58,7 @@ class InviteListPresenter @Inject constructor(
.roomListService
.invites
.summaries
.collectAsState()
.collectAsState(initial = emptyList())
var seenInvites by remember { mutableStateOf<Set<RoomId>>(emptySet()) }

7
features/invitelist/impl/src/main/res/values-bg/translations.xml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invites_decline_chat_message">"Сигурни ли сте, че искате да отхвърлите поканата за присъединяване в %1$s?"</string>
<string name="screen_invites_decline_chat_title">"Отказване на покана"</string>
<string name="screen_invites_empty_list">"Няма покани"</string>
<string name="screen_invites_invited_you">"%1$s (%2$s) ви покани"</string>
</resources>

9
features/invitelist/impl/src/main/res/values-sv/translations.xml

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invites_decline_chat_message">"Är du säker på att du vill tacka nej till inbjudan att gå med%1$s?"</string>
<string name="screen_invites_decline_chat_title">"Avböj inbjudan"</string>
<string name="screen_invites_decline_direct_chat_message">"Är du säker på att du vill avböja denna privata chatt med %1$s?"</string>
<string name="screen_invites_decline_direct_chat_title">"Avböj chatt"</string>
<string name="screen_invites_empty_list">"Inga inbjudningar"</string>
<string name="screen_invites_invited_you">"%1$s (%2$s) bjöd in dig"</string>
</resources>

9
features/invitelist/impl/src/main/res/values-uk/translations.xml

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_invites_decline_chat_message">"Ви впевнені, що хочете відхилити запрошення приєднатися до %1$s?"</string>
<string name="screen_invites_decline_chat_title">"Відхилити запрошення"</string>
<string name="screen_invites_decline_direct_chat_message">"Ви дійсно хочете відмовитися від приватного чату з %1$s?"</string>
<string name="screen_invites_decline_direct_chat_title">"Відхилити чат"</string>
<string name="screen_invites_empty_list">"Немає запрошень"</string>
<string name="screen_invites_invited_you">"%1$s (%2$s) запросив (-ла) Вас"</string>
</resources>

34
features/invitelist/impl/src/test/kotlin/io/element/android/features/invitelist/impl/InviteListPresenterTests.kt

@ -18,6 +18,7 @@ package io.element.android.features.invitelist.impl @@ -18,6 +18,7 @@ package io.element.android.features.invitelist.impl
import app.cash.molecule.RecompositionMode
import app.cash.molecule.moleculeFlow
import app.cash.turbine.TurbineTestContext
import app.cash.turbine.test
import com.google.common.truth.Truth.assertThat
import io.element.android.features.invitelist.api.SeenInvitesStore
@ -27,7 +28,6 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarData @@ -27,7 +28,6 @@ import io.element.android.libraries.designsystem.components.avatar.AvatarData
import io.element.android.libraries.designsystem.components.avatar.AvatarSize
import io.element.android.libraries.matrix.api.MatrixClient
import io.element.android.libraries.matrix.api.core.RoomId
import io.element.android.libraries.matrix.api.room.RoomMember
import io.element.android.libraries.matrix.api.room.RoomMembershipState
import io.element.android.libraries.matrix.api.roomlist.RoomSummary
import io.element.android.libraries.matrix.test.AN_AVATAR_URL
@ -38,6 +38,7 @@ import io.element.android.libraries.matrix.test.A_USER_ID @@ -38,6 +38,7 @@ import io.element.android.libraries.matrix.test.A_USER_ID
import io.element.android.libraries.matrix.test.A_USER_NAME
import io.element.android.libraries.matrix.test.FakeMatrixClient
import io.element.android.libraries.matrix.test.room.FakeMatrixRoom
import io.element.android.libraries.matrix.test.room.aRoomMember
import io.element.android.libraries.matrix.test.room.aRoomSummaryDetails
import io.element.android.libraries.matrix.test.roomlist.FakeRoomListService
import io.element.android.libraries.push.api.notifications.NotificationDrawerManager
@ -83,7 +84,7 @@ class InviteListPresenterTests { @@ -83,7 +84,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val withInviteState = awaitItem()
val withInviteState = awaitInitialItem()
assertThat(withInviteState.inviteList.size).isEqualTo(1)
assertThat(withInviteState.inviteList[0].roomId).isEqualTo(A_ROOM_ID)
assertThat(withInviteState.inviteList[0].roomAlias).isEqualTo(A_USER_ID.value)
@ -109,7 +110,7 @@ class InviteListPresenterTests { @@ -109,7 +110,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val withInviteState = awaitItem()
val withInviteState = awaitInitialItem()
assertThat(withInviteState.inviteList.size).isEqualTo(1)
assertThat(withInviteState.inviteList[0].sender?.displayName).isEqualTo(A_USER_NAME)
assertThat(withInviteState.inviteList[0].sender?.userId).isEqualTo(A_USER_ID)
@ -138,7 +139,7 @@ class InviteListPresenterTests { @@ -138,7 +139,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.DeclineInvite(originalState.inviteList[0]))
val newState = awaitItem()
@ -159,7 +160,7 @@ class InviteListPresenterTests { @@ -159,7 +160,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.DeclineInvite(originalState.inviteList[0]))
val newState = awaitItem()
@ -180,7 +181,7 @@ class InviteListPresenterTests { @@ -180,7 +181,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.DeclineInvite(originalState.inviteList[0]))
skipItems(1)
@ -206,7 +207,7 @@ class InviteListPresenterTests { @@ -206,7 +207,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.DeclineInvite(originalState.inviteList[0]))
skipItems(1)
@ -234,7 +235,7 @@ class InviteListPresenterTests { @@ -234,7 +235,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.DeclineInvite(originalState.inviteList[0]))
skipItems(1)
@ -264,7 +265,7 @@ class InviteListPresenterTests { @@ -264,7 +265,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.DeclineInvite(originalState.inviteList[0]))
skipItems(1)
@ -295,7 +296,7 @@ class InviteListPresenterTests { @@ -295,7 +296,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.AcceptInvite(originalState.inviteList[0]))
val newState = awaitItem()
@ -320,7 +321,7 @@ class InviteListPresenterTests { @@ -320,7 +321,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.AcceptInvite(originalState.inviteList[0]))
assertThat(awaitItem().acceptedAction).isEqualTo(AsyncData.Failure<RoomId>(ex))
@ -342,7 +343,7 @@ class InviteListPresenterTests { @@ -342,7 +343,7 @@ class InviteListPresenterTests {
moleculeFlow(RecompositionMode.Immediate) {
presenter.present()
}.test {
val originalState = awaitItem()
val originalState = awaitInitialItem()
originalState.eventSink(InviteListEvents.AcceptInvite(originalState.inviteList[0]))
skipItems(1)
@ -431,7 +432,7 @@ class InviteListPresenterTests { @@ -431,7 +432,7 @@ class InviteListPresenterTests {
avatarUrl = null,
isDirect = false,
lastMessage = null,
inviter = RoomMember(
inviter = aRoomMember(
userId = A_USER_ID,
displayName = A_USER_NAME,
avatarUrl = AN_AVATAR_URL,
@ -458,7 +459,7 @@ class InviteListPresenterTests { @@ -458,7 +459,7 @@ class InviteListPresenterTests {
avatarUrl = null,
isDirect = true,
lastMessage = null,
inviter = RoomMember(
inviter = aRoomMember(
userId = A_USER_ID,
displayName = A_USER_NAME,
avatarUrl = AN_AVATAR_URL,
@ -485,6 +486,11 @@ class InviteListPresenterTests { @@ -485,6 +486,11 @@ class InviteListPresenterTests {
)
)
private suspend fun TurbineTestContext<InviteListState>.awaitInitialItem(): InviteListState {
skipItems(1)
return awaitItem()
}
private fun createPresenter(
client: MatrixClient,
seenInvitesStore: SeenInvitesStore = FakeSeenInvitesStore(),

4
features/leaveroom/api/src/main/res/values-bg/translations.xml

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="leave_room_alert_subtitle">"Сигурни ли сте, че искате да напуснете стаята?"</string>
</resources>

1
features/leaveroom/api/src/main/res/values-ro/translations.xml

@ -1,5 +1,6 @@ @@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="leave_conversation_alert_subtitle">"Sunteți sigur că doriți să părăsiți această conversație? Această conversație nu este publică și nu veți putea reveni fără o invitație."</string>
<string name="leave_room_alert_empty_subtitle">"Sunteți sigur că vreți să părăsiți această cameră? Sunteți singura persoană de aici. Dacă o părasiți, nimeni nu se va mai putea alătura în viitor, inclusiv dumneavoastra."</string>
<string name="leave_room_alert_private_subtitle">"Sunteți sigur că vrei să părăsiți această cameră? Această cameră nu este publică și nu va veti putea alătura din nou fără o invitație."</string>
<string name="leave_room_alert_subtitle">"Sunteți sigur că vreți să părăsiți camera?"</string>

6
features/leaveroom/api/src/main/res/values-sv/translations.xml

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="leave_room_alert_empty_subtitle">"Är du säker på att du vill lämna det här rummet? Du är den enda personen här. Om du lämnar kommer ingen att kunna gå med i framtiden, inklusive du."</string>
<string name="leave_room_alert_private_subtitle">"Är du säker på att du vill lämna det här rummet? Detta rum är inte offentligt och du kommer inte att kunna gå med igen utan en inbjudan."</string>
<string name="leave_room_alert_subtitle">"Är du säker på att du vill lämna rummet?"</string>
</resources>

7
features/leaveroom/api/src/main/res/values-uk/translations.xml

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="leave_conversation_alert_subtitle">"Ви впевнені, що хочете залишити цю розмову? Ця розмова не є загальнодоступною, і ви не зможете знову приєднатися без запрошення."</string>
<string name="leave_room_alert_empty_subtitle">"Ви впевнені, що хочете вийти з цієї кімнати? Ви тут єдина людина. Якщо Ви вийдете, ніхто в майбутньому не зможе приєднатися, у тому числі і Ви."</string>
<string name="leave_room_alert_private_subtitle">"Ви впевнені, що хочете вийти з цієї кімнати? Ця кімната не є публічною, і ви не зможете повернутися до неї без запрошення."</string>
<string name="leave_room_alert_subtitle">"Ви впевнені, що хочете вийти з кімнати?"</string>
</resources>

10
features/location/impl/build.gradle.kts

@ -22,6 +22,11 @@ plugins { @@ -22,6 +22,11 @@ plugins {
android {
namespace = "io.element.android.features.location.impl"
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
}
anvil {
@ -51,11 +56,14 @@ dependencies { @@ -51,11 +56,14 @@ dependencies {
testImplementation(libs.test.junit)
testImplementation(libs.coroutines.test)
testImplementation(libs.molecule.runtime)
testImplementation(libs.test.robolectric)
testImplementation(libs.test.truth)
testImplementation(libs.test.turbine)
testImplementation(libs.test.truth)
testImplementation(projects.libraries.matrix.test)
testImplementation(projects.libraries.testtags)
testImplementation(projects.services.analytics.test)
testImplementation(projects.features.messages.test)
testImplementation(projects.tests.testutils)
testImplementation(libs.androidx.compose.ui.test.junit)
testReleaseImplementation(libs.androidx.compose.ui.test.manifest)
}

87
features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationStateProvider.kt

@ -24,78 +24,47 @@ private const val APP_NAME = "ApplicationName" @@ -24,78 +24,47 @@ private const val APP_NAME = "ApplicationName"
class ShowLocationStateProvider : PreviewParameterProvider<ShowLocationState> {
override val values: Sequence<ShowLocationState>
get() = sequenceOf(
ShowLocationState(
ShowLocationState.Dialog.None,
Location(1.23, 2.34, 4f),
description = null,
hasLocationPermission = false,
isTrackMyLocation = false,
appName = APP_NAME,
eventSink = {},
aShowLocationState(),
aShowLocationState(
permissionDialog = ShowLocationState.Dialog.PermissionDenied,
),
ShowLocationState(
ShowLocationState.Dialog.PermissionDenied,
Location(1.23, 2.34, 4f),
description = null,
hasLocationPermission = false,
isTrackMyLocation = false,
appName = APP_NAME,
eventSink = {},
aShowLocationState(
permissionDialog = ShowLocationState.Dialog.PermissionRationale,
),
ShowLocationState(
ShowLocationState.Dialog.PermissionRationale,
Location(1.23, 2.34, 4f),
description = null,
hasLocationPermission = false,
isTrackMyLocation = false,
appName = APP_NAME,
eventSink = {},
),
ShowLocationState(
ShowLocationState.Dialog.None,
Location(1.23, 2.34, 4f),
description = null,
aShowLocationState(
hasLocationPermission = true,
isTrackMyLocation = false,
appName = APP_NAME,
eventSink = {},
),
ShowLocationState(
ShowLocationState.Dialog.None,
Location(1.23, 2.34, 4f),
description = null,
aShowLocationState(
hasLocationPermission = true,
isTrackMyLocation = true,
appName = APP_NAME,
eventSink = {},
),
ShowLocationState(
ShowLocationState.Dialog.None,
Location(1.23, 2.34, 4f),
aShowLocationState(
description = "My favourite place!",
hasLocationPermission = false,
isTrackMyLocation = false,
appName = APP_NAME,
eventSink = {},
),
ShowLocationState(
ShowLocationState.Dialog.None,
Location(1.23, 2.34, 4f),
aShowLocationState(
description = "For some reason I decided to to write a small essay that wraps at just two lines!",
hasLocationPermission = false,
isTrackMyLocation = false,
appName = APP_NAME,
eventSink = {},
),
ShowLocationState(
ShowLocationState.Dialog.None,
Location(1.23, 2.34, 4f),
aShowLocationState(
description = "For some reason I decided to write a small essay in the location description. " +
"It is so long that it will wrap onto more than two lines!",
hasLocationPermission = false,
isTrackMyLocation = false,
appName = APP_NAME,
eventSink = {},
),
)
}
fun aShowLocationState(
permissionDialog: ShowLocationState.Dialog = ShowLocationState.Dialog.None,
location: Location = Location(1.23, 2.34, 4f),
description: String? = null,
hasLocationPermission: Boolean = false,
isTrackMyLocation: Boolean = false,
appName: String = APP_NAME,
eventSink: (ShowLocationEvents) -> Unit = {},
) = ShowLocationState(
permissionDialog = permissionDialog,
location = location,
description = description,
hasLocationPermission = hasLocationPermission,
isTrackMyLocation = isTrackMyLocation,
appName = appName,
eventSink = eventSink,
)

8
features/location/impl/src/main/kotlin/io/element/android/features/location/impl/show/ShowLocationView.kt

@ -120,10 +120,14 @@ fun ShowLocationView( @@ -120,10 +120,14 @@ fun ShowLocationView(
)
},
navigationIcon = {
BackButton(onClick = onBackPressed)
BackButton(
onClick = onBackPressed,
)
},
actions = {
IconButton(onClick = { state.eventSink(ShowLocationEvents.Share) }) {
IconButton(
onClick = { state.eventSink(ShowLocationEvents.Share) }
) {
Icon(
imageVector = CompoundIcons.ShareAndroid(),
contentDescription = stringResource(CommonStrings.action_share),

155
features/location/impl/src/test/kotlin/io/element/android/features/location/impl/show/ShowLocationViewTest.kt

@ -0,0 +1,155 @@ @@ -0,0 +1,155 @@
/*
* Copyright (c) 2024 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 io.element.android.features.location.impl.show
import androidx.activity.ComponentActivity
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.platform.LocalInspectionMode
import androidx.compose.ui.test.junit4.AndroidComposeTestRule
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithContentDescription
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performClick
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.element.android.libraries.testtags.TestTags
import io.element.android.libraries.ui.strings.CommonStrings
import io.element.android.tests.testutils.EnsureNeverCalled
import io.element.android.tests.testutils.EventsRecorder
import io.element.android.tests.testutils.clickOn
import io.element.android.tests.testutils.ensureCalledOnce
import io.element.android.tests.testutils.pressBack
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ShowLocationViewTest {
@get:Rule val rule = createAndroidComposeRule<ComponentActivity>()
@Test
fun `test back action`() {
val eventsRecorder = EventsRecorder<ShowLocationEvents>(expectEvents = false)
ensureCalledOnce { callback ->
rule.setShowLocationView(
state = aShowLocationState(
eventSink = eventsRecorder
),
onBackPressed = callback,
)
rule.pressBack()
}
}
@Test
fun `test share action`() {
val eventsRecorder = EventsRecorder<ShowLocationEvents>()
rule.setShowLocationView(
aShowLocationState(
eventSink = eventsRecorder
),
onBackPressed = EnsureNeverCalled(),
)
val shareContentDescription = rule.activity.getString(CommonStrings.action_share)
rule.onNodeWithContentDescription(shareContentDescription).performClick()
eventsRecorder.assertSingle(ShowLocationEvents.Share)
}
@Test
fun `test fab click`() {
val eventsRecorder = EventsRecorder<ShowLocationEvents>()
rule.setShowLocationView(
aShowLocationState(
eventSink = eventsRecorder
),
onBackPressed = EnsureNeverCalled(),
)
rule.onNodeWithTag(TestTags.floatingActionButton.value).performClick()
eventsRecorder.assertSingle(ShowLocationEvents.TrackMyLocation(true))
}
@Test
fun `when permission denied is displayed user can open the settings`() {
val eventsRecorder = EventsRecorder<ShowLocationEvents>()
rule.setShowLocationView(
aShowLocationState(
permissionDialog = ShowLocationState.Dialog.PermissionDenied,
eventSink = eventsRecorder
),
onBackPressed = EnsureNeverCalled(),
)
rule.clickOn(CommonStrings.action_continue)
eventsRecorder.assertSingle(ShowLocationEvents.OpenAppSettings)
}
@Test
fun `when permission denied is displayed user can close the dialog`() {
val eventsRecorder = EventsRecorder<ShowLocationEvents>()
rule.setShowLocationView(
aShowLocationState(
permissionDialog = ShowLocationState.Dialog.PermissionDenied,
eventSink = eventsRecorder
),
onBackPressed = EnsureNeverCalled(),
)
rule.clickOn(CommonStrings.action_cancel)
eventsRecorder.assertSingle(ShowLocationEvents.DismissDialog)
}
@Test
fun `when permission rationale is displayed user can request permissions`() {
val eventsRecorder = EventsRecorder<ShowLocationEvents>()
rule.setShowLocationView(
aShowLocationState(
permissionDialog = ShowLocationState.Dialog.PermissionRationale,
eventSink = eventsRecorder
),
onBackPressed = EnsureNeverCalled(),
)
rule.clickOn(CommonStrings.action_continue)
eventsRecorder.assertSingle(ShowLocationEvents.RequestPermissions)
}
@Test
fun `when permission rationale is displayed user can close the dialog`() {
val eventsRecorder = EventsRecorder<ShowLocationEvents>()
rule.setShowLocationView(
aShowLocationState(
permissionDialog = ShowLocationState.Dialog.PermissionRationale,
eventSink = eventsRecorder
),
onBackPressed = EnsureNeverCalled(),
)
rule.clickOn(CommonStrings.action_cancel)
eventsRecorder.assertSingle(ShowLocationEvents.DismissDialog)
}
}
private fun <R : TestRule> AndroidComposeTestRule<R, ComponentActivity>.setShowLocationView(
state: ShowLocationState,
onBackPressed: () -> Unit = EnsureNeverCalled(),
) {
setContent {
// Simulate a LocalInspectionMode for MapboxMap
CompositionLocalProvider(LocalInspectionMode provides true) {
ShowLocationView(
state = state,
onBackPressed = onBackPressed,
)
}
}
}

20
features/lockscreen/impl/src/main/res/values-be/translations.xml

@ -1,15 +1,5 @@ @@ -1,15 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"У вас %1$d спроба разблакіроўкі"</item>
<item quantity="few">"У вас %1$d спроб разблакіроўкі"</item>
<item quantity="many">"У вас %1$d спроб разблакіроўкі"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Няправільны PIN-код. У вас застаўся %1$d шанец"</item>
<item quantity="few">"Няправільны PIN-код. У вас застаўася %1$d шанцаў"</item>
<item quantity="many">"Няправільны PIN-код. У вас застаўася %1$d шанцаў"</item>
</plurals>
<string name="screen_app_lock_biometric_authentication">"біяметрычная аўтэнтыфікацыя"</string>
<string name="screen_app_lock_biometric_unlock">"біяметрычная разблакіроўка"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Разблакіроўка з дапамогай біяметрыі"</string>
@ -33,6 +23,16 @@ @@ -33,6 +23,16 @@
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"PIN-коды не супадаюць"</string>
<string name="screen_app_lock_signout_alert_message">"Каб працягнуць, вам неабходна паўторна ўвайсці ў сістэму і стварыць новы PIN-код"</string>
<string name="screen_app_lock_signout_alert_title">"Вы выходзіце з сістэмы"</string>
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"У вас %1$d спроба разблакіроўкі"</item>
<item quantity="few">"У вас %1$d спроб разблакіроўкі"</item>
<item quantity="many">"У вас %1$d спроб разблакіроўкі"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Няправільны PIN-код. У вас застаўся %1$d шанец"</item>
<item quantity="few">"Няправільны PIN-код. У вас застаўася %1$d шанцаў"</item>
<item quantity="many">"Няправільны PIN-код. У вас застаўася %1$d шанцаў"</item>
</plurals>
<string name="screen_app_lock_use_biometric_android">"Выкарыстоўваць біяметрыю"</string>
<string name="screen_app_lock_use_pin_android">"Выкарыстоўваць PIN-код"</string>
<string name="screen_signout_in_progress_dialog_content">"Выхад…"</string>

25
features/lockscreen/impl/src/main/res/values-bg/translations.xml

@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="screen_app_lock_forgot_pin">"Забравихте PIN?"</string>
<string name="screen_app_lock_settings_change_pin">"Промяна на PIN кода"</string>
<string name="screen_app_lock_settings_remove_pin">"Премахване на PIN"</string>
<string name="screen_app_lock_settings_remove_pin_alert_message">"Сигурни ли сте, че искате да премахнете PIN?"</string>
<string name="screen_app_lock_settings_remove_pin_alert_title">"Премахване на PIN?"</string>
<string name="screen_app_lock_setup_biometric_unlock_allow_title">"Разрешаване на %1$s"</string>
<string name="screen_app_lock_setup_biometric_unlock_skip">"Предпочитам да използвам PIN"</string>
<string name="screen_app_lock_setup_choose_pin">"Избор на PIN"</string>
<string name="screen_app_lock_setup_confirm_pin">"Потвърждаване на PIN"</string>
<string name="screen_app_lock_setup_pin_blacklisted_dialog_title">"Избор на различен PIN"</string>
<string name="screen_app_lock_setup_pin_mismatch_dialog_content">"Моля, въведете един и същ PIN два пъти"</string>
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"PINs не съвпадат"</string>
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Имате %1$d опит да отключите"</item>
<item quantity="other">"Имате %1$d опита да отключите"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Грешен PIN. Имате още %1$d шанс"</item>
<item quantity="other">"Грешен PIN. Имате още %1$d шанса"</item>
</plurals>
<string name="screen_app_lock_use_pin_android">"Използване на PIN"</string>
<string name="screen_signout_in_progress_dialog_content">"Излизане…"</string>
</resources>

20
features/lockscreen/impl/src/main/res/values-cs/translations.xml

@ -1,15 +1,5 @@ @@ -1,15 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Máte %1$d pokus pro odemknutí"</item>
<item quantity="few">"Máte %1$d pokusy pro odemknutí"</item>
<item quantity="other">"Máte %1$d pokusů pro odemknutí"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Špatný PIN. Máte %1$d další pokus"</item>
<item quantity="few">"Špatný PIN. Máte %1$d další pokusy"</item>
<item quantity="other">"Špatný PIN. Máte %1$d dalších pokusů"</item>
</plurals>
<string name="screen_app_lock_biometric_authentication">"Biometrické ověřování"</string>
<string name="screen_app_lock_biometric_unlock">"biometrické odemknutí"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Odemkněte pomocí biometrie"</string>
@ -33,6 +23,16 @@ Vyberte si něco zapamatovatelného. Pokud tento kód PIN zapomenete, budete z a @@ -33,6 +23,16 @@ Vyberte si něco zapamatovatelného. Pokud tento kód PIN zapomenete, budete z a
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"PIN kódy se neshodují."</string>
<string name="screen_app_lock_signout_alert_message">"Abyste mohli pokračovat, budete se muset znovu přihlásit a vytvořit nový PIN"</string>
<string name="screen_app_lock_signout_alert_title">"Jste odhlášeni"</string>
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Máte %1$d pokus pro odemknutí"</item>
<item quantity="few">"Máte %1$d pokusy pro odemknutí"</item>
<item quantity="other">"Máte %1$d pokusů pro odemknutí"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Špatný PIN. Máte %1$d další pokus"</item>
<item quantity="few">"Špatný PIN. Máte %1$d další pokusy"</item>
<item quantity="other">"Špatný PIN. Máte %1$d dalších pokusů"</item>
</plurals>
<string name="screen_app_lock_use_biometric_android">"Použijte biometrické údaje"</string>
<string name="screen_app_lock_use_pin_android">"Použít PIN"</string>
<string name="screen_signout_in_progress_dialog_content">"Odhlašování…"</string>

16
features/lockscreen/impl/src/main/res/values-de/translations.xml

@ -1,13 +1,5 @@ @@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Du hast %1$d Versuch zu entsperren"</item>
<item quantity="other">"Du hast %1$d Versuche zum Entsperren"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Falsche PIN. Du hast %1$d weitere Chance"</item>
<item quantity="other">"Falsche PIN. Du hast %1$d weitere Chancen"</item>
</plurals>
<string name="screen_app_lock_biometric_authentication">"biometrische Authentifizierung"</string>
<string name="screen_app_lock_biometric_unlock">"biometrisches Entsperren"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Mit Biometrie entsperren"</string>
@ -31,6 +23,14 @@ Wähle etwas Einprägsames. Bei falscher Eingabe wirst du aus der App ausgeloggt @@ -31,6 +23,14 @@ Wähle etwas Einprägsames. Bei falscher Eingabe wirst du aus der App ausgeloggt
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"Die PINs stimmen nicht überein"</string>
<string name="screen_app_lock_signout_alert_message">"Um fortzufahren, musst du dich erneut anmelden und eine neue PIN erstellen"</string>
<string name="screen_app_lock_signout_alert_title">"Du wirst abgemeldet"</string>
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Du hast %1$d Versuch zu entsperren"</item>
<item quantity="other">"Du hast %1$d Versuche zum Entsperren"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Falsche PIN. Du hast %1$d weitere Chance"</item>
<item quantity="other">"Falsche PIN. Du hast %1$d weitere Chancen"</item>
</plurals>
<string name="screen_app_lock_use_biometric_android">"Biometrie verwenden"</string>
<string name="screen_app_lock_use_pin_android">"PIN verwenden"</string>
<string name="screen_signout_in_progress_dialog_content">"Abmelden…"</string>

16
features/lockscreen/impl/src/main/res/values-es/translations.xml

@ -1,13 +1,5 @@ @@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Tienes %1$d intento de desbloqueo"</item>
<item quantity="other">"Tienes %1$d intentos de desbloqueo"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"PIN incorrecto. Tienes %1$d oportunidad más"</item>
<item quantity="other">"PIN incorrecto. Tienes %1$d oportunidades más"</item>
</plurals>
<string name="screen_app_lock_biometric_authentication">"autenticación biométrica"</string>
<string name="screen_app_lock_biometric_unlock">"desbloqueo biométrico"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Desbloquear con biométrico"</string>
@ -31,6 +23,14 @@ Elige algo que puedas recordar. Si olvidas este PIN, se cerrará la sesión de l @@ -31,6 +23,14 @@ Elige algo que puedas recordar. Si olvidas este PIN, se cerrará la sesión de l
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"Los PINs no coinciden"</string>
<string name="screen_app_lock_signout_alert_message">"Tendrás que volver a iniciar sesión y crear un nuevo PIN para continuar"</string>
<string name="screen_app_lock_signout_alert_title">"Se está cerrando tu sesión"</string>
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Tienes %1$d intento de desbloqueo"</item>
<item quantity="other">"Tienes %1$d intentos de desbloqueo"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"PIN incorrecto. Tienes %1$d oportunidad más"</item>
<item quantity="other">"PIN incorrecto. Tienes %1$d oportunidades más"</item>
</plurals>
<string name="screen_app_lock_use_biometric_android">"Usar desbloqueo biométrico"</string>
<string name="screen_app_lock_use_pin_android">"Usar PIN"</string>
<string name="screen_signout_in_progress_dialog_content">"Cerrando sesión…"</string>

16
features/lockscreen/impl/src/main/res/values-fr/translations.xml

@ -1,13 +1,5 @@ @@ -1,13 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Il reste %1$d tentative pour déverrouiller"</item>
<item quantity="other">"Il reste %1$d tentatives pour déverrouiller"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Code PIN incorrect. Il reste %1$d tentative"</item>
<item quantity="other">"Code PIN incorrect. Il reste %1$d tentatives"</item>
</plurals>
<string name="screen_app_lock_biometric_authentication">"Authentification biométrique"</string>
<string name="screen_app_lock_biometric_unlock">"Déverrouillage biométrique"</string>
<string name="screen_app_lock_biometric_unlock_title_android">"Déverrouiller avec la biométrie"</string>
@ -29,6 +21,14 @@ @@ -29,6 +21,14 @@
<string name="screen_app_lock_setup_pin_mismatch_dialog_title">"Les codes PIN ne correspondent pas"</string>
<string name="screen_app_lock_signout_alert_message">"Pour continuer, vous devrez vous connecter à nouveau et créer un nouveau code PIN."</string>
<string name="screen_app_lock_signout_alert_title">"Vous êtes en train de vous déconnecter"</string>
<plurals name="screen_app_lock_subtitle">
<item quantity="one">"Il reste %1$d tentative pour déverrouiller"</item>
<item quantity="other">"Il reste %1$d tentatives pour déverrouiller"</item>
</plurals>
<plurals name="screen_app_lock_subtitle_wrong_pin">
<item quantity="one">"Code PIN incorrect. Il reste %1$d tentative"</item>
<item quantity="other">"Code PIN incorrect. Il reste %1$d tentatives"</item>
</plurals>
<string name="screen_app_lock_use_biometric_android">"Utiliser la biométrie"</string>
<string name="screen_app_lock_use_pin_android">"Utiliser le code PIN"</string>
<string name="screen_signout_in_progress_dialog_content">"Déconnexion…"</string>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save