1
0
mirror of https://github.com/vector-im/riotX-android synced 2025-10-06 00:02:48 +02:00

Compare commits

...

209 Commits

Author SHA1 Message Date
Benoit Marty
83897dda4e Merge branch 'release/1.3.7' into main 2021-11-04 18:41:03 +01:00
Benoit Marty
ec4923fbc8 Merge 1.3.7 2021-11-04 18:40:51 +01:00
Benoit Marty
b773aa213a Fastlane 2021-11-04 16:49:55 +01:00
Benoit Marty
6c8513d65a Towncrier 2021-11-04 16:48:35 +01:00
Benoit Marty
78e0109301 Fix crash when filtering the room member list
A Holder as to be uniquely linked to the layout id declared in @EpoxyModelClass, see https://github.com/airbnb/epoxy/issues/854
Fixes https://github.com/matrix-org/element-android-rageshakes/issues/27784
2021-11-04 16:39:20 +01:00
Benoit Marty
21e1766e3e Better code 2021-11-04 16:19:26 +01:00
Benoit Marty
41ab117182 Fix a problem with filtering 3pid invite.
We were using the whole 3pid invite if they were not all filtered.
Also double filtering on RoomThirdPartyInviteContent type is not necessary
2021-11-04 16:19:26 +01:00
Benoit Marty
345dac4a3b rename fun 2021-11-04 15:43:03 +01:00
Benoit Marty
8f854d725d ./fastlane/metadata/android/vi/full_description.txt now exists 2021-11-04 13:01:40 +01:00
Adam Tomaja
e167db2bb7 Feature/4292 fix capitalisation on initial sync screen (#4410)
#4292 - Fix Capitalisation On Initial Sync Screen

Co-authored-by: Adam Tomaja <cydercode@gmail.com>
2021-11-04 11:39:50 +00:00
Benoit Marty
6f58cbd6c5 Merge pull request #4314 from vector-im/feature/adm/fdroid-notification-reliability
F-Droid variant permanent notification to fix missing notifications
2021-11-04 12:28:20 +01:00
Benoit Marty
97089e4394 Fix lint issue 2021-11-04 12:20:39 +01:00
Benoit Marty
3ffd41d36f Merge pull request #4411 from RiotTranslateBot/weblate-element-android-element-app
Translations update from Weblate
2021-11-04 12:10:31 +01:00
Weblate
e4135e4524 Merge branch 'origin/develop' into Weblate. 2021-11-04 10:21:40 +00:00
Jim
488c081d0c Translated using Weblate (Vietnamese)
Currently translated at 56.2% (1504 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/vi/
2021-11-04 10:21:35 +00:00
Jim
6c74fec0fa Translated using Weblate (Vietnamese)
Currently translated at 56.1% (1500 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/vi/
2021-11-04 10:20:07 +00:00
Linerly
fdcad764d2 Translated using Weblate (Indonesian)
Currently translated at 100.0% (2672 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/id/
2021-11-04 10:19:59 +00:00
waclaw66
5d013b0433 Translated using Weblate (Czech)
Currently translated at 100.0% (2672 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/
2021-11-04 10:19:59 +00:00
Adam Brown
432d4801c9 removing unused import 2021-11-04 10:12:24 +00:00
Adam Brown
036a81d60b extending from the vector service to avoid extra service boilerplate 2021-11-04 09:47:16 +00:00
Adam Brown
48678382ba adding new copy for the foreground listening notification 2021-11-04 09:45:59 +00:00
Adam Brown
c173adb783 removing google play background task starting, we should rely on play services 2021-11-04 09:45:59 +00:00
Adam Brown
a6eadfe894 removing unused starter field 2021-11-04 09:45:59 +00:00
Adam Brown
006ad10392 removing extra blank line 2021-11-04 09:45:59 +00:00
Adam Brown
b418756727 adding changelog entry 2021-11-04 09:45:59 +00:00
Adam Brown
b1afc26d65 using start_redeliver_intent to allow the system to restart killed sync services
- memory restricted devices may have the sync service destroyed whilst in progress causing future sync to no longer be scheduled
2021-11-04 09:45:59 +00:00
Adam Brown
ace9f89569 always trigger guard service start when a session is activated
- fixes missing guard after login
2021-11-04 09:45:59 +00:00
Adam Brown
c14ffefe7c updating background sync function docs with more information 2021-11-04 09:45:59 +00:00
Adam Brown
56d5a38e80 reverting parts of the rapid periodic sync, unfortunately it suffers from the same issue as the one shot workers -
the system can ignore them if the application process is in the background
2021-11-04 09:45:59 +00:00
Adam Brown
71b27bfd5d making the guard service a noop, lifeline scheduling will be brought back if we confirm the service by itself is not enough
- reuses the sync foreground notification for the guard foreground service
2021-11-04 09:45:59 +00:00
Marcel Langner
c6b942cd31 fixed ktlint complaining and errors in italian translation file 2021-11-04 09:45:59 +00:00
Marcel Langner
97b4fd69b4 fixed typo 2021-11-04 09:45:59 +00:00
Marcel Langner
e14fb16db2 initial commit of a permanent GuardService for fdroid background syncing 2021-11-04 09:45:59 +00:00
Andrew Aylett
d261dd705d Periodic sync to re-kick-off rapid sync 2021-11-04 09:45:59 +00:00
Ihor Hordiichuk
e6b359c7f7 Translated using Weblate (Ukrainian)
Currently translated at 91.6% (2449 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
2021-11-03 19:25:44 +00:00
Dinh Quang Tuyen
32d3136e02 Translated using Weblate (Vietnamese)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/vi/
2021-11-03 19:25:44 +00:00
Benoit Marty
d13e30b3be Merge pull request #4403 from vector-im/feature/adm/devo-submit-tint
Fixing missing dev tools light mode send button
2021-11-03 18:59:46 +01:00
Adam Brown
2c39635734 adding changelog entry 2021-11-03 16:13:40 +00:00
Adam Brown
06d4ee9df8 adding missing tints to the dev tools toolbar 2021-11-03 16:12:39 +00:00
Glandos
fcecdfce85 Translated using Weblate (French)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/fr/
2021-11-02 14:25:44 +00:00
waclaw66
2eba5f1f4d Translated using Weblate (Czech)
Currently translated at 100.0% (2672 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/cs/
2021-11-02 14:25:43 +00:00
Benoit Marty
3760401b10 Merge pull request #4353 from SpiritCroc/video-compression
Fix broken video compression due to NPE in library
2021-11-02 13:28:52 +01:00
Benoit Marty
d1294f9a71 Merge pull request #4380 from vector-im/feature/adm/key-request
Key request screen crash on launch
2021-11-02 10:53:09 +01:00
Adam Brown
da3372af96 removing changelog entry
the crash had not been included in a released build
2021-11-02 09:00:36 +00:00
Benoit Marty
23a8ac6231 Merge pull request #4381 from vector-im/feature/adm/looping-call-ringtones
Force call ringtones to loop
2021-11-02 09:59:56 +01:00
Benoit Marty
26f8f5d1fb Merge pull request #4379 from vector-im/feature/adm/sso-ordering
Sorting social providers by priority
2021-11-02 09:53:32 +01:00
Benoit Marty
b450102f2a Merge pull request #4372 from vector-im/dependabot/gradle/com.google.firebase-firebase-messaging-23.0.0
Bump firebase-messaging from 22.0.0 to 23.0.0
2021-11-02 09:51:38 +01:00
Florian Renaud
1971652ff0 Merge pull request #4369 from vector-im/feature/fre/fix_permalink_handling
Fix permalink handling
2021-11-02 09:36:00 +01:00
Adam Brown
5bda79802f adding changelog entry 2021-11-01 14:42:39 +00:00
Adam Brown
66737c6ec9 looping the call ringtones instead of relying on the ringtone to contain looping metadata 2021-11-01 14:41:25 +00:00
SpiritCroc
c568595817 Video compression error logging: code style 2021-11-01 14:51:53 +01:00
Adam Brown
c261340939 adding changelog entry 2021-11-01 12:38:42 +00:00
Adam Brown
3e982601ac adding changelog entry 2021-11-01 12:37:33 +00:00
Adam Brown
e75c5a6b9a adding missing view model provision 2021-11-01 12:35:09 +00:00
Adam Brown
1c9f1808ba sorting the social providers by their defined priority 2021-11-01 12:13:50 +00:00
Jonas
0aa0858921 Translated using Weblate (Danish)
Currently translated at 18.1% (486 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/da/
2021-10-31 19:25:42 +00:00
Zet
44068304e0 Translated using Weblate (Arabic)
Currently translated at 39.1% (1046 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ar/
2021-10-30 16:25:42 +00:00
dependabot[bot]
959e6b67e3 Bump firebase-messaging from 22.0.0 to 23.0.0
Bumps firebase-messaging from 22.0.0 to 23.0.0.

---
updated-dependencies:
- dependency-name: com.google.firebase:firebase-messaging
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-29 23:07:15 +00:00
Florian Renaud
13dc0e0c11 Add towncrier 2021-10-29 18:49:18 +02:00
Florian Renaud
1341094545 Fix permalink handling
whole link base url was compared to supported hosts instead of the host part only
2021-10-29 17:13:37 +02:00
Benoit Marty
0d6e8bdeb3 Merge pull request #4357 from vector-im/dependabot/gradle/dagger-2.40
Bump dagger from 2.39.1 to 2.40
2021-10-29 11:47:52 +02:00
Benoit Marty
d36f01242a Merge pull request #4366 from vector-im/feature/adm/emoji-rotation-crash
Fixing timeline crash when rotating emoji picker
2021-10-29 09:01:25 +02:00
Adam Brown
6d41f89fe7 adding changelog entry 2021-10-28 19:32:29 +01:00
Adam Brown
e12d8c30d8 fixing timeline crash when rotating with the emoji window open
- guarding the emoji popup dismiss callback with a started lifecycle state
- the emoji popup dismiss callback also triggers onViewDetachedFromWindow which does not always finish before onDestroyView
2021-10-28 19:23:36 +01:00
Benoit Marty
dd6ac46659 Merge pull request #4362 from vector-im/feature/adm/zxing-downgrade
< Android 7.0 QR code scanning crashes
2021-10-28 17:58:31 +02:00
Adam Brown
3ea61c94f2 adding changelog entry 2021-10-28 16:25:42 +01:00
Adam Brown
79de7be141 letting dependabot ignore the zxing dependency, it appears the author does not intend to support older versions of android in the new versions of the library 2021-10-28 16:21:17 +01:00
Adam Brown
73995eb7bd downgrading zxing library as it has a known crash on android versions below 7.0 2021-10-28 16:18:34 +01:00
Benoit Marty
c22d3fbedc Merge pull request #4355 from vector-im/feature/adm/timeline-disk-usage
Reducing timeline disk usage
2021-10-28 15:16:27 +02:00
Adam Brown
23f8d05522 removing redundant exists() checks, mkdirs already does this 2021-10-28 13:35:39 +01:00
Benoit Marty
868548d0ab Merge pull request #4352 from vector-im/feature/adm/room-filtering
Fixing case sensitive non latin room name filtering
2021-10-28 12:27:13 +02:00
Benoit Marty
2ce4d8d84f Merge pull request #4354 from vector-im/feature/bma/shortcut_fixes
Shortcut fixes
2021-10-28 10:13:02 +02:00
Benoit Marty
34e8cf84dc Improve Rx sequence regarding listener 2021-10-28 09:41:27 +02:00
Nikita Epifanov
9276f99a8e Translated using Weblate (Russian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/ru/
2021-10-28 07:25:44 +00:00
Nikita Epifanov
c6eba1178d Translated using Weblate (Russian)
Currently translated at 100.0% (2672 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ru/
2021-10-28 07:25:43 +00:00
p_0g_8mm3_
fbffddec77 Translated using Weblate (German)
Currently translated at 98.8% (2642 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2021-10-28 07:25:42 +00:00
libexus
adeafdace3 Translated using Weblate (German)
Currently translated at 98.8% (2642 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2021-10-28 07:25:42 +00:00
dependabot[bot]
5d9e94f250 Bump dagger from 2.39.1 to 2.40
Bumps `dagger` from 2.39.1 to 2.40.

Updates `hilt-android-gradle-plugin` from 2.39.1 to 2.40
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.39.1...dagger-2.40)

Updates `dagger` from 2.39.1 to 2.40
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.39.1...dagger-2.40)

Updates `dagger-compiler` from 2.39.1 to 2.40
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.39.1...dagger-2.40)

Updates `hilt-android` from 2.39.1 to 2.40
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.39.1...dagger-2.40)

Updates `hilt-compiler` from 2.39.1 to 2.40
- [Release notes](https://github.com/google/dagger/releases)
- [Changelog](https://github.com/google/dagger/blob/master/CHANGELOG.md)
- [Commits](https://github.com/google/dagger/compare/dagger-2.39.1...dagger-2.40)

---
updated-dependencies:
- dependency-name: com.google.dagger:hilt-android-gradle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.dagger:dagger
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.dagger:dagger-compiler
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.dagger:hilt-android
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: com.google.dagger:hilt-compiler
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-27 23:07:36 +00:00
Adam Brown
8525925732 lazily creating the voice directory references, avoid eagerly reading the file on the main thread 2021-10-27 18:23:39 +01:00
Adam Brown
c2ce10f89c delaying working dir creation to when its needed, lazy is sychronised by default 2021-10-27 18:23:25 +01:00
Adam Brown
8d668cc118 avoiding redundant session id filesDir opening, this provision is called multiple times each time we open a room 2021-10-27 18:23:16 +01:00
Adam Brown
d344be5088 adding changelog entry 2021-10-27 16:44:39 +01:00
Adam Brown
63e9e07d5e using correct license for matrix-sdk test 2021-10-27 16:42:35 +01:00
Adam Brown
611bf29ebe extending the room name resolved to create a dedicated room name data class which contains a normalized version of the room name 2021-10-27 15:25:05 +01:00
Benoit Marty
6691edb59d Remove shortcut as soon as a PIN code is set 2021-10-27 16:17:53 +02:00
Adam Brown
9949779b62 ensuring the store migration class is always equal to other store migration instances
- is needed as realm will throw if multiple migration instances are created and they don't match
2021-10-27 15:01:26 +01:00
Adam Brown
540036f83c removing extra query definition by chaining the query creation with modifiers 2021-10-27 14:36:26 +01:00
Adam Brown
7b356484ae removing noisy log which duplicates a type clause and fixing when casing formatting to have a case per line 2021-10-27 14:34:40 +01:00
Adam Brown
e7a0a4d4ae documenting the different query cases 2021-10-27 14:33:01 +01:00
Adam Brown
dbb4a87784 making the isNormalized function an extension and internal to the sdk 2021-10-27 14:26:51 +01:00
Benoit Marty
3a48e33c81 Cache immutable value 2021-10-27 15:26:31 +02:00
Benoit Marty
6f577d8232 Do not show shortcuts if a PIN code is set 2021-10-27 15:24:24 +02:00
SpiritCroc
076820bb10 Fix broken video compression due to NPE in library
Library issue: https://github.com/natario1/Transcoder/issues/154

Possibly fixes
https://github.com/vector-im/element-android/issues/4337

Also add some logging for failures.
2021-10-27 15:24:17 +02:00
Benoit Marty
3a81c10062 Remove (disable) shortcut if a room is left 2021-10-27 15:13:07 +02:00
Benoit Marty
f166348a68 Ensure ShortcutsHandler get all the joined rooms #4168 2021-10-27 15:00:14 +02:00
Benoit Marty
76314b9d87 Add sortOrder: RoomSortOrder parameter, with no API break 2021-10-27 15:00:14 +02:00
Benoit Marty
9b75da5d4d Clean code 2021-10-27 15:00:14 +02:00
Adam Brown
4ae04fc297 adding normalised room display name field and making use of it when filtering rooms by name
- fixes non latin-1 character set room names from being ignored when searching with inexact casing
2021-10-27 13:09:53 +01:00
Adam Brown
d5ed95988d adding normalisation to the query string cases 2021-10-27 12:46:17 +01:00
Adam Brown
2681601d35 making value processing an injectable class, it will need to have its own dependencies to support normalisation 2021-10-27 12:30:23 +01:00
Adam Brown
72508c61d9 porting QueryStringValue to sealed interface with a sub category for the content based values
- allows for handling those cases separately for normalisation
2021-10-27 12:19:49 +01:00
Benoit Marty
54daee2798 Merge pull request #4347 from vector-im/dependabot/gradle/com.googlecode.libphonenumber-libphonenumber-8.12.36
Bump libphonenumber from 8.12.35 to 8.12.36
2021-10-27 10:07:24 +02:00
Danial Behzadi
ede8933059 Translated using Weblate (Persian)
Currently translated at 100.0% (2672 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/fa/
2021-10-26 23:25:49 +00:00
Ihor Hordiichuk
5c4ac897c1 Translated using Weblate (Ukrainian)
Currently translated at 91.6% (2448 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/uk/
2021-10-26 23:25:49 +00:00
libexus
abd83f3d7c Translated using Weblate (German)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/de/
2021-10-26 23:25:48 +00:00
Danial Behzadi
86d651be60 Translated using Weblate (Persian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/fa/
2021-10-26 23:25:47 +00:00
Jeff Huang
d969549ce6 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hant/
2021-10-26 23:25:46 +00:00
random
188e0dbec7 Translated using Weblate (Italian)
Currently translated at 99.8% (2669 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/it/
2021-10-26 23:25:45 +00:00
random
f6f4cec947 Translated using Weblate (Italian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/it/
2021-10-26 23:25:45 +00:00
libexus
93ed2dcbbf Translated using Weblate (German)
Currently translated at 97.8% (2615 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/de/
2021-10-26 23:25:44 +00:00
DUCKCHI
66198805ca Translated using Weblate (Korean)
Currently translated at 49.6% (1326 of 2672 strings)

Translation: Element Android/Element Android App
Translate-URL: https://translate.element.io/projects/element-android/element-app/ko/
2021-10-26 23:25:43 +00:00
dependabot[bot]
82b3d17db6 Bump libphonenumber from 8.12.35 to 8.12.36
Bumps [libphonenumber](https://github.com/google/libphonenumber) from 8.12.35 to 8.12.36.
- [Release notes](https://github.com/google/libphonenumber/releases)
- [Changelog](https://github.com/google/libphonenumber/blob/master/making-metadata-changes.md)
- [Commits](https://github.com/google/libphonenumber/compare/v8.12.35...v8.12.36)

---
updated-dependencies:
- dependency-name: com.googlecode.libphonenumber:libphonenumber
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-10-26 23:08:52 +00:00
Adam Brown
fe9dde5a14 Merge pull request #4274 from vector-im/feature/adm/notification-redesign
Notifications redesign
2021-10-26 20:42:00 +01:00
Adam Brown
124061e1db adding changelog entry 2021-10-26 20:03:10 +01:00
Adam Brown
6d9877d79c filtering out redacted simple message events, we handle them by updating the notifications 2021-10-26 20:03:10 +01:00
Adam Brown
a5fe6f7212 removing redacted events from the room notification message list 2021-10-26 20:03:10 +01:00
Adam Brown
b146501f29 avoiding multiple list iterations via mapNotNull 2021-10-26 20:03:10 +01:00
Benoit Marty
be67836a3e Tiny formatting 2021-10-26 20:03:10 +01:00
Benoit Marty
2bd2cbf84e Compact code 2021-10-26 20:03:10 +01:00
Benoit Marty
c56101d227 Do not use the room member avatar as a room avatar 2021-10-26 20:03:10 +01:00
Adam Brown
e8bd27e785 adding changelog entries 2021-10-26 20:03:10 +01:00
Adam Brown
743a71c78d renaming event lists to give more context and remove the list suffix/inconsistencies 2021-10-26 20:03:10 +01:00
Adam Brown
d1f6db4236 using dedicated ProcessedEvent data class instead of type alias for passing around the process notificatiable events
- also includes @JvmName on all conflicting extensions for consistency
2021-10-26 20:03:10 +01:00
Adam Brown
d3234b33d3 increase enum class allowance by 1 2021-10-26 20:03:10 +01:00
Adam Brown
63090ef681 updating tests with shortcut placement changes 2021-10-26 20:03:10 +01:00
Adam Brown
6fb7faa360 removing unused imports 2021-10-26 20:03:10 +01:00
Adam Brown
a6e47d8b85 replacing notification utils usage with the displayer and removing unused method 2021-10-26 20:03:10 +01:00
Adam Brown
c16e3e09e6 adding missing parameter from rebase and removing no longer needed singleton annotation 2021-10-26 20:03:10 +01:00
Adam Brown
4748a385ea inlining single use extension functions 2021-10-26 20:03:10 +01:00
Adam Brown
86ce6a404e adding missing fixture parameter from rebase 2021-10-26 20:03:10 +01:00
Adam Brown
9fa09def96 fixing line lengths 2021-10-26 20:03:10 +01:00
Adam Brown
4bbb637ace adding documentation around the two notifiable event lists which act as our notification source of truth 2021-10-26 20:03:10 +01:00
Adam Brown
c67b9ee81e ensuring that we remove read messages when they come through by respecting the processed type when creating the notifications 2021-10-26 20:03:10 +01:00
Adam Brown
0bdc65b47f diffing the notification events against the currently rendered events allow us to dismiss notifications from removed events 2021-10-26 20:03:10 +01:00
Adam Brown
b27fb264fc using a process state of keep/removed rather than mapping to an ignored event id
- this state will be used to diff the currently rendered events against the new ones
2021-10-26 20:03:10 +01:00
Adam Brown
b7b4c01bde splitting the event processing from the rendering
- this allows us to only synchronise of the event list modifications rather than the entire notification creation/rendering which should in turn reduce some of our ANRs https://github.com/vector-im/element-android/issues/4214
2021-10-26 20:03:10 +01:00
Adam Brown
587466e009 relying on the notification refreshing to cancel/update the notifications 2021-10-26 20:03:10 +01:00
Adam Brown
03fe45da60 ensuring that we removing the summary group before removing individual notifications
- adds some comments to explain the positioning
2021-10-26 20:03:10 +01:00
Adam Brown
a94a1a0523 formatting 2021-10-26 20:03:10 +01:00
Adam Brown
8fb6bef503 removing this usages for project convention 2021-10-26 20:03:10 +01:00
Adam Brown
0d316e69de handling creating the summary when notification events are filtered to empty due to only containing removals 2021-10-26 20:03:10 +01:00
Adam Brown
3d567d0dcd removing no longer needed hasBeenDisplayed state, the eventList is our source of truth
- when events have finished being displayed they should be removed from the eventList via notification delete actions
2021-10-26 20:03:10 +01:00
Adam Brown
c85afa96d3 lifting settings change to cancel all notifications out of the renderer
- the renderer's responsibility it handling events
2021-10-26 20:03:10 +01:00
Adam Brown
3023cb4d39 chaining the event process, notification creation and display logic into a NotificationRender
- extract the displaying into its own class to avoid leaking the entire notificationutils
- cancel/display notification actions are completely driven by the event or abscense of event from the eventList
- attempts to avoid redundant render passes by checking if the eventList has changed since the last render
2021-10-26 20:03:10 +01:00
Adam Brown
0f4ec65b7a creating the notifications separate to where they're displayed
- also handles when the event diff means the notifications should be removed
2021-10-26 20:03:10 +01:00
Adam Brown
7b0c483134 creating dedicated class for the processing the serialized events
- updates the logic to track when events are removed as a way for the notifications to remove themselves, null events mean they've been removed
2021-10-26 20:03:10 +01:00
Adam Brown
4459aab558 making the event body non null and immutable to allow less cases to be handled -
also puts in the basis for a separate notification refreshing implementation
2021-10-26 20:03:10 +01:00
Adam Brown
6cc6cc58f0 adding changelog entry 2021-10-26 20:03:10 +01:00
Adam Brown
beff5ab821 including the room name in the invitation event if the room sumary is available 2021-10-26 20:03:10 +01:00
Adam Brown
56e2b79774 formatting 2021-10-26 20:03:10 +01:00
Adam Brown
86b500445f updating the push gateway property to reflect that it mean the event can be replaced
- makes the property immutable as only the creation of the event knows if it can be replace eg it came from a push or the /sync event stream
2021-10-26 20:03:10 +01:00
Adam Brown
b44a382893 separating the mutable vars from the immutable ones, they'll be removed or made immutable by the notification redesign 2021-10-26 20:03:10 +01:00
Adam Brown
db5d4ead38 making the noisy property immutable 2021-10-26 20:03:10 +01:00
Adam Brown
c99dd4a615 making the isRedacted event property immutable
- also makes the notifiable events sealed interfaces so that we can copy the data classes with new redacted values when it changes
2021-10-26 20:03:10 +01:00
Adam Brown
89d643a4be removing unused property (written to but never read) 2021-10-26 20:03:10 +01:00
Adam Brown
81da185d8b making non overriden properties immutable by passing the values intro the constructor 2021-10-26 20:03:10 +01:00
Adam Brown
51f7dee952 removing non common properties form the base event 2021-10-26 20:03:10 +01:00
Adam Brown
67211605aa removing unused commented code 2021-10-26 20:03:10 +01:00
Adam Brown
1c0d69674d moving is invitation help to the event file 2021-10-26 20:03:10 +01:00
Adam Brown
37a7d449ae moving invitiation joined event filtering to the existing mapNotNull chain to avoid another list creation 2021-10-26 20:03:10 +01:00
Adam Brown
0c809b5ed1 now that we ignore duplicated invite joined events at the source we can avoid eager notification cancels and rely on the main notification refresh flow 2021-10-26 20:03:10 +01:00
Adam Brown
e95d49a3ae avoiding dispatching invitation accepted events
- we only want to notify users when they receive an invititation, not when they've accepted it
2021-10-26 20:03:10 +01:00
Benoit Marty
109a5a6664 Merge pull request #4332 from vector-im/feature/bma/do_not_inject_default
DI: Use interfaces instead of implementation
2021-10-26 20:45:13 +02:00
Benoit Marty
a19999a717 Merge pull request #4345 from vector-im/feature/adm/unable-to-join-by-name
Unable to join room by name
2021-10-26 19:35:44 +02:00
Benoit Marty
31abf44d0e Merge pull request #4346 from vector-im/feature/bma/login_custom
Add API `LoginWizard.loginCustom(data: JsonDict): Session`
2021-10-26 19:28:30 +02:00
Benoit Marty
1d8a4a923a Merge pull request #4344 from vector-im/feature/bma/device_id_param
Add optional deviceId to the login API
2021-10-26 19:24:09 +02:00
Adam Brown
272baa52ec adding remaining activity missing hilt injection annotations 2021-10-26 17:56:22 +01:00
Benoit Marty
e8ccae8cd0 Add API LoginWizard.loginCustom(data: JsonDict): Session to be able to login to a homeserver using arbitrary request content 2021-10-26 18:38:15 +02:00
Adam Brown
4361926075 adding changelog entry 2021-10-26 17:22:26 +01:00
Adam Brown
881157a725 applying the room navigation interceptor to only the room activity navigation, not the bottomsheets
- the bottomsheets require the activity to stay around as they host the sheet instance, fixes missing join sheets
2021-10-26 17:15:19 +01:00
Adam Brown
49c969601d adding missing bottomsheet handling for displaying the join room sheet when linking from the public rooms
- the activity is still finished causing the popup to not actually display
2021-10-26 17:14:24 +01:00
Benoit Marty
01a29f67d0 Version++ 2021-10-26 17:33:23 +02:00
Benoit Marty
8ac48b903a Merge branch 'hotfix/1.3.6' into develop 2021-10-26 17:31:10 +02:00
Benoit Marty
eb66a51891 Merge branch 'hotfix/1.3.6'
Conflicts:
	vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt
2021-10-26 17:30:39 +02:00
Benoit Marty
6c485d5f6e Merge hotfix 1.3.6 2021-10-26 17:23:33 +02:00
Adam Brown
792444d1ac adding missing hilt annotation for injectable activity 2021-10-26 16:23:32 +01:00
Benoit Marty
0236396c59 Add optional deviceId to the login API 2021-10-26 15:10:04 +02:00
Benoit Marty
d0f226dcd1 Bind identity service 2021-10-25 15:47:17 +02:00
Benoit Marty
363ae79378 DI: Use interfaces instead of implementation 2021-10-25 15:32:27 +02:00
Benoit Marty
f2c22c1985 Merge pull request #4192 from vector-im/yostyle/cipher_suites
Limit supported TLS versions and cipher suites
2021-10-25 13:07:21 +02:00
Benoit Marty
3354cd1760 Merge pull request #4312 from vector-im/feature/fga/hilt_app_migration
Migrate App DI framework to Hilt
2021-10-25 12:41:02 +02:00
Benoit Marty
79d56319b7 Version++ 2021-10-25 12:40:24 +02:00
Benoit Marty
90eee339a3 Merge branch 'release/1.3.5' into develop 2021-10-25 12:39:10 +02:00
Besnik Bleta
d4b010bad7 Translated using Weblate (Albanian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sq/
2021-10-24 22:25:48 +00:00
Linerly
ff04337e04 Translated using Weblate (Indonesian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/id/
2021-10-24 22:25:47 +00:00
waclaw66
91500dc7cb Translated using Weblate (Czech)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/cs/
2021-10-24 22:25:46 +00:00
Priit Jõerüüt
359b8e2158 Translated using Weblate (Estonian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/et/
2021-10-24 22:25:45 +00:00
sr093906
63ca323d92 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/zh_Hans/
2021-10-24 22:25:44 +00:00
Ihor Hordiichuk
028d318246 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/uk/
2021-10-24 22:25:43 +00:00
LinAGKar
7e4a115bfb Translated using Weblate (Swedish)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/sv/
2021-10-24 22:25:42 +00:00
lvre
cc96c0398d Translated using Weblate (Portuguese (Brazil))
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/pt_BR/
2021-10-24 22:25:41 +00:00
Szimszon
9ed8d5b22e Translated using Weblate (Hungarian)
Currently translated at 100.0% (35 of 35 strings)

Translation: Element Android/Element Android Store
Translate-URL: https://translate.element.io/projects/element-android/element-store/hu/
2021-10-24 22:25:40 +00:00
ganfra
e1f4e4f934 Hilt: fix test 2021-10-22 18:38:48 +02:00
ganfra
c87d276f8a Hilt: fix fdroid 2021-10-22 18:09:14 +02:00
ganfra
e6e8c7f7d1 Hilt: clean code and add changelog 2021-10-22 12:41:06 +02:00
ganfra
e9b58844b3 Merge branch 'develop' into feature/fga/hilt_app_migration 2021-10-22 11:30:49 +02:00
ganfra
d89264ff77 Hilt: add small migration guide 2021-10-22 11:30:21 +02:00
ganfra
b6501ce7b2 Hilt: continue cleaning up 2021-10-22 11:30:09 +02:00
ganfra
d724504662 Hilt: finish migration of latest view models 2021-10-21 20:17:49 +02:00
ganfra
ac1e4e9e9c Hilt: remove usage of ScreenComponent 2021-10-21 10:10:59 +02:00
ganfra
188b4887ba Hilt: continue migrating activities 2021-10-20 18:06:57 +02:00
ganfra
92cd79c550 Hilt: migrate activities 2021-10-19 18:53:17 +02:00
ganfra
bb68e735f7 Hilt: continue migration VM 2021-10-19 17:31:56 +02:00
ganfra
1d73077184 Hilt: continue migration VM 2021-10-18 18:54:30 +02:00
ganfra
968c2e70d2 Hilt: continue migration VM 2021-10-15 19:06:18 +02:00
ganfra
9dd7017131 Hilt: continue migration 2021-10-15 12:49:29 +02:00
ganfra
f8d208fb4f Hilt: introduce MavericksComponent and try on RoomList 2021-10-15 10:27:45 +02:00
ganfra
ff53cf4db9 Hilt: replace the VectorComponent 2021-10-14 18:47:28 +02:00
yostyle
cbcb620ad1 Limit supported cipher suites 2021-10-08 18:16:27 +02:00
428 changed files with 4873 additions and 3826 deletions

View File

@@ -18,6 +18,5 @@ updates:
open-pull-requests-limit: 200
reviewers:
- "bmarty"
### ignore:
### - dependency-name: com.squareup.okhttp3:logging-interceptor
### versions: "> 3.12.10"
ignore:
- dependency-name: com.google.zxing:core

View File

@@ -1,3 +1,39 @@
Changes in Element v1.3.7 (2021-11-04)
======================================
Features ✨
----------
- Adding the room name to the invitation notification (if the room summary is available) ([#582](https://github.com/vector-im/element-android/issues/582))
- Updating single sign on providers ordering to match priority/popularity ([#4277](https://github.com/vector-im/element-android/issues/4277))
Bugfixes 🐛
----------
- Stops showing a dedicated redacted event notification, the message notifications will update accordingly ([#1491](https://github.com/vector-im/element-android/issues/1491))
- Fixes marking individual notifications as read causing other notifications to be dismissed ([#3395](https://github.com/vector-im/element-android/issues/3395))
- Fixing missing send button in light mode dev tools - send * event ([#3674](https://github.com/vector-im/element-android/issues/3674))
- Fixing room search needing exact casing for non latin-1 character named rooms ([#3968](https://github.com/vector-im/element-android/issues/3968))
- Fixing call ringtones only playing once when the ringtone doesn't contain looping metadata (android 9.0 and above) ([#4047](https://github.com/vector-im/element-android/issues/4047))
- Tentatively fixing the doubled notifications by updating the group summary at specific points in the notification rendering cycle ([#4152](https://github.com/vector-im/element-android/issues/4152))
- Do not show shortcuts if a PIN code is set ([#4170](https://github.com/vector-im/element-android/issues/4170))
- Fixes being unable to join rooms by name ([#4255](https://github.com/vector-im/element-android/issues/4255))
- Fixing missing F-Droid notifications when in background due to background syncs not triggering ([#4298](https://github.com/vector-im/element-android/issues/4298))
- Fix video compression before upload ([#4353](https://github.com/vector-im/element-android/issues/4353))
- Fixing QR code crashes caused by a known issue in the zxing library for older versions of android by downgrading to 3.3.3 ([#4361](https://github.com/vector-im/element-android/issues/4361))
- Fixing timeline crash when rotating with the emoji window open ([#4365](https://github.com/vector-im/element-android/issues/4365))
- Fix handling of links coming from web instance reported as malformed by mistake ([#4369](https://github.com/vector-im/element-android/issues/4369))
SDK API changes ⚠️
------------------
- Add API `LoginWizard.loginCustom(data: JsonDict): Session` to be able to login to a homeserver using arbitrary request content ([#4266](https://github.com/vector-im/element-android/issues/4266))
- Add optional deviceId to the login API ([#4334](https://github.com/vector-im/element-android/issues/4334))
Other changes
-------------
- Migrate app DI framework to Hilt ([#3888](https://github.com/vector-im/element-android/issues/3888))
- Limit supported TLS versions and cipher suites ([#4192](https://github.com/vector-im/element-android/issues/4192))
- Fixed capitalisation of text on initial sync screen ([#4292](https://github.com/vector-im/element-android/issues/4292))
Changes in Element v1.3.6 (2021-10-26)
======================================

View File

@@ -17,6 +17,7 @@ buildscript {
// https://developer.android.com/studio/releases/gradle-plugin
classpath libs.gradle.gradlePlugin
classpath libs.gradle.kotlinPlugin
classpath libs.gradle.hiltPlugin
classpath 'com.google.gms:google-services:4.3.10'
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.4'

View File

@@ -11,7 +11,7 @@ def gradle = "7.0.3"
// Ref: https://kotlinlang.org/releases.html
def kotlin = "1.5.31"
def kotlinCoroutines = "1.5.2"
def dagger = "2.39.1"
def dagger = "2.40"
def retrofit = "2.9.0"
def arrow = "0.8.2"
def markwon = "4.6.2"
@@ -34,7 +34,9 @@ def androidxTest = "1.4.0"
ext.libs = [
gradle : [
'gradlePlugin' : "com.android.tools.build:gradle:$gradle",
'kotlinPlugin' : "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin"
'kotlinPlugin' : "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin",
'hiltPlugin' : "com.google.dagger:hilt-android-gradle-plugin:$dagger"
],
jetbrains : [
'coroutinesCore' : "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinCoroutines",
@@ -72,7 +74,9 @@ ext.libs = [
],
dagger : [
'dagger' : "com.google.dagger:dagger:$dagger",
'daggerCompiler' : "com.google.dagger:dagger-compiler:$dagger"
'daggerCompiler' : "com.google.dagger:dagger-compiler:$dagger",
'hilt' : "com.google.dagger:hilt-android:$dagger",
'hiltCompiler' : "com.google.dagger:hilt-compiler:$dagger"
],
squareup : [
'moshi' : "com.squareup.moshi:moshi-adapters:$moshi",

33
docs/hilt_migration.md Normal file
View File

@@ -0,0 +1,33 @@
Useful links:
- https://dagger.dev/hilt/migration-guide
- https://dagger.dev/hilt/quick-start
Hilt is built on top of Dagger 2 and simplify usage by removing needs to create components manually.
When you create a new feature, you should have the following:
Annotate your Activity with @AndroidEntryPoint
If you have a BottomSheetFragment => Annotate it with @AndroidEntryPoint
Otherwise => Add your Fragment to the FragmentModule
Add your ViewModel.Factory to the MavericksViewModelModule
Makes sure your ViewModel as the following code:
```
@AssistedFactory
interface Factory: MavericksAssistedViewModelFactory<MyViewModel, MyViewState> {
override fun create(initialState: MyViewState): MyViewModel
}
companion object : MavericksViewModelFactory<MyViewModel, MyViewState> by hiltMavericksViewModelFactory()
```
## Some remarks
@MavericksViewModelScope dependencies can't be injected inside Fragments/Activities
You can only inject @Singleton, @MavericksViewModelScope or unscoped dependencies inside Maverick ViewModels
You can access some specific dependencies from Singleton component by using
```
context.singletonEntryPoint()
```
Be aware that only the app has been migrated to Hilt and not the SDK.

View File

@@ -0,0 +1,2 @@
Hlavní změny v této verzi: Přidání podpory přítomnosti pro místnost s přímými zprávami (poznámka: přítomnost je na matrix.org zakázána). Opět přidána podpora Android Auto.
Úplný seznam změn: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Hauptänderungen: Organisiere deine Räume mit Spaces!
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.0

View File

@@ -0,0 +1,2 @@
Hauptänderungen: Organisiere deine Räume mit Spaces, Crash aus 1.3.0 gefixt.
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.1

View File

@@ -0,0 +1,2 @@
Hauptänderungen: Unterstützung für Android Auto, Viele Fehlerbehebungen
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.2

View File

@@ -0,0 +1,2 @@
Hauptänderungen: Bedingungen des Identitätsservers in Einstellungen anzeigen. Unterstützung für Android Auto temporär entfernt.
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.3

View File

@@ -0,0 +1,4 @@
Hauptänderungen:
- Anwesenheiten in Direktnachrichten anzeigen (Momentan auf Matrix.org deaktiviert)
- Android Auto wird wieder unterstützt
Alle Änderungen: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -37,3 +37,6 @@ Kurznachrichten, Sprach- und Videoanrufe, Dateifreigaben, Bildschirmübertragung
<b>Da Weitermachen, wo Sie aufgehört haben</b>
Bleiben Sie in Kontakt, egal wo Sie sind, mit vollständig synchronisiertem Nachrichtenverlauf quer über all Ihre Geräte und im Netz auf https://app.element.io
<b>Open source</b>
Element ist ein Open-Source-Projekt und wird auf GitHub gehostet. Solltest du Fehler in Element finden, melde diese bitte hier: https://github.com/vector-im/element-android

View File

@@ -0,0 +1,2 @@
Main changes in this version: Bug fixes mainly regarding the notifications.
Full changelog: https://github.com/vector-im/element-android/releases/tag/v1.3.7

View File

@@ -0,0 +1,2 @@
Põhilised muutused selles versioonis: Lisasime otsevestlustele kasutaja võrguolekute toe (matrix.org puhul on välja lülitatud) ja uuesti lisasime Android Auto toe.
Kogu ingliskeelne muudatuste logi: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
تغییرات اصلی در این نگارش: افزودن پشتیبانی حضور برای اتاق پیام خصوصی (توجه: حضور روی matrix.org از کار افتاده است). افزودن دوبارهٔ پشتیبانی اندروید خودرو.
گزارش دگرگونی کامل: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Principaux changements pour cette version : ajout du support pour les indicateurs de présence, dans les conversations privées (attention : les indicateurs de présence sont désactivés sur matrix.org). Réactivation de la prise en charge de Android Auto.
Intégralité des changements : https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Fő változás ebben a verzióban: Állapot állítási lehetőség közvetlen beszélgetéseknél (megj.: a matrix.org-on az állapot jelzés ki van kapcsolva). Újra elérhető az Android Auto.
Teljes változásnapló: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Perubahan utama di versi ini: Menambahkan dukungan presensi, untuk ruangan Pesan Langsung (diingat bahwa presensi dinonaktifkan di matrix.org). Menambahkan lagi dukungan Android Auto.
Changelog lanjutan: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Modifiche principali in questa versione: aggiunto supporto alla presenza per messaggi diretti (nota: la presenza è disattivata su matrix.org). Aggiunto di nuovo il supporto ad Android Auto.
Cronologia completa: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Principais mudanças nesta versão: Adicionar suporte a Presença, para sala de Mensagem Direta (nota: presença está desabilitada em matrix.org). Adicionar de novo suporte a Android Auto.
Changelog completo: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Основные изменения в этой версии: Добавлена поддержка присутствия, для комнат личных сообщений (примечание: присутствие отключено на matrix.org). Снова добавлена поддержка Android Auto.
Полный список изменений: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Ndryshimet kryesore në këtë version: Shtim mbulimi për Prani, për dhomë Mesazh i Drejtpërdrejtë (shënim: në matrix.org prania është e çaktivizuar. Shtim sërish i mbulimit për Android Auto.
Regjistër i plotë ndryshimesh: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Huvudsakliga ändringar i den här versionen: Lägg till närvarostöd för direktmeddelanden (obs: närvaro är inaktiverat på matrix.org). Lägg till stöd för Android Auto igen.
Full ändringslogg: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Основні зміни в цій версії: Додано підтримку присутності для кімнати особистих повідомлень (примітка: присутність вимкнено на matrix.org. Знову додано підтримку Android Auto.
Повний журнал змін: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: xem trước URL, bàn phím Emoji mới, các khả năng cài đặt phòng mới và tuyết cho Giáng Sinh!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.0.12

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: xem trước URL, bàn phím Emoji mới, các khả năng cài đặt phòng mới và tuyết cho Giáng Sinh!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.0.13

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: chỉnh sửa quyền phòng, chủ đề Sáng/Tối tự động, và một loạt các bản sửa lỗi.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.0.14

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: hỗ trợ đăng nhập từ mạng xã hội.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.0.15

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: hỗ trợ đăng nhập từ mạng xã hội.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.0.15 và https://github.com/vector-im/element-android/releases/tag/v1.0.16

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Sửa lỗi!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.0.17

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cải tiến VoIP (các cuộc gọi thoại và video trong Tin nhắn Trực tiếp) và sửa lỗi!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.0

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cải thiện hiệu suất và sửa lỗi!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.1

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cải thiện hiệu suất và sửa lỗi!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.2

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cải thiện hiệu suất và sửa lỗi!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.3

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cải thiện hiệu suất và sửa lỗi!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.4

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: sửa lỗi nhanh cho 1.1.4
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.5

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: sửa lỗi nhanh cho 1.1.5
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.6

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: hỗ trợ beta cho Space. Nén video trước khi gửi.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.7

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Cải tiến cho Space.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.8

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: thêm hỗ trợ cho mạng gitter.im.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.9

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cập nhật chủ đề và phong cách và các tính năng mới cho Space.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.10

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cập nhật chủ đề và phong cách và các tính năng mới cho Space (sửa lỗi cho 1.1.1.0)
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.11

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: cập nhật chủ đề và phong cách và sửa lỗi sau khi gọi video
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.12

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: chủ yếu là sự ổn định và cập nhật sửa lỗi.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.13

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: sửa lỗi các tin nhắn mã hóa.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.14

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: triển khai tin nhắn thoại trong cài đặt thí nghiệm.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.15

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Sửa lỗi gửi tin nhắn mã hóa khi có ai đó trong phòng đăng xuất.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.1.16

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Tin nhắn Thoại được bật mặc định.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.2.0

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Nhiều cải tiến trong VoIP và Space (vẫn đang trong beta).
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.2.1

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Sắp xếp các phòng của bạn bằng Space!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.3.0

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Sắp xếp các phòng của bạn bằng Space! V1.3.1 khắc phục sự cố có thể xảy ra ở v1.3.0
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.3.1

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Thêm hỗ trợ Android Auto. Sửa rất nhiều lỗi!
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.3.2

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Hiển thị (các) chính sách máy chủ xác thực trong phần cài đặt. Tạm thời bỏ hỗ trợ Android Auto.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.3.3

View File

@@ -0,0 +1,2 @@
Những thay đổi chính trong phiên bản này: Thêm hỗ trợ hiển thị, cho phòng Tin nhắn Trực tiếp (lưu ý: hiển thị bị vô hiệu hóa trên matrix.org. Thêm hỗ trợ Android Auto trở lại.
Log thay đổi đầy đủ: https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,42 @@
Element vừa là một ứng dụng nhắn tin an toàn vừa là một ứng dụng cộng tác nhóm năng suất, lý tưởng cho các cuộc trò chuyện nhóm trong khi làm việc từ xa. Ứng dụng trò chuyện này sử dụng mã hóa đầu cuối để cung cấp tính năng hội nghị truyền hình, chia sẻ tệp và cuộc gọi thoại mạnh mẽ.
<b> Các tính năng của Element bao gồm: </b>
- Các công cụ giao tiếp trực tuyến tiên tiến
- Các tin nhắn được mã hóa hoàn toàn để cho phép liên lạc doanh nghiệp an toàn hơn, ngay cả đối với những người làm việc từ xa
- Trò chuyện phi tập trung dựa trên khung mã nguồn mở Matrix
- Chia sẻ tệp một cách an toàn với dữ liệu được mã hóa trong khi quản lý dự án
- Trò chuyện video với VoIP và chia sẻ màn hình
- Tích hợp dễ dàng với các công cụ cộng tác trực tuyến yêu thích của bạn, công cụ quản lý dự án, dịch vụ VoIP và các ứng dụng nhắn tin nhóm khác
Element hoàn toàn khác với các ứng dụng nhắn tin và cộng tác khác. Nó hoạt động trên Matrix, một mạng mở để nhắn tin bảo mật và giao tiếp phi tập trung. Nó cho phép tự lưu trữ để cung cấp cho người dùng quyền sở hữu và kiểm soát tối đa dữ liệu và tin nhắn của họ.
<b> Nhắn tin mã hóa và riêng tư </b>
Element bảo vệ bạn khỏi các quảng cáo không mong muốn, khai thác dữ liệu và khu vườn có tường bao quanh. Nó cũng bảo mật tất cả dữ liệu của bạn, video 1-1 và giao tiếp thoại thông qua mã hóa đầu cuối và xác minh thiết bị có chữ ký chéo.
Element cung cấp cho bạn quyền kiểm soát quyền riêng tư của mình đồng thời cho phép bạn giao tiếp an toàn với bất kỳ ai trên mạng Ma trận hoặc các công cụ cộng tác kinh doanh khác bằng cách tích hợp với các ứng dụng như Slack.
<b> Phần tử có thể được tự lưu trữ </b>
Để cho phép kiểm soát nhiều hơn dữ liệu nhạy cảm và các cuộc trò chuyện của bạn, Element có thể được tự host hoặc bạn có thể chọn bất kỳ host Matrix nào - tiêu chuẩn cho giao tiếp phân tán, mã nguồn mở. Element cung cấp cho bạn quyền riêng tư, tuân thủ bảo mật và tính linh hoạt trong tích hợp.
<b> Sở hữu dữ liệu của bạn </b>
Bạn quyết định nơi lưu giữ dữ liệu và tin nhắn của mình. Không có rủi ro khai thác dữ liệu hoặc truy cập từ bên thứ ba.
Element giúp bạn kiểm soát theo những cách khác nhau:
1. Nhận một tài khoản miễn phí trên máy chủ công cộng matrix.org do các nhà phát triển Matrix host hoặc chọn từ hàng nghìn máy chủ công cộng do các tình nguyện viên lưu trữ
2. Tự host tài khoản của bạn bằng cách chạy một máy chủ trên cơ sở hạ tầng CNTT của riêng bạn
3. Đăng ký tài khoản trên máy chủ tùy chỉnh bằng cách chỉ cần đăng ký nền tảng Element Matrix Services hosting
<b> Mở tin nhắn và cộng tác </b>
Bạn có thể trò chuyện với bất kỳ ai trên mạng Matrix, cho dù họ đang sử dụng Element, một ứng dụng Matrix khác hay ngay cả khi họ đang sử dụng một ứng dụng nhắn tin khác.
<b> Siêu bảo mật </b>
Mã hóa đầu-cuối thực (chỉ những người trong cuộc trò chuyện mới có thể giải mã tin nhắn) và xác minh thiết bị xác thực chéo.
<b> Giao tiếp và tích hợp hoàn chỉnh </b>
Nhắn tin, cuộc gọi thoại và video, chia sẻ tệp, chia sẻ màn hình và một loạt các tích hợp, bot và widget. Xây dựng phòng, cộng đồng, giữ liên lạc và hoàn thành công việc.
<b> Tiếp tục nơi bạn đã dừng lại </b>
Giữ liên lạc mọi lúc mọi nơi với lịch sử tin nhắn được đồng bộ hóa hoàn toàn trên tất cả các thiết bị của bạn và trên web tại https://app.element.io
<b> Mã nguồn mở </b>
Element Android là một dự án mã nguồn mở, được host bởi GitHub. Vui lòng báo cáo lỗi và / hoặc đóng góp vào sự phát triển của nó tại https://github.com/vector-im/element-android

View File

@@ -0,0 +1,2 @@
此版本主要变化:为 Direct Message 聊天室添加 Presence 支持 (注意Presence 在matrix.org 上是禁用的。再次添加 Android Auto 支持。
完整更新日志https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -0,0 +1,2 @@
此版本中的主要變動:為直接訊息聊天室新增 Presence 支援(請注意:此功能在 matrix.org 上停用)。加回 Android Auto 支援。
完整的變更紀錄https://github.com/vector-im/element-android/releases/tag/v1.3.4

View File

@@ -31,7 +31,7 @@ android {
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
buildConfigField "String", "SDK_VERSION", "\"1.3.6\""
buildConfigField "String", "SDK_VERSION", "\"1.3.7\""
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
@@ -156,7 +156,7 @@ dependencies {
implementation libs.apache.commonsImaging
// Phone number https://github.com/google/libphonenumber
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.35'
implementation 'com.googlecode.libphonenumber:libphonenumber:8.12.36'
testImplementation libs.tests.junit
testImplementation 'org.robolectric:robolectric:4.6.1'

View File

@@ -16,6 +16,7 @@
package org.matrix.android.sdk.api
import okhttp3.ConnectionSpec
import org.matrix.android.sdk.api.crypto.MXCryptoConfig
import java.net.Proxy
@@ -44,6 +45,10 @@ data class MatrixConfiguration(
* You can create one using for instance Proxy(proxyType, InetSocketAddress.createUnresolved(hostname, port).
*/
val proxy: Proxy? = null,
/**
* TLS versions and cipher suites limitation for unauthenticated requests
*/
val connectionSpec: ConnectionSpec = ConnectionSpec.RESTRICTED_TLS,
/**
* True to advertise support for call transfers to other parties on Matrix calls.
*/

View File

@@ -105,9 +105,15 @@ interface AuthenticationService {
/**
* Authenticate with a matrixId and a password
* Usually call this after a successful call to getWellKnownData()
* @param homeServerConnectionConfig the information about the homeserver and other configuration
* @param matrixId the matrixId of the user
* @param password the password of the account
* @param initialDeviceName the initial device name
* @param deviceId the device id, optional. If not provided or null, the server will generate one.
*/
suspend fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
matrixId: String,
password: String,
initialDeviceName: String): Session
initialDeviceName: String,
deviceId: String? = null): Session
}

View File

@@ -19,6 +19,7 @@ package org.matrix.android.sdk.api.auth.data
import android.net.Uri
import com.squareup.moshi.JsonClass
import okhttp3.CipherSuite
import okhttp3.ConnectionSpec
import okhttp3.TlsVersion
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig.Builder
import org.matrix.android.sdk.internal.network.ssl.Fingerprint
@@ -191,32 +192,25 @@ data class HomeServerConnectionConfig(
/**
* Convenient method to limit the TLS versions and cipher suites for this Builder
* Ref:
* - https://www.ssi.gouv.fr/uploads/2017/02/security-recommendations-for-tls_v1.1.pdf
* - https://www.ssi.gouv.fr/uploads/2017/07/anssi-guide-recommandations_de_securite_relatives_a_tls-v1.2.pdf
* - https://developer.android.com/reference/javax/net/ssl/SSLEngine
*
* @param tlsLimitations true to use Tls limitations
* @param enableCompatibilityMode set to true for Android < 20
* @return this builder
*/
@Deprecated("TLS versions and cipher suites are limited by default")
fun withTlsLimitations(tlsLimitations: Boolean, enableCompatibilityMode: Boolean): Builder {
if (tlsLimitations) {
withShouldAcceptTlsExtensions(false)
// Tls versions
addAcceptedTlsVersion(TlsVersion.TLS_1_2)
addAcceptedTlsVersion(TlsVersion.TLS_1_3)
// TlS versions
ConnectionSpec.RESTRICTED_TLS.tlsVersions?.let { this.tlsVersions.addAll(it) }
forceUsageOfTlsVersions(enableCompatibilityMode)
// Cipher suites
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256)
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256)
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256)
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384)
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256)
addAcceptedTlsCipherSuite(CipherSuite.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256)
ConnectionSpec.RESTRICTED_TLS.cipherSuites?.let { this.tlsCipherSuites.addAll(it) }
if (enableCompatibilityMode) {
// Adopt some preceding cipher suites for Android < 20 to be able to negotiate

View File

@@ -17,6 +17,7 @@
package org.matrix.android.sdk.api.auth.login
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.util.JsonDict
/**
* Set of methods to be able to login to an existing account on a homeserver.
@@ -34,12 +35,14 @@ interface LoginWizard {
*
* @param login the login field. Can be a user name, or a msisdn (email or phone number) associated to the account
* @param password the password of the account
* @param deviceName the initial device name
* @param initialDeviceName the initial device name
* @param deviceId the device id, optional. If not provided or null, the server will generate one.
* @return a [Session] if the login is successful
*/
suspend fun login(login: String,
password: String,
deviceName: String): Session
initialDeviceName: String,
deviceId: String? = null): Session
/**
* Exchange a login token to an access token.
@@ -49,6 +52,12 @@ interface LoginWizard {
*/
suspend fun loginWithToken(loginToken: String): Session
/**
* Login to the homeserver by sending a custom JsonDict.
* The data should contain at least one entry "type" with a String value.
*/
suspend fun loginCustom(data: JsonDict): Session
/**
* Ask the homeserver to reset the user password. The password will not be reset until
* [resetPasswordMailConfirmed] is successfully called.

View File

@@ -19,17 +19,41 @@ package org.matrix.android.sdk.api.query
/**
* Basic query language. All these cases are mutually exclusive.
*/
sealed class QueryStringValue {
object NoCondition : QueryStringValue()
object IsNull : QueryStringValue()
object IsNotNull : QueryStringValue()
object IsEmpty : QueryStringValue()
object IsNotEmpty : QueryStringValue()
data class Equals(val string: String, val case: Case = Case.SENSITIVE) : QueryStringValue()
data class Contains(val string: String, val case: Case = Case.SENSITIVE) : QueryStringValue()
sealed interface QueryStringValue {
sealed interface ContentQueryStringValue : QueryStringValue {
val string: String
val case: Case
}
object NoCondition : QueryStringValue
object IsNull : QueryStringValue
object IsNotNull : QueryStringValue
object IsEmpty : QueryStringValue
object IsNotEmpty : QueryStringValue
data class Equals(override val string: String, override val case: Case = Case.SENSITIVE) : ContentQueryStringValue
data class Contains(override val string: String, override val case: Case = Case.SENSITIVE) : ContentQueryStringValue
enum class Case {
/**
* Match query sensitive to case
*/
SENSITIVE,
INSENSITIVE
/**
* Match query insensitive to case, this only works for Latin-1 character sets
*/
INSENSITIVE,
/**
* Match query with input normalized (case insensitive)
* Works around Realms inability to sort or filter by case for non Latin-1 character sets
* Expects the target field to contain normalized data
*
* @see org.matrix.android.sdk.internal.util.Normalizer.normalize
*/
NORMALIZED
}
}
internal fun QueryStringValue.isNormalized() = this is QueryStringValue.ContentQueryStringValue && case == QueryStringValue.Case.NORMALIZED

View File

@@ -120,9 +120,11 @@ interface Session :
fun requireBackgroundSync()
/**
* Launches infinite periodic background syncs
* This does not work in doze mode :/
* If battery optimization is on it can work in app standby but that's all :/
* Launches infinite self rescheduling background syncs via the WorkManager
*
* While dozing, syncs will only occur during maintenance windows
* For reliability it's recommended to also start a long running foreground service
* along with disabling battery optimizations
*/
fun startAutomaticBackgroundSync(timeOutInSeconds: Long, repeatDelayInSeconds: Long)

View File

@@ -22,6 +22,8 @@ import org.json.JSONObject
import org.matrix.android.sdk.api.extensions.tryOrNull
import org.matrix.android.sdk.api.failure.MatrixError
import org.matrix.android.sdk.api.session.crypto.MXCryptoError
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.RoomMemberContent
import org.matrix.android.sdk.api.session.room.model.message.MessageContent
import org.matrix.android.sdk.api.session.room.model.message.MessageType
import org.matrix.android.sdk.api.session.room.model.relation.RelationDefaultContent
@@ -310,3 +312,6 @@ fun Event.isEdition(): Boolean {
fun Event.getPresenceContent(): PresenceContent? {
return content.toModel<PresenceContent>()
}
fun Event.isInvitation(): Boolean = type == EventType.STATE_ROOM_MEMBER &&
content?.toModel<RoomMemberContent>()?.membership == Membership.INVITE

View File

@@ -94,13 +94,15 @@ interface RoomService {
* Get a snapshot list of room summaries.
* @return the immutable list of [RoomSummary]
*/
fun getRoomSummaries(queryParams: RoomSummaryQueryParams): List<RoomSummary>
fun getRoomSummaries(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): List<RoomSummary>
/**
* Get a live list of room summaries. This list is refreshed as soon as the data changes.
* @return the [LiveData] of List[RoomSummary]
*/
fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams): LiveData<List<RoomSummary>>
fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.ACTIVITY): LiveData<List<RoomSummary>>
/**
* Get a snapshot list of Breadcrumbs

View File

@@ -19,6 +19,7 @@ package org.matrix.android.sdk.api.session.space
import android.net.Uri
import androidx.lifecycle.LiveData
import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.room.RoomSortOrder
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.internal.session.space.peeking.SpacePeekResult
@@ -74,9 +75,11 @@ interface SpaceService {
* Get a live list of space summaries. This list is refreshed as soon as the data changes.
* @return the [LiveData] of List[SpaceSummary]
*/
fun getSpaceSummariesLive(queryParams: SpaceSummaryQueryParams): LiveData<List<RoomSummary>>
fun getSpaceSummariesLive(queryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): LiveData<List<RoomSummary>>
fun getSpaceSummaries(spaceSummaryQueryParams: SpaceSummaryQueryParams): List<RoomSummary>
fun getSpaceSummaries(spaceSummaryQueryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): List<RoomSummary>
suspend fun joinSpace(spaceIdOrAlias: String,
reason: String? = null,

View File

@@ -121,6 +121,10 @@ internal interface AuthAPI {
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "login")
suspend fun login(@Body loginParams: TokenLoginParams): Credentials
@Headers("CONNECT_TIMEOUT:60000", "READ_TIMEOUT:60000", "WRITE_TIMEOUT:60000")
@POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "login")
suspend fun login(@Body loginParams: JsonDict): Credentials
/**
* Ask the homeserver to reset the password associated with the provided email.
*/

View File

@@ -388,8 +388,15 @@ internal class DefaultAuthenticationService @Inject constructor(
override suspend fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
matrixId: String,
password: String,
initialDeviceName: String): Session {
return directLoginTask.execute(DirectLoginTask.Params(homeServerConnectionConfig, matrixId, password, initialDeviceName))
initialDeviceName: String,
deviceId: String?): Session {
return directLoginTask.execute(DirectLoginTask.Params(
homeServerConnectionConfig = homeServerConnectionConfig,
userId = matrixId,
password = password,
deviceName = initialDeviceName,
deviceId = deviceId
))
}
private fun buildAuthAPI(homeServerConnectionConfig: HomeServerConnectionConfig): AuthAPI {

View File

@@ -49,51 +49,54 @@ internal data class PasswordLoginParams(
fun userIdentifier(user: String,
password: String,
deviceDisplayName: String? = null,
deviceId: String? = null): PasswordLoginParams {
deviceDisplayName: String?,
deviceId: String?): PasswordLoginParams {
return PasswordLoginParams(
mapOf(
identifier = mapOf(
IDENTIFIER_KEY_TYPE to IDENTIFIER_KEY_TYPE_USER,
IDENTIFIER_KEY_USER to user
),
password,
LoginFlowTypes.PASSWORD,
deviceDisplayName,
deviceId)
password = password,
type = LoginFlowTypes.PASSWORD,
deviceDisplayName = deviceDisplayName,
deviceId = deviceId
)
}
fun thirdPartyIdentifier(medium: String,
address: String,
password: String,
deviceDisplayName: String? = null,
deviceId: String? = null): PasswordLoginParams {
deviceDisplayName: String?,
deviceId: String?): PasswordLoginParams {
return PasswordLoginParams(
mapOf(
identifier = mapOf(
IDENTIFIER_KEY_TYPE to IDENTIFIER_KEY_TYPE_THIRD_PARTY,
IDENTIFIER_KEY_MEDIUM to medium,
IDENTIFIER_KEY_ADDRESS to address
),
password,
LoginFlowTypes.PASSWORD,
deviceDisplayName,
deviceId)
password = password,
type = LoginFlowTypes.PASSWORD,
deviceDisplayName = deviceDisplayName,
deviceId = deviceId
)
}
fun phoneIdentifier(country: String,
phone: String,
password: String,
deviceDisplayName: String? = null,
deviceId: String? = null): PasswordLoginParams {
deviceDisplayName: String?,
deviceId: String?): PasswordLoginParams {
return PasswordLoginParams(
mapOf(
identifier = mapOf(
IDENTIFIER_KEY_TYPE to IDENTIFIER_KEY_TYPE_PHONE,
IDENTIFIER_KEY_COUNTRY to country,
IDENTIFIER_KEY_PHONE to phone
),
password,
LoginFlowTypes.PASSWORD,
deviceDisplayName,
deviceId)
password = password,
type = LoginFlowTypes.PASSWORD,
deviceDisplayName = deviceDisplayName,
deviceId = deviceId
)
}
}
}

View File

@@ -21,6 +21,7 @@ import org.matrix.android.sdk.api.auth.login.LoginProfileInfo
import org.matrix.android.sdk.api.auth.login.LoginWizard
import org.matrix.android.sdk.api.auth.registration.RegisterThreePid
import org.matrix.android.sdk.api.session.Session
import org.matrix.android.sdk.api.util.JsonDict
import org.matrix.android.sdk.internal.auth.AuthAPI
import org.matrix.android.sdk.internal.auth.PendingSessionStore
import org.matrix.android.sdk.internal.auth.SessionCreator
@@ -52,11 +53,23 @@ internal class DefaultLoginWizard(
override suspend fun login(login: String,
password: String,
deviceName: String): Session {
initialDeviceName: String,
deviceId: String?): Session {
val loginParams = if (Patterns.EMAIL_ADDRESS.matcher(login).matches()) {
PasswordLoginParams.thirdPartyIdentifier(ThreePidMedium.EMAIL, login, password, deviceName)
PasswordLoginParams.thirdPartyIdentifier(
medium = ThreePidMedium.EMAIL,
address = login,
password = password,
deviceDisplayName = initialDeviceName,
deviceId = deviceId
)
} else {
PasswordLoginParams.userIdentifier(login, password, deviceName)
PasswordLoginParams.userIdentifier(
user = login,
password = password,
deviceDisplayName = initialDeviceName,
deviceId = deviceId
)
}
val credentials = executeRequest(null) {
authAPI.login(loginParams)
@@ -79,6 +92,14 @@ internal class DefaultLoginWizard(
return sessionCreator.createSession(credentials, pendingSessionData.homeServerConnectionConfig)
}
override suspend fun loginCustom(data: JsonDict): Session {
val credentials = executeRequest(null) {
authAPI.login(data)
}
return sessionCreator.createSession(credentials, pendingSessionData.homeServerConnectionConfig)
}
override suspend fun resetPassword(email: String, newPassword: String) {
val param = RegisterAddThreePidTask.Params(
RegisterThreePid.Email(email),

View File

@@ -37,7 +37,8 @@ internal interface DirectLoginTask : Task<DirectLoginTask.Params, Session> {
val homeServerConnectionConfig: HomeServerConnectionConfig,
val userId: String,
val password: String,
val deviceName: String
val deviceName: String,
val deviceId: String?
)
}
@@ -55,7 +56,12 @@ internal class DefaultDirectLoginTask @Inject constructor(
val authAPI = retrofitFactory.create(client, homeServerUrl)
.create(AuthAPI::class.java)
val loginParams = PasswordLoginParams.userIdentifier(params.userId, params.password, params.deviceName)
val loginParams = PasswordLoginParams.userIdentifier(
user = params.userId,
password = params.password,
deviceDisplayName = params.deviceName,
deviceId = params.deviceId
)
val credentials = try {
executeRequest(null) {

View File

@@ -34,7 +34,7 @@ internal interface SendEventTask : Task<SendEventTask.Params, String> {
internal class DefaultSendEventTask @Inject constructor(
private val localEchoRepository: LocalEchoRepository,
private val encryptEventTask: DefaultEncryptEventTask,
private val encryptEventTask: EncryptEventTask,
private val loadRoomMembersTask: LoadRoomMembersTask,
private val roomAPI: RoomAPI,
private val globalErrorReceiver: GlobalErrorReceiver) : SendEventTask {

View File

@@ -34,7 +34,7 @@ internal interface SendVerificationMessageTask : Task<SendVerificationMessageTas
internal class DefaultSendVerificationMessageTask @Inject constructor(
private val localEchoRepository: LocalEchoRepository,
private val encryptEventTask: DefaultEncryptEventTask,
private val encryptEventTask: EncryptEventTask,
private val roomAPI: RoomAPI,
private val cryptoSessionInfoProvider: CryptoSessionInfoProvider,
private val globalErrorReceiver: GlobalErrorReceiver) : SendVerificationMessageTask {

View File

@@ -45,11 +45,24 @@ import org.matrix.android.sdk.internal.database.model.TimelineEventEntityFields
import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntityFields
import org.matrix.android.sdk.internal.di.MoshiProvider
import org.matrix.android.sdk.internal.query.process
import org.matrix.android.sdk.internal.util.Normalizer
import timber.log.Timber
import javax.inject.Inject
internal object RealmSessionStoreMigration : RealmMigration {
internal class RealmSessionStoreMigration @Inject constructor(
private val normalizer: Normalizer
) : RealmMigration {
const val SESSION_STORE_SCHEMA_VERSION = 18L
companion object {
const val SESSION_STORE_SCHEMA_VERSION = 19L
}
/**
* Forces all RealmSessionStoreMigration instances to be equal
* Avoids Realm throwing when multiple instances of the migration are set
*/
override fun equals(other: Any?) = other is RealmSessionStoreMigration
override fun hashCode() = 1000
override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
Timber.v("Migrating Realm Session from $oldVersion to $newVersion")
@@ -72,6 +85,7 @@ internal object RealmSessionStoreMigration : RealmMigration {
if (oldVersion <= 15) migrateTo16(realm)
if (oldVersion <= 16) migrateTo17(realm)
if (oldVersion <= 17) migrateTo18(realm)
if (oldVersion <= 18) migrateTo19(realm)
}
private fun migrateTo1(realm: DynamicRealm) {
@@ -364,4 +378,16 @@ internal object RealmSessionStoreMigration : RealmMigration {
realm.schema.get("RoomMemberSummaryEntity")
?.addRealmObjectField(RoomMemberSummaryEntityFields.USER_PRESENCE_ENTITY.`$`, userPresenceEntity)
}
private fun migrateTo19(realm: DynamicRealm) {
Timber.d("Step 18 -> 19")
realm.schema.get("RoomSummaryEntity")
?.addField(RoomSummaryEntityFields.NORMALIZED_DISPLAY_NAME, String::class.java)
?.transform {
it.getString(RoomSummaryEntityFields.DISPLAY_NAME)?.let { displayName ->
val normalised = normalizer.normalize(displayName)
it.set(RoomSummaryEntityFields.NORMALIZED_DISPLAY_NAME, normalised)
}
}
}
}

View File

@@ -40,6 +40,7 @@ private const val REALM_NAME = "disk_store.realm"
*/
internal class SessionRealmConfigurationFactory @Inject constructor(
private val realmKeysUtils: RealmKeysUtils,
private val realmSessionStoreMigration: RealmSessionStoreMigration,
@SessionFilesDirectory val directory: File,
@SessionId val sessionId: String,
@UserMd5 val userMd5: String,
@@ -71,7 +72,7 @@ internal class SessionRealmConfigurationFactory @Inject constructor(
.allowWritesOnUiThread(true)
.modules(SessionRealmModule())
.schemaVersion(RealmSessionStoreMigration.SESSION_STORE_SCHEMA_VERSION)
.migration(RealmSessionStoreMigration)
.migration(realmSessionStoreMigration)
.build()
// Try creating a realm instance and if it succeeds we can clear the flag

View File

@@ -21,13 +21,13 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.SpaceChildInfo
import org.matrix.android.sdk.api.session.room.model.SpaceParentInfo
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.api.session.typing.TypingUsersTracker
import org.matrix.android.sdk.internal.database.model.RoomSummaryEntity
import org.matrix.android.sdk.internal.database.model.presence.toUserPresence
import org.matrix.android.sdk.internal.session.typing.DefaultTypingUsersTracker
import javax.inject.Inject
internal class RoomSummaryMapper @Inject constructor(private val timelineEventMapper: TimelineEventMapper,
private val typingUsersTracker: DefaultTypingUsersTracker) {
private val typingUsersTracker: TypingUsersTracker) {
fun map(roomSummaryEntity: RoomSummaryEntity): RoomSummary {
val tags = roomSummaryEntity.tags().map {
@@ -42,7 +42,7 @@ internal class RoomSummaryMapper @Inject constructor(private val timelineEventMa
return RoomSummary(
roomId = roomSummaryEntity.roomId,
displayName = roomSummaryEntity.displayName ?: "",
displayName = roomSummaryEntity.displayName() ?: "",
name = roomSummaryEntity.name ?: "",
topic = roomSummaryEntity.topic ?: "",
avatarUrl = roomSummaryEntity.avatarUrl ?: "",

View File

@@ -28,6 +28,7 @@ import org.matrix.android.sdk.api.session.room.model.RoomSummary
import org.matrix.android.sdk.api.session.room.model.VersioningState
import org.matrix.android.sdk.api.session.room.model.tag.RoomTag
import org.matrix.android.sdk.internal.database.model.presence.UserPresenceEntity
import org.matrix.android.sdk.internal.session.room.membership.RoomName
internal open class RoomSummaryEntity(
@PrimaryKey var roomId: String = "",
@@ -36,10 +37,24 @@ internal open class RoomSummaryEntity(
var children: RealmList<SpaceChildSummaryEntity> = RealmList()
) : RealmObject() {
var displayName: String? = ""
set(value) {
if (value != field) field = value
private var displayName: String? = ""
fun displayName() = displayName
fun setDisplayName(roomName: RoomName) {
if (roomName.name != displayName) {
displayName = roomName.name
normalizedDisplayName = roomName.normalizedName
}
}
/**
* Workaround for Realm only supporting Latin-1 character sets when sorting
* or filtering by case
* See https://github.com/realm/realm-core/issues/777
*/
private var normalizedDisplayName: String? = ""
var avatarUrl: String? = ""
set(value) {
if (value != field) field = value
@@ -284,5 +299,6 @@ internal open class RoomSummaryEntity(
roomEncryptionTrustLevelStr = value?.name
}
}
companion object
}

View File

@@ -20,6 +20,7 @@ import com.facebook.stetho.okhttp3.StethoInterceptor
import com.squareup.moshi.Moshi
import dagger.Module
import dagger.Provides
import okhttp3.ConnectionSpec
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import org.matrix.android.sdk.BuildConfig
@@ -29,6 +30,7 @@ import org.matrix.android.sdk.internal.network.TimeOutInterceptor
import org.matrix.android.sdk.internal.network.UserAgentInterceptor
import org.matrix.android.sdk.internal.network.interceptors.CurlLoggingInterceptor
import org.matrix.android.sdk.internal.network.interceptors.FormattedJsonHttpLogger
import java.util.Collections
import java.util.concurrent.TimeUnit
@Module
@@ -66,6 +68,8 @@ internal object NetworkModule {
httpLoggingInterceptor: HttpLoggingInterceptor,
curlLoggingInterceptor: CurlLoggingInterceptor,
apiInterceptor: ApiInterceptor): OkHttpClient {
val spec = ConnectionSpec.Builder(matrixConfiguration.connectionSpec).build()
return OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
@@ -87,6 +91,7 @@ internal object NetworkModule {
proxy(it)
}
}
.connectionSpecs(Collections.singletonList(spec))
.build()
}

View File

@@ -177,15 +177,13 @@ internal object CertUtil {
val trustPinned = arrayOf<TrustManager>(PinnedTrustManagerProvider.provide(hsConfig.allowedFingerprints, defaultTrustManager))
val sslSocketFactory: SSLSocketFactory
if (hsConfig.forceUsageTlsVersions && hsConfig.tlsVersions != null) {
val sslSocketFactory = if (hsConfig.forceUsageTlsVersions && !hsConfig.tlsVersions.isNullOrEmpty()) {
// Force usage of accepted Tls Versions for Android < 20
sslSocketFactory = TLSSocketFactory(trustPinned, hsConfig.tlsVersions)
TLSSocketFactory(trustPinned, hsConfig.tlsVersions)
} else {
val sslContext = SSLContext.getInstance("TLS")
sslContext.init(null, trustPinned, java.security.SecureRandom())
sslSocketFactory = sslContext.socketFactory
sslContext.socketFactory
}
return PinnedSSLSocketFactory(sslSocketFactory, defaultTrustManager!!)
@@ -237,14 +235,14 @@ internal object CertUtil {
* @return a list of accepted TLS specifications.
*/
fun newConnectionSpecs(hsConfig: HomeServerConnectionConfig): List<ConnectionSpec> {
val builder = ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
val builder = ConnectionSpec.Builder(ConnectionSpec.RESTRICTED_TLS)
val tlsVersions = hsConfig.tlsVersions
if (null != tlsVersions && tlsVersions.isNotEmpty()) {
if (!tlsVersions.isNullOrEmpty()) {
builder.tlsVersions(*tlsVersions.toTypedArray())
}
val tlsCipherSuites = hsConfig.tlsCipherSuites
if (null != tlsCipherSuites && tlsCipherSuites.isNotEmpty()) {
if (!tlsCipherSuites.isNullOrEmpty()) {
builder.cipherSuites(*tlsCipherSuites.toTypedArray())
}

View File

@@ -20,24 +20,41 @@ import io.realm.Case
import io.realm.RealmObject
import io.realm.RealmQuery
import org.matrix.android.sdk.api.query.QueryStringValue
import timber.log.Timber
import org.matrix.android.sdk.api.query.QueryStringValue.ContentQueryStringValue
import org.matrix.android.sdk.internal.util.Normalizer
import javax.inject.Inject
fun <T : RealmObject> RealmQuery<T>.process(field: String, queryStringValue: QueryStringValue): RealmQuery<T> {
when (queryStringValue) {
is QueryStringValue.NoCondition -> Timber.v("No condition to process")
is QueryStringValue.IsNotNull -> isNotNull(field)
is QueryStringValue.IsNull -> isNull(field)
is QueryStringValue.IsEmpty -> isEmpty(field)
is QueryStringValue.IsNotEmpty -> isNotEmpty(field)
is QueryStringValue.Equals -> equalTo(field, queryStringValue.string, queryStringValue.case.toRealmCase())
is QueryStringValue.Contains -> contains(field, queryStringValue.string, queryStringValue.case.toRealmCase())
class QueryStringValueProcessor @Inject constructor(
private val normalizer: Normalizer
) {
fun <T : RealmObject> RealmQuery<T>.process(field: String, queryStringValue: QueryStringValue): RealmQuery<T> {
return when (queryStringValue) {
is QueryStringValue.NoCondition -> this
is QueryStringValue.IsNotNull -> isNotNull(field)
is QueryStringValue.IsNull -> isNull(field)
is QueryStringValue.IsEmpty -> isEmpty(field)
is QueryStringValue.IsNotEmpty -> isNotEmpty(field)
is ContentQueryStringValue -> when (queryStringValue) {
is QueryStringValue.Equals -> equalTo(field, queryStringValue.toRealmValue(), queryStringValue.case.toRealmCase())
is QueryStringValue.Contains -> contains(field, queryStringValue.toRealmValue(), queryStringValue.case.toRealmCase())
}
}
}
private fun ContentQueryStringValue.toRealmValue(): String {
return when (case) {
QueryStringValue.Case.NORMALIZED -> normalizer.normalize(string)
QueryStringValue.Case.SENSITIVE,
QueryStringValue.Case.INSENSITIVE -> string
}
}
return this
}
private fun QueryStringValue.Case.toRealmCase(): Case {
return when (this) {
QueryStringValue.Case.INSENSITIVE -> Case.INSENSITIVE
QueryStringValue.Case.SENSITIVE -> Case.SENSITIVE
QueryStringValue.Case.SENSITIVE,
QueryStringValue.Case.NORMALIZED -> Case.SENSITIVE
}
}

View File

@@ -41,6 +41,7 @@ import org.matrix.android.sdk.api.session.file.ContentDownloadStateTracker
import org.matrix.android.sdk.api.session.file.FileService
import org.matrix.android.sdk.api.session.group.GroupService
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService
import org.matrix.android.sdk.api.session.identity.IdentityService
import org.matrix.android.sdk.api.session.initsync.SyncStatusService
import org.matrix.android.sdk.api.session.integrationmanager.IntegrationManagerService
import org.matrix.android.sdk.api.session.media.MediaService
@@ -72,7 +73,6 @@ import org.matrix.android.sdk.internal.di.SessionId
import org.matrix.android.sdk.internal.di.UnauthenticatedWithCertificate
import org.matrix.android.sdk.internal.di.WorkManagerProvider
import org.matrix.android.sdk.internal.network.GlobalErrorHandler
import org.matrix.android.sdk.internal.session.identity.DefaultIdentityService
import org.matrix.android.sdk.internal.session.sync.SyncTokenStore
import org.matrix.android.sdk.internal.session.sync.job.SyncThread
import org.matrix.android.sdk.internal.session.sync.job.SyncWorker
@@ -124,7 +124,7 @@ internal class DefaultSession @Inject constructor(
private val _sharedSecretStorageService: Lazy<SharedSecretStorageService>,
private val accountService: Lazy<AccountService>,
private val eventService: Lazy<EventService>,
private val defaultIdentityService: DefaultIdentityService,
private val identityService: IdentityService,
private val integrationManagerService: IntegrationManagerService,
private val thirdPartyService: Lazy<ThirdPartyService>,
private val callSignalingService: Lazy<CallSignalingService>,
@@ -275,7 +275,7 @@ internal class DefaultSession @Inject constructor(
override fun cryptoService(): CryptoService = cryptoService.get()
override fun identityService() = defaultIdentityService
override fun identityService() = identityService
override fun fileService(): FileService = defaultFileService.get()

View File

@@ -163,6 +163,7 @@ internal abstract class SessionModule {
@JvmStatic
@Provides
@SessionFilesDirectory
@SessionScope
fun providesFilesDir(@UserMd5 userMd5: String,
@SessionId sessionId: String,
context: Context): File {

View File

@@ -35,12 +35,12 @@ import org.matrix.android.sdk.api.failure.Failure
import org.matrix.android.sdk.api.failure.MatrixError
import org.matrix.android.sdk.api.session.content.ContentUrlResolver
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities
import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilitiesService
import org.matrix.android.sdk.internal.di.Authenticated
import org.matrix.android.sdk.internal.network.GlobalErrorReceiver
import org.matrix.android.sdk.internal.network.ProgressRequestBody
import org.matrix.android.sdk.internal.network.awaitResponse
import org.matrix.android.sdk.internal.network.toFailure
import org.matrix.android.sdk.internal.session.homeserver.DefaultHomeServerCapabilitiesService
import org.matrix.android.sdk.internal.util.TemporaryFileCreator
import java.io.File
import java.io.FileNotFoundException
@@ -50,7 +50,7 @@ import javax.inject.Inject
internal class FileUploader @Inject constructor(
@Authenticated private val okHttpClient: OkHttpClient,
private val globalErrorReceiver: GlobalErrorReceiver,
private val homeServerCapabilitiesService: DefaultHomeServerCapabilitiesService,
private val homeServerCapabilitiesService: HomeServerCapabilitiesService,
private val context: Context,
private val temporaryFileCreator: TemporaryFileCreator,
contentUrlResolver: ContentUrlResolver,

View File

@@ -214,8 +214,11 @@ internal class UploadContentWorker(val context: Context, params: WorkerParameter
.also { filesToDelete.add(it) }
}
VideoCompressionResult.CompressionNotNeeded,
VideoCompressionResult.CompressionCancelled,
VideoCompressionResult.CompressionCancelled -> {
workingFile
}
is VideoCompressionResult.CompressionFailed -> {
Timber.e(videoCompressionResult.failure, "Video compression failed")
workingFile
}
}

View File

@@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.session.content
import com.otaliastudios.transcoder.Transcoder
import com.otaliastudios.transcoder.TranscoderListener
import com.otaliastudios.transcoder.source.FilePathDataSource
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.withContext
@@ -43,7 +44,16 @@ internal class VideoCompressor @Inject constructor(
var result: Int = -1
var failure: Throwable? = null
Transcoder.into(destinationFile.path)
.addDataSource(videoFile.path)
.addDataSource(object : FilePathDataSource(videoFile.path) {
// https://github.com/natario1/Transcoder/issues/154
@Suppress("SENSELESS_COMPARISON") // Source is annotated as @NonNull, but can actually be null...
override fun isInitialized(): Boolean {
if (source == null) {
return false
}
return super.isInitialized()
}
})
.setListener(object : TranscoderListener {
override fun onTranscodeProgress(progress: Double) {
Timber.d("Compressing: $progress%")

View File

@@ -30,12 +30,16 @@ import org.matrix.android.sdk.internal.database.model.GroupSummaryEntity
import org.matrix.android.sdk.internal.database.model.GroupSummaryEntityFields
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.query.QueryStringValueProcessor
import org.matrix.android.sdk.internal.query.process
import org.matrix.android.sdk.internal.util.fetchCopyMap
import javax.inject.Inject
internal class DefaultGroupService @Inject constructor(@SessionDatabase private val monarchy: Monarchy,
private val groupFactory: GroupFactory) : GroupService {
internal class DefaultGroupService @Inject constructor(
@SessionDatabase private val monarchy: Monarchy,
private val groupFactory: GroupFactory,
private val queryStringValueProcessor: QueryStringValueProcessor,
) : GroupService {
override fun getGroup(groupId: String): Group? {
return Realm.getInstance(monarchy.realmConfiguration).use { realm ->
@@ -67,8 +71,10 @@ internal class DefaultGroupService @Inject constructor(@SessionDatabase private
}
private fun groupSummariesQuery(realm: Realm, queryParams: GroupSummaryQueryParams): RealmQuery<GroupSummaryEntity> {
return GroupSummaryEntity.where(realm)
.process(GroupSummaryEntityFields.DISPLAY_NAME, queryParams.displayName)
.process(GroupSummaryEntityFields.MEMBERSHIP_STR, queryParams.memberships)
return with(queryStringValueProcessor) {
GroupSummaryEntity.where(realm)
.process(GroupSummaryEntityFields.DISPLAY_NAME, queryParams.displayName)
.process(GroupSummaryEntityFields.MEMBERSHIP_STR, queryParams.memberships)
}
}
}

View File

@@ -80,7 +80,7 @@ internal class DefaultIdentityService @Inject constructor(
private val identityApiProvider: IdentityApiProvider,
private val accountDataDataSource: UserAccountDataDataSource,
private val homeServerCapabilitiesService: HomeServerCapabilitiesService,
private val sign3pidInvitationTask: DefaultSign3pidInvitationTask,
private val sign3pidInvitationTask: Sign3pidInvitationTask,
private val sessionParams: SessionParams
) : IdentityService, SessionLifecycleObserver {

View File

@@ -21,6 +21,7 @@ import dagger.Module
import dagger.Provides
import io.realm.RealmConfiguration
import okhttp3.OkHttpClient
import org.matrix.android.sdk.api.session.identity.IdentityService
import org.matrix.android.sdk.internal.database.RealmKeysUtils
import org.matrix.android.sdk.internal.di.AuthenticatedIdentity
import org.matrix.android.sdk.internal.di.IdentityDatabase
@@ -75,6 +76,9 @@ internal abstract class IdentityModule {
}
}
@Binds
abstract fun bindIdentityService(service: DefaultIdentityService): IdentityService
@Binds
@AuthenticatedIdentity
abstract fun bindAccessTokenProvider(provider: IdentityAccessTokenProvider): AccessTokenProvider

View File

@@ -18,6 +18,7 @@ package org.matrix.android.sdk.internal.session.notification
import org.matrix.android.sdk.api.pushrules.rest.PushRule
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.isInvitation
import org.matrix.android.sdk.api.session.sync.model.RoomsSyncResponse
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.task.Task
@@ -48,14 +49,18 @@ internal class DefaultProcessEventForPushTask @Inject constructor(
}
val newJoinEvents = params.syncResponse.join
.mapNotNull { (key, value) ->
value.timeline?.events?.map { it.copy(roomId = key) }
value.timeline?.events?.mapNotNull {
it.takeIf { !it.isInvitation() }?.copy(roomId = key)
}
}
.flatten()
val inviteEvents = params.syncResponse.invite
.mapNotNull { (key, value) ->
value.inviteState?.events?.map { it.copy(roomId = key) }
}
.flatten()
val allEvents = (newJoinEvents + inviteEvents).filter { event ->
when (event.type) {
EventType.MESSAGE,

View File

@@ -85,12 +85,14 @@ internal class DefaultRoomService @Inject constructor(
return roomSummaryDataSource.getRoomSummary(roomIdOrAlias)
}
override fun getRoomSummaries(queryParams: RoomSummaryQueryParams): List<RoomSummary> {
return roomSummaryDataSource.getRoomSummaries(queryParams)
override fun getRoomSummaries(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder): List<RoomSummary> {
return roomSummaryDataSource.getRoomSummaries(queryParams, sortOrder)
}
override fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams): LiveData<List<RoomSummary>> {
return roomSummaryDataSource.getRoomSummariesLive(queryParams)
override fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder): LiveData<List<RoomSummary>> {
return roomSummaryDataSource.getRoomSummariesLive(queryParams, sortOrder)
}
override fun getPagedRoomSummariesLive(queryParams: RoomSummaryQueryParams,

View File

@@ -33,6 +33,7 @@ import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntity
import org.matrix.android.sdk.internal.database.model.RoomMemberSummaryEntityFields
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.query.QueryStringValueProcessor
import org.matrix.android.sdk.internal.query.process
import org.matrix.android.sdk.internal.session.room.membership.admin.MembershipAdminTask
import org.matrix.android.sdk.internal.session.room.membership.joining.InviteTask
@@ -51,7 +52,8 @@ internal class DefaultMembershipService @AssistedInject constructor(
private val leaveRoomTask: LeaveRoomTask,
private val membershipAdminTask: MembershipAdminTask,
@UserId
private val userId: String
private val userId: String,
private val queryStringValueProcessor: QueryStringValueProcessor
) : MembershipService {
@AssistedFactory
@@ -94,15 +96,17 @@ internal class DefaultMembershipService @AssistedInject constructor(
}
private fun roomMembersQuery(realm: Realm, queryParams: RoomMemberQueryParams): RealmQuery<RoomMemberSummaryEntity> {
return RoomMemberHelper(realm, roomId).queryRoomMembersEvent()
.process(RoomMemberSummaryEntityFields.USER_ID, queryParams.userId)
.process(RoomMemberSummaryEntityFields.MEMBERSHIP_STR, queryParams.memberships)
.process(RoomMemberSummaryEntityFields.DISPLAY_NAME, queryParams.displayName)
.apply {
if (queryParams.excludeSelf) {
notEqualTo(RoomMemberSummaryEntityFields.USER_ID, userId)
return with(queryStringValueProcessor) {
RoomMemberHelper(realm, roomId).queryRoomMembersEvent()
.process(RoomMemberSummaryEntityFields.USER_ID, queryParams.userId)
.process(RoomMemberSummaryEntityFields.MEMBERSHIP_STR, queryParams.memberships)
.process(RoomMemberSummaryEntityFields.DISPLAY_NAME, queryParams.displayName)
.apply {
if (queryParams.excludeSelf) {
notEqualTo(RoomMemberSummaryEntityFields.USER_ID, userId)
}
}
}
}
}
override fun getNumberOfJoinedMembers(): Int {

View File

@@ -34,6 +34,7 @@ import org.matrix.android.sdk.internal.database.query.getOrNull
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.UserId
import org.matrix.android.sdk.internal.session.displayname.DisplayNameResolver
import org.matrix.android.sdk.internal.util.Normalizer
import javax.inject.Inject
/**
@@ -42,6 +43,7 @@ import javax.inject.Inject
internal class RoomDisplayNameResolver @Inject constructor(
matrixConfiguration: MatrixConfiguration,
private val displayNameResolver: DisplayNameResolver,
private val normalizer: Normalizer,
@UserId private val userId: String
) {
@@ -54,7 +56,7 @@ internal class RoomDisplayNameResolver @Inject constructor(
* @param roomId: the roomId to resolve the name of.
* @return the room display name
*/
fun resolve(realm: Realm, roomId: String): String {
fun resolve(realm: Realm, roomId: String): RoomName {
// this algorithm is the one defined in
// https://github.com/matrix-org/matrix-js-sdk/blob/develop/lib/models/room.js#L617
// calculateRoomName(room, userId)
@@ -66,12 +68,12 @@ internal class RoomDisplayNameResolver @Inject constructor(
val roomName = CurrentStateEventEntity.getOrNull(realm, roomId, type = EventType.STATE_ROOM_NAME, stateKey = "")?.root
name = ContentMapper.map(roomName?.content).toModel<RoomNameContent>()?.name
if (!name.isNullOrEmpty()) {
return name
return name.toRoomName()
}
val canonicalAlias = CurrentStateEventEntity.getOrNull(realm, roomId, type = EventType.STATE_ROOM_CANONICAL_ALIAS, stateKey = "")?.root
name = ContentMapper.map(canonicalAlias?.content).toModel<RoomCanonicalAliasContent>()?.canonicalAlias
if (!name.isNullOrEmpty()) {
return name
return name.toRoomName()
}
val roomMembers = RoomMemberHelper(realm, roomId)
@@ -152,7 +154,7 @@ internal class RoomDisplayNameResolver @Inject constructor(
}
}
}
return name ?: roomId
return (name ?: roomId).toRoomName()
}
/** See [org.matrix.android.sdk.api.session.room.sender.SenderInfo.disambiguatedDisplayName] */
@@ -165,4 +167,8 @@ internal class RoomDisplayNameResolver @Inject constructor(
"${roomMemberSummary.displayName} (${roomMemberSummary.userId})"
}
}
private fun String.toRoomName() = RoomName(this, normalizedName = normalizer.normalize(this))
}
internal data class RoomName(val name: String, val normalizedName: String)

View File

@@ -31,11 +31,15 @@ import org.matrix.android.sdk.internal.database.mapper.asDomain
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntity
import org.matrix.android.sdk.internal.database.model.CurrentStateEventEntityFields
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.query.QueryStringValueProcessor
import org.matrix.android.sdk.internal.query.process
import javax.inject.Inject
internal class StateEventDataSource @Inject constructor(@SessionDatabase private val monarchy: Monarchy,
private val realmSessionProvider: RealmSessionProvider) {
internal class StateEventDataSource @Inject constructor(
@SessionDatabase private val monarchy: Monarchy,
private val realmSessionProvider: RealmSessionProvider,
private val queryStringValueProcessor: QueryStringValueProcessor
) {
fun getStateEvent(roomId: String, eventType: String, stateKey: QueryStringValue): Event? {
return realmSessionProvider.withRealm { realm ->
@@ -78,13 +82,15 @@ internal class StateEventDataSource @Inject constructor(@SessionDatabase private
eventTypes: Set<String>,
stateKey: QueryStringValue
): RealmQuery<CurrentStateEventEntity> {
return realm.where<CurrentStateEventEntity>()
.equalTo(CurrentStateEventEntityFields.ROOM_ID, roomId)
.apply {
if (eventTypes.isNotEmpty()) {
`in`(CurrentStateEventEntityFields.TYPE, eventTypes.toTypedArray())
return with(queryStringValueProcessor) {
realm.where<CurrentStateEventEntity>()
.equalTo(CurrentStateEventEntityFields.ROOM_ID, roomId)
.apply {
if (eventTypes.isNotEmpty()) {
`in`(CurrentStateEventEntityFields.TYPE, eventTypes.toTypedArray())
}
}
}
.process(CurrentStateEventEntityFields.STATE_KEY, stateKey)
.process(CurrentStateEventEntityFields.STATE_KEY, stateKey)
}
}
}

View File

@@ -25,10 +25,10 @@ import androidx.paging.PagedList
import com.zhuinden.monarchy.Monarchy
import io.realm.Realm
import io.realm.RealmQuery
import io.realm.Sort
import io.realm.kotlin.where
import org.matrix.android.sdk.api.query.ActiveSpaceFilter
import org.matrix.android.sdk.api.query.RoomCategoryFilter
import org.matrix.android.sdk.api.query.isNormalized
import org.matrix.android.sdk.api.session.room.ResultBoundaries
import org.matrix.android.sdk.api.session.room.RoomSortOrder
import org.matrix.android.sdk.api.session.room.RoomSummaryQueryParams
@@ -48,12 +48,16 @@ import org.matrix.android.sdk.internal.database.model.RoomSummaryEntityFields
import org.matrix.android.sdk.internal.database.query.findByAlias
import org.matrix.android.sdk.internal.database.query.where
import org.matrix.android.sdk.internal.di.SessionDatabase
import org.matrix.android.sdk.internal.query.QueryStringValueProcessor
import org.matrix.android.sdk.internal.query.process
import org.matrix.android.sdk.internal.util.fetchCopyMap
import javax.inject.Inject
internal class RoomSummaryDataSource @Inject constructor(@SessionDatabase private val monarchy: Monarchy,
private val roomSummaryMapper: RoomSummaryMapper) {
internal class RoomSummaryDataSource @Inject constructor(
@SessionDatabase private val monarchy: Monarchy,
private val roomSummaryMapper: RoomSummaryMapper,
private val queryStringValueProcessor: QueryStringValueProcessor
) {
fun getRoomSummary(roomIdOrAlias: String): RoomSummary? {
return monarchy
@@ -80,25 +84,27 @@ internal class RoomSummaryDataSource @Inject constructor(@SessionDatabase privat
}
}
fun getRoomSummaries(queryParams: RoomSummaryQueryParams): List<RoomSummary> {
fun getRoomSummaries(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): List<RoomSummary> {
return monarchy.fetchAllMappedSync(
{ roomSummariesQuery(it, queryParams) },
{ roomSummariesQuery(it, queryParams).process(sortOrder) },
{ roomSummaryMapper.map(it) }
)
}
fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams): LiveData<List<RoomSummary>> {
fun getRoomSummariesLive(queryParams: RoomSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): LiveData<List<RoomSummary>> {
return monarchy.findAllMappedWithChanges(
{
roomSummariesQuery(it, queryParams)
.sort(RoomSummaryEntityFields.LAST_ACTIVITY_TIME, Sort.DESCENDING)
roomSummariesQuery(it, queryParams).process(sortOrder)
},
{ roomSummaryMapper.map(it) }
)
}
fun getSpaceSummariesLive(queryParams: SpaceSummaryQueryParams): LiveData<List<RoomSummary>> {
return getRoomSummariesLive(queryParams)
fun getSpaceSummariesLive(queryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): LiveData<List<RoomSummary>> {
return getRoomSummariesLive(queryParams, sortOrder)
}
fun getSpaceSummary(roomIdOrAlias: String): RoomSummary? {
@@ -122,8 +128,9 @@ internal class RoomSummaryDataSource @Inject constructor(@SessionDatabase privat
}
}
fun getSpaceSummaries(spaceSummaryQueryParams: SpaceSummaryQueryParams): List<RoomSummary> {
return getRoomSummaries(spaceSummaryQueryParams)
fun getSpaceSummaries(spaceSummaryQueryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder = RoomSortOrder.NONE): List<RoomSummary> {
return getRoomSummaries(spaceSummaryQueryParams, sortOrder)
}
fun getRootSpaceSummaries(): List<RoomSummary> {
@@ -238,12 +245,20 @@ internal class RoomSummaryDataSource @Inject constructor(@SessionDatabase privat
}
private fun roomSummariesQuery(realm: Realm, queryParams: RoomSummaryQueryParams): RealmQuery<RoomSummaryEntity> {
val query = RoomSummaryEntity.where(realm)
query.process(RoomSummaryEntityFields.ROOM_ID, queryParams.roomId)
query.process(RoomSummaryEntityFields.DISPLAY_NAME, queryParams.displayName)
query.process(RoomSummaryEntityFields.CANONICAL_ALIAS, queryParams.canonicalAlias)
query.process(RoomSummaryEntityFields.MEMBERSHIP_STR, queryParams.memberships)
query.equalTo(RoomSummaryEntityFields.IS_HIDDEN_FROM_USER, false)
val query = with(queryStringValueProcessor) {
RoomSummaryEntity.where(realm)
.process(RoomSummaryEntityFields.ROOM_ID, queryParams.roomId)
.let {
if (queryParams.displayName.isNormalized()) {
it.process(RoomSummaryEntityFields.NORMALIZED_DISPLAY_NAME, queryParams.displayName)
} else {
it.process(RoomSummaryEntityFields.DISPLAY_NAME, queryParams.displayName)
}
}
.process(RoomSummaryEntityFields.CANONICAL_ALIAS, queryParams.canonicalAlias)
.process(RoomSummaryEntityFields.MEMBERSHIP_STR, queryParams.memberships)
.equalTo(RoomSummaryEntityFields.IS_HIDDEN_FROM_USER, false)
}
queryParams.roomCategoryFilter?.let {
when (it) {

View File

@@ -65,6 +65,7 @@ import org.matrix.android.sdk.internal.session.room.accountdata.RoomAccountDataD
import org.matrix.android.sdk.internal.session.room.membership.RoomDisplayNameResolver
import org.matrix.android.sdk.internal.session.room.membership.RoomMemberHelper
import org.matrix.android.sdk.internal.session.room.relationship.RoomChildRelationInfo
import org.matrix.android.sdk.internal.util.Normalizer
import timber.log.Timber
import javax.inject.Inject
import kotlin.system.measureTimeMillis
@@ -75,7 +76,8 @@ internal class RoomSummaryUpdater @Inject constructor(
private val roomAvatarResolver: RoomAvatarResolver,
private val eventDecryptor: EventDecryptor,
private val crossSigningService: DefaultCrossSigningService,
private val roomAccountDataDataSource: RoomAccountDataDataSource) {
private val roomAccountDataDataSource: RoomAccountDataDataSource,
private val normalizer: Normalizer) {
fun update(realm: Realm,
roomId: String,
@@ -136,7 +138,7 @@ internal class RoomSummaryUpdater @Inject constructor(
// avoid this call if we are sure there are unread events
!isEventRead(realm.configuration, userId, roomId, latestPreviewableEvent?.eventId)
roomSummaryEntity.displayName = roomDisplayNameResolver.resolve(realm, roomId)
roomSummaryEntity.setDisplayName(roomDisplayNameResolver.resolve(realm, roomId))
roomSummaryEntity.avatarUrl = roomAvatarResolver.resolve(realm, roomId)
roomSummaryEntity.name = ContentMapper.map(lastNameEvent?.content).toModel<RoomNameContent>()?.name
roomSummaryEntity.topic = ContentMapper.map(lastTopicEvent?.content).toModel<RoomTopicContent>()?.topic

View File

@@ -42,11 +42,12 @@ internal class DefaultSignInAgainTask @Inject constructor(
signOutAPI.loginAgain(
PasswordLoginParams.userIdentifier(
// Reuse the same userId
sessionParams.userId,
params.password,
user = sessionParams.userId,
password = params.password,
// The spec says the initial device name will be ignored
// https://matrix.org/docs/spec/client_server/latest#post-matrix-client-r0-login
// but https://github.com/matrix-org/synapse/issues/6525
deviceDisplayName = null,
// Reuse the same deviceId
deviceId = sessionParams.deviceId
)

View File

@@ -23,6 +23,7 @@ import org.matrix.android.sdk.api.session.events.model.Event
import org.matrix.android.sdk.api.session.events.model.EventType
import org.matrix.android.sdk.api.session.events.model.toContent
import org.matrix.android.sdk.api.session.events.model.toModel
import org.matrix.android.sdk.api.session.room.RoomSortOrder
import org.matrix.android.sdk.api.session.room.model.GuestAccess
import org.matrix.android.sdk.api.session.room.model.Membership
import org.matrix.android.sdk.api.session.room.model.PowerLevelsContent
@@ -94,12 +95,14 @@ internal class DefaultSpaceService @Inject constructor(
return spaceGetter.get(spaceId)
}
override fun getSpaceSummariesLive(queryParams: SpaceSummaryQueryParams): LiveData<List<RoomSummary>> {
return roomSummaryDataSource.getSpaceSummariesLive(queryParams)
override fun getSpaceSummariesLive(queryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder): LiveData<List<RoomSummary>> {
return roomSummaryDataSource.getSpaceSummariesLive(queryParams, sortOrder)
}
override fun getSpaceSummaries(spaceSummaryQueryParams: SpaceSummaryQueryParams): List<RoomSummary> {
return roomSummaryDataSource.getSpaceSummaries(spaceSummaryQueryParams)
override fun getSpaceSummaries(spaceSummaryQueryParams: SpaceSummaryQueryParams,
sortOrder: RoomSortOrder): List<RoomSummary> {
return roomSummaryDataSource.getSpaceSummaries(spaceSummaryQueryParams, sortOrder)
}
override fun getRootSpaceSummaries(): List<RoomSummary> {

View File

@@ -39,8 +39,11 @@ internal class RoomSyncEphemeralTemporaryStoreFile @Inject constructor(
moshi: Moshi
) : RoomSyncEphemeralTemporaryStore {
private val workingDir = File(fileDirectory, "rr")
.also { it.mkdirs() }
private val workingDir: File by lazy {
File(fileDirectory, "rr").also {
it.mkdirs()
}
}
private val roomSyncEphemeralAdapter = moshi.adapter(RoomSyncEphemeral::class.java)

View File

@@ -166,7 +166,7 @@ internal class UserAccountDataSyncHandler @Inject constructor(
roomSummaryEntity.directUserId = userId
// Also update the avatar and displayname, there is a specific treatment for DMs
roomSummaryEntity.avatarUrl = roomAvatarResolver.resolve(realm, roomId)
roomSummaryEntity.displayName = roomDisplayNameResolver.resolve(realm, roomId)
roomSummaryEntity.setDisplayName(roomDisplayNameResolver.resolve(realm, roomId))
}
}
}
@@ -178,7 +178,7 @@ internal class UserAccountDataSyncHandler @Inject constructor(
it.directUserId = null
// Also update the avatar and displayname, there was a specific treatment for DMs
it.avatarUrl = roomAvatarResolver.resolve(realm, it.roomId)
it.displayName = roomDisplayNameResolver.resolve(realm, it.roomId)
it.setDisplayName(roomDisplayNameResolver.resolve(realm, it.roomId))
}
}

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