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

Compare commits

...

240 Commits

Author SHA1 Message Date
Benoit Marty
01452efd8d Merge branch 'release/0.7.0' 2019-10-24 14:37:52 +02:00
Benoit Marty
af08759af6 Prepare release 0.7.0 2019-10-24 14:37:28 +02:00
Benoit Marty
e52f0faaa7 Merge pull request #638 from vector-im/feature/filter
Fix 2 issues with share Activity: filter and room lists
2019-10-24 14:03:08 +02:00
Benoit Marty
8fa676d034 Share Activity: display rooms of all communities 2019-10-24 12:19:25 +02:00
Benoit Marty
b6594599c4 Rename member 2019-10-24 10:53:19 +02:00
Benoit Marty
8be8cc9ef7 Filter rooms when sharing element 2019-10-24 10:45:53 +02:00
ganfra
b17b54d218 Merge pull request #637 from vector-im/feature/fix_room_summary
Feature/fix some room related stuff
2019-10-23 17:29:14 +02:00
ganfra
187e2a26db Clean after Benoit's review 2019-10-23 17:26:56 +02:00
ganfra
2f5fdbb7e2 Clean and fix lint 2019-10-23 16:20:38 +02:00
ganfra
8b1411f533 Read marker: test if local echo before hitting the SDK to change read marker id + reduce a bit delay 2019-10-23 16:13:35 +02:00
Benoit Marty
bdee5e0687 Fix warning on Strings 2019-10-23 15:17:21 +02:00
Benoit Marty
ce4e244a3b Merge pull request #635 from vector-im/feature/strings
Import Strings from Riot
2019-10-23 15:09:58 +02:00
Benoit Marty
ff81715783 Import Strings from Riot 2019-10-23 14:18:40 +02:00
ganfra
3196dcb57e MessageActions: disable if not synced atm 2019-10-23 12:20:03 +02:00
ganfra
50bf6df7fe Room summary: fix some issues with local echo and sending event 2019-10-23 11:55:19 +02:00
Benoit Marty
02914495ce Merge pull request #632 from vector-im/feature/cleanuo
More cleanup
2019-10-23 10:26:54 +02:00
Benoit Marty
70a14f6350 Merge pull request #619 from vector-im/feature/attachments
Feature/attachments
2019-10-23 10:09:57 +02:00
Benoit Marty
cac5fb725a Code cleanup 2019-10-22 18:35:05 +02:00
Benoit Marty
dbc17ae515 Use AppCompatEditText instead of EditText 2019-10-22 18:23:53 +02:00
Benoit Marty
1de02c2fbb Ensure android.text.TextUtils will never be used again 2019-10-22 17:41:59 +02:00
ganfra
6d55c15761 Fix lint issue 2019-10-22 17:41:21 +02:00
Benoit Marty
377a228f88 Improve code 2019-10-22 17:31:07 +02:00
ganfra
2974f8b200 Merge branch 'develop' into feature/attachments 2019-10-22 17:27:15 +02:00
ganfra
7388a408b8 Permissions: allow to provide the rationale message as it requires "context" and cannot be generic 2019-10-22 17:13:38 +02:00
Benoit Marty
f43dcb1183 Update room summary when saving local echo from DefaultRelationService 2019-10-22 16:54:48 +02:00
Benoit Marty
492ed3954a code cleanup 2019-10-22 16:54:48 +02:00
Benoit Marty
7890e83204 Merge pull request #630 from vector-im/feature/crypto_lock
Fix dead lock on crypto
2019-10-22 16:53:33 +02:00
Benoit Marty
00d1a2c380 Merge pull request #629 from vector-im/feature/fix_malformed_event_bug
Fix / event mapper persist the clear type in type
2019-10-22 14:47:08 +02:00
Benoit Marty
78dfd6b3e6 Fix potential lock due to nested synchronized(unknownSessionsFailure) 2019-10-22 14:20:43 +02:00
Benoit Marty
3abce34484 Add in existingRequest only if not filtered 2019-10-22 12:45:36 +02:00
Benoit Marty
4204ab262c Fix compilation issue 2019-10-22 12:42:01 +02:00
ganfra
c7a4d34192 Attachments: handle rich content from keyboard 2019-10-22 12:37:59 +02:00
Benoit Marty
7416fec93e Do not decrypt event if session is unknown 2019-10-22 12:37:17 +02:00
Benoit Marty
3c40f64fb7 Add a few comments 2019-10-22 12:33:25 +02:00
Benoit Marty
b57c71b1c9 Remove unused import 2019-10-22 12:27:55 +02:00
Benoit Marty
fea54952d3 Code quality 2019-10-22 12:26:56 +02:00
Benoit Marty
3dc5ef54ab Fix compilation warnings 2019-10-22 12:21:50 +02:00
Benoit Marty
9092b97fb8 Merge pull request #622 from Dominaezzz/kotlinify
Some more clean up
2019-10-22 12:17:25 +02:00
Benoit Marty
cebd8136da Merge branch 'develop' into kotlinify 2019-10-22 12:16:20 +02:00
Valere
64b3568d51 Fix / event mapper persist the clear type in type 2019-10-22 11:57:11 +02:00
Dominic Fischer
5e4e54153c Fix build error.
Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
2019-10-21 22:52:58 +01:00
Dominic Fischer
d071324694 Address review comments.
Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
2019-10-21 22:29:36 +01:00
ganfra
2c8cd89533 Handle rich content from app (WIP not compiling) 2019-10-21 19:02:28 +02:00
Benoit Marty
11b5c2c3ba Restore previous log level 2019-10-21 18:17:03 +02:00
Benoit Marty
9d7c4abb97 Merge pull request #615 from vector-im/feature/report_content
Add ability to report content
2019-10-21 18:13:44 +02:00
ganfra
8e3234d188 Clean some code 2019-10-21 18:08:42 +02:00
Benoit Marty
b253722b98 Disable animation 2019-10-21 17:22:28 +02:00
Benoit Marty
fce576e3a4 Message action bottom sheet expanded 2019-10-21 17:22:28 +02:00
Benoit Marty
7ed7b18ccd Remove unused import 2019-10-21 17:22:28 +02:00
Benoit Marty
053bf7aeac Improve layout preview a bit 2019-10-21 17:22:28 +02:00
ganfra
6ccd083451 Bottom sheet: fix RecyclerView usage 2019-10-21 17:22:28 +02:00
Benoit Marty
e39c4a7925 fix ktlint issue 2019-10-21 17:22:28 +02:00
Benoit Marty
abdb83b9fd Report content: change log 2019-10-21 17:22:28 +02:00
Benoit Marty
0bcc84cbd6 Try to fix the bottom sheet showing expanded by default #2
Seems ok now
2019-10-21 17:22:00 +02:00
Benoit Marty
b2f6fb8c91 Try to fix the bottom sheet showing expanded by default.
The second time it's open, it's not expanded... With this fix, the bug appear only at the third time...
2019-10-21 17:22:00 +02:00
Benoit Marty
36042ed145 Report content: red color for "block user" button 2019-10-21 17:22:00 +02:00
Benoit Marty
6ad1932fe5 Report content: custom reason 2019-10-21 17:22:00 +02:00
Benoit Marty
4a6237b50e Report content: confirmation dialogs 2019-10-21 17:22:00 +02:00
Benoit Marty
a7a19dab11 Report content: Service and REST request 2019-10-21 17:22:00 +02:00
Benoit Marty
8d0aa0437c Report content: UI menu 2019-10-21 17:21:26 +02:00
Benoit Marty
0a79b8b315 Cleanup 2019-10-21 17:21:26 +02:00
Benoit Marty
1dacfa6744 Rework message menu bottom sheet: remove sub Fragment and use Epoxy
- Also move some class to some dedicated package
2019-10-21 17:21:26 +02:00
Benoit Marty
723a007c39 Merge pull request #626 from vector-im/feature/myUserIdInject
Inject userId where possible
2019-10-21 16:01:48 +02:00
Benoit Marty
eaa1b04a4a Merge pull request #616 from vector-im/feature/big_font_regression
Fix regression after merge conflict: big font for messages with only big emoji
2019-10-18 15:03:43 +02:00
Benoit Marty
b1710fde60 Merge pull request #618 from vector-im/feature/mark_all_read
Mark all as read
2019-10-18 15:02:16 +02:00
Benoit Marty
cd0a40c18d Fix compil test issue 2019-10-18 14:34:44 +02:00
Benoit Marty
17636019e0 Change order of parameters 2019-10-18 14:32:34 +02:00
Benoit Marty
8078c39d6e Rename parameter 2019-10-18 14:29:32 +02:00
Benoit Marty
be94b2f90a Change order of parameters (no effect) 2019-10-18 14:28:12 +02:00
Benoit Marty
eff04be247 Change order of class (no effect) 2019-10-18 14:26:24 +02:00
Benoit Marty
3986839801 Inject userId 2019-10-18 14:25:19 +02:00
ganfra
9e436483de Use klint 2019-10-16 10:39:42 +02:00
ganfra
05a069be04 Attachments: fix themes for selection view 2019-10-16 10:04:33 +02:00
ganfra
a1a71e2f1d App state: fix session 2019-10-16 10:04:11 +02:00
Benoit Marty
203da0f37e Mark all as read: not for all Room list and look if there is unread rooms 2019-10-16 10:03:30 +02:00
ganfra
6cd04525aa Clean after Benoit's review 2019-10-15 11:37:22 +02:00
ganfra
3c3c6aeac6 Removes the RoomList handling from a viewmodel as it doesn't have a ViewState and should be provided globally (IE, from application state) 2019-10-15 11:24:20 +02:00
Benoit Marty
e71311f576 Merge pull request #612 from vector-im/feature/browser_tab
Opening links from RiotX reuses browser tab (#599)
2019-10-15 11:05:06 +02:00
Benoit Marty
e4d0e0b0bf Update after Ganfra's review 2019-10-15 11:03:30 +02:00
Benoit Marty
28e5e42ab1 Merge pull request #614 from vector-im/feature/recycler_view_upgrade
Upgrade RecyclerView version to fix issues with a11y.
2019-10-15 10:47:59 +02:00
Benoit Marty
b860c3b0e3 Merge pull request #623 from Dominaezzz/typos
Fix some typos/errors in documentation.
2019-10-12 21:06:09 +02:00
Dominic Fischer
f7f97e2098 Typos
Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
2019-10-12 16:04:47 +01:00
Dominic Fischer
e28e2dadb9 Some more clean up
Signed-off-by: Dominic Fischer <dominicfischer7@gmail.com>
2019-10-12 15:37:20 +01:00
ganfra
c28be6adb0 Fix code quality check 2019-10-11 17:23:25 +02:00
Benoit Marty
c57af9cf3e Better formatting 2019-10-11 17:18:54 +02:00
ganfra
679b0fff98 Use klint and update CHANGES 2019-10-11 17:12:53 +02:00
Benoit Marty
946fc36a26 Update contributing doc 2019-10-11 17:12:51 +02:00
ganfra
13a5f784dc Merge branch 'develop' into feature/attachments 2019-10-11 17:05:03 +02:00
ganfra
0ca8696e88 Attachments/Share: cleaning code and add contact picking 2019-10-11 16:41:04 +02:00
Benoit Marty
3622c0ecb4 Mark all as read 2019-10-11 16:22:32 +02:00
Benoit Marty
116d569fa8 Fix regression after merge conflict: big font for messages with only big emoji 2019-10-11 14:35:37 +02:00
ganfra
ee5ebb4b83 Attachments: get better layout 2019-10-11 12:20:39 +02:00
Benoit Marty
0a0c344bfb Upgrade RecyclerView version to fix issues with a11y.
Also minor upgrade of some other libs
2019-10-11 10:10:16 +02:00
Benoit Marty
82fc97f619 Add dictionary specific to the project to VCS 2019-10-11 09:32:43 +02:00
ganfra
20696353b8 Attachments: try to improve a bit the UI and adding options [WIP] 2019-10-10 19:12:16 +02:00
ganfra
ae5b6bd2b9 Attachments/Sharing: refact a bit and handle more data. 2019-10-10 16:55:50 +02:00
Benoit Marty
1e11d4492b Merge pull request #610 from vector-im/feature/warnings
Fix all warnings and ensure they will not come back
2019-10-10 10:37:49 +02:00
ganfra
6e39164b20 Sharing: start handling incoming share [WIP] 2019-10-09 20:05:37 +02:00
ganfra
0a9ebb6bf6 Attachments: use a lib which handles for us all the intent stuff. 2019-10-09 19:51:00 +02:00
Benoit Marty
db009ce683 Fix warning on release build 2019-10-09 16:47:27 +02:00
Benoit Marty
55c80d3743 ktlint: ignore (experimental:annotation) rule 2019-10-09 16:44:45 +02:00
Benoit Marty
fbb23dfb66 ktlint: fix (no-empty-first-line-in-method-block) issues 2019-10-09 16:43:12 +02:00
Benoit Marty
e5779d425a ktlint: fix (experimental:multiline-if-else) issues 2019-10-09 16:40:44 +02:00
Benoit Marty
99d9704a50 ktlint: enable experimental features 2019-10-09 16:38:23 +02:00
Benoit Marty
3f8ddbe880 Opening links from RiotX reuses browser tab (#599) 2019-10-09 16:23:35 +02:00
Benoit Marty
30e43e47cd Fix filename ktlint issues 2019-10-09 15:44:01 +02:00
Benoit Marty
15dc4d6369 Fix ktlint issue automatically by running ./ktlint --android -v -F 2019-10-09 15:24:05 +02:00
Benoit Marty
dceb5ffd8d ktlint needs java 2019-10-09 15:19:07 +02:00
Benoit Marty
eec470f2ce Fix code quality issues 2019-10-09 15:15:15 +02:00
Benoit Marty
68db9c1cc0 Create a specific step for ktlint 2019-10-09 15:11:21 +02:00
Benoit Marty
cdfc402599 Fix Timber error in formatting 2019-10-09 15:06:38 +02:00
Benoit Marty
72d3f1e909 Configure ktlint 2019-10-09 15:06:38 +02:00
Benoit Marty
255fa11e89 Remove extra spaces 2019-10-09 12:49:00 +02:00
Benoit Marty
119e4c0d32 Fix warnings in the App 2019-10-09 12:49:00 +02:00
Benoit Marty
a9c474105a Fix warnings in the SDK 2019-10-09 12:49:00 +02:00
Benoit Marty
6de64cbedd Treat warnings from the kotlin compiler as errors 2019-10-09 12:49:00 +02:00
Benoit Marty
546c537e3b Upgrade build tools version from 3.5.0 to 3.5.1 2019-10-09 12:49:00 +02:00
Benoit Marty
36c5f9af13 Merge pull request #583 from vector-im/feature/invot_notification
Invitation notifications are not dismissed automatically if room is joined from another client (#347)
2019-10-09 12:48:07 +02:00
Benoit Marty
c2682c7f4b Merge pull request #609 from vector-im/feature/remove_event_bus
Stop sending bus event from SDK to App.
2019-10-09 12:47:06 +02:00
ganfra
3073470c38 Attachments: start working on new UI (using system file picker) [WIP] 2019-10-08 19:59:09 +02:00
Benoit Marty
549f749682 Nest the try catch blocks 2019-10-08 14:00:11 +02:00
Benoit Marty
d4dfb76e80 Change constant value (for application upgrade reason) 2019-10-08 13:57:32 +02:00
Benoit Marty
e80191b2e0 Use mutableSet 2019-10-08 13:52:26 +02:00
Benoit Marty
c62c77f14c Stop sending bus event from SDK to App. 2019-10-08 12:00:40 +02:00
Benoit Marty
d6e5c5a857 Merge pull request #608 from vector-im/feature/a11y_review
Feature/a11y review
2019-10-08 11:16:08 +02:00
Benoit Marty
50a0660ab6 Invitation notifications are not dismissed automatically if room is joined from another client (#347) 2019-10-08 10:56:47 +02:00
Benoit Marty
ecdb3c3326 Merge pull request #591 from vector-im/feature/image_orientation
Fix issue with image orientation
2019-10-08 10:53:46 +02:00
Benoit Marty
2cd1d697fe Cleanup after Gafnra's review 2019-10-08 10:53:21 +02:00
Benoit Marty
3f9b7813bc Remove undocumented attribute and fix issue with image size when it contains exif rotation 2019-10-08 10:53:21 +02:00
Benoit Marty
f34f28b668 Add Exif orientation info to ContentAttachmentData 2019-10-08 10:52:54 +02:00
Benoit Marty
53572a3be6 Fix crash observed on the PlayStore 2019-10-08 10:52:54 +02:00
Benoit Marty
90b6199e10 Fix compilation issue 2019-10-08 10:45:45 +02:00
Benoit Marty
0aa299aa37 Private 2019-10-07 19:11:53 +02:00
Benoit Marty
d387c310c8 Cleanup code after a11y PR (#596) and fix some merging issues 2019-10-07 18:41:44 +02:00
Benoit Marty
8bd1fb08f7 Update template 2019-10-07 17:18:07 +02:00
Benoit Marty
ac6aff9175 Merge pull request #596 from pvagner/a11y
more a11y tweaks
2019-10-07 17:15:29 +02:00
Benoit Marty
adf0382d28 Merge pull request #603 from vector-im/feature/clear_corrupted_realm
Feature/clear corrupted realm
2019-10-07 16:35:23 +02:00
Benoit Marty
51554f7be0 Merge pull request #595 from vector-im/feature/lib_upgrade
Upgrade some dependencies
2019-10-07 16:22:30 +02:00
Benoit Marty
c1c1c3f999 Use latest coroutine lib: v1.3.2 2019-10-07 16:22:09 +02:00
Benoit Marty
8b04fdab77 Upgrade other libraries 2019-10-07 16:22:09 +02:00
Benoit Marty
f8b665a245 Fix warning 2019-10-07 16:21:18 +02:00
Benoit Marty
d68a9a5342 Split long line 2019-10-07 16:21:18 +02:00
Benoit Marty
5d2ff589f8 Upgrade gradle plugins 2019-10-07 16:21:18 +02:00
Benoit Marty
e85a0783fc Upgrade kotlin version 2019-10-07 16:21:18 +02:00
Benoit Marty
d6c278288d upgrade google play services plugin 2019-10-07 16:21:18 +02:00
Benoit Marty
4ad86a13a0 Upgrade the dependencies to the latest version 2019-10-07 16:21:18 +02:00
ganfra
4f7ec91255 Merge pull request #604 from vector-im/feature/performance
Feature/performance
2019-10-07 16:08:39 +02:00
Benoit Marty
979b42aa30 Do not delete the crypto DB when deleting the session DB 2019-10-07 16:07:57 +02:00
ganfra
fc49de080c Clean after benoit's review 2019-10-07 16:00:11 +02:00
Benoit Marty
d2b9668d4e Inject element where they are used 2019-10-07 15:25:54 +02:00
ganfra
0632870be1 Merge pull request #605 from vector-im/feature/fixing_crashes
Feature/fixing crashes
2019-10-07 14:51:50 +02:00
ganfra
8e39fd2a70 Clean after benoit's review 2019-10-07 14:45:58 +02:00
ganfra
abbc62dd35 Clear corrupted db: add some logs 2019-10-04 19:42:27 +02:00
ganfra
77de059dc9 Timeline: fix potential issues when starting/disposing the timeline 2019-10-04 19:37:44 +02:00
ganfra
1931a1a4a4 Sync: use some suspending function where it makes sense 2019-10-04 19:37:23 +02:00
ganfra
9c5987b682 SAS: fix potential crash 2019-10-04 19:36:22 +02:00
ganfra
4e4fb4c565 Crypto store: fix potential issue with realm open/close process 2019-10-04 19:36:10 +02:00
ganfra
0582d0f641 Timeline: fix some crashes 2019-10-04 12:12:39 +02:00
ganfra
ef2af14529 Realm: remove RealmLiveData and use Optional for LiveData with potential null value 2019-10-03 19:19:53 +02:00
ganfra
525da17678 Optimization: try to get a more performant reactions display management 2019-10-03 19:15:11 +02:00
Peter Vágner
aab41d7358 Code quality
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-03 16:34:31 +02:00
Peter Vágner
5db3c81aa9 Add contentDescription to the jump to botton view
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-02 20:51:57 +02:00
ganfra
c763635845 Optimize: try to optimize a text message items 2019-10-02 20:36:52 +02:00
Peter Vágner
11d72b81f6 Add CHANGES.md entry 2019-10-02 20:04:33 +02:00
Peter Vágner
53543453b3 Login: add contentDescription to password reveal
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-02 20:04:33 +02:00
Peter Vágner
d4be68191c Fix conflicts after rebase
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-02 20:04:33 +02:00
Peter Vágner
7ef471ad0d Add contentDescription for the read receipts
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-02 20:04:33 +02:00
Peter Vágner
73dd735ba6 Reactions: Add content descriptions to emoji chooser category tabs and individual emojis
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-02 20:04:33 +02:00
Peter Vágner
2f6d3adb17 Message composer: describe the image button for dismissing as cancel rather than close
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-02 20:04:33 +02:00
Peter Vágner
2edfd4e830 Message composer: add content descriptions to image buttons
Signed-off-by: Peter Vágner <pvdeejay@gmail.com>
2019-10-02 20:04:33 +02:00
ganfra
ff7856c535 Optimize: start removing some constraint layout from timeline 2019-10-02 19:30:01 +02:00
ganfra
650a151b18 Optimize: remove some epoxy building from main thread 2019-10-01 20:12:15 +02:00
ganfra
275dd20412 Optimize: don't build OkHttp in Application OnCreate if we don't need it 2019-10-01 20:12:01 +02:00
ganfra
44f6391cb4 Optimize: use LazyThreeTen 2019-10-01 20:11:15 +02:00
ganfra
588e5d6e63 Hot fix: fix home navigation issue 2019-10-01 17:39:20 +02:00
ganfra
716999eec6 Merge pull request #592 from vector-im/feature/read_marker
Feature/read marker
2019-10-01 13:55:09 +02:00
ganfra
42e0a45f3f Merge branch 'develop' into feature/read_marker 2019-10-01 13:37:21 +02:00
ganfra
31397869b2 Read marker: refine JumpToReafMarkerView 2019-10-01 12:33:38 +02:00
ganfra
e842bf13b2 Timeline: fix back pagination state 2019-10-01 12:32:48 +02:00
ganfra
aea34da81e Merge pull request #593 from vector-im/feature/group_avatar
Group avatar live
2019-10-01 11:45:43 +02:00
ganfra
0814f53fed Group avatar: clean and optimize a bit. 2019-10-01 11:25:41 +02:00
ganfra
b5c6c1af0d Realm: allow to clear corrupted session db 2019-09-30 19:09:10 +02:00
Benoit Marty
de30e7c1c6 Code cleanup 2019-09-26 19:00:38 +02:00
Benoit Marty
2d95fe921d after login, the icon in the top left is a green 'A' for (all communities) rather than my avatar (#267) - part2 (Toolbar) 2019-09-26 18:42:27 +02:00
Benoit Marty
84542326f4 HomeDetailFragment observe the selectedGroupStore instead of passing argument 2019-09-26 18:06:24 +02:00
Benoit Marty
53b1b89c47 after login, the icon in the top left is a green 'A' for (all communities) rather than my avatar (#267) 2019-09-26 17:30:30 +02:00
ganfra
28315be7b9 Update CHANGES 2019-09-26 17:05:18 +02:00
ganfra
8605095668 Fix quality code issues 2019-09-26 16:49:41 +02:00
ganfra
737959f616 Merge branch 'develop' into feature/read_marker 2019-09-26 15:15:34 +02:00
Benoit Marty
7817f49072 Merge pull request #590 from vector-im/feature/quickfix
Fix my dirty code
2019-09-26 14:50:38 +02:00
Benoit Marty
a060431aaf Fix my dirty code 2019-09-26 13:51:44 +02:00
ganfra
a3f561d788 Merge branch 'develop' into feature/read_marker 2019-09-26 12:19:40 +02:00
ganfra
0ea878af8a Timeline: fix some more issues 2019-09-26 11:55:16 +02:00
Benoit Marty
99de40c980 Merge pull request #589 from vector-im/feature/media_upload_failure
Fix media upload failure
2019-09-26 11:30:54 +02:00
Benoit Marty
810a97c639 Import string from Android-SDK (#355) 2019-09-26 11:14:13 +02:00
Benoit Marty
f02f16d9c5 Use IEC units instead of SI units for file sizes 2019-09-26 10:41:52 +02:00
Benoit Marty
62b7a83a31 Update after Dominaezzz's review 2019-09-26 10:08:44 +02:00
ganfra
4a80df082c Timeline: refact [WIP] 2019-09-25 19:14:12 +02:00
Benoit Marty
60f6b3ef02 Auto review 2019-09-25 17:08:58 +02:00
Benoit Marty
a0b1ef3216 Do not upload file to big for the homeserver (#587)
Also create a HomeServerCapabilitiesService which provide configuration of the homeserver.
Data are retrieved every 8 hours (as RiotWeb?)
2019-09-25 16:59:50 +02:00
Benoit Marty
1b66d1f746 Fix bad rendering of file item if the filename is long 2019-09-25 15:25:26 +02:00
Benoit Marty
643a2baabf Set click and long click listener even if information data are not displayed 2019-09-25 15:03:16 +02:00
Benoit Marty
cd62e87266 Human readable error 2019-09-25 14:44:34 +02:00
Benoit Marty
17cba1a432 Display progress in the timeline when uploading file 2019-09-25 14:39:33 +02:00
Benoit Marty
f077cc8467 Stop sending media in an infinite loop in case of error (part of #587)
Not sure how this commit fix it, but the issue is not observed anymore with it
2019-09-25 14:09:26 +02:00
Benoit Marty
f3039601bf throw Failure instead of meaning less IOException 2019-09-25 11:27:23 +02:00
Benoit Marty
4c04014e4d Do not log big data request (ex: file upload) 2019-09-25 11:26:49 +02:00
Benoit Marty
ae8bceacba Create Extension to convert a Response to a Failure -> expose to other object 2019-09-25 11:26:13 +02:00
Benoit Marty
9b91b6ea87 Create Extension to convert a Response to a Failure 2019-09-25 10:56:18 +02:00
Benoit Marty
b24a372262 Show "Clear message queue" option (in debug mode) 2019-09-25 10:50:13 +02:00
ganfra
63b43de4b8 Read marker: final refact [WIP] 2019-09-24 22:52:43 +02:00
Benoit Marty
d1a61f29e4 Merge pull request #586 from vector-im/feature/persist_tab
Persist opened tab between session (i.e. after application restart)
2019-09-24 16:12:28 +02:00
Benoit Marty
f6373221de Dagger cleanup 2019-09-24 16:05:08 +02:00
Benoit Marty
b5f2f01c8d Merge branch 'hotfix/dimensionConverter' into develop 2019-09-24 14:28:51 +02:00
Benoit Marty
21d808c1ce Fix crash: MergedHeaderItem was missing dimensionConverter 2019-09-24 14:28:34 +02:00
Benoit Marty
0d80750507 Create interface for UiStateRepository and an implementation with SharedPrefs 2019-09-24 13:43:50 +02:00
Benoit Marty
1c9cf7a810 Dagger code cleanup 2019-09-24 13:40:03 +02:00
ganfra
c6d01fbcf4 ReadMarker: extract from ViewModel the jump to read marker visibility logic as it's easier to deal with. 2019-09-24 12:57:32 +02:00
Benoit Marty
9e1ded941f Persist active tab between sessions (#503) 2019-09-24 12:29:37 +02:00
Benoit Marty
af433266c8 Move currentDisplayMode to the ViewState 2019-09-24 11:32:55 +02:00
ganfra
05d09bf950 Merge branch 'develop' into feature/read_marker 2019-09-24 11:10:59 +02:00
Benoit Marty
6890f83810 Cleanup dead code 2019-09-24 10:47:29 +02:00
Benoit Marty
51568c30a6 Version++ 2019-09-24 10:23:51 +02:00
Benoit Marty
e019ec6596 Merge branch 'release/0.6.0' into develop 2019-09-24 10:22:42 +02:00
ganfra
f6d34ec7fd Timeline: update state management 2019-09-23 17:43:37 +02:00
ganfra
b6e18e4a8f Timeline: add badge also when unread without notif 2019-09-20 18:34:58 +02:00
ganfra
7e29665fd0 Timeline: add some comments and checks 2019-09-20 18:34:31 +02:00
ganfra
90eeb68d36 Timeline: fix permalink towards an hidden event 2019-09-20 17:22:04 +02:00
ganfra
d1ff3314a7 Timeline : add badge on jump to bottom view 2019-09-19 19:12:45 +02:00
ganfra
ea0809ff87 Merge branch 'develop' into feature/read_marker 2019-09-19 16:57:00 +02:00
ganfra
9668487b6b Timeline/Read: update read receipt locally to 2019-09-19 16:17:58 +02:00
ganfra
88fb9667a3 Timeline: continue fixing issues + read marker 2019-09-18 20:21:42 +02:00
ganfra
3066d5f303 Timeline\ReadMarker: continue fixing issues 2019-09-17 19:38:05 +02:00
ganfra
69fb7bdf95 Timeline\Read marker: continue fixing potential issues 2019-09-16 18:14:41 +02:00
ganfra
5d6d0202a9 Timeline: try to fix some issues with permalink [WIP] 2019-09-14 14:11:41 +02:00
ganfra
f4ab770be9 Merge branch 'develop' into feature/read_marker 2019-09-12 17:24:50 +02:00
ganfra
d4111d053d Read marker: only show banner until scrolled to read marker 2019-09-12 16:35:45 +02:00
ganfra
b8ebe3570b Timeline: refact epoxy attributes 2019-09-11 18:04:17 +02:00
ganfra
51a4c93676 Read markers: continue working on ui 2019-08-23 16:54:32 +02:00
ganfra
d8f449388c Read marker: start working on it (no UI) 2019-08-20 18:30:24 +02:00
1132 changed files with 12341 additions and 8569 deletions

View File

@@ -54,4 +54,13 @@ steps:
# Code quality
- label: "Code quality"
command: "./tools/check/check_code_quality.sh"
command:
- "./tools/check/check_code_quality.sh"
- label: "ktlint"
command:
- "curl -sSLO https://github.com/pinterest/ktlint/releases/download/0.34.2/ktlint && chmod a+x ktlint"
- "./ktlint --android --experimental -v"
plugins:
- docker#v3.1.0:
image: "openjdk"

32
.editorconfig Normal file
View File

@@ -0,0 +1,32 @@
# For ktlint configuration. Ref: https://ktlint.github.io/
[*.{kt,kts}]
# possible values: number (e.g. 2), "unset" (makes ktlint ignore indentation completely)
indent_size=unset
# true (recommended) / false
insert_final_newline=true
# possible values: number (e.g. 120) (package name, imports & comments are ignored), "off"
# it's automatically set to 100 on `ktlint --android ...` (per Android Kotlin Style Guide)
max_line_length=off
# Comma-separated list of rules to disable (Since 0.34.0)
# Note that rules in any ruleset other than the standard ruleset will need to be prefixed
# by the ruleset identifier.
disabled_rules=no-wildcard-imports,no-multi-spaces,colon-spacing,chain-wrapping,import-ordering,experimental:annotation
# The following (so far identified) rules are kept:
# no-blank-line-before-rbrace
# final-newline
# no-consecutive-blank-lines
# comment-spacing
# filename
# comma-spacing
# paren-spacing
# op-spacing
# string-template
# no-unused-imports
# curly-spacing
# no-semi
# no-empty-class-body
# experimental:multiline-if-else
# experimental:no-empty-first-line-in-method-block

14
.gitignore vendored
View File

@@ -1,14 +1,18 @@
*.iml
.gradle
/local.properties
.idea/*
/.idea/*
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
# idea files: exclude everything except dictionnaries
.idea/caches
.idea/codeStyles
.idea/libraries
.idea/*.xml
.DS_Store
/build
/captures
.externalNativeBuild
/tmp
ktlint
.idea/copyright/New_vector.xml
.idea/copyright/profiles_settings.xml

19
.idea/dictionaries/bmarty.xml generated Normal file
View File

@@ -0,0 +1,19 @@
<component name="ProjectDictionaryState">
<dictionary name="bmarty">
<words>
<w>backstack</w>
<w>bytearray</w>
<w>ciphertext</w>
<w>decryptor</w>
<w>emoji</w>
<w>emojis</w>
<w>hmac</w>
<w>ktlint</w>
<w>linkified</w>
<w>linkify</w>
<w>megolm</w>
<w>pbkdf</w>
<w>pkcs</w>
</words>
</dictionary>
</component>

View File

@@ -1,3 +1,29 @@
Changes in RiotX 0.7.0 (2019-10-24)
===================================================
Features:
- Share elements from other app to RiotX (#58)
- Read marker (#84)
- Add ability to report content (#515)
Improvements:
- Persist active tab between sessions (#503)
- Do not upload file too big for the homeserver (#587)
- Attachments: start using system pickers (#52)
- Mark all messages as read (#396)
Other changes:
- Accessibility improvements to read receipts in the room timeline and reactions emoji chooser
Bugfix:
- Fix issue on upload error in loop (#587)
- Fix opening a permalink: the targeted event is displayed twice (#556)
- Fix opening a permalink paginates all the history up to the last event (#282)
- after login, the icon in the top left is a green 'A' for (all communities) rather than my avatar (#267)
- Picture uploads are unreliable, pictures are shown in wrong aspect ratio on desktop client (#517)
- Invitation notifications are not dismissed automatically if room is joined from another client (#347)
- Opening links from RiotX reuses browser tab (#599)
Changes in RiotX 0.6.1 (2019-09-24)
===================================================
@@ -141,21 +167,21 @@ Mode details here: https://medium.com/@RiotChat/introducing-the-riotx-beta-for-a
Changes in RiotX 0.0.0 (2019-XX-XX)
===================================================
Features:
Features:
-
Improvements:
Improvements 🙌:
-
Other changes:
-
Bugfix:
Bugfix 🐛:
-
Translations:
Translations 🗣:
-
Build:
Build 🧱:
-

View File

@@ -40,19 +40,45 @@ Please add a line to the top of the file `CHANGES.md` describing your change.
Make sure the following commands execute without any error:
> ./tools/check/check_code_quality.sh
#### Internal tool
> ./gradlew lintGplayRelease
<pre>
./tools/check/check_code_quality.sh
</pre>
#### ktlint
<pre>
curl -sSLO https://github.com/pinterest/ktlint/releases/download/0.34.2/ktlint && chmod a+x ktlint
./ktlint --android --experimental -v
</pre>
Note that you can run
<pre>
./ktlint --android --experimental -v -F
</pre>
For ktlint to fix some detected errors for you (you still have to check and commit the fix of course)
#### lint
<pre>
./gradlew lintGplayRelease
./gradlew lintFdroidRelease
</pre>
### Unit tests
Make sure the following commands execute without any error:
> ./gradlew testGplayReleaseUnitTest
<pre>
./gradlew testGplayReleaseUnitTest
</pre>
### Tests
RiotX is currently supported on Android Jelly Bean (API 16+): please test your change on an Android device (or Android emulator) running with API 16. Many issues can happen (including crashes) on older devices.
RiotX is currently supported on Android KitKat (API 19+): please test your change on an Android device (or Android emulator) running with API 19. Many issues can happen (including crashes) on older devices.
Also, if possible, please test your change on a real device. Testing on Android emulator may not be sufficient.
### Internationalisation

View File

@@ -1,9 +1,7 @@
import javax.tools.JavaCompiler
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.3.21'
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
@@ -12,11 +10,11 @@ buildscript {
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
classpath 'com.google.gms:google-services:4.2.0'
classpath "com.airbnb.okreplay:gradle-plugin:1.4.0"
classpath 'com.android.tools.build:gradle:3.5.1'
classpath 'com.google.gms:google-services:4.3.2'
classpath "com.airbnb.okreplay:gradle-plugin:1.5.0"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2'
classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7.1'
classpath 'com.google.android.gms:oss-licenses-plugin:0.9.5'
// NOTE: Do not place your application dependencies here; they belong
@@ -61,6 +59,11 @@ allprojects {
]
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
// Warnings are potential errors, so stop ignoring them
kotlinOptions.allWarningsAsErrors = true
}
afterEvaluate {
extensions.findByName("kapt")?.arguments {
arg("dagger.gradle.incremental", "enabled")

View File

@@ -1,6 +1,6 @@
#Tue Mar 19 09:53:05 CET 2019
#Fri Sep 27 10:10:35 CEST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

View File

@@ -5,8 +5,6 @@ apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 28
defaultConfig {
minSdkVersion 16
targetSdkVersion 28
@@ -14,7 +12,6 @@ android {
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
@@ -29,12 +26,14 @@ android {
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
dependencies {
implementation project(":matrix-sdk-android")
implementation 'androidx.appcompat:appcompat:1.1.0-beta01'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
// Paging

View File

@@ -20,7 +20,6 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import io.reactivex.Observable
import io.reactivex.android.MainThreadDisposable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.schedulers.Schedulers
private class LiveDataObservable<T>(
@@ -60,4 +59,4 @@ private class LiveDataObservable<T>(
fun <T> LiveData<T>.asObservable(): Observable<T> {
return LiveDataObservable(this).observeOn(Schedulers.computation())
}
}

View File

@@ -19,7 +19,6 @@ package im.vector.matrix.rx
import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.util.Cancelable
import io.reactivex.CompletableEmitter
import io.reactivex.SingleEmitter
internal class MatrixCallbackCompletable<T>(private val completableEmitter: CompletableEmitter) : MatrixCallback<T> {
@@ -36,4 +35,4 @@ fun Cancelable.toCompletable(completableEmitter: CompletableEmitter) {
completableEmitter.setCancellable {
this.cancel()
}
}
}

View File

@@ -35,4 +35,4 @@ fun <T> Cancelable.toSingle(singleEmitter: SingleEmitter<T>) {
singleEmitter.setCancellable {
this.cancel()
}
}
}

View File

@@ -14,13 +14,11 @@
* limitations under the License.
*/
package im.vector.riotx.core.dialogs
package im.vector.matrix.rx
import android.content.Context
import im.vector.matrix.android.api.util.Optional
import io.reactivex.Observable
internal class DialogSendItemAdapter(context: Context, items: MutableList<DialogListItem>) : DialogAdapter(context) {
init {
addAll(items)
}
fun <T : Any> Observable<Optional<T>>.unwrap(): Observable<T> {
return filter { it.hasValue() }.map { it.get() }
}

View File

@@ -22,25 +22,34 @@ import im.vector.matrix.android.api.session.room.model.ReadReceipt
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.session.room.send.UserDraft
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
import im.vector.matrix.android.api.util.Optional
import io.reactivex.Observable
import io.reactivex.Single
class RxRoom(private val room: Room) {
fun liveRoomSummary(): Observable<RoomSummary> {
return room.liveRoomSummary().asObservable()
fun liveRoomSummary(): Observable<Optional<RoomSummary>> {
return room.getRoomSummaryLive().asObservable()
}
fun liveRoomMemberIds(): Observable<List<String>> {
return room.getRoomMemberIdsLive().asObservable()
}
fun liveAnnotationSummary(eventId: String): Observable<EventAnnotationsSummary> {
fun liveAnnotationSummary(eventId: String): Observable<Optional<EventAnnotationsSummary>> {
return room.getEventSummaryLive(eventId).asObservable()
}
fun liveTimelineEvent(eventId: String): Observable<TimelineEvent> {
return room.liveTimeLineEvent(eventId).asObservable()
fun liveTimelineEvent(eventId: String): Observable<Optional<TimelineEvent>> {
return room.getTimeLineEventLive(eventId).asObservable()
}
fun liveReadMarker(): Observable<Optional<String>> {
return room.getReadMarkerLive().asObservable()
}
fun liveReadReceipt(): Observable<Optional<String>> {
return room.getMyReadReceiptLive().asObservable()
}
fun loadRoomMembersIfNeeded(): Single<Unit> = Single.create {
@@ -58,9 +67,8 @@ class RxRoom(private val room: Room) {
fun liveDrafts(): Observable<List<UserDraft>> {
return room.getDraftsLive().asObservable()
}
}
fun Room.rx(): RxRoom {
return RxRoom(this)
}
}

View File

@@ -24,6 +24,7 @@ import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams
import im.vector.matrix.android.api.session.sync.SyncState
import im.vector.matrix.android.api.session.user.model.User
import im.vector.matrix.android.api.util.Optional
import io.reactivex.Observable
import io.reactivex.Single
@@ -45,6 +46,10 @@ class RxSession(private val session: Session) {
return session.livePushers().asObservable()
}
fun liveUser(userId: String): Observable<Optional<User>> {
return session.liveUser(userId).asObservable().distinctUntilChanged()
}
fun liveUsers(): Observable<List<User>> {
return session.liveUsers().asObservable()
}
@@ -66,9 +71,8 @@ class RxSession(private val session: Session) {
fun joinRoom(roomId: String, viaServers: List<String> = emptyList()): Single<Unit> = Single.create {
session.joinRoom(roomId, viaServers, MatrixCallbackSingle(it)).toSingle(it)
}
}
fun Session.rx(): RxSession {
return RxSession(this)
}
}

View File

@@ -67,6 +67,10 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}
static def gitRevision() {
@@ -86,41 +90,43 @@ static def gitRevisionDate() {
dependencies {
def arrow_version = "0.8.0"
def support_version = '1.1.0-beta01'
def arrow_version = "0.8.2"
def moshi_version = '1.8.0'
def lifecycle_version = '2.0.0'
def coroutines_version = "1.0.1"
def markwon_version = '3.0.0'
def daggerVersion = '2.23.1'
def lifecycle_version = '2.1.0'
def coroutines_version = "1.3.2"
def markwon_version = '3.1.0'
def daggerVersion = '2.24'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
implementation "androidx.appcompat:appcompat:1.1.0-rc01"
implementation "androidx.recyclerview:recyclerview:1.1.0-beta01"
implementation "androidx.appcompat:appcompat:1.1.0"
implementation "androidx.recyclerview:recyclerview:1.1.0-beta05"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
// Network
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
implementation 'com.squareup.retrofit2:converter-moshi:2.4.0'
implementation 'com.squareup.okhttp3:okhttp:3.14.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-moshi:2.6.2'
implementation 'com.squareup.okhttp3:okhttp:4.2.2'
implementation 'com.squareup.okhttp3:logging-interceptor:4.2.2'
implementation 'com.novoda:merlin:1.2.0'
implementation "com.squareup.moshi:moshi-adapters:$moshi_version"
kapt "com.squareup.moshi:moshi-kotlin-codegen:$moshi_version"
implementation "ru.noties.markwon:core:$markwon_version"
// Image
implementation 'androidx.exifinterface:exifinterface:1.0.0'
// Database
implementation 'com.github.Zhuinden:realm-monarchy:0.5.1'
kapt 'dk.ilios:realmfieldnameshelper:1.1.1'
// Work
implementation "androidx.work:work-runtime-ktx:2.1.0-rc01"
implementation "androidx.work:work-runtime-ktx:2.3.0-alpha01"
// FP
implementation "io.arrow-kt:arrow-core:$arrow_version"
@@ -132,24 +138,24 @@ dependencies {
// DI
implementation "com.google.dagger:dagger:$daggerVersion"
kapt "com.google.dagger:dagger-compiler:$daggerVersion"
compileOnly 'com.squareup.inject:assisted-inject-annotations-dagger2:0.4.0'
kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.4.0'
compileOnly 'com.squareup.inject:assisted-inject-annotations-dagger2:0.5.0'
kapt 'com.squareup.inject:assisted-inject-processor-dagger2:0.5.0'
// Logging
implementation 'com.jakewharton.timber:timber:4.7.1'
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.0'
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
// Bus
implementation 'org.greenrobot:eventbus:3.1.1'
debugImplementation 'com.airbnb.okreplay:okreplay:1.4.0'
releaseImplementation 'com.airbnb.okreplay:noop:1.4.0'
androidTestImplementation 'com.airbnb.okreplay:espresso:1.4.0'
debugImplementation 'com.airbnb.okreplay:okreplay:1.5.0'
releaseImplementation 'com.airbnb.okreplay:noop:1.5.0'
androidTestImplementation 'com.airbnb.okreplay:espresso:1.5.0'
testImplementation 'junit:junit:4.12'
testImplementation 'org.robolectric:robolectric:4.0.2'
testImplementation 'org.robolectric:robolectric:4.3'
//testImplementation 'org.robolectric:shadows-support-v4:3.0'
testImplementation "io.mockk:mockk:1.8.13.kotlin13"
testImplementation 'io.mockk:mockk:1.9.3.kotlin12'
testImplementation 'org.amshove.kluent:kluent-android:1.44'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
@@ -159,7 +165,7 @@ dependencies {
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
androidTestImplementation 'org.amshove.kluent:kluent-android:1.44'
androidTestImplementation "io.mockk:mockk-android:1.8.13.kotlin13"
androidTestImplementation 'io.mockk:mockk-android:1.9.3.kotlin12'
androidTestImplementation "androidx.arch.core:core-testing:$lifecycle_version"
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"

View File

@@ -28,4 +28,4 @@ interface InstrumentedTest {
fun cacheDir(): File {
return context().cacheDir
}
}
}

View File

@@ -29,4 +29,4 @@ class OkReplayRuleChainNoActivity(
return RuleChain.outerRule(PermissionRule(configuration))
.around(RecorderRule(configuration))
}
}
}

View File

@@ -19,4 +19,4 @@ package im.vector.matrix.android
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
import kotlinx.coroutines.Dispatchers.Main
internal val testCoroutineDispatchers = MatrixCoroutineDispatchers(Main, Main, Main, Main, Main)
internal val testCoroutineDispatchers = MatrixCoroutineDispatchers(Main, Main, Main, Main, Main)

View File

@@ -28,7 +28,6 @@ import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class AuthenticatorTest : InstrumentedTest {
@@ -50,7 +49,6 @@ internal class AuthenticatorTest : InstrumentedTest {
@UiThreadTest
@OkReplay(tape = "auth", mode = TapeMode.READ_WRITE)
fun auth() {
}
companion object {
@@ -59,6 +57,4 @@ internal class AuthenticatorTest : InstrumentedTest {
val grantExternalStoragePermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
}
}

View File

@@ -41,4 +41,4 @@ internal class CryptoStoreHelper {
refreshToken = null,
deviceId = "deviceId_sample"
)
}
}

View File

@@ -114,4 +114,4 @@ class CryptoStoreTest {
olmAccount1.releaseAccount()
olmAccount2.releaseAccount()
}
}
}

View File

@@ -62,8 +62,6 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
JsonCanonicalizer.canonicalize("{\"a\":\"\\\"\"}"))
}
/* ==========================================================================================
* Test from https://matrix.org/docs/spec/appendices.html#examples
* ========================================================================================== */
@@ -74,7 +72,6 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
JsonCanonicalizer.canonicalize("""{}"""))
}
@Test
fun matrixOrg002Test() {
assertEquals("""{"one":1,"two":"Two"}""",
@@ -84,7 +81,6 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
}"""))
}
@Test
fun matrixOrg003Test() {
assertEquals("""{"a":"1","b":"2"}""",
@@ -94,14 +90,12 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
}"""))
}
@Test
fun matrixOrg004Test() {
assertEquals("""{"a":"1","b":"2"}""",
JsonCanonicalizer.canonicalize("""{"b":"2","a":"1"}"""))
}
@Test
fun matrixOrg005Test() {
assertEquals("""{"auth":{"mxid":"@john.doe:example.com","profile":{"display_name":"John Doe","three_pids":[{"address":"john.doe@example.org","medium":"email"},{"address":"123456789","medium":"msisdn"}]},"success":true}}""",
@@ -126,7 +120,6 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
}"""))
}
@Test
fun matrixOrg006Test() {
assertEquals("""{"a":"日本語"}""",
@@ -135,7 +128,6 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
}"""))
}
@Test
fun matrixOrg007Test() {
assertEquals("""{"日":1,"本":2}""",
@@ -145,7 +137,6 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
}"""))
}
@Test
fun matrixOrg008Test() {
assertEquals("""{"a":"日"}""",
@@ -159,4 +150,4 @@ internal class JsonCanonicalizerTest : InstrumentedTest {
"a": null
}"""))
}
}
}

View File

@@ -35,7 +35,6 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class ChunkEntityTest : InstrumentedTest {
@@ -48,7 +47,6 @@ internal class ChunkEntityTest : InstrumentedTest {
monarchy = Monarchy.Builder().setRealmConfiguration(testConfig).build()
}
@Test
fun add_shouldAdd_whenNotAlreadyIncluded() {
monarchy.runTransactionSync { realm ->
@@ -194,5 +192,4 @@ internal class ChunkEntityTest : InstrumentedTest {
chunk1.nextToken shouldEqual nextToken
}
}
}
}

View File

@@ -32,6 +32,4 @@ internal class FakeGetContextOfEventTask constructor(private val tokenChunkEvent
)
return tokenChunkEventPersistor.insertInDb(tokenChunkEvent, params.roomId, PaginationDirection.BACKWARDS)
}
}
}

View File

@@ -28,6 +28,4 @@ internal class FakePaginationTask @Inject constructor(private val tokenChunkEven
val tokenChunkEvent = FakeTokenChunkEvent(params.from, Random.nextLong(System.currentTimeMillis()).toString(), fakeEvents)
return tokenChunkEventPersistor.insertInDb(tokenChunkEvent, params.roomId, params.direction)
}
}

View File

@@ -23,4 +23,4 @@ internal data class FakeTokenChunkEvent(override val start: String?,
override val end: String?,
override val events: List<Event> = emptyList(),
override val stateEvents: List<Event> = emptyList()
) : TokenChunkEvent
) : TokenChunkEvent

View File

@@ -88,6 +88,4 @@ object RoomDataHelper {
roomEntity.addOrUpdate(chunkEntity)
}
}
}
}

View File

@@ -81,6 +81,4 @@ internal class TimelineTest : InstrumentedTest {
// timelineEvents.size shouldEqual initialLoad + paginationCount
// timeline.dispose()
// }
}
}

View File

@@ -22,6 +22,7 @@ import okhttp3.Interceptor
import okhttp3.Response
import okhttp3.logging.HttpLoggingInterceptor
import okio.Buffer
import timber.log.Timber
import java.io.IOException
import java.nio.charset.Charset
import javax.inject.Inject
@@ -51,27 +52,33 @@ internal class CurlLoggingInterceptor @Inject constructor(private val logger: Ht
var compressed = false
var curlCmd = "curl"
if (curlOptions != null) {
curlCmd += " " + curlOptions!!
curlOptions?.let {
curlCmd += " $it"
}
curlCmd += " -X " + request.method()
curlCmd += " -X " + request.method
val requestBody = request.body()
val requestBody = request.body
if (requestBody != null) {
val buffer = Buffer()
requestBody.writeTo(buffer)
var charset: Charset? = UTF8
val contentType = requestBody.contentType()
if (contentType != null) {
charset = contentType.charset(UTF8)
if (requestBody.contentLength() > 100_000) {
Timber.w("Unable to log curl command data, size is too big (${requestBody.contentLength()})")
// Ensure the curl command will failed
curlCmd += "DATA IS TOO BIG"
} else {
val buffer = Buffer()
requestBody.writeTo(buffer)
var charset: Charset? = UTF8
val contentType = requestBody.contentType()
if (contentType != null) {
charset = contentType.charset(UTF8)
}
// try to keep to a single line and use a subshell to preserve any line breaks
curlCmd += " --data $'" + buffer.readString(charset!!).replace("\n", "\\n") + "'"
}
// try to keep to a single line and use a subshell to preserve any line breaks
curlCmd += " --data $'" + buffer.readString(charset!!).replace("\n", "\\n") + "'"
}
val headers = request.headers()
val headers = request.headers
var i = 0
val count = headers.size()
val count = headers.size
while (i < count) {
val name = headers.name(i)
val value = headers.value(i)
@@ -82,7 +89,7 @@ internal class CurlLoggingInterceptor @Inject constructor(private val logger: Ht
i++
}
curlCmd += ((if (compressed) " --compressed " else " ") + "'" + request.url().toString()
curlCmd += ((if (compressed) " --compressed " else " ") + "'" + request.url.toString()
// Replace localhost for emulator by localhost for shell
.replace("://10.0.2.2:8080/".toRegex(), "://127.0.0.1:8080/")
+ "'")
@@ -90,7 +97,7 @@ internal class CurlLoggingInterceptor @Inject constructor(private val logger: Ht
// Add Json formatting
curlCmd += " | python -m json.tool"
logger.log("--- cURL (" + request.url() + ")")
logger.log("--- cURL (" + request.url + ")")
logger.log(curlCmd)
return chain.proceed(request)

View File

@@ -51,7 +51,6 @@ class FormattedJsonHttpLogger : HttpLoggingInterceptor.Logger {
// Finally this is not a JSON string...
Timber.e(e)
}
} else if (message.startsWith("[")) {
// JSON Array detected
try {
@@ -61,7 +60,6 @@ class FormattedJsonHttpLogger : HttpLoggingInterceptor.Logger {
// Finally not JSON...
Timber.e(e)
}
}
// Else not a json string to log
}
@@ -73,4 +71,4 @@ class FormattedJsonHttpLogger : HttpLoggingInterceptor.Logger {
Timber.v(s)
}
}
}
}

View File

@@ -38,7 +38,6 @@ data class MatrixConfiguration(
interface Provider {
fun providesMatrixConfiguration(): MatrixConfiguration
}
}
/**
@@ -98,5 +97,4 @@ class Matrix private constructor(context: Context, matrixConfiguration: MatrixCo
return BuildConfig.VERSION_NAME + " (" + BuildConfig.GIT_SDK_REVISION + ")"
}
}
}

View File

@@ -27,7 +27,7 @@ interface MatrixCallback<in T> {
* @param data the data successfully returned from the async function
*/
fun onSuccess(data: T) {
//no-op
// no-op
}
/**
@@ -35,7 +35,6 @@ interface MatrixCallback<in T> {
* @param failure the failure data returned from the async function
*/
fun onFailure(failure: Throwable) {
//no-op
// no-op
}
}
}

View File

@@ -16,7 +16,6 @@
package im.vector.matrix.android.api
/**
* This class contains pattern to match the different Matrix ids
*/
@@ -154,6 +153,5 @@ object MatrixPatterns {
return if (index == -1) {
null
} else matrixId.substring(index + 1)
}
}

View File

@@ -68,4 +68,4 @@ interface Authenticator {
* Create a session after a SSO successful login
*/
fun createSessionFromSso(credentials: Credentials, homeServerConnectionConfig: HomeServerConnectionConfig): Session
}
}

View File

@@ -253,13 +253,5 @@ data class HomeServerConnectionConfig(
forceUsageTlsVersions
)
}
}
}

View File

@@ -37,4 +37,4 @@ object DatedObjectComparators {
(datedObject2.date - datedObject1.date).toInt()
}
}
}
}

View File

@@ -19,7 +19,6 @@ package im.vector.matrix.android.api.extensions
import im.vector.matrix.android.api.comparators.DatedObjectComparators
import im.vector.matrix.android.internal.crypto.model.MXDeviceInfo
import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo
import java.util.Collections
/* ==========================================================================================
* MXDeviceInfo
@@ -29,7 +28,6 @@ fun MXDeviceInfo.getFingerprintHumanReadable() = fingerprint()
?.chunked(4)
?.joinToString(separator = " ")
fun List<DeviceInfo>.sortByLastSeen() {
Collections.sort(this, DatedObjectComparators.descComparator)
}
fun MutableList<DeviceInfo>.sortByLastSeen() {
sortWith(DatedObjectComparators.descComparator)
}

View File

@@ -19,4 +19,4 @@ package im.vector.matrix.android.api.failure
// This data class will be sent to the bus
data class ConsentNotGivenError(
val consentUri: String
)
)

View File

@@ -42,5 +42,4 @@ sealed class Failure(cause: Throwable? = null) : Throwable(cause = cause) {
data class CryptoError(val error: MXCryptoError) : Failure(error)
abstract class FeatureFailure : Failure()
}
}

View File

@@ -33,7 +33,6 @@ data class MatrixError(
@Json(name = "limit_type") val limitType: String? = null,
@Json(name = "admin_contact") val adminUri: String? = null) {
companion object {
const val FORBIDDEN = "M_FORBIDDEN"
const val UNKNOWN = "M_UNKNOWN"
@@ -64,4 +63,4 @@ data class MatrixError(
// Possible value for "limit_type"
const val LIMIT_TYPE_MAU = "monthly_active_user"
}
}
}

View File

@@ -25,4 +25,4 @@ interface ProgressListener {
* @param total
*/
fun onProgress(progress: Int, total: Int)
}
}

View File

@@ -31,4 +31,4 @@ interface StepProgressListener {
* @param step The current step, containing progress data if available. Else you should consider progress as indeterminate
*/
fun onStepProgress(step: Step)
}
}

View File

@@ -30,9 +30,9 @@ object MatrixLinkify {
*
* @param spannable the text in which the matrix items has to be clickable.
*/
fun addLinks(spannable: Spannable?, callback: MatrixPermalinkSpan.Callback?): Boolean {
fun addLinks(spannable: Spannable, callback: MatrixPermalinkSpan.Callback?): Boolean {
// sanity checks
if (spannable.isNullOrEmpty()) {
if (spannable.isEmpty()) {
return false
}
val text = spannable.toString()
@@ -51,5 +51,4 @@ object MatrixLinkify {
}
return hasMatch
}
}
}

View File

@@ -35,6 +35,4 @@ class MatrixPermalinkSpan(private val url: String,
override fun onClick(widget: View) {
callback?.onUrlClicked(url)
}
}
}

View File

@@ -33,5 +33,4 @@ sealed class PermalinkData {
data class GroupLink(val groupId: String) : PermalinkData()
data class FallbackLink(val uri: Uri) : PermalinkData()
}

View File

@@ -16,7 +16,6 @@
package im.vector.matrix.android.api.permalinks
import android.text.TextUtils
import im.vector.matrix.android.api.session.events.model.Event
/**
@@ -48,10 +47,9 @@ object PermalinkFactory {
* @return the permalink, or null in case of error
*/
fun createPermalink(id: String): String? {
return if (TextUtils.isEmpty(id)) {
return if (id.isEmpty()) {
null
} else MATRIX_TO_URL_BASE + escape(id)
}
/**
@@ -72,16 +70,14 @@ object PermalinkFactory {
* @param url the universal link, Ex: "https://matrix.to/#/@benoit:matrix.org"
* @return the id from the url, ex: "@benoit:matrix.org", or null if the url is not a permalink
*/
fun getLinkedId(url: String?): String? {
val isSupported = url != null && url.startsWith(MATRIX_TO_URL_BASE)
fun getLinkedId(url: String): String? {
val isSupported = url.startsWith(MATRIX_TO_URL_BASE)
return if (isSupported) {
url!!.substring(MATRIX_TO_URL_BASE.length)
url.substring(MATRIX_TO_URL_BASE.length)
} else null
}
/**
* Escape '/' in id, because it is used as a separator
*
@@ -89,6 +85,6 @@ object PermalinkFactory {
* @return the escaped id
*/
private fun escape(id: String): String {
return id.replace("/".toRegex(), "%2F")
return id.replace("/", "%2F")
}
}

View File

@@ -72,5 +72,4 @@ object PermalinkParser {
else -> PermalinkData.FallbackLink(uri)
}
}
}
}

View File

@@ -18,7 +18,6 @@ package im.vector.matrix.android.api.pushrules
import im.vector.matrix.android.api.pushrules.rest.PushRule
import timber.log.Timber
sealed class Action {
object Notify : Action()
object DoNotNotify : Action()
@@ -26,7 +25,6 @@ sealed class Action {
data class Highlight(val highlight: Boolean) : Action()
}
private const val ACTION_NOTIFY = "notify"
private const val ACTION_DONT_NOTIFY = "dont_notify"
private const val ACTION_COALESCE = "coalesce"
@@ -80,7 +78,6 @@ fun PushRule.getActions(): List<Action> {
}
// When the value is not there, default sound (not specified by the spec)
?: Action.Sound(ACTION_OBJECT_VALUE_VALUE_DEFAULT)
}
ACTION_OBJECT_SET_TWEAK_VALUE_HIGHLIGHT -> {
(actionStrOrObj[ACTION_OBJECT_VALUE_KEY] as? Boolean)?.let { boolValue ->
@@ -104,7 +101,5 @@ fun PushRule.getActions(): List<Action> {
}
}
return result
}

View File

@@ -35,9 +35,7 @@ abstract class Condition(val kind: Kind) {
else -> UNRECOGNIZE
}
}
}
}
abstract fun isSatisfied(conditionResolver: ConditionResolver): Boolean
@@ -45,4 +43,4 @@ abstract class Condition(val kind: Kind) {
open fun technicalDescription(): String {
return "Kind: $kind"
}
}
}

View File

@@ -25,4 +25,4 @@ interface ConditionResolver {
fun resolveRoomMemberCountCondition(roomMemberCountCondition: RoomMemberCountCondition): Boolean
fun resolveSenderNotificationPermissionCondition(senderNotificationPermissionCondition: SenderNotificationPermissionCondition): Boolean
fun resolveContainsDisplayNameCondition(containsDisplayNameCondition: ContainsDisplayNameCondition) : Boolean
}
}

View File

@@ -15,13 +15,11 @@
*/
package im.vector.matrix.android.api.pushrules
import android.text.TextUtils
import im.vector.matrix.android.api.session.events.model.Event
import im.vector.matrix.android.api.session.events.model.EventType
import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.api.session.room.model.message.MessageContent
import timber.log.Timber
import java.util.regex.Pattern
class ContainsDisplayNameCondition : Condition(Kind.contains_display_name) {
@@ -34,11 +32,11 @@ class ContainsDisplayNameCondition : Condition(Kind.contains_display_name) {
}
fun isSatisfied(event: Event, displayName: String): Boolean {
var message = when (event.type) {
val message = when (event.type) {
EventType.MESSAGE -> {
event.content.toModel<MessageContent>()
}
//TODO the spec says:
// TODO the spec says:
// Matches any message whose content is unencrypted and contains the user's current display name
// EventType.ENCRYPTED -> {
// event.root.getClearContent()?.toModel<MessageContent>()
@@ -49,7 +47,6 @@ class ContainsDisplayNameCondition : Condition(Kind.contains_display_name) {
return caseInsensitiveFind(displayName, message.body)
}
companion object {
/**
* Returns whether a string contains an occurrence of another, as a standalone word, regardless of case.
@@ -60,20 +57,18 @@ class ContainsDisplayNameCondition : Condition(Kind.contains_display_name) {
*/
fun caseInsensitiveFind(subString: String, longString: String): Boolean {
// add sanity checks
if (TextUtils.isEmpty(subString) || TextUtils.isEmpty(longString)) {
if (subString.isEmpty() || longString.isEmpty()) {
return false
}
var res = false
try {
val pattern = Pattern.compile("(\\W|^)" + Pattern.quote(subString) + "(\\W|$)", Pattern.CASE_INSENSITIVE)
res = pattern.matcher(longString).find()
val regex = Regex("(\\W|^)" + Regex.escape(subString) + "(\\W|$)", RegexOption.IGNORE_CASE)
return regex.containsMatchIn(longString)
} catch (e: Exception) {
Timber.e(e, "## caseInsensitiveFind() : failed")
}
return res
return false
}
}
}
}

View File

@@ -29,28 +29,25 @@ class EventMatchCondition(val key: String, val pattern: String) : Condition(Kind
return "'$key' Matches '$pattern'"
}
fun isSatisfied(event: Event): Boolean {
//TODO encrypted events?
// TODO encrypted events?
val rawJson = MoshiProvider.providesMoshi().adapter(Event::class.java).toJsonValue(event) as? Map<*, *>
?: return false
val value = extractField(rawJson, key) ?: return false
//Patterns with no special glob characters should be treated as having asterisks prepended
// Patterns with no special glob characters should be treated as having asterisks prepended
// and appended when testing the condition.
try {
val modPattern = if (hasSpecialGlobChar(pattern)) simpleGlobToRegExp(pattern) else simpleGlobToRegExp("*$pattern*")
val regex = Regex(modPattern, RegexOption.DOT_MATCHES_ALL)
return regex.containsMatchIn(value)
} catch (e: Throwable) {
//e.g PatternSyntaxException
// e.g PatternSyntaxException
Timber.e(e, "Failed to evaluate push condition")
return false
}
}
private fun extractField(jsonObject: Map<*, *>, fieldPath: String): String? {
val fieldParts = fieldPath.split(".")
if (fieldParts.isEmpty()) return null
@@ -77,9 +74,9 @@ class EventMatchCondition(val key: String, val pattern: String) : Condition(Kind
return glob.contains("*") || glob.contains("?")
}
//Very simple glob to regexp converter
// Very simple glob to regexp converter
private fun simpleGlobToRegExp(glob: String): String {
var out = ""//"^"
var out = "" // "^"
for (i in 0 until glob.length) {
val c = glob[i]
when (c) {
@@ -90,8 +87,8 @@ class EventMatchCondition(val key: String, val pattern: String) : Condition(Kind
else -> out += c
}
}
out += ""//'$'.toString()
out += "" // '$'.toString()
return out
}
}
}
}

View File

@@ -27,10 +27,10 @@ interface PushRuleService {
*/
fun fetchPushRules(scope: String = RuleScope.GLOBAL)
//TODO get push rule set
// TODO get push rule set
fun getPushRules(scope: String = RuleScope.GLOBAL): List<PushRule>
//TODO update rule
// TODO update rule
fun updatePushRuleEnableStatus(kind: RuleKind, pushRule: PushRule, enabled: Boolean, callback: MatrixCallback<Unit>): Cancelable
@@ -42,8 +42,9 @@ interface PushRuleService {
interface PushRuleListener {
fun onMatchRule(event: Event, actions: List<Action>)
fun onRoomJoined(roomId: String)
fun onRoomLeft(roomId: String)
fun onEventRedacted(redactedEventId: String)
fun batchFinish()
}
}
}

View File

@@ -62,6 +62,5 @@ class RoomMemberCountCondition(val iz: String) : Condition(Kind.room_member_coun
Timber.d(t)
}
return null
}
}
}

View File

@@ -18,7 +18,6 @@ package im.vector.matrix.android.api.pushrules
import im.vector.matrix.android.api.session.events.model.Event
import im.vector.matrix.android.api.session.room.model.PowerLevels
class SenderNotificationPermissionCondition(val key: String) : Condition(Kind.sender_notification_permission) {
override fun isSatisfied(conditionResolver: ConditionResolver): Boolean {
@@ -29,8 +28,7 @@ class SenderNotificationPermissionCondition(val key: String) : Condition(Kind.se
return "User power level <$key>"
}
fun isSatisfied(event: Event, powerLevels: PowerLevels): Boolean {
return event.senderId != null && powerLevels.getUserPowerLevel(event.senderId) >= powerLevels.notificationLevel(key)
}
}
}

View File

@@ -76,4 +76,4 @@ data class PushCondition(
}
}
}
}
}

View File

@@ -19,7 +19,6 @@ package im.vector.matrix.android.api.pushrules.rest
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class PushRule(
/**
@@ -47,4 +46,3 @@ data class PushRule(
*/
val pattern: String? = null
)

View File

@@ -24,4 +24,4 @@ data class Ruleset(
val room: List<PushRule>? = null,
val sender: List<PushRule>? = null,
val underride: List<PushRule>? = null
)
)

View File

@@ -26,4 +26,4 @@ interface InitialSyncProgressService {
@StringRes val statusText: Int,
val percentProgress: Int = 0
)
}
}

View File

@@ -19,6 +19,7 @@ package im.vector.matrix.android.api.session
import androidx.annotation.MainThread
import androidx.lifecycle.LiveData
import im.vector.matrix.android.api.auth.data.SessionParams
import im.vector.matrix.android.api.failure.ConsentNotGivenError
import im.vector.matrix.android.api.pushrules.PushRuleService
import im.vector.matrix.android.api.session.cache.CacheService
import im.vector.matrix.android.api.session.content.ContentUploadStateTracker
@@ -26,6 +27,7 @@ import im.vector.matrix.android.api.session.content.ContentUrlResolver
import im.vector.matrix.android.api.session.crypto.CryptoService
import im.vector.matrix.android.api.session.file.FileService
import im.vector.matrix.android.api.session.group.GroupService
import im.vector.matrix.android.api.session.homeserver.HomeServerCapabilitiesService
import im.vector.matrix.android.api.session.pushers.PushersService
import im.vector.matrix.android.api.session.room.RoomDirectoryService
import im.vector.matrix.android.api.session.room.RoomService
@@ -52,6 +54,7 @@ interface Session :
PushRuleService,
PushersService,
InitialSyncProgressService,
HomeServerCapabilitiesService,
SecureStorageService {
/**
@@ -65,7 +68,6 @@ interface Session :
val myUserId: String
get() = sessionParams.credentials.userId
/**
* This method allow to open a session. It does start some service on the background.
*/
@@ -138,6 +140,9 @@ interface Session :
*/
fun onInvalidToken()
/**
* A M_CONSENT_NOT_GIVEN error has been received from the homeserver
*/
fun onConsentNotGivenError(consentNotGivenError: ConsentNotGivenError)
}
}
}

View File

@@ -27,5 +27,4 @@ interface CacheService {
* Clear the whole cached data, except credentials. Once done, the session is closed and has to be opened again
*/
fun clearCache(callback: MatrixCallback<Unit>)
}
}

View File

@@ -17,6 +17,7 @@
package im.vector.matrix.android.api.session.content
import android.os.Parcelable
import androidx.exifinterface.media.ExifInterface
import kotlinx.android.parcel.Parcelize
@Parcelize
@@ -26,6 +27,7 @@ data class ContentAttachmentData(
val date: Long = 0,
val height: Long? = 0,
val width: Long? = 0,
val exifOrientation: Int = ExifInterface.ORIENTATION_UNDEFINED,
val name: String? = null,
val path: String,
val mimeType: String,
@@ -38,5 +40,4 @@ data class ContentAttachmentData(
AUDIO,
VIDEO
}
}
}

View File

@@ -35,4 +35,4 @@ interface ContentUploadStateTracker {
object Success : State()
data class Failure(val throwable: Throwable) : State()
}
}
}

View File

@@ -44,4 +44,4 @@ interface ContentUrlResolver {
* @return the URL to access the described resource, or null if the url is invalid.
*/
fun resolveThumbnail(contentUrl: String?, width: Int, height: Int, method: ThumbnailMethod): String?
}
}

View File

@@ -112,5 +112,4 @@ interface CryptoService {
fun addNewSessionListener(newSessionListener: NewSessionListener)
fun removeSessionListener(listener: NewSessionListener)
}
}

View File

@@ -90,4 +90,4 @@ sealed class MXCryptoError : Throwable() {
const val NO_MORE_ALGORITHM_REASON = "Room was previously configured to use encryption, but is no longer." +
" Perhaps the homeserver is hiding the configuration event."
}
}
}

View File

@@ -210,5 +210,4 @@ interface KeysBackupService {
val isEnabled: Boolean
val isStucked: Boolean
val state: KeysBackupState
}
}

View File

@@ -72,4 +72,4 @@ enum class KeysBackupState {
WillBackUp,
// e2e keys are being sent to the homeserver
BackingUp
}
}

View File

@@ -23,4 +23,4 @@ interface KeysBackupStateListener {
* @param newState the new state
*/
fun onStateChange(newState: KeysBackupState)
}
}

View File

@@ -30,4 +30,4 @@ enum class CancelCode(val value: String, val humanReadable: String) {
fun safeValueOf(code: String?): CancelCode {
return CancelCode.values().firstOrNull { code == it.value } ?: CancelCode.User
}
}

View File

@@ -19,4 +19,4 @@ package im.vector.matrix.android.api.session.crypto.sas
import androidx.annotation.StringRes
data class EmojiRepresentation(val emoji: String,
@StringRes val nameResId: Int)
@StringRes val nameResId: Int)

View File

@@ -31,4 +31,4 @@ interface IncomingSasVerificationTransaction {
CANCELLED_BY_ME,
CANCELLED_BY_OTHER
}
}
}

View File

@@ -29,4 +29,4 @@ interface OutgoingSasVerificationRequest {
CANCELLED_BY_ME,
CANCELLED_BY_OTHER
}
}
}

View File

@@ -19,4 +19,4 @@ package im.vector.matrix.android.api.session.crypto.sas
object SasMode {
const val DECIMAL = "decimal"
const val EMOJI = "emoji"
}
}

View File

@@ -36,4 +36,4 @@ interface SasVerificationService {
fun transactionUpdated(tx: SasVerificationTransaction)
fun markedAsManuallyVerified(userId: String, deviceId: String)
}
}
}

View File

@@ -47,4 +47,4 @@ interface SasVerificationTransaction {
* both short codes do match
*/
fun userHasVerifiedShortCode()
}
}

View File

@@ -43,7 +43,7 @@ enum class SasVerificationTxState {
Verifying,
Verified,
//Global: The verification has been cancelled (by me or other), see cancelReason for details
// Global: The verification has been cancelled (by me or other), see cancelReason for details
Cancelled,
OnCancelled
}

View File

@@ -34,9 +34,9 @@ import com.squareup.moshi.JsonClass
*/
@JsonClass(generateAdapter = true)
data class AggregatedAnnotation (
data class AggregatedAnnotation(
override val limited: Boolean? = false,
override val count: Int? = 0,
val chunk: List<RelationChunkInfo>? = null
) : UnsignedRelationInfo
) : UnsignedRelationInfo

View File

@@ -50,4 +50,4 @@ import com.squareup.moshi.JsonClass
data class AggregatedRelations(
@Json(name = "m.annotation") val annotations: AggregatedAnnotation? = null,
@Json(name = "m.reference") val references: DefaultUnsignedRelationInfo? = null
)
)

View File

@@ -23,4 +23,4 @@ data class DefaultUnsignedRelationInfo(
override val count: Int? = 0,
val chunk: List<Map<String, Any>>? = null
) : UnsignedRelationInfo
) : UnsignedRelationInfo

View File

@@ -16,7 +16,6 @@
package im.vector.matrix.android.api.session.events.model
import android.text.TextUtils
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import im.vector.matrix.android.api.session.crypto.MXCryptoError
@@ -35,18 +34,16 @@ typealias Content = JsonDict
* This methods is a facility method to map a json content to a model.
*/
inline fun <reified T> Content?.toModel(catchError: Boolean = true): T? {
return this?.let {
val moshi = MoshiProvider.providesMoshi()
val moshiAdapter = moshi.adapter(T::class.java)
return try {
moshiAdapter.fromJsonValue(it)
} catch (e: Exception) {
if (catchError) {
Timber.e(e, "To model failed : $e")
null
} else {
throw e
}
val moshi = MoshiProvider.providesMoshi()
val moshiAdapter = moshi.adapter(T::class.java)
return try {
moshiAdapter.fromJsonValue(this)
} catch (e: Exception) {
if (catchError) {
Timber.e(e, "To model failed : $e")
null
} else {
throw e
}
}
}
@@ -55,12 +52,10 @@ inline fun <reified T> Content?.toModel(catchError: Boolean = true): T? {
* This methods is a facility method to map a model to a json Content
*/
@Suppress("UNCHECKED_CAST")
inline fun <reified T> T?.toContent(): Content? {
return this?.let {
val moshi = MoshiProvider.providesMoshi()
val moshiAdapter = moshi.adapter(T::class.java)
return moshiAdapter.toJsonValue(it) as Content
}
inline fun <reified T> T.toContent(): Content {
val moshi = MoshiProvider.providesMoshi()
val moshiAdapter = moshi.adapter(T::class.java)
return moshiAdapter.toJsonValue(this) as Content
}
/**
@@ -81,7 +76,6 @@ data class Event(
@Json(name = "redacts") val redacts: String? = null
) {
@Transient
var mxDecryptionResult: OlmDecryptionResult? = null
@@ -91,7 +85,6 @@ data class Event(
@Transient
var sendState: SendState = SendState.UNKNOWN
/**
* Check if event is a state event.
* @return true if event is state event.
@@ -100,15 +93,15 @@ data class Event(
return EventType.isStateEvent(getClearType())
}
//==============================================================================================================
// ==============================================================================================================
// Crypto
//==============================================================================================================
// ==============================================================================================================
/**
* @return true if this event is encrypted.
*/
fun isEncrypted(): Boolean {
return TextUtils.equals(type, EventType.ENCRYPTED)
return type == EventType.ENCRYPTED
}
/**
@@ -136,11 +129,12 @@ data class Event(
* @return the event content
*/
fun getClearContent(): Content? {
@Suppress("UNCHECKED_CAST")
return mxDecryptionResult?.payload?.get("content") as? Content ?: content
}
fun toContentStringWithIndent(): String {
val contentMap = toContent()?.toMutableMap() ?: HashMap()
val contentMap = toContent().toMutableMap()
return JSONObject(contentMap).toString(4)
}
@@ -194,10 +188,8 @@ data class Event(
result = 31 * result + sendState.hashCode()
return result
}
}
fun Event.isTextMessage(): Boolean {
return getClearType() == EventType.MESSAGE
&& when (getClearContent()?.toModel<MessageContent>()?.type) {
@@ -214,4 +206,4 @@ fun Event.isImageMessage(): Boolean {
MessageType.MSGTYPE_IMAGE -> true
else -> false
}
}
}

View File

@@ -16,7 +16,6 @@
package im.vector.matrix.android.api.session.events.model
/**
* Constants defining known event types from Matrix specifications.
*/
@@ -93,7 +92,6 @@ object EventType {
STATE_PINNED_EVENT
)
fun isStateEvent(type: String): Boolean {
return STATE_EVENTS.contains(type)
}

View File

@@ -0,0 +1,28 @@
/*
* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.matrix.android.api.session.events.model
import java.util.*
object LocalEcho {
private const val PREFIX = "local."
fun isLocalEchoId(eventId: String) = eventId.startsWith(PREFIX)
fun createLocalEchoId() = "${PREFIX}${UUID.randomUUID()}"
}

View File

@@ -15,7 +15,6 @@
*/
package im.vector.matrix.android.api.session.events.model
/**
* Constants defining known event relation types from Matrix specifications
*/
@@ -27,5 +26,4 @@ object RelationType {
const val REPLACE = "m.replace"
/** Lets you define an event which references an existing event.*/
const val REFERENCE = "m.reference"
}
}

View File

@@ -26,4 +26,4 @@ data class UnsignedData(
@Json(name = "transaction_id") val transactionId: String? = null,
@Json(name = "prev_content") val prevContent: Map<String, Any>? = null,
@Json(name = "m.relations") val relations: AggregatedRelations? = null
)
)

View File

@@ -15,8 +15,7 @@
*/
package im.vector.matrix.android.api.session.events.model
interface UnsignedRelationInfo {
val limited : Boolean?
val count: Int?
}
}

View File

@@ -20,7 +20,6 @@ import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.internal.crypto.attachments.ElementToDecrypt
import java.io.File
/**
* This interface defines methods to get files.
*/
@@ -49,4 +48,4 @@ interface FileService {
url: String?,
elementToDecrypt: ElementToDecrypt?,
callback: MatrixCallback<File>)
}
}

View File

@@ -21,4 +21,4 @@ package im.vector.matrix.android.api.session.group
*/
interface Group {
val groupId: String
}
}

View File

@@ -19,7 +19,6 @@ package im.vector.matrix.android.api.session.group
import androidx.lifecycle.LiveData
import im.vector.matrix.android.api.session.group.model.GroupSummary
/**
* This interface defines methods to get groups. It's implemented at the session level.
*/
@@ -37,4 +36,4 @@ interface GroupService {
* @return the [LiveData] of [GroupSummary]
*/
fun liveGroupSummaries(): LiveData<List<GroupSummary>>
}
}

View File

@@ -30,4 +30,4 @@ data class GroupSummary(
val avatarUrl: String = "",
val roomIds: List<String> = emptyList(),
val userIds: List<String> = emptyList()
)
)

View File

@@ -0,0 +1,28 @@
/*
* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.matrix.android.api.session.homeserver
data class HomeServerCapabilities(
/**
* Max size of file which can be uploaded to the homeserver in bytes. [MAX_UPLOAD_FILE_SIZE_UNKNOWN] if unknown or not retrieved yet
*/
val maxUploadFileSize: Long = MAX_UPLOAD_FILE_SIZE_UNKNOWN
) {
companion object {
const val MAX_UPLOAD_FILE_SIZE_UNKNOWN = -1L
}
}

View File

@@ -0,0 +1,28 @@
/*
* Copyright 2019 New Vector Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package im.vector.matrix.android.api.session.homeserver
/**
* This interface defines a method to retrieve the homeserver capabilities.
*/
interface HomeServerCapabilitiesService {
/**
* Get the HomeServer capabilities
*/
fun getHomeServerCapabilities(): HomeServerCapabilities
}

View File

@@ -39,4 +39,4 @@ enum class PusherState {
data class PusherData(
val url: String? = null,
val format: String? = null
)
)

View File

@@ -19,7 +19,6 @@ import androidx.lifecycle.LiveData
import im.vector.matrix.android.api.MatrixCallback
import java.util.UUID
interface PushersService {
/**
@@ -53,7 +52,6 @@ interface PushersService {
append: Boolean,
withEventIdOnly: Boolean): UUID
fun removeHttpPusher(pushkey: String, appId: String, callback: MatrixCallback<Unit>)
companion object {
@@ -63,4 +61,4 @@ interface PushersService {
fun livePushers(): LiveData<List<Pusher>>
fun pushers() : List<Pusher>
}
}

View File

@@ -21,11 +21,13 @@ import im.vector.matrix.android.api.session.room.crypto.RoomCryptoService
import im.vector.matrix.android.api.session.room.members.MembershipService
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.session.room.model.relation.RelationService
import im.vector.matrix.android.api.session.room.reporting.ReportingService
import im.vector.matrix.android.api.session.room.read.ReadService
import im.vector.matrix.android.api.session.room.send.DraftService
import im.vector.matrix.android.api.session.room.send.SendService
import im.vector.matrix.android.api.session.room.state.StateService
import im.vector.matrix.android.api.session.room.timeline.TimelineService
import im.vector.matrix.android.api.util.Optional
/**
* This interface defines methods to interact within a room.
@@ -37,6 +39,7 @@ interface Room :
ReadService,
MembershipService,
StateService,
ReportingService,
RelationService,
RoomCryptoService {
@@ -49,8 +52,7 @@ interface Room :
* A live [RoomSummary] associated with the room
* You can observe this summary to get dynamic data from this room.
*/
fun liveRoomSummary(): LiveData<RoomSummary>
fun getRoomSummaryLive(): LiveData<Optional<RoomSummary>>
fun roomSummary(): RoomSummary?
}
}

View File

@@ -42,5 +42,4 @@ interface RoomDirectoryService {
* Includes both the available protocols and all fields required for queries against each protocol.
*/
fun getThirdPartyProtocol(callback: MatrixCallback<Map<String, ThirdPartyProtocol>>): Cancelable
}
}

View File

@@ -54,4 +54,8 @@ interface RoomService {
*/
fun liveRoomSummaries(): LiveData<List<RoomSummary>>
}
/**
* Mark all rooms as read
*/
fun markAllAsRead(roomIds: List<String>, callback: MatrixCallback<Unit>): Cancelable
}

View File

@@ -23,4 +23,4 @@ interface RoomCryptoService {
fun encryptionAlgorithm(): String?
fun shouldEncryptForInvitedMembers(): Boolean
}
}

View File

@@ -21,5 +21,4 @@ import im.vector.matrix.android.api.failure.Failure
sealed class CreateRoomFailure : Failure.FeatureFailure() {
object CreatedWithTimeout: CreateRoomFailure()
}
}

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