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

Compare commits

..

3137 Commits

Author SHA1 Message Date
Valere
ee1d5faf0d Merge branch 'hotfix/fix_crash_invite_user' 2020-08-03 14:01:27 +02:00
Valere
7308c4a15c Merge branch 'hotfix/fix_crash_before_release' 2020-08-03 12:23:55 +02:00
Valere
db6045778e Update change log 2020-08-03 12:11:50 +02:00
Valere
2810923519 FIx / Crash when opening Invite User screen 2020-08-03 12:00:08 +02:00
Valere
7fddfa45e8 Merge branch 'release/1.0.3' 2020-07-31 00:02:02 +02:00
Valere
258acaf814 Prepare release 1.0.3 2020-07-31 00:01:33 +02:00
Valere
2f6cdc6529 Merge pull request #1847 from vector-im/feature/crash_store_mvrx
Fix IllegalArgumentException reported from store on HomeActivity aunch
2020-07-30 18:07:11 +02:00
Valere
1f226ca6c7 Merge pull request #1845 from vector-im/feature/admin_e2e_config
Feature/admin e2e config
2020-07-30 18:06:27 +02:00
Valere
c90f5ed370 Fix IllegalArgumentException reported from store on HomeActivity aunch 2020-07-30 17:03:11 +02:00
Valere
ccb466edbe Update change log 2020-07-30 16:57:25 +02:00
Valere
1204f6d9ce UX feedback, reduce severity of message 2020-07-30 15:25:10 +02:00
Valere
562cfce9e2 Support HS admin option to disable E2EE for DMs
Fixes #1794
2020-07-30 12:08:30 +02:00
Valere
b732ea6c69 Version ++ 2020-07-29 11:39:23 +02:00
Valere
a048f79b37 Merge branch 'release/1.0.2' 2020-07-29 10:46:54 +02:00
Valere
3214f7d3d5 Merge branch 'release/1.0.2' into develop 2020-07-29 10:46:54 +02:00
Valere
06ef665f66 prepare release 1.0.2 2020-07-29 10:33:55 +02:00
Valere
e1a07f1da6 Merge pull request #1838 from vector-im/feature/session_store_migration
Feature/session store migration
2020-07-29 10:31:14 +02:00
Valere
5c32c7388a cleaning 2020-07-29 09:51:50 +02:00
Valere
c04f22d3bf quick fix plural 2020-07-29 09:51:20 +02:00
Valere
cbf43ea7b3 Session store migration 2020-07-29 09:50:12 +02:00
Valere
9197275343 version++ 2020-07-29 09:00:29 +02:00
Valere
cc4298209b Merge branch 'release/1.0.1' 2020-07-28 18:03:37 +02:00
Valere
f26ce64914 Merge branch 'release/1.0.1' into develop 2020-07-28 18:03:36 +02:00
Valere
e3f5b7cab3 Prepare release 1.0.1 2020-07-28 18:02:51 +02:00
Valere
dde9cdd8ac Merge pull request #1821 from vector-im/feature/notification_off_alert
Check if migration disabled notif
2020-07-28 17:04:15 +02:00
Valere
0d0308d584 Merge pull request #1802 from vector-im/feature/fix_reply_tag
Feature/fix reply tag
2020-07-28 16:58:10 +02:00
Valere
a47ff99be7 Merge branch 'develop' into feature/fix_reply_tag 2020-07-28 16:58:00 +02:00
Valere
e619217687 Code quality 2020-07-28 16:56:55 +02:00
Valere
6f5b3371fe Check if migration disabled notif 2020-07-28 16:56:55 +02:00
Valere
f7b9fc3bb1 Merge pull request #1826 from vector-im/feature/banned_list
Added banned user screen
2020-07-28 16:53:58 +02:00
ganfra
700a2e9ce3 Merge pull request #1832 from vector-im/feature/fix_timeline_loading
Fix timeline non loading when there are lots of filtered events
2020-07-28 16:30:57 +02:00
ganfra
5176a3e2aa Merge branch 'develop' into feature/fix_timeline_loading 2020-07-28 16:30:34 +02:00
Valere
4631cd0e80 Merge pull request #1831 from vector-im/feature/quick_call_update
Allow call in all 2 participants rooms
2020-07-28 16:24:22 +02:00
Valere
60c6512418 Fix / item flickering 2020-07-28 16:23:21 +02:00
Valere
12bc821ef3 code review 2020-07-28 16:23:21 +02:00
Valere
c82e910c38 Added banned user screen 2020-07-28 16:23:21 +02:00
ganfra
7ae0620b20 Update CHANGES 2020-07-28 15:09:45 +02:00
Valere
de32cdb703 Merge pull request #1828 from vector-im/feature/improve_edit_role_button
Improve UI of edit role button
2020-07-28 14:46:54 +02:00
Valere
12e2a8ffc8 Allow call in all 2 participants rooms 2020-07-28 14:43:50 +02:00
ganfra
833f64fcec Fix timeline non loading when there are lots of filtered events 2020-07-28 11:49:45 +02:00
Valere
73c051d2b1 Improve UI of edit role button 2020-07-28 11:35:37 +02:00
ganfra
da06695ab7 Relation content should be checked in encrypted content and not the decrypted one 2020-07-24 18:31:01 +02:00
Onuray Sahin
984ffc4fb9 Merge pull request #1797 from vector-im/feature/fix_rebranding_assets
Fix rebranding assets on login screens
2020-07-24 15:16:02 +03:00
ganfra
d7b44ba0cf Merge branch 'develop' into feature/fix_reply_tag 2020-07-24 11:32:59 +02:00
ganfra
e90fe5cf28 Update CHANGES 2020-07-24 11:31:47 +02:00
ganfra
20c7d80bb1 Clean code 2020-07-24 11:30:27 +02:00
ganfra
25f8a9418a Merge pull request #1783 from vector-im/feature/sending_retry
Feature/sending retry
2020-07-24 10:35:24 +02:00
onurays
21b609420b ktlint fix. 2020-07-24 03:00:06 +03:00
ganfra
794b89c041 Reply: remove inner tags when replying 2020-07-23 18:23:49 +02:00
ganfra
407595e613 Change warning badge (white background) 2020-07-23 16:38:42 +02:00
ganfra
cac8099117 Local echo: use missing updateSendingInformation on RoomSummaryUpdater 2020-07-23 16:38:17 +02:00
onurays
4cc3e87d64 Fix rebranding assets on login screens. 2020-07-23 15:02:40 +03:00
ganfra
3e429490e7 Update CHANGES 2020-07-22 17:04:48 +02:00
ganfra
e23b02f2e2 Composer: set max lines to 6 so it can scroll 2020-07-22 16:02:38 +02:00
ganfra
aa5ae45a0c Add hasFailedSending in RoomSummary and a small warning icon on room list 2020-07-22 15:21:48 +02:00
ganfra
d7558902f7 Sending: limit to 3 retry before failing 2020-07-22 11:12:37 +02:00
ganfra
aa5de1896f Merge pull request #1766 from vector-im/feature/fix_annoying_issues
Fix post Element release issues
2020-07-21 16:43:26 +02:00
ganfra
e5596f6a97 Use Any instead of JsonDict so users won't loose ignored users 2020-07-21 10:43:52 +02:00
ganfra
d638306b04 Merge pull request #1703 from vector-im/feature/md_files
Riot -> Element
2020-07-21 10:08:07 +02:00
ganfra
dba9356472 Merge pull request #1714 from vector-im/feature/deactivated_account
i18n deactivated account error
2020-07-21 08:14:10 +02:00
ganfra
fb247f8bea Update CHANGES and clean code 2020-07-20 20:29:52 +02:00
ganfra
c880e2b848 Fix Requesting avatar thumbnails in Element uses wrong http "user-agent" string #1725 2020-07-20 20:24:04 +02:00
ganfra
1436477a14 Rework a bit user account data (and avoid blocking syncs) 2020-07-20 19:52:24 +02:00
ganfra
35fe4f7268 Fix modular link to EMS 2020-07-20 18:47:41 +02:00
ganfra
a488e88f93 Add reaction to RoomSummary latest previewable event 2020-07-20 16:49:05 +02:00
ganfra
0d51c160eb Should fix realm crash loop 2020-07-20 16:43:39 +02:00
ganfra
27207a27ae Fix "uploads don't work with Room v6" #1558 2020-07-17 20:33:47 +02:00
Benoit Marty
5082defddf i18n deactivated account error 2020-07-17 17:23:48 +02:00
ganfra
6e0095edb0 Feature/fix notification clearing (#1707)
Updating notification when entering a room
2020-07-17 13:31:36 +02:00
Benoit Marty
d78cd81c6f Cleanup strings.xml 2020-07-16 19:21:02 +02:00
Benoit Marty
ef93ef57f9 Replace Riot -> Element in documentation 2020-07-16 19:19:31 +02:00
Benoit Marty
a600e896a0 Update Contributing file after the release of Element 2020-07-16 19:14:20 +02:00
Benoit Marty
993c340c4f Update Authors file after the release of Element 2020-07-16 19:11:33 +02:00
Benoit Marty
87f506f23b Update Readme file after the release of Element 2020-07-16 19:10:52 +02:00
Benoit Marty
44fb53ce6b Merge pull request #1701 from vector-im/feature/riotx_remaining
RiotX -> Element
2020-07-16 18:56:44 +02:00
Benoit Marty
1d2e374526 RiotX -> Element 2020-07-16 16:01:25 +02:00
Benoit Marty
5c423d2897 RiotX -> Element 2020-07-15 20:21:58 +02:00
Benoit Marty
6d0a1ee824 SSO Login: use "element://element" url instead of "riotx://riotx" 2020-07-15 20:21:35 +02:00
Benoit Marty
978ab76644 Merge pull request #1694 from vector-im/feature/improve_splash
Improve splash screen
2020-07-15 20:15:47 +02:00
Benoit Marty
da4e3f3b9c Merge pull request #1693 from vector-im/feature/fix_1613
Feature/fix 1613
2020-07-15 16:41:19 +02:00
Benoit Marty
f6d2d05e70 Improve splash screen 2020-07-15 15:08:46 +02:00
Benoit Marty
d747d96e77 Use correct title 2020-07-15 14:49:26 +02:00
Benoit Marty
484b69165b Add rounded light background to fix dark images on dark background issue (#1613) 2020-07-15 14:34:06 +02:00
Benoit Marty
0159e6dc00 Hide the menu item, it's not implemented yet 2020-07-15 14:33:01 +02:00
Benoit Marty
8f7aae4980 Tint the icon (#1613) 2020-07-15 14:33:01 +02:00
Benoit Marty
0f9e26efc5 let instead of also 2020-07-15 14:33:01 +02:00
Benoit Marty
53f0b77fb0 Version++ 2020-07-15 14:32:15 +02:00
Benoit Marty
fca669ff98 Merge branch 'release/1.0.0' 2020-07-15 14:27:24 +02:00
Benoit Marty
e910fc60fe Merge branch 'release/1.0.0' into develop 2020-07-15 14:27:23 +02:00
Benoit Marty
1d2e62fed7 Prepare release 1.0.0 2020-07-15 14:27:08 +02:00
Benoit Marty
7651eb5c3c Revert "Temporary remove the _dev suffix added to version"
This reverts commit 7237ec7310.
2020-07-15 14:14:44 +02:00
Benoit Marty
a06484c260 Merge pull request #1691 from vector-im/rebranding
Rebranding!
2020-07-15 14:13:11 +02:00
Benoit Marty
9b49e6a817 Use local file in a dialog though (else -> crash) 2020-07-13 23:03:16 +02:00
Benoit Marty
bef0c7725b Use openUrlInChromeCustomTab because it's better and it fixes crash on API 21 (at least) 2020-07-13 22:43:19 +02:00
Benoit Marty
7237ec7310 Temporary remove the _dev suffix added to version 2020-07-13 21:50:26 +02:00
Benoit Marty
3abe5b8467 ktlint 2020-07-13 21:38:49 +02:00
Valere
0406854fa5 lighter bottom sheet separator 2020-07-13 19:25:59 +02:00
Valere
ca6a398a72 Update add room icon 2020-07-13 19:25:44 +02:00
Valere
5e81ce8e3e Update tmp lab icon for notif tab 2020-07-13 19:25:35 +02:00
Onuray Sahin
8658090736 Fix tint color of settings. 2020-07-13 20:16:01 +03:00
Onuray Sahin
614ac88567 Create group room icon changed. 2020-07-13 20:06:39 +03:00
Onuray Sahin
797dcdb48b Merge branch 'riotx_develop' into rebranding_rebase
* riotx_develop: (111 commits)
  Video calls are shown as a voice ones in the timeline (Fixes #1676)
  Fix regression: not able to create a room without IS configured (Fixes #1679)
  Fix / view attachment crash + freeze when offline
  Version++
  Prepare release 0.91.5
  Fix test compilation issue
  Fix crash after rebase
  Add TODO
  Copy Javadoc to the API class
  Move internal methods to internal task
  Latest renaming
  Rename CreateRoomParamsInternalBuilder to CreateRoomBodyBuilder for clarity
  Rename CreateRoomParamsBuilder to CreateRoomParams for clarity
  Rename internal class
  Expose other objects in the builder to create a room
  ktlint
  Display threePid invite along with the other invite (code is a bit dirty)
  Hide right arrow if threepid invite can not be revoked
  Disable fetching Msisdn, it does not work
  Revoke ThreePid invitation (#548)
  ...

# Conflicts:
#	vector/build.gradle
#	vector/src/main/java/im/vector/riotx/features/crypto/keys/KeysExporter.kt
#	vector/src/main/res/layout/bottom_sheet_logout_and_backup.xml
#	vector/src/main/res/values/strings.xml
2020-07-13 19:59:20 +03:00
Onuray Sahin
3a696ea9a1 Revert shield icons. 2020-07-13 19:21:22 +03:00
Onuray Sahin
1b19cb7449 Roll back ic_shield_black 2020-07-13 19:18:56 +03:00
Onuray Sahin
ea81a5298b ic_shield_black icon changed. 2020-07-13 18:55:30 +03:00
Onuray Sahin
ae65eb6a3e Advanced Settings icon changed. 2020-07-13 18:39:09 +03:00
Onuray Sahin
67e07a7932 Room action settings and leave icons changed. 2020-07-13 18:33:29 +03:00
Onuray Sahin
6ef15f3c1c ic_star icon changed. 2020-07-13 18:28:05 +03:00
Benoit Marty
0e3be83da2 Merge branch 'rebranding' of https://gitlab.matrix.org/new-vector/element/element-android into rebranding 2020-07-13 17:21:40 +02:00
Benoit Marty
8b5b7db241 Fix icons alignment issue 2020-07-13 17:21:33 +02:00
Onuray Sahin
1fd8a5fa91 Merge branch 'rebranding' of https://gitlab.matrix.org/new-vector/element/element-android into rebranding
* 'rebranding' of https://gitlab.matrix.org/new-vector/element/element-android:
  Icon: "Modular" -> "Element Matrix Services"
2020-07-13 18:11:45 +03:00
Onuray Sahin
34d7a86175 Update attachment and send icons. 2020-07-13 18:10:49 +03:00
Benoit Marty
21f1f89a4b Merge branch 'rebranding' of https://gitlab.matrix.org/new-vector/element/element-android into rebranding 2020-07-13 16:53:48 +02:00
Benoit Marty
159f286b2c Icon: "Modular" -> "Element Matrix Services" 2020-07-13 16:53:26 +02:00
Onuray Sahin
06454cc3e0 Sticker attachment icon changed. 2020-07-13 17:52:09 +03:00
Onuray Sahin
be27b580d6 ic_fab_add_chat icon changed. 2020-07-13 17:40:16 +03:00
Onuray Sahin
f91b6938f5 Remove stroke from shield icons. 2020-07-13 17:35:58 +03:00
Onuray Sahin
a7fea8d012 Relace eye and eye_closed icons. 2020-07-13 17:26:23 +03:00
Onuray Sahin
18bc40fb66 Design review fixes for login screen. 2020-07-13 17:01:48 +03:00
Benoit Marty
1dec4bc96b Wording: "Modular" -> "Element Matrix Services" 2020-07-13 15:49:46 +02:00
Benoit Marty
0e28214b63 Do not display the name change popup for a new installation 2020-07-13 14:23:06 +02:00
Benoit Marty
ca61751a8b Merge pull request #1678 from vector-im/feature/attachement_pager_fix
Fix / view attachment crash + freeze when offline
2020-07-13 11:33:11 +02:00
Benoit Marty
cce1c2252d Merge pull request #1681 from vector-im/feature/other_fixes
Video calls are shown as a voice ones in the timeline (Fixes #1676)
2020-07-13 11:31:38 +02:00
Benoit Marty
6a4d887941 Merge branch 'develop' into feature/other_fixes 2020-07-13 11:31:25 +02:00
Benoit Marty
4de1759321 Merge pull request #1680 from vector-im/feature/fix_create_room
Fix regression: not able to create a room without IS configured (Fixes #1679)
2020-07-13 11:30:47 +02:00
Benoit Marty
139cd051ab Video calls are shown as a voice ones in the timeline (Fixes #1676) 2020-07-13 10:57:52 +02:00
Benoit Marty
33b2abc3b9 Fix regression: not able to create a room without IS configured (Fixes #1679) 2020-07-13 10:46:51 +02:00
Valere
c63128cfbd Fix / view attachment crash + freeze when offline 2020-07-13 09:15:52 +02:00
Benoit Marty
5063188b25 Version++ 2020-07-11 23:00:16 +02:00
Benoit Marty
b9f0c176d9 Merge branch 'release/0.91.5' 2020-07-11 22:58:48 +02:00
Benoit Marty
d09c03bff3 Merge branch 'release/0.91.5' into develop 2020-07-11 22:58:47 +02:00
Benoit Marty
f444595845 Prepare release 0.91.5 2020-07-11 22:58:34 +02:00
Benoit Marty
eedf545409 Merge pull request #1658 from vector-im/feature/3pid_invite
3pid invite
2020-07-11 22:50:08 +02:00
Benoit Marty
aba8a3fed1 Fix test compilation issue 2020-07-11 22:49:29 +02:00
Benoit Marty
68d475dc55 Fix crash after rebase 2020-07-11 22:45:03 +02:00
Benoit Marty
ece9fbd3bb Add TODO 2020-07-11 22:26:21 +02:00
Benoit Marty
602d67155f Copy Javadoc to the API class 2020-07-11 22:25:21 +02:00
Benoit Marty
75ef491e3e Move internal methods to internal task 2020-07-11 22:22:21 +02:00
Benoit Marty
0f327fc75f Latest renaming 2020-07-11 22:17:55 +02:00
Benoit Marty
a456f4c6a5 Rename CreateRoomParamsInternalBuilder to CreateRoomBodyBuilder for clarity 2020-07-11 22:16:35 +02:00
Benoit Marty
e097bd8117 Rename CreateRoomParamsBuilder to CreateRoomParams for clarity 2020-07-11 22:15:26 +02:00
Benoit Marty
ded8acc836 Rename internal class 2020-07-11 22:13:22 +02:00
Benoit Marty
d8a0a1d38e Expose other objects in the builder to create a room 2020-07-11 22:11:15 +02:00
Benoit Marty
e8f28d7ce4 ktlint 2020-07-11 22:11:15 +02:00
Benoit Marty
a58bb776f3 Display threePid invite along with the other invite (code is a bit dirty) 2020-07-11 22:11:15 +02:00
Benoit Marty
4ba1a34f38 Hide right arrow if threepid invite can not be revoked 2020-07-11 22:11:15 +02:00
Benoit Marty
3d68b15e60 Disable fetching Msisdn, it does not work 2020-07-11 22:11:15 +02:00
Benoit Marty
c78bba803c Revoke ThreePid invitation (#548) 2020-07-11 22:11:15 +02:00
Benoit Marty
863c09142f Display three pid invites in the room members list (#548) 2020-07-11 22:11:15 +02:00
Benoit Marty
3142442e5c Load contacts much faster 2020-07-11 22:11:15 +02:00
Benoit Marty
4c1d50d554 Renames package and some other things 2020-07-11 22:11:15 +02:00
Benoit Marty
25e7bbcd79 Handle contacts permission 2020-07-11 22:10:52 +02:00
Benoit Marty
4b3a6a883d CreateRoomParams has been replaced by CreateRoomParamsBuilder, to be able to invite 3pids 2020-07-11 22:10:52 +02:00
Benoit Marty
6c0bb2a949 Add 3Pid to the list. Not compiling, I have to modify CreateRoomParam 2020-07-11 22:08:02 +02:00
Benoit Marty
f714566200 use projection to gain 25% of time 2020-07-11 22:08:02 +02:00
Benoit Marty
327a596de5 Move classes 2020-07-11 22:08:02 +02:00
Benoit Marty
cc4603b61f Rename classes 2020-07-11 22:08:02 +02:00
Benoit Marty
f51568b331 Fix a crash (#548) 2020-07-11 22:08:02 +02:00
Benoit Marty
6ceac578a3 Add checkbox to filter contacts with MatrixId only 2020-07-11 22:08:02 +02:00
Benoit Marty
1c733e6661 Display Contact list (#548)
WIP (#548)

WIP (#548)

WIP (#548)

WIP (#548)

WIP (#548)
2020-07-11 22:08:02 +02:00
Benoit Marty
3842ec6bb0 Invite by msisdn. Error 500 from matrix.org though (#548) 2020-07-11 22:07:14 +02:00
Benoit Marty
ab1d652f17 Invite by email (msisdn not working), command line (#548) 2020-07-11 22:07:14 +02:00
Benoit Marty
70e90d8542 Render third party invite event (#548) 2020-07-11 22:07:14 +02:00
Benoit Marty
39e185576c Merge pull request #1666 from vector-im/feature/tab_notification_labs
Feature/tab notification labs
2020-07-11 22:05:56 +02:00
Benoit Marty
9c402d4d40 Merge pull request #1665 from vector-im/feature/fix_small_issues
Feature/fix small issues
2020-07-11 21:58:11 +02:00
Benoit Marty
37378ca5a6 typo 2020-07-11 21:57:45 +02:00
Benoit Marty
a35749964c Merge branch 'develop' into feature/fix_small_issues 2020-07-11 21:56:07 +02:00
Valere
bbbd45efcd Fix / missing transparency on waiting view background 2020-07-11 20:46:47 +02:00
Valere
246f6bb0d0 update change log 2020-07-11 18:41:08 +02:00
Valere
a08a1d4f74 Merge pull request #1662 from vector-im/feature/manage_4s_setting
4S settings screen
2020-07-11 18:39:33 +02:00
Valere
7acbd42a45 Propose unread tab as a lab setting 2020-07-11 18:38:03 +02:00
Valere
c6a5d05ffb update change log 2020-07-11 17:29:22 +02:00
Valere
36b17e9b8c Fix / missing tint for recovery icon 2020-07-11 17:29:15 +02:00
ganfra
c2cccd8b11 Some changes after benoit's review 2020-07-11 15:26:54 +02:00
ganfra
e7804af2f7 EventInsertLiveObserver: change of delete method (should be faster) 2020-07-11 13:27:49 +02:00
ganfra
0412fabbd2 Clean comment on EventInsertLiveProcessor 2020-07-11 13:24:32 +02:00
Benoit Marty
22959cddb2 Pref is always visible and enabled 2020-07-11 13:24:10 +02:00
Benoit Marty
7193db8344 Try to improve readability 2020-07-11 13:19:43 +02:00
Benoit Marty
352662d19a Rename param 2020-07-11 13:13:44 +02:00
Benoit Marty
1afabb69c1 Cleanup pref 2020-07-11 13:13:08 +02:00
Benoit Marty
6f4ea83fa9 Create allKnown() fun 2020-07-11 13:03:53 +02:00
ganfra
1c17bd9f5a Clean code 2020-07-11 12:57:49 +02:00
Benoit Marty
de5f182f29 Move SecretsSynchronisationInfo to its file
And do some other cleanup
2020-07-11 12:57:20 +02:00
Benoit Marty
aa1843774a Cleanup 2020-07-11 12:50:16 +02:00
Benoit Marty
9e1c30ec5d No need to return the disposable, it is never used 2020-07-11 12:49:54 +02:00
Benoit Marty
31984a57d6 Subscribe to view model is already disposed 2020-07-11 12:46:10 +02:00
ganfra
2f0645a94e Fix left user has no name in db 2020-07-11 12:39:41 +02:00
Valere
c57d41863f 4S settings screen 2020-07-11 12:37:18 +02:00
Benoit Marty
25bbe9c3d6 Merge pull request #1661 from vector-im/feature/create_file_intent
Feature/create file intent
2020-07-11 12:28:15 +02:00
Benoit Marty
c5c3592a4c Merge branch 'develop' into feature/create_file_intent 2020-07-11 12:28:07 +02:00
Benoit Marty
5a8008a4dc Fix bug when restoring key backup with recovery key 2020-07-11 12:26:52 +02:00
Benoit Marty
2c5d2ea179 Improve wording 2020-07-11 12:26:47 +02:00
Benoit Marty
4387fd3327 We do not need write storage permission to create a Txt file with the intent Intent.ACTION_CREATE_DOCUMENT 2020-07-11 12:26:47 +02:00
ganfra
1f2d5b0d00 KeybackupBanner: remove unnecessary animation 2020-07-11 10:48:45 +02:00
ganfra
253582219c Remove EllipsizingTextView as it provokes more issue than it solves 2020-07-10 22:35:51 +02:00
ganfra
3fc9fe3017 Merge branch 'develop' into feature/fix_small_issues 2020-07-10 20:13:47 +02:00
ganfra
e07a584d66 Revert fixing users as it's not the good catch 2020-07-10 20:09:30 +02:00
ganfra
150d44aafd Improve a bit how joining/leaving are handled 2020-07-10 20:08:51 +02:00
Benoit Marty
179474b975 Cleanup 2020-07-10 17:51:57 +02:00
Benoit Marty
825e21362b Merge pull request #1546 from johnjohndoe/styledattributeset
Use Context#withStyledAttributes extension function.
2020-07-10 17:48:39 +02:00
Onuray Sahin
0bc51b2ed8 Change brand name in all strings for all languages. 2020-07-10 18:28:22 +03:00
Benoit Marty
4741169cc7 Merge pull request #1611 from vector-im/feature/okhttp_for_glide
Feature/okhttp for glide
2020-07-10 15:54:31 +02:00
Benoit Marty
a8ad57a9b0 Merge pull request #1648 from vector-im/feature/server_recovery_banner
Feature/server recovery banner
2020-07-10 15:53:58 +02:00
Valere
8582ad6015 Merge pull request #1636 from vector-im/feature/attachement_pager
Feature/attachement pager
2020-07-10 15:47:32 +02:00
Benoit Marty
51898a8109 Create new strings for change translations 2020-07-10 15:06:34 +02:00
Benoit Marty
d63f00851a Rename parameters 2020-07-10 14:43:14 +02:00
Benoit Marty
f179fc523d Give configured OkHttpClient to Glide and BigImageViewer 2020-07-10 14:43:07 +02:00
Benoit Marty
eda29e3fef Add link for WebRTC 2020-07-10 14:43:07 +02:00
Benoit Marty
633548f190 Create ImageManager to be able to (re-)configure the lib 2020-07-10 14:43:07 +02:00
Benoit Marty
811cbb2e20 ActiveSessionHolder to more things related to other @Singleton, and especially some missing cleanup
Such as calling `removeListener()` and `callSignalingService().removeCallListener()`
`Session.configureAndStart()` do less thing now
2020-07-10 14:43:07 +02:00
Benoit Marty
6569ee5d10 Use Set instead of List 2020-07-10 14:42:30 +02:00
Benoit Marty
5f60d7fd3b Session.configureAndStart now handle registering to webRtcPeerConnectionManager... 2020-07-10 14:42:30 +02:00
Benoit Marty
10f8aebde2 Update comment 2020-07-10 14:42:30 +02:00
Valere
ea771476cc Merge remote-tracking branch 'origin/feature/attachement_pager' into feature/attachement_pager 2020-07-10 14:39:22 +02:00
Valere
08bc487f17 klint 2020-07-10 14:39:08 +02:00
Valere
1b6b71ed98 Debounce clicks 2020-07-10 14:38:31 +02:00
Valere
9f2631110e Missing copyrights 2020-07-10 14:38:23 +02:00
Benoit Marty
e8b1e418fa ktlint 2020-07-10 14:37:57 +02:00
Valere
44563e73e2 Merge pull request #1655 from vector-im/feature/push_verif
Send verification request when the device is not new
2020-07-10 14:18:26 +02:00
Onuray Sahin
d3595173b4 Room notification settings icons changed. 2020-07-10 15:14:06 +03:00
Onuray Sahin
14d4b34cee Change event action icons. 2020-07-10 14:54:15 +03:00
Onuray Sahin
538149233b Change timeline call action icons. 2020-07-10 14:43:19 +03:00
Onuray Sahin
bcb203f8e0 Change settings icons. 2020-07-10 14:24:10 +03:00
Onuray Sahin
3c6937ff5a Change status bar icon. 2020-07-10 14:11:34 +03:00
Benoit Marty
6c0f775c4b Cleanup 2020-07-10 13:07:14 +02:00
Benoit Marty
ea3e467dc4 Format 2020-07-10 12:52:54 +02:00
Benoit Marty
5a65eddf59 Cleanup Navigator 2020-07-10 12:48:35 +02:00
Benoit Marty
e979bee920 Format 2020-07-10 12:38:20 +02:00
Benoit Marty
eff08955f1 Fix a11y 2020-07-10 12:37:48 +02:00
Onuray Sahin
9310073c07 Remove unused splash icons. 2020-07-10 13:21:30 +03:00
Benoit Marty
28869f4382 Small cleanup before merge 2020-07-10 12:19:25 +02:00
Onuray Sahin
cd949e9d38 Fix bottom sheet divider colors. 2020-07-10 13:11:23 +03:00
Onuray Sahin
541e1fc4cc Change file names with the new brand. 2020-07-10 13:11:01 +03:00
Onuray Sahin
93fe00a299 Merge branch 'develop' into rebranding_rebase
* develop: (123 commits)
  Fixes #1647 share not working
  Put xmx to 2048m
  Update changelog after PR merged
  Version++
  Prepare release 0.91.04-beta
  Add the new value to the ViewEvent, because the state is maybe not up to date.
  Fix lint error, following the upgrade of the libs
  Revert to gradle build 3.5.3
  Clean code
  Fix leaving selected group
  QuickFix / crash when  starting in airplane mode
  Group: rework a bit how and when we fetch data about groups
  EventInsert: add InsertType to avoid trying to process events we shouldn't
  Upload device keys only once to the homeserver and fix crash when no network (#1629)
  Upgrade some dependencies
  Add a delay to avoid crash. Sounds like a workaround...
  Handle certificate error in case of Direct Login
  Handle JobCancellationException
  Simplify the server selection screen: remove the "Continue" button
  Re-activate Wellknown support with updated UI (#1614)
  ...

# Conflicts:
#	vector/build.gradle
#	vector/src/main/res/values/strings.xml
2020-07-10 13:05:52 +03:00
ganfra
8814364497 Invite: we shouldn't be able to open room details 2020-07-10 11:32:28 +02:00
Onuray Sahin
0d9ff4bde3 Add branch name to login splash screen. 2020-07-10 12:04:48 +03:00
ganfra
9c595b6c02 Fix "Leave room only leaves the current version" 2020-07-10 08:54:41 +02:00
ganfra
d49d0295a2 Send verification request when the device is not new 2020-07-09 18:31:09 +02:00
ganfra
da7c971927 Fragments: use commitTransaction instead of commitNow 2020-07-09 17:46:59 +02:00
ganfra
548879bd9f Fix encryption enabling visible for all users 2020-07-09 17:20:51 +02:00
Valere
0c2516ccf8 line too long 2020-07-09 15:47:59 +02:00
Valere
332f227bc1 Signout to setup 4S 2020-07-09 15:45:58 +02:00
Valere
a98b2ecce3 Set server backup banner 2020-07-09 15:45:58 +02:00
Valere
195e2703b9 Support open from upload media tab 2020-07-09 15:22:34 +02:00
Onuray Sahin
c1f1620624 Disclaimer dialog is updated. 2020-07-09 15:17:17 +03:00
Onuray Sahin
f5284e8447 previously-riot url added to use in disclaimer dialog. 2020-07-09 15:15:27 +03:00
Onuray Sahin
347cf08861 Update settings urls. 2020-07-09 13:46:27 +03:00
Onuray Sahin
540317639a Change slogan. 2020-07-09 12:51:29 +03:00
Onuray Sahin
bdcd96544e Use bigger logo at loading screen. 2020-07-09 12:48:45 +03:00
Onuray Sahin
8237c949f1 Change logo in login screen. 2020-07-09 12:27:28 +03:00
Valere
e38cb7c1a6 Unwanted logs 2020-07-09 10:16:38 +02:00
Valere
868d9cf55c Cleaning (remove audio and file as not supported yet) 2020-07-09 10:11:10 +02:00
Valere
aa3e68f3fd Refactoring
Remove glide dependency + protect against cell reuse bugs
2020-07-09 10:08:55 +02:00
Valere
bf2d937ad6 Basic video seekTo support 2020-07-09 08:59:06 +02:00
Valere
e24d5b3ca4 Simple play/pause overlay 2020-07-08 22:58:27 +02:00
Valere
e9778d6feb Video stop/resume when paging or bg/fg 2020-07-08 22:41:17 +02:00
Valere
8c4c909f44 share action 2020-07-08 22:27:00 +02:00
Valere
a1db8653ab Basic Video Support 2020-07-08 20:09:55 +02:00
Valere
cc5df1e1d5 Update change log 2020-07-08 20:09:55 +02:00
Valere
87b1394e98 Code cleaning 2020-07-08 20:09:55 +02:00
Valere
e3c2af2c59 Code cleaning 2020-07-08 20:09:55 +02:00
Valere
a618a9214e Show hide overlay on tap 2020-07-08 20:09:55 +02:00
Valere
76133ab55e Simple overlay 2020-07-08 20:09:55 +02:00
Valere
2d4a728af4 Gif support 2020-07-08 20:09:55 +02:00
Valere
4a2a6d34ae Initial commit 2020-07-08 20:09:55 +02:00
ganfra
75c2dfcd48 Fix user data being affected by local room member event changes 2020-07-08 19:16:22 +02:00
ganfra
6ebedaf540 Update CHANGES 2020-07-08 17:40:37 +02:00
ganfra
85e8e652f1 Fix IM terms of review path 2020-07-08 17:32:54 +02:00
Onuray Sahin
f025811025 Change splash screen icons. 2020-07-08 17:54:51 +03:00
ganfra
3aabb17ea5 Fix timeline pagination when no displayable events 2020-07-08 15:51:00 +02:00
ganfra
f1e5129acb Merge pull request #1651 from vector-im/feature/quick_fix_sharing
Fixes #1647 share not working
2020-07-08 14:56:36 +02:00
ganfra
e8dbed1642 Fix relations on encrypted room 2020-07-08 14:51:15 +02:00
Onuray Sahin
6d270dc5f4 Fix background of bottom sheet generic item. 2020-07-08 13:52:56 +03:00
Onuray Sahin
2afe642e8b Use 48px icon instead of 44px. 2020-07-08 13:02:02 +03:00
Onuray Sahin
680e62cb98 Update application icons. 2020-07-08 12:55:15 +03:00
Valere
c5ba746904 Fixes #1647 share not working 2020-07-08 11:00:13 +02:00
Onuray Sahin
702711fc5e Fix drawer layout colors. 2020-07-08 10:58:24 +03:00
ganfra
0855806ae2 Fix edit being stuck 2020-07-07 22:14:11 +02:00
Benoit Marty
a2c75e7c71 Merge pull request #1640 from vector-im/mv/lower-xmx
Put xmx to 2048m
2020-07-07 14:51:38 +02:00
Mathieu Velten
6f996f1f09 Put xmx to 2048m 2020-07-07 14:23:59 +02:00
Onuray Sahin
ac7a929a1a Fix tint color of add icon. 2020-07-07 15:05:47 +03:00
Onuray Sahin
8313e45737 Use material add icon instead of png. 2020-07-07 13:28:06 +03:00
Onuray Sahin
09ca2361d7 Adjust colors and remove divider between notification settings and leave room action. 2020-07-07 13:12:24 +03:00
Benoit Marty
bcfd322b85 Update changelog after PR merged 2020-07-07 12:00:41 +02:00
Benoit Marty
9dc831d8e5 Merge pull request #1634 from vector-im/feature/db_clean_up
Feature/db clean up
2020-07-07 11:59:28 +02:00
Onuray Sahin
9514835232 Fix bottom sheet backgrounds. 2020-07-07 12:52:28 +03:00
Onuray Sahin
e93a2d7c5d UI review fixes. 2020-07-07 10:35:38 +03:00
Benoit Marty
b2f6476f78 Merge pull request #1631 from vector-im/feature/some_upgrade
Upgrade some dependencies
2020-07-06 23:38:48 +02:00
Benoit Marty
b7d86c3fa4 Merge branch 'develop' into feature/some_upgrade 2020-07-06 23:38:26 +02:00
Benoit Marty
89506b9e81 Version++ 2020-07-06 23:36:14 +02:00
Benoit Marty
51abdb6066 Merge branch 'release/0.91.4' 2020-07-06 23:31:28 +02:00
Benoit Marty
9e60f73bcf Merge branch 'release/0.91.4' into develop 2020-07-06 23:31:27 +02:00
Benoit Marty
1e6d98a121 Prepare release 0.91.04-beta 2020-07-06 23:31:03 +02:00
Benoit Marty
98d56cb556 Merge pull request #1630 from vector-im/feature/wellknown
Re-activate Wellknown support with updated UI (#1614)
2020-07-06 23:29:10 +02:00
Benoit Marty
8b1a07b8a8 Add the new value to the ViewEvent, because the state is maybe not up to date. 2020-07-06 23:05:42 +02:00
Benoit Marty
92e809fa6d Fix lint error, following the upgrade of the libs 2020-07-06 22:05:29 +02:00
Benoit Marty
a0998e4aff Revert to gradle build 3.5.3 2020-07-06 21:53:10 +02:00
Benoit Marty
804d712848 Merge pull request #1633 from vector-im/feature/keys_upload
Upload device keys only once to the homeserver and fix crash when no network (#1629)
2020-07-06 21:39:13 +02:00
ganfra
08cda2ee10 Merge develop into feature/db_clean_up 2020-07-06 19:18:42 +02:00
ganfra
bf03b367f1 Clean code 2020-07-06 19:12:24 +02:00
ganfra
c1da4aecd7 Fix leaving selected group 2020-07-06 19:09:08 +02:00
Valere
38c54e0f2c QuickFix / crash when starting in airplane mode 2020-07-06 18:51:39 +02:00
ganfra
9ebf87df62 Group: rework a bit how and when we fetch data about groups 2020-07-06 18:47:59 +02:00
ganfra
32d2cea7f8 EventInsert: add InsertType to avoid trying to process events we shouldn't 2020-07-06 18:38:30 +02:00
Benoit Marty
f998cb6b18 Upload device keys only once to the homeserver and fix crash when no network (#1629) 2020-07-06 17:12:47 +02:00
Benoit Marty
9d4e903c4a Upgrade some dependencies 2020-07-06 15:59:49 +02:00
Benoit Marty
cfdf5cb552 Add a delay to avoid crash. Sounds like a workaround... 2020-07-06 14:57:28 +02:00
Benoit Marty
e859357c6a Handle certificate error in case of Direct Login 2020-07-06 14:13:34 +02:00
Benoit Marty
e7f13c9efe Handle JobCancellationException 2020-07-06 14:12:56 +02:00
Benoit Marty
2a68c8d08b Simplify the server selection screen: remove the "Continue" button 2020-07-06 14:12:56 +02:00
Onuray Sahin
b1c088a03b Update new accent color. 2020-07-06 13:08:06 +03:00
Tobias Preuss
04f0146afd Use Context#withStyledAttributes extension function.
+ This function is more concise and ensures "recycle()" is always invoked.
+ Sources: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-preference-release/core/core-ktx/src/main/java/androidx/core/content/Context.kt#52
2020-07-04 19:36:17 +02:00
Benoit Marty
92ecfafa0d Merge pull request #1608 from vector-im/feature/save_attachement_legacy
Fix / save media on old android
2020-07-04 12:16:59 +02:00
Benoit Marty
f74ab2dfd4 Merge branch 'develop' into feature/save_attachement_legacy 2020-07-04 12:16:50 +02:00
Benoit Marty
a1dc383148 Merge pull request #1610 from tulir/fix-reply-fallback
Fix reply fallback leaking sender locale
2020-07-04 12:15:29 +02:00
Benoit Marty
b853397c0a Re-activate Wellknown support with updated UI (#1614) 2020-07-04 12:10:17 +02:00
Benoit Marty
0cfd33fc8b Typo 2020-07-04 11:15:20 +02:00
Tulir Asokan
51e63c5d1d Remove unused reply fallback translations
Signed-off-by: Tulir Asokan <tulir@maunium.net>
2020-07-03 23:12:38 +03:00
Tulir Asokan
e9ba7342d5 Fix reply fallback format
Signed-off-by: Tulir Asokan <tulir@maunium.net>
2020-07-03 23:12:32 +03:00
ganfra
7434aed43f Use writeAsync for localEcho 2020-07-03 21:12:27 +02:00
ganfra
283f32479d Rebranch timeline + continue clean up strategy 2020-07-03 21:11:54 +02:00
Onuray Sahin
f4057ea3fa Fix background of drawer layout. 2020-07-03 14:50:33 +03:00
Onuray Sahin
a7480c1860 Change colors according to the new color palette. 2020-07-03 13:36:30 +03:00
Benoit Marty
c4ad90696f Update vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt 2020-07-03 12:28:38 +02:00
Benoit Marty
85ee183e4f Update vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt 2020-07-03 12:28:32 +02:00
Benoit Marty
586b0fe6e2 Merge pull request #1602 from vector-im/feature/work_manager_init
Work manager init
2020-07-03 12:04:53 +02:00
Valere
bdfce35d9a Fix / save media on old android
+ add numbers to file if needed
2020-07-03 10:32:07 +02:00
ganfra
3648d6292a Merge branch 'develop' into feature/db_clean_up 2020-07-03 10:21:48 +02:00
Benoit Marty
b8f88d323d Merge pull request #1604 from vector-im/feature/fix_crash_notification
Feature/fix crash notification
2020-07-03 00:23:31 +02:00
Benoit Marty
b8f66a36d5 Merge branch 'develop' into feature/fix_crash_notification 2020-07-03 00:23:21 +02:00
Benoit Marty
d4050a7b9d Due to a bug introduced in Android gradle plugin 3.6.0, we have to specify the ndk version to use 2020-07-02 23:39:42 +02:00
Benoit Marty
bfb8b6203c Add proguard command (commented) 2020-07-02 22:02:42 +02:00
Benoit Marty
15223ecfe4 Update changelog with the recent change 2020-07-02 21:31:39 +02:00
Benoit Marty
e098b87d0a Update comment 2020-07-02 21:30:49 +02:00
Benoit Marty
e878821df2 Merge pull request #1605 from vector-im/feature/fix_db_migration_serialization
Feature/fix db migration serialization
2020-07-02 21:28:30 +02:00
Valere
596fcf94ba Fix / Serialization issues
Fixes  keybackup import failing and UTD of incoming messages
2020-07-02 19:26:05 +02:00
Onuray Sahin
332041e13b Move some of colors from attrs.xml to colors_riotx.xml 2020-07-02 19:29:45 +03:00
ganfra
5008bfd6a9 Update CHANGES 2020-07-02 16:17:00 +02:00
ganfra
2ef82f1b82 Use HomeActivity.newIntent to make sure we have args 2020-07-02 16:05:05 +02:00
ganfra
2f6b38eb39 Introduce EventInsertEntity to handle db updates 2020-07-02 15:33:06 +02:00
Valere
69eaf2695e FIx / inbound session bad migration 2020-07-02 14:08:09 +02:00
Benoit Marty
542d11d7f1 Upgrade build-tools from 3.5.3 to 3.6.6 and gradle from 5.4.1 to 5.6.4 2020-07-02 12:44:07 +02:00
Benoit Marty
1de819b0a3 Fix lint false-positive about WorkManger (#1012) 2020-07-02 12:21:23 +02:00
Benoit Marty
5713fa4f59 Clean code 2020-07-02 12:17:09 +02:00
Benoit Marty
93fb40f323 (re-)Enable abortOnError for lint
And fix a first issue (on unused code)
2020-07-02 11:29:00 +02:00
Benoit Marty
f4314ebdae Version++ 2020-07-01 21:58:58 +02:00
Benoit Marty
7b075f138d Merge branch 'release/0.91.3-beta' 2020-07-01 21:51:50 +02:00
Benoit Marty
c62a7c4051 Merge branch 'release/0.91.3-beta' into develop 2020-07-01 21:51:49 +02:00
Benoit Marty
3e97e03ccc Prepare release Riot.imX v0.91.3 for the beta channel 2020-07-01 21:51:30 +02:00
Onuray Sahin
74a3d7619b Handle permalink coming from the new domain. 2020-07-01 22:21:59 +03:00
Onuray Sahin
fc88892ee6 Update bottom navigation and room profile icons. 2020-07-01 22:21:06 +03:00
Benoit Marty
01e42838ef Merge pull request #1593 from vector-im/feature/fix_crash_on_shortcuts
Clear dynamic shortcuts when user logs out
2020-07-01 20:33:00 +02:00
Benoit Marty
192c6db03e Merge pull request #1592 from vector-im/feature/new_home
Catchup tab is removed temporarily (#1565)
2020-07-01 20:32:04 +02:00
Benoit Marty
a98bd0940f Merge branch 'develop' into feature/new_home 2020-07-01 20:31:55 +02:00
Benoit Marty
c0623726ae Clear dynamic shortcuts when user log out 2020-07-01 17:20:41 +02:00
Benoit Marty
ba8ec97f6a Merge pull request #1591 from vector-im/feature/other_fixes
Render room avatar change and other fixes
2020-07-01 16:27:42 +02:00
Benoit Marty
fb1c01c37c Catchup tab is removed temporarily (#1565)
Invites are displayed in the corresponding DM or Room tab
2020-07-01 16:15:06 +02:00
Benoit Marty
f8e35da533 Render room avatar change (#1319) 2020-07-01 14:52:37 +02:00
Benoit Marty
53053d8f4a Fix layout overlap issue (#1407) 2020-07-01 14:03:30 +02:00
Benoit Marty
9eab1acf1e Allow clear text communication (to use local synapse) 2020-07-01 13:55:34 +02:00
Onuray Sahin
7aa9f88ceb New string resources created by changing brand name. 2020-07-01 14:43:35 +03:00
Benoit Marty
310517ece4 Merge pull request #1588 from vector-im/feature/fixes_before_beta_release
Fix issue with not trusted certificate on API 24+
2020-07-01 13:33:29 +02:00
Benoit Marty
8adb36c7c4 Merge pull request #1587 from vector-im/feature/fix_sync
Sync: fix liveState not initialized and add method to get current sta…
2020-07-01 13:27:48 +02:00
Benoit Marty
057f6fdf26 Kotlin style 2020-07-01 12:15:58 +02:00
Benoit Marty
b8b79de91c PinnedTrustManager differ for API 24+ 2020-07-01 12:15:58 +02:00
Benoit Marty
f86fa6cb5d Avoid Exception if array is empty. 2020-07-01 12:15:58 +02:00
ganfra
693c980414 Clean code 2020-07-01 12:11:15 +02:00
ganfra
faeeec0e37 Sync: fix liveState not initialized and add method to get current state without livedata 2020-07-01 12:10:12 +02:00
ganfra
3db26bcae1 Merge develop into db_clean_up 2020-07-01 09:32:25 +02:00
ganfra
f0dbb92d76 Attempt to clean db [WIP] 2020-06-30 19:45:17 +02:00
Benoit Marty
73ce38c6a9 Merge pull request #1583 from vector-im/feature/fix_search_case
Fixes #1468 user search case
2020-06-30 19:16:48 +02:00
Benoit Marty
901cf15a79 Merge pull request #1536 from vector-im/feature/save_file
Improove file download
2020-06-30 19:15:31 +02:00
Benoit Marty
4e3a948513 Cleanup 2020-06-30 19:12:50 +02:00
Benoit Marty
1ed8ff8711 Do some cleanup 2020-06-30 19:06:48 +02:00
Valere
4b74c7320b update change log 2020-06-30 18:49:15 +02:00
Valere
7ed9f535e6 Fix / clear on detached 2020-06-30 18:48:51 +02:00
Valere
f5c1ad8f2a Fix / remember state and resend on rebind 2020-06-30 18:48:51 +02:00
Valere
174084a256 added download animation 2020-06-30 18:48:51 +02:00
Valere
1e718bb44f javadoc 2020-06-30 18:48:51 +02:00
Valere
f0fe10a11d klint 2020-06-30 18:48:51 +02:00
Valere
ae1da6b9f5 Namespacing of file service 2020-06-30 18:48:51 +02:00
Valere
04b6b3674d Also Clear download cache when clearing media 2020-06-30 18:48:51 +02:00
Valere
4254db5cc0 fix rebase 2020-06-30 18:48:51 +02:00
Valere
86e5a45621 Fix save notification 2020-06-30 18:48:51 +02:00
Valere
397d4f0be5 Fix upload + cleaning 2020-06-30 18:48:51 +02:00
Valere
01fdc6d1bb Avoid downloading same file several times 2020-06-30 18:48:51 +02:00
Valere
33698abfb2 Download and Open file securily 2020-06-30 18:48:51 +02:00
Valere
80e8cd4191 Downloaded (large?) files are truncated 2020-06-30 18:39:13 +02:00
Valere
2932e05851 Fixes #1468 user search case 2020-06-30 18:38:46 +02:00
Benoit Marty
19f16c9e56 Merge pull request #1570 from vector-im/feature/self_signed
Allow self-signed certificate (#1564)
2020-06-30 18:34:23 +02:00
Benoit Marty
cec5cd864c Remove legacy class, we do not need them for the migration
Migration tested again and OK
2020-06-30 18:27:39 +02:00
Benoit Marty
ba26aee54c Use OkHttpClient with certificate to download files, and to perform wellknown request, and to get terms 2020-06-30 18:27:39 +02:00
Benoit Marty
6721e33c7e cleanup 2020-06-30 18:25:36 +02:00
Benoit Marty
c14b226c92 Search only Kotlin long files 2020-06-30 18:25:36 +02:00
Benoit Marty
4bb804fbf7 Allow self-signed certificate (#1564)
Accepted fingerprint before the migration to RiotX should still work after the migration.
The dialog to trust the certificate is displayed during the login flow.
For the moment, it is not displayed if the certificate change on the server once the user is logged in. This use case will be handled later.
2020-06-30 18:25:36 +02:00
Benoit Marty
6cb82421e4 Merge pull request #1441 from vector-im/feature/MSC2399
Feature/msc2399
2020-06-30 18:20:27 +02:00
Benoit Marty
6e66c31911 Small cleanup 2020-06-30 18:07:39 +02:00
Valere
a1ce245e3a Disable utd merge by default, issue with back paginate 2020-06-30 17:36:24 +02:00
Valere
668967546c Fix / if listener is not removed messages could be duplicated 2020-06-30 17:36:24 +02:00
Valere
5bd448405b Fix test compilation 2020-06-30 17:36:24 +02:00
Valere
fe235e0791 ktlint 2020-06-30 17:36:24 +02:00
Valere
a9191b8fad klint 2020-06-30 17:36:24 +02:00
Valere
63499c2f48 Add test orchestrator dependency 2020-06-30 17:36:24 +02:00
Valere
3fa2647e92 Send with held code on key requests 2020-06-30 17:36:24 +02:00
Valere
cdb1b8d8f8 post merge fix 2020-06-30 17:36:24 +02:00
Valere
c7c35399e5 post rebase 2020-06-30 17:36:24 +02:00
Valere
102b8f88d0 Persist shared session info (enhance key reshare) 2020-06-30 17:36:24 +02:00
Valere
4ca0c23e2a Mock Http requests for test 2020-06-30 17:36:24 +02:00
Valere
36de891451 E2e lab error display 2020-06-30 17:36:24 +02:00
Valere
f9d931960b rename param 2020-06-30 17:35:24 +02:00
Valere
dbe78f160b WithHeld key support initial commit 2020-06-30 17:35:24 +02:00
Benoit Marty
a6f4cd74d5 Merge pull request #1569 from vector-im/feature/fix_improve_epoxy
Feature/fix improve epoxy
2020-06-30 17:28:34 +02:00
Benoit Marty
87a087c0b5 Merge pull request #1464 from vector-im/feature/room_settings
Room Settings: Name, Topic, Photo, Aliases, History Visibility
2020-06-30 16:33:07 +02:00
Benoit Marty
962e11a740 Onuray's remark :) 2020-06-30 16:31:37 +02:00
Benoit Marty
e658ef184d Fix issue with save action visibility 2020-06-30 16:18:56 +02:00
Benoit Marty
da472ea858 Use name instead of computed displayName 2020-06-30 16:10:27 +02:00
Benoit Marty
ff0b92272a Create RoomHistoryVisibilityFormatter 2020-06-30 16:01:07 +02:00
Benoit Marty
cca6d0e967 Cleanup 2020-06-30 15:52:40 +02:00
onurays
e0ea0c195b Hide save action after saving completed. 2020-06-30 14:23:57 +02:00
onurays
b3d4d20195 Check permission before trying to reach Camera. 2020-06-30 14:23:57 +02:00
onurays
5f788d962e Use AlertDialog from v7 compat lib. 2020-06-30 14:23:57 +02:00
onurays
2650453d4b Add room alias first before setting the canonical alias. 2020-06-30 14:23:57 +02:00
onurays
4d6ba5a491 Check permission before triggering history readability click action. 2020-06-30 14:23:57 +02:00
onurays
32721caf5a Code review fix. 2020-06-30 14:23:57 +02:00
onurays
ad084e1fec Use simple dialog for avatar selection. 2020-06-30 14:23:57 +02:00
onurays
512e4f0ce3 Create UCropHelper with default settings. 2020-06-30 14:23:57 +02:00
onurays
56f8e52352 Simplify uploading room and user avatar. 2020-06-30 14:23:57 +02:00
onurays
a93cbf3548 Lint fix. 2020-06-30 14:23:57 +02:00
onurays
e0e4cf3df1 Code review fixes. 2020-06-30 14:23:57 +02:00
onurays
16bd642ae8 Implementation of updating user avatar.
Fixes #1054
2020-06-30 14:23:57 +02:00
onurays
a03f69fb98 Check if user has enough power level to change room avatar. 2020-06-30 14:22:24 +02:00
onurays
8787f5d920 Remove room avatar item from room settings. 2020-06-30 14:22:24 +02:00
onurays
ef1ae4105b Change room avatar in BigImageViewer. 2020-06-30 14:22:24 +02:00
onurays
7f2ce91c82 Add camera and gallery options to set room avatar. 2020-06-30 14:22:24 +02:00
onurays
1f30cf468a Check if user have enough power level to change settings. 2020-06-30 14:22:24 +02:00
onurays
762dd1d0a5 Implementation of canonical alias. 2020-06-30 14:22:24 +02:00
onurays
f5790e5dc2 Implementation of room history readability. 2020-06-30 14:22:24 +02:00
onurays
e1a12f4c77 Show current history readability. 2020-06-30 14:22:24 +02:00
onurays
52eec06110 Updating room avatar is implemented. 2020-06-30 14:22:24 +02:00
onurays
a6e4a328b3 Chain all operations to save settings. 2020-06-30 14:17:19 +02:00
onurays
bfebaa5c6c Show/hide save action button dynamically. 2020-06-30 14:17:19 +02:00
onurays
05e848244e Room name and topic fields added to form. 2020-06-30 14:17:19 +02:00
Onuray Sahin
08710978c5 Change the rageshake tag. 2020-06-30 15:02:37 +03:00
Onuray Sahin
cba9109206 Rename the application. 2020-06-30 14:52:50 +03:00
Onuray Sahin
482621e86f Set versionName to 1.0.0 2020-06-30 14:34:02 +03:00
Valere
c23819bfcf Merge pull request #1489 from vector-im/feature/cross_sigining_evol
Feature/cross sigining evol
2020-06-29 17:27:25 +02:00
Valere
b0034f91b0 code cleaning 2020-06-29 16:37:22 +02:00
Valere
caa7709090 Fix copy of cancel bootstrap 2020-06-29 16:37:22 +02:00
Valere
51b7a0aeae Fix / device change detection broken 2020-06-29 16:37:22 +02:00
Valere
51228a3a5c Fix / settings showing bad options when xsigning not init 2020-06-29 16:37:22 +02:00
Valere
5c091339f0 Fix / bootstrap crosssigning only was not supported 2020-06-29 16:37:22 +02:00
Valere
6643923981 Fix/ pass not save in reauth after login 2020-06-29 16:37:22 +02:00
Valere
4ce2478e44 Fix 404 when uploading xsigning keys
Own device keys was not yet uploaded, now it's done on session open . + added some cleaning of legacy things
2020-06-29 16:37:22 +02:00
Benoit Marty
6131c10d31 Show a more appropriate error when user enter a wrong backup passphrase 2020-06-29 16:36:32 +02:00
Benoit Marty
8c5ec2c57f Restore color for the second phrase 2020-06-29 16:36:32 +02:00
Benoit Marty
e046d17bf2 Remove colored part, as user think they are links. 2020-06-29 16:36:32 +02:00
Benoit Marty
8e7166662b Handle back navigation Recovery backup -> Firstform
Also create BootstrapStep.GetBackupSecretForMigration.useKey() to reduce code duplication
2020-06-29 16:36:32 +02:00
Benoit Marty
3aaa425714 Handle back navigation SetupPassphrase -> Firstform 2020-06-29 16:36:32 +02:00
Benoit Marty
a66010a1d8 Create isCrossSigningInitialized(). Do not display the conclusion Fragment anymore 2020-06-29 16:36:32 +02:00
Benoit Marty
e9706a3b64 Update UI 2020-06-29 16:36:32 +02:00
Benoit Marty
a6e61f4de8 Add link 2020-06-29 16:36:32 +02:00
Benoit Marty
e758ede706 Revert "Remove BootstrapStep.SetupPassphrase and BootstrapStep.ConfirmPassphrase"
This reverts commit 23fa44b6a6a6d34b425e2c1adef4fd2beb9800a7.
2020-06-29 16:36:32 +02:00
Benoit Marty
957fe189dc Fix issue in dark theme and a11y 2020-06-29 16:36:32 +02:00
Benoit Marty
12a4f6f05b Create isRecoverySetup() 2020-06-29 16:36:32 +02:00
Benoit Marty
bcd78a96bf Add FIXME 2020-06-29 16:36:32 +02:00
Benoit Marty
f3b464b88a Bootstrap: Add an introduction step: BootstrapSetupRecoveryKeyFragment 2020-06-29 16:36:32 +02:00
Benoit Marty
369f40c804 Remove developer mode option to set up cross-signing 2020-06-29 16:36:32 +02:00
Benoit Marty
bddd7f4005 Use defined model (tested ok) 2020-06-29 16:36:32 +02:00
Benoit Marty
5434c39453 Change 2020-06-29 16:36:32 +02:00
Benoit Marty
e4ac28877c Ask user password to initialize CrossSigning
And migrate some logic to the ViewModel
2020-06-29 16:36:19 +02:00
Benoit Marty
8df7797f6d Remove BootstrapStep.SetupPassphrase and BootstrapStep.ConfirmPassphrase 2020-06-29 16:36:19 +02:00
Benoit Marty
aa2b62976e Fix bad comment 2020-06-29 16:36:19 +02:00
Benoit Marty
e3dc6e307f Gossip MSK 2020-06-29 16:36:19 +02:00
Benoit Marty
48a30a7b82 Create a ViewState for HomeActivity
And disable the popup - WIP
2020-06-29 16:36:19 +02:00
Benoit Marty
1365240f69 Cleanup 2020-06-29 16:36:19 +02:00
Benoit Marty
1cd27d7f67 First commit to cleanup ReAuthHelper and it's usage
Also add some comment and do some other cleanup
2020-06-29 16:36:19 +02:00
ganfra
84c8f9d351 Clean code 2020-06-29 16:08:45 +02:00
ganfra
7e703e4788 Epoxy: optimize some hashcode in timeline 2020-06-29 15:05:21 +02:00
Benoit Marty
fb13b402af Prevent from importing temporary legacy classes 2020-06-29 14:22:30 +02:00
Benoit Marty
e599abc6ba Merge pull request #1554 from vector-im/feature/op
Feature/op
2020-06-29 14:10:01 +02:00
Benoit Marty
5784c4c8b3 Merge pull request #1527 from vector-im/feature/migration_from_legacy
Feature/migration from legacy
2020-06-29 14:08:53 +02:00
Benoit Marty
cec79fed44 Mutualize code 2020-06-29 11:00:40 +02:00
Benoit Marty
31a7563de5 Make check code quality ok 2020-06-29 10:16:54 +02:00
Benoit Marty
0ad2058a1a Prepare version 0.91.2-beta 2020-06-28 23:05:47 +02:00
Benoit Marty
44365d70fe Add proguard rule for WebRTC 2020-06-28 23:04:30 +02:00
Benoit Marty
bbf0b1e3ba Add a way to ensure we have @JsonClass(generateAdapter = false) for enum class.
This is not ideal, but this will save us in the future.
2020-06-28 22:06:03 +02:00
ganfra
8972319a85 Handle typing through RoomSummaryMapper + fix room summary binding called too many times 2020-06-27 18:26:14 +02:00
Benoit Marty
85f713c8c7 Add missing @JsonClass(generateAdapter = false) for Proguard 2020-06-27 11:52:47 +02:00
Benoit Marty
6e020cada2 Min SDK version is now 21, it has been forgotten to change that. 2020-06-27 11:24:28 +02:00
Benoit Marty
d436a7bad7 Increment version patch for a new release on the PlayStore 2020-06-27 00:14:32 +02:00
Benoit Marty
16a275529d Use temporary name Riot.imX 2020-06-27 00:14:32 +02:00
Benoit Marty
0ad493d860 Comment out android.permission.READ_CALL_LOG 2020-06-26 23:48:41 +02:00
Benoit Marty
30774957ba Handle /nick command (#12) 2020-06-26 23:40:23 +02:00
Benoit Marty
8a1a772ab7 Handle /op and /deop commands (#12)
Also when resetting power level, remove from list of user instead of setting the default value.
2020-06-26 23:31:19 +02:00
Benoit Marty
0d9a10f5fa Fix test compilation 2020-06-26 21:33:47 +02:00
Benoit Marty
1c9907c5d2 Do not abort on error during lint check. 2020-06-26 21:08:41 +02:00
Benoit Marty
050530a991 ktlint 2020-06-26 16:19:05 +02:00
Benoit Marty
f984cff5b4 Auto review 2020-06-26 16:19:05 +02:00
Benoit Marty
ad7297c7e3 CryptoStore migration: step5: convert serialized classes to other classes
legacy MXDeviceInfo and MXOlmInboundGroupSession2
2020-06-26 16:19:05 +02:00
Benoit Marty
17d90a32e1 CryptoStore migration: step4: clear files and prefs 2020-06-26 16:19:05 +02:00
Benoit Marty
89a20eafd8 CryptoStore migration: step3: copy DB and encrypt DB 2020-06-26 16:19:05 +02:00
Benoit Marty
a2be821d2f CryptoStore migration: step2: handle migration to RiotX (not tested) 2020-06-26 16:19:05 +02:00
Benoit Marty
39022b3b66 CryptoStore migration: step1: import migration from Riot-Android (not tested) 2020-06-26 16:19:05 +02:00
Benoit Marty
fe8f79698c Improve code 2020-06-26 16:19:05 +02:00
Benoit Marty
a0a8f95d37 Create LegacySessionImporter class and import credentials - tested OK 2020-06-26 16:19:05 +02:00
Benoit Marty
7247b4471a Import a fix from Riot-android 2020-06-26 16:19:05 +02:00
Benoit Marty
6bce62a598 Update version code to 40_091_00x to upgrade Riot-Android 2020-06-26 16:19:05 +02:00
Benoit Marty
629c73e630 Change applicationId from "im.vector.riotx" to "im.vector.app" 2020-06-26 16:19:05 +02:00
Benoit Marty
fb0d262336 Merge pull request #1510 from vector-im/feature/keys_backup_unstable
Fixes issue from timokoesters and do some cleanup
2020-06-26 15:55:40 +02:00
Benoit Marty
28df09a8d4 ktlint 2020-06-26 15:54:50 +02:00
Benoit Marty
2e93b7c4c9 Auto-review 2020-06-26 15:54:50 +02:00
Benoit Marty
4125baf066 Some more cleanup on the model used to download and to upload keys 2020-06-26 15:54:50 +02:00
Benoit Marty
1fb2569a39 Remove deviceId from /keys/upload/{deviceId} as not spec-compliant (#1502)
FTR: 1b6a74fd93
2020-06-26 15:54:50 +02:00
Benoit Marty
19ed5a2d3d Keys Backup API now use the unstable prefix (#1503) 2020-06-26 15:54:50 +02:00
Valere
84272f5b5d Merge pull request #1534 from vector-im/feature/fix_agelocalts_paginate
Pagination do not set ageLocalTs
2020-06-26 14:40:09 +02:00
Onuray Sahin
90804f7625 Merge pull request #1547 from vector-im/feature/fix_compress_images
Compress images before sending
2020-06-26 15:12:27 +03:00
onurays
824dafb525 ktlint fix. 2020-06-26 14:48:10 +03:00
onurays
3fcf77e214 Lint fix. 2020-06-26 14:10:49 +03:00
onurays
c5d2a34ebd Documentation added to explain creating a cache file. 2020-06-26 12:58:41 +03:00
Valere
a04a0e7175 Code review 2020-06-26 09:20:03 +02:00
Valere
9aa0d38116 Pagination do not set ageLocalTs 2020-06-26 09:19:55 +02:00
ganfra
f8452429a4 Merge pull request #1504 from vector-im/feature/improve_perf
Feature/improve perf
2020-06-25 17:00:56 +02:00
onurays
4349331ee7 Support compressing images on Android 10 and above. 2020-06-25 16:14:54 +03:00
ganfra
1d3dbdf989 Remove unecessary code 2020-06-25 12:20:55 +02:00
ganfra
60c873aa66 Clean code 2020-06-25 12:12:50 +02:00
Benoit Marty
674fa0e5ce Fix bug when changing display name twice
And delete the static summary
2020-06-25 11:59:11 +02:00
ganfra
f28e3ca504 Merge branch 'develop' into feature/improve_perf 2020-06-25 10:57:46 +02:00
onurays
96d6a72b97 Compress images before sending (for devices below Android 10).
Fixes #1333
2020-06-25 10:09:08 +03:00
Benoit Marty
7b3fa501c6 Merge pull request #1545 from johnjohndoe/sharedpreferences
Use SharedPreferences#edit extension function consistently.
2020-06-24 21:47:07 +02:00
Benoit Marty
16dbcc43b0 Merge pull request #1544 from vector-im/feature/fix_1543
User could not redact messages that he has sent (#1543)
2020-06-24 21:24:34 +02:00
Benoit Marty
c0c300925d Merge branch 'develop' into feature/fix_1543 2020-06-24 21:24:25 +02:00
ganfra
0a02a08ed4 Merge pull request #1508 from vector-im/feature/fix_widget
Feature/fix widget
2020-06-24 17:56:32 +02:00
ganfra
95c05f6107 Refact some more code 2020-06-24 17:05:00 +02:00
Tobias Preuss
e24785015d Use SharedPreferences#edit extension function consistently.
+ Add "androidx.core:core-ktx:1.1.0" to "matrix-sdk-android" module which
  was already used in "vector" module.
+ Sources: https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-preference-release/core/core-ktx/src/main/java/androidx/core/content/SharedPreferences.kt.
2020-06-24 15:40:00 +02:00
ganfra
554c37febe Merge branch 'develop' into feature/fix_widget 2020-06-24 15:14:26 +02:00
Benoit Marty
dbb9dc4458 Merge pull request #1541 from johnjohndoe/random-housekeeping
Random housekeeping indicated by Lint
2020-06-24 14:56:23 +02:00
Benoit Marty
c6dba21212 Merge pull request #1542 from vector-im/feature/fix_1537
Use vendor prefix for non merged MSC (#1537)
2020-06-24 14:50:37 +02:00
Benoit Marty
94b5e4e2f8 User could not redact messages that he has sent (#1543) 2020-06-24 14:21:45 +02:00
Benoit Marty
0d891b1c93 Use vendor prefix for non merged MSC (#1537) 2020-06-24 14:10:24 +02:00
Tobias Preuss
2f77deb0a8 Fix package name. 2020-06-24 10:58:47 +02:00
Tobias Preuss
fa0adb17b8 Use "when" subject. 2020-06-24 10:04:50 +02:00
Tobias Preuss
36bd2290e9 Use Kotlin math functions. 2020-06-23 18:31:16 +02:00
Tobias Preuss
372a5ba1ec Use "isNotEmpty" convenience function. 2020-06-23 18:29:24 +02:00
Tobias Preuss
25f45da195 Use indexing operator. 2020-06-23 18:25:37 +02:00
Tobias Preuss
9d191a783d Let variables be "val" if possible. 2020-06-23 18:23:39 +02:00
Tobias Preuss
0dc3593660 Use property access syntax. 2020-06-23 18:22:58 +02:00
Tobias Preuss
f609cc7042 Simplify loop and when statement. 2020-06-23 18:19:58 +02:00
ganfra
360666a758 Creates SessionLifecycleObserver 2020-06-23 15:12:25 +02:00
Benoit Marty
3f44056243 Merge pull request #1526 from johnjohndoe/retrofit2-call-awaitresponse
Use retrofit2.Call.awaitResponse extension provided by Retrofit 2.
2020-06-23 13:53:27 +02:00
Benoit Marty
d075cbf69b Merge pull request #1530 from vector-im/feature/display_name
Add capability to change the display name (#1529)
2020-06-23 13:52:51 +02:00
ganfra
6b13c00d56 Database: add @SessionDatabase on monarchy instances 2020-06-23 13:18:07 +02:00
ganfra
6e95c6c200 Fix in memory local echo filtering 2020-06-23 12:23:23 +02:00
Benoit Marty
35fed2676a Cleanup after Onuray's review and improve wording when removing display name 2020-06-23 11:21:00 +02:00
Benoit Marty
9754e26e5f Add capability to change the display name (#1529) 2020-06-22 20:50:31 +02:00
Benoit Marty
af9295723c Merge pull request #1528 from vector-im/feature/tabs_design
Update room category as per design
2020-06-22 17:39:45 +02:00
Valere
55993aff04 Merge pull request #1416 from vector-im/feature/voip
Call support with WebRTC
2020-06-22 17:23:22 +02:00
Tobias Preuss
66c5a35f36 Use retrofit2.Call.awaitResponse extension provided by Retrofit 2.
+ This extension is identical to the one used in this project and is
  available since Retrofit 2.6.0.
  See b761518aa1.
2020-06-22 17:04:37 +02:00
Valere
c1260dcb9b Update room category as per design 2020-06-22 17:01:15 +02:00
Benoit Marty
f4e7405d92 Cleanup 2020-06-22 16:21:36 +02:00
Benoit Marty
c15cc34bfd Call: a11y 2020-06-22 16:15:15 +02:00
Benoit Marty
16f32da647 Cleanup during review. 2020-06-22 16:15:15 +02:00
Valere
4c34d73501 Fix / connection lost timer launched abusively 2020-06-22 15:10:50 +02:00
Benoit Marty
df1bd62f47 Merge pull request #1512 from johnjohndoe/patch-1
Fix minor typo in contribution guide.
2020-06-22 14:12:08 +02:00
Benoit Marty
3ced179fbb Merge branch 'develop' into patch-1 2020-06-22 14:11:50 +02:00
Benoit Marty
957ceff87c Merge pull request #1520 from johnjohndoe/random-housekeeping
Random housekeeping indicated by Lint
2020-06-22 14:11:08 +02:00
Tobias Preuss
85fcc2eab7 Fix minor typo.
+ Fix spelling of "remaining".
2020-06-22 12:25:34 +02:00
Tobias Preuss
e7143b53d5 Fix self-assignment of callback. 2020-06-22 12:08:49 +02:00
Tobias Preuss
b728e10616 Removed unneeded conversion. 2020-06-22 12:08:49 +02:00
Tobias Preuss
8ffa0061e9 Remove unneeded qualifier for constant. 2020-06-22 12:08:49 +02:00
Tobias Preuss
b767c2fa54 Let variable be "val" if possible. 2020-06-22 12:08:49 +02:00
Tobias Preuss
aeb41bc516 Remove redundant "public" qualifier. 2020-06-22 12:08:49 +02:00
Tobias Preuss
178bdff62a Use string template syntax. 2020-06-22 12:08:49 +02:00
Tobias Preuss
3e79da6a79 Infer type. 2020-06-22 12:08:49 +02:00
ganfra
f762c4c7a2 Makes sure bind and unbind are calling super in items 2020-06-22 11:19:53 +02:00
ganfra
8de0bdca93 Merge branch 'develop' into feature/fix_widget 2020-06-22 10:21:39 +02:00
Valere
ef2fcd60d7 code cleaning 2020-06-22 09:54:45 +02:00
Benoit Marty
55b61775e8 Merge pull request #1514 from 532910/local_resources
put F-Droid and GPlay badges locally
2020-06-22 09:50:54 +02:00
Valere
07e57b1498 clean 2020-06-22 09:48:01 +02:00
Benoit Marty
b522c9f62f Merge pull request #1513 from huoxiaoyao/configure_os_independent
Minor dev setup improvement for Linux/Windows.
2020-06-22 09:47:37 +02:00
Valere
04a7c57d64 Fix / false detection of bt headset + restore state after call 2020-06-22 09:47:34 +02:00
Benoit Marty
367da0c78f Merge pull request #1523 from vector-im/feature/fix_1519
Feature/fix 1519
2020-06-22 09:42:47 +02:00
Benoit Marty
057c21f7d0 Incomplete predicate in RealmCryptoStore#getOutgoingRoomKeyRequest (#1519) 2020-06-22 09:17:37 +02:00
Benoit Marty
af8ab57e60 Rename methods and variables for code clarity 2020-06-22 09:14:59 +02:00
Sergio E. Nemirowski
409b6b807e put F-Droid and GPlay badges locally
this adds images for F-Droid and GPlay buttons for README.md

Signed-off-by: Sergio E. Nemirowski <sergio@outerface.net>
2020-06-20 19:42:31 +03:00
fabianu
4a454f0817 Added ANDROID_STUDIO as optional variable to specify android studio location. 2020-06-20 17:03:10 +02:00
Valere
6b806922ee Fix / prevent camera switch if no second camera 2020-06-20 09:50:32 +02:00
Valere
64a67b57b8 Fix / android 7 unlock screen on incoming call 2020-06-20 09:49:56 +02:00
Valere
76bcf9dcf7 Fix / activeCallPipInitialized not correctly initialized 2020-06-20 09:24:05 +02:00
ganfra
234dfa18d3 Widgets: fix some issues with navigation 2020-06-19 20:38:30 +02:00
ganfra
ba0823f4d0 Widget: fix terms not presented 2020-06-19 20:35:29 +02:00
Valere
9d401512d3 dead code 2020-06-19 19:06:25 +02:00
Valere
464e99505b Update change log 2020-06-19 18:57:50 +02:00
Valere
17cf3fd7ad Active call (with PIP) , in Room and Home 2020-06-19 18:54:39 +02:00
Valere
60998c9146 Missing release of webrtc surfaces 2020-06-19 17:34:05 +02:00
Valere
bd19225219 Add connection loader 2020-06-19 15:20:26 +02:00
Valere
2868d62185 hang up menu action 2020-06-19 15:20:10 +02:00
Valere
2a3d20d300 FIx rebase 2020-06-19 13:42:35 +02:00
Valere
30dee07a3b Hide switch camera for voice call 2020-06-19 13:37:12 +02:00
Valere
96ecb1d07e Fix Crash / stop capture in wrong thread 2020-06-19 13:37:12 +02:00
Valere
99056a7807 Fix / inversed icons HD/SD 2020-06-19 13:37:12 +02:00
Valere
374790176f Toggle HD/SD 2020-06-19 13:37:12 +02:00
Valere
f3e2a55869 Crash Fix / nullify factory after dispose 2020-06-19 13:37:12 +02:00
Valere
666f3ea152 code quality 2020-06-19 13:37:12 +02:00
Valere
25fe56116c Ask for permission before starting call 2020-06-19 13:37:12 +02:00
Valere
b27eead016 Support toggle front/back camera 2020-06-19 13:36:42 +02:00
Valere
77a01f0cd4 lazy create and destroy peer connection factory 2020-06-19 13:36:42 +02:00
Valere
5dfa08ace6 Bluetooth headset support 2020-06-19 13:36:42 +02:00
Valere
4c61dfef62 Support headset buttons in background 2020-06-19 13:36:42 +02:00
Valere
9653f082a3 accept/hangup on press on headset button 2020-06-19 13:36:42 +02:00
Valere
3e2d892fb5 Headset support
+ detect plug/unplugg
2020-06-19 13:36:42 +02:00
Valere
30d47b4fa6 Clear incoming calls managed by other session 2020-06-19 13:36:42 +02:00
Valere
fd3f591541 Show error on connecting timeout + refactoring 2020-06-19 13:36:42 +02:00
Valere
c85ba51274 Basic discard of old call events 2020-06-19 13:36:42 +02:00
Valere
843da1d48d Incoming notification + ringing 2020-06-19 13:36:42 +02:00
Valere
d8cf44fdc9 Simple cache of turn server response
in memory cache in service + show active call banner only if connected
2020-06-19 13:36:42 +02:00
Valere
8662797cf8 Restart capture after close for older android 2020-06-19 13:36:42 +02:00
Valere
eabb0bb41d Restart capture when camera is back to available 2020-06-19 13:36:42 +02:00
Valere
4966bef9c3 Quick signaling doc 2020-06-19 13:36:42 +02:00
Valere
0f625c27a1 Simple menu to select sound device 2020-06-19 13:36:42 +02:00
Valere
248b9ff1e1 Very basic audio speaker support 2020-06-19 13:36:42 +02:00
Valere
39f3a1c697 Fix glitch when opening timeline first time 2020-06-19 13:36:42 +02:00
Valere
c6100fc26c Code cleaning 2020-06-19 13:36:42 +02:00
Valere
84b474d070 klint 2020-06-19 13:36:42 +02:00
Valere
c4b977c6e1 Basic return to call Ux in Room detail 2020-06-19 13:36:42 +02:00
Valere
a1907aaddb Cleaning call states 2020-06-19 13:36:16 +02:00
Valere
56ed56a986 let remote view resize with aspect ratio 2020-06-19 13:36:16 +02:00
Valere
91f28bfb8a basic toggle mute and toggle video 2020-06-19 13:36:16 +02:00
Valere
46d7db8214 klint 2020-06-19 13:36:16 +02:00
Valere
b5cdb44642 Fix rebase 2020-06-19 13:36:16 +02:00
Valere
cb964c6dcd dead code 2020-06-19 13:36:16 +02:00
Valere
e79a4771c1 revert test code 2020-06-19 13:36:16 +02:00
Valere
9006acb66a WIP | Avoid re-negociation pre-agree-upon signaling/negotiation. 2020-06-19 13:36:16 +02:00
onurays
435a6b2f1a Add ice candidates to peer connection. 2020-06-19 13:36:16 +02:00
onurays
4d288ddd55 Require turn server before creating PeerConnection. 2020-06-19 13:36:16 +02:00
onurays
24cea5110e Show / hide call views according to call type. 2020-06-19 13:36:16 +02:00
onurays
79f804b2d4 Use single sdp and stream observer. 2020-06-19 13:36:16 +02:00
onurays
4b85e39e3e Implementation of turn server api. 2020-06-19 13:36:16 +02:00
onurays
8f5918de4d Cleanup unused code. 2020-06-19 13:36:16 +02:00
Benoit Marty
ae762aa928 Cleanup 2020-06-19 13:36:16 +02:00
Benoit Marty
928da82dde Make menu item live 2020-06-19 13:36:16 +02:00
Benoit Marty
94ea857738 Fix icons tint, esp in dark theme 2020-06-19 13:36:03 +02:00
Benoit Marty
0bb92e9e91 Hide m.call.candidates in the timeline by default.
And handle them correctly when all events are displayed
2020-06-19 13:36:03 +02:00
Benoit Marty
df4aab1d73 Use EventType.isCallEvent() 2020-06-19 13:36:03 +02:00
Benoit Marty
d3f93984d4 Compact coding 2020-06-19 13:36:03 +02:00
Benoit Marty
125d61eb68 Rename parameters 2020-06-19 13:36:03 +02:00
onurays
c0988ba6d9 Merge conflicts and implement answer function. 2020-06-19 13:36:03 +02:00
Benoit Marty
03b9904b07 Create a MxCall interface to better handle call 2020-06-19 13:36:03 +02:00
Benoit Marty
24a9931abd Rename some API 2020-06-19 13:36:03 +02:00
Benoit Marty
2581a3433e Create RoomCallService 2020-06-19 13:36:03 +02:00
Benoit Marty
8c9ca1e0f2 Cleanup listener 2020-06-19 13:35:38 +02:00
Benoit Marty
dcae051e85 Create enum as per the spec and use default values when applicable 2020-06-19 13:35:38 +02:00
Benoit Marty
3d03bf6f91 Add Javadoc to the model 2020-06-19 13:35:38 +02:00
onurays
54b154f85f Send sdp to remote party when answer is received. 2020-06-19 13:35:38 +02:00
onurays
37c926d178 Attach local video renderers. 2020-06-19 13:35:38 +02:00
onurays
f50f81d321 Implement rejecting incoming call. 2020-06-19 13:35:38 +02:00
onurays
743ace7e60 Move voip responsibilities from views to WebRtcPeerConnectionManager. 2020-06-19 13:35:38 +02:00
onurays
5d476e7259 Show the foreground service for incoming and outgoing calls. 2020-06-19 13:35:38 +02:00
onurays
fb6bcc8470 Foreground call service and action receiver implemented. 2020-06-19 13:35:38 +02:00
onurays
bda1633979 New material resources added. 2020-06-19 13:35:38 +02:00
onurays
4169f580b8 Create foreground call service. 2020-06-19 13:35:38 +02:00
onurays
4a4edcf82a Experimental implementation of Telecom API. 2020-06-19 13:35:38 +02:00
onurays
a1fc0db8a2 Finish CallActivity when m.call.hangup received. 2020-06-19 13:35:38 +02:00
Valere
dc19652c2b WIP
refact WIP


TMP


WIP
2020-06-19 13:35:38 +02:00
Benoit Marty
d2f1488934 Merge pull request #1500 from vector-im/feature/api_21
Min SDK level set to 21 (#405)
2020-06-19 09:45:22 +02:00
Benoit Marty
bbdf6c6eaf Merge pull request #1496 from vector-im/feature/small_fixies
Small fixies
2020-06-18 14:31:11 +02:00
Benoit Marty
f532d28fb3 Min SDK level set to 21 (#405) 2020-06-18 14:18:40 +02:00
Benoit Marty
0135368328 Prevent infinite loop on 403 and fix bad url used to load the terms 2020-06-18 10:06:31 +02:00
Benoit Marty
af81a52746 Use CustomChromeTab to open T&C 2020-06-17 19:04:35 +02:00
Benoit Marty
86b4c9ac73 "Add Matrix app" menu is now always visible (#1495) 2020-06-17 18:13:09 +02:00
Benoit Marty
1df3b4e18f Fix dark theme issue on login screen (#1097) 2020-06-17 15:52:31 +02:00
Benoit Marty
fa204eca3b Add link to Widget doc 2020-06-17 15:37:35 +02:00
Benoit Marty
2c34fe2dc3 Add airplane mode icon 2020-06-17 15:30:56 +02:00
Benoit Marty
9c34187391 Move "integration" setting above "advanced" section 2020-06-17 15:17:22 +02:00
ganfra
10d78a3102 Shortcuts: avoid crash when retrieving images 2020-06-16 17:50:43 +02:00
ganfra
46378845e9 Typings: extract from room summary and use an in memory tracker 2020-06-16 17:50:08 +02:00
Benoit Marty
ff39b22686 Add changelog entry for proguard 2020-06-16 11:18:33 +02:00
Benoit Marty
601e11980f Merge pull request #1478 from vector-im/feature/proguard
Feature/proguard
2020-06-16 11:15:21 +02:00
ganfra
8cef299878 Timeline: add room summary holder to avoid fetching in item factory 2020-06-16 11:08:38 +02:00
Benoit Marty
914bfb105c Version++ 2020-06-15 23:28:57 +02:00
Benoit Marty
8c98125755 Merge branch 'release/0.22.0' 2020-06-15 23:27:49 +02:00
Benoit Marty
076ecca5a9 Merge branch 'release/0.22.0' into develop 2020-06-15 23:27:48 +02:00
Benoit Marty
840648b750 Prepare release 0.22.0 2020-06-15 23:27:10 +02:00
Benoit Marty
29fd4c4bd2 Fix issue on dark themes, after alert popup dismiss 2020-06-15 23:25:32 +02:00
Benoit Marty
905fa7dd86 Format 2020-06-15 20:05:50 +02:00
Benoit Marty
e8af71f641 Merge pull request #1485 from RiotTranslateBot/weblate-riot-android-riotx-application
Update from Weblate
2020-06-15 20:05:02 +02:00
rkfg
6901d368d2 Translated using Weblate (Russian)
Currently translated at 100.0% (231 of 231 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/ru/
2020-06-15 15:43:04 +00:00
Benoit Marty
e89a340fae Format string resources 2020-06-15 16:47:05 +02:00
Benoit Marty
c3d6135fb3 Fix lint issues 2020-06-15 16:29:10 +02:00
Benoit Marty
6611defd87 Merge pull request #1484 from RiotTranslateBot/weblate-riot-android-riotx-application
Update from Weblate
2020-06-15 16:10:51 +02:00
Weblate
5c449a9e30 michaelk merges translation 2020-06-15 13:24:46 +00:00
LinAGKar
415ac6a748 Translated using Weblate (Swedish)
Currently translated at 41.5% (712 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-06-15 12:55:46 +00:00
Osoitz
7ddafa098f Translated using Weblate (Basque)
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/eu/
2020-06-15 12:55:45 +00:00
Osoitz
177f7b9cb3 Translated using Weblate (Basque)
Currently translated at 100.0% (1717 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/eu/
2020-06-15 12:55:45 +00:00
Benoit Marty
fb1704b717 Merge pull request #1465 from vector-im/bmarty-patch-1
Add command line to run Android test
2020-06-15 14:48:01 +02:00
Benoit Marty
ade1f1b911 Merge pull request #1479 from vector-im/feature/memory_leaks
Feature/memory leaks
2020-06-15 14:47:16 +02:00
Benoit Marty
344a9836d2 Typo and cleanup 2020-06-15 14:44:44 +02:00
Benoit Marty
2c1487d303 Merge pull request #1466 from vector-im/feature/toggle_favorite
Add capability to add and remove a room from the favorites (#1217)
2020-06-15 14:29:48 +02:00
LinAGKar
e1e505e695 Translated using Weblate (Swedish)
Currently translated at 40.8% (701 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-06-14 05:26:12 +00:00
Marko Dimjašević
c5cd68416f Translated using Weblate (Croatian)
Currently translated at 71.6% (1229 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-06-14 05:26:12 +00:00
Slavi Pantaleev
45f757e157 Translated using Weblate (Bulgarian)
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/bg/
2020-06-14 05:26:12 +00:00
Slavi Pantaleev
de77c8a210 Translated using Weblate (Bulgarian)
Currently translated at 82.8% (1421 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/bg/
2020-06-14 05:26:11 +00:00
ganfra
54b3af2c88 Merge pull request #1459 from vector-im/feature/power_level
Feature/power level
2020-06-12 16:12:37 +02:00
ganfra
171a945de9 Membership: refact a bit and add a left message when kicked or banned 2020-06-12 15:29:07 +02:00
LinAGKar
d845d10d73 Translated using Weblate (Swedish)
Currently translated at 40.7% (699 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-06-12 11:26:16 +00:00
reg4xp
98d91a746e Translated using Weblate (Persian)
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/fa/
2020-06-12 11:26:15 +00:00
reg4xp
1be1b5b263 Translated using Weblate (Persian)
Currently translated at 34.4% (591 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fa/
2020-06-12 11:26:15 +00:00
Marko Dimjašević
dafb0c8d5c Translated using Weblate (Croatian)
Currently translated at 71.5% (1227 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-06-12 11:26:09 +00:00
ganfra
6ca69a9947 Remove unnecessary comment 2020-06-12 10:02:57 +02:00
ganfra
ff171a39c6 Memory leaks: clean after Benoit's remarks 2020-06-12 09:58:45 +02:00
Benoit Marty
8acee57118 Implement my suggestions 2020-06-11 22:01:04 +02:00
Benoit Marty
d03ab989e6 Hide WidgetBanner by default, it can be visible if phone is slow 2020-06-11 21:42:04 +02:00
Benoit Marty
4f5b1d9646 Close Activity when room is left.
Create a dedicated ViewModel to handle that in Activity rather than multiple times in Fragments
2020-06-11 21:40:22 +02:00
ganfra
f8dca1237a Fix lint issues 2020-06-11 20:20:06 +02:00
ganfra
c382f706a6 Leaks: disable leakcanary 2020-06-11 19:40:46 +02:00
ganfra
23cbed310a Proguard: activate it in release 2020-06-11 19:37:20 +02:00
ganfra
1786ba30f7 Proguard: handle matrix sdk 2020-06-11 19:36:15 +02:00
Benoit Marty
530ce0952c Typo and cleanup 2020-06-11 18:00:34 +02:00
Benoit Marty
262f10af9a Remove ability to kick or ban yourself 2020-06-11 16:59:14 +02:00
Benoit Marty
3430a8f3ea Fix demote yourself issue 2020-06-11 16:48:32 +02:00
Benoit Marty
959be3a23d Fix layout issue on read only rooms 2020-06-11 16:39:41 +02:00
Benoit Marty
15306fc116 Italic text 2020-06-11 16:30:34 +02:00
Benoit Marty
fb5013db88 Restore previous way to managed power level string, to be able to translate them correctly 2020-06-11 16:27:46 +02:00
Benoit Marty
ab4780c9b9 Remove translation of deleted strings 2020-06-11 16:27:46 +02:00
ganfra
e6a71ab7de PowerLevel: fix role order 2020-06-11 13:49:36 +02:00
LinAGKar
6aecf68098 Translated using Weblate (Swedish)
Currently translated at 40.6% (697 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-06-11 06:29:33 +00:00
Nils Haugen
dc54c6139f Translated using Weblate (Norwegian Nynorsk)
Currently translated at 49.4% (848 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/nn/
2020-06-11 06:29:33 +00:00
Priit Jõerüüt
71f158c526 Translated using Weblate (Estonian)
Currently translated at 97.6% (160 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/et/
2020-06-11 06:29:32 +00:00
Marko Dimjašević
dc7067baff Translated using Weblate (Croatian)
Currently translated at 71.5% (1227 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-06-11 06:29:32 +00:00
Besnik Bleta
ced226777f Translated using Weblate (Albanian)
Currently translated at 99.6% (1710 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sq/
2020-06-11 06:29:27 +00:00
ganfra
579d4f7a5b Merge branch 'develop' into feature/power_level 2020-06-10 17:21:04 +02:00
ganfra
60b91d4d50 PowerLevel : clean after Benoit's review 2020-06-10 17:19:33 +02:00
ganfra
917042c48c Remove memory leak from Autocompleter 2020-06-10 16:14:19 +02:00
Benoit Marty
ed27c35bb4 Merge pull request #1467 from vector-im/feature/modular_link
Update link to Modular url from "https://modular.im/" to "https://modular.im/services/matrix-hosting-riot" and open it using ChromeCustomTab
2020-06-10 10:12:48 +02:00
Benoit Marty
c35c94b7b7 Update link to Modular url from "https://modular.im/" to "https://modular.im/services/matrix-hosting-riot" and open it using ChromeCustomTab 2020-06-10 09:13:08 +02:00
Benoit Marty
d8317f7439 Add capability to add and remove a room from the favorites (#1217) 2020-06-10 00:42:14 +02:00
Benoit Marty
9a3813f883 Add command line to run Android test 2020-06-09 17:04:50 +02:00
Benoit Marty
0a7f77ea16 ktlint 2020-06-08 22:08:59 +02:00
ganfra
d6329a1ab6 Start looking at memory leaks 2020-06-08 19:46:55 +02:00
Benoit Marty
0ba120356a Merge pull request #1447 from vector-im/feature/fix_version
Feature/fix version
2020-06-08 18:16:51 +02:00
Benoit Marty
d402b49f07 Merge branch 'develop' into feature/fix_version 2020-06-08 18:16:42 +02:00
Benoit Marty
d4ba9fa09a Cleanup after Ganfra's review 2020-06-08 18:15:00 +02:00
Benoit Marty
62f352243d Merge pull request #1448 from vector-im/feature/fix
Feature/fix
2020-06-08 18:10:06 +02:00
Benoit Marty
1ad19b5e93 Merge branch 'develop' into feature/fix 2020-06-08 18:09:57 +02:00
Benoit Marty
e7ba0a5c60 Merge pull request #1449 from vector-im/feature/fix_1444
Wrong /query request (#1444)
2020-06-08 18:07:23 +02:00
Benoit Marty
050407f7c7 Merge branch 'develop' into feature/fix_1444 2020-06-08 18:07:15 +02:00
Benoit Marty
dffe096c59 Merge pull request #1451 from vector-im/feature/sso_redirect
Correctly handle SSO login redirection
2020-06-08 18:06:00 +02:00
ganfra
bf5ad2cf18 Power level: warn when demoting yourself 2020-06-08 17:36:30 +02:00
ganfra
a8ae4ddde8 Power level: use confirmation dialog 2020-06-08 16:33:56 +02:00
LinAGKar
2596a9ef7e Translated using Weblate (Swedish)
Currently translated at 40.4% (694 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-06-08 11:29:54 +00:00
Eduardo F
f74989ac1d Translated using Weblate (Portuguese (Brazil))
Currently translated at 51.2% (879 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/pt_BR/
2020-06-08 11:29:40 +00:00
Krystian Chachuła
d3bc4017a5 Translated using Weblate (Polish)
Currently translated at 90.8% (1559 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/pl/
2020-06-08 11:29:39 +00:00
Nils Haugen
ab8480d983 Translated using Weblate (Norwegian Nynorsk)
Currently translated at 78.0% (128 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/nn/
2020-06-08 11:29:39 +00:00
Nils Haugen
50dcc24900 Translated using Weblate (Norwegian Nynorsk)
Currently translated at 49.3% (847 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/nn/
2020-06-08 11:29:39 +00:00
Marko Dimjašević
a66470f93b Translated using Weblate (Croatian)
Currently translated at 68.9% (1183 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-06-08 11:29:38 +00:00
ganfra
d2dba1826d Update CHANGES 2020-06-08 10:32:02 +02:00
ganfra
7f02195377 Clean code 2020-06-08 10:29:09 +02:00
ganfra
0002cddd67 Merge branch 'develop' into feature/power_level 2020-06-08 10:12:53 +02:00
Benoit Marty
19e1683106 Move class LoginFlowType to api package 2020-06-08 09:16:31 +02:00
Benoit Marty
5c538c7865 Clarify type when retrieving supported login flow (be conform to the spec) 2020-06-08 09:11:23 +02:00
Benoit Marty
ee23967afe I made a mistake: registration step m.login.token type is not the same that login request. 2020-06-08 08:53:06 +02:00
ganfra
86dd8f3fd8 Update epoxy to last stable version 2020-06-05 20:14:36 +02:00
ganfra
f19e2a0995 Room left: fix state not being updated 2020-06-05 20:09:30 +02:00
ganfra
afd1002fdb Room Permission: default to true for sending event 2020-06-05 20:09:13 +02:00
ganfra
07c7ed0a4e Powerlevel: use edit text for custom 2020-06-05 20:08:39 +02:00
Benoit Marty
b48eb6e9cc SSO Update the documentation 2020-06-05 19:14:31 +02:00
ganfra
e5da5a34cb Power levels: handle some action permissions 2020-06-05 19:12:33 +02:00
Benoit Marty
f3a2c467ed small typo 2020-06-05 12:21:58 +02:00
ganfra
a1fd35aa67 Room member: continue to branch admin/moderator actions 2020-06-05 11:13:00 +02:00
ganfra
ad8ed37ff6 Profile action: fix editable icon 2020-06-05 11:12:33 +02:00
Benoit Marty
088e8bc9f9 Add some comment 2020-06-05 10:09:49 +02:00
Benoit Marty
3714323d74 Rename Constants 2020-06-05 01:16:19 +02:00
Benoit Marty
d70b19fa93 SSO login is now performed in the default browser (#1400) - WIP
Use ChromeCustomTabs to host the SSO web page
2020-06-05 01:14:35 +02:00
ganfra
08693a6875 Add some admin actions (ban, kick, unban) 2020-06-04 18:36:28 +02:00
ganfra
73eca2407b Power level: handle timeline rendering 2020-06-04 17:18:39 +02:00
Benoit Marty
ae7a52cecf Correctly handle SSO login redirection 2020-06-04 16:55:27 +02:00
Benoit Marty
2e244dd448 Merge pull request #1446 from vector-im/feature/various_fixes
Hide left rooms in breadcrumbs (#766)
2020-06-04 15:07:45 +02:00
Benoit Marty
1ad77530aa Use RoomSummaryQueryParams as per Ganfra's excellent suggestion 2020-06-04 14:36:51 +02:00
Benoit Marty
e44963728f Merge pull request #1450 from vector-im/feature/navigation_bar
Fix bad color contrast for navigation and status bar
2020-06-04 14:31:06 +02:00
ganfra
9075371145 Power level: start to handle updating 2020-06-04 13:09:20 +02:00
Benoit Marty
3b256a708e Fix status bar icon contrast on API in [21,23[ 2020-06-04 12:55:27 +02:00
Benoit Marty
aea517515c Fix navigation bar icon contrast on API in [21,27[ (#1342) 2020-06-04 12:50:42 +02:00
Benoit Marty
f28889284d Wrong /query request (#1444) 2020-06-04 11:59:04 +02:00
Valere
240f1f51b9 Merge pull request #1437 from vector-im/feature/fix_1169
Fix / reply ux stays too long
2020-06-04 11:44:53 +02:00
Valere
05efd7423e Merge branch 'develop' into feature/fix_1169 2020-06-04 11:44:32 +02:00
Benoit Marty
fce8a3bc18 changes.md 2020-06-04 11:43:54 +02:00
Valere
2adb5af051 update change log 2020-06-04 11:43:47 +02:00
Benoit Marty
8b7e5e527a Make Credentials.homeServer optional because it is deprecated (#1443)
It is never used currently in RiotX, but if homeserver does not sent it, it would crash.
2020-06-04 11:41:32 +02:00
Benoit Marty
c3d8916802 fix param name 2020-06-04 11:40:38 +02:00
Benoit Marty
532f5e58ea Move class Versions to internal package 2020-06-04 11:30:24 +02:00
Benoit Marty
57a5714fb5 Add the ability to compare Homeserver version (#1442) 2020-06-04 11:24:31 +02:00
Benoit Marty
a3fd49499b Hide left rooms in breadcrumbs (#766) 2020-06-04 08:59:01 +02:00
Benoit Marty
3dc2cd4d7a Disable one code check 2020-06-03 18:54:03 +02:00
Benoit Marty
0b738e3d9e Merge pull request #1409 from vector-im/feature/markdown_test
Send plain text in the body
2020-06-03 18:45:06 +02:00
Benoit Marty
b29c2b2de4 Send plain text in the body
According to https://matrix.org/docs/spec/client_server/latest#m-room-message-msgtypes, the plain text version of the HTML should be provided in the body.

Also create MarkdownParser class to be able to unit test it.
2020-06-03 18:44:35 +02:00
Benoit Marty
40f2d19f81 Merge pull request #1415 from vector-im/feature/signup_username_digit
Temporary fix to show error when user is creating an account on matrix.org with userId containing only digits (#1410)
2020-06-03 18:41:55 +02:00
Benoit Marty
2e997f2c67 Wrong issue number 2020-06-03 18:41:27 +02:00
Benoit Marty
0fd50892af Temporary fix to show error when user is creating an account on matrix.org with userId containing only digits (#1410) 2020-06-03 18:41:07 +02:00
Benoit Marty
55bd346cb2 Merge pull request #1425 from vector-im/feature/integration_manager
Feature/integration manager
2020-06-03 18:10:03 +02:00
ganfra
0724ac133b Widget notice: capitalize first letter 2020-06-03 15:22:20 +02:00
ganfra
0507fa5b0e Widgets: clean again after Benoit's review 2020-06-03 12:00:52 +02:00
Benoit Marty
617e945afa Merge pull request #1436 from vector-im/feature/Fix_1430_X_made_no_change
Hide "X made no changes" event by default in timeline (#1430)
2020-06-03 09:47:51 +02:00
Benoit Marty
870c4bf765 Check that content is not null 2020-06-03 09:32:20 +02:00
Benoit Marty
9a592e9c7e Create IsUselessResolver object 2020-06-03 01:13:02 +02:00
ganfra
53592ac404 Fix lint issues 2020-06-02 20:28:18 +02:00
ganfra
d8848a6062 Merge branch 'develop' into feature/integration_manager 2020-06-02 20:26:03 +02:00
ganfra
173c1d3a6e Integration: make the default urls modifiable from MatrixConfiguration 2020-06-02 20:05:00 +02:00
ganfra
c815c4080d Widget: changes naming algorithm (align on web) 2020-06-02 19:51:16 +02:00
Valere
c09626182c Fix / reply ux stays too long 2020-06-02 19:31:25 +02:00
ganfra
65c6ce3033 Merge branch 'feature/integration_manager' of github.com:vector-im/riotX-android into feature/integration_manager 2020-06-02 19:02:31 +02:00
ganfra
06cc2f527e Clean after Benoit's review 2020-06-02 19:02:21 +02:00
ganfra
9da5061689 Update CHANGES.md
Co-authored-by: Benoit Marty <benoitm@matrix.org>
2020-06-02 16:37:51 +02:00
ganfra
82b4415f7d Widget: fix loading widgets without scalar token 2020-06-02 16:02:10 +02:00
Benoit Marty
3f1e5b9b1e Hide "X made no changes" event by default in timeline (#1430) 2020-06-02 15:54:01 +02:00
Benoit Marty
1b95d98ccd Merge pull request #1423 from vector-im/feature/invalidate
Yet another cleanup PR
2020-06-02 14:42:51 +02:00
Benoit Marty
e2e1925796 Restore .observeOn(AndroidSchedulers.mainThread()) 2020-06-02 14:24:29 +02:00
Benoit Marty
52c8f24df5 Merge pull request #1417 from vector-im/feature/you
Use "you" instead of your display name for notice events you have sent
2020-06-02 14:16:46 +02:00
Benoit Marty
ca855da8ae Fix issue reported during review by Onuray 2020-06-02 13:15:03 +02:00
Benoit Marty
a39d35e54c Improve Kotlin code readability: use when instead of if and add a few newlines 2020-06-02 13:15:03 +02:00
Benoit Marty
3bd2b24b10 Use "you" instead of display name when the current user has sent the event. 2020-06-02 13:15:03 +02:00
Benoit Marty
12448426d4 Fix typo reported by rageshake 2020-06-01 22:12:11 +02:00
LinAGKar
a043d7cac7 Translated using Weblate (Swedish)
Currently translated at 25.4% (436 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-06-01 15:29:17 +00:00
rkfg
4d88111d48 Translated using Weblate (Russian)
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/ru/
2020-06-01 15:29:15 +00:00
rkfg
34d6610bf8 Translated using Weblate (Russian)
Currently translated at 85.0% (1459 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-06-01 15:29:15 +00:00
Nils J. Haugen
4bfc52327b Translated using Weblate (Norwegian Nynorsk)
Currently translated at 49.4% (849 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/nn/
2020-06-01 15:29:14 +00:00
nosorae
15d5f7ff55 Translated using Weblate (Korean)
Currently translated at 73.2% (1256 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ko/
2020-06-01 15:29:14 +00:00
Szimszon
91ecd1aeeb Translated using Weblate (Hungarian)
Currently translated at 100.0% (1717 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hu/
2020-06-01 15:29:14 +00:00
sr093906
342f871916 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/zh_Hans/
2020-06-01 15:29:10 +00:00
Nikita Ledenev
18d51de0b9 Translated using Weblate (Russian)
Currently translated at 85.0% (1459 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-06-01 06:08:36 +00:00
rkfg
4dc6cae854 Translated using Weblate (Russian)
Currently translated at 85.0% (1459 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-06-01 06:08:35 +00:00
rkfg
5fb160e1ac Translated using Weblate (Russian)
Currently translated at 83.8% (1439 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-30 18:28:21 +00:00
Амёба
f1589314c2 Translated using Weblate (Russian)
Currently translated at 83.8% (1439 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-30 18:28:19 +00:00
LinAGKar
7fb9a550c8 Translated using Weblate (Swedish)
Currently translated at 23.2% (399 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-30 09:29:28 +00:00
Амёба
46f7f4814c Translated using Weblate (Russian)
Currently translated at 82.6% (1418 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-30 09:29:24 +00:00
Benoit Marty
c002cc104c Translated using Weblate (Portuguese (Brazil))
Currently translated at 51.1% (878 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/pt_BR/
2020-05-30 09:29:22 +00:00
random
492128a621 Translated using Weblate (Italian)
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/it/
2020-05-30 09:29:22 +00:00
random
fff0f09684 Translated using Weblate (Italian)
Currently translated at 100.0% (1717 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/it/
2020-05-30 09:29:22 +00:00
Szimszon
64054d13a3 Translated using Weblate (Hungarian)
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/hu/
2020-05-30 09:29:20 +00:00
Szimszon
ae8d7096c3 Translated using Weblate (Hungarian)
Currently translated at 98.5% (1691 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hu/
2020-05-30 09:29:20 +00:00
Kévin C
13e04b6362 Translated using Weblate (French)
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/fr/
2020-05-30 09:29:19 +00:00
Kévin C
89e557bcef Translated using Weblate (French)
Currently translated at 100.0% (1717 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-30 09:29:19 +00:00
Samu Voutilainen
fdf4749c1b Translated using Weblate (Finnish)
Currently translated at 99.4% (163 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/fi/
2020-05-30 09:29:17 +00:00
zeritti
a63608bf97 Translated using Weblate (Czech)
Currently translated at 100.0% (1717 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/cs/
2020-05-30 09:29:17 +00:00
Jeff Huang
5c101e9466 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (164 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/zh_Hant/
2020-05-30 09:29:12 +00:00
Jeff Huang
4b25ebc731 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (1717 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/zh_Hant/
2020-05-30 09:29:12 +00:00
Besnik Bleta
8e88fcb462 Translated using Weblate (Albanian)
Currently translated at 99.4% (163 of 164 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/sq/
2020-05-30 09:29:10 +00:00
Besnik Bleta
fd19b345a1 Translated using Weblate (Albanian)
Currently translated at 99.4% (1707 of 1717 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sq/
2020-05-30 09:29:10 +00:00
Benoit Marty
4a7bba047b Merge pull request #1420 from vector-im/feature/fix_theme_switch
Fix: Switch theme is not fully taken into account without restarting the app
2020-05-29 19:22:43 +02:00
ganfra
440c21e9f3 Update CHANGES 2020-05-29 19:06:06 +02:00
ganfra
959b679086 Clean files 2020-05-29 19:03:54 +02:00
ganfra
64cfd4d81a Widget: fix nullable widgetId 2020-05-29 18:08:56 +02:00
ganfra
c742ca3b41 Widget: fix widget title color 2020-05-29 17:09:10 +02:00
ganfra
2002252f72 Widget: Handle failures on permissions 2020-05-29 16:44:17 +02:00
ganfra
7df8b3a9bf Widgets: observe wellknown for integ config and open Jitsi in browser 2020-05-29 12:23:36 +02:00
Benoit Marty
3fea2173f4 Move fun to a dedicated file. 2020-05-29 11:57:20 +02:00
Benoit Marty
d125cb5c01 Some cleanup:
- use invalidate() from MvRx
- use throttleFirst instead of debounce
- remove useless observe on main thread
- remove useless calls to super.invalidate()
2020-05-29 11:36:27 +02:00
Benoit Marty
86c9264ed9 Fix: Switch theme is not fully taken into account without restarting the app 2020-05-28 23:03:04 +02:00
ganfra
00f2d0249f Merge branch 'develop' into feature/integration_manager 2020-05-28 20:33:51 +02:00
ganfra
4465e6eea3 Widget: format url with roomId if needed 2020-05-28 20:26:34 +02:00
ganfra
b87fb8c396 Widget: show sticker in room summary format 2020-05-28 20:15:11 +02:00
ganfra
d4706b38b8 Widgets: display widget events in timeline 2020-05-28 20:04:41 +02:00
ganfra
31c82b4ba6 Widget: show room widgets in bottom sheet and fix some widget actions 2020-05-28 19:39:07 +02:00
ganfra
cb80d8d349 Widget: add active widgets 2020-05-28 17:08:57 +02:00
Benoit Marty
997101a44b Merge branch 'hotfix/crash_locales' 2020-05-28 11:31:38 +02:00
Benoit Marty
7be3434136 Merge branch 'hotfix/crash_locales' into develop 2020-05-28 11:31:38 +02:00
Benoit Marty
ec1422b0f0 Fix crash due to bad script. Tha bad value has already been fixed on Weblate. 2020-05-28 11:27:11 +02:00
Benoit Marty
b0a6eaaa96 Version++ 2020-05-28 10:45:58 +02:00
Benoit Marty
d1c4d4b099 Merge branch 'release/0.21.0' 2020-05-28 10:43:55 +02:00
Benoit Marty
d35905787d Merge branch 'release/0.21.0' into develop 2020-05-28 10:43:53 +02:00
Benoit Marty
9a972b2f73 Prepare release 0.21.0 2020-05-28 10:43:40 +02:00
ganfra
1fe0c8a3e9 Widgets: handle actions (revoke, delete, edit, open in browser) and permissions bottom sheet 2020-05-28 10:25:04 +02:00
Benoit Marty
116bab5bc8 Fix call event not rendered in e2e rooms. 2020-05-27 19:02:27 +02:00
Benoit Marty
c76eb3bc98 Fix lint issue 2020-05-27 18:58:45 +02:00
Benoit Marty
81c1717384 Format strings 2020-05-27 18:49:34 +02:00
Benoit Marty
0fd0500d30 Merge pull request #1414 from RiotTranslateBot/weblate-riot-android-riotx-application
Update from Weblate
2020-05-27 17:50:06 +02:00
Benoit Marty
34d638da4f Merge pull request #1411 from vector-im/feature/attachment_e2e
Feature/attachment e2e
2020-05-27 15:13:17 +02:00
Weblate
e39b177b5b Merge branch 'origin/develop' into Weblate. 2020-05-27 13:04:35 +00:00
LinAGKar
07aa3ee64c Translated using Weblate (Swedish)
Currently translated at 19.9% (335 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-27 13:04:29 +00:00
yuuki-san
c94856cdf8 Translated using Weblate (Slovak)
Currently translated at 95.7% (156 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/sk/
2020-05-27 13:04:26 +00:00
yuuki-san
4dd0c04537 Translated using Weblate (Slovak)
Currently translated at 53.9% (906 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sk/
2020-05-27 13:04:26 +00:00
Амёба
99c409b6d2 Translated using Weblate (Russian)
Currently translated at 82.6% (1390 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-27 13:04:26 +00:00
Marko Dimjašević
8cb2c2532f Translated using Weblate (Croatian)
Currently translated at 54.2% (912 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-05-27 13:04:24 +00:00
Benoit Marty
6f804cab4d Avoid duplicated events in DB (one with localId and one with eventId from homeserver, once synced) 2020-05-27 11:27:54 +02:00
Benoit Marty
cf3dbb378e Get uploaded files for e2e rooms, from local DB 2020-05-26 22:06:51 +02:00
ganfra
e32716aa48 Widget: add room active widgets to RoomDetailViewState 2020-05-26 19:47:06 +02:00
ganfra
ba46f10e3f Add integration entry to settings 2020-05-26 19:44:14 +02:00
ganfra
4b37ede8c2 Widget: handle sticker 2020-05-26 18:16:38 +02:00
ganfra
dbe4c0c8e4 Remove duplicates from identity feature 2020-05-26 11:38:29 +02:00
ganfra
4f4afd6840 Widget post api: handle last methods 2020-05-26 11:29:42 +02:00
ganfra
7409fde650 Merge branch 'develop' into feature/integration_manager 2020-05-26 08:55:01 +02:00
ganfra
cfa31e6332 Widgets: fix extracting user widgets 2020-05-26 08:31:19 +02:00
ganfra
df973a6275 Widget: makes the integration manager screen mostly working 2020-05-26 08:07:09 +02:00
Benoit Marty
0eb36a607b Merge pull request #1402 from vector-im/feature/rageshake_dialogs
Feature/rageshake dialogs
2020-05-26 00:04:33 +02:00
Benoit Marty
0509e76f18 var -> val 2020-05-25 23:54:53 +02:00
Benoit Marty
e379ccf086 Extract MatrixConfiguration to its own file, for a better visibility 2020-05-25 23:53:36 +02:00
Benoit Marty
7ae52d676d Use directly java.net.proxy class 2020-05-25 23:50:10 +02:00
Benoit Marty
3d33018ffa Merge pull request #1147 from unclejay80/http_proxy_init
added network proxy configuration
2020-05-25 23:43:11 +02:00
Benoit Marty
860595520b Merge pull request #1401 from vector-im/feature/cleanup
Small PR with code cleanup
2020-05-25 17:30:31 +02:00
Benoit Marty
ae318a835e Merge pull request #1387 from vector-im/feature/attachments_list
Attachments list
2020-05-25 17:29:54 +02:00
Benoit Marty
7a3dbecc08 Fixes #860 2020-05-25 17:05:17 +02:00
Benoit Marty
c52aae7c29 Uploads: Snackbar 2020-05-25 17:05:17 +02:00
Benoit Marty
f0f3e8ddb9 Uploads: auto-review 2020-05-25 17:05:17 +02:00
Benoit Marty
a95102a78f Uploads: Use StateView for better Loading/Empty rendering 2020-05-25 17:02:57 +02:00
Benoit Marty
2adafbeb03 Uploads: use SenderInfo in TimelineEvent 2020-05-25 17:02:57 +02:00
Benoit Marty
f3a5fb7fe3 Uploads: rework: provide information about the sender 2020-05-25 16:54:08 +02:00
Benoit Marty
907a786b1a Uploads: load element until loader not displayed anymore 2020-05-25 16:54:08 +02:00
Benoit Marty
e3ed3e5b05 Uploads: cleanup 2020-05-25 16:54:08 +02:00
Benoit Marty
a2b366ebfe Uploads: add placeholder for images 2020-05-25 16:54:08 +02:00
Benoit Marty
f7de2f0f13 Uploads: create extension 2020-05-25 16:54:08 +02:00
Benoit Marty
919225bdfd Uploads: create extension 2020-05-25 16:54:08 +02:00
Benoit Marty
88cba74cac Uploads: add screen - WIP 2020-05-25 16:54:08 +02:00
Benoit Marty
e9ca876444 Uploads: add screen - WIP 2020-05-25 16:54:08 +02:00
Benoit Marty
0992e76800 Uploads: add screen - WIP 2020-05-25 16:54:08 +02:00
Benoit Marty
8a9498bae4 Uploads: add the service and the task 2020-05-25 16:54:08 +02:00
Weblate
d2598480c8 var -> val 2020-05-25 16:54:08 +02:00
Benoit Marty
6e57b06673 Ensure Filter model match the spec and add Javadoc 2020-05-25 16:54:08 +02:00
Benoit Marty
a036be6436 Fix missing title in BugReport screen 2020-05-25 15:42:58 +02:00
Benoit Marty
53c7ea2831 Kotlin: use orEmpty() for Maps 2020-05-25 15:42:30 +02:00
Benoit Marty
e117fec74f Kotlin: use orEmpty() for Maps 2020-05-25 14:07:25 +02:00
Benoit Marty
6e01b75b2f Dagger: use generic name for parameters 2020-05-25 14:04:36 +02:00
Benoit Marty
691e7fe616 Kotlin: use orEmpty() 2020-05-25 14:04:36 +02:00
Benoit Marty
e793a46576 Merge pull request #1390 from vector-im/feature/icon
Change icon to magnifying-glass to filter room (#1384)
2020-05-25 10:57:30 +02:00
Benoit Marty
fa48e8cffa Change icon to magnifying-glass to filter room (#1384) 2020-05-25 10:57:14 +02:00
Benoit Marty
69cf437a39 Merge pull request #1291 from vector-im/feature/complete_security
Add hint to translators
2020-05-25 10:28:20 +02:00
Benoit Marty
ebbc432570 Merge pull request #1398 from vector-im/feature/date_time
Bugfixes
2020-05-25 10:13:30 +02:00
LinAGKar
2532724e92 Translated using Weblate (Swedish)
Currently translated at 18.8% (316 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-25 00:29:11 +00:00
MamasLT
e31693b4b7 Translated using Weblate (Lithuanian)
Currently translated at 2.5% (4 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/lt/
2020-05-25 00:29:10 +00:00
Marko Dimjašević
3ed6452232 Translated using Weblate (Croatian)
Currently translated at 50.9% (856 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-05-25 00:29:10 +00:00
Besnik Bleta
166aaa62f0 Translated using Weblate (Albanian)
Currently translated at 99.5% (1673 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sq/
2020-05-25 00:29:00 +00:00
MamasLT
45e5fff622 Added translation using Weblate (Lithuanian) 2020-05-23 23:44:45 +00:00
MamasLT
8f2dba09ee Added translation using Weblate (Lithuanian) 2020-05-23 23:43:32 +00:00
LinAGKar
2ea46c5e54 Translated using Weblate (Swedish)
Currently translated at 18.7% (315 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-23 14:29:20 +00:00
@a2sc:matrix.org
fc5f0f7673 Translated using Weblate (German)
Currently translated at 99.5% (1674 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-23 14:29:19 +00:00
Tirifto
188f4a2e72 Translated using Weblate (Esperanto)
Currently translated at 27.5% (463 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/eo/
2020-05-23 14:29:18 +00:00
Marko Dimjašević
cf97fc3b01 Translated using Weblate (Croatian)
Currently translated at 41.2% (693 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-05-23 14:29:15 +00:00
Osoitz
5267ba240a Translated using Weblate (Basque)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/eu/
2020-05-23 14:29:00 +00:00
Osoitz
f185dcacd7 Translated using Weblate (Basque)
Currently translated at 100.0% (1682 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/eu/
2020-05-23 14:29:00 +00:00
Benoit Marty
330a33a0e8 Render formatted_body for m.notice and m.emote (Fixes #1196) 2020-05-21 01:47:17 +02:00
Benoit Marty
b75b299847 Create MessageContentWithFormattedBody interface 2020-05-21 01:05:47 +02:00
Benoit Marty
7c59bcc928 Only "org.matrix.custom.html" is supported 2020-05-21 00:41:36 +02:00
Benoit Marty
0e110b0794 Cleanup: use existing TextContent class instead of Pair<> 2020-05-21 00:40:12 +02:00
Benoit Marty
e156a62e19 Enable markdown (if active) when sending emote (Fixes #734) 2020-05-21 00:27:19 +02:00
Benoit Marty
628439aa65 Mardown: sending "**text in bold** was sending extra paragraph and extra new line 2020-05-21 00:25:59 +02:00
Benoit Marty
d49fcb80fc "Seen by" uses 12h time (Fixes #1378)
DateUtils.FORMAT_SHOW_TIME has to be used for i18n to be effective on DateUtils.getRelativeDateTimeString(), do not ask me why.
Also internal switching of language does not have effect on this method, you'll have to restart the application.
2020-05-20 23:52:41 +02:00
ganfra
00fd067c6b Widget: continue working on interaction with SDK. Not sure yet how to manage properly distinction between room and "admin" widgets. 2020-05-20 20:39:18 +02:00
Benoit Marty
ca37895619 Merge pull request #1374 from vector-im/feature/sas_v2
support new key agreement method for SAS
2020-05-20 18:32:01 +02:00
Benoit Marty
43497e0da9 Merge pull request #1315 from vector-im/feature/forward_pagination
Feature/forward pagination
2020-05-20 18:30:09 +02:00
LinAGKar
efa510c0a8 Translated using Weblate (Swedish)
Currently translated at 17.1% (287 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-20 15:29:38 +00:00
yuuki-san
0828159ee4 Translated using Weblate (Slovak)
Currently translated at 53.9% (906 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sk/
2020-05-20 15:29:35 +00:00
Амёба
90f21198c3 Translated using Weblate (Russian)
Currently translated at 82.1% (1381 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-20 15:29:34 +00:00
Eduardo F
a0b0778fce Translated using Weblate (Portuguese (Brazil))
Currently translated at 52.2% (878 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/pt_BR/
2020-05-20 15:29:33 +00:00
random
d937fa67ad Translated using Weblate (Italian)
Currently translated at 100.0% (1682 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/it/
2020-05-20 15:29:33 +00:00
Kim Brose
91d396fbca Translated using Weblate (German)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/de/
2020-05-20 15:29:32 +00:00
@a2sc:matrix.org
afba5b2b6c Translated using Weblate (German)
Currently translated at 99.5% (1673 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-20 15:29:32 +00:00
Benoit Marty
b579a1bc83 Translated using Weblate (French)
Currently translated at 100.0% (1682 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-20 15:29:31 +00:00
Priit Jõerüüt
db49673fc7 Translated using Weblate (Estonian)
Currently translated at 14.2% (239 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/et/
2020-05-20 15:29:31 +00:00
Marko Dimjašević
bb0511e659 Translated using Weblate (Croatian)
Currently translated at 26.2% (441 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-05-20 15:29:22 +00:00
Jeff Huang
0e0763ec2d Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (1682 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/zh_Hant/
2020-05-20 15:28:52 +00:00
ganfra
3faf42be53 Widget: get user list widgets from user account 2020-05-19 18:40:11 +02:00
ganfra
dea903bcb5 Merge branch 'develop' into feature/integration_manager 2020-05-19 16:08:46 +02:00
ganfra
e1c6542e03 Merge branch 'develop' into feature/forward_pagination 2020-05-19 15:25:33 +02:00
ganfra
01484978bd Fix lint 2020-05-19 15:24:36 +02:00
ganfra
cad14c93d0 Timeline: fix tests and add message order check 2020-05-19 14:39:42 +02:00
toastbroot
ee52b9185b Translated using Weblate (German)
Currently translated at 99.4% (1672 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-19 09:33:16 +00:00
Valere
861a7f791f Update change log 2020-05-19 09:57:54 +02:00
Valere
f2fa57224b Update matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/crypto/verification/DefaultVerificationService.kt
Co-authored-by: Hubert Chathi <hubert@uhoreg.ca>
2020-05-19 09:55:45 +02:00
Valere
e0977dd97b Add new key agreement protocol 2020-05-19 09:55:45 +02:00
Benoit Marty
f47bef71a4 Merge pull request #1354 from vector-im/feature/identity
Identity server
2020-05-18 17:28:57 +02:00
Benoit Marty
92985fc8e7 Split long line 2020-05-18 17:25:15 +02:00
Benoit Marty
243b0a7d82 ktlint 2020-05-18 17:23:33 +02:00
Benoit Marty
92c719a803 Set identity server: do not show the error in the EditText when user want to use the default identity server 2020-05-18 17:23:33 +02:00
Benoit Marty
f4108ae0eb Properly handle Loading state: button were still active... Also finish the work on the controller 2020-05-18 17:23:33 +02:00
Benoit Marty
ecf3fee709 Integrate Valere's remarks - step 3: use viewModelScope in ViewModels 2020-05-18 17:23:33 +02:00
Benoit Marty
e67e472025 Integrate Valere's remarks - step 2: Stop using (or at least reduce usage of) GlobalScope 2020-05-18 17:23:33 +02:00
Benoit Marty
a6541481bf Integrate Valere's remarks - step 1 2020-05-18 17:23:33 +02:00
Benoit Marty
85a4f83662 Colorize the identity server url 2020-05-18 17:23:33 +02:00
Benoit Marty
22955e6b34 Use debouncedClicks every where, for faster UI (it uses throttleFirst operator instead of debounce) 2020-05-18 17:23:33 +02:00
Benoit Marty
9520aff848 Use debouncedClicks every where, for faster UI (it uses throttleFirst operator instead of debounce) 2020-05-18 17:23:33 +02:00
Benoit Marty
6b09a78ece Identity: Improve identity choice screen after review 2020-05-18 17:23:33 +02:00
Benoit Marty
789bcc8d77 Identity: Bugfix: do not fail when trying to disconnect the current identity server, if there is no token available 2020-05-18 17:23:33 +02:00
Benoit Marty
2914117a8e Move some classes 2020-05-18 17:23:33 +02:00
Benoit Marty
8049962a99 Create a Wellknown module, because both AuthModule and HomeServerCapability module need it 2020-05-18 17:23:33 +02:00
Benoit Marty
225b1c380e Identity: retrieve the default identity server url 2020-05-18 17:23:33 +02:00
Benoit Marty
60d80ea0ba Fix compilation issue after rebase 2020-05-18 17:23:33 +02:00
Benoit Marty
c8211098f3 Identity: The store has to be migrated properly because it contains user's data 2020-05-18 17:23:33 +02:00
Benoit Marty
e78fde4eca Identity: rename a few class and add a mapper to avoid using Entities in the code 2020-05-18 17:23:33 +02:00
Benoit Marty
59d60813fb Cleanup 2020-05-18 17:23:33 +02:00
Benoit Marty
4c31e52892 Add facilities and Javadoc on SessionParams data class 2020-05-18 17:23:33 +02:00
Benoit Marty
c646fd2b36 ktlint 2020-05-18 17:23:33 +02:00
Benoit Marty
6432859732 Avoid code duplication 2020-05-18 17:23:33 +02:00
Benoit Marty
2beef7d816 Identity: fix issue with logout request.
Also disconnect previous set identity server when changing url, when disconnecting, and when deactivating account
2020-05-18 17:23:33 +02:00
Benoit Marty
623056455b Identity: fix rendering error 2020-05-18 17:23:33 +02:00
Benoit Marty
7a4d9370e3 Identity: human readable errors 2020-05-18 17:23:33 +02:00
Benoit Marty
fe3138492e Identity: fix issue in dark theme 2020-05-18 17:23:33 +02:00
Benoit Marty
05a52164f3 Identity: Changelog and documentation 2020-05-18 17:23:33 +02:00
Benoit Marty
d14f1dd1ab Capability: do not update data if the corresponding request fails 2020-05-18 17:23:13 +02:00
Benoit Marty
88e8c11ee5 Identity: protect against outdated homeserver 2020-05-18 17:23:13 +02:00
Benoit Marty
7afc7bdb31 Identity refresh main setting page. 2020-05-18 17:23:13 +02:00
Benoit Marty
84a3754c9f Confirm identity server disconnection in all cases, as Riot-Web does 2020-05-18 17:23:13 +02:00
Benoit Marty
4b2f8e9174 Auto-review 2020-05-18 17:23:13 +02:00
Benoit Marty
a17932e17e Add missing internal 2020-05-18 17:23:13 +02:00
Benoit Marty
084c27a2bb Identity: cleanup 2020-05-18 17:23:13 +02:00
Benoit Marty
ed2f62cbe7 Identity: ping API V2 and cleanup 2020-05-18 17:23:13 +02:00
Benoit Marty
38fb7185b6 Identity: One class per file 2020-05-18 17:23:13 +02:00
Benoit Marty
ce42d2fb8a Identity: improve terms not signed case 2020-05-18 17:23:13 +02:00
Benoit Marty
af3fc22e2d Identity: correctly handle terms update 2020-05-18 17:22:40 +02:00
Benoit Marty
b659cb60a2 Improve code 2020-05-18 17:22:40 +02:00
Benoit Marty
34cf9903dc Improve code 2020-05-18 17:22:40 +02:00
Benoit Marty
062a21e39a Improve code 2020-05-18 17:22:40 +02:00
Benoit Marty
4510aff00a ktlint 2020-05-18 17:22:40 +02:00
Benoit Marty
d0953b8406 Identity: Cleanup 2020-05-18 17:22:40 +02:00
Benoit Marty
7822660ce7 Identity: Extract enum for Epoxy Items 2020-05-18 17:22:40 +02:00
Benoit Marty
bdfcf5c67c Identity: cleanup Epoxy items 2020-05-18 17:22:40 +02:00
Benoit Marty
ae0d09a049 Identity: cancel binding WIP 2020-05-18 17:22:40 +02:00
Benoit Marty
69759b7415 Identity: store sendAttempt in DB 2020-05-18 17:22:40 +02:00
Benoit Marty
7e8e1ab9b7 Identity: change DB and add sendAttempt 2020-05-18 17:22:40 +02:00
Benoit Marty
b44f5d3b4a Handle correctly the verification code error case 2020-05-18 17:22:40 +02:00
Benoit Marty
03f8b66993 Remove undocumented parameter
https://github.com/matrix-org/sydent/issues/195
2020-05-18 17:22:40 +02:00
Benoit Marty
e411f139c8 Identity: validate code received by SMS 2020-05-18 17:22:40 +02:00
Benoit Marty
e962d1dadf Small improvement 2020-05-18 17:22:40 +02:00
Benoit Marty
756b0febe6 Identity: Add some doc 2020-05-18 17:22:40 +02:00
Benoit Marty
1535f3e2e5 Identity: bind/unbnd: restore the bind in progress State 2020-05-18 17:22:40 +02:00
Benoit Marty
3e808dec90 Identity: bind/unbnd WIP 2020-05-18 17:22:40 +02:00
Benoit Marty
637f4a8350 Fix small UI bug 2020-05-18 17:22:40 +02:00
Benoit Marty
d3bc9f52fd Remove duplicated class 2020-05-18 17:22:40 +02:00
Benoit Marty
ffd8ac859d Identity: fix sync of indetity server change 2020-05-18 17:22:40 +02:00
Benoit Marty
6e43e9b51c Identity: refresh pepper, logout feature and other improvements 2020-05-18 17:22:40 +02:00
Benoit Marty
426171508e Import and adapt Terms Of Service management: SDK and UI (compiling) - still fixing issue 2020-05-18 17:22:40 +02:00
Benoit Marty
e86460b578 Import and adapt Terms Of Service management: SDK and UI (compiling) 2020-05-18 17:22:40 +02:00
Benoit Marty
8dd5f88dba Identity: cleanup UI 2020-05-18 17:21:59 +02:00
Benoit Marty
3aa6de7cf5 Identity: progressing 2020-05-18 17:21:59 +02:00
Benoit Marty
a75242c79d Retrieve ThreePids from homeserver 2020-05-18 17:21:59 +02:00
Benoit Marty
784918350b Identity: import UI/UX From Riot and adapt to RiotX architecture 2020-05-18 17:21:59 +02:00
Benoit Marty
0199cf9a03 Identity - Fix issue with Realm 2020-05-18 17:21:59 +02:00
Benoit Marty
ab6e7a3b8a Identity - WIP (compilation ok) 2020-05-18 17:21:59 +02:00
Benoit Marty
f489265ce7 Create AccessTokenProvider 2020-05-18 17:21:59 +02:00
Benoit Marty
6c9c3e5cb3 To merge with previous previous commit 2020-05-18 17:21:59 +02:00
Benoit Marty
9b7c2599a7 Add withOlmUtility facility 2020-05-18 17:21:59 +02:00
Benoit Marty
25bbd7c526 Identity - Create DB 2020-05-18 17:21:59 +02:00
Benoit Marty
e0c3f3638d Merge pull request #1370 from vector-im/feature/redacted_message
Feature/redacted message
2020-05-18 16:30:40 +02:00
Benoit Marty
d45653dbb3 Ganfra's review: Improve the filters declaration 2020-05-18 16:26:18 +02:00
Benoit Marty
f70623beea Ganfra's review: Handle filterRedacted in TimelineHiddenReadReceipts 2020-05-18 16:26:18 +02:00
Benoit Marty
e542e4ba22 Add a setting to hide redacted events (#951) 2020-05-18 16:26:18 +02:00
Benoit Marty
05d1e64cb5 New rendering for redacted message 2020-05-18 16:25:54 +02:00
Benoit Marty
adac80062c Merge pull request #1368 from vector-im/feature/switch_language
Feature/switch language
2020-05-18 16:22:07 +02:00
Benoit Marty
28f8d9500e Better coroutine management 2020-05-18 16:21:47 +02:00
Benoit Marty
538bda329e Lazy load available languages 2020-05-18 16:21:47 +02:00
Benoit Marty
a00ddca188 Create SystemLocaleProvider 2020-05-18 16:21:47 +02:00
Benoit Marty
8ac2cb0530 Cleanup 2020-05-18 16:21:47 +02:00
Benoit Marty
19d655ec41 Locales: improve algo 2020-05-18 16:21:47 +02:00
Benoit Marty
4961bb0e08 FontSize: rework by creating FontScaleValue data class. 2020-05-18 16:21:47 +02:00
Benoit Marty
f45040c405 Locale: support locale change 2020-05-18 16:21:24 +02:00
Benoit Marty
9fed62e4a7 Improve template 2020-05-18 16:21:00 +02:00
Benoit Marty
43b9e2cec9 Merge pull request #1382 from vector-im/feature/aiplane_mode
Better connectivity lost indicator when airplane mode is on
2020-05-18 15:35:14 +02:00
Benoit Marty
3185b88fe5 Better connectivity lost indicator when airplane mode is on 2020-05-18 15:09:14 +02:00
LinAGKar
c2906d9b06 Translated using Weblate (Swedish)
Currently translated at 14.6% (245 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-16 18:28:48 +00:00
Амёба
cfb615f972 Translated using Weblate (Russian)
Currently translated at 82.1% (1381 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-16 18:28:48 +00:00
Priit Jõerüüt
9c22c0952c Translated using Weblate (Estonian)
Currently translated at 5.9% (100 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/et/
2020-05-16 18:28:48 +00:00
Priit Jõerüüt
5a834619c0 Translated using Weblate (Estonian)
Currently translated at 97.5% (159 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/et/
2020-05-16 18:28:43 +00:00
LinAGKar
3b62f50f7b Translated using Weblate (Swedish)
Currently translated at 14.4% (242 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-16 08:03:01 +00:00
LinAGKar
18e804d174 Translated using Weblate (Swedish)
Currently translated at 14.3% (241 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-16 07:22:14 +00:00
Szimszon
c105d82027 Translated using Weblate (Hungarian)
Currently translated at 100.0% (1682 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hu/
2020-05-16 07:22:11 +00:00
Kévin C
860921217d Translated using Weblate (French)
Currently translated at 100.0% (1682 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-16 07:22:06 +00:00
Priit Jõerüüt
3fe2f2876a Translated using Weblate (Estonian)
Currently translated at 1.6% (27 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/et/
2020-05-16 07:22:05 +00:00
Marko Dimjašević
e84fd408be Translated using Weblate (Croatian)
Currently translated at 0.5% (8 of 1682 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hr/
2020-05-16 07:22:05 +00:00
Marko Dimjašević
f361fd7355 Added translation using Weblate (Croatian) 2020-05-15 21:33:36 +00:00
ganfra
458e3ee5e8 Timeline: fetch next token with the help of getContext when required 2020-05-15 20:18:07 +02:00
Benoit Marty
5fa247a0c5 Remove temporary tool and strings_riotX.xml temporary files 2020-05-15 15:50:15 +02:00
Benoit Marty
48e58967b2 Version++ 2020-05-15 15:48:15 +02:00
Benoit Marty
d1d79c0191 Merge branch 'release/0.20.0' 2020-05-15 15:45:26 +02:00
Benoit Marty
0a41a9f773 Merge branch 'release/0.20.0' into develop 2020-05-15 15:45:26 +02:00
Benoit Marty
03fa0e6ad6 Prepare release 0.20.0 2020-05-15 15:44:36 +02:00
Benoit Marty
8eebcef4e9 Fix #1373 2020-05-15 15:36:52 +02:00
Benoit Marty
ea1c75c16a Fix lint issues in Strings 2020-05-15 12:58:14 +02:00
Benoit Marty
7a2aefd8fb Format string resources 2020-05-15 12:46:20 +02:00
Benoit Marty
33ec1bbfb3 Merge pull request #1371 from RiotTranslateBot/weblate-riot-android-riotx-application
Update from Weblate
2020-05-15 12:41:06 +02:00
Weblate
8883832b86 Merge branch 'origin/develop' into Weblate. 2020-05-15 10:09:23 +00:00
LinAGKar
308828ef50 Translated using Weblate (Swedish)
Currently translated at 14.3% (239 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-15 10:04:42 +00:00
Benoit Marty
885dac4ad1 Translated using Weblate (French)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-15 10:04:39 +00:00
Priit Jõerüüt
c03d61e09f Translated using Weblate (Estonian)
Currently translated at 1.5% (25 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/et/
2020-05-15 10:04:38 +00:00
Priit Jõerüüt
b2bacdfa4e Translated using Weblate (Estonian)
Currently translated at 92.6% (151 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/et/
2020-05-15 10:04:36 +00:00
Tirifto
06defaf14e Translated using Weblate (Esperanto)
Currently translated at 24.2% (404 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/eo/
2020-05-15 10:04:33 +00:00
ganfra
22e3b370e3 IntegrationConfig: make preferred non null as we should at least get the default one 2020-05-14 17:54:27 +02:00
ganfra
8f5589d3e1 Start creating the widget url builder 2020-05-14 17:05:22 +02:00
ganfra
03389fc040 Change some naming 2020-05-14 17:05:08 +02:00
Benoit Marty
4698cf7a9b Merge pull request #1367 from vector-im/feature/fix_crash_1366
Fix crash on restore backup from ky
2020-05-14 16:07:40 +02:00
Priit Jõerüüt
5004fba986 Added translation using Weblate (Estonian) 2020-05-14 08:16:34 +00:00
Priit Jõerüüt
8cc82fe5ba Added translation using Weblate (Estonian) 2020-05-14 08:13:31 +00:00
LinAGKar
c9fb231714 Translated using Weblate (Swedish)
Currently translated at 12.0% (200 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-13 23:28:56 +00:00
Амёба
0f22b55786 Translated using Weblate (Russian)
Currently translated at 82.5% (1380 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-13 23:28:55 +00:00
zurtel22
535148e68a Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 23:28:47 +00:00
Dominik Mahnkopf
878e093b6b Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 23:28:47 +00:00
Tirifto
0e5f741b6b Translated using Weblate (Esperanto)
Currently translated at 21.2% (355 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/eo/
2020-05-13 23:28:47 +00:00
Dominik Mahnkopf
36b1717fc1 Translated using Weblate (Dutch)
Currently translated at 68.4% (1144 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/nl/
2020-05-13 23:28:38 +00:00
tleydxdy
37392b5495 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/zh_Hans/
2020-05-13 23:28:38 +00:00
nikonak
84f2fc41b3 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 20:46:48 +00:00
Dominik Mahnkopf
ebdf75091a Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 20:46:48 +00:00
nikonak
ce304ace2b Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 20:24:08 +00:00
Dominik Mahnkopf
0d2acec73e Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 20:24:08 +00:00
nikonak
0144764f69 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 19:34:47 +00:00
Dominik Mahnkopf
aad4b3dc39 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-13 19:34:47 +00:00
ganfra
996aa9ef66 Merge branch 'develop' into feature/integration_manager 2020-05-13 20:21:48 +02:00
ganfra
9778999a7f Create RoomWidget feature 2020-05-13 20:04:19 +02:00
ganfra
91301197ea Try to communicate with WidgetPostAPI 2020-05-13 20:04:08 +02:00
Valere
040deea655 Fix crash on restore backup from ky 2020-05-13 16:59:55 +02:00
Valere
1e2b5dd428 Merge pull request #1365 from vector-im/feature/fix_crash_1364
Fix crash 1364
2020-05-13 16:59:08 +02:00
Valere
8d32c27ce0 Fix crash 1364 2020-05-13 16:57:57 +02:00
Valere
074a9e9f29 Merge pull request #1338 from vector-im/feature/crash_manual_verify
Crashes when private key missing
2020-05-13 16:35:38 +02:00
Valere
650b6bd9ea Merge branch 'develop' into feature/crash_manual_verify 2020-05-13 16:35:28 +02:00
Benoit Marty
3dd74d6828 Merge pull request #1095 from vector-im/feature/wellknown
Add wellknown support in the login flow
2020-05-13 15:29:02 +02:00
Benoit Marty
f717a37a4a Split long line 2020-05-13 15:28:05 +02:00
Benoit Marty
d8b1372a0f Login request does not provide the full Wellknown data. Change the model to reflect that, to avoid misunderstanding. 2020-05-13 14:03:10 +02:00
Benoit Marty
678cf50dbd Add Javadoc 2020-05-13 13:56:33 +02:00
Benoit Marty
57fca80cbb Disable possibility to login using matrixId (waiting for design) 2020-05-13 13:33:12 +02:00
Benoit Marty
cf7de8bb8b Typo 2020-05-13 12:43:54 +02:00
Benoit Marty
a70fdedce5 Try to use wellKnown request, when user is entering a homeserver URL 2020-05-13 12:43:54 +02:00
Benoit Marty
c173235ee3 ktlint 2020-05-13 12:43:54 +02:00
Benoit Marty
f74b1e6c2e Migrate Login Navigation view model to regular ViewEvents 2020-05-13 12:43:54 +02:00
Benoit Marty
c9bc6f4a9e Support homeserver discovery from MXID - Wellknown (#476) 2020-05-13 12:42:08 +02:00
Benoit Marty
63c18e82c8 typo... 2020-05-13 00:34:33 +02:00
Benoit Marty
037b2e1d60 PR merged after a release, move 2 lines 2020-05-13 00:34:03 +02:00
Benoit Marty
aea9c958bf Merge pull request #1307 from vector-im/feature/invite_members_to_room
Invite members to an existing room
2020-05-13 00:29:55 +02:00
Benoit Marty
7f185a729e Merge pull request #1345 from emmaguy/direct-shortcuts
Add direct shortcuts
2020-05-13 00:25:58 +02:00
Emma Vanbrabant
d08b4e1ea0 PR feedback 2020-05-12 19:37:03 +01:00
onurays
4eaed945e2 Fix plurals. 2020-05-12 15:31:15 +03:00
HaHaNoname
14b1b10556 Translated using Weblate (Russian)
Currently translated at 75.2% (1258 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-12 12:28:46 +00:00
Tirifto
df762e40bb Translated using Weblate (Esperanto)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/eo/
2020-05-12 12:28:46 +00:00
Tirifto
684972185f Translated using Weblate (Esperanto)
Currently translated at 14.7% (245 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/eo/
2020-05-12 12:28:45 +00:00
onurays
04dd13d03b Use plurals in case of 3 or more invited users. 2020-05-12 14:10:23 +03:00
onurays
700fd47f22 Toast message formatting of invited users. 2020-05-12 12:10:45 +03:00
Benoit Marty
b36759deb4 Merge pull request #1226 from ndarilek/develop
Set `tickerText` to improve accessibility of notifications.
2020-05-11 22:28:36 +02:00
Benoit Marty
25d224be6b Merge branch 'develop' into develop 2020-05-11 22:27:16 +02:00
onurays
fe013f803e Add action menu icon to invite users. 2020-05-11 22:43:55 +03:00
ganfra
01d6b52a60 Widgets: handle scalar token 2020-05-11 20:00:50 +02:00
ganfra
ce884ac577 Merge branch 'develop' into feature/integration_manager 2020-05-11 15:48:27 +02:00
Benoit Marty
6abc51d05d Merge pull request #1339 from vector-im/feature/openId
Create a specific module for OpenId
2020-05-11 15:41:41 +02:00
LinAGKar
a98916c985 Translated using Weblate (Swedish)
Currently translated at 11.1% (186 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-11 10:28:38 +00:00
Frisk
9e29533aad Translated using Weblate (Polish)
Currently translated at 93.3% (1560 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/pl/
2020-05-11 10:28:37 +00:00
tctovsli
7119403cde Translated using Weblate (Norwegian Bokmål)
Currently translated at 34.5% (577 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/nb_NO/
2020-05-11 10:28:36 +00:00
nikonak
7f55e4fb1e Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-11 10:28:34 +00:00
zurtel22
82df62a600 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-11 10:28:34 +00:00
Pepper.Cabbit.Snoopy
d0c722eae1 Translated using Weblate (Chinese (Simplified))
Currently translated at 64.5% (1078 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/zh_Hans/
2020-05-11 10:28:33 +00:00
nikonak
40649e9c3c Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-10 22:23:53 +00:00
zurtel22
431b285806 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-10 22:23:52 +00:00
nikonak
75f84fe1f4 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-10 22:20:28 +00:00
zurtel22
98bf02efa9 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-10 22:20:28 +00:00
nikonak
0eb68b531c Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-10 21:47:22 +00:00
zurtel22
9124844e3e Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-10 21:47:22 +00:00
Emma Vanbrabant
f568553d21 Add to changes 2020-05-09 21:07:03 +01:00
Emma Vanbrabant
92c9d4fc22 remove unused import
Signed-off-by: Emma Vanbrabant <emmag87@gmail.com>
2020-05-09 20:58:15 +01:00
Emma Vanbrabant
957d51cf3f Fix placeholder icons 2020-05-09 20:50:58 +01:00
Emma Vanbrabant
54ecc25831 Create ShortcutBuilder and use 2020-05-09 20:12:51 +01:00
kujaw
738a368a6f Translated using Weblate (Polish)
Currently translated at 93.1% (1557 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/pl/
2020-05-09 18:02:25 +00:00
LinAGKar
969f070175 Translated using Weblate (Swedish)
Currently translated at 10.6% (178 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-09 16:28:51 +00:00
@a2sc:matrix.org
d8d78b124d Translated using Weblate (German)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-09 16:28:37 +00:00
Alexander Eisele
9a9f0c200e Translated using Weblate (German)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-09 16:28:37 +00:00
Tirifto
247ffc1270 Translated using Weblate (Esperanto)
Currently translated at 82.2% (134 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/eo/
2020-05-09 16:28:37 +00:00
LinAGKar
690d05aeca Translated using Weblate (Danish)
Currently translated at 23.8% (398 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/da/
2020-05-09 16:28:30 +00:00
LinAGKar
c33f3b76fa Translated using Weblate (Swedish)
Currently translated at 0.5% (8 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sv/
2020-05-08 06:28:32 +00:00
laeberkaes
8616c454e1 Translated using Weblate (German)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/de/
2020-05-08 06:28:31 +00:00
laeberkaes
17db994d35 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-08 06:28:30 +00:00
Samu Voutilainen
6c1c1ca8b0 Translated using Weblate (Finnish)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/fi/
2020-05-08 06:28:30 +00:00
Ville Ranki
f1613eacbb Translated using Weblate (Finnish)
Currently translated at 94.0% (1572 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fi/
2020-05-08 06:28:30 +00:00
Besnik Bleta
67d1c2dc80 Translated using Weblate (Albanian)
Currently translated at 98.8% (161 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/sq/
2020-05-08 06:28:28 +00:00
Besnik Bleta
c2b2b856a1 Translated using Weblate (Albanian)
Currently translated at 99.6% (1665 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sq/
2020-05-08 06:28:28 +00:00
LinAGKar
44f946513f Added translation using Weblate (Swedish) 2020-05-08 06:15:51 +00:00
Valere
1cafca6de6 Merge pull request #1334 from vector-im/feature/fix_1329
Fix #1329
2020-05-07 17:45:09 +02:00
Nolan Darilek
35ee7f0b40 Add changelog entry. 2020-05-07 15:38:28 +00:00
Nolan Darilek
6e8e7164c6 Use last event when generating ticker text. 2020-05-07 15:29:42 +00:00
Nolan Darilek
6bbded1e65 Use string resource for generating ticker text. 2020-05-07 15:14:31 +00:00
Ville Ranki
0aa90c3eea Translated using Weblate (Finnish)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/fi/
2020-05-07 06:15:43 +00:00
Alexander Eisele
b44b0ec998 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:10:26 +00:00
laeberkaes
07c6259734 Translated using Weblate (German)
Currently translated at 99.9% (1671 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:10:25 +00:00
Alexander Eisele
1785d4d0b4 Translated using Weblate (German)
Currently translated at 99.6% (1665 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:08:11 +00:00
laeberkaes
22d06928c8 Translated using Weblate (German)
Currently translated at 99.6% (1665 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:08:11 +00:00
Alexander Eisele
d6fe6e44bd Translated using Weblate (German)
Currently translated at 99.3% (1660 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:06:47 +00:00
laeberkaes
d51ee19f3f Translated using Weblate (German)
Currently translated at 99.3% (1660 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:06:47 +00:00
Alexander Eisele
717e5161a6 Translated using Weblate (German)
Currently translated at 98.9% (1654 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:05:07 +00:00
laeberkaes
be9fa268b1 Translated using Weblate (German)
Currently translated at 98.9% (1654 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:05:07 +00:00
Alexander Eisele
14e8bbcec6 Translated using Weblate (German)
Currently translated at 98.9% (1653 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:03:45 +00:00
laeberkaes
26105dc25f Translated using Weblate (German)
Currently translated at 98.9% (1653 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:03:45 +00:00
Alexander Eisele
53ba1c2068 Translated using Weblate (German)
Currently translated at 98.8% (1652 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:03:19 +00:00
laeberkaes
fa004c9d93 Translated using Weblate (German)
Currently translated at 98.8% (1652 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:03:18 +00:00
Alexander Eisele
be94921918 Translated using Weblate (German)
Currently translated at 98.7% (1650 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:00:54 +00:00
laeberkaes
2f5fe59aa6 Translated using Weblate (German)
Currently translated at 98.7% (1650 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 22:00:53 +00:00
Alexander Eisele
89fb2cf391 Translated using Weblate (German)
Currently translated at 98.3% (1644 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:55:58 +00:00
laeberkaes
f1d2abc9b1 Translated using Weblate (German)
Currently translated at 98.3% (1644 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:55:58 +00:00
Alexander Eisele
2aa8512f6f Translated using Weblate (German)
Currently translated at 98.1% (1641 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:52:02 +00:00
laeberkaes
2d31402cf0 Translated using Weblate (German)
Currently translated at 98.1% (1641 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:52:02 +00:00
Alexander Eisele
6d61848ed6 Translated using Weblate (German)
Currently translated at 98.1% (1640 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:42:56 +00:00
laeberkaes
0e0b724535 Translated using Weblate (German)
Currently translated at 98.1% (1640 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:42:55 +00:00
Alexander Eisele
e13915b0c7 Translated using Weblate (German)
Currently translated at 98.0% (1639 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:40:19 +00:00
laeberkaes
361f0415bb Translated using Weblate (German)
Currently translated at 98.0% (1639 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:40:18 +00:00
Alexander Eisele
c3b662fa1f Translated using Weblate (German)
Currently translated at 98.0% (1638 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:40:01 +00:00
laeberkaes
2d3e23ee11 Translated using Weblate (German)
Currently translated at 98.0% (1638 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:40:00 +00:00
Alexander Eisele
fc8ab0d462 Translated using Weblate (German)
Currently translated at 97.9% (1637 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:36:10 +00:00
laeberkaes
89629ffe93 Translated using Weblate (German)
Currently translated at 97.9% (1637 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:36:10 +00:00
Alexander Eisele
e97d565809 Translated using Weblate (German)
Currently translated at 97.8% (1636 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:35:28 +00:00
laeberkaes
7e3413eda7 Translated using Weblate (German)
Currently translated at 97.8% (1636 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:35:28 +00:00
Alexander Eisele
7966f6e308 Translated using Weblate (German)
Currently translated at 97.7% (1634 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:34:42 +00:00
laeberkaes
e1286a0ed4 Translated using Weblate (German)
Currently translated at 97.7% (1634 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:34:42 +00:00
Alexander Eisele
1e2d267fec Translated using Weblate (German)
Currently translated at 97.6% (1632 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:32:36 +00:00
laeberkaes
8b3403c115 Translated using Weblate (German)
Currently translated at 97.6% (1632 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:32:35 +00:00
Alexander Eisele
da4b029093 Translated using Weblate (German)
Currently translated at 97.5% (1631 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:32:22 +00:00
laeberkaes
b48113a353 Translated using Weblate (German)
Currently translated at 97.5% (1631 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:32:21 +00:00
Alexander Eisele
e1884e7c73 Translated using Weblate (German)
Currently translated at 97.5% (1630 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:32:01 +00:00
laeberkaes
daae030134 Translated using Weblate (German)
Currently translated at 97.5% (1630 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:32:01 +00:00
Alexander Eisele
19e1da1216 Translated using Weblate (German)
Currently translated at 97.3% (1627 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:30:27 +00:00
laeberkaes
e9bb95b3b3 Translated using Weblate (German)
Currently translated at 97.3% (1627 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:30:26 +00:00
Alexander Eisele
a43ca5925c Translated using Weblate (German)
Currently translated at 97.1% (1624 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:28:41 +00:00
laeberkaes
dd46798bda Translated using Weblate (German)
Currently translated at 97.1% (1624 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:28:41 +00:00
Alexander Eisele
d70a09ded8 Translated using Weblate (German)
Currently translated at 97.1% (1623 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:27:28 +00:00
laeberkaes
439aa7854c Translated using Weblate (German)
Currently translated at 97.1% (1623 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 21:27:28 +00:00
Benoit Marty
750550ad3e Create a specific module for OpenId 2020-05-06 22:14:56 +02:00
Besnik Bleta
b6af2269d2 Translated using Weblate (Albanian)
Currently translated at 99.6% (1665 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sq/
2020-05-06 18:59:23 +00:00
ganfra
b047f36e86 Creates a Widget Manager to be used internally and state event service 2020-05-06 20:49:07 +02:00
kujaw
afbda4ac28 Translated using Weblate (Polish)
Currently translated at 93.1% (1556 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/pl/
2020-05-06 17:23:33 +00:00
Szimszon
f5fd0ac323 Translated using Weblate (Hungarian)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hu/
2020-05-06 17:23:31 +00:00
Alexander Eisele
18de0ca951 Translated using Weblate (German)
Currently translated at 96.9% (1621 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 17:23:31 +00:00
Christopher Rossbach
b53c073b90 Translated using Weblate (German)
Currently translated at 96.9% (1621 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-06 17:23:30 +00:00
Kévin C
13ebef334f Translated using Weblate (French)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-06 17:23:30 +00:00
Ville Ranki
b1ba4e393e Translated using Weblate (Finnish)
Currently translated at 93.8% (1568 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fi/
2020-05-06 17:23:30 +00:00
Martijn de Boer
d898bc71f7 Translated using Weblate (Dutch)
Currently translated at 68.4% (1144 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/nl/
2020-05-06 17:23:20 +00:00
Valere
0afa7a706a Update change log 2020-05-06 18:20:43 +02:00
Valere
da68212255 Crashes when private key missing 2020-05-06 18:14:44 +02:00
ganfra
4fdd2f4eed Create WidgetsAPI 2020-05-06 15:53:28 +02:00
Valere
583139d51e klint 2020-05-06 15:06:34 +02:00
Valere
cee8ae3af4 Fix #1329
+ migration to remove duplicate
2020-05-06 15:04:17 +02:00
ganfra
182753e4ec Start creating integration manager 2020-05-06 11:53:35 +02:00
onurays
c7c6cf70e4 Code review fixes. 2020-05-06 11:20:08 +03:00
Dirmin
1491bddb3b Translated using Weblate (French)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-06 06:42:49 +00:00
Alexander Eisele
ac5db83880 Translated using Weblate (German)
Currently translated at 96.5% (1614 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-05 13:35:17 +00:00
Christopher Rossbach
b2f3ba220e Translated using Weblate (German)
Currently translated at 96.5% (1614 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-05 13:35:17 +00:00
n3niu
deb783f797 Translated using Weblate (German)
Currently translated at 96.5% (1613 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-05 13:34:25 +00:00
Alexander Eisele
5fcf54cd57 Translated using Weblate (German)
Currently translated at 96.5% (1613 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-05 13:34:25 +00:00
ganfra
29c9d3070c Start creating bunch of necessary classes 2020-05-05 13:05:45 +02:00
Benoit Marty
4306cb7812 Upgrade build tools version (SDK 29) 2020-05-05 12:08:19 +02:00
Benoit Marty
a4b8dc9400 Fix test compilation issue 2020-05-05 11:49:03 +02:00
Benoit Marty
be9393fabe Merge branch 'hotfix/fix_crash_before_release' 2020-05-05 11:33:40 +02:00
Benoit Marty
c7a7ad7b57 Merge branch 'hotfix/fix_crash_before_release' into develop 2020-05-05 11:33:40 +02:00
Valere
78b7f03138 Fix / Sending events have warning until encrypted 2020-05-05 10:15:42 +02:00
Benoit Marty
ffeae7ec83 Fix timeline navigation when opening an event in a previous lastForward chunk.
In this case, we do not have a nextToken, but there are more event to load. So we perform a GET /context on the last known event.
Not sure it is correct to do that though...
2020-05-05 02:41:32 +02:00
Benoit Marty
db77e7b817 Create a fun 2020-05-05 02:41:32 +02:00
Benoit Marty
fcee85a682 Cleanup and doc 2020-05-05 02:41:32 +02:00
Benoit Marty
17ddb5ce43 if all events are rendered in the timeline (developer mode), render the room creation event. 2020-05-05 02:41:32 +02:00
Benoit Marty
53583c691f Add some logs 2020-05-05 02:41:32 +02:00
Benoit Marty
2b9d3960b3 Improve tests 2020-05-05 02:41:32 +02:00
Benoit Marty
92befcde5d Add test to cover previous last forward case (passing) 2020-05-05 02:41:32 +02:00
Benoit Marty
697eaec197 TI: After jump to unread, newer messages are never loaded (#1008) 2020-05-05 02:41:32 +02:00
Benoit Marty
86fba28313 After jump to unread, newer messages are never loaded (#1008) 2020-05-05 02:41:32 +02:00
Benoit Marty
f3c3c07d46 Kotlin sugar 2020-05-05 00:14:57 +02:00
Benoit Marty
8966e24925 Create a debug method to send x times the same event 2020-05-05 00:14:57 +02:00
Benoit Marty
becc5a7b54 Add assertion in debug 2020-05-05 00:14:57 +02:00
Benoit Marty
a61434ae08 doc 2020-05-05 00:14:57 +02:00
Benoit Marty
20b726819f Rename "LastLive" -> "LastForward" 2020-05-05 00:14:57 +02:00
Benoit Marty
bfd847179f Wait more 2020-05-05 00:14:57 +02:00
Benoit Marty
7e955ef0e4 Add possibility to create clear room 2020-05-05 00:14:57 +02:00
Benoit Marty
2697800deb Doc and cleanup 2020-05-05 00:14:57 +02:00
Benoit Marty
2c47fe9f0d typo 2020-05-05 00:14:57 +02:00
aWeinzierl
423f21b02e Translated using Weblate (German)
Currently translated at 96.4% (1611 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-04 18:43:34 +00:00
Alexander Eisele
eb6546d81c Translated using Weblate (German)
Currently translated at 96.4% (1611 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-04 18:43:33 +00:00
upgradetofreedom
4e2878300f Translated using Weblate (German)
Currently translated at 96.4% (1611 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-04 18:43:33 +00:00
Valere
4578b9df7f Fix / froezn object migration 2020-05-04 18:27:38 +02:00
Benoit Marty
d679c9d5d8 Cleanup 2020-05-04 17:30:55 +02:00
Benoit Marty
dc7b3dfc9d Fix crash when entering wrong passphrase 2020-05-04 17:30:13 +02:00
Benoit Marty
6843ea113b Version++ 2020-05-04 16:06:41 +02:00
Benoit Marty
0a8c954397 Merge remote-tracking branch 'origin/master' 2020-05-04 16:04:51 +02:00
Benoit Marty
358e10a093 Merge branch 'release/0.19.0' 2020-05-04 16:03:35 +02:00
Benoit Marty
c0b7ea6dd1 Merge branch 'release/0.19.0' into develop 2020-05-04 16:03:34 +02:00
Benoit Marty
0b5e618c1c Update CHANGES.md 2020-05-04 16:03:01 +02:00
Benoit Marty
1f528ee428 Format strings 2020-05-04 16:00:11 +02:00
Benoit Marty
bbd8b89589 Merge pull request #1321 from RiotTranslateBot/weblate-riot-android-riotx-application
Update from Weblate
2020-05-04 15:52:06 +02:00
Andrej Shadura
a5d2d65131 Translated using Weblate (Slovak)
Currently translated at 54.5% (912 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sk/
2020-05-04 11:50:58 +00:00
Szimszon
b45504d97a Translated using Weblate (Hungarian)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/hu/
2020-05-04 11:50:57 +00:00
Szimszon
0598ecaca3 Translated using Weblate (Hungarian)
Currently translated at 99.8% (1669 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/hu/
2020-05-04 11:50:57 +00:00
Alexander Eisele
0d9749a515 Translated using Weblate (German)
Currently translated at 95.9% (1604 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-04 11:50:55 +00:00
HayWo
836766f978 Translated using Weblate (German)
Currently translated at 95.9% (1604 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-04 11:50:55 +00:00
code-surfer
93851d0ab2 Translated using Weblate (German)
Currently translated at 95.9% (1604 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-04 11:50:55 +00:00
Ville Ranki
5fff637bee Translated using Weblate (Finnish)
Currently translated at 99.4% (162 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/fi/
2020-05-04 11:50:55 +00:00
Ville Ranki
eae015caa1 Translated using Weblate (Finnish)
Currently translated at 86.0% (1438 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fi/
2020-05-04 11:50:54 +00:00
David
80a356c7e2 Translated using Weblate (Czech)
Currently translated at 98.4% (1645 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/cs/
2020-05-04 11:50:52 +00:00
onurays
3a0eed795a Lint fix. 2020-05-04 12:09:36 +03:00
onurays
c1c0c6f2c6 Lint fixes. 2020-05-04 11:22:27 +03:00
code-surfer
f04868ba19 Translated using Weblate (German)
Currently translated at 95.8% (1601 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-03 14:14:24 +00:00
n3niu
b052884912 Translated using Weblate (German)
Currently translated at 95.8% (1601 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-03 14:14:24 +00:00
code-surfer
7fb7729af6 Translated using Weblate (German)
Currently translated at 95.8% (1601 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-03 14:14:24 +00:00
random
2f5d824c65 Translated using Weblate (Italian)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/it/
2020-05-03 14:14:24 +00:00
random
fbc46b3c8b Translated using Weblate (Italian)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/it/
2020-05-03 14:14:24 +00:00
n3niu
e986c9d343 Translated using Weblate (German)
Currently translated at 95.6% (1599 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/de/
2020-05-03 14:14:24 +00:00
Kévin C
3100473305 Translated using Weblate (French)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/fr/
2020-05-03 14:14:24 +00:00
Kévin C
5eb9f32acb Translated using Weblate (French)
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-03 14:14:24 +00:00
Jeff Huang
0d12a80832 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/zh_Hant/
2020-05-03 14:14:24 +00:00
Jeff Huang
077c166c09 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (1672 of 1672 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/zh_Hant/
2020-05-03 14:14:24 +00:00
Akarshan Biswas
5d26b6a7cb Translated using Weblate (Bengali (India))
Currently translated at 12.3% (20 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/bn_IN/
2020-05-03 14:14:24 +00:00
Akarshan Biswas
68c1e8fc6d Added translation using Weblate (Bengali (India)) 2020-05-03 14:14:24 +00:00
yuuki-san
1ffd7dbb9f Translated using Weblate (Slovak)
Currently translated at 92.6% (151 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/sk/
2020-05-03 14:14:24 +00:00
yuuki-san
0cc48a190f Translated using Weblate (Slovak)
Currently translated at 54.2% (904 of 1667 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sk/
2020-05-03 14:14:24 +00:00
random
8206a78156 Translated using Weblate (Italian)
Currently translated at 98.7% (1645 of 1667 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/it/
2020-05-03 14:14:24 +00:00
Jeff Huang
6a1e38ca04 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (1667 of 1667 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/zh_Hant/
2020-05-03 14:14:24 +00:00
Slavi Pantaleev
779f380d2f Translated using Weblate (Bulgarian)
Currently translated at 100.0% (163 of 163 strings)

Translation: Riot Android/RiotX Matrix SDK
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-matrix-sdk/bg/
2020-05-03 14:14:24 +00:00
rkfg
55f7461747 Translated using Weblate (Russian)
Currently translated at 75.4% (1257 of 1667 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/ru/
2020-05-03 14:14:24 +00:00
Kévin C
7665aba22c Translated using Weblate (French)
Currently translated at 100.0% (1667 of 1667 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/fr/
2020-05-03 14:14:24 +00:00
Jeff Huang
e96c5f7305 Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (1667 of 1667 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/zh_Hant/
2020-05-03 14:14:24 +00:00
yuuki-san
c5ba34d619 Translated using Weblate (Slovak)
Currently translated at 54.0% (901 of 1667 strings)

Translation: Riot Android/RiotX application
Translate-URL: https://translate.riot.im/projects/riot-android/riotx-application/sk/
2020-05-03 14:14:24 +00:00
Valere
c13439eeb9 Merge pull request #1317 from vector-im/feature/fix_crash_bootstrap
Fix / Crash on bootstrap
2020-05-03 11:59:32 +02:00
Valere
d27b73f6be Fix / Crash on bootstrap
Exception: java.lang.IllegalArgumentException: 'value' is not a valid managed object.
2020-05-03 11:36:40 +02:00
Benoit Marty
bb427700d2 Merge pull request #1310 from vector-im/feature/room_creation
Several fixes on room creation collpasing events (Fixes #1309)
2020-04-30 18:19:49 +02:00
Valere
4589aaa11c Merge pull request #1312 from vector-im/feature/post_smoke_test_fix
Feature/post smoke test fix
2020-04-30 17:37:04 +02:00
Valere
b3dbcd7936 Show untrusted first 2020-04-30 15:43:19 +02:00
Valere
cac246aa15 update copy 2020-04-30 15:43:05 +02:00
Onuray Sahin
d2f0957eba Merge branch 'develop' into feature/invite_members_to_room 2020-04-30 16:11:52 +03:00
onurays
db18272ef2 Remove strings from strings_riotX.xml 2020-04-30 15:47:31 +03:00
onurays
cf5d89ea9b Documentation added for new parameter excludedUserIds. 2020-04-30 15:40:54 +03:00
onurays
0aeb327062 Changelog added. 2020-04-30 15:40:02 +03:00
onurays
5dc50195b3 Filter existing room members. 2020-04-30 15:28:20 +03:00
Benoit Marty
83db9b34d4 Merge pull request #1311 from vector-im/bmarty-patch-1
Add instruction regarding the template
2020-04-30 13:50:44 +02:00
Benoit Marty
a43df43642 Add instruction regarding the template 2020-04-30 13:10:53 +02:00
onurays
57a87ba620 Add InviteUsersToRoomActivity and mvrx classes. 2020-04-30 13:54:09 +03:00
Benoit Marty
f6cbc15cf7 Several fixes on room creation collpasing events (Fixes #1309)
- do not collapse room member events
- collapse other type of event: topic, alias, canonical alias, powel level
- Use correct user name for collapsed version (should be fixed twice due to the previous change of excluding some room member events)
- align "join" and "left" string with Riot-Web
2020-04-30 12:52:21 +02:00
Benoit Marty
7322144dc8 Remove duplicated strings 2020-04-30 12:15:26 +02:00
Valere
8e357c6b7f Merge pull request #1280 from vector-im/feature/e2e_timeline_decoration
Feature/e2e timeline decoration
2020-04-30 12:01:55 +02:00
Valere
7b20db64a5 Merge branch 'develop' into feature/e2e_timeline_decoration 2020-04-30 12:01:44 +02:00
Valere
429c634ed9 Merge pull request #1308 from vector-im/feature/fix_dm_shield_logic
Fix / Move DM shield rules to task
2020-04-30 12:00:18 +02:00
Valere
05230a6afa Code review 2020-04-30 11:38:32 +02:00
Valere
43eb804b23 Merge pull request #1303 from vector-im/feature/xs_old_new_session_detection
Feature/xs old new session detection
2020-04-30 11:23:15 +02:00
Valere
5840248ffa Fix / NPE Optional#get instead of getOrNull 2020-04-30 11:11:11 +02:00
Valere
6ea38c7eb0 Fix / Move DM shield rules to task 2020-04-30 10:55:25 +02:00
Valere
9586fa9f90 Typo in file name 2020-04-30 10:11:32 +02:00
Valere
0d0af6906e Code review 2020-04-30 10:10:56 +02:00
Valere
93070f3524 Fix / use distinct until change 2020-04-30 09:50:47 +02:00
Valere
7cf7b7e10e Fix / avoid showing legacy start toaster under verif bottomsheet 2020-04-30 09:50:38 +02:00
Valere
1de4869cde Fix / reuse cell keeps icon 2020-04-30 09:50:11 +02:00
onurays
a4eba653a3 Make a generic user directory search & selection views. 2020-04-30 02:50:30 +03:00
ganfra
21d0db8382 Merge pull request #1304 from vector-im/feature/template
Feature/template
2020-04-29 19:21:01 +02:00
ganfra
269d6e4d08 Remove AndroidManifest template 2020-04-29 19:19:50 +02:00
Valere
3cf341c3bf code quality 2020-04-29 18:48:26 +02:00
Valere
f0a9be2ec7 Better session detection 2020-04-29 18:46:36 +02:00
Valere
8955e5461c Add retry to sendToDeviceTask 2020-04-29 18:45:51 +02:00
Valere
087ff1c041 Fix / race when receive accept in sending start in to device 2020-04-29 18:44:25 +02:00
ganfra
1a307a0c4d Template: let the ViewModel factory be agnostic of the host 2020-04-29 17:58:54 +02:00
Benoit Marty
071a43c8d4 Merge pull request #1305 from vector-im/feature/fix_delay_initial_sync
Fix / ensure ux aware of wait
2020-04-29 17:12:58 +02:00
Valere
7b46c49ded Fix / missing primary key for migration 2020-04-29 16:35:50 +02:00
Valere
da5672d229 Fix / ensure ux aware of wait 2020-04-29 16:18:01 +02:00
Valere
dcfd9ee7a7 Fix copy 2020-04-29 15:12:07 +02:00
ganfra
35a6f90ed6 Create configure script for template 2020-04-29 14:41:45 +02:00
ganfra
d463e5e500 Create template 2020-04-29 14:38:01 +02:00
Valere
0f00597444 Fix / Regression on non e2e device
+ migrate to new rx objects
2020-04-29 12:35:22 +02:00
Valere
a806f70b35 New security alert to review old sessions 2020-04-29 12:04:59 +02:00
Benoit Marty
67f07bd1bb Merge pull request #1297 from vector-im/feature/xsigning_trust_optimization
Feature/xsigning trust optimization
2020-04-29 10:32:29 +02:00
Valere
39e18446ae fix typo 2020-04-29 09:34:28 +02:00
Benoit Marty
4dc0b00569 Import string from Matrix SDK 2020-04-28 23:54:35 +02:00
Benoit Marty
87979ccadd Merge pull request #1299 from vector-im/feature/emoji_perf
Emoji completion for 🎉
2020-04-28 23:41:02 +02:00
Benoit Marty
7c2a5af8f2 Merge pull request #1301 from vector-im/feature/strings
Feature/strings
2020-04-28 23:40:39 +02:00
Benoit Marty
dc6d4c6789 Remove problematic translation 2020-04-28 21:54:14 +02:00
Benoit Marty
db3d5e2677 Remove not used anymore translations 2020-04-28 21:36:34 +02:00
Benoit Marty
6dc8bdde04 Import translation from Riot-Android 2020-04-28 21:35:39 +02:00
Valere
c02cfb2f4f Merge pull request #1296 from vector-im/feature/untrusted_session_shields
Update manage sessions screen
2020-04-28 19:17:00 +02:00
Valere
947c46d7b5 Avoid negative margin 2020-04-28 19:16:29 +02:00
ganfra
8942ce964a Fix android test not compiling 2020-04-28 19:09:20 +02:00
Valere
a05c401892 Code review 2020-04-28 18:47:54 +02:00
onurays
f25c981173 Add menu item to invite users to the room. 2020-04-28 17:30:23 +03:00
ganfra
43055964ba Crypto store : avoid copying before mapping to other data 2020-04-28 16:26:04 +02:00
Benoit Marty
a4192a0761 Emoji completion 🎉 does not completes to 🎉 like on web (#1285) 2020-04-28 14:29:43 +02:00
Benoit Marty
9c8ff7de7f Add Android test for EmojiDataSource 2020-04-28 14:15:50 +02:00
Benoit Marty
b4247c89e4 Make fun internal 2020-04-28 14:15:50 +02:00
Valere
cdabca6def Fix copy 2020-04-28 13:20:30 +02:00
Valere
2d6f0205a4 Update manage sessions screen 2020-04-28 13:20:30 +02:00
ganfra
4e8177f738 Fix lint 2020-04-28 13:10:44 +02:00
Valere
798e9e4fde Merge pull request #1287 from vector-im/feature/improve_security_toaster
Remember ignored unknown sessions
2020-04-28 12:38:14 +02:00
Valere
8871390167 Code review 2020-04-28 12:25:50 +02:00
ganfra
fc86e7e1f6 ShieldTrust: use only active members 2020-04-28 11:00:41 +02:00
ganfra
21912c290a XSigning keys: use json instead of object serialization 2020-04-28 10:59:51 +02:00
Benoit Marty
df335c7aa3 Merge pull request #1290 from vector-im/feature/cleanup_ui_state
Clear preferences when user logs out
2020-04-28 10:54:48 +02:00
Benoit Marty
8bd4cc8f54 Merge pull request #1277 from vector-im/feature/sso
Use correct sso url
2020-04-27 14:36:37 +02:00
Benoit Marty
4e3df99e42 Merge pull request #1281 from vector-im/feature/various_issues_verification_ssss_bootstrap
Feature/various issues verification ssss bootstrap
2020-04-27 14:32:18 +02:00
Benoit Marty
b1e1b4a7dc Remove "Reset keys" developer action 2020-04-27 14:25:45 +02:00
Benoit Marty
a233e9b0a0 Avoid code duplication, and improve readability 2020-04-27 14:25:45 +02:00
Benoit Marty
ebecb9bb9a i18n 2020-04-27 14:25:07 +02:00
Benoit Marty
35962c3cb5 Do not propose bootsrap for SSO accounts
Because we do not support yet confirming account credentials using SSO
2020-04-27 14:25:07 +02:00
Benoit Marty
0ac6a26b6e Add "continue" button to the bootstrap bottom sheet 2020-04-27 14:25:07 +02:00
Benoit Marty
0a887c0926 Cleanup 2020-04-27 14:25:07 +02:00
Benoit Marty
54c0239969 fix layout issue when text is displayed on 2 lines 2020-04-27 14:25:07 +02:00
Benoit Marty
8559254593 Merge pull request #1289 from vector-im/feature/fix-edited_event_click
Do not handle url if it is not valid.
2020-04-27 14:24:25 +02:00
onurays
626eb4d06b Comments added to explain why we should check if the url is valid. 2020-04-27 13:44:16 +03:00
Benoit Marty
aa16ba88ae Add hint to translators 2020-04-27 12:41:47 +02:00
Benoit Marty
a633c11c1d Do not clear developer preference when logging out 2020-04-27 12:29:38 +02:00
Benoit Marty
a4931e21ae Clear sharedPreference when logging out 2020-04-27 12:26:19 +02:00
Valere
996fabb327 Merge pull request #1288 from vector-im/feature/fix_update_4s_backup_after_bootstrap
Fix / backup key was not save in 4S after bootstrap
2020-04-27 11:42:09 +02:00
onurays
6c4e71d7d4 Do not handle url if it is not valid. 2020-04-27 12:26:35 +03:00
Valere
ad0ad502aa Fix / backup key was not save in 4S after bootstrap 2020-04-27 11:14:13 +02:00
Valere
42b47c25aa Remember ignored unknown sessions 2020-04-27 10:09:37 +02:00
Benoit Marty
7ef1970a0b Better layout preview 2020-04-27 01:17:20 +02:00
Benoit Marty
409d751612 Merge pull request #1278 from vector-im/feature/fix_misleading_url_color
Fix the color of misleading url according to design document.
2020-04-27 00:50:03 +02:00
Valere
bdce71abfd Update change log 2020-04-24 16:50:56 +02:00
Valere
114bce5f64 Fix / DB crash due to deserializaion 2020-04-24 16:50:56 +02:00
Valere
20e5ebc88b Decorate timeline with e2e warning 2020-04-24 16:50:56 +02:00
onurays
52aa57ac7c Fix the color of misleading url according to design document. 2020-04-24 17:18:59 +03:00
Benoit Marty
8daf72a4b0 Use correct URL for SSO connection (#1178) 2020-04-24 15:54:02 +02:00
Benoit Marty
51eb2cda95 Move some constants to the Matrix SDK 2020-04-24 15:53:30 +02:00
Benoit Marty
57779c99c2 improve script 2020-04-24 14:39:55 +02:00
Benoit Marty
02e02ed691 Merge pull request #1275 from vector-im/feature/log_improvement
Log improvement for test
2020-04-24 14:38:28 +02:00
Benoit Marty
af0b798ef1 Ensure Timber log output when running tests
to squash
2020-04-24 13:38:28 +02:00
Benoit Marty
51be8d5ed5 Remove previous temporary solution 2020-04-24 13:26:25 +02:00
Benoit Marty
270bed5013 EventBus logs using Timber 2020-04-24 11:57:49 +02:00
Benoit Marty
20b3c33fb0 Remove bad comment 2020-04-24 11:57:49 +02:00
Benoit Marty
b2aaf1cca1 CurlLoggingInterceptor now uses Timber to log 2020-04-24 11:57:49 +02:00
Onuray Sahin
5f6969e2cc Merge pull request #1270 from vector-im/feature/misleading_url_target
Show a warning dialog if the text of the clicked link does not match
2020-04-24 11:53:16 +03:00
Onuray Sahin
f0648ee52a Merge branch 'develop' into feature/misleading_url_target 2020-04-24 11:24:39 +03:00
Valere
88c70a2c10 Merge pull request #1266 from vector-im/feature/update_ssss_activity
Feature/update ssss activity
2020-04-23 21:20:43 +02:00
Valere
22c3ed6bb9 Code review 2020-04-23 21:20:01 +02:00
Valere
b0d25fa84f Update vector/src/main/res/values/strings_riotX.xml
Co-Authored-By: Benoit Marty <benoitm@matrix.org>
2020-04-23 21:16:46 +02:00
Valere
57636207d2 Fix copy 2020-04-23 21:16:46 +02:00
Valere
eac9133bb1 update change log 2020-04-23 21:16:46 +02:00
Valere
f7e7659750 klint 2020-04-23 21:16:28 +02:00
Valere
e719541b5e Fix / crash when generating random key 2020-04-23 21:16:28 +02:00
Valere
bd7acfbb1a Add option to recover with recovery key 2020-04-23 21:16:28 +02:00
Valere
25b42cb4f3 Merge pull request #1272 from vector-im/feature/update_design_complete_secu
Update design wait for self verification
2020-04-23 21:14:02 +02:00
Valere
928149fe35 Merge branch 'develop' into feature/update_design_complete_secu 2020-04-23 21:13:53 +02:00
Onuray Sahin
a80181da9e Merge branch 'develop' into feature/misleading_url_target 2020-04-23 20:18:44 +03:00
onurays
72de5d6adc Code review fixes. 2020-04-23 20:17:52 +03:00
Benoit Marty
ed4154d763 Merge pull request #1261 from vector-im/feature/unwedging
Feature/unwedging
2020-04-23 18:20:31 +02:00
Benoit Marty
4ee13b6fa1 Merge branch 'develop' into feature/unwedging 2020-04-23 18:20:09 +02:00
Benoit Marty
33fb1dd147 Merge pull request #1262 from vector-im/feature/fix_add_by_user_id
Add user to direct chat by user id.
2020-04-23 18:05:15 +02:00
Valere
736905edf8 Merge pull request #1269 from vector-im/feature/complete_security_hide_4s
Hide Use recovery key when 4S is not setup
2020-04-23 18:03:14 +02:00
Benoit Marty
e8a91eab88 Merge pull request #1265 from vector-im/feature/deactivate
Deactivate account using password
2020-04-23 17:30:08 +02:00
Valere
b951af0116 RiotX spelling 2020-04-23 17:00:37 +02:00
onurays
c3299845c1 use generic cancel and continue strings. 2020-04-23 17:44:30 +03:00
onurays
54644db587 Dialog design fixes. 2020-04-23 17:37:30 +03:00
Valere
cb0e93c43e use theme notice color 2020-04-23 16:23:36 +02:00
Valere
4c4ec6cfe8 Code review accessibility 2020-04-23 16:13:19 +02:00
Valere
449be02f53 update icon tint 2020-04-23 16:05:43 +02:00
Valere
25d2c2e2c6 Update design wait for self verification 2020-04-23 15:45:21 +02:00
onurays
ec2ba7c0b2 Do not warn if the domain of urls are the same and colorize links. 2020-04-23 16:30:37 +03:00
onurays
06a13d5c20 Show a warning dialog if the text of the clicked link does not match the link target
Fixes #922
2020-04-23 15:42:57 +03:00
Valere
7e0591ffee Hide Use recovery key when 4S is not setup 2020-04-23 11:14:20 +02:00
Benoit Marty
1363100f94 Create DM: now any userId can be entered, so deal with the case of the userId does not exists.
Use same string resource value than Riot-Web
2020-04-22 23:03:04 +02:00
Benoit Marty
06cf59bca7 Even if it's not happening, do not add the search term if already present in the results. 2020-04-22 19:20:13 +02:00
Valere
e37dd547b8 code review 2020-04-22 18:50:59 +02:00
Benoit Marty
671c1259af Merge pull request #1239 from waylon531/develop
Use a bigger thread pool
2020-04-22 18:23:37 +02:00
Benoit Marty
3d07ccd98e auto-review. Password could be only spaces... 2020-04-22 18:03:47 +02:00
Benoit Marty
03b9774c56 ktlint 2020-04-22 17:56:13 +02:00
Benoit Marty
0f1ddee71c Use SwitchCompat 2020-04-22 17:54:25 +02:00
Benoit Marty
855efa93cc Remove cancel button, useless. 2020-04-22 17:29:34 +02:00
Valere
d0f776a9cf Discard session command only encrypted room 2020-04-22 16:41:34 +02:00
Benoit Marty
da66e38c68 Close drawer when opening settings 2020-04-22 16:02:06 +02:00
Benoit Marty
a4ba8c152d Add IME action to the password field 2020-04-22 15:51:34 +02:00
Valere
9b320ed3c7 Fix unwedging 2020-04-22 15:40:59 +02:00
Benoit Marty
c854491248 Be more robust 2020-04-22 15:00:04 +02:00
Benoit Marty
5755d5bfaa Deactivate account: unit test and cleanup 2020-04-22 14:36:01 +02:00
Benoit Marty
ff320fec55 Move internal class to internal package 2020-04-21 20:47:49 +02:00
Benoit Marty
8c8a84b039 Account deactivation: the task does the cleanup 2020-04-21 20:41:10 +02:00
Benoit Marty
045e3d7bae Account deactivation (with password only) (#35) 2020-04-21 20:31:54 +02:00
Valere
491f0e6032 Merge pull request #1259 from vector-im/feature/restore_backup_from_ssss
KeyBackup / Use 4S if key in quadS
2020-04-21 14:31:26 +02:00
onurays
3163bc8b80 Add user to direct chat by user id.
Fixes #1065
2020-04-21 15:25:48 +03:00
Benoit Marty
eca3bf0817 typo 2020-04-21 13:49:36 +02:00
Valere
63355ca256 code review 2020-04-21 11:06:56 +02:00
Benoit Marty
c39a0e4fd5 timout -> timeout 2020-04-21 00:29:44 +02:00
Benoit Marty
59280ed18e Small improvement in documentation 2020-04-21 00:29:02 +02:00
Benoit Marty
c1acb1af66 Add integration test for change password feature 2020-04-21 00:23:01 +02:00
Valere
8a4f0a0c00 KeyBackup / Use 4S if key in quadS 2020-04-20 19:21:44 +02:00
Benoit Marty
a6368c473e Restart broken Olm sessions ([MSC1719](https://github.com/matrix-org/matrix-doc/pull/1719)) 2020-04-20 18:07:14 +02:00
Benoit Marty
3615ca6b95 VersionName can be null when running integration test 2020-04-20 18:07:14 +02:00
Benoit Marty
ddb00ba23a Enable Timber log in integration tests 2020-04-20 18:07:14 +02:00
Benoit Marty
91cf4b647d var -> val 2020-04-20 18:07:14 +02:00
Benoit Marty
f989eed8b0 Use @Throws(MXCryptoError::class) 2020-04-20 18:07:14 +02:00
Benoit Marty
4d296ddc09 Avoid injecting credentials 2020-04-20 18:07:14 +02:00
Benoit Marty
6186c22e02 improve code 2020-04-20 18:07:14 +02:00
Benoit Marty
13cd13a42f Create RoomEncryptorsStore 2020-04-20 18:07:14 +02:00
Benoit Marty
a42eb42178 Avoid injecting Credentials 2020-04-20 18:07:14 +02:00
Benoit Marty
7924ef207c Add Javadoc 2020-04-20 18:07:14 +02:00
Benoit Marty
5900245018 Make the test fail before unwedging implementation 2020-04-20 18:07:14 +02:00
Benoit Marty
00c239bc42 cleanup 2020-04-20 18:07:14 +02:00
Benoit Marty
0cb43eef51 Add test for Unwedging (before implementing it) 2020-04-20 18:07:14 +02:00
Benoit Marty
41a8f40241 Improve API 2020-04-20 18:07:14 +02:00
Benoit Marty
a8641ef879 Split KeysBackup to several files. No other change. 2020-04-20 18:07:14 +02:00
Benoit Marty
4d207e6acd Merge pull request #1258 from vector-im/feature/strings
Strings
2020-04-20 17:41:50 +02:00
Valere
1227de3f9c Merge pull request #1256 from vector-im/feature/increase_default_timeout
Increase default timeout to match old riot
2020-04-20 17:13:59 +02:00
Benoit Marty
6cad129625 Still waiting for translation update 2020-04-20 16:13:16 +02:00
Benoit Marty
9ccf51fbc0 Import string from Riot - new strings 2020-04-20 15:20:08 +02:00
Benoit Marty
990867204e Import string from Riot 2020-04-20 15:17:14 +02:00
Onuray Sahin
5795b7e063 Merge pull request #1242 from vector-im/feature/save_media_to_gallery
Save media files to Gallery
2020-04-20 13:24:33 +03:00
Valere
b612a7e63c Merge pull request #1252 from vector-im/feature/fix_device_detection_debounce
Avoid unnecessary /device call
2020-04-20 12:07:17 +02:00
Valere
50c73b68aa cleaning 2020-04-20 11:31:42 +02:00
Valere
c7ac5e2293 Increase default timeout to match old riot 2020-04-20 11:26:03 +02:00
Valere
43cb1fe68b Code review 2020-04-20 11:12:35 +02:00
onurays
f807de9a83 Lint fix. 2020-04-20 11:53:33 +03:00
Onuray Sahin
754f220596 Merge branch 'develop' into feature/save_media_to_gallery 2020-04-20 11:21:14 +03:00
onurays
3f7ca8669a Remove duplicated save icon. 2020-04-20 00:48:52 +03:00
Valere
28c6921a0a Avoid unnecessary /device call 2020-04-17 18:08:29 +02:00
onurays
26bb8ce2be Give user a toast after adding media file to the gallery. 2020-04-17 16:53:40 +03:00
onurays
8434f9326e Save action added to bottom sheet. 2020-04-17 15:27:42 +03:00
Waylon Cude
68f93c6c31 Merge branch 'develop' of https://github.com/vector-im/riotX-android into develop
Signed-off-by: Waylon Cude <waylon.cude@finzdani.net>
2020-04-16 12:19:17 -07:00
Benoit Marty
7961423556 Merge pull request #1244 from vector-im/feature/media_path
Fix download and upload media path
2020-04-16 17:58:08 +02:00
Benoit Marty
ac07fb47d7 Better Kotlin code 2020-04-16 17:42:55 +02:00
Valere
fbcbd6def5 Merge pull request #1243 from vector-im/feature/update_x_signing_copy
Feature/update x signing copy
2020-04-16 17:30:11 +02:00
Valere
3fe15f2d45 code review 2020-04-16 17:02:01 +02:00
Valere
968377a5be Update vector/src/main/res/values/strings_riotX.xml
Co-Authored-By: Benoit Marty <benoitm@matrix.org>
2020-04-16 16:53:24 +02:00
Benoit Marty
5652140f5d Improve ContentUrlResolver 2020-04-16 16:41:45 +02:00
Benoit Marty
e97c95f40a Fix issue with media path (Fixes #1227) 2020-04-16 16:41:45 +02:00
Valere
7ac5f58f32 Show CrossSigning info even if not developer mode 2020-04-16 16:30:45 +02:00
Valere
ce2f4e163d Update password/recovery copy + update icons 2020-04-16 16:30:45 +02:00
Benoit Marty
cc94b6cf7d Merge pull request #1116 from vector-im/feature/worker_manager
Add some documentation on Workers
2020-04-16 16:28:20 +02:00
onurays
ab3cc90ed5 Share menu item added to video media viewer. 2020-04-16 16:46:00 +03:00
Valere
614127e46b Merge pull request #1240 from vector-im/feature/update_security_notice
Feature/update security notice
2020-04-16 15:33:54 +02:00
Valere
66fc38ad4b Remove GlobalScope usage 2020-04-16 15:09:16 +02:00
Valere
f68e84d9da Update toaster to match web 2020-04-16 15:09:16 +02:00
onurays
2b2e6dd6f8 Share menu item added to image media viewer. 2020-04-16 16:04:37 +03:00
Valere
621e78a864 Merge pull request #1235 from vector-im/feature/upgrate_cross_signing
Add migration state to bootstrap
2020-04-16 15:04:06 +02:00
Benoit Marty
828e972c74 Split long lines 2020-04-16 14:35:55 +02:00
Benoit Marty
15bd7d1c5b Change the regex to detect long lines to allow schema with UTF-8 chars 2020-04-16 14:35:23 +02:00
Benoit Marty
79e81dbdde ktlint 2020-04-16 14:01:15 +02:00
Benoit Marty
f93f50b582 Code readability 2020-04-16 14:00:24 +02:00
Benoit Marty
d934f92ebd Fix bad apostrophe 2020-04-16 13:58:54 +02:00
Waylon Cude
d20cf484ff Merge branch 'develop' of https://github.com/vector-im/riotX-android into develop
Signed-off-by: Waylon Cude <waylon.cude@finzdani.net>
2020-04-16 03:10:06 -07:00
Waylon Cude
ec4458e84a Updated CHANGES.md
Signed-off-by: Waylon Cude <waylon.cude@finzdani.net>
2020-04-16 02:50:58 -07:00
waylon531
6c1719e365 Use a bigger thread pool
This patch makes RiotX use an unbounded thread pool to handle
connections. The default thread pool for the android WorkManager has a
fairly anemic number of threads and I suspect this was causing
performance issues especially because of all the long-running jobs that
happen whenever you sync.

I tested this out on my phone and all of the sluggishness appears to
have gone away. I tested both the debug and release builds to make sure
it wasn't just some release optimization. RiotX is so much snappier now!

This fixes #1221

Signed-off-by: Waylon Cude <waylon.cude@finzdani.net>
2020-04-16 02:44:31 -07:00
Benoit Marty
467f48f1a6 Merge remote-tracking branch 'origin/develop' into develop 2020-04-16 11:33:22 +02:00
Valere
a44cb876c9 move strings to resources 2020-04-16 11:30:10 +02:00
Valere
e79c824913 Fix / password visibility initial state bug 2020-04-16 11:30:10 +02:00
Valere
b8e9cc70f2 fix / line too long 2020-04-16 11:30:10 +02:00
Valere
a2f32307f0 Support back from migrate recovery key 2020-04-16 11:30:10 +02:00
Valere
c1d39cefd5 Fix / avoid upgrade secu popup on account creation 2020-04-16 11:30:10 +02:00
Valere
0edc562120 Fix / test compilation 2020-04-16 11:30:10 +02:00
Valere
8ae2f06044 Add change log 2020-04-16 11:30:10 +02:00
Valere
aa496e6efb Add migration state to bootstrap 2020-04-16 11:30:10 +02:00
Benoit Marty
1372192031 Merge pull request #1091 from vector-im/feature/secure
Add a setting to prevent screenshot of the application, disabled by default (#1027)
2020-04-16 11:27:59 +02:00
Benoit Marty
ea03f76847 Merge pull request #1129 from vector-im/feature/update_password
Change password function implemented.
2020-04-16 11:26:33 +02:00
Benoit Marty
d74a5f9979 Typo 2020-04-16 11:23:41 +02:00
Benoit Marty
febadcc4f6 Merge pull request #1238 from vector-im/feature/thumbnail_info
`mimetype` field is optional
2020-04-16 10:57:29 +02:00
Benoit Marty
17ece54cb0 mimetype field is optional 2020-04-16 10:28:23 +02:00
Benoit Marty
da04a74350 Merge pull request #1143 from MatMaul/refresh-summary
Refresh the whole notifs when cleaning one so the summary get updated
2020-04-15 17:29:36 +02:00
Benoit Marty
634c8947bd Merge branch 'develop' into refresh-summary 2020-04-15 17:29:08 +02:00
Benoit Marty
f6f6fa99fb Merge pull request #1223 from vector-im/feature/cross_signing_as_task
Make initialize cross signing as a task
2020-04-15 17:21:25 +02:00
Benoit Marty
dcfbfc4981 Merge pull request #1230 from vector-im/feature/fix_download_file
Catch network errors during file downloading.
2020-04-15 16:54:31 +02:00
Benoit Marty
6201a9b8ef Merge branch 'develop' into feature/fix_download_file 2020-04-15 16:52:40 +02:00
Benoit Marty
1981d2e9ac Merge pull request #1233 from vector-im/feature/fix_local_echo_no_update
Fix / sending event not always updating
2020-04-15 16:51:16 +02:00
Benoit Marty
66f6b1ecac Merge pull request #1224 from vector-im/feature/composer_shield
Add shield in composer
2020-04-15 16:49:50 +02:00
Benoit Marty
affe2b59da Fix crash 2020-04-15 16:40:01 +02:00
Benoit Marty
757f8ec96a Change password: prevent cancellation when processing 2020-04-15 16:39:05 +02:00
Benoit Marty
bf5e2b96df Change password: bigger margins 2020-04-15 16:39:05 +02:00
Benoit Marty
5666965321 Change password: do not trim passwords 2020-04-15 16:39:05 +02:00
Benoit Marty
7bf1f916c4 Change password: lambda 2020-04-15 16:39:05 +02:00
Benoit Marty
d44e43d94b Change password: update wording of button (Nad's request) 2020-04-15 16:39:05 +02:00
Benoit Marty
9fe32fe915 Change password: hide the preference (as Riot-Web does) if it is not possible to change the password. 2020-04-15 16:39:05 +02:00
Benoit Marty
e21cb3082b Change password: update preference summary. Some people think we know the password. Using Riot-web wording 2020-04-15 16:39:05 +02:00
Benoit Marty
c50bc10f92 Code review: improve layout 2020-04-15 16:38:44 +02:00
Benoit Marty
1b416028b4 Code review: inline the error instead of using toast 2020-04-15 16:38:44 +02:00
Benoit Marty
85493b7532 Code review: use isInvalidPassword() extension everywhere. Also be robust if the Fragment is destroyed 2020-04-15 16:38:44 +02:00
onurays
dbabe0232f Do not override the default timeout. 2020-04-15 16:38:44 +02:00
onurays
dfc8e8ec4c AccountService is created. 2020-04-15 16:38:44 +02:00
onurays
f00db49bda Change password function implemented.
Fixes #528
2020-04-15 16:38:44 +02:00
onurays
b4a3eb2cb3 Fix return the exception instead of empty one. 2020-04-15 16:39:41 +03:00
Valere
81012746c4 Code review / added new key for message hint 2020-04-15 15:39:23 +02:00
Valere
1deacfbb34 Code review 2020-04-15 15:37:43 +02:00
Valere
c35d854776 Add shield in composer 2020-04-15 15:37:43 +02:00
Benoit Marty
c0fa259b40 Add a setting to prevent screenshot of the application, disabled by default (#1027) 2020-04-15 15:04:19 +02:00
Benoit Marty
391d3cb6b5 Merge pull request #1186 from duncanturk/improvement-957-catchup-indicator-on-invite
Fix #957 catchup indicator on invite
2020-04-15 15:02:16 +02:00
Benoit Marty
6d56220d98 Merge branch 'develop' into improvement-957-catchup-indicator-on-invite 2020-04-15 15:00:34 +02:00
Nolan Darilek
2e4d30ef29 Set tickerText to improve accessibility of notifications.
Signed-off-by: Nolan Darilek <nolan@thewordnerd.info>
2020-04-15 07:43:41 -05:00
Benoit Marty
c57fa3f0d0 Merge pull request #1176 from vector-im/feature/target-sdk-29
Increase targetSdk to 29
2020-04-15 14:32:16 +02:00
Benoit Marty
f2bca51046 Merge pull request #1232 from vector-im/feature/translations
string sync
2020-04-15 14:24:39 +02:00
Benoit Marty
6751d88ade Remove .idea exclusion 2020-04-15 13:00:03 +02:00
Benoit Marty
e26a0bc9ae Add Android SDK version 2020-04-15 12:57:15 +02:00
Benoit Marty
6dc517584f Fix merge issue 2020-04-15 12:56:33 +02:00
Benoit Marty
24d0cdef1f Add missing changes of SDK version and build tools 2020-04-15 12:53:28 +02:00
Benoit Marty
6639f89a68 Simpler code 2020-04-15 12:53:08 +02:00
Benoit Marty
0c0e9521f5 Fix lint issue 2020-04-15 09:50:25 +02:00
Valere
f2b684aa9e Fix / user and self signing failing
bad copy paste
2020-04-14 18:23:20 +02:00
Valere
68ca0e9d4b Fix / sending event not always updating 2020-04-14 17:35:11 +02:00
Benoit Marty
e54077e020 String copied to Riot project 2020-04-14 17:26:23 +02:00
Benoit Marty
9111800e7a Create specific string for RiotX 2020-04-14 17:23:59 +02:00
Benoit Marty
ef6847671a Import strings from Riot 2020-04-14 17:13:43 +02:00
Benoit Marty
b8cb0588fe Add new resources 2020-04-14 17:06:05 +02:00
onurays
667b371653 Continue supporting old APIs. 2020-04-14 16:29:11 +03:00
onurays
190fbb95ec Merge branch 'develop' into feature/target-sdk-29
# Conflicts:
#	vector/src/main/java/im/vector/riotx/features/crypto/verification/VerificationBottomSheetViewModel.kt
2020-04-14 13:59:54 +03:00
onurays
f97e08b4e5 Remove .gitignore which belongs to another PR. 2020-04-14 13:12:17 +03:00
onurays
7242cbda40 Catch network errors during file downloading.
Fixes #1229
2020-04-13 17:48:19 +03:00
Valere
9e3011d4c8 Make initialize cross signing as a task 2020-04-10 17:04:34 +02:00
Valere
eb50256af7 Merge pull request #1222 from vector-im/feature/verification_unified_emoji
Uniform emoji representation for all platform
2020-04-10 16:05:42 +02:00
Valere
ccacd20428 Merge branch 'develop' into feature/verification_unified_emoji 2020-04-10 16:05:33 +02:00
Valere
ac46fe9e16 Merge pull request #1218 from vector-im/feature/scan_confirm_update
Feature/scan confirm update
2020-04-10 16:05:02 +02:00
Valere
9cfb83f0d2 Remove outdated translation 2020-04-10 14:31:03 +02:00
Valere
943ba3bebd Fix / string bad argument number - lint 2020-04-10 13:14:12 +02:00
Valere
fccfd00949 Fix / design update 2020-04-10 12:12:21 +02:00
Valere
68323057aa Update change log 2020-04-10 12:12:21 +02:00
Valere
5081361c2d Update Scan confirm flow 2020-04-10 12:12:06 +02:00
Valere
3ba619d45c Merge pull request #1215 from vector-im/feature/ssss_and_backup
Fixes #1214
2020-04-10 12:10:42 +02:00
Valere
f5dc0b38ff Code review 2020-04-10 11:47:54 +02:00
Valere
8357abd455 Added prefix to resources to avoid accidental override 2020-04-10 11:18:41 +02:00
Valere
ede899d78e Fix / Bad smiley emojii 2020-04-10 11:09:16 +02:00
Valere
a703574004 Uniform emoji representation for all platform 2020-04-10 11:02:33 +02:00
Christopher Rossbach
ef2abbfbd4 Merge branch 'develop' into improvement-957-catchup-indicator-on-invite 2020-04-09 11:11:44 +02:00
Valere
7c0137e2dc Fix / await callback suspend forever 2020-04-09 10:46:52 +02:00
Valere
34dec64d9c Fixes #1214 2020-04-08 17:56:12 +02:00
Valere
3968bb3488 Merge pull request #1213 from vector-im/feature/timeline_sum_item
Feature/timeline sum item
2020-04-08 17:08:53 +02:00
Valere
6f2d7aebba code review 2020-04-08 16:37:52 +02:00
Valere
366a35913b Fix alignement 2020-04-08 16:31:01 +02:00
Valere
aec49fe542 Change log 2020-04-08 16:31:01 +02:00
Valere
f04d8b0e03 cleaning 2020-04-08 16:31:01 +02:00
Valere
08af61b778 rename layout 2020-04-08 16:31:01 +02:00
Valere
277f35a352 Merge room creation events in one summary 2020-04-08 16:31:01 +02:00
Valere
68512e475f WIP 2020-04-08 16:31:01 +02:00
Valere
0eff00ebee Merge pull request #1211 from vector-im/feature/fix_gossiping_to_early
Fix / Send gossip request on other done received
2020-04-08 16:30:17 +02:00
Onuray Sahin
8a4a288074 Merge branch 'develop' into feature/target-sdk-29 2020-04-08 14:15:02 +03:00
onurays
5b1f887760 Code review fixes. 2020-04-08 14:10:31 +03:00
onurays
dcb6af6c45 .gitignore file added. 2020-04-08 12:40:29 +03:00
Christopher Rossbach
3ff5952417 Merge branch 'develop' into improvement-957-catchup-indicator-on-invite 2020-04-07 20:53:31 +02:00
Valere
b480eb3688 Update change log 2020-04-07 19:20:49 +02:00
Valere
12abca1b80 Fix / Send gossip request on other done received 2020-04-07 19:09:56 +02:00
Valere
1d8ed387bc Merge pull request #1206 from vector-im/feature/gossip_keybackup_key
Feature/gossip keybackup key
2020-04-07 18:06:05 +02:00
Christopher Rossbach
5521c094f7 fix typing difference 2020-04-07 17:50:01 +02:00
Christopher Rossbach
222b72a014 Merge branch 'develop' into improvement-957-catchup-indicator-on-invite 2020-04-07 17:46:23 +02:00
Valere
8904ca27f2 clean 2020-04-07 15:30:19 +02:00
Valere
6c5da97c16 code review 2020-04-07 15:25:31 +02:00
Valere
d4d73db5ae keybackup gossip test 2020-04-07 15:15:45 +02:00
Valere
1a436f962f update change log
cleaning
2020-04-07 15:15:45 +02:00
Valere
dc61ee61f5 Fix / wrong export format 2020-04-07 15:15:45 +02:00
Valere
5b4b5e7a57 Gossip keybackup key after verification! 2020-04-07 15:15:45 +02:00
Valere
0164f94047 Merge pull request #1198 from vector-im/feature/crosssigning_bootstrap
Feature/crosssigning bootstrap
2020-04-07 15:14:54 +02:00
Valere
153587bd82 Merge branch 'develop' into feature/crosssigning_bootstrap 2020-04-07 15:14:43 +02:00
Valere
326f2e99fb klint 2020-04-06 10:00:59 +02:00
Valere
1dfd6f232a Code quality / line too long 2020-04-03 18:59:21 +02:00
Valere
42d61944b5 Merge pull request #1204 from vector-im/feature/increase_file_log_size
Increase file logger size
2020-04-03 16:40:18 +02:00
Valere
50a8ffeca1 Merge pull request #1203 from vector-im/feature/fix_e2e_null_alg
Feature/fix e2e null alg
2020-04-03 15:57:56 +02:00
Valere
f605bb8270 Code review 2020-04-03 15:57:05 +02:00
Valere
7ffb6113a4 Increase file logger size 2020-04-03 13:53:34 +02:00
Valere
156e6114c1 Updade change log 2020-04-03 13:43:40 +02:00
Valere
c91bc82cd9 Fix / Ensure encryption set even if faield to fetch members 2020-04-03 13:35:09 +02:00
Valere
8b481e2294 Remove dead code 2020-04-03 13:34:38 +02:00
Valere
92bf3f1349 Update change log
+ code quality
2020-04-03 11:14:14 +02:00
Valere
6474735662 Fix / devtools was not showing all json numbers 2020-04-03 10:31:44 +02:00
Valere
45c5626267 Add generate key option 2020-04-02 18:30:43 +02:00
Valere
c27264761d Back /Skip navigation 2020-04-02 18:11:52 +02:00
Valere
c6abfa14ea Fix / Bind continue button 2020-04-02 16:54:30 +02:00
Valere
2f237cf17b klint 2020-04-02 16:51:40 +02:00
Valere
bf5ba99653 Full bootstrap flow initial commit 2020-04-02 16:51:03 +02:00
Valere
8ecdac7c31 Fixes #1191 2020-03-31 17:08:11 +02:00
Valere
a40dd31543 Bootstrap bottomsheet 2020-03-27 17:09:18 +01:00
Christopher Rossbach
dff89cb2e1 document changes
Signed-off-by: Christopher Rossbach <31703168+duncanturk@users.noreply.github.com>
2020-03-27 14:41:48 +01:00
Christopher Rossbach
cdbb657961 Fix #957 by incrementing the catchup count on home icon.
Signed-off-by: Christopher Rossbach <31703168+duncanturk@users.noreply.github.com>
2020-03-27 14:24:42 +01:00
Onuray Sahin
443d45db6a Merge branch 'develop' into feature/target-sdk-29 2020-03-27 12:21:39 +03:00
Valere
a995615f87 Fix / protect against crash during migration 2020-03-26 18:20:12 +01:00
Valere
024c62515c Merge pull request #1181 from vector-im/feature/update_shield_logic
Update shield logic for DM
2020-03-26 16:58:10 +01:00
Valere
75e66a6550 Merge branch 'develop' into feature/update_shield_logic 2020-03-26 16:58:01 +01:00
Onuray Sahin
e2f7890bb8 Merge branch 'develop' into feature/target-sdk-29 2020-03-26 17:39:22 +03:00
onurays
0a77d5014e Fix nullability issues. 2020-03-26 17:19:29 +03:00
Valere
91464a071e Merge pull request #1180 from vector-im/feature/complete_security_design_update
Feature/complete security design update
2020-03-26 14:31:09 +01:00
Valere
5244612ef6 Update shield logic for DM 2020-03-26 14:26:34 +01:00
Valere
e51439ade0 updage change log 2020-03-26 14:10:19 +01:00
Valere
acd90657c7 Fix / prevent cancel when in conclusion fragment 2020-03-26 14:09:41 +01:00
onurays
e5482d48c0 Remove deprecated & unused ImageTools class. 2020-03-26 16:02:50 +03:00
onurays
5816a04a37 Use MediaStore instead of deprecated addCompletedDownload since Android Q. 2020-03-26 15:58:31 +03:00
onurays
4b7da9ae6b Replace deprecated getExternalStoragePublicDirectory with getExternalFilesDir. 2020-03-26 15:57:21 +03:00
onurays
f7cbc01023 Replace deprecated PreferenceManager with androidx version. 2020-03-26 15:56:33 +03:00
Valere
1de57bbf3b Fix / cancel copy when verifying other 2020-03-26 13:49:48 +01:00
Valere
42a8c561db Fix / Verification was not cancelled on back in ready state 2020-03-26 13:49:48 +01:00
Valere
5bef9aef6a Fix / add specific copy for other verif cancel confirm 2020-03-26 13:49:48 +01:00
Valere
f8c1ec985f re-prompt to verify on restart 2020-03-26 13:49:48 +01:00
onurays
12429d8091 Merge develop into the branch. 2020-03-26 14:39:50 +03:00
Onuray Sahin
3bb5e127d6 Merge pull request #1155 from vector-im/feature/multipicker
Multiple attachment picker implementation
2020-03-26 14:30:02 +03:00
Valere
1d46b523b9 Merge pull request #1172 from vector-im/feature/ensure_olm_account_unicity
Feature/ensure olm account unicity
2020-03-26 12:11:09 +01:00
Valere
6721f337bd Merge branch 'develop' into feature/ensure_olm_account_unicity 2020-03-26 12:11:00 +01:00
Valere
535cdf0ef5 Merge pull request #1162 from vector-im/feature/xs_detect_new_session
Feature/xs detect new session
2020-03-26 12:06:18 +01:00
Valere
19990b27bb Code review 2020-03-26 10:52:02 +01:00
Valere
4b3c5d5135 update change log 2020-03-26 10:35:43 +01:00
Valere
b6fe80faf4 Fix / device key could be rotated
MXOlmDevice constructor access IMXStore before is open (dagger)
2020-03-26 10:35:43 +01:00
Valere
638970fa77 Merge pull request #1175 from vector-im/feature/fix_ssss_symetric_get_secret
Fixes #1174
2020-03-26 10:34:49 +01:00
onurays
c63f3edb06 Initial fixes to support targetSdk 29. 2020-03-26 12:06:50 +03:00
Valere
9a6fe1af4e Fixes #1174 2020-03-26 09:49:34 +01:00
onurays
a01482dca4 Use Timber log instead of printStackTrace. 2020-03-25 18:51:55 +03:00
onurays
5db1010e47 Catch exceptions if the file cannot be decoded. 2020-03-25 18:39:35 +03:00
onurays
6130a0a654 Remove unused toString(). 2020-03-25 18:34:04 +03:00
onurays
3c1e1090e7 Avoid UNCHECKED_CAST. 2020-03-25 18:20:34 +03:00
onurays
5cb47dae35 Return a failure message if the file cannot be opened. 2020-03-25 18:03:20 +03:00
onurays
f68e98b2c7 Do not resize video thumbnail. 2020-03-25 17:35:18 +03:00
Valere
420a55da76 klint 2020-03-25 13:53:06 +01:00
onurays
f9aed28732 grantUriPermission to handle incoming sharing. 2020-03-25 15:51:15 +03:00
Valere
e30c17eab7 Update Changes log 2020-03-24 18:09:54 +01:00
Valere
2c9a8865bf Cancel all on going to settings 2020-03-24 17:48:16 +01:00
Valere
bddd70afdb Fix / IllegalState after token invalidation 2020-03-24 17:48:01 +01:00
Valere
c4388348f7 Show cancelled screen instead of dismissing 2020-03-24 17:38:46 +01:00
Valere
ee7828a445 Code quality 2020-03-24 16:21:22 +01:00
Valere
37ac45c90a Fix / handling of back 2020-03-24 15:51:09 +01:00
Valere
63d3bf93f2 Fix / for now keep old toaster 2020-03-24 15:50:49 +01:00
Valere
2de8865730 Fix / Key Request recipients 2020-03-24 15:49:41 +01:00
Valere
fcffe1f3c3 Clear alert when device is verified 2020-03-24 15:21:03 +01:00
Valere
cfcec04029 code cleaning 2020-03-24 14:57:51 +01:00
Valere
b56a41bec7 Custom alert design 2020-03-24 14:56:57 +01:00
onurays
6bf89aeac9 Remove JPEG_ prefix from file name. 2020-03-24 12:37:37 +03:00
onurays
e583c03751 Add documentation. 2020-03-24 12:32:37 +03:00
onurays
d20b1cb64a Add documentation. 2020-03-24 12:15:14 +03:00
Valere
22642e71a3 cleaning 2020-03-24 10:06:36 +01:00
Valere
6e85b20b0e Update copy for riotX default device Name 2020-03-24 10:06:30 +01:00
Valere
fcd290410e Also cancel pending request on back 2020-03-24 10:06:15 +01:00
onurays
727d86236b ImageUtils created with helper functions. 2020-03-24 11:31:27 +03:00
onurays
2651f82337 Refactor duplicated code. 2020-03-24 11:03:41 +03:00
Valere
3b62402cfe Fix / ensure keys trust is updated before checking devices 2020-03-23 19:15:29 +01:00
Valere
6cc8d1b205 Fix / concurrent start broke QR verification 2020-03-23 18:43:52 +01:00
Valere
49e5fafb2d New sign in detection flow 2020-03-23 16:27:32 +01:00
Valere
e36367c040 Fix / sending secret encryption + refactoring 2020-03-23 16:27:17 +01:00
onurays
f7fd23b153 App integration to the new multipicker library. 2020-03-23 16:31:32 +03:00
Valere
4f70c40b1a Refactor + share secret window implementation 2020-03-23 11:13:33 +01:00
onurays
5b875e0571 CameraPicker & incoming share implementation. 2020-03-22 18:27:59 +03:00
onurays
6db0de321c Initial implementation of multipicker. 2020-03-20 12:12:59 +03:00
Valere
0c1f30208d Fix / Epoxy divider not showing 2020-03-19 11:23:15 +01:00
Valere
08cfe79625 Merge pull request #1153 from vector-im/feature/fix_841
Fixes #841
2020-03-18 14:50:56 +01:00
Valere
22a599633d Merge pull request #1152 from vector-im/feature/concurrent_start_verification
Verif / handle concurrent start
2020-03-18 14:50:33 +01:00
Valere
14acbb2b4d Update changes 2020-03-18 12:06:37 +01:00
Valere
6f5bebedf8 Fixes #841 2020-03-18 11:53:38 +01:00
Valere
6fe77eba72 code review 2020-03-18 11:25:49 +01:00
Valere
286a5081ff Verif / handle concurrent start
Fixes #794
2020-03-18 10:07:57 +01:00
Valere
56c241c9bd Merge pull request #1140 from vector-im/feature/gossiping_work
Feature/gossiping work
2020-03-17 15:48:11 +01:00
Valere
68151d838f Update changes 2020-03-17 15:10:27 +01:00
Valere
572b174cfe code quality 2020-03-17 14:42:55 +01:00
Valere
b71d8185a2 Fix / gossiping sent to soon results in not getting keys
Overall improovment of logs
2020-03-17 14:40:05 +01:00
Valere
8051d9e3be cleaning 2020-03-17 14:40:05 +01:00
Valere
1bf8fef292 Fix realm migration 2020-03-17 14:40:05 +01:00
Valere
b8a9397e73 hide reRequest behind developer mode 2020-03-17 14:40:05 +01:00
Valere
009d691d5b post merge fix 2020-03-17 14:40:05 +01:00
Valere
6933159245 Remove refresh menu 2020-03-17 14:40:05 +01:00
Valere
75549c41e0 View source in audit + clean 2020-03-17 14:40:05 +01:00
Valere
5e2f888eaf Request secret from mobile to web 2020-03-17 14:40:05 +01:00
Valere
d3d6d44665 Post rebase fix 2020-03-17 14:40:05 +01:00
Valere
fc6225a7ac Gossiping refactoring 2020-03-17 14:40:05 +01:00
Valere
3639007985 Cancel transaction if failed to decrypt other part events 2020-03-17 14:40:05 +01:00
Valere
d5137897c1 Fix / crash No JsonAdapter for GossipingToDeviceObject 2020-03-17 14:40:05 +01:00
Valere
b67735c31a Incoming Secret Share request support
crypto DB migration
2020-03-17 14:40:05 +01:00
Valere
8ff31ac49d cleaning klint 2020-03-17 14:40:05 +01:00
Valere
5e0235e48d Add option to recover from backup + hide if not applicable 2020-03-17 14:40:05 +01:00
Valere
9e63a3219c Add Re-Request keys for fail to decrypt 2020-03-17 14:40:05 +01:00
Valere
757e90986e Key Req Dev tool initial commit 2020-03-17 14:40:05 +01:00
Valere
06fc5c2dd9 Log tunning 2020-03-17 14:40:05 +01:00
Valere
20dbe2dd0d version ++ 2020-03-17 14:18:08 +01:00
Valere
367f793929 Merge branch 'release/0.18.1' 2020-03-17 11:46:55 +01:00
Valere
6f56c74e9d Merge branch 'release/0.18.1' into develop 2020-03-17 11:46:55 +01:00
Valere
78d90c8f04 prepare release 0.18.1 2020-03-17 11:46:42 +01:00
Valere
75fa2904d3 Merge pull request #1149 from vector-im/feature/quick_fix_backup_update_banner
QuickFix / key banner not clickable
2020-03-17 11:12:43 +01:00
Valere
a9ed55e6a2 Fixes #757 2020-03-17 10:50:34 +01:00
Valere
b37600f536 QuickFix / key banner not clickable 2020-03-17 10:43:48 +01:00
Valere
ef2783e9f4 Merge pull request #1142 from vector-im/feature/fix_upload_error
Fix / correctly update local echo failed state
2020-03-17 09:48:43 +01:00
Valere
8827b4b5ef Fix / correctly update local echo failed state
+ endure Workmanager queues are reset after a clear cache
2020-03-17 09:47:27 +01:00
Valere
7664b716b3 Merge pull request #1146 from vector-im/feature/workaround_crash_select_gif_keyboard
WorkAround / crash android 10 gif from keyboard
2020-03-17 09:20:49 +01:00
unclejay
a2367ef14f added network proxy configuration 2020-03-16 21:12:15 +01:00
Valere
067a22883c WorkAround / crash android 10 gif from keyboard
fixes #1136
2020-03-16 16:01:55 +01:00
Valere
eb74523905 Fix / typo 2020-03-16 15:30:41 +01:00
Valere
18d82b1bea Merge pull request #1138 from vector-im/feature/join_command
Implementation of /join command (#12)
2020-03-16 10:15:25 +01:00
Mathieu Velten
687884431e Refresh the whole notifs when cleaning one so the summary get updated
Fix summary notification staying after "mark as read"
2020-03-13 23:42:28 +01:00
Valere
3c9c2e61d7 missing change log entry 2020-03-13 17:19:00 +01:00
onurays
e3246a1f2c Rename JoinedToAnotherRoom to JoinRoomCommandSucces. 2020-03-13 18:41:04 +03:00
Valere
642651a069 Merge pull request #1133 from vector-im/feature/quick_fix_redecrypt_remote_echo
Fix Message transitions in encrypted rooms
2020-03-13 12:18:59 +01:00
onurays
85a987ca8d Fix typo. 2020-03-13 14:02:42 +03:00
onurays
5cb7e455b1 Implementation of /join command. 2020-03-13 14:00:46 +03:00
Valere
7c1428e097 preserver relations as non encrypted 2020-03-12 10:05:55 +01:00
Valere
32fd4c1be9 save decryption result at encryption 2020-03-11 19:39:40 +01:00
Valere
f53fc205e1 Fix Message transitions in encrypted rooms
Fixes #518
2020-03-11 18:07:18 +01:00
Valere
54eca7525e Version ++ 2020-03-11 16:24:49 +01:00
Valere
dec591517c Merge branch 'release/0.18.0' 2020-03-11 13:41:49 +01:00
Valere
005a11b765 Merge branch 'release/0.18.0' into develop 2020-03-11 13:41:48 +01:00
Valere
d5cbcdd4e7 prepare release 0.18.0 2020-03-11 13:41:17 +01:00
Valere
fe1af4e34f Merge pull request #1131 from vector-im/feature/fix_qr_self_verification
Fix / Self verification mode 1 was not working
2020-03-11 13:19:16 +01:00
Valere
49f2064439 Fix / Self verification mode 1 was not working 2020-03-11 11:43:23 +01:00
Valere
ff5b284b2e Try to remove rule that is breaking CI 2020-03-11 11:19:22 +01:00
Valere
d9085b1231 Merge pull request #1128 from vector-im/feature/remove_runblocking_crypto
Remove dangerous runBlocking (and un-needed)
2020-03-11 10:42:48 +01:00
Valere
a9074cdbbb Remove dangerous runBlocking (and un-nedded) 2020-03-10 17:25:04 +01:00
Benoit Marty
09946ecf1b Merge pull request #1117 from vector-im/feature/pusher_fix
Pusher fix
2020-03-10 11:34:11 +01:00
Benoit Marty
d21a536542 Merge pull request #1115 from vector-im/feature/work_manager_script
Add script to dumpsys work manager data
2020-03-06 17:31:19 +01:00
Benoit Marty
937d497a1f Revert the check box in case of error 2020-03-06 17:24:57 +01:00
Benoit Marty
4261b0e78a Fix pusher issue. It was set by mistake when the notification for this device was disabled 2020-03-06 17:19:48 +01:00
Benoit Marty
71446a1a74 Remove useless check 2020-03-06 17:11:23 +01:00
Benoit Marty
a29ec7b0be Pusher: add a menu to force a refresh of the local data 2020-03-06 16:48:48 +01:00
Benoit Marty
13036a5933 Pusher: update javadoc 2020-03-06 16:37:13 +01:00
Benoit Marty
a8e19f3cc9 Understanding things 2020-03-06 15:57:49 +01:00
Benoit Marty
cb4752812a Hide private key 2020-03-06 15:53:55 +01:00
Benoit Marty
ccd9d2961d Cleanup 2020-03-06 15:45:39 +01:00
Benoit Marty
d1db17f244 Add doc on workers 2020-03-06 15:45:26 +01:00
Benoit Marty
aa4327c4da Add doc and log error from the workers 2020-03-06 15:44:55 +01:00
Benoit Marty
35179509f2 Merge pull request #1111 from vector-im/feature/verification_code
Feature/verification code
2020-03-06 15:02:57 +01:00
Benoit Marty
5008524635 Add script to dumpsys work manager data 2020-03-06 14:52:09 +01:00
Benoit Marty
147766176c Merge pull request #1090 from vector-im/feature/notif
Restore the push rule settings
2020-03-06 14:43:33 +01:00
Benoit Marty
23862cb3d0 Merge branch 'develop' into feature/notif 2020-03-06 14:43:23 +01:00
Benoit Marty
2b8e2a312b Avoid use toImmutableList() 2020-03-06 14:39:33 +01:00
Benoit Marty
62fdb4c27a Use getOrPut() 2020-03-06 14:37:30 +01:00
Benoit Marty
b929a2f185 Merge pull request #1099 from vector-im/feature/fix_share_image
Share images from clear and encrypted rooms.
2020-03-06 14:27:47 +01:00
Benoit Marty
fb858bc112 Rename to respect naming convention #3 2020-03-06 14:04:02 +01:00
Benoit Marty
5d0e917f04 Rename to respect naming convention #2 2020-03-06 13:50:00 +01:00
Benoit Marty
e420070066 Rename to respect naming convention 2020-03-06 13:40:35 +01:00
Benoit Marty
4504308f25 Less "!!" 2020-03-06 13:34:12 +01:00
onurays
05683967c0 Code review fixes. 2020-03-06 12:07:38 +01:00
Benoit Marty
23c20acff1 Remove TODO 2020-03-06 10:11:30 +01:00
Benoit Marty
be5e6eaa93 Rename parameter type for code clarity 2020-03-06 10:10:16 +01:00
Onuray Sahin
555863fecc Merge pull request #1112 from vector-im/feature/navigate_to_profile_from_avatar
Open room member profile from avatar of the room member state event.
2020-03-06 09:42:32 +01:00
onurays
b187699a86 Open room member profile from avatar of the room member state event. 2020-03-05 18:44:34 +01:00
Benoit Marty
d891da39e6 Merge pull request #1104 from vector-im/feature/buildkite
Pipeline file for Buildkite is now hosted on another Github repository
2020-03-05 18:20:17 +01:00
Benoit Marty
f37cd8cddc Merge pull request #1110 from vector-im/feature/cleanup
Cleanup
2020-03-05 18:18:49 +01:00
Benoit Marty
2d456d93a7 Common code step 2 2020-03-05 18:16:05 +01:00
Benoit Marty
de36a28541 Common code step 1 2020-03-05 18:00:35 +01:00
Benoit Marty
4634b963a2 Code cleanup 2020-03-05 17:55:13 +01:00
Benoit Marty
b3f887ca28 Code quality 2020-03-05 17:30:34 +01:00
Benoit Marty
3425dd0a63 Make the tests compile and pass 2020-03-05 17:28:35 +01:00
Benoit Marty
2a774833ec More optimization 2020-03-05 17:11:52 +01:00
Benoit Marty
bda4bbb59c More optimization 2020-03-05 16:45:49 +01:00
Benoit Marty
0828f9270e Create asValidObject method - make it works 2020-03-05 16:23:56 +01:00
Benoit Marty
e326631752 Create asValidObject method - make it compiles #2 2020-03-05 15:39:01 +01:00
Benoit Marty
a3f8a53a52 Create asValidObject method - make it compiles. 2020-03-05 15:29:44 +01:00
Benoit Marty
7b5a50ec6e Create asValidObject method - not compiling 2020-03-05 12:06:19 +01:00
Benoit Marty
36c52d24a7 Move method to interface step 3 2020-03-05 11:24:35 +01:00
Benoit Marty
1b29c7bf91 Move method to interface step 2 2020-03-05 11:22:42 +01:00
Benoit Marty
b6aee04e24 Move method to interface step 1 2020-03-05 11:21:44 +01:00
Benoit Marty
a264dcf5c4 Lint: fix TextFields 2020-03-05 11:09:58 +01:00
Benoit Marty
37afc983c3 Fix typos. The typos has been fixed on Weblate by me. 2020-03-05 11:02:14 +01:00
Benoit Marty
b10e9c54b4 Add BinaryOperationInTimber lint rule and fix existing errors 2020-03-05 10:40:36 +01:00
onurays
03d2cd0639 Lint fix. 2020-03-04 17:57:57 +01:00
onurays
b7ad50a3ce Make mimeType private to encourage using getSafeMimeType() method. 2020-03-04 16:52:52 +01:00
onurays
9cbaadedfb Unused context parameter is removed. 2020-03-04 16:52:08 +01:00
Benoit Marty
d6cdcc60d1 Remove unused png files 2020-03-04 16:48:13 +01:00
Onuray Sahin
1680cd8d8e Merge branch 'develop' into feature/fix_share_image 2020-03-04 16:27:01 +01:00
onurays
d4384328fe Use "image/jpeg" instead of "image/jpg" 2020-03-04 16:26:09 +01:00
Benoit Marty
5fd8425289 Remove unused files 2020-03-04 16:09:37 +01:00
Benoit Marty
dcb618c257 Merge pull request #1103 from vector-im/feature/space_in_passwords
Detect spaces in password if user fails to login (#1038)
2020-03-04 14:12:20 +01:00
Benoit Marty
277ad9e042 Merge branch 'develop' into feature/space_in_passwords 2020-03-04 14:12:12 +01:00
onurays
26d387cc12 Support sharing other media types. 2020-03-04 13:47:48 +01:00
Benoit Marty
4aebe6d303 Disable TravisCI checks, now done by Buildkite 2020-03-04 12:23:25 +01:00
Benoit Marty
7eccda6e25 Pipeline file for Buildkite is now hosted on another Github repository
https://github.com/matrix-org/pipelines/blob/master/riotx-android/pipeline.yml
2020-03-04 12:20:09 +01:00
Benoit Marty
78bc2bbaa5 AndroidStudio cleanup 2020-03-04 12:15:33 +01:00
Benoit Marty
cde068f267 Merge pull request #1079 from vector-im/feature/ftue
FTUE: do not display a different color when encrypting message when not in developer mode.
2020-03-04 12:14:24 +01:00
Benoit Marty
c8f43e73e2 Merge branch 'develop' into feature/ftue 2020-03-04 12:14:07 +01:00
Benoit Marty
f106f92d7e Merge pull request #1085 from vector-im/feature/ktlint_upgrade
ktlint 0.36.0, Chromebook support, Camera for QR code scanning
2020-03-04 12:11:19 +01:00
Benoit Marty
fa0e07e146 Merge branch 'develop' into feature/ktlint_upgrade 2020-03-04 12:10:56 +01:00
Benoit Marty
d6df0e451c Detect spaces in password if user fail to login (#1038) 2020-03-04 10:39:10 +01:00
Benoit Marty
0121eee5b8 changelog 2020-03-04 09:37:32 +01:00
Benoit Marty
30e46445ca Add documentation to install environment and run integration tests (#1098)
Add documentation to install environment and run integration tests
2020-03-04 09:35:09 +01:00
onurays
7158554ee2 Add fallback logic only if the mode is thumbnail. 2020-03-03 16:56:22 +01:00
onurays
34c5537436 Fix fallback to full image. 2020-03-03 16:42:33 +01:00
onurays
d09ac8fbce Try to show full image as the fallback of the thumbnail. 2020-03-03 14:54:05 +01:00
onurays
319667096f Return Try.Failure instead of throwing exception. 2020-03-03 13:41:40 +01:00
onurays
c4f2eeeab7 Changelog added. 2020-03-03 10:40:58 +01:00
onurays
5f14516dec Share images from clear and encrypted rooms. 2020-03-03 10:39:24 +01:00
Benoit Marty
5ff670b184 Merge pull request #1093 from vector-im/feature/plain_text
Add support for `/plain` command (#12)
2020-03-02 19:37:05 +01:00
Benoit Marty
b7ff546f66 Add support for /plain command (#12) 2020-03-01 09:59:00 +01:00
Benoit Marty
c13b636bae Code cleanup 2020-02-29 10:05:48 +01:00
Benoit Marty
a05caf6f0e Update the 2 notification settings screens by moving some pref to the root notification screen 2020-02-29 09:49:21 +01:00
Benoit Marty
3462df405c Fix GPlay build issue 2020-02-29 09:42:35 +01:00
Benoit Marty
6009026e2f Notification settings: create a category for troubleshhot 2020-02-29 09:35:26 +01:00
Benoit Marty
06e0af9a5b small mistake 2020-02-28 22:12:30 +01:00
Benoit Marty
3987a68a9a Changelog 2020-02-28 22:10:07 +01:00
Benoit Marty
1228fcda0d Rename class 2020-02-28 19:25:29 +01:00
Benoit Marty
c20de4feb0 Cleanup 2020-02-28 19:13:22 +01:00
Benoit Marty
957b9eee23 Cleanup 2020-02-28 19:06:26 +01:00
Benoit Marty
e5eb36e917 Cleanup 2020-02-28 19:04:30 +01:00
Benoit Marty
551604cdcb Add missing push rules 2020-02-28 19:02:13 +01:00
Benoit Marty
8a2bafec5f Restore push rule settings - fix issues 2020-02-28 18:35:51 +01:00
Benoit Marty
3013e311a4 Restore push rule settings - WIP 2020-02-28 16:51:11 +01:00
Benoit Marty
1c35d07acc PushRuleService.getPushRules() now returns a RuleSet. Use getAllRules() on this object to get all the rules. 2020-02-28 16:29:58 +01:00
Benoit Marty
039924436f Json parsing 2020-02-28 14:51:35 +01:00
Benoit Marty
41b4f412c4 Merge pull request #1089 from vector-im/feature/crash_in_attachment_preview
Fix crash on attachment preview screen (#1088)
2020-02-28 14:49:36 +01:00
Benoit Marty
2abe29300b Merge pull request #1087 from vector-im/feature/verification_cleanup
Verification cleanup
2020-02-28 14:48:27 +01:00
Valere
779026b0af Fix / mark master key as trusted after self verif 2020-02-28 11:46:32 +01:00
Benoit Marty
151fec5ce0 Fix crash on attachment preview screen (#1088) 2020-02-28 11:38:30 +01:00
Benoit Marty
b1b8513da4 Create fromBase64Safe() to parse data received from external source 2020-02-27 19:17:14 +01:00
Benoit Marty
0a9008a73d Be robust if other client sends padded base64 in the reciprocate 2020-02-27 18:35:05 +01:00
Benoit Marty
1ead2778c2 ... and rename the method fromBase64NoPadding() to fromBase64() 2020-02-27 18:33:57 +01:00
Benoit Marty
8299487f6d Avoid using encoder flag to decode Base64 string... 2020-02-27 18:13:42 +01:00
Benoit Marty
ceab0903cf Improve code - TU passed 2020-02-27 18:09:37 +01:00
Benoit Marty
77dd911054 Code quality 2020-02-27 17:42:25 +01:00
Benoit Marty
a914381090 Verification with QrCode: ensure there is a Camera to scan QrCodes. 2020-02-27 17:03:48 +01:00
Benoit Marty
9f28738fd6 Restore availability to Chromebooks (#932) 2020-02-27 15:41:35 +01:00
Benoit Marty
36a848471f Enable other lint check (no change necessary in source) 2020-02-27 15:27:46 +01:00
Benoit Marty
12861aacda lint: check negative margin 2020-02-27 15:11:43 +01:00
Benoit Marty
d85776297d Lint: fix IconDuplicates by remove unused resources 2020-02-27 14:56:18 +01:00
Benoit Marty
50031bef50 Lint: fix IconDipSize and IconDuplicatesConfig error (by removing unused resource) 2020-02-27 14:45:26 +01:00
Benoit Marty
c0d6b9d130 Lint fix IconXmlAndPng error 2020-02-27 14:35:57 +01:00
Benoit Marty
a1466e299b Fix missing recycle call and ensure this mistake will not happen again 2020-02-27 14:30:49 +01:00
Benoit Marty
bc9493d5b9 Upgrade ktlint to version 0.36.0 2020-02-27 12:48:17 +01:00
Benoit Marty
9bb4c7ed25 Version++ 2020-02-27 12:34:33 +01:00
Benoit Marty
128f3493b7 Merge branch 'release/0.17.0' 2020-02-27 12:32:36 +01:00
Benoit Marty
65e5a04836 Merge branch 'release/0.17.0' into develop 2020-02-27 12:32:35 +01:00
Benoit Marty
495e4792b1 Prepare release 0.17.0 2020-02-27 12:32:03 +01:00
Benoit Marty
f906fc894b Sync Strings with Riot 2020-02-27 11:59:39 +01:00
Benoit Marty
6e060f63c6 Try to decode QrCode data in the debug Activity 2020-02-27 11:32:59 +01:00
Benoit Marty
9c7f5251b0 Merge pull request #1084 from vector-im/feature/room_key_share_crash
Fix crash after rework. RoomKeyShare is now an interface
2020-02-26 20:45:50 +01:00
Benoit Marty
a296234163 Fix crash after rework. RoomKeyShare is now an interface 2020-02-26 20:35:34 +01:00
Benoit Marty
a4d7b79e3c Merge pull request #1083 from vector-im/feature/last_fixies
Last fixes before release
2020-02-26 18:37:21 +01:00
Benoit Marty
3ac2296464 Disable freestyle crop, usability was not easy 2020-02-26 17:46:33 +01:00
Benoit Marty
b5a402c1e1 Fix crash when editing image 2020-02-26 17:45:39 +01:00
Benoit Marty
b8eeede5fd Safer code 2020-02-26 17:28:27 +01:00
Benoit Marty
d3e7e7e109 Make the small avatar also clickable and little change in the API to factorize code 2020-02-26 17:17:39 +01:00
Benoit Marty
a3af0be103 prevent wildcard for import 2020-02-26 17:01:38 +01:00
Benoit Marty
6349f9828d Optimize import 2020-02-26 16:59:20 +01:00
Benoit Marty
989d396c78 Rename package "sas" to "verification" 2020-02-26 16:52:16 +01:00
Benoit Marty
73ac7ab341 Compact code 2020-02-26 16:48:50 +01:00
Benoit Marty
a3133773a3 generic name for parameter 2020-02-26 16:45:12 +01:00
Benoit Marty
6e67d4749f Merge pull request #1082 from vector-im/feature/fix_rageshakes
Fix crashes reported by rageshakes
2020-02-26 16:10:47 +01:00
Benoit Marty
38c1ef3eb6 Fix lint issue 2020-02-26 16:08:34 +01:00
Benoit Marty
674450ef29 Merge pull request #1076 from vector-im/feature/fullscreen_avatar
Display avatar in fullscreen.
2020-02-26 16:06:13 +01:00
Benoit Marty
5e775298a7 Merge pull request #1081 from vector-im/feature/fix_redacted_event_format
Fix redacted event format on room overview.
2020-02-26 15:57:10 +01:00
onurays
93a687a172 Code review fixes. 2020-02-26 17:55:23 +03:00
Benoit Marty
4ba8a42977 Fix crash reported from rageshake 2020-02-26 15:32:52 +01:00
Benoit Marty
054d7668ef Fix crash reported from rageshake 2020-02-26 15:19:47 +01:00
Benoit Marty
a13fec84b0 Fix crash reported from rageshake 2020-02-26 15:00:25 +01:00
Benoit Marty
4bb3fb128f Fix crash reported from rageshake 2020-02-26 14:54:36 +01:00
onurays
04726a1ace Fix redacted event format on room overview.
Fixes #758
2020-02-26 16:51:01 +03:00
Benoit Marty
ccf72ffaa7 Fix crash reported from rageshake 2020-02-26 14:50:01 +01:00
Onuray Sahin
d2efe0e10c Merge branch 'develop' into feature/fullscreen_avatar 2020-02-26 16:23:02 +03:00
Benoit Marty
054b467caf Fix crash reported from rageshake 2020-02-26 14:18:48 +01:00
Benoit Marty
4280bc0780 Fix crash reported from rageshake 2020-02-26 14:10:51 +01:00
Benoit Marty
e1ea742023 Fix crash reported from rageshake 2020-02-26 13:59:58 +01:00
Benoit Marty
b7cf7e06a7 Merge pull request #1015 from vector-im/feature/new_signin_passphrase
Feature/new signin passphrase
2020-02-26 13:56:31 +01:00
onurays
536dce7929 Code review fixes. 2020-02-26 15:30:03 +03:00
onurays
56fc91a8c3 Code review fixes. 2020-02-26 15:26:53 +03:00
Benoit Marty
6622e0daca Code quality 2020-02-26 12:43:41 +01:00
Benoit Marty
f35b0660ca Rename constant for code readability 2020-02-26 12:37:36 +01:00
Valere
9d1718cda8 post merge clean 2020-02-26 12:20:03 +01:00
Valere
f7c128be3d Fix tests 2020-02-26 12:20:03 +01:00
Valere
c80fb52410 dead code 2020-02-26 12:20:03 +01:00
Valere
32389e1291 Remove wizard stuff 2020-02-26 12:20:03 +01:00
Valere
99f9a9817e Use human readable error (not technical) 2020-02-26 12:20:03 +01:00
Valere
b4a783198b code review 2020-02-26 12:20:03 +01:00
Valere
0cfc9451ca Cleaning 2020-02-26 12:20:03 +01:00
Valere
4b75baf772 Fix / trust was not properly updated after 4S restore 2020-02-26 12:20:03 +01:00
Valere
c579de1033 Fix / Test crash when crypto DB closed
Quick Work around
2020-02-26 12:20:03 +01:00
Valere
d537abc522 Fix / sign current device after entering xsigning passphrase 2020-02-26 12:20:03 +01:00
Valere
030f027516 Fixes #1051
XSigning | Self verification Empty bottomsheet
2020-02-26 12:20:03 +01:00
Valere
cbd7c1aa63 Fix / Bad ordering of active sessions 2020-02-26 12:20:03 +01:00
Valere
bdb1df75d4 Check trust on crypto thread 2020-02-26 12:20:03 +01:00
Valere
817dc19b9a Cleaning 2020-02-26 12:20:03 +01:00
Valere
f9be4fa2bd Fixes #1047 2020-02-26 12:20:03 +01:00
Valere
412aed6dcb Fix / Update title before return 2020-02-26 12:20:03 +01:00
Valere
9fc44c11de Fixes #937
Disabling bounds change animation, as it's messing with fragment change apparition and expanded state of bottomsheet
2020-02-26 12:20:03 +01:00
Valere
bf23094158 Fix / Green shield in conclusion title when verified from private keys 2020-02-26 12:20:03 +01:00
Valere
94d36e0c85 cleaning jni 2020-02-26 12:20:03 +01:00
Valere
0064934db9 Changed Encryption algorithm of 4S 2020-02-26 12:20:03 +01:00
Valere
e2e4ddf5ba Post rebase fix 2020-02-26 12:20:03 +01:00
Valere
9a08f5ec4e WIP / Verify from passphrase UX 2020-02-26 12:19:31 +01:00
Valere
cb669ad881 4S Activity WIP 2020-02-26 12:15:59 +01:00
Valere
3dc89c8d87 Update Self Verification BottomSheet for quads 2020-02-26 12:15:59 +01:00
Benoit Marty
cb73955946 Merge pull request #1050 from vector-im/feature/fix_some_perf
Feature/fix some perf
2020-02-26 12:02:36 +01:00
ganfra
bfe15555a1 Update changes 2020-02-26 11:51:05 +01:00
ganfra
bddeb6cb72 Clean files 2020-02-26 11:50:41 +01:00
ganfra
d57f6838e9 Remove decryption from room summary mapper and make TimelineEventDecryptor scoped to session 2020-02-26 11:50:41 +01:00
ganfra
cf8ffa3a7a Force trust task on crypto dispatcher to use cached realm from crypto store 2020-02-26 11:49:08 +01:00
Benoit Marty
a69049645a FTUE: do not display a different color when encrypting message when not in developer mode. 2020-02-26 11:25:37 +01:00
Benoit Marty
40b4db4a64 Merge pull request #1060 from vector-im/feature/data_class_cleanup
Data class cleanup
2020-02-26 10:57:10 +01:00
Benoit Marty
246b39786c Merge pull request #1073 from vector-im/feature/improve_api
Improve api of CreateRoomParams
2020-02-26 10:55:48 +01:00
onurays
1a273407de Display avatar in fullscreen. 2020-02-26 12:12:49 +03:00
Benoit Marty
633f9d8522 ktlint 2020-02-26 09:55:57 +01:00
Benoit Marty
076ac23b38 Modification done by AndroidStudio 3.6 2020-02-26 07:59:54 +01:00
Benoit Marty
67180fd8db New direct chat: selecting several participants was not adding the room to the direct chats list 2020-02-26 07:38:10 +01:00
Benoit Marty
fc95bf4926 Improve CreateRoomParams API: update some API for better chaining of builder like methods (#1070) 2020-02-26 07:32:22 +01:00
Benoit Marty
e73f138151 Improve CreateRoomParams API: update Javadoc and ensure the return values will not be discarded (#1070) 2020-02-26 07:17:25 +01:00
Benoit Marty
30432cd3f4 Merge pull request #1069 from vector-im/feature/fix_dm
Fix dm chips
2020-02-25 19:28:46 +01:00
Benoit Marty
1072060cbb New direct chat: selecting a participant sometimes results in two breadcrumbs (#1022) 2020-02-25 19:00:38 +01:00
Benoit Marty
a55e0f1af4 Fix crash - workaround 2020-02-25 18:17:40 +01:00
Benoit Marty
b95dfa4473 Create getBestName method for User 2020-02-25 18:14:02 +01:00
Benoit Marty
ec0cba2b23 Merge pull request #1067 from vector-im/feature/roomId
Display internal id of a room section in room profile
2020-02-25 12:22:14 +01:00
Benoit Marty
cfe9c4bb41 Display internal id of a room section in room profile, with copy to clipboard action, only in developer mode 2020-02-25 12:21:04 +01:00
Benoit Marty
68400cce03 Merge pull request #1049 from vector-im/feature/fix_invites
Feature/fix invites
2020-02-25 11:39:35 +01:00
Benoit Marty
17e028178e Code robustness (avoid using !!) 2020-02-25 11:20:11 +01:00
ganfra
19b9617a09 Invite: fix inviterId being overrided 2020-02-25 10:53:47 +01:00
Benoit Marty
08e4b4473c Disable manual rules now checked by ktlint 2020-02-25 09:57:12 +01:00
Benoit Marty
b9b921a4df Code quality 2020-02-25 09:53:17 +01:00
ganfra
483256093a Invite: fix room member not saved 2020-02-24 18:27:18 +01:00
Benoit Marty
d710a59554 Update change log 2020-02-24 17:44:51 +01:00
Benoit Marty
1023982858 Code readability 2020-02-24 17:40:28 +01:00
Benoit Marty
9c566b19f7 Ensure all eventId start with $, even ids for local echo 2020-02-24 17:35:43 +01:00
ganfra
b694721728 Update CHANGES 2020-02-24 17:33:40 +01:00
ganfra
8b0305c91d Clean code 2020-02-24 17:33:40 +01:00
ganfra
133d8d7f14 RoomList: fix joining/rejecting state 2020-02-24 17:33:40 +01:00
ganfra
9cdb1da614 Start fixing notif for invites 2020-02-24 17:33:40 +01:00
ganfra
981c9ac4ac Invite sync: assign eventId and remove the primaryKey constraint 2020-02-24 17:33:40 +01:00
Benoit Marty
3e8a0f7252 Merge pull request #1044 from vector-im/feature/fix_big_image_rotation
Use exif info of the image for correct rotation.
2020-02-24 17:30:33 +01:00
Benoit Marty
281620b88d Merge pull request #1048 from vector-im/feature/profile_share_actions
Share action is added to room profile and room member profile
2020-02-24 17:29:17 +01:00
Benoit Marty
c6b3b1e648 Fix bug on test 2020-02-24 17:27:04 +01:00
Benoit Marty
96af1957f9 Fix bug on progress step, found by integration test testBackupWithPassword() 2020-02-24 16:27:58 +01:00
Benoit Marty
b680e24938 Fix some tests 2020-02-24 16:16:37 +01:00
onurays
dec62a893e Code review fixes. 2020-02-24 18:06:59 +03:00
onurays
b3d4747d97 Code review fixes. 2020-02-24 17:35:57 +03:00
onurays
1124aa25fd Code review fixes. 2020-02-24 17:22:07 +03:00
Benoit Marty
b3c8b5526d Each session now have it's proper crypto store 2020-02-24 15:03:12 +01:00
Benoit Marty
1e44e77503 Make code robust to int received instead of boolean
https://github.com/matrix-org/synapse/issues/6977
2020-02-24 14:42:47 +01:00
Valere
964b611f4e Merge pull request #1053 from vector-im/feature/fix_712
Fixes #712
2020-02-24 14:07:35 +01:00
Valere
3e587af163 klint 2020-02-24 14:07:15 +01:00
Benoit Marty
b03b6bfc37 Fix crash discovered thanks to integration tests 2020-02-24 12:53:18 +01:00
Benoit Marty
1a6d4d0b03 Try to fix XSigningTest 2020-02-21 19:20:40 +01:00
Valere
c41661ece8 Fixes #712 2020-02-21 19:05:20 +01:00
Benoit Marty
1b763fb4c8 Cleanup XSigningTest 2020-02-21 18:52:36 +01:00
Benoit Marty
9ef267cb07 Cleanup after each test 2020-02-21 18:36:13 +01:00
Benoit Marty
d167ff9496 Make KeysBackup test pass (still work to do) 2020-02-21 17:58:04 +01:00
Benoit Marty
ccfa59ad31 Cleanup var -> val 2020-02-21 15:05:48 +01:00
onurays
f650e29ddd Share action is added to room profile and room member profile
Fixes #858
2020-02-21 15:30:01 +03:00
Onuray Sahin
1eefda18e4 Merge branch 'develop' into feature/fix_big_image_rotation 2020-02-21 13:13:02 +03:00
Benoit Marty
d6434654e2 Merge pull request #1043 from vector-im/feature/join_federation
Fix join room over federation
2020-02-21 10:08:05 +01:00
Benoit Marty
b6372df676 Merge pull request #1037 from vector-im/feature/crosssigning_qr
Migrate to binary QR code verification (#994)
2020-02-21 10:01:49 +01:00
Benoit Marty
d7de072155 typo 2020-02-21 09:58:56 +01:00
onurays
a11d70f173 Use exif info of the image for correct rotation. 2020-02-21 00:51:22 +03:00
Benoit Marty
a9909b37ba Update after Valere's review 2020-02-20 19:54:35 +01:00
Benoit Marty
3f9a5a4e54 Leaving a room creates a stuck "leaving room" loading screen. (#1041) 2020-02-20 19:31:33 +01:00
Benoit Marty
198e23c204 Second fix for #808 2020-02-20 19:23:32 +01:00
Benoit Marty
aefffc0c05 RoomPreviewNoPreviewFragment use room alias if there is no name 2020-02-20 19:19:31 +01:00
Benoit Marty
fd05fe36f5 Fix joining rooms from directory via federation isn't working. (#808) 2020-02-20 19:01:36 +01:00
Benoit Marty
b72698d63c Fix another issue when there is no name and no canonical alias on a public room 2020-02-20 18:47:07 +01:00
Benoit Marty
eec65fb622 Join room by roomId or room alias 2020-02-20 18:17:57 +01:00
Benoit Marty
87021dd6ec Rename field 2020-02-20 18:16:10 +01:00
Benoit Marty
b85c76b172 Simplify code 2020-02-20 18:05:53 +01:00
Benoit Marty
d867b1345f Format 2020-02-20 15:15:38 +01:00
Benoit Marty
80ef2192b9 Merge pull request #1036 from vector-im/feature/fix_key_restoring
Fix threading issues while restoring keys backup.
2020-02-20 15:13:13 +01:00
onurays
7d232527c8 Documentation of the API change is added. 2020-02-20 16:39:48 +03:00
Benoit Marty
e61d563589 Split long lines 2020-02-20 10:16:09 +01:00
Benoit Marty
74175ddfa0 Add a test and create extension for Byte to avoid using UByte (still experimental) 2020-02-20 10:12:07 +01:00
Benoit Marty
382fc6f05c Fix issue with long transactionId 2020-02-19 18:59:39 +01:00
Benoit Marty
932c478ed5 Change log 2020-02-19 18:11:23 +01:00
Benoit Marty
e81439d57b Remove v2 suffix 2020-02-19 18:09:33 +01:00
Benoit Marty
f81eb298cb Cleanup QRCode v1 2020-02-19 18:06:51 +01:00
Benoit Marty
859b9e4f8e Migrate to QrCode v2 - TODO: cleanup 2020-02-19 17:50:30 +01:00
Benoit Marty
e00d3ef63d QrCodeV2 WIP (al tests passing) 2020-02-19 17:34:07 +01:00
onurays
a97971dd84 Fix threading issues while restoring keys backup. 2020-02-19 18:30:12 +03:00
Benoit Marty
35b10daef1 Ensure RiotX is able to scan binary QrCodes 2020-02-19 14:26:45 +01:00
Benoit Marty
66a2958c39 Add unit test to check byte array to string conversion 2020-02-19 14:21:41 +01:00
Benoit Marty
571db7da55 Merge pull request #1035 from vector-im/feature/share_text
Fix share text to a single room issue
2020-02-19 10:08:29 +01:00
Benoit Marty
c6b231c0b1 Create toState() fun and use the enum 2020-02-18 14:12:50 +01:00
Benoit Marty
53410789c0 Cleanup 2020-02-18 14:12:50 +01:00
Benoit Marty
f8276e48e3 add kluent for test 2020-02-18 14:09:42 +01:00
Benoit Marty
86c38ebd2d Create Set.toggle() method 2020-02-18 13:33:49 +01:00
Benoit Marty
d730f96c41 Do not show alert when sharing text to a single room 2020-02-18 12:24:27 +01:00
Benoit Marty
7b3fcb7798 When sharing to a room save a draft to pre-fill the composer 2020-02-18 12:11:51 +01:00
Benoit Marty
26e8a60312 Merge pull request #1032 from vector-im/feature/crash
Fix crash in the room directory, when public room has no name (#1023)
2020-02-18 11:48:29 +01:00
Benoit Marty
7133d513b4 Fix crash in the room directory, when public room has no name (#1023) 2020-02-18 10:45:14 +01:00
Benoit Marty
8d1b2b35fd Merge pull request #1010 from vector-im/feature/attachment_process
Attachment process
2020-02-18 09:19:17 +01:00
Benoit Marty
b811bf9e7f Fix issue after merge 2020-02-17 23:21:08 +01:00
Benoit Marty
ebda12dd76 Merge branch 'develop' into feature/attachment_process 2020-02-17 19:22:50 +01:00
Benoit Marty
adc545a93d Merge pull request #1026 from vector-im/feature/crypto_service_renaming
Feature/crypto service renaming
2020-02-17 19:21:02 +01:00
Benoit Marty
fc740ae347 Merge pull request #1016 from vector-im/feature/cleanup_quadS
Cleanup quad s and AccountData service
2020-02-17 18:52:23 +01:00
Benoit Marty
67ed86fee5 Rename KeysBackup to DefaultKeysBackupService 2020-02-17 18:51:06 +01:00
Benoit Marty
f716e9d789 Fix compilation issue 2020-02-17 18:49:45 +01:00
Benoit Marty
141c7d6af0 Update comment 2020-02-17 18:43:04 +01:00
Benoit Marty
7495533edc Use let 2020-02-17 18:16:37 +01:00
Benoit Marty
f2f94c4a93 Reduce code duplication 2020-02-17 17:56:11 +01:00
Benoit Marty
4995c14f69 Add log 2020-02-17 17:46:15 +01:00
Benoit Marty
002e881704 Fix multiple share intent issue 2020-02-17 17:26:19 +01:00
Benoit Marty
51bbee297c Remove useless confirmation when shared data are previewables 2020-02-17 17:06:15 +01:00
Benoit Marty
82bd8a2e2a Ask for write permission before editing media 2020-02-17 16:29:10 +01:00
Benoit Marty
d67cd2cbef Small iteration on UI 2020-02-17 16:21:10 +01:00
ganfra
6d2025b61a Update CHANGES 2020-02-17 15:54:17 +01:00
ganfra
91cbcebf73 Make test compile 2020-02-17 15:50:42 +01:00
ganfra
fd0dceb597 Clean code 2020-02-17 15:23:24 +01:00
Benoit Marty
48a033b3bd Fix navigation issue when sharing text to multiple rooms 2020-02-17 14:58:20 +01:00
Benoit Marty
a3b205b310 No preview for elements sent from the keyboard 2020-02-17 14:48:12 +01:00
Benoit Marty
ca0cd9e97d Better code 2020-02-17 14:38:56 +01:00
Benoit Marty
31d5578063 Media preview: do not propose to edit Gif 2020-02-17 14:35:57 +01:00
Benoit Marty
b6f5e27155 Fix issue after merge of develop 2020-02-17 13:50:36 +01:00
Benoit Marty
13d3aa9ff1 Merge branch 'develop' into feature/attachment_process 2020-02-17 13:48:21 +01:00
Benoit Marty
629ecf786a Merge pull request #1024 from vector-im/feature/wording
Account creation: wrongly hints that an email can be used to create an account (#941)
2020-02-17 13:34:04 +01:00
Benoit Marty
ecf07ff64a Account creation: wrongly hints that an email can be used to create an account (#941) 2020-02-17 10:30:54 +01:00
ganfra
e349a35419 Crypto: expose cryptoService by a getter, removing the session implementation delegation 2020-02-16 15:40:31 +01:00
Benoit Marty
a61f508b5d Fix a nice bug 2020-02-14 22:00:36 +01:00
Benoit Marty
76085a4284 AccountData cleanup and Javadoc 2020-02-14 21:50:37 +01:00
Benoit Marty
446d826dd3 Create tag interface AccountDataContent 2020-02-14 20:53:45 +01:00
Benoit Marty
2d6f57e214 More cleanup/code lisibility 2020-02-14 20:50:21 +01:00
Ganard
a305ce302e Coroutine sequencer: use semaphore 2020-02-14 19:37:51 +01:00
Benoit Marty
7ddea99fc6 Move and improve withOlmDecryption() and withOlmEncryption() 2020-02-14 18:51:27 +01:00
Benoit Marty
4c3b754de4 Use const from DefaultSharedSecretStorageService 2020-02-14 18:33:15 +01:00
Benoit Marty
7878da25b8 Use doSync<>() to reduce boilerplate and add test checks
and more cleanup
2020-02-14 18:18:20 +01:00
Benoit Marty
01597a89dc Avoid code duplication 2020-02-14 17:53:27 +01:00
Valere
b04ee7153a Merge pull request #995 from vector-im/feature/4s_msc1946
Feature/4s msc1946
2020-02-14 17:49:16 +01:00
Benoit Marty
db19ab0531 Merge branch 'develop' into feature/4s_msc1946 2020-02-14 17:45:44 +01:00
Benoit Marty
cad818c341 ktlint 2020-02-14 17:05:14 +01:00
Benoit Marty
1660a0f846 Version++ 2020-02-14 15:16:00 +01:00
Benoit Marty
56677f0908 Merge branch 'release/0.16.0' 2020-02-14 15:14:55 +01:00
Benoit Marty
4987a75039 Merge branch 'release/0.16.0' into develop 2020-02-14 15:14:54 +01:00
Benoit Marty
e20d1724c9 Prepare release 0.16.0 2020-02-14 15:14:48 +01:00
Benoit Marty
f6f9c349ec Add entry in changelog for the 2 mistakes 2020-02-14 14:52:10 +01:00
Benoit Marty
88b8ceaeb5 Merge pull request #1005 from vector-im/feature/fix_event_redaction_prompt
Do not ask for a reason if user wants to delete his own message.
2020-02-14 14:36:01 +01:00
Benoit Marty
e4577d8fef Small cleanup before merge 2020-02-14 14:34:22 +01:00
onurays
030d6824e3 Code review fixes. 2020-02-14 15:04:25 +03:00
Benoit Marty
ab437e249d Update emoji for API change 2020-02-14 12:43:27 +01:00
Valere
35835be03e klint 2020-02-14 12:06:07 +01:00
Valere
f99eca8014 Code review 2020-02-14 10:48:18 +01:00
Valere
e0eede1150 cleaning 2020-02-14 10:48:18 +01:00
Valere
64647cb465 Fix / Save account data after update (local echo) 2020-02-14 10:48:18 +01:00
Valere
def01cca8f Fix test + changes 2020-02-14 10:48:18 +01:00
Valere
61ea4191dc Update json viewer lib 2020-02-14 10:48:18 +01:00
Valere
108ebea84e SSSS service + test 2020-02-14 10:48:18 +01:00
Valere
bf06b57bad Refactor Account Data
Auto stash before rebase of "develop"
2020-02-14 10:48:18 +01:00
Valere
a250a895fe Remove redudant calls to eventBus post 2020-02-14 10:47:34 +01:00
Benoit Marty
2c2bf61727 Update Changelog 2020-02-14 09:40:07 +01:00
Benoit Marty
6c0bddc893 Code quality 2020-02-13 23:20:35 +01:00
Benoit Marty
930d62c87b Restore Breadcrumbs comparator, we can maybe improve this later 2020-02-13 23:00:03 +01:00
Benoit Marty
b66b96899e Better Kotlin code 2020-02-13 22:56:11 +01:00
Benoit Marty
e6bd09859f Compress image before sending 2020-02-13 22:50:55 +01:00
Benoit Marty
385fa317c0 Add a green frame around current small preview 2020-02-13 20:45:03 +01:00
Benoit Marty
ecd547b86c Auto close the room picker and open the first room when data are shared in case of multi selection 2020-02-13 20:10:59 +01:00
Benoit Marty
d87b951403 Improve code 2020-02-13 20:10:59 +01:00
Benoit Marty
06ba478232 Send files to several rooms at a time 2020-02-13 20:10:59 +01:00
Benoit Marty
81de914360 Propose to edit media before sending, when coming form another application 2020-02-13 20:10:59 +01:00
Benoit Marty
b7ec495d6b Add comment 2020-02-13 19:52:11 +01:00
Benoit Marty
a8953568f3 Set custom colors 2020-02-13 19:52:11 +01:00
Benoit Marty
41b20863fb Mention uCrop library copyright 2020-02-13 19:52:11 +01:00
Benoit Marty
94340a49d7 Ask for permission 2020-02-13 19:52:11 +01:00
Benoit Marty
c67fd508e7 Cleanup 2020-02-13 19:52:11 +01:00
Ganard
eccc52fe13 Sharing: start extracting from RoomList as it's getting messy 2020-02-13 19:52:11 +01:00
Ganard
b7a7aa2f15 Attachment: continue working on preview screen 2020-02-13 19:52:11 +01:00
ganfra
6471787232 Share: start managing multi selection and warning 2020-02-13 19:52:11 +01:00
ganfra
41f1ec5d88 Attachments: preview with pager mode 2020-02-13 19:51:20 +01:00
Ganard
a26e959430 Attachements: introduce structure for preview, cropping and compressing 2020-02-13 19:51:20 +01:00
Benoit Marty
5808c1de22 TextView displaying emoji should have text color set to black 2020-02-13 19:50:31 +01:00
Benoit Marty
d21604b791 Merge pull request #989 from vector-im/feature/qr_code_mistake
Fix issue with verification when other client declares it can only show QR code (#988)
2020-02-13 19:41:10 +01:00
onurays
fd135e1eeb Compute message body for encrypted messages too. 2020-02-13 18:09:26 +03:00
onurays
f28e4cf991 Fix comparison of user ids. 2020-02-13 17:57:38 +03:00
Valere
1941862499 Fix / Remove debug code line 2020-02-13 15:50:08 +01:00
onurays
983593d647 getRedactionReason function is refactored. 2020-02-13 17:28:14 +03:00
onurays
1b413934b5 Set redaction reason as message body. 2020-02-13 16:42:13 +03:00
onurays
8a3e93ae96 Do not ask for a reason if user wants to delete his own message.
Fixes (#1003)
2020-02-13 14:59:41 +03:00
Benoit Marty
5191cbaf93 Merge pull request #1001 from vector-im/feature/pusher_service
Cleanup pusher service and improve API
2020-02-13 08:02:33 +01:00
Benoit Marty
f2e6900cfb Move throw line 2020-02-13 07:44:54 +01:00
Benoit Marty
0b7e757f3c Code lisibility: use generic name for parameters in Dagger modules 2020-02-13 07:12:11 +01:00
Benoit Marty
5b2c947af1 Rename internal class 2020-02-13 07:05:46 +01:00
Benoit Marty
6a69c6356d PushersService.pushers() has been renamed to PushersService.getPushers() 2020-02-13 07:04:54 +01:00
Benoit Marty
e492e4318b Do some parameter checks 2020-02-13 06:48:52 +01:00
Benoit Marty
93d38843c3 Add Javadoc 2020-02-13 06:36:21 +01:00
Benoit Marty
7d94519064 Merge pull request #998 from vector-im/feature/msc_2192_update_event_prefix
Use vendor prefix for non merged MSC
2020-02-12 22:41:12 +01:00
Valere
21bac0f867 Fix / typo in poll 2020-02-12 22:31:13 +01:00
Valere
32c4ad9ecb Use vendor prefix for non merged MSC 2020-02-12 19:09:23 +01:00
Valere
e1342d096b Merge pull request #810 from vector-im/feature/msc_2192
Feature/msc 2192
2020-02-12 17:41:50 +01:00
Valere
e91c6c216d code quality 2020-02-12 17:03:21 +01:00
Onuray Sahin
6013e1653b Open room member profile from reactions and read receipts. (#990)
Open room member profile from reactions and read receipts. Fixes #875
2020-02-12 15:57:49 +01:00
Benoit Marty
47f47e40c4 code review and cleanup 2020-02-12 15:09:38 +01:00
Benoit Marty
9016688aec Fix compilation issue after rebase 2020-02-12 13:48:08 +01:00
Valere
d5f8a0c0fc code quality 2020-02-12 13:40:54 +01:00
Valere
33c657bff8 Update change log 2020-02-12 13:40:54 +01:00
Valere
9a7bd35ddc Add m.buttons support (a.k.a bot buttons) 2020-02-12 13:40:54 +01:00
Valere
3ac54c51f6 cleaning 2020-02-12 13:39:30 +01:00
Valere
c4ea2507f8 Add command to send poll 2020-02-12 13:39:30 +01:00
Valere
6001ac60ab klint cleaning 2020-02-12 13:37:16 +01:00
Valere
0cea26ec77 ux tweak on poll result 2020-02-12 13:37:16 +01:00
Valere
3dae220501 Fix / filter edits and poll response form lastPreviewableMessage 2020-02-12 13:37:16 +01:00
Valere
577c5a16b3 Support incremental poll response aggregation + display 2020-02-12 12:47:28 +01:00
Valere
a0aebed3f7 Message Poll UX, and model 2020-02-12 12:42:17 +01:00
Benoit Marty
3a044bd655 Add Javadoc 2020-02-12 11:39:36 +01:00
Benoit Marty
6acfab3242 Rename VerificationListener to Listener 2020-02-12 11:39:36 +01:00
Benoit Marty
bf02746d87 Clenaup VerificationService.VerificationListener 2020-02-12 11:39:36 +01:00
Benoit Marty
377d944228 Cleanup API 2020-02-12 11:39:36 +01:00
Benoit Marty
6ff974b3ea Fix issue with verification when other client declares it can only show QR code (#988) 2020-02-12 11:39:36 +01:00
Onuray Sahin
7c5bb4ff5b Merge pull request #986 from vector-im/feature/fix_clear_cache_notification_click
Fix crash by removing all notifications after clearing cache.
2020-02-11 18:06:16 +03:00
onurays
3573aea600 Fix crash by removing all notifications after clearing cache.
Fixes #878
2020-02-11 16:48:28 +03:00
Benoit Marty
251de0b89c Merge pull request #982 from vector-im/feature/remove_message_step2
Redact message step2
2020-02-11 11:35:16 +01:00
Benoit Marty
6fce2a3066 Change wording adding "..." because there is now confirmation dialog
And make the item red because it is destructive. Also use "redact" terminology
2020-02-11 11:04:21 +01:00
Benoit Marty
b40da4ef0f Disable TextInputLayout instead of TextInputEditText 2020-02-11 11:00:33 +01:00
Benoit Marty
96341df5e7 Format layout 2020-02-11 11:00:01 +01:00
Benoit Marty
7ccc1c559c Merge pull request #977 from vector-im/feature/event_deletion_dialog
Show confirmation dialog before deleting a message
2020-02-11 10:45:17 +01:00
Benoit Marty
35ed22ab2b improve script 2020-02-11 10:38:13 +01:00
onurays
afbd9cff70 Merge branch 'develop' into feature/event_deletion_dialog
# Conflicts:
#	CHANGES.md
#	vector/src/main/java/im/vector/riotx/features/home/room/detail/RoomDetailFragment.kt
2020-02-11 12:11:36 +03:00
onurays
ce028f8bd2 Gathering reason input is refactored. 2020-02-11 00:10:24 +03:00
Benoit Marty
a7274b9df0 Version++ 2020-02-10 21:41:59 +01:00
Benoit Marty
c498416075 Merge branch 'release/0.15.0' 2020-02-10 21:40:36 +01:00
Benoit Marty
a9d6cb7be3 Merge branch 'release/0.15.0' into develop 2020-02-10 21:40:35 +01:00
Benoit Marty
d71797319c Prepare release 0.15.0 2020-02-10 21:40:27 +01:00
onurays
ba0133a047 Reason input for redacting event is added. 2020-02-10 23:03:37 +03:00
Benoit Marty
01a7ea0bd7 Merge branch 'feature/fix_notif' into develop 2020-02-10 19:16:20 +01:00
Benoit Marty
2e7fa23ce7 Fix #980 2020-02-10 19:13:35 +01:00
Benoit Marty
6750237764 Merge pull request #976 from vector-im/feature/viewEvents
Use View events
2020-02-10 16:46:21 +01:00
Benoit Marty
588a644e02 Merge pull request #975 from vector-im/feature/cleanup
Cleanup push rule code
2020-02-10 16:32:24 +01:00
onurays
1bc1c8ec4a Reorder improvements. 2020-02-10 18:17:22 +03:00
Benoit Marty
7e362be568 Convert to ViewEvents -> Cleanup after review 2020-02-10 16:10:57 +01:00
onurays
83d83e0812 Show confirmation dialog before deleting a message
Fixes #967
2020-02-10 17:58:48 +03:00
Benoit Marty
c97d298166 Merge pull request #948 from vector-im/feature/artifacts_downloading
Feature/artifacts downloading
2020-02-10 14:52:25 +01:00
Benoit Marty
81413e49bc Remove '(yet)' 2020-02-10 14:51:35 +01:00
Benoit Marty
b24f133105 Import strings from Riot 2020-02-10 14:50:21 +01:00
Benoit Marty
5b13be6332 Rename 2020-02-07 19:58:14 +01:00
Benoit Marty
abeb741cad Convert to ViewEvents -> RoomDetailViewModel part 5 2020-02-07 19:50:15 +01:00
Benoit Marty
84e1169525 Convert to ViewEvents -> RoomDetailViewModel part 4 2020-02-07 19:45:54 +01:00
Benoit Marty
27e217fce5 Convert to ViewEvents -> RoomDetailViewModel part 3 2020-02-07 19:41:23 +01:00
Benoit Marty
bdb1f850b2 Convert to ViewEvents -> RoomDetailViewModel part 2 2020-02-07 19:37:30 +01:00
Benoit Marty
0338535efa Convert to ViewEvents -> RoomDetailViewModel part 1 2020-02-07 19:27:18 +01:00
Benoit Marty
0dd3894a49 Use handle() pattern 2020-02-07 19:20:02 +01:00
Benoit Marty
c8ff8d3c9e Convert to ViewEvents -> DeviceListBottomSheetViewModel 2020-02-07 18:59:31 +01:00
Benoit Marty
70973c3302 Convert to ViewEvents -> CrossSigningSettingsViewModel 2020-02-07 18:47:54 +01:00
Benoit Marty
a930313bf3 Convert to ViewEvents -> VerificationBottomSheetViewModel 2020-02-07 18:27:13 +01:00
Benoit Marty
35054dc5e8 Convert to ViewEvents -> CreateDirectRoomViewModel 2020-02-07 18:11:53 +01:00
Benoit Marty
33b123f719 Convert to ViewEvents -> GroupListViewModel 2020-02-07 18:02:42 +01:00
Benoit Marty
24667f38b8 Convert to ViewEvents -> RoomMemberProfileViewModel 2020-02-07 17:47:37 +01:00
Benoit Marty
256a6e4322 Convert to ViewEvents -> RoomDetailViewModel 2020-02-07 17:34:26 +01:00
Benoit Marty
7f5cc77ee0 Convert to ViewEvents -> DevicesViewModel 2020-02-07 17:14:03 +01:00
Benoit Marty
c34307ecf7 Convert to ViewEvents -> RoomDirectoryViewModel 2020-02-07 16:32:01 +01:00
Benoit Marty
dd13b6bd99 Add test for DisplayName condition (passing) 2020-02-07 15:44:46 +01:00
Benoit Marty
9df699db59 Reorder tests 2020-02-07 15:35:09 +01:00
Benoit Marty
8bdb2b88fd make the test compile 2020-02-07 15:32:36 +01:00
Benoit Marty
2a534b5874 Handle SenderNotificationPermissionCondition 2020-02-07 15:32:20 +01:00
Benoit Marty
f719da96ed Rename Condition.Kind enum values and add some documentation 2020-02-07 15:02:39 +01:00
Benoit Marty
31e5c0eb1a Improve algorithm 2020-02-07 14:48:08 +01:00
Benoit Marty
34c5f37bbc findAll() does not return null value 2020-02-07 14:30:44 +01:00
Benoit Marty
9aadbbc3c7 Rework DefaultConditionResolver, and create RoomGetter 2020-02-07 14:27:24 +01:00
Benoit Marty
57758af2d7 Merge pull request #974 from vector-im/feature/crosssigning_cleanup
Improve prompt password dialog
2020-02-07 14:02:15 +01:00
Benoit Marty
0a2474ef12 ktlint 2020-02-07 14:01:18 +01:00
Valere
67bc100782 Merge pull request #959 from vector-im/feature/roomshields_perf
Refactor Room Shield / Profile shield
2020-02-06 16:54:17 +01:00
Benoit Marty
5fedfd9286 Cleanup 2020-02-06 16:00:05 +01:00
Valere
1917fbcc93 eventBus private 2020-02-06 13:56:57 +01:00
Valere
a48bf61ad7 quick dispatch to correct thread (will need more work) 2020-02-06 13:56:57 +01:00
Valere
5c1fcc47a1 Catch all decryption fails in mapping 2020-02-06 13:56:57 +01:00
Valere
d80c15f52f Dispatch init on crypto thread to avoid blocking cold start 2020-02-06 13:56:57 +01:00
Valere
3e2219cbb5 Ignore interrupted exception in setupRx 2020-02-06 13:56:57 +01:00
Valere
bf2e01b8c3 More Rx startWithcallable 2020-02-06 13:56:57 +01:00
Valere
75131fdf44 Post merge fix 2020-02-06 13:56:57 +01:00
Valere
911ff8cf16 cleaning (klint) 2020-02-06 13:56:57 +01:00
Valere
4506b7d6e6 Fix / annoying loading to get active sessions
Start with what's known locally
2020-02-06 13:56:57 +01:00
Valere
320dc4accd Refactor Room Shield / Profile shield 2020-02-06 13:56:57 +01:00
Benoit Marty
ffc9a595dd Merge pull request #964 from vector-im/feature/firefox_account_sso
Support SSO login with Firefox account (#606)
2020-02-06 11:28:16 +01:00
Benoit Marty
1602c6544f We have too many strings... 2020-02-05 18:06:39 +01:00
Benoit Marty
79242c8c16 Merge pull request #892 from vector-im/feature/indonesian_check
Import Indonesian resource check from TravisCI to Weblate pipeline
2020-02-05 18:02:00 +01:00
Benoit Marty
7d00aabc85 Share the same Copyright header. Disabled for XML files 2020-02-05 17:48:59 +01:00
Benoit Marty
ef72f2246a Import Indonesian resource check from TravisCI to Weblate pipeline 2020-02-05 17:47:11 +01:00
Benoit Marty
51c2b9e1e9 Import strings from Riot 2020-02-05 17:35:23 +01:00
Benoit Marty
2a4c8b3199 Support SSO login with Firefox account (#606) 2020-02-05 15:21:54 +01:00
Benoit Marty
3189c114dc Merge pull request #945 from vector-im/feature/stabilization_2
Feature/stabilization 2
2020-02-05 15:19:16 +01:00
Benoit Marty
50814dafe9 Update wording 2020-02-05 14:19:04 +01:00
Benoit Marty
dcd7d17ffd Fix compilation issue after merge and update CHANGES.md 2020-02-05 14:13:43 +01:00
Benoit Marty
d9c007d017 Merge branch 'develop' into feature/stabilization_2 2020-02-05 12:57:42 +01:00
Benoit Marty
05dd587fa8 Move FORMAT_MATRIX_HTML to a proper object and so fix a wrong usage issue 2020-02-05 12:44:31 +01:00
Benoit Marty
3384d91adb Rename MessageContent.type to MessageContent.msgType for code clarity and update a few the Javadoc 2020-02-05 12:39:26 +01:00
Benoit Marty
f72e5c1d94 Explain why and when to use EllipsizingTextView 2020-02-05 12:16:43 +01:00
Benoit Marty
a3ec0e03a0 Use NoOpMatrixCallback when it's possible 2020-02-05 12:05:12 +01:00
Benoit Marty
47ee2a24a7 Move NoOpMatrixCallback to MatrixCallback.kt file 2020-02-05 11:58:08 +01:00
Benoit Marty
b8096f21ea Restore Copyright and cleanup 2020-02-05 11:56:07 +01:00
Benoit Marty
a17ec14dd7 Cleanup and little change on Throwable logging 2020-02-05 11:39:23 +01:00
Benoit Marty
062c4559a2 Merge pull request #955 from vector-im/feature/room_history_in_e2e
Feature/room history in e2e
2020-02-04 21:18:26 +01:00
Benoit Marty
f7d511df38 Ganfra's review 2020-02-04 17:48:17 +01:00
Benoit Marty
6bff951c72 Keep MXCryptoConfig, but do a correct usage of it 2020-02-04 15:37:46 +01:00
Benoit Marty
bd033866a8 Encrypt for invited users by default, if the room state allows it (#803) 2020-02-04 14:41:32 +01:00
Benoit Marty
3e9b2e4a06 Use the correct enableEncryption() method 2020-02-04 14:04:48 +01:00
Ganard
ed9c3379bf Rename file 2020-02-04 13:50:10 +01:00
Ganard
1728d31401 Fix some issues and make test passes 2020-02-04 13:19:02 +01:00
Benoit Marty
225a6e00e6 Add doc and reorder 2020-02-04 12:10:51 +01:00
Benoit Marty
96a729ab2b Move file 2020-02-04 11:53:09 +01:00
Benoit Marty
badb4042ce Add sign_apk_unsafe.sh to the repo 2020-02-04 11:53:09 +01:00
Benoit Marty
c3bb421c1e ignore .idea/inspectionProfiles 2020-02-04 11:53:09 +01:00
Benoit Marty
09212a05d0 Add a script to download artifacts from buildkite 2020-02-04 11:53:09 +01:00
Benoit Marty
e02430bcd0 Ask for permission before opening the camera (#934) 2020-02-03 20:06:37 +01:00
Benoit Marty
4335fa4f72 ktlint 2020-02-03 16:26:18 +01:00
Benoit Marty
6df5edbad1 Version++ 2020-02-03 16:20:55 +01:00
Benoit Marty
007fbf8ed3 Merge branch 'release/0.14.3' 2020-02-03 16:17:55 +01:00
Benoit Marty
362799ac08 Merge branch 'release/0.14.3' into develop 2020-02-03 16:15:52 +01:00
Benoit Marty
0049af7980 Prepare version 0.14.3 2020-02-03 16:15:38 +01:00
Ganard
f454078c6b Clean code 2020-02-03 16:14:36 +01:00
Benoit Marty
783a514496 Improve prompt password dialog
Reveal password, inline error when empty
2020-02-03 15:53:44 +01:00
Ganard
88755a79b4 In memory sending: fix broken filtering 2020-02-03 15:18:19 +01:00
Ganard
e6cd8a3a86 Merge develop into feature/stabilization_2 2020-02-03 13:59:20 +01:00
Valere
ce13e824b6 Merge remote-tracking branch 'origin/develop' into develop 2020-02-02 15:28:05 +01:00
Valere
b182a63ea1 fix concurrent co mofification 2020-02-02 15:28:00 +01:00
Benoit Marty
9ced2048d2 Version++ 2020-02-02 14:26:09 +01:00
Benoit Marty
cfee2f93f2 Prepare v0.14.2 2020-02-02 14:06:21 +01:00
Benoit Marty
97aca28c0d Merge branch 'release/0.14.2' 2020-02-02 14:05:50 +01:00
Benoit Marty
b158729b53 Prepare v0.14.2 2020-02-02 14:05:12 +01:00
Valere
367057cc29 Fix / cold start 2020-02-02 14:01:45 +01:00
Benoit Marty
5fb4f274f9 Version ++ 2020-02-02 08:00:57 +01:00
Benoit Marty
a35302eae0 Merge branch 'release/0.14.1' 2020-02-02 07:56:00 +01:00
Benoit Marty
6f60f1c6b4 Merge branch 'release/0.14.1' into develop 2020-02-02 07:56:00 +01:00
Benoit Marty
435d8cbc55 Prepare v0.14.1 2020-02-02 07:55:46 +01:00
Benoit Marty
bb0fafcb2f Merge pull request #929 from vector-im/feature/xsigning_fix_4
Feature/xsigning fix 4
2020-02-02 03:13:54 +01:00
Benoit Marty
1d2928b3fb ktlint 2020-02-02 03:13:15 +01:00
Benoit Marty
40b0f60964 Fix issue in dark theme. Also do not limit subtitles to 2 lines 2020-02-02 03:11:27 +01:00
Valere
96a556f449 Fix / Race causing key requests to be sent to early in xsigning 2020-02-02 01:21:08 +01:00
Valere
d436d3b8d4 Move rx logs to verbose 2020-02-02 00:41:36 +01:00
Valere
845f3f5ad1 FIx / use password textedit 2020-02-02 00:04:15 +01:00
Valere
fb838e5407 Fixes #813 2020-02-01 23:24:05 +01:00
Benoit Marty
40c70f64a8 Merge branch 'feature/to_device_done' into develop 2020-02-01 18:48:34 +01:00
Valere
245b3717b9 Send done in toDevice 2020-02-01 18:25:31 +01:00
Benoit Marty
9e15891053 Version++ 2020-02-01 17:21:41 +01:00
Benoit Marty
637eba277f Merge branch 'release/0.14.0' 2020-02-01 17:20:05 +01:00
Benoit Marty
649ebf4a34 Merge branch 'release/0.14.0' into develop 2020-02-01 17:20:04 +01:00
Benoit Marty
e9f220cca2 Prepare release 0.14.0 2020-02-01 17:19:53 +01:00
Benoit Marty
8a9bd97a88 Merge pull request #924 from vector-im/feature/crossing_fix_2
Feature/crossing fix 2
2020-02-01 17:17:30 +01:00
Valere
26400e6372 Prompt before resetting keys 2020-02-01 15:20:04 +01:00
Valere
282be29247 temp shield for read only 2020-02-01 15:20:04 +01:00
Benoit Marty
6ee7ee1460 Fix blink effect 2020-02-01 15:04:22 +01:00
Valere
2e0a84ccc9 display profile faster from known info 2020-02-01 15:03:00 +01:00
Valere
9d6e7d7bd0 Learn more shows my devices when keys not trusted 2020-02-01 14:36:17 +01:00
Valere
8f7b18239d Warn on verify when private keys not known 2020-02-01 14:36:17 +01:00
Benoit Marty
10094a212c ktlint 2020-02-01 14:02:51 +01:00
Benoit Marty
53e36dca9c ZXing 3.3.3 because of https://github.com/zxing/zxing/issues/1170 2020-02-01 13:52:33 +01:00
Benoit Marty
6ec2dd8c00 Add startWith and logs 2020-02-01 12:12:40 +01:00
Benoit Marty
f098d6cf5b Add startWith 2020-02-01 11:45:45 +01:00
Benoit Marty
cd606ba8a1 RoomMember decoration 2020-02-01 11:37:16 +01:00
Benoit Marty
59abee10f8 Convert to ConstraintLayout 2020-02-01 11:37:16 +01:00
Valere
64df9e23c2 Room Profile / Just show e2e status remove learn more 2020-02-01 11:03:00 +01:00
Valere
fc4f5faffd Update Room decoration algo 2020-02-01 10:21:29 +01:00
Benoit Marty
256f8b77aa Add Timber to rx module 2020-02-01 10:09:22 +01:00
Benoit Marty
f2f775cb99 Add TODOs 2020-02-01 01:17:18 +01:00
Benoit Marty
2616a889ef Merge pull request #923 from vector-im/feature/xcrossing_fix
Decoration in room profile and improve Rx flow
2020-01-31 20:48:20 +01:00
Benoit Marty
ccd4c1ed86 ktlint 2020-01-31 20:46:33 +01:00
Benoit Marty
bb92882958 (partially) Fix glitch 2020-01-31 20:28:57 +01:00
Benoit Marty
46dd17644f Room decoration - in room profile UI 2020-01-31 20:12:02 +01:00
Benoit Marty
7e34b2a672 Room decoration - convert to ConstraintLayout 2020-01-31 20:02:01 +01:00
Benoit Marty
c3c88c387b Improve Rx chain and cleanup 2020-01-31 19:55:22 +01:00
Valere
51e0f945a7 Quick Room Decoration 2020-01-31 18:52:33 +01:00
Ganard
37230b0614 Fix issues with read marker and jumpToBottom 2020-01-31 18:09:34 +01:00
Benoit Marty
fd3619b100 Merge pull request #770 from vector-im/cross_signing
Cross signing
2020-01-31 17:05:18 +01:00
Benoit Marty
e18b9d5155 Room decoration - UI in room list 2020-01-31 16:10:52 +01:00
Ganard
ec6d78bf96 Merge branch 'develop' into feature/stabilization_2 2020-01-31 15:47:33 +01:00
Ganard
759b680e63 Timeline/Sync: Fix some issues 2020-01-31 15:28:35 +01:00
Benoit Marty
f5ecf4bd90 Room decoration - UI 2020-01-31 15:02:54 +01:00
Valere
27c74c9118 live device in settings 2020-01-31 14:42:00 +01:00
Benoit Marty
4d91bc934b Fix ktlint 2020-01-31 14:12:03 +01:00
Valere
5c547794f2 Merge branch 'develop' into cross_signing 2020-01-31 14:09:40 +01:00
Benoit Marty
43358cd86c Make self verification work! 2020-01-31 12:18:27 +01:00
Benoit Marty
87b76d10dd Format 2020-01-31 11:11:27 +01:00
Benoit Marty
80f4f95f81 QRCode: requestId is not supposed to be an eventId 2020-01-31 11:11:27 +01:00
Valere
8e5c7239cf Settings Sessions / Now live + support devices with no keys 2020-01-31 10:33:53 +01:00
Valere
7b385c3b36 Quick copy change device -> session 2020-01-31 10:00:44 +01:00
Valere
4fb59aadb1 Fix / ensure RoomKeyRequest are made after device is verified 2020-01-31 09:39:31 +01:00
Valere
850c830e1f Fix / auto ready request when waiting bottomsheet on screen 2020-01-31 09:16:03 +01:00
Benoit Marty
9dde43f65b PR Review: var -> val, internal and other cleanup 2020-01-30 23:40:25 +01:00
Benoit Marty
9d566e9352 Merge pull request #918 from vector-im/feature/sort_room_members
Sort room members by display names
2020-01-30 21:06:40 +01:00
Benoit Marty
eb46a4949f Merge pull request #920 from duncanturk/patch-1
Add "get it on F-Droid"
2020-01-30 21:05:53 +01:00
Benoit Marty
506c2dd262 Merge pull request #921 from vector-im/decorations
Add field in QR code and make some optional
2020-01-30 18:48:30 +01:00
Benoit Marty
ccd857016c ktlint 2020-01-30 18:46:08 +01:00
Benoit Marty
225e4e0433 To Device Verification Request 2020-01-30 18:43:50 +01:00
Ganard
5e1b59f9d3 Timeline: handle an in memory local echo to make the UI snappier 2020-01-30 17:13:44 +01:00
Benoit Marty
069bd3c258 use isMe 2020-01-30 16:59:22 +01:00
Benoit Marty
fb98d6ef42 QRCode: add other_device_key field and make it optional, along with other_user_key 2020-01-30 16:46:12 +01:00
Benoit Marty
6282f81bc4 Remove typo 2020-01-30 16:46:12 +01:00
Valere
a5ca2b1d34 Fix / incoming start verif popup should not show when bottomsheet there 2020-01-30 16:36:13 +01:00
Valere
50d5ad3625 Self verification + toDevice Request 2020-01-30 16:35:42 +01:00
Valere
03c5e61b2e Fix / post merge 2020-01-30 16:35:06 +01:00
Valere
4ddd831d7f Prepare support for toDevice .request 2020-01-30 16:11:34 +01:00
Valere
ff95392e10 Fix / Refresh trust state on own keys/device trust change 2020-01-30 16:10:59 +01:00
Benoit Marty
e2c2c2418c Merge pull request #919 from vector-im/qr_step_validate
Qr step validate
2020-01-30 14:14:16 +01:00
Christopher Rossbach
e44dc347c6 Add "get it on F-Droid"
RiotX is on F-Droid now
2020-01-30 12:07:33 +01:00
Benoit Marty
fbd0bbc575 Improve clarity of the algorithm to enable encryption for DMs 2020-01-30 11:24:05 +01:00
ganfra
b848d0530f Update realm to 6.1.0: should fix some of the native crashes 2020-01-30 11:04:37 +01:00
Benoit Marty
2bccd19f84 QRcode: Url encode the keys 2020-01-30 10:17:04 +01:00
Benoit Marty
2111daea52 Add a step to confirm that other user has scanned the SR code 2020-01-30 10:09:59 +01:00
ganfra
9fc3fa7f19 Update some libs and remove incremental from dagger 2020-01-29 21:14:38 +01:00
Benoit Marty
57a13fa30d Sort room members by display names 2020-01-29 18:07:57 +01:00
Benoit Marty
c4649a5824 Merge pull request #916 from vector-im/debug_qr
Negotiate E2E by default for DMs (#907)
2020-01-29 18:02:43 +01:00
ganfra
71a02a58af Sync/Timeline: handle displayName isUnique 2020-01-29 17:30:31 +01:00
Benoit Marty
6f6c3184dd Avoid test if previous result is null 2020-01-29 17:13:41 +01:00
Benoit Marty
d7feb6dd5c Merge pull request #913 from vector-im/feature/rainbow
Rainbow
2020-01-29 16:35:34 +01:00
Benoit Marty
e6c3f7c77b Nicer API 2020-01-29 16:26:19 +01:00
Benoit Marty
8b6ffc2fb1 ktlint 2020-01-29 16:18:33 +01:00
Benoit Marty
ae36846aaf Negotiate E2E by default for DMs (#907) 2020-01-29 16:11:23 +01:00
Benoit Marty
237da5bb16 No need to have mutable list in param 2020-01-29 16:03:28 +01:00
ganfra
7f72af426b Timeline: fix getContext 2020-01-29 16:02:53 +01:00
Benoit Marty
a4abe5f552 Set timeout to 60s when creating a room 2020-01-29 16:00:07 +01:00
Benoit Marty
e1ddde5501 Make CreateRoomParams a regular data class 2020-01-29 14:23:32 +01:00
Valere
754ca3c582 Fix / fail to update usk when dl own keys 2020-01-29 14:00:02 +01:00
Benoit Marty
70b04dbaea Disable not passing test, to avoid waiting too long when running the test suite 2020-01-29 12:36:38 +01:00
Benoit Marty
b44b6726ed Also update the tests 2020-01-29 12:29:19 +01:00
Benoit Marty
80ec199135 Convert VerificationTxState to a sealed class 2020-01-29 12:00:49 +01:00
Benoit Marty
305dfd4c7a Merge pull request #911 from vector-im/feature/encryption_notice
Modify encryption notice
2020-01-29 10:32:23 +01:00
Benoit Marty
73bb4bb785 Merge pull request #912 from vector-im/feature/e2e_opt_out
e2e opt in when creating room (not DM)
2020-01-29 10:29:33 +01:00
Valere
1d84ccd64a Merge pull request #881 from vector-im/xsigning_sdk
Xsigning sdk
2020-01-29 10:26:46 +01:00
Valere
63e36b0403 Remove unused test 2020-01-29 10:16:57 +01:00
Valere
2c568b4de9 clean klint 2020-01-29 09:59:09 +01:00
Benoit Marty
27fe4e3680 Fix build and add tests 2020-01-29 09:44:53 +01:00
Benoit Marty
007b0cabf2 Add a few TUs 2020-01-28 22:43:10 +01:00
Benoit Marty
b2338dfcd3 Make the TU passes 2020-01-28 22:35:40 +01:00
Benoit Marty
6d7d4993a6 Add TUs for RainbowGenerator (not all passing) 2020-01-28 21:56:02 +01:00
Benoit Marty
da9b9f4864 Make the whole cell clickable 2020-01-28 21:31:02 +01:00
Benoit Marty
ef0b438a89 Give the possibility to enable encryption when creating room (#837) 2020-01-28 21:31:02 +01:00
Ganard
a8f783bbfa Add state events to chunks 2020-01-28 18:59:21 +01:00
Valere
9a79297e14 Merge pull request #910 from vector-im/qr_code_step_2
Qr code step 2
2020-01-28 18:11:09 +01:00
Valere
a57393cafa More log + quick fix in settings 2020-01-28 18:09:17 +01:00
Benoit Marty
e12de3fba0 Merge pull request #891 from vector-im/feature/event-unknown
Feature/event unknown
2020-01-28 17:30:02 +01:00
Benoit Marty
2eeeea3377 Encryption is enabled only for MEGOLM. 2020-01-28 17:19:22 +01:00
Benoit Marty
976a8fc568 Hide the algorithm when turning on e2e (#897) 2020-01-28 16:36:28 +01:00
Benoit Marty
b7ecfd997d Fix compilation issue after rebase 2020-01-28 16:02:20 +01:00
Benoit Marty
e0b3ea7e48 QrCode: WIP 2020-01-28 15:55:44 +01:00
Benoit Marty
9c829e62e6 QrCode: WIP 2020-01-28 15:55:44 +01:00
Benoit Marty
20c7e4c3ad QrCode: improve UI 2020-01-28 15:55:44 +01:00
Benoit Marty
69ab5e43d5 QrCode: WIP 2020-01-28 15:55:02 +01:00
Benoit Marty
f46023e84c QrCode: WIP 2020-01-28 15:55:02 +01:00
Benoit Marty
d8d465f70b QrCode: WIP 2020-01-28 15:53:57 +01:00
Benoit Marty
8659216955 QrCode: WIP 2020-01-28 15:53:57 +01:00
Benoit Marty
39e746413a QrCode: WIP 2020-01-28 15:53:57 +01:00
Benoit Marty
0aaba26f17 Rename classes 2020-01-28 15:53:57 +01:00
Benoit Marty
fc04833157 Rename parameter 2020-01-28 15:53:57 +01:00
Benoit Marty
f80861bed8 Add TODO 2020-01-28 15:53:57 +01:00
Benoit Marty
9e796067cc Do not support SHOW or SCAN if cross-signing is not enabled 2020-01-28 15:53:57 +01:00
Benoit Marty
fb5148fd43 Avoid to inject credential (again) 2020-01-28 15:52:17 +01:00
Benoit Marty
be77017209 Avoid injecting credentials. Inject userId and deviceId instead
And cleanup API
2020-01-28 15:48:09 +01:00
Benoit Marty
962b85b041 Add TODO 2020-01-28 15:48:09 +01:00
Benoit Marty
adc2d570eb QR code: handle the case where other user can scan QR codes 2020-01-28 15:48:09 +01:00
Benoit Marty
df49ab8362 QR code: update code which build URL 2020-01-28 15:48:09 +01:00
Benoit Marty
efc8cfb9a1 QR code: modify APIs 2020-01-28 15:48:09 +01:00
Benoit Marty
345824daa2 Keep on renaming 2020-01-28 15:48:09 +01:00
Benoit Marty
050eb0af9d Create dedicated View and Epoxy item for QrCode 2020-01-28 15:48:09 +01:00
Valere
ca4ed6e1bd Fix / Error management and clear keys 2020-01-28 15:35:11 +01:00
Ganard
bf7c53ecab Sync/pagination: get a working version 2020-01-28 14:46:26 +01:00
Valere
f021f8110d post merge 2020-01-28 12:04:19 +01:00
Valere
109ff4f908 Merge branch 'cross_signing' into xsigning_sdk 2020-01-28 11:33:54 +01:00
Valere
c9f0209ebf post merge fix 2020-01-28 11:23:37 +01:00
Valere
7daa088618 Merge branch 'develop' into cross_signing 2020-01-28 11:13:31 +01:00
Valere
83e44ac96e Fix / cross signing info live data not always updated 2020-01-28 11:02:12 +01:00
Ganard
15b0bea870 Use clone for retrofit request to be able to retry 2020-01-28 10:13:36 +01:00
Ganard
e5e62dc4a7 Fix SyncService and Alarm 2020-01-28 10:13:19 +01:00
Benoit Marty
f3e88c75cf Fix typo 2020-01-28 09:42:56 +01:00
Valere
ea6e8a6789 Basic debug screen to setup keys 2020-01-27 23:51:08 +01:00
Valere
6cece03998 Profile detailed device info + verify manually 2020-01-27 17:55:00 +01:00
Ganard
f3db43f317 Ellipsize: introduce EllipsizingTextView 2020-01-27 12:41:43 +01:00
Valere
08ae0b485a Profile Screen / Add show device list trust screen 2020-01-27 09:25:58 +01:00
Valere
665c577747 SDK / update trust on key change + live method in Service 2020-01-27 09:25:16 +01:00
ganfra
3a89a30056 Continue reworking sync/timeline events handling 2020-01-25 18:59:45 +01:00
Valere
d60351bcb7 Verify from RoomMember Profile 2020-01-24 19:15:23 +01:00
Ganard
1d8b81bb04 Try reworking events/timeline process [WIP] 2020-01-24 18:43:35 +01:00
Valere
a758efc018 Renamed room transport classes 2020-01-24 11:32:24 +01:00
Valere
d0addc4c4f Refactored Verification Classes 2020-01-24 11:29:26 +01:00
Valere
bb5179140c Update profile screen for xSigning 2020-01-24 09:14:32 +01:00
Benoit Marty
e9ea69f055 Add support for /rainbow and /rainbowme command (#879) 2020-01-23 23:34:21 +01:00
ganfra
7bcae75314 Remove some code from main thread 2020-01-23 20:31:18 +01:00
ganfra
4331d2ef47 Network: reword the strategy for handling NetworkConnectivity (remove Merlin) 2020-01-23 19:08:55 +01:00
Valere
e47791f290 Merge pull request #888 from vector-im/qr_code
Qr code
2020-01-23 16:41:23 +01:00
Valere
91ae96a153 QuickFix / Do not verify yourself in dm 2020-01-23 16:16:57 +01:00
Valere
0148949a4f Fix / prevent verification toaster to show when in good room 2020-01-23 16:13:46 +01:00
Valere
65cb812fc6 Fix / Unknown transaction when started by other after request 2020-01-23 16:04:29 +01:00
Valere
e8a4f1fb90 Fix: .cancel won't appear in debug show all 2020-01-23 16:04:03 +01:00
Benoit Marty
632832a651 Nearly same code for DefaultItem and NoticeItem 2020-01-23 15:44:41 +01:00
Benoit Marty
d530c64a84 Render defaultItem as other item: display user avatar
Also ensure bottom sheet always has a header, for user avatar and date
2020-01-23 15:35:46 +01:00
Benoit Marty
426e291ce9 i18n for RiotX limitation messages 2020-01-23 14:46:36 +01:00
Valere
1276d1f39d Update My device list + action to verify 2020-01-23 13:57:17 +01:00
Benoit Marty
4a1012cf81 Add TODOs 2020-01-23 11:48:08 +01:00
Benoit Marty
5819790c1b Distinguish Show SR code and Scan QR code capability 2020-01-23 11:25:44 +01:00
Benoit Marty
b3089343ad Support SCAN method (WIP) 2020-01-23 10:47:29 +01:00
ganfra
c65f25d7ae Rx: fix startWith on mainThread 2020-01-23 10:18:22 +01:00
Benoit Marty
37b950897f Base64 no wrap and extension for the reverse operation 2020-01-23 10:17:07 +01:00
ganfra
fee2ec6b66 Scroll when event build come from sync/send + remove use of monarchy writeAsync 2020-01-22 20:33:52 +01:00
Benoit Marty
d2fab91e9d Improve code 2020-01-22 19:08:21 +01:00
Benoit Marty
c323b61575 Ignore typo 2020-01-22 18:27:59 +01:00
Benoit Marty
0e55f81879 Ensure all is escaped properly 2020-01-22 18:26:34 +01:00
Benoit Marty
cbf418c401 Update after MSC change 2020-01-22 18:22:01 +01:00
Benoit Marty
41c691f26c Create QrCodeData class and method to convert to URL and vice versa, with TUs 2020-01-22 17:58:25 +01:00
Benoit Marty
81337d1624 Also keep the same parameter order: (userId, deviceId) to avoid silly errors 2020-01-22 17:00:16 +01:00
Benoit Marty
79df6b8402 Start plugin QR code to the code 2020-01-22 15:56:43 +01:00
Benoit Marty
537b1be0c5 Update wording 2020-01-22 15:26:26 +01:00
Benoit Marty
c1259161e5 QRCode: generate and scan QRCodes 2020-01-22 15:03:56 +01:00
ganfra
76065ac4fc Read: allow setting read marker and read receipt to latest known event independently 2020-01-22 14:43:39 +01:00
ganfra
d93050240a Start reworking networkConnectivityCheck (WIP) 2020-01-22 14:41:42 +01:00
Benoit Marty
75e39535bc Merge pull request #883 from vector-im/feature/share
Improve the room list when sharing to RiotX
2020-01-22 11:49:50 +01:00
Benoit Marty
c971f18fc0 Add section header when displaying room list to share (#771) 2020-01-22 11:49:30 +01:00
Benoit Marty
3c2fa40b58 Sharing things to RiotX: sort list by recent room first (#771) 2020-01-22 11:49:04 +01:00
Benoit Marty
0b74863c6d Merge pull request #877 from vector-im/feature/version_name
F-Droid: fix the "-dev" issue in version name (#815)
2020-01-22 11:45:36 +01:00
Benoit Marty
dca950140d Merge branch 'develop' into feature/version_name 2020-01-22 11:45:27 +01:00
Benoit Marty
a13a78ccc0 Merge pull request #874 from vector-im/feature/authors
Builds repoductibility and Authors file
2020-01-22 11:43:51 +01:00
Benoit Marty
7327dc97b4 Merge pull request #876 from vector-im/feature/room_settings
Room settings, and enable encryption in unencrypted rooms (#212)
2020-01-22 11:40:26 +01:00
ganfra
2bddf61afe Update realm to 6.1.0: should fix some of the native crashes 2020-01-21 15:15:29 +01:00
Benoit Marty
da3e547d82 Create facility extension to observe ViewEvents 2020-01-21 15:08:49 +01:00
Valere
a0aa1f34d3 Quick Fix todevice verif broken
Added dbg screen for cross signing
2020-01-21 14:58:06 +01:00
ganfra
d1b8d81fb1 Fix double read receipts 2020-01-21 14:17:04 +01:00
Benoit Marty
e81c804ed6 Ensure when will be exhaustive 2020-01-21 12:51:28 +01:00
Benoit Marty
be371f9279 Introduce ViewEvents in ViewModel and code harmonization 2020-01-21 12:51:28 +01:00
Valere
a6364f0be5 remove dead code 2020-01-21 10:25:57 +01:00
Valere
390879e3fd Added check self keys + force DL after initialize Xsigning 2020-01-21 10:25:57 +01:00
Valere
6ab540045b Refactoring / deprecation of MXDeviceInfo
introduced TrustLevels
2020-01-21 10:25:57 +01:00
Valere
98ba2d39a8 SAS verif, support signing and verification of Cross Signing 2020-01-21 10:25:57 +01:00
Valere
859c75df98 Initial commit 2020-01-21 10:25:57 +01:00
Valere
ea9166e0c6 Merge pull request #811 from vector-im/verification_toasters
[Cross Signing DM Verif]  Basic Incoming request toast + cleaning
2020-01-21 10:21:24 +01:00
Benoit Marty
d672313649 Room settings: use boolean instead of Async 2020-01-20 17:41:29 +01:00
Benoit Marty
f5e6b4b857 F-Droid: fix the "-dev" issue in version name (#815) 2020-01-20 16:08:57 +01:00
Benoit Marty
28db05e509 Cleanup and copy wording from Riot-Web 2020-01-20 15:39:14 +01:00
Benoit Marty
56b140fcb4 Room settings: rename stuff for genericity 2020-01-20 15:23:40 +01:00
Benoit Marty
eee6969b02 Room settings, and enable encryption in unencrypted rooms (#212) 2020-01-20 15:11:21 +01:00
Benoit Marty
825427b7b0 Add a first content into the AUTHORS file 2020-01-17 16:50:18 +01:00
Benoit Marty
8c32796d5c Ensure builds are reproducible (#842) 2020-01-17 16:06:58 +01:00
Valere
e45c1e6c2a Fix / post merge issues 2020-01-17 15:17:16 +01:00
Benoit Marty
188cd6beff Verification: improve blinking effect (not perfect yet) 2020-01-17 15:05:06 +01:00
Benoit Marty
aaeb54db7c Verification: Introduce VerificationMethod enum 2020-01-17 15:05:06 +01:00
Benoit Marty
92f26bc20a Verification: migrate to Epoxy - Cleanup 2020-01-17 15:05:06 +01:00
Benoit Marty
fc22b7988f Verification: migrate to Epoxy - Add missing icons 2020-01-17 15:05:06 +01:00
Benoit Marty
878bae1c45 Verification: migrate to Epoxy - Choose Fragment 2020-01-17 15:05:06 +01:00
Benoit Marty
a8e81d95cf Verification: migrate to Epoxy - Disable item animation 2020-01-17 15:05:06 +01:00
Benoit Marty
cd1665a8e8 Verification: migrate to Epoxy - Conclusion 2020-01-17 15:05:06 +01:00
Benoit Marty
7170471686 Verification: migrate to Epoxy - create sub packages 2020-01-17 15:05:06 +01:00
Benoit Marty
98020404ff Verification: migrate to Epoxy - rename package 2020-01-17 15:05:06 +01:00
Benoit Marty
b2348427bd Verification: migrate to Epoxy - Emoji Fragment 2020-01-17 15:05:06 +01:00
Benoit Marty
832df59b58 Verification: migrate to Epoxy - Request Fragment 2020-01-17 15:05:06 +01:00
Benoit Marty
32689facc5 Verification: migrate to Epoxy - Request Fragment 2020-01-17 15:05:06 +01:00
Benoit Marty
d3071e5816 Rename layout for consistency 2020-01-17 15:04:36 +01:00
Benoit Marty
83a6f564c3 Ensure BottomSheets call ButterKnife unbinder 2020-01-17 15:04:36 +01:00
Benoit Marty
3b420dbb50 typo 2020-01-17 15:04:36 +01:00
Benoit Marty
9fe155bafd postWork now returns the Cancellable 2020-01-17 15:04:36 +01:00
Benoit Marty
3c982866d8 Restore lost Fragment binding... 2020-01-17 15:04:36 +01:00
Benoit Marty
494ad83704 Inject WorkManagerProvider, to avoid injecting the Android context
Also ensure WorkManager uses a distinct tags for each session (for future multi-sessions support)
2020-01-17 15:04:36 +01:00
Benoit Marty
4543658ae0 Extends SessionWorkerParams 2020-01-17 15:04:36 +01:00
Benoit Marty
689fd1ea90 Fix issue with SessionId for the worker
Also rename some variables
2020-01-17 15:04:36 +01:00
Valere
a95410c118 fix rebase 2020-01-17 15:04:36 +01:00
Valere
8749e49e80 Basic Incoming request toast + cleaning 2020-01-17 15:04:36 +01:00
Valere
8400ab6efe Merge branch 'develop' into cross_signing 2020-01-17 14:57:08 +01:00
Benoit Marty
d1699279fe Version++ 2020-01-17 14:25:25 +01:00
Benoit Marty
f471d9cff8 Merge branch 'release/0.13.0' 2020-01-17 14:24:11 +01:00
Benoit Marty
115058124c Merge branch 'release/0.13.0' into develop 2020-01-17 14:24:10 +01:00
Benoit Marty
7604748d3f Prepare release 0.13.0 2020-01-17 14:23:58 +01:00
Benoit Marty
d46a3ab87f Update CHANGES.md 2020-01-17 14:10:47 +01:00
Benoit Marty
b375463aec Merge pull request #854 from vector-im/feature/profiles_improvements
Feature/profiles improvements
2020-01-17 12:22:16 +01:00
Benoit Marty
cfb752c220 Merge pull request #851 from vector-im/feature/code_style
Share the same code formatting rules
2020-01-17 12:21:34 +01:00
Benoit Marty
c59712732a Introduce listener type for Epoxy items 2020-01-17 12:14:24 +01:00
Benoit Marty
626ebd9c63 Merge pull request #850 from vector-im/feature/e2e_attachments_cleanup
Feature/e2e attachments cleanup
2020-01-17 12:12:48 +01:00
Benoit Marty
5148d7ab46 Room profile: open it also when clicking on the room avatar 2020-01-17 10:15:04 +01:00
Benoit Marty
8c2a55a5a2 Settings: restore "Show read receipts" setting and create categories of per Riot-Web 2020-01-17 10:10:46 +01:00
Benoit Marty
34b6dd4270 Room profile: open room member profile from Event bottom sheet 2020-01-16 21:48:10 +01:00
Benoit Marty
79a68a36bd Room profile: ensure RoomMemberSummaries order is guaranteed 2020-01-16 21:29:05 +01:00
Benoit Marty
78408fa0ec Room profile: create extension join for Collections 2020-01-16 21:18:14 +01:00
Benoit Marty
b56ee9a377 Room profile: fix issue with divider color 2020-01-16 20:53:38 +01:00
Benoit Marty
9eff459ed6 Room profile: remove an extra divider 2020-01-16 16:43:37 +01:00
Benoit Marty
cd44b60bd5 Room profile: make link in room topic clickable 2020-01-16 16:36:56 +01:00
Benoit Marty
17ed8da57a Room profile: fix issue with icon 2020-01-16 16:27:21 +01:00
Benoit Marty
8ae51a95c5 Add formatting policy in the Contributing guide 2020-01-16 16:02:41 +01:00
Benoit Marty
f80f22fed2 XML formatting rule 2020-01-16 15:58:52 +01:00
Benoit Marty
fa57d0f6d5 160 char max per line 2020-01-16 15:27:00 +01:00
Benoit Marty
1104b5d483 DO_NOT_WRAP_AFTER_SINGLE_ANNOTATION 2020-01-16 14:26:52 +01:00
Benoit Marty
464462022c Kotlin code convention 2020-01-16 14:17:29 +01:00
Benoit Marty
1c63d3f8f0 Add rule 2020-01-16 14:15:50 +01:00
Benoit Marty
a916bd4ba8 Share the same code formatting rules 2020-01-16 14:05:14 +01:00
Benoit Marty
15e2c9f3a3 Fix formatting 2020-01-16 12:55:55 +01:00
Benoit Marty
f1a2fb51f5 Properly configure Snackbar styles 2020-01-16 12:51:33 +01:00
Benoit Marty
b0aa9fbd8f Inform user when the download of a file starts 2020-01-16 12:20:39 +01:00
Benoit Marty
d72f1ac576 Avoid exposing internal classes 2020-01-16 11:36:53 +01:00
Benoit Marty
ca157c7567 Better logs 2020-01-16 10:57:08 +01:00
Benoit Marty
ae26bf3369 Signout also clear cache 2020-01-16 10:57:08 +01:00
Benoit Marty
159c96681f Improve attachment encryption and decryption code 2020-01-16 10:57:08 +01:00
Benoit Marty
96d6b75037 Fix broken link 2020-01-16 10:57:08 +01:00
Benoit Marty
72e6181f00 Merge pull request #839 from vector-im/feature/developer
Show all hidden event in the timeline when the developer settings is ON
2020-01-16 10:56:27 +01:00
Benoit Marty
4ae09b8716 Merge pull request #831 from david1hyman/file-decryption-fix
File decryption path was writing incorrect stream to file
2020-01-16 10:50:15 +01:00
ganfra
f128ed437f Merge pull request #843 from vector-im/feature/room_profile
Feature/room profile
2020-01-15 19:17:50 +01:00
ganfra
11c8c8c2bd Fix fdroid background sync 2020-01-15 19:16:50 +01:00
ganfra
2c331671ee Fix string 2020-01-15 17:44:38 +01:00
ganfra
b44ddcfd61 Clean code after Benoit's review #2 2020-01-15 14:57:21 +01:00
ganfra
7c0f2d6e32 Test: fix import 2020-01-15 11:48:02 +01:00
ganfra
52de14b1b5 Clean code after Benoit's review 2020-01-15 11:46:33 +01:00
ganfra
d6e6092eea Profile: add PowerLevelContent for building future actions + fix divider 2020-01-14 19:14:15 +01:00
ganfra
9671a77e5d Clean code and update CHANGES 2020-01-14 18:48:13 +01:00
ganfra
d3415d345f Merge branch 'develop' into feature/room_profile 2020-01-14 18:35:01 +01:00
ganfra
df4df81ef3 Profile: handle ignore/unignore action + adjust UI 2020-01-14 17:08:21 +01:00
Valere
a7c948815c Merge branch 'develop' into cross_signing 2020-01-14 12:31:29 +01:00
Benoit Marty
9d5197b1c8 Show all hidden event in the timeline when the developer settings is ON 2020-01-13 22:47:41 +01:00
ganfra
162f0949fa Profile: Start fetching profile info from a user 2020-01-13 18:44:01 +01:00
ganfra
ae1a24e948 Room member profile: branch the UI and fix some UI issues 2020-01-13 16:49:14 +01:00
Benoit Marty
b5fead18fe Merge pull request #833 from vector-im/feature/typing
Send and render typing events (#564)
2020-01-13 15:17:43 +01:00
Benoit Marty
3c682430d9 Merge pull request #829 from vector-im/feature/stab
Feature/stab
2020-01-13 15:13:07 +01:00
Benoit Marty
717965bc37 Update comment 2020-01-13 15:12:39 +01:00
Benoit Marty
ecc463e920 Cleanup and fix a bug 2020-01-13 10:13:12 +01:00
Benoit Marty
f3e52b96c0 Cleanup 2020-01-11 22:12:56 +01:00
Benoit Marty
dd81fce8d8 Send and render typing events (#564) 2020-01-11 20:50:09 +01:00
Valere
7354eab061 Post merge fixes 2020-01-11 10:16:09 +01:00
David Hyman
1ae58aa6ad DefaultFileService - code was passing the inputStream to the decryption method
but not storing the output of the method anywhere
then it was writing inputStream to file and returning that file handle
changed inputStream to var and used it to store output of decryption method
2020-01-10 14:53:40 -05:00
Valere
fb9abefe59 Merge branch 'develop' into cross_signing 2020-01-10 18:38:54 +01:00
Benoit Marty
095216349e Exception -> Throwable 2020-01-10 18:35:29 +01:00
Benoit Marty
550908fa70 Render events m.room.encryption and m.room.guest_access in the timeline 2020-01-10 18:30:10 +01:00
Benoit Marty
0dbca829ea Fix crash with RoomCreationParams 2020-01-10 18:07:14 +01:00
Benoit Marty
03b5b098c7 Change the way versionCode is computed (#827) 2020-01-10 17:29:34 +01:00
ganfra
171ec4fbdc Room member list: group by power level 2020-01-10 17:03:11 +01:00
Benoit Marty
32d2daee3c Exclude current user from autocompletion with room members 2020-01-10 16:28:14 +01:00
Benoit Marty
de84bb7535 Use more developerMode() 2020-01-10 11:03:42 +01:00
ganfra
81712ae736 RoomProfile: fix some rendering + change anim 2020-01-09 19:47:54 +01:00
ganfra
289951ea4a RoomMemberList : start showing items 2020-01-09 15:54:36 +01:00
Benoit Marty
8c9c65837d Version++ 2020-01-09 15:32:37 +01:00
Benoit Marty
24a7ce7d98 Merge branch 'release/0.12.0' 2020-01-09 15:31:30 +01:00
Benoit Marty
d486e613d8 Merge branch 'release/0.12.0' into develop 2020-01-09 15:31:29 +01:00
Benoit Marty
598d67234c Prepare release 0.12.0 2020-01-09 15:31:13 +01:00
Benoit Marty
fea4f2e129 Merge pull request #816 from vector-im/feature/integration_tests
Start porting of integration tests - Fix issue with multiple sessions
2020-01-09 15:28:29 +01:00
Benoit Marty
687ea1b5b3 ktlint 2020-01-09 15:28:16 +01:00
Benoit Marty
47e3b8ec46 Ensure foreground notification is always displayed 2020-01-09 15:09:37 +01:00
Benoit Marty
dd8c908dc7 Code cleanup 2020-01-09 15:02:39 +01:00
Benoit Marty
9775e8c32b Fix crash in syncService 2020-01-09 15:01:16 +01:00
Benoit Marty
e3205fb493 Fix compilation issue after rebase 2020-01-09 14:26:36 +01:00
Benoit Marty
35f011ba37 Fix ktlint issues 2020-01-09 14:20:17 +01:00
Benoit Marty
ed773dbb96 TI: Introduce doSync method 2020-01-09 14:20:17 +01:00
Benoit Marty
fa821826d2 TI: Import ExportEncryption test (passing) 2020-01-09 14:20:17 +01:00
Benoit Marty
293e3e3ce6 TI: Import AttachmentEncryption test (passing) 2020-01-09 14:20:17 +01:00
Benoit Marty
4244c0e48d TI: Import SAS Test - WIP 2020-01-09 14:20:17 +01:00
Benoit Marty
76e45431da TI: Import keys backup tests 2020-01-09 14:20:17 +01:00
Benoit Marty
f3fb07079e Cleanup tests 2020-01-09 14:20:17 +01:00
Benoit Marty
3ceac70536 Enable encryption on a room, SDK part (#212) 2020-01-09 14:20:17 +01:00
Benoit Marty
0f7209df1f TI: finish the work to identify a session with a sessionId 2020-01-09 14:20:17 +01:00
Benoit Marty
e177251ec0 TI: inject EventBus to allow multiple sessions - WIP 2020-01-09 14:20:17 +01:00
Benoit Marty
6746f68411 TI: create account 2020-01-09 14:20:17 +01:00
Benoit Marty
fc6d845c0d Import tests from legacy SDK 2020-01-09 14:20:17 +01:00
Benoit Marty
93cdce6c3e Cleanup tests 2020-01-09 14:20:17 +01:00
Benoit Marty
ae3381227c Add Unit tests from legacy SDK 2020-01-09 14:20:17 +01:00
Benoit Marty
b6a1ff1ca4 Import string from Riot legacy 2020-01-09 14:17:17 +01:00
Benoit Marty
7ec0227528 Merge pull request #824 from vector-im/feature/wording
Email domain can be limited on some homeserver, i18n of the displayed error (#754)
2020-01-09 12:26:28 +01:00
ganfra
15639b45cf Introduce RoomMemberProfile files 2020-01-09 12:10:49 +01:00
ganfra
f18ec8d021 Merge branch 'develop' into feature/room_profile 2020-01-09 11:56:09 +01:00
Benoit Marty
898bf234da Merge pull request #792 from vector-im/feature/stabilization
Feature/stabilization
2020-01-09 11:43:52 +01:00
Benoit Marty
3d0d95c371 Email domain can be limited on some homeserver, i18n of the displayed error (#754) 2020-01-09 11:34:57 +01:00
ganfra
bd4a595f96 ChunkEntityTest: make it compile again 2020-01-09 11:19:08 +01:00
Benoit Marty
0f7d59a8c7 Cleanup during PR review 2020-01-09 09:42:34 +01:00
Benoit Marty
e14b9b3b20 Fix test compilation issue 2020-01-09 08:03:14 +01:00
Benoit Marty
43c4e20819 Merge pull request #820 from vector-im/feature/developer_mode_crash
Developer mode: Fail-fast (#745)
2020-01-09 07:56:06 +01:00
Benoit Marty
5312b44359 Merge pull request #821 from vector-im/feature/query_latch
Remove CountDownLatch (inspired from #419)
2020-01-09 07:55:38 +01:00
ganfra
8c4d8763a2 Merge branch 'develop' into feature/stabilization 2020-01-08 22:28:08 +01:00
ganfra
383605274c Introduce a very simple query langage and refact autocomplete 2020-01-08 22:17:32 +01:00
Benoit Marty
8032490606 Remove CountDownLatch (inspired from #419) 2020-01-08 18:58:51 +01:00
Benoit Marty
a458997ce0 Merge pull request #818 from vector-im/feature/oss
Exclude play-services-oss-licenses library from F-Droid build (#814)
2020-01-08 18:28:31 +01:00
Benoit Marty
29f152f349 Fix CI 2020-01-08 18:21:01 +01:00
Benoit Marty
6ca3ba6c9b Merge pull request #806 from Bubu/fix_697
call /join/{roomIdOrAlias} instead of /rooms/{roomId}/join
2020-01-08 18:17:34 +01:00
Benoit Marty
f4492e570d Merge branch 'develop' into fix_697 2020-01-08 18:17:23 +01:00
Benoit Marty
587fefedb5 Merge pull request #809 from Bubu/fix_807
set homeserver field when populating room directory list
2020-01-08 18:12:42 +01:00
Benoit Marty
943be39e1a Merge branch 'develop' into fix_807 2020-01-08 18:12:22 +01:00
Benoit Marty
616f3d3345 Merge pull request #817 from vector-im/feature/fab_scroll
Show skip to bottom FAB while scrolling down (#752)
2020-01-08 18:07:10 +01:00
Benoit Marty
2b8ecae8e3 Fix CI 2020-01-08 18:05:26 +01:00
Benoit Marty
17c4013383 Developer mode: Fail-fast (#745) 2020-01-08 17:58:26 +01:00
Benoit Marty
d662b4a9b4 Exclude play-services-oss-licenses library from F-Droid build (#814) 2020-01-08 15:57:35 +01:00
Benoit Marty
501ac36040 Reduce size of RoomDetailFragment 2020-01-08 15:05:20 +01:00
Benoit Marty
7575cb286e Show skip to bottom FAB while scrolling down (#752) 2020-01-08 15:05:20 +01:00
ganfra
c60b4ddb5a Timeline: don't wait for realm notification to come back, use it right away to init 2020-01-08 13:59:43 +01:00
ganfra
9970d7ffa0 SDK: get some better queries 2020-01-08 11:55:22 +01:00
ganfra
2dd2a8db6c Emoji data source as singleton 2020-01-08 11:54:42 +01:00
Benoit Marty
8ef5c60e2e RageShake is enabled by default 2020-01-08 11:43:21 +01:00
ganfra
03c3c9ae57 Timeline: clear unlinked should use new parameters 2020-01-07 18:15:48 +01:00
ganfra
38c198fe02 Rx: fetch first before returning live data results 2020-01-07 18:15:07 +01:00
ganfra
42c7421b05 Merge branch 'develop' into feature/stabilization 2020-01-07 14:42:38 +01:00
ganfra
19fb3ce032 Merge branch 'develop' into feature/stabilization 2020-01-07 14:28:23 +01:00
Benoit Marty
5a7f4bed43 ktlint 2020-01-07 14:24:26 +01:00
Benoit Marty
03734a7ad5 Merge pull request #802 from vector-im/feature/sessionId
Identify a session with the userId and the deviceId
2020-01-07 14:23:09 +01:00
ganfra
d710106bbb Clean code 2020-01-07 14:09:04 +01:00
ganfra
f09bf61750 Room detail: try to get some better perfs with fetching data. LiveData is slow as we only use one HandlerThread at the time. Might want Realm 7.0 and frozen objects to rework that 2020-01-07 13:31:34 +01:00
ganfra
f9487f8995 Work on timeline 2020-01-06 18:44:04 +01:00
ganfra
99c523b710 Update libs 2020-01-06 18:43:34 +01:00
ganfra
3cc15387ae Realm: compatch on launch 2020-01-06 18:41:09 +01:00
Benoit Marty
6245763577 Merge pull request #789 from vector-im/feature/christmas_fix
Auto completion for emojis
2020-01-06 14:20:44 +01:00
Benoit Marty
448552d287 Move list of Quick Emoji to Emoji Data Source 2020-01-06 13:48:34 +01:00
Benoit Marty
9ecceafb96 Move comment 2020-01-06 13:47:06 +01:00
Benoit Marty
92d7ebe94f Update changes 2020-01-06 13:47:06 +01:00
Benoit Marty
0e5fcd071c Completion on emoji: display the first 50 results 2020-01-06 13:46:37 +01:00
Benoit Marty
c8e67f8ab4 Completion on emoji WIP 2020-01-06 13:46:10 +01:00
Benoit Marty
5fa2acf60b Completion on emoji 2020-01-06 13:46:10 +01:00
Benoit Marty
9e73e95f55 Ensure there is never twice the same emoji 2020-01-06 13:46:10 +01:00
Benoit Marty
8b4c51139d Completion on emoji WIP 2020-01-06 13:46:10 +01:00
Benoit Marty
8597c2b9a2 Improve API 2020-01-06 13:46:10 +01:00
Benoit Marty
d88e5d8af8 DRY 2020-01-06 13:46:10 +01:00
Benoit Marty
c4fe0bdb7f Split into small methods 2020-01-06 13:46:10 +01:00
Benoit Marty
d73a1135ae Extract AutoComplete feature from RoomDetailFragment 2020-01-06 13:46:10 +01:00
Benoit Marty
ed097bcf37 Merge pull request #798 from vector-im/feature/settings_cleanup
Feature/settings cleanup
2020-01-06 13:41:50 +01:00
Benoit Marty
01db856a5d Improve (a bit) the devices list UX/UI 2020-01-06 10:51:30 +01:00
Benoit Marty
a00f51a264 Settings: rename "developer mode" to "advanced settings" 2020-01-06 10:32:36 +01:00
Valere
06b41af467 Merge pull request #793 from vector-im/outgoing_dm_verif
BottomSheet UX for verification
2020-01-06 10:22:27 +01:00
Marcus Hoffmann
9e8217082c set homeserver field when populating room directory list
fixes #807

Signed-off-by: Marcus Hoffmann <bubu@bubu1.eu>
2020-01-06 03:48:53 +01:00
Marcus Hoffmann
ce73007157 call /join/{roomIdOrAlias} instead of /rooms/{roomId}/join
The former endpoint doesn't work for joining over federation, the
server_name parameter is ignored.

Fixes #697

Signed-off-by: Marcus Hoffmann <bubu@bubu1.eu>
2020-01-06 01:01:59 +01:00
Valere
c2cd149299 Fix / accept button was not starting the verify sheet
Was launching start sheet, because request was not known by VerificationService. Due to message observer blocked trying to download keys..
2020-01-03 19:06:23 +01:00
Valere
08ed8d4fa7 Code review 2020-01-03 17:38:33 +01:00
Benoit Marty
f432d15757 Ensure key aliases are always computed the same way 2020-01-03 16:20:43 +01:00
Benoit Marty
215abea10a Introduce @SessionId 2020-01-03 16:20:43 +01:00
Benoit Marty
160927e7b5 Split code into several methods 2020-01-03 16:20:43 +01:00
Benoit Marty
c2e7e33050 Update SessionParamsEntity primaryKey to include deviceId 2020-01-03 16:20:43 +01:00
Benoit Marty
455448806d Merge pull request #799 from vector-im/feature/fix_crash
Fix crash when opening room creation screen from the room filtering screen
2020-01-02 18:57:17 +01:00
Benoit Marty
a969443517 Fix crash when opening room creation screen from the room filtering screen 2020-01-02 18:53:35 +01:00
Benoit Marty
1bd85082c3 Auto-review 2020-01-02 18:45:44 +01:00
Benoit Marty
de1d79b637 Remove Preference divider and cleanup prefs 2020-01-02 18:27:46 +01:00
Benoit Marty
8e478e78e1 Disable pref unused 2020-01-02 18:17:54 +01:00
Benoit Marty
96c9293edc Rageshake: vibrate 2020-01-02 18:15:23 +01:00
Benoit Marty
5c26f66523 Rageshake: settings for sensitivity 2020-01-02 17:42:44 +01:00
Valere
d1233e8470 Fix / tap on accept shows request button instead of start 2020-01-02 17:04:41 +01:00
Benoit Marty
5a24f78c05 Hide non working settings (#751) 2020-01-02 16:24:31 +01:00
Valere
bf28f14b8b Fix / Decline request was not implemented 2020-01-02 16:13:13 +01:00
Benoit Marty
703a1a034d Developer mode: hide show (decrypted) source actions 2020-01-02 16:11:44 +01:00
Benoit Marty
7d744f7d7f Developer mode: UI
And some cleanup
2020-01-02 16:01:47 +01:00
Benoit Marty
8dff196716 Device list: remove the detail dialog: handle the actions directly in the list 2020-01-02 15:44:47 +01:00
Valere
52c25b803f cleaning 2020-01-02 15:16:45 +01:00
Benoit Marty
6b2703f6ce Device list is now on a dedicated Fragment
New request to get info on the current device for VectorSettingsSecurityPrivacyFragment. The whole device list is only retrieved in the new Fragment
2020-01-02 15:05:17 +01:00
Valere
b26318f15c Fix / Cancel messages was not sent 2020-01-02 12:51:12 +01:00
Valere
f541661059 Use workers to send verification messages 2020-01-02 11:52:27 +01:00
ganfra
e32d242e38 Timeline: remove use of isUnlinked method as it slows down the insertion a lot 2019-12-31 12:58:43 +01:00
Valere
5b210df7c5 Manage done states + cleaning 2019-12-31 10:36:10 +01:00
ganfra
787908287c Member events: cache all over the session 2019-12-31 08:07:32 +01:00
Valere
935b3d7f3f cleaning 2019-12-30 20:18:08 +01:00
ganfra
8156b754c1 RecyclerView: introduce view pool 2019-12-30 19:54:39 +01:00
ganfra
03fd474aa8 Member events: try to cache (WIP) 2019-12-30 19:53:36 +01:00
Valere
3c4506cb58 merge madness ?? 2019-12-30 19:52:48 +01:00
Valere
3eed9b5083 cleaning 2019-12-30 18:42:32 +01:00
Valere
6bf3a703df BottomSheet UX 2019-12-30 18:01:06 +01:00
Valere
2152af8851 klint 2019-12-30 17:54:44 +01:00
Valere
5b33a42f8a FIx / missing strings after merge 2019-12-30 17:36:33 +01:00
Valere
a73cd61b96 WIP 2019-12-30 15:16:11 +01:00
Valere
4edd5e3530 Added SAS do not match api 2019-12-30 14:32:58 +01:00
Valere
4c0cbca4cb Support .verification.ready event 2019-12-30 14:32:58 +01:00
Valere
308b15b908 Fix / m.key.verification.key was not sent in toDevice mode 2019-12-30 14:32:04 +01:00
Valere
38906084d1 WIP 2019-12-30 14:32:04 +01:00
Valere
0997d9abf4 Merge branch 'develop' into cross_signing 2019-12-30 14:27:47 +01:00
ganfra
6ad914154a Update some libs 2019-12-30 10:46:25 +01:00
ganfra
cba7e460eb Action bottom sheet: fix deprecated constraints 2019-12-27 18:54:28 +01:00
ganfra
6794173321 Room detail: fix crash with banner 2019-12-27 18:54:07 +01:00
ganfra
92f4288d3e Realm: update realm lib version 2019-12-27 17:16:44 +01:00
ganfra
8109262cbb Home: fix double tab selection 2019-12-27 17:16:30 +01:00
ganfra
037bf45884 Sync: use foreground service on every android version 2019-12-27 17:09:57 +01:00
ganfra
833a5a37a2 Pill: fix blink and clean files 2019-12-27 10:24:58 +01:00
ganfra
00f316ba5d Room members: introduce RoomMemberEntity to be able to query. Still work to do. 2019-12-26 19:51:03 +01:00
ganfra
dfd8181754 Room profile: start creating some classes and use shared action. 2019-12-20 20:28:27 +01:00
Benoit Marty
90f2199eb7 Merge pull request #785 from vector-im/feature/initial_sync
Feature/initial sync
2019-12-20 18:18:32 +01:00
Benoit Marty
63828bc159 Merge branch 'develop' into feature/initial_sync 2019-12-20 17:55:04 +01:00
Benoit Marty
35b4d90e0d ktlint 2019-12-20 17:54:35 +01:00
Benoit Marty
4fe9c52737 Move permission to the main AndroidManifest 2019-12-20 17:54:02 +01:00
Benoit Marty
c54358831f Group throwable extension together 2019-12-20 17:45:32 +01:00
ganfra
a9d016ae79 Merge branch 'develop' into feature/room_profile 2019-12-20 16:43:16 +01:00
Benoit Marty
fcdaf14b01 Merge pull request #786 from vector-im/feature/room_alias_rendering
Autocompletion and pills for rooms and groups
2019-12-20 14:58:38 +01:00
ganfra
83126d5f55 Fix android tests not working 2019-12-20 11:54:59 +01:00
ganfra
e13281dc97 Update CHANGES and clean code 2019-12-20 11:27:26 +01:00
Benoit Marty
3cc65b1e71 ktlint 2019-12-20 11:05:54 +01:00
Benoit Marty
0ccb975d43 Disable MatrixLinkify 2019-12-20 11:04:06 +01:00
Benoit Marty
54f2ac0d8c Better comment 2019-12-20 10:59:41 +01:00
Benoit Marty
3ee5a7f54d Better code 2019-12-20 10:55:08 +01:00
Benoit Marty
3b0624ea40 Fix issue with "in reply to" link 2019-12-20 10:54:48 +01:00
Benoit Marty
c992d32afd Improve algo 2019-12-20 10:23:45 +01:00
Benoit Marty
c5739abe32 Update changes.md 2019-12-20 10:16:17 +01:00
Benoit Marty
3ac473d945 Remove extra blank line 2019-12-20 10:15:53 +01:00
Benoit Marty
c79b35b089 Autocomplete item layout 2019-12-20 10:15:11 +01:00
Benoit Marty
8dce98c538 Autocompletion: group (including pills for groups) 2019-12-20 02:54:48 +01:00
Benoit Marty
543c07fd69 Render pills for room links 2019-12-20 01:23:45 +01:00
Benoit Marty
05a788453f More generic name 2019-12-20 00:47:47 +01:00
Benoit Marty
c31b64771b Autocompletion: disable animation on the recycler view items 2019-12-20 00:42:19 +01:00
Benoit Marty
92f43a591a Autocompletion for room canonical alias 2019-12-20 00:38:42 +01:00
Benoit Marty
3a829bdfe8 Fix command truncation 2019-12-20 00:05:04 +01:00
Benoit Marty
237b22df59 Fix lots of trouble with the completion popup (resize, change mode, etc.) - next step 2019-12-19 20:31:36 +01:00
Benoit Marty
c18be94986 Fix lots of trouble with the completion popup (resize, change mode, etc.) 2019-12-19 20:03:10 +01:00
Benoit Marty
d342356f29 Add missing state events to the list (not sure about the side effects) 2019-12-19 19:48:30 +01:00
Benoit Marty
07817b69c2 Rename some event type 2019-12-19 19:46:09 +01:00
Benoit Marty
e73970d61b Render aliases and canonical alias change in the timeline 2019-12-19 19:39:35 +01:00
ganfra
0eb0870d6c AvatarRenderer: allow to pass GlideRequests too (fix home group avatar) 2019-12-19 18:29:46 +01:00
ganfra
55748a4af4 Merge branch 'develop' into feature/initial_sync 2019-12-19 17:49:45 +01:00
Benoit Marty
51d6b8828d Version++ 2019-12-19 16:46:01 +01:00
Benoit Marty
358fcb6b34 Merge branch 'release/0.11.0' 2019-12-19 16:44:27 +01:00
Benoit Marty
9a7cd3f270 Merge branch 'release/0.11.0' into develop 2019-12-19 16:44:27 +01:00
Benoit Marty
92315a4189 Prepare release 0.11.0 2019-12-19 16:44:14 +01:00
ganfra
a6afd2e904 Timeline: handle failure when navigating to an unknown event (+ clean some files) 2019-12-19 16:10:59 +01:00
Benoit Marty
156cc1aa4a Import Strings from Riot 2019-12-19 15:50:18 +01:00
Benoit Marty
0d36e9d8a6 Merge pull request #779 from vector-im/feature/fix_some_crashes
Fix some crashes and issues
2019-12-19 14:02:19 +01:00
Benoit Marty
13439769a1 Update wording 2019-12-19 14:01:58 +01:00
ganfra
7bb8cb0682 Permalink: fix nav to same room 2019-12-19 13:42:15 +01:00
ganfra
a4ea9a09ad Room factory: add scope to avoid recreate all the dependencies 2019-12-19 13:41:57 +01:00
Benoit Marty
bf69810f8f Bottom sheet event preview for Sticker 2019-12-19 12:05:47 +01:00
Benoit Marty
bb9510e59b Create Size data class 2019-12-19 12:05:30 +01:00
Benoit Marty
4b0dfa49f4 Limit sticker size in the timeline 2019-12-19 11:44:07 +01:00
Benoit Marty
6652965e48 Ignore lint issue 2019-12-19 10:46:11 +01:00
Valere
94125a0215 Merge branch 'develop' into cross_signing 2019-12-19 10:15:47 +01:00
Valere
d97402f757 Merge pull request #767 from vector-im/dm_verif_incoming_timeline
Dm verif incoming timeline
2019-12-19 10:12:55 +01:00
ganfra
5bde7b9f17 Read marker: fix banner visibility when following permalink 2019-12-19 09:58:05 +01:00
ganfra
c8f0c83cd3 Timeline: don't retry automatically to avoid totally blocking pagination 2019-12-19 09:57:49 +01:00
Benoit Marty
b0ff2cb4bb cleanup 2019-12-18 19:31:10 +01:00
Benoit Marty
648691656a Disable click on Stickers (#703) 2019-12-18 19:20:44 +01:00
Benoit Marty
7eae85a394 Add a ZeroItem to avoid automatic scroll when the breadcrumbs are updated from another client 2019-12-18 18:41:46 +01:00
Benoit Marty
123ffe9f9c Cleanup 2019-12-18 17:00:18 +01:00
ganfra
7697278bb2 LiveObservers: launch directly coroutines 2019-12-18 16:59:45 +01:00
Benoit Marty
c48a439eea Add @JvmStatic for performance reasons.
See https://github.com/airbnb/MvRx/wiki/Advanced-Concepts#mvrxviewmodel
2019-12-18 16:03:10 +01:00
Benoit Marty
9d26ba3186 Fix rendering issue with HTML formatted body 2019-12-18 12:33:51 +01:00
Benoit Marty
08970ad8c1 Fix a crash on public room list
It's maybe a workaround, as it should not happen, but at least it will not crash anymore
2019-12-18 09:56:58 +01:00
ganfra
4c88c12cfe Initial sync, start the sync thread or the sync service 2019-12-17 18:46:19 +01:00
Benoit Marty
79f11ad686 Prevent crash when mimetype is null 2019-12-17 17:49:28 +01:00
Benoit Marty
7fa76b9d35 Prevent crash when opening unknown room, which should not happen... 2019-12-17 16:35:04 +01:00
Benoit Marty
65faedb06b BugReport screen: improve UX when description is too short (reported by Matthew) 2019-12-17 14:26:49 +01:00
Benoit Marty
1ceddd9607 Rageshake: log resumed screens and add the log verbosity ON/OFF to the rageshakes data 2019-12-17 14:05:58 +01:00
Benoit Marty
42cdb1db11 Fix crash reported by rageshake: writeToFile may throw exceptions 2019-12-17 12:26:45 +01:00
Benoit Marty
1c727c1ee4 Fix crash reported by rageshake 2019-12-17 10:42:58 +01:00
ganfra
2316c98a65 Merge branch 'develop' into feature/initial_sync 2019-12-16 19:11:04 +01:00
Benoit Marty
a4aa38ee43 Fix new issue on permalink click 2019-12-16 17:14:26 +01:00
Benoit Marty
4a11d028c0 Merge pull request #706 from vector-im/feature/handle_matrix_to
Feature/handle matrix to
2019-12-16 15:50:21 +01:00
Valere
08d005a611 fix merge 2019-12-16 15:44:32 +01:00
Benoit Marty
c286f2a744 ktlint 2019-12-16 15:43:58 +01:00
Valere
89b414e8fe Merge branch 'develop' into dm_verif_incoming_timeline 2019-12-16 15:30:39 +01:00
Benoit Marty
e2b4899b36 Internal review 2019-12-16 15:21:24 +01:00
ganfra
aa82cd2064 Update CHANGES 2019-12-16 15:16:46 +01:00
ganfra
bc568343a2 Open matrix.to with a loader 2019-12-16 15:16:46 +01:00
ganfra
abf0796794 Room alias and matrix.to link: we can now open a room though roomAlias as long as it's a joined one 2019-12-16 15:16:46 +01:00
ganfra
02febfb01b Start handling room alias 2019-12-16 15:09:41 +01:00
ganfra
91c98d4bfb Permalink: start handling permalink from outside the app 2019-12-16 15:05:55 +01:00
Benoit Marty
cfee6a43fd Merge pull request #760 from vector-im/feature/diff_match_patch_submodule
Use diff_match_patch sources as dependency
2019-12-16 15:02:29 +01:00
Benoit Marty
f14f1db0e0 Merge pull request #774 from vector-im/feature/breadcrumbs_fixes
Fix various UI issues
2019-12-16 15:00:21 +01:00
Benoit Marty
3feb2d8980 Merge pull request #768 from vector-im/feature/soft_logout
Handle invalid tokens gracefully
2019-12-16 14:57:11 +01:00
Benoit Marty
9fc3093c2c Fix issues... 2019-12-16 12:39:51 +01:00
Benoit Marty
7d910f2566 Auto review 2019-12-16 11:30:53 +01:00
Benoit Marty
0a0eda3e34 Display first letter of id if display name is empty 2019-12-16 11:08:48 +01:00
Benoit Marty
cecef5b8da Use id to get first letter, if display name is empty 2019-12-16 10:56:25 +01:00
Benoit Marty
c9ed95ed21 MatrixItem: create extension and check ids 2019-12-16 10:50:48 +01:00
Benoit Marty
3dfd6f5a69 Breadcrumbs: increase font size 2019-12-16 10:20:38 +01:00
Benoit Marty
8fc1400bab Improve user color computation and add unit tests 2019-12-14 10:38:50 +01:00
Benoit Marty
3e4b07cec3 Do not display " (IRC)") in display names 2019-12-14 10:19:11 +01:00
Benoit Marty
fbb1846694 Render default room name when it starts with an emoji (#477) 2019-12-13 21:23:18 +01:00
Benoit Marty
b435212c87 Use same default room colors than Riot-Web
And create MatrixItem
2019-12-13 20:50:32 +01:00
ganfra
5dd46e82d7 Sync: make only one big transaction to avoid having bad states 2019-12-13 18:21:44 +01:00
Valere
3727affc15 cleaning 2019-12-13 18:00:04 +01:00
Valere
ff5305ee66 Fix / Verification Msg show fallback text in room summary 2019-12-13 17:56:06 +01:00
Valere
3953022258 Merge branch 'cross_signing' into dm_verif_incoming_timeline 2019-12-13 16:51:53 +01:00
Benoit Marty
1108ad5705 Scroll breadcrumbs to top when opened 2019-12-13 16:50:32 +01:00
Valere
b473aeb475 Merge pull request #765 from vector-im/sdk_reference_aggregation
Aggregate Event References for DM verifications
2019-12-13 16:45:27 +01:00
Valere
289c03e724 Code review 2019-12-13 16:41:55 +01:00
ganfra
fe2be90002 Sync: use the CoroutineSequencer but need more tests 2019-12-13 15:37:38 +01:00
Benoit Marty
f073342954 Cleanup 2019-12-13 15:32:57 +01:00
Benoit Marty
38b40efac3 Using default values 2019-12-13 15:24:44 +01:00
Benoit Marty
e60bda7806 Better archi, better code, less bug... 2019-12-13 15:16:26 +01:00
Benoit Marty
92e60c939d ErrorFormatter: create interface 2019-12-13 14:09:27 +01:00
Benoit Marty
6e4830e325 ErrorFormatter: move it's declaration to VectorBaseFragment
and avoid duplicated code to manage default onError() in Login fragment
2019-12-13 13:58:49 +01:00
Benoit Marty
c6b98f3654 Soft Logout - display hard logout screen 2019-12-13 12:40:15 +01:00
Benoit Marty
12d54140e5 SoftLogout: also handle Unsupported mode 2019-12-13 12:08:37 +01:00
Benoit Marty
1de85daad9 SoftLogout: handle the case where user sign in with SSO on another account 2019-12-13 11:58:02 +01:00
Valere
210dcca0ee Fix / Handling multi open sessions 2019-12-13 11:22:39 +01:00
Valere
872baacfe4 Fix / verification conclusion not showing in non hidden mode 2019-12-13 11:20:19 +01:00
Benoit Marty
050519e998 Soft Logout - add a TODO, waiting for Synapse bugfix 2019-12-13 09:22:24 +01:00
Benoit Marty
1af44ce5f7 cleanip 2019-12-13 01:37:29 +01:00
Benoit Marty
8d1a36425d Cleanup 2019-12-13 01:29:49 +01:00
Benoit Marty
4e74b545ad SoftLogout: recovery with SSO 2019-12-13 01:25:58 +01:00
Benoit Marty
183d6b53bd SoftLogout: start handling SSO 2019-12-13 00:20:54 +01:00
Benoit Marty
14562f7285 SoftLogout: Inherit from Login stuff to get free forgot password functionality 2019-12-13 00:08:21 +01:00
Benoit Marty
17bcd680b0 organise packages 2019-12-12 23:28:54 +01:00
Benoit Marty
954019547d Soft Logout - update comment 2019-12-12 23:25:14 +01:00
Benoit Marty
782635ec8e Keep loading after success 2019-12-12 23:20:11 +01:00
Benoit Marty
e609f4a57e SoftLogout: epoxy: missing elements 2019-12-12 23:17:03 +01:00
Benoit Marty
907fa35547 Cleanup listener 2019-12-12 22:58:27 +01:00
Benoit Marty
00d0c34363 SoftLogout: use Epoxy 2019-12-12 22:58:15 +01:00
Benoit Marty
6811d31a6d Soft Logout - request homeserver login flow 2019-12-12 20:24:46 +01:00
Benoit Marty
a464c910f8 Fix crash with Realm 2019-12-12 19:43:16 +01:00
Valere
975de1dbed Cleaning / klint 2019-12-12 18:48:57 +01:00
Benoit Marty
d69881f321 cleanup 2019-12-12 17:41:16 +01:00
Benoit Marty
efc1f38f8c SoftLogout: adapt wording depending if all keys are backed up or not 2019-12-12 17:39:21 +01:00
Valere
dedc622140 Merge branch 'sdk_reference_aggregation' into dm_verif_incoming_timeline 2019-12-12 15:55:01 +01:00
Benoit Marty
b9e8da1fbb SoftLogout: clear notifications 2019-12-12 15:50:05 +01:00
Benoit Marty
d2fea275d8 SoftLogout: Loading UI 2019-12-12 15:33:22 +01:00
Benoit Marty
a5af949c15 SoftLogout: Store the info that the token is not valid anymore for a faster startup 2019-12-12 15:32:52 +01:00
Valere
9842cac504 More explicit val naming 2019-12-12 15:29:56 +01:00
Valere
35404b9a7f Fix merge 2019-12-12 15:05:13 +01:00
Valere
0afcb60e7d fix rebase 2019-12-12 14:31:01 +01:00
ganfra
eab94b4f03 Sequencer: handle cancellation 2019-12-12 14:30:40 +01:00
Valere
cb595177a9 Fix test compilation 2019-12-12 13:37:17 +01:00
Valere
cb4d52c9fb Aggregate Event References for DM verifications 2019-12-12 13:37:17 +01:00
Valere
d0a3b4663e FIx / room transport was not updating state 2019-12-12 13:37:17 +01:00
Valere
f53b99a423 rebase 2019-12-12 13:37:17 +01:00
Valere
6da0693488 Convert KeyVerificationStart to data class 2019-12-12 13:37:17 +01:00
Valere
ea817ff1c5 fix rebase 2019-12-12 12:04:38 +01:00
Valere
62f0c6edc0 Fix / Use transport to start verification 2019-12-12 12:04:38 +01:00
Valere
e71ad0e515 Simple strategy to Ignore old verification messages 2019-12-12 12:03:59 +01:00
Valere
553604423e Support verification using room transport 2019-12-12 12:03:42 +01:00
Valere
be723256d3 FIx / room transport was not updating state 2019-12-12 10:49:42 +01:00
Valere
819d7182bb rebase 2019-12-12 10:49:42 +01:00
Valere
0a2ffdbdf1 Convert KeyVerificationStart to data class 2019-12-12 10:49:42 +01:00
Valere
4ac7331f3d fix rebase 2019-12-12 10:49:42 +01:00
Valere
7fc57bdf9b Fix / Use transport to start verification 2019-12-12 10:49:42 +01:00
Valere
d370f6d7c8 Simple strategy to Ignore old verification messages 2019-12-12 10:49:42 +01:00
Valere
46ef442139 cleaning 2019-12-12 10:49:42 +01:00
Benoit Marty
5f3dc73440 Code review 2019-12-12 10:49:42 +01:00
Valere
6137a88a6f Support verification using room transport 2019-12-12 10:49:42 +01:00
Valere
82af848c33 Fix / Verification Request Local Echo 2019-12-12 10:27:58 +01:00
ganfra
6b61c95843 Coroutines: introduce a sequencer 2019-12-11 20:39:07 +01:00
Benoit Marty
261b4be287 Follow naming convention 2019-12-11 18:51:46 +01:00
Benoit Marty
205fc0d9d6 Soft Logout - issue with device display name 2019-12-11 18:49:44 +01:00
Benoit Marty
7699560458 Soft Logout - WIP 2019-12-11 18:35:30 +01:00
Benoit Marty
a193b2659d Create Uri extension and cleanup login code 2019-12-11 18:34:21 +01:00
Benoit Marty
bb85d41f05 Password could contain only spaces 2019-12-11 18:34:21 +01:00
Benoit Marty
9bfe904745 InvalidToken: Regular Signed out screen - move class 2019-12-11 18:34:21 +01:00
Benoit Marty
284dc8602f InvalidToken: Regular Signed out screen 2019-12-11 18:34:21 +01:00
Benoit Marty
29087d4a87 InvalidToken: Rework MainActivity args 2019-12-11 18:34:21 +01:00
Benoit Marty
18649ebddb InvalidToken: notify the app - WIP 2019-12-11 18:34:21 +01:00
Benoit Marty
d5935a13ac MatrixError: add some MatrixError from the spec and copy paste documentation 2019-12-11 18:34:21 +01:00
Benoit Marty
670d4dc34e MatrixError: rename the constants to follow the spec 2019-12-11 18:34:21 +01:00
Benoit Marty
5435a1739e SoftLogout: parse the parameter from server response 2019-12-11 18:34:21 +01:00
Benoit Marty
853518fbb2 Version++ 2019-12-11 18:34:06 +01:00
Valere
a673bf092d Show untrusted conclusions 2019-12-11 18:19:32 +01:00
Valere
0776a301ea Incoming DM verification handling in timeline 2019-12-11 16:49:34 +01:00
ganfra
3a269be2ef Sync: fix crash on gplay flavor and reschedule when no network instead of showing a potential notification all the time 2019-12-11 16:24:30 +01:00
Valere
02f03e6b23 Fix test compilation 2019-12-11 16:00:53 +01:00
Valere
8305ce67dd Aggregate Event References for DM verifications 2019-12-11 14:44:31 +01:00
Valere
95deeb1be7 Merge pull request #730 from vector-im/feature/sdk_dm_verification
[SDK] MSC2241 / verification in DMs
2019-12-11 11:10:46 +01:00
Valere
0b93f34fa0 Use diff_match_patch sources as dependency 2019-12-11 10:51:09 +01:00
ganfra
5338f93852 Sync: use a foreground service for initialSync. 2019-12-10 19:52:12 +01:00
Valere
73f0132d5d FIx / room transport was not updating state 2019-12-10 16:37:54 +01:00
Benoit Marty
902a9aa243 Merge branch 'release/0.10.0' 2019-12-10 15:47:36 +01:00
Benoit Marty
5915cebd6d Merge branch 'release/0.10.0' into develop 2019-12-10 15:47:35 +01:00
Benoit Marty
d91ff87fb9 Prepare release 0.10.0 2019-12-10 15:47:26 +01:00
Valere
c462d15bcf rebase 2019-12-10 14:23:56 +01:00
Valere
3cdd373368 Convert KeyVerificationStart to data class 2019-12-10 11:14:52 +01:00
Valere
e14602d1dc fix rebase 2019-12-10 11:14:52 +01:00
Valere
2aa9c3ea22 Fix / Use transport to start verification 2019-12-10 11:14:52 +01:00
Valere
bbd9738452 Simple strategy to Ignore old verification messages 2019-12-10 11:14:52 +01:00
Valere
36c5566b07 cleaning 2019-12-10 11:14:52 +01:00
Benoit Marty
ce63332a2f Code review 2019-12-10 11:14:52 +01:00
Valere
26b4b6e194 Support verification using room transport 2019-12-10 11:14:20 +01:00
Benoit Marty
79ef055bfb Merge pull request #746 from vector-im/feature/fix_various_issues
Fix 2 crashes reported by the PlayStore
2019-12-10 02:14:23 +01:00
Benoit Marty
3a761be6b4 Last cleanup 2019-12-10 01:28:07 +01:00
Benoit Marty
a9e2c31c32 Remove log for privacy 2019-12-10 01:08:05 +01:00
Benoit Marty
3ac53d20e9 Bugfix: react several times with the same reaction was possible (was a TODO). 2019-12-10 01:05:20 +01:00
Benoit Marty
3c18fd5335 Improve EmojiChooserFragment: improve filtering result: sort 2019-12-10 00:42:24 +01:00
Benoit Marty
f00f34b244 Improve EmojiChooserFragment: DI 2019-12-09 23:56:53 +01:00
Benoit Marty
63e0b15f3d Split EmojiDataSource - cleanup 2019-12-09 23:08:50 +01:00
Benoit Marty
80306f20df Split EmojiDataSource - avoid !! 2019-12-09 22:57:23 +01:00
Benoit Marty
2972177541 Split EmojiDataSource - cleanup 2019-12-09 22:46:39 +01:00
Benoit Marty
1ad8f47dc1 Split EmojiDataSource 2019-12-09 22:36:38 +01:00
Benoit Marty
8527d3f162 Improve emoji picker search result 2019-12-09 22:30:29 +01:00
Benoit Marty
99423bacb2 Cleanup 2019-12-09 22:09:17 +01:00
Benoit Marty
edc6c3dd4f Cleanup 2019-12-09 22:00:41 +01:00
Benoit Marty
a761a0dbd2 Cleanup 2019-12-09 21:56:03 +01:00
Benoit Marty
d431ab23c8 Cleanup 2019-12-09 21:33:10 +01:00
Benoit Marty
f0aa34774e Create RecyclerView extensions and cleanup all the recycler views 2019-12-09 21:31:56 +01:00
Benoit Marty
742136abe8 Create RecyclerView extensions and cleanup all the recycler views 2019-12-09 18:01:58 +01:00
Benoit Marty
36aba8554d Update CHANGES.md 2019-12-09 17:43:14 +01:00
Benoit Marty
da14ae432a Ensure we will not use EpoxyRecyclerView as a View anymore 2019-12-09 17:41:29 +01:00
ganfra
9a01b4ace9 Make it through bunch of classes removing potential leaks 2019-12-09 17:41:29 +01:00
Benoit Marty
109c1fe482 Cleanup 2019-12-09 17:41:29 +01:00
Benoit Marty
dbd4525404 Make sure unhandled Rx error does not crash the app in production 2019-12-09 17:41:29 +01:00
Benoit Marty
c714266a81 Fix crash reported by the PlayStore.
NullPointerException: at im.vector.riotx.features.home.room.detail.RoomDetailFragment.updateJumpToReadMarkerViewVisibility (RoomDetailFragment.kt:524)
Also properly cleanup model build listener
2019-12-09 17:41:29 +01:00
Benoit Marty
8b1701e537 Merge pull request #738 from vector-im/feature/ban_reason
Displaay ban and other membership events reason
2019-12-09 14:53:06 +01:00
Benoit Marty
41d1b77370 Merge pull request #749 from vector-im/feature/hs_discovery
Support entering a RiotWeb client URL instead of the homeserver URL
2019-12-09 14:10:55 +01:00
Benoit Marty
ac75fe12bf Will be merged for next release 2019-12-09 14:09:03 +01:00
Benoit Marty
2f26f4b8bb Add default value (fix test compilation issue) 2019-12-09 14:09:03 +01:00
Benoit Marty
6d82ac7c59 Add default param values 2019-12-09 14:09:03 +01:00
Benoit Marty
411afb0bf3 Add shortcut for command length 2019-12-09 14:09:03 +01:00
Benoit Marty
57354cbd69 Add reason to slash commands 2019-12-09 14:09:03 +01:00
Benoit Marty
03d51281a2 Mistake 2019-12-09 14:08:06 +01:00
Benoit Marty
415511f3e0 Shortened lines 2019-12-09 14:08:06 +01:00
Benoit Marty
e0e778909d Better formatting 2019-12-09 14:08:06 +01:00
Benoit Marty
b9efc9f4bd Ensure user will never see 'null' in a String 2019-12-09 14:08:06 +01:00
Benoit Marty
872b14373b Better code 2019-12-09 14:08:06 +01:00
Benoit Marty
d28700e2bf Add reason for all membership events (https://github.com/matrix-org/matrix-doc/pull/2367) 2019-12-09 14:08:06 +01:00
Benoit Marty
18beef14cf "ban" event are not rendered correctly (#716) 2019-12-09 14:08:06 +01:00
Benoit Marty
e73923dca3 Merge pull request #741 from vector-im/feature/breadcrumbs
Breadcrumbs
2019-12-09 14:06:27 +01:00
Benoit Marty
94afd3e66d Add example of config without default homeserver url 2019-12-07 11:05:18 +01:00
Benoit Marty
5f540a5b45 Support entering a RiotWeb client URL instead of the homeserver URL during connection (#744) 2019-12-06 23:46:40 +01:00
Benoit Marty
a41617e8aa Fix lint false positive issue 2019-12-06 22:00:49 +01:00
Benoit Marty
ff1745b5dc Merge pull request #742 from vector-im/feature/fix_739
Fixes #739
2019-12-06 17:10:54 +01:00
Valere
8e3e9876b8 Fixes #739 2019-12-06 10:31:40 +01:00
Benoit Marty
9a4d8f87f6 Breadcrumbs: auto-review 2019-12-05 22:38:49 +01:00
Benoit Marty
aef76241a3 Breadcrumbs: changes 2019-12-05 22:09:55 +01:00
Benoit Marty
0768bd5c88 Breadcrumbs: nicer algorithm 2019-12-05 22:05:37 +01:00
Benoit Marty
65333e6031 Cleanup some Realm queries 2019-12-05 21:49:01 +01:00
Benoit Marty
849e7c613c Breadcrumbs: live update in correct order 2019-12-05 21:27:56 +01:00
Benoit Marty
60169d53d7 Breadcrumbs: add some visual attributes 2019-12-05 20:28:07 +01:00
Benoit Marty
4234c27af9 Version++ 2019-12-05 18:19:20 +01:00
Benoit Marty
f9c0256afd Merge branch 'release/0.9.1' 2019-12-05 18:17:55 +01:00
Benoit Marty
b9eb85e0a6 Merge branch 'release/0.9.1' into develop 2019-12-05 18:17:54 +01:00
Benoit Marty
6d8850b3d6 Prepare version 0.9.1 2019-12-05 18:17:36 +01:00
Benoit Marty
d88edd578f Merge pull request #740 from vector-im/feature/hot_fix_filter
Feature/hot fix filter
2019-12-05 18:14:46 +01:00
Benoit Marty
5373d9aa21 Breadcrumbs: fix layout issue 2019-12-05 17:49:45 +01:00
Benoit Marty
ad4d5e5c02 Breadcrumbs: limit number to 20 2019-12-05 17:43:23 +01:00
ganfra
eb9775e307 Fix some crypto realm issues 2019-12-05 17:14:56 +01:00
ganfra
aa9d66b991 Allow returning a value from an async transaction 2019-12-05 17:14:38 +01:00
Benoit Marty
4ff12605e9 Breadcrumbs: notify viewed rooms 2019-12-05 16:06:47 +01:00
Benoit Marty
7c561ae622 Breadcrumbs simple UI 2019-12-05 14:51:12 +01:00
Benoit Marty
cec08a20e5 Handle breadcrumbs from account data 2019-12-05 12:13:45 +01:00
Benoit Marty
fb8ba32fb4 Version++ 2019-12-05 09:46:36 +01:00
Benoit Marty
8e9ac8198d Merge branch 'release/0.9.0' 2019-12-05 09:44:06 +01:00
Benoit Marty
7a05207ae4 Merge branch 'release/0.9.0' into develop 2019-12-05 09:44:06 +01:00
Benoit Marty
6b39cf3b70 Prepare release 0.9.0 2019-12-05 09:43:58 +01:00
Benoit Marty
994759e11a Merge pull request #737 from vector-im/feature/otk_upload
Improve and cleanup OneTimeKey uploader
2019-12-05 09:38:05 +01:00
Benoit Marty
f31c1b69cb Remove delay when waiting for first sync to finish and add number of sent keys in the log 2019-12-04 16:52:55 +01:00
Benoit Marty
bdb9d2fbb8 Improve and cleanup OneTimeKey uploader
Fix boolean reset if request fails
Implement https://github.com/matrix-org/matrix-js-sdk/pull/493
2019-12-04 16:34:25 +01:00
Benoit Marty
9fb50dde32 Merge pull request #726 from vector-im/feature/sign_x_stabilization
Registration stabilization
2019-12-04 16:26:48 +01:00
Benoit Marty
a145aae0aa Avoid using !! 2019-12-04 15:38:16 +01:00
Benoit Marty
3623072f08 Attempt to properly cancel the crypto module when user signs out (#724)
Attempt to properly cancel the crypto module when user signs out (#724)
2019-12-04 15:38:16 +01:00
Benoit Marty
2717ad475a Merge pull request #699 from vector-im/feature/read_marker_rework
Feature/read marker rework
2019-12-04 14:12:41 +01:00
Benoit Marty
a6f8fe9317 Fix lint issue 2019-12-04 12:08:18 +01:00
Benoit Marty
f9eb80b4ec Simplify layout 2019-12-04 11:42:18 +01:00
Benoit Marty
9510d71cd3 Proposal for simple layout 2019-12-04 11:42:18 +01:00
Benoit Marty
e7a47ae32a Some cleanup 2019-12-04 11:42:18 +01:00
ganfra
7890b929a7 Update CHANGES 2019-12-04 11:42:18 +01:00
ganfra
0376de08f4 Clean files 2019-12-04 11:41:54 +01:00
ganfra
90c472fef9 Read marker: fix mark all as read 2019-12-04 11:41:54 +01:00
ganfra
8e873672a9 Read marker: change design 2019-12-04 11:41:54 +01:00
ganfra
bba52e77d1 Read marker: fix merged items 2019-12-04 11:41:54 +01:00
ganfra
64d73ae8e6 Read marker: handle the jump to read marker 2019-12-04 11:41:54 +01:00
ganfra
d9982076f9 Read marker: continue rework [WIP] 2019-12-04 11:39:51 +01:00
ganfra
ab489df83d Read marker: don't show unread on events we own 2019-12-04 11:33:06 +01:00
ganfra
5e07e96bdb Read marker: start reworking how we manage it [WIP] 2019-12-04 11:33:06 +01:00
Benoit Marty
c495aa4914 Merge pull request #731 from vector-im/feature/fix_pills
Fix issue with pill: also send the text after the last pills
2019-12-03 18:19:36 +01:00
Benoit Marty
ff267ba9bc Update changelog 2019-12-03 16:36:44 +01:00
Benoit Marty
69f923383c Rename some classes with "Item" suffix, as a convention (ooi) 2019-12-03 16:32:25 +01:00
Benoit Marty
c69852c849 Make url clickable on the preview of event in the bottom sheet - avoid instantiating objects in the bind() method 2019-12-03 16:17:49 +01:00
Benoit Marty
6d7f2670df Make url clickable on the preview of event in the bottom sheet 2019-12-03 16:02:07 +01:00
Benoit Marty
71de8fdad3 Display pills Avatar in the message preview 2019-12-03 15:08:44 +01:00
Benoit Marty
998d9f2c59 Bugfix: Text after the last pill was not send 2019-12-03 14:48:41 +01:00
Benoit Marty
4f3da353e4 Add ellipsis char for action with another step 2019-12-03 13:23:44 +01:00
Benoit Marty
4154cb2b85 Improve wording of the title of read receipt list 2019-12-03 13:21:42 +01:00
Benoit Marty
3c6eb4bccf Rework FilterEntityQueries to fix issue of ghost Realm reference 2019-12-03 11:10:43 +01:00
Benoit Marty
7b4398404b Update wording for modular screens 2019-12-03 11:10:43 +01:00
Benoit Marty
9b882978ed Update modular link 2019-12-03 11:10:43 +01:00
Benoit Marty
49178dc633 Reduce some log level 2019-12-03 11:10:43 +01:00
Benoit Marty
490ce4b51d Fix issue of closing Realm in another thread (#725) 2019-12-03 10:05:10 +01:00
Benoit Marty
5b63856d96 Add log to detect if a realm instance is not properly closed 2019-12-02 18:33:31 +01:00
Benoit Marty
538c4d1a64 typo 2019-12-02 18:15:21 +01:00
Benoit Marty
1cadbb8eed Ensure credentials can be stored, even if they already exist 2019-12-02 13:48:20 +01:00
Benoit Marty
3f4f7457c7 Merge pull request #689 from vector-im/feature/signin_signup
Login and Registration
2019-12-02 13:47:28 +01:00
Valere
ebf21fe9d8 Merge pull request #687 from vector-im/feature/dat_pill
Send mention pills from composer
2019-11-29 16:28:34 +01:00
Benoit Marty
a343da594f Import Strings from Riot 2019-11-29 16:22:04 +01:00
Benoit Marty
938289e8eb ktlint 2019-11-29 15:44:08 +01:00
Benoit Marty
e23763e6db Update password from email twice 2019-11-29 15:43:39 +01:00
Benoit Marty
c06b8486ea Update wording 2019-11-29 15:36:54 +01:00
Valere
67fe776d91 Update Changes 2019-11-29 13:27:50 +01:00
Benoit Marty
10cc270273 ktlint 2019-11-29 13:27:26 +01:00
Benoit Marty
46d96429e0 Create ooi extension 2019-11-29 13:27:26 +01:00
Benoit Marty
9f9c418085 Pills: cleanup and robustness 2019-11-29 13:27:26 +01:00
Benoit Marty
c412006f0e Pills: render the avatar 2019-11-29 13:27:26 +01:00
Benoit Marty
5d3c376267 Pills: remove pills when a char is deleted 2019-11-29 13:27:26 +01:00
Benoit Marty
a3f8f138a6 Create showKeyBoard() extension 2019-11-29 13:27:26 +01:00
Benoit Marty
4b273e8746 Pills: simplify and improve the algorithm 2019-11-29 13:27:26 +01:00
Benoit Marty
f11cd47df3 Pills: cleanup 2019-11-29 13:27:26 +01:00
Benoit Marty
f984758d37 Pills: Daggerization 2019-11-29 13:27:26 +01:00
Valere
97766404d6 klint 2019-11-29 13:27:26 +01:00
Valere
38b93c527b Ensure received pills spans do not overlap 2019-11-29 13:27:26 +01:00
Valere
62bae67080 Code review 2019-11-29 13:27:26 +01:00
Valere
2a4cdec020 klint cleaning 2019-11-29 13:27:26 +01:00
Valere
6bd7257cf2 Send mention pills from composer 2019-11-29 13:27:26 +01:00
Benoit Marty
500eb113b6 Login screens: add some animation for Fragment transition (WIP) 2019-11-28 20:36:29 +01:00
Benoit Marty
1bec8c29b8 Add missing items for Status theme 2019-11-28 15:52:32 +01:00
Benoit Marty
0ecb23199c Login screens: add background color 2019-11-28 13:25:56 +01:00
Benoit Marty
33925fcf57 Login screens: fix crash on back navigation 2019-11-28 12:09:28 +01:00
Benoit Marty
bf9ce4f690 Merge pull request #714 from vector-im/feature/upgrade_gif_drawable
Force android-gif-drawable version
2019-11-28 10:24:40 +01:00
Benoit Marty
d2a4163dff Merge pull request #691 from vector-im/anoa/typo
Small typo fix
2019-11-28 09:55:16 +01:00
Valere
a0d7aef92e Force android-gif-drawable version
BigImageViewer update (updated the android-gif-drawable dep)
2019-11-28 09:39:04 +01:00
Benoit Marty
29f32cf8eb Login screens: fix regression on Back press 2019-11-27 16:48:28 +01:00
Benoit Marty
bb1c988a49 Login screens: Update the local pendingSessionData synchronously, store asynchronously 2019-11-27 16:36:35 +01:00
Benoit Marty
f063abe068 Login screens: keep PendingSessionData member up to date 2019-11-27 16:15:51 +01:00
Benoit Marty
db87d8f644 Login screens: Realm migration for Auth DB 2019-11-27 15:52:02 +01:00
Benoit Marty
efa858a337 Login screens: reorder reset action for clarity 2019-11-27 15:11:02 +01:00
Benoit Marty
fd90f3b9fc Login screens: reset SDK when home server url is deleted 2019-11-27 15:08:36 +01:00
Benoit Marty
aa51764068 Login screens: save isRegistrationStarted in DB 2019-11-27 15:04:00 +01:00
Benoit Marty
0a19ded167 Login screens: extract some classes 2019-11-27 14:34:07 +01:00
Benoit Marty
2e3763e8b4 Login screens: persist all data during login or registration 2019-11-27 14:26:06 +01:00
Benoit Marty
0c4e0890b1 Use Realm.use { } 2019-11-27 10:49:33 +01:00
Benoit Marty
e532d97ec1 Login screens: persist login mode 2019-11-27 10:04:41 +01:00
Benoit Marty
fbde8d7d18 ktlint 2019-11-26 18:04:42 +01:00
Benoit Marty
f96bea742e Login screens: split long lines 2019-11-26 18:04:00 +01:00
Benoit Marty
86bfdd011e Login screens: cleanup and ignore lint issue 2019-11-26 18:03:09 +01:00
Benoit Marty
d5c2c1938c Login screens: move user choices to the ViewState 2019-11-26 17:59:01 +01:00
ganfra
fd18bcb97f Room profile: branch leave and notifications actions 2019-11-26 17:25:26 +01:00
ganfra
ab4cab05cf Room profile: continue working on UI 2019-11-26 13:22:07 +01:00
Benoit Marty
7ce8a13ddf Login screens: prepare for saving user state 2019-11-26 13:11:31 +01:00
Benoit Marty
9bd4dbb65f Login screens: trim homeserver url 2019-11-26 12:40:17 +01:00
Benoit Marty
ee875b359b Login screens: update wording 2019-11-26 12:25:37 +01:00
Benoit Marty
3eb2e1655f Login screens: ensure homeserver version is supported - fix bug for SSO 2019-11-26 12:16:39 +01:00
Benoit Marty
9b207dd5dc Login screens: ensure homeserver version is supported 2019-11-26 11:39:33 +01:00
Benoit Marty
3f1540b54e Update wording 2019-11-26 09:51:35 +01:00
Benoit Marty
2b30925163 Login screens: doc for sign in 2019-11-26 09:49:53 +01:00
Benoit Marty
4690754f5f Merge pull request #702 from vector-im/feature/quick_fix
2 quick fixes
2019-11-25 18:48:43 +01:00
Benoit Marty
a9526cdd92 Login screens: use homeserver and identity server Uri provided along with the credential is any 2019-11-25 18:32:24 +01:00
Benoit Marty
ab4d42fb20 Login screens: mutualize the code which create session from the credentials 2019-11-25 18:16:57 +01:00
Benoit Marty
0014e8ef06 Login screens: rename variables 2019-11-25 17:32:27 +01:00
Benoit Marty
311d8ddf7b Login screens: fix layout issue 2019-11-25 17:24:31 +01:00
Benoit Marty
6cb3c222a9 Login screens: handle mandatory dummy stage automatically 2019-11-25 16:47:17 +01:00
Benoit Marty
f84ec08847 Code cleanup, restore comment, and fix regression on delay 2019-11-25 14:11:38 +01:00
ganfra
9d0188cbf1 Create user from userId during initialSync 2019-11-22 20:28:52 +01:00
ganfra
73462a3045 Clean some coroutine code 2019-11-22 20:04:11 +01:00
Benoit Marty
3eebf965e5 Fix emoji filtering not working 2019-11-22 15:19:09 +01:00
Benoit Marty
bba58d25e1 Do not show long click help if only invitation are displayed 2019-11-22 14:54:22 +01:00
Benoit Marty
fedb45b019 Login screens: add doc on signin 2019-11-22 14:35:39 +01:00
Benoit Marty
9b83f08654 Login screens: fix compilation issue (lint) 2019-11-22 14:24:22 +01:00
Benoit Marty
91fcf428dd Login screens: login with unknown email 2019-11-22 14:21:14 +01:00
Benoit Marty
7e1a279fd9 Update changelog (Fixes #34, Fixes #613) 2019-11-22 12:19:15 +01:00
Benoit Marty
8de1fa835b Improve M_LIMIT_EXCEEDED error rendering 2019-11-22 12:15:19 +01:00
Benoit Marty
af45c554fd Login screens: fix scroll issue 2019-11-22 12:15:19 +01:00
Benoit Marty
11bc7051fd Login screens: splash scrollable 2019-11-22 12:15:19 +01:00
Benoit Marty
489a594027 Login screens: ensure forms are scrollable on small screens 2019-11-22 12:15:19 +01:00
Benoit Marty
3f83c161e4 Login screens: fix code quality issues 2019-11-22 12:15:19 +01:00
Benoit Marty
e0a36b794f Login screens: fix lint issues 2019-11-22 12:15:19 +01:00
Benoit Marty
d2b516bdc2 Login screens: fix issue with reset password fragment navigation 2019-11-22 12:15:19 +01:00
Benoit Marty
37166caea2 Login screens: create sub method 2019-11-22 12:15:19 +01:00
Benoit Marty
9fa131c297 Login screens: reset password: display a better popup when link is not clicked yet 2019-11-22 12:15:19 +01:00
Benoit Marty
71ae3c4a8c Login screens: reset password: display a warning when the process is not finished 2019-11-22 12:15:19 +01:00
Benoit Marty
f87526e615 Login screens: reset password: add documentation 2019-11-22 12:15:19 +01:00
Benoit Marty
51f53e2ae9 Login screens: reset password: fix a few errors 2019-11-22 12:15:19 +01:00
Benoit Marty
ef35f0a044 Login screens: disable submit button when input is empty 2019-11-22 12:15:19 +01:00
Benoit Marty
5db3f51ddb Login screens: fix bad view binding 2019-11-22 12:15:19 +01:00
Benoit Marty
49f7ce3554 Login screens: better API 2019-11-22 12:15:19 +01:00
Benoit Marty
a3111dc2d8 Login screens: rename a few classes and packages 2019-11-22 12:15:19 +01:00
Benoit Marty
be95542110 Login screens: dummy stage shoud not be mandatory 2019-11-22 12:15:19 +01:00
Benoit Marty
6723a566c2 Login screens: refacto: create an AuthenticationWizard 2019-11-22 12:15:19 +01:00
Benoit Marty
90027cc4d5 Login screens: reset password WIP 2019-11-22 12:15:19 +01:00
Benoit Marty
810b226f21 Do not trim login nor password 2019-11-22 12:15:19 +01:00
Benoit Marty
42c5adf08d ktlint 2019-11-22 12:15:19 +01:00
Benoit Marty
5edfb78721 Cleanup errors and close keyboard at each login step 2019-11-22 12:15:19 +01:00
Benoit Marty
491a38a79f Login screens: send again 3pid 2019-11-22 12:15:19 +01:00
Benoit Marty
051f77087e Email format validation 2019-11-22 12:15:19 +01:00
Benoit Marty
1a603742d0 Cleanup 2019-11-22 12:15:19 +01:00
Benoit Marty
edb65f1787 Fix some errors 2019-11-22 12:15:19 +01:00
Benoit Marty
9af8355c07 Fix wording 2019-11-22 12:15:19 +01:00
Benoit Marty
dd44078297 Login screens: fix several issue with check email screen 2019-11-22 12:15:19 +01:00
Benoit Marty
a1f96a5b5a Login screens: typo 2019-11-22 12:15:19 +01:00
Benoit Marty
5770023593 Login screens: code cleanup 2019-11-22 12:15:19 +01:00
Benoit Marty
2789268c23 Login screens: MSISDN: check format and compute country code 2019-11-22 12:15:19 +01:00
Benoit Marty
eb4355890e Login screens: setup autofill 2019-11-22 12:15:19 +01:00
Benoit Marty
4e41156db3 Login screens: doc: registration forbidden 2019-11-22 12:15:19 +01:00
Benoit Marty
1a0b8b35f8 Login screens: Doc: adapt log to correct logs and fix typo 2019-11-22 12:15:19 +01:00
Benoit Marty
5f9cdcb4b4 Login screens: Doc: add msisdn stage 2019-11-22 12:15:19 +01:00
Benoit Marty
2e4c3f850a Cleanup 2019-11-22 12:15:19 +01:00
Benoit Marty
127916a8d9 Login screens: add MSISDN 2019-11-22 12:15:19 +01:00
Benoit Marty
248a584e1a Login screens: Add Msisdn - WIP 2019-11-22 12:15:19 +01:00
Benoit Marty
b8a3ad0c43 Login screens: Wait for email validation screen 2019-11-22 12:15:19 +01:00
Benoit Marty
1f161b7e23 Login screens: Add 3Pid step 1 2019-11-22 12:15:19 +01:00
Benoit Marty
23315ede92 Login screens: update wording 2019-11-22 12:15:19 +01:00
Benoit Marty
20ad3abb60 Login screens: set initial device name 2019-11-22 12:15:19 +01:00
Benoit Marty
ac377fceba Login screens: mutualize registration callback 2019-11-22 12:15:19 +01:00
Benoit Marty
abbe56acfa Login screens: UI: display errors properly 2019-11-22 12:15:19 +01:00
Benoit Marty
f74cabd145 Login screens: UI: style to prepare for landscape 2019-11-22 12:15:19 +01:00
Benoit Marty
0e2237226f Login screens: back button management for registration 2019-11-22 12:15:19 +01:00
Benoit Marty
62d5aba796 Login screens: back button management for SSO 2019-11-22 12:15:19 +01:00
Benoit Marty
f12e6c941d Login screens: sigin button for SSO 2019-11-22 12:15:19 +01:00
Benoit Marty
7caa8ce3bc Login screens: disabled registration 2019-11-22 12:15:19 +01:00
Benoit Marty
20f969d563 Login screens: fix issue on terms 2019-11-22 12:15:19 +01:00
Benoit Marty
a8f24e5c39 Login screens: a11y 2019-11-22 12:15:19 +01:00
Benoit Marty
8ae9544b48 Login screens: Loading on Captcha step 2019-11-22 12:15:19 +01:00
Benoit Marty
3758334824 Login screens: cleanup the Fragment stack after completing stage 2019-11-22 12:15:19 +01:00
Benoit Marty
6d8e5b892e Login screens: Show disclaimer dialog only in HomeActivity, now that RiotX supports registration 2019-11-22 12:15:19 +01:00
Benoit Marty
c18c140ec9 Login screens: Animate the logo in screen transition 2019-11-22 12:15:19 +01:00
Benoit Marty
1dc7dfc896 Login screens: registration fallback 2019-11-22 12:15:19 +01:00
Benoit Marty
1c03163a33 Login screens: prepare email and msisdn 2019-11-22 12:15:19 +01:00
Benoit Marty
9aa270c7ad Login screens: Perform dummy action when user does not want to enter an email -> account created! 2019-11-22 12:15:19 +01:00
Benoit Marty
3f80076fb1 Login screens: Terms step for registration 2019-11-22 12:15:19 +01:00
Benoit Marty
dfbf448bb7 Login screens: Captcha step for registration 2019-11-22 12:15:19 +01:00
Benoit Marty
95fc20dca0 Login screens: Registration: login/password step 2019-11-22 12:15:19 +01:00
Benoit Marty
381084b2ab Login screens: USER_IN_USE error 2019-11-22 12:15:19 +01:00
Benoit Marty
41ac2c6d70 Login screens: Registration WIP 2019-11-22 12:15:19 +01:00
Benoit Marty
08ea3d049e Login screens: Simple Input form (UI) 2019-11-22 12:15:19 +01:00
Benoit Marty
f24889230c Login screens: Captch screen (UI) 2019-11-22 12:15:19 +01:00
Benoit Marty
b5f9549a8b Login screens: Fix issues on button style 2019-11-22 12:15:19 +01:00
Benoit Marty
e3e38d4c8a Login screens: Fix issues on modular tile 2019-11-22 12:15:19 +01:00
Benoit Marty
416bef7903 Login screens: button theme 2019-11-22 12:15:19 +01:00
Benoit Marty
823acebf78 Login screens: harmonize styles for containers 2019-11-22 12:15:19 +01:00
Benoit Marty
3e91125872 Fix issues 2019-11-22 12:15:19 +01:00
Benoit Marty
9a628c7b5d ktlint 2019-11-22 12:15:19 +01:00
Benoit Marty
fb46a14172 Fix compilation issue after rebase 2019-11-22 12:15:19 +01:00
Benoit Marty
ca4e75a1a0 Login screens: Fix a few bugs 2019-11-22 12:15:19 +01:00
Benoit Marty
2871e4f5b1 Login screens: forget password screens 2019-11-22 12:15:19 +01:00
Benoit Marty
b7bfb20a2e Login screens: login and registration fallback 2019-11-22 12:15:19 +01:00
Benoit Marty
a1aa16715d Login screens: move elements from ViewState to ViewModel 2019-11-22 12:15:19 +01:00
Benoit Marty
55add4734d Login screens: Fix Other rendering issue 2019-11-22 12:15:19 +01:00
Benoit Marty
2849e1f846 Login screens: Splash: update icons 2019-11-22 12:15:19 +01:00
Benoit Marty
5b9876a20c Login screens: Fix navigation issue 2019-11-22 12:15:19 +01:00
Benoit Marty
adf299081d Login screens: re-click on an item submit it 2019-11-22 12:15:19 +01:00
Benoit Marty
d50b690523 Login screens: improve LoginFragment 2019-11-22 12:15:19 +01:00
Benoit Marty
c6b0ae63ea Login screens: handle loading Views and global navigation - WIP 2019-11-22 12:15:19 +01:00
Benoit Marty
3c93807fe6 Login screens: add some doc 2019-11-22 12:15:19 +01:00
Benoit Marty
7f1f98c2e5 Login screens: reset state when navigating back 2019-11-22 12:15:19 +01:00
Benoit Marty
6525314af8 Login screens: server ur form 2019-11-22 12:15:19 +01:00
Benoit Marty
da8d6fb4f4 Login screens: signup signin selection 2019-11-22 12:15:19 +01:00
Benoit Marty
fa6a9cab7e Login screens: server selection 2019-11-22 12:15:19 +01:00
Benoit Marty
bdfc4ad8a7 Login screens: splash screen 2019-11-22 12:15:19 +01:00
Benoit Marty
6ab7209e4d Handle navigation with VectorSharedAction 2019-11-22 12:14:48 +01:00
Benoit Marty
4485d1c685 Registration flow: SDK side 2019-11-22 12:14:48 +01:00
Benoit Marty
8b63f78d76 Add documentation on the sign up flow 2019-11-22 12:14:48 +01:00
Matthew Hodgson
2e87e0b4c1 fix typo 2019-11-21 01:41:59 +00:00
Andrew Morgan
507134407b Update CHANGES.md 2019-11-19 15:10:41 +00:00
Andrew Morgan
7663cd4e23 Merge branch 'develop' of github.com:vector-im/riotx-android into anoa/typo 2019-11-19 15:10:24 +00:00
Benoit Marty
ec2954200e Version++ 2019-11-19 09:58:48 +01:00
Benoit Marty
fc367b3c3e Merge branch 'release/0.8.0' into develop 2019-11-19 09:47:56 +01:00
Andrew Morgan
3673520ef6 Small typo fix 2019-11-18 13:30:03 +00:00
ganfra
8aab46804b Profile room: continue working on it (try to get a nice animation) [WIP] 2019-11-15 20:37:36 +01:00
ganfra
0edc953a23 Room profile: start creating epoxy items and implementing UI 2019-11-14 20:13:59 +01:00
ganfra
fa67509ac2 Room profile: start initializing all the classes + move some packages 2019-11-14 15:34:50 +01:00
2652 changed files with 147212 additions and 26134 deletions

View File

@@ -1,88 +0,0 @@
# Use Docker file from https://hub.docker.com/r/runmymind/docker-android-sdk
# Last docker plugin version can be found here:
# https://github.com/buildkite-plugins/docker-buildkite-plugin/releases
# We propagate the environment to the container (sse https://github.com/buildkite-plugins/docker-buildkite-plugin#propagate-environment-optional-boolean)
steps:
- label: "Compile and run Unit tests"
agents:
# We use a medium sized instance instead of the normal small ones because
# gradle build can be memory hungry
queue: "medium"
commands:
- "./gradlew clean test --stacktrace"
plugins:
- docker#v3.1.0:
image: "runmymind/docker-android-sdk"
propagate-environment: true
- label: "Compile Android tests"
agents:
# We use a medium sized instance instead of the normal small ones because
# gradle build can be memory hungry
queue: "medium"
commands:
- "./gradlew clean assembleAndroidTest --stacktrace"
plugins:
- docker#v3.1.0:
image: "runmymind/docker-android-sdk"
propagate-environment: true
- label: "Assemble GPlay Debug version"
agents:
# We use a xlarge sized instance instead of the normal small ones because
# gradle build can be memory hungry
queue: "xlarge"
commands:
- "./gradlew clean lintGplayRelease assembleGplayDebug --stacktrace"
artifact_paths:
- "vector/build/outputs/apk/gplay/debug/*.apk"
branches: "!master"
plugins:
- docker#v3.1.0:
image: "runmymind/docker-android-sdk"
propagate-environment: true
- label: "Assemble FDroid Debug version"
agents:
# We use a xlarge sized instance instead of the normal small ones because
# gradle build can be memory hungry
queue: "xlarge"
commands:
- "./gradlew clean lintFdroidRelease assembleFdroidDebug --stacktrace"
artifact_paths:
- "vector/build/outputs/apk/fdroid/debug/*.apk"
branches: "!master"
plugins:
- docker#v3.1.0:
image: "runmymind/docker-android-sdk"
propagate-environment: true
- label: "Build Google Play unsigned APK"
agents:
# We use a xlarge sized instance instead of the normal small ones because
# gradle build can be memory hungry
queue: "xlarge"
commands:
- "./gradlew clean assembleGplayRelease --stacktrace"
artifact_paths:
- "vector/build/outputs/apk/gplay/release/*.apk"
branches: "master"
plugins:
- docker#v3.1.0:
image: "runmymind/docker-android-sdk"
propagate-environment: true
# Code quality
- label: "Code quality"
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"

View File

@@ -12,7 +12,7 @@ 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
disabled_rules=no-multi-spaces,colon-spacing,chain-wrapping,import-ordering,experimental:annotation
# The following (so far identified) rules are kept:
# no-blank-line-before-rbrace
@@ -30,3 +30,4 @@ disabled_rules=no-wildcard-imports,no-multi-spaces,colon-spacing,chain-wrapping,
# no-empty-class-body
# experimental:multiline-if-else
# experimental:no-empty-first-line-in-method-block
# no-wildcard-imports

View File

@@ -7,4 +7,4 @@
- [ ] Pull request is based on the develop branch
- [ ] Pull request updates [CHANGES.md](https://github.com/vector-im/riotX-android/blob/develop/CHANGES.md)
- [ ] Pull request includes screenshots or videos if containing UI changes
- [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst#sign-off)
- [ ] Pull request includes a [sign off](https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md#sign-off)

4
.gitignore vendored
View File

@@ -3,8 +3,8 @@
/local.properties
# idea files: exclude everything except dictionnaries
.idea/caches
.idea/codeStyles
.idea/libraries
.idea/inspectionProfiles
.idea/*.xml
.DS_Store
/build
@@ -14,5 +14,3 @@
/tmp
ktlint
.idea/copyright/New_vector.xml
.idea/copyright/profiles_settings.xml

156
.idea/codeStyles/Project.xml generated Normal file
View File

@@ -0,0 +1,156 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<option name="RIGHT_MARGIN" value="160" />
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="kotlinx.android.synthetic" withSubpackages="true" static="false" />
</value>
</option>
<option name="ALIGN_IN_COLUMNS_CASE_BRANCH" value="true" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
<option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
<option name="CONTINUATION_INDENT_IN_PARAMETER_LISTS" value="true" />
<option name="CONTINUATION_INDENT_IN_ARGUMENT_LISTS" value="true" />
<option name="CONTINUATION_INDENT_FOR_EXPRESSION_BODIES" value="true" />
<option name="CONTINUATION_INDENT_FOR_CHAINED_CALLS" value="true" />
<option name="CONTINUATION_INDENT_IN_SUPERTYPE_LISTS" value="true" />
<option name="CONTINUATION_INDENT_IN_IF_CONDITIONS" value="true" />
<option name="CONTINUATION_INDENT_IN_ELVIS" value="true" />
<option name="WRAP_EXPRESSION_BODY_FUNCTIONS" value="0" />
<option name="IF_RPAREN_ON_NEW_LINE" value="false" />
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
</JetCodeStyleSettings>
<codeStyleSettings language="XML">
<option name="RIGHT_MARGIN" value="160" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
<arrangement>
<rules>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:android</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>xmlns:.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:id</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*:name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>name</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>style</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>^$</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
</AND>
</match>
<order>ANDROID_ATTRIBUTE_ORDER</order>
</rule>
</section>
<section>
<rule>
<match>
<AND>
<NAME>.*</NAME>
<XML_ATTRIBUTE />
<XML_NAMESPACE>.*</XML_NAMESPACE>
</AND>
</match>
<order>BY_NAME</order>
</rule>
</section>
</rules>
</arrangement>
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
<option name="RIGHT_MARGIN" value="160" />
<option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
<option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
<option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="0" />
<option name="CALL_PARAMETERS_WRAP" value="0" />
<option name="CALL_PARAMETERS_LPAREN_ON_NEXT_LINE" value="false" />
<option name="CALL_PARAMETERS_RPAREN_ON_NEXT_LINE" value="false" />
<option name="METHOD_PARAMETERS_WRAP" value="0" />
<option name="METHOD_PARAMETERS_LPAREN_ON_NEXT_LINE" value="false" />
<option name="METHOD_PARAMETERS_RPAREN_ON_NEXT_LINE" value="false" />
<option name="EXTENDS_LIST_WRAP" value="0" />
<option name="METHOD_CALL_CHAIN_WRAP" value="0" />
<option name="ASSIGNMENT_WRAP" value="0" />
<option name="CLASS_ANNOTATION_WRAP" value="0" />
<option name="FIELD_ANNOTATION_WRAP" value="1" />
</codeStyleSettings>
</code_scheme>
</component>

6
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
<option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
</state>
</component>

6
.idea/copyright/NewVector.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<component name="CopyrightManager">
<copyright>
<option name="notice" value="Copyright (c) &amp;#36;today.year New Vector Ltd&#10;&#10;Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&#10;you may not use this file except in compliance with the License.&#10;You may obtain a copy of the License at&#10;&#10; http://www.apache.org/licenses/LICENSE-2.0&#10;&#10;Unless required by applicable law or agreed to in writing, software&#10;distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&#10;WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;See the License for the specific language governing permissions and&#10;limitations under the License." />
<option name="myName" value="NewVector" />
</copyright>
</component>

8
.idea/copyright/profiles_settings.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<component name="CopyrightManager">
<settings default="NewVector">
<LanguageOptions name="XML">
<option name="fileTypeOverride" value="1" />
<option name="prefixLines" value="false" />
</LanguageOptions>
</settings>
</component>

View File

@@ -3,17 +3,33 @@
<words>
<w>backstack</w>
<w>bytearray</w>
<w>checkables</w>
<w>ciphertext</w>
<w>coroutine</w>
<w>decryptor</w>
<w>displayname</w>
<w>emoji</w>
<w>emojis</w>
<w>fdroid</w>
<w>gplay</w>
<w>hmac</w>
<w>homeserver</w>
<w>ktlint</w>
<w>linkified</w>
<w>linkify</w>
<w>megolm</w>
<w>msisdn</w>
<w>msisdns</w>
<w>pbkdf</w>
<w>pids</w>
<w>pkcs</w>
<w>riotx</w>
<w>signin</w>
<w>signout</w>
<w>signup</w>
<w>ssss</w>
<w>threepid</w>
<w>unwedging</w>
</words>
</dictionary>
</component>

View File

@@ -23,10 +23,10 @@ android:
- platform-tools
# The BuildTools version used by your project
- build-tools-28.0.3
- build-tools-29.0.3
# The SDK version used to compile your project
- android-28
- android-29
before_cache:
- rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
@@ -49,12 +49,12 @@ script:
# Build Android test (assembleAndroidTest) (disabled for now)
# Code quality (lintGplayRelease lintFdroidRelease)
# Split into two steps because if a task contain Fdroid, PlayService will be disabled
- ./gradlew clean assembleGplayRelease lintGplayRelease --stacktrace
- ./gradlew clean assembleFdroidRelease lintFdroidRelease --stacktrace
# Done by Buildkite now: - ./gradlew clean assembleGplayRelease lintGplayRelease --stacktrace
# Done by Buildkite now: - ./gradlew clean assembleFdroidRelease lintFdroidRelease --stacktrace
# Run unitary test (Disable for now, see https://travis-ci.org/vector-im/riot-android/builds/502504370)
# - ./gradlew testGplayReleaseUnitTest --stacktrace
# Other code quality check
- ./tools/check/check_code_quality.sh
# Done by Buildkite now: - ./tools/check/check_code_quality.sh
- ./tools/travis/check_pr.sh
# Check that indonesians file are identical. Due to Android issue, the resource folder must be value-in/, and Weblate export data into value-id/.
- diff ./vector/src/main/res/values-id/strings.xml ./vector/src/main/res/values-in/strings.xml
# Done by Buildkite now: - diff ./vector/src/main/res/values-id/strings.xml ./vector/src/main/res/values-in/strings.xml

View File

@@ -0,0 +1,35 @@
A full developer contributors list can be found [here](https://github.com/vector-im/riotX-android/graphs/contributors).
# Core team:
Even if we try to be able to work on all the functionalities, we have more knowledge about what we have developed ourselves.
## Benoit: Android team leader
[@benoit.marty:matrix.org](https://matrix.to/#/@benoit.marty:matrix.org)
- Android team leader and project leader, Android developer, GitHub community manager.
- Specialist of the account creation, and many other fun features.
- Reviewing and polishing developed features, code quality manager, PRs reviewer, GitHub community manager.
- Release manager on the Play Store
## François: Software architect
[@ganfra:matrix.org](https://matrix.to/#/@ganfra:matrix.org)
- Software architect, Android developer
- First developer on the project.
- Work mainly on the global architecture of the project.
- Specialist of the timeline, and lots of other features.
## Valere: Product manager, Android developer
[@valere35:matrix.org](https://matrix.to/#/@valere35:matrix.org)
- Product manager, Android developer
- Specialist on the crypto implementation.
# Other contributors
First of all, we thank all contributors who use Element and report problems on this GitHub project or via the integrated rageshake function.
We do not forget all translators, for their work of translating Element into many languages. They are also the authors of Element.
Feel free to add your name below, when you contribute to the project!

View File

@@ -1,3 +1,567 @@
Changes in Element 1.0.4 (2020-08-03)
===================================================
Bugfix 🐛:
- Fix Crash when opening invite to room user screen
Changes in Element 1.0.3 (2020-07-31)
===================================================
Features ✨:
- Support server admin option to disable E2EE for DMs / private rooms [users can still enable] (#1794)
Bugfix 🐛:
- Crash reported on playstore for HomeActivity launch (151 reports)
Changes in Element 1.0.2 (2020-07-29)
===================================================
Improvements 🙌:
- Added Session Database migration to avoid unneeded initial syncs
Changes in Element 1.0.1 (2020-07-28)
===================================================
Improvements 🙌:
- Sending events is now retried only 3 times, so we avoid blocking the sending queue too long.
- Display warning when fail to send events in room list
- Improve UI of edit role action in member profile
- Moderation | New screen to display list of banned users in room settings, with unban action
Bugfix 🐛:
- Fix theme issue on Room directory screen (#1613)
- Fix notification not dismissing when entering a room
- Fix uploads don't work with Room v6 (#1558)
- Fix Requesting avatar thumbnails in Element uses wrong http "user-agent" string (#1725)
- Fix 404 on EMS (#1761)
- Fix Infinite loop at startup when migrating account from Riot (#1699)
- Fix Element crashes in loop after initial sync (#1709)
- Remove inner mx-reply tags before replying
- Fix timeline items not loading when there are only filtered events
- Fix "Voice & Video" grayed out in Settings (#1733)
- Fix Allow VOIP call in all rooms with 2 participants (even if not DM)
- Migration from old client does not enable notifications (#1723)
Other changes:
- i18n deactivated account error
Changes in Element 1.0.0 (2020-07-15)
===================================================
Features ✨:
- Re-branding: The app is now called Element. New name, new themes, new icons, etc. More details here: https://element.io/blog/welcome-to-element/ (#1691)
Bugfix 🐛:
- Video calls are shown as a voice ones in the timeline (#1676)
- Fix regression: not able to create a room without IS configured (#1679)
Changes in Riot.imX 0.91.5 (2020-07-11)
===================================================
Features ✨:
- 3pid invite: it is now possible to invite people by email. An Identity Server has to be configured (#548)
Improvements 🙌:
- Cleaning chunks with lots of events as long as a threshold has been exceeded (35_000 events in DB) (#1634)
- Creating and listening to EventInsertEntity. (#1634)
- Handling (almost) properly the groups fetching (#1634)
- Improve fullscreen media display (#327)
- Setup server recovery banner (#1648)
- Set up SSSS from security settings (#1567)
- New lab setting to add 'unread notifications' tab to main screen
- Render third party invite event (#548)
- Display three pid invites in the room members list (#548)
Bugfix 🐛:
- Integration Manager: Wrong URL to review terms if URL in config contains path (#1606)
- Regression Composer does not grow, crops out text (#1650)
- Bug / Unwanted draft (#698)
- All users seems to be able to see the enable encryption option in room settings (#1341)
- Leave room only leaves the current version (#1656)
- Regression | Share action menu do not work (#1647)
- verification issues on transition (#1555)
- Fix issue when restoring keys backup using recovery key
SDK API changes ⚠️:
- CreateRoomParams has been updated
Build 🧱:
- Upgrade some dependencies
- Revert to build-tools 3.5.3
Other changes:
- Use Intent.ACTION_CREATE_DOCUMENT to save megolm key or recovery key in a txt file
- Use `Context#withStyledAttributes` extension function (#1546)
Changes in Riot.imX 0.91.4 (2020-07-06)
===================================================
Features ✨:
- Re-activate Wellknown support with updated UI (#1614)
Improvements 🙌:
- Upload device keys only once to the homeserver and fix crash when no network (#1629)
Bugfix 🐛:
- Fix crash when coming from a notification (#1601)
- Fix Exception when importing keys (#1576)
- File isn't downloaded when another file with the same name already exists (#1578)
- saved images don't show up in gallery (#1324)
- Fix reply fallback leaking sender locale (#429)
Build 🧱:
- Fix lint false-positive about WorkManager (#1012)
- Upgrade build-tools from 3.5.3 to 3.6.3
- Upgrade gradle from 5.4.1 to 5.6.4
Changes in Riot.imX 0.91.3 (2020-07-01)
===================================================
Notes:
- This version is the third beta version of RiotX codebase published as Riot-Android on the PlayStore.
- Changelog below includes changes of v0.91.0, v0.91.1, and v0.91.2, because the first beta versions have been tagged and
published from the branch feature/migration_from_legacy.
- This version uses temporary name `Riot.imX`, to distinguish the app with RiotX app.
Features ✨:
- Call with WebRTC support (##611)
- Add capability to change the display name (#1529)
Improvements 🙌:
- "Add Matrix app" menu is now always visible (#1495)
- Handle `/op`, `/deop`, and `/nick` commands (#12)
- Prioritising Recovery key over Recovery passphrase (#1463)
- Room Settings: Name, Topic, Photo, Aliases, History Visibility (#1455)
- Update user avatar (#1054)
- Allow self-signed certificate (#1564)
- Improve file download and open in timeline
- Catchup tab is removed temporarily (#1565)
- Render room avatar change (#1319)
Bugfix 🐛:
- Fix dark theme issue on login screen (#1097)
- Incomplete predicate in RealmCryptoStore#getOutgoingRoomKeyRequest (#1519)
- User could not redact message that they have sent (#1543)
- Use vendor prefix for non merged MSC (#1537)
- Compress images before sending (#1333)
- Searching by displayname is case sensitive (#1468)
- Fix layout overlap issue (#1407)
Build 🧱:
- Enable code optimization (Proguard)
- SDK is now API level 21 minimum, and so RiotX (#405)
Other changes:
- Use `SharedPreferences#edit` extension function consistently (#1545)
- Use `retrofit2.Call.awaitResponse` extension provided by Retrofit 2. (#1526)
- Fix minor typo in contribution guide (#1512)
- Fix self-assignment of callback in `DefaultRoomPushRuleService#setRoomNotificationState` (#1520)
- Random housekeeping clean-ups indicated by Lint (#1520, #1541)
- Keys Backup API now use the unstable prefix (#1503)
- Remove deviceId from /keys/upload/{deviceId} as not spec-compliant (#1502)
Changes in RiotX 0.22.0 (2020-06-15)
===================================================
Features ✨:
- Integration Manager and Widget support (#48)
- Send stickers (#51)
Improvements 🙌:
- New wording for notice when current user is the sender
- Hide "X made no changes" event by default in timeline (#1430)
- Hide left rooms in breadcrumbs (#766)
- Handle PowerLevel properly (#627)
- Correctly handle SSO login redirection
- SSO login is now performed in the default browser, or in Chrome Custom tab if available (#1400)
- Improve checking of homeserver version support (#1442)
- Add capability to add and remove a room from the favorites (#1217)
Bugfix 🐛:
- Switch theme is not fully taken into account without restarting the app
- Temporary fix to show error when user is creating an account on matrix.org with userId containing only digits (#1410)
- Reply composer overlay stays on screen too long after send (#1169)
- Fix navigation bar icon contrast on API in [21,27[ (#1342)
- Fix status bar icon contrast on API in [21,23[
- Wrong /query request (#1444)
- Make Credentials.homeServer optional because it is deprecated (#1443)
- Fix issue on dark themes, after alert popup dismiss
Other changes:
- Send plain text in the body of events containing formatted body, as per https://matrix.org/docs/spec/client_server/latest#m-room-message-msgtypes
- Update link to Modular url from "https://modular.im/" to "https://modular.im/services/matrix-hosting-riot" and open it using ChromeCustomTab
Changes in RiotX 0.21.0 (2020-05-28)
===================================================
Features ✨:
- Identity server support (#607)
- Switch language support (#41)
- Display list of attachments of a room (#860)
Improvements 🙌:
- Better connectivity lost indicator when airplane mode is on
- Add a setting to hide redacted events (#951)
- Render formatted_body for m.notice and m.emote (#1196)
- Change icon to magnifying-glass to filter room (#1384)
Bugfix 🐛:
- After jump to unread, newer messages are never loaded (#1008)
- Fix issues with FontScale switch (#69, #645)
- "Seen by" uses 12h time (#1378)
- Enable markdown (if active) when sending emote (#734)
- Screenshots for Rageshake now includes Dialogs such as BottomSheet (#1349)
SDK API changes ⚠️:
- initialize with proxy configuration
Other changes:
- support new key agreement method for SAS (#1374)
Changes in RiotX 0.20.0 (2020-05-15)
===================================================
Features ✨:
- Add Direct Shortcuts (#652)
Improvements 🙌:
- Invite member(s) to an existing room (#1276)
- Improve notification accessibility with ticker text (#1226)
- Support homeserver discovery from MXID (DISABLED: waiting for design) (#476)
Bugfix 🐛:
- Fix | Verify Manually by Text crashes if private SSK not known (#1337)
- Sometimes the same device appears twice in the list of devices of a user (#1329)
- Random Crashes while doing sth with cross signing keys (#1364)
- Crash | crash while restoring key backup (#1366)
SDK API changes ⚠️:
- excludedUserIds parameter added to the UserService.getPagedUsersLive() function
Changes in RiotX 0.19.0 (2020-05-04)
===================================================
Features ✨:
- Change password (#528)
- Cross-Signing | Support SSSS secret sharing (#944)
- Cross-Signing | Verify new session from existing session (#1134)
- Cross-Signing | Bootstraping cross signing with 4S from mobile (#985)
- Save media files to Gallery (#973)
- Account deactivation (with password only) (#35)
Improvements 🙌:
- Verification DM / Handle concurrent .start after .ready (#794)
- Reimplementation of multiple attachment picker
- Cross-Signing | Update Shield Logic for DM (#963)
- Cross-Signing | Complete security new session design update (#1135)
- Cross-Signing | Setup key backup as part of SSSS bootstrapping (#1201)
- Cross-Signing | Gossip key backup recovery key (#1200)
- Show room encryption status as a bubble tile (#1078)
- UX/UI | Add indicator to home tab on invite (#957)
- Cross-Signing | Restore history after recover from passphrase (#1214)
- Cross-Sign | QR code scan confirmation screens design update (#1187)
- Emoji Verification | It's not the same butterfly! (#1220)
- Cross-Signing | Composer decoration: shields (#1077)
- Cross-Signing | Migrate existing keybackup to cross signing with 4S from mobile (#1197)
- Show a warning dialog if the text of the clicked link does not match the link target (#922)
- Cross-Signing | Consider not using a spinner on the 'complete security' prompt (#1271)
- Restart broken Olm sessions ([MSC1719](https://github.com/matrix-org/matrix-doc/pull/1719))
- Cross-Signing | Hide Use recovery key when 4S is not setup (#1007)
- Cross-Signing | Trust account xSigning keys by entering Recovery Key (select file or copy) #1199
- E2E timeline decoration (#1279)
- Manage Session Settings / Cross Signing update (#1295)
- Cross-Signing | Review sessions toast update old vs new (#1293, #1306)
Bugfix 🐛:
- Fix summary notification staying after "mark as read"
- Missing avatar/displayname after verification request message (#841)
- Crypto | RiotX sometimes rotate the current device keys (#1170)
- RiotX can't restore cross signing keys saved by web in SSSS (#1174)
- Cross- Signing | After signin in new session, verification paper trail in DM is off (#1191)
- Failed to encrypt message in room (message stays in red), [thanks to pwr22] (#925)
- Cross-Signing | web <-> riotX After QR code scan, gossiping fails (#1210)
- Fix crash when trying to download file without internet connection (#1229)
- Local echo are not updated in timeline (for failed & encrypted states)
- Render image event even if thumbnail_info does not have mimetype defined (#1209)
- RiotX now uses as many threads as it needs to do work and send messages (#1221)
- Fix issue with media path (#1227)
- Add user to direct chat by user id (#1065)
- Use correct URL for SSO connection (#1178)
- Emoji completion :tada: does not completes to 🎉 like on web (#1285)
- Fix bad Shield Logic for DM (#963)
Translations 🗣:
- Weblate now create PR directly to RiotX GitHub project
SDK API changes ⚠️:
- Increase targetSdkVersion to 29
Build 🧱:
- Compile with Android SDK 29 (Android Q)
Other changes:
- Add a setting to prevent screenshots of the application, disabled by default (#1027)
- Increase File Logger capacities ( + use dev log preferences)
Changes in RiotX 0.18.1 (2020-03-17)
===================================================
Improvements 🙌:
- Implementation of /join command
Bugfix 🐛:
- Message transitions in encrypted rooms are jarring #518
- Images that failed to send are waiting to be sent forever #1145
- Fix / Crashed when trying to send a gif from the Gboard #1136
- Fix / Cannot click on key backup banner when new keys are available
Changes in RiotX 0.18.0 (2020-03-11)
===================================================
Improvements 🙌:
- Share image and other media from e2e rooms (#677)
- Add support for `/plain` command (#12)
- Detect spaces in password if user fail to login (#1038)
- FTUE: do not display a different color when encrypting message when not in developer mode.
- Open room member profile from avatar of the room member state event (#935)
- Restore the push rules configuration in the settings
Bugfix 🐛:
- Fix crash on attachment preview screen (#1088)
- "Share" option is not appearing in encrypted rooms for images (#1031)
- Set "image/jpeg" as MIME type of images instead of "image/jpg" (#1075)
- Self verification via QR code is failing (#1130)
SDK API changes ⚠️:
- PushRuleService.getPushRules() now returns a RuleSet. Use getAllRules() on this object to get all the rules.
Build 🧱:
- Upgrade ktlint to version 0.36.0
- Pipeline file for Buildkite is now hosted on another Github repository: https://github.com/matrix-org/pipelines/blob/master/riotx-android/pipeline.yml
Other changes:
- Restore availability to Chromebooks (#932)
- Add a [documentation](./docs/integration_tests.md) to run integration tests
Changes in RiotX 0.17.0 (2020-02-27)
===================================================
Features ✨:
- Secured Shared Storage Support (#984, #936)
- It's now possible to select several rooms (with a possible mix of clear/encrypted rooms) when sharing elements to RiotX (#1010)
- Media preview: media are previewed before being sent to a room (#1010)
- Image edition: it's now possible to edit image before sending: crop, rotate, and delete actions are supported (#1010)
- Sending image: image are sent to rooms with a reduced size. It's still possible to send original image file (#1010)
Improvements 🙌:
- Migrate to binary QR code verification (#994)
- Share action is added to room profile and room member profile (#858)
- Display avatar in fullscreen (#861)
- Fix some performance issues with crypto
Bugfix 🐛:
- Account creation: wrongly hints that an email can be used to create an account (#941)
- Fix crash in the room directory, when public room has no name (#1023)
- Fix restoring keys backup with passphrase (#526)
- Fix rotation of full-size image (#647)
- Fix joining rooms from directory via federation isn't working. (#808)
- Leaving a room creates a stuck "leaving room" loading screen. (#1041)
- Fix some invitation handling issues (#1013)
- New direct chat: selecting a participant sometimes results in two breadcrumbs (#1022)
- New direct chat: selecting several participants was not adding the room to the direct chats list
- Room overview shows deleted messages as “Encrypted message” (#758)
SDK API changes ⚠️:
- Get crypto methods through Session.cryptoService()
- ProgressListener.onProgress() function will be invoked on the background thread instead of UI thread
- Improve CreateRoomParams API (#1070)
Changes in RiotX 0.16.0 (2020-02-14)
===================================================
Features ✨:
- Polls and Bot Buttons (MSC 2192 matrix-org/matrix-doc#2192)
Improvements 🙌:
- Show confirmation dialog before deleting a message (#967, #1003)
- Open room member profile from reactions list and read receipts list (#875)
Bugfix 🐛:
- Fix crash by removing all notifications after clearing cache (#878)
- Fix issue with verification when other client declares it can only show QR code (#988)
- Fix too errors in the code (1941862499c9ec5268cc80882512ced379cafcfd, a250a895fe0a4acf08c671e03434edcd29ccd84f)
SDK API changes ⚠️:
- Javadoc improved for PushersService
- PushersService.pushers() has been renamed to PushersService.getPushers()
Changes in RiotX 0.15.0 (2020-02-10)
===================================================
Improvements 🙌:
- Improve navigation to the timeline (#789, #862)
- Improve network detection. It is now based on the sync request status (#873, #882)
Other changes:
- Support SSO login with Firefox account (#606)
Bugfix 🐛:
- Ask for permission before opening the camera (#934)
- Encrypt for invited users by default, if the room state allows it (#803)
Changes in RiotX 0.14.3 (2020-02-03)
===================================================
Bugfix 🐛:
- Fix Exception in DeviceListManager
Changes in RiotX 0.14.2 (2020-02-02)
===================================================
Bugfix 🐛:
- Fix RiotX not starting issue
Changes in RiotX 0.14.1 (2020-02-02)
===================================================
Bugfix 🐛:
- Cross-signing: fix UX issue when closing the bottom sheet verification (#813)
- Room and room member profile: fix issues on dark and black themes
Changes in RiotX 0.14.0 (2020-02-01)
===================================================
Features ✨:
- First implementation of Cross-signing
- Enable encryption in unencrypted rooms, from the room settings (#212)
- Negotiate E2E by default for DMs (#907)
Improvements 🙌:
- Sharing things to RiotX: sort list by recent room first (#771)
- Hide the algorithm when turning on e2e (#897)
- Sort room members by display names
Other changes:
- Add support for /rainbow and /rainbowme commands (#879)
Build 🧱:
- Ensure builds are reproducible (#842)
- F-Droid: fix the "-dev" issue in version name (#815)
Changes in RiotX 0.13.0 (2020-01-17)
===================================================
Features ✨:
- Send and render typing events (#564)
- Create Room Profile screen (#54)
- Create Room Member Profile screen (#59)
Improvements 🙌:
- Render events m.room.encryption and m.room.guest_access in the timeline
Bugfix 🐛:
- Fix broken background sync in F-Droid version
- Fix issue with downloaded file on encrypted rooms. The file was not properly decrypted
Build 🧱:
- Change the way versionCode is computed (#827)
Changes in RiotX 0.12.0 (2020-01-09)
===================================================
Improvements 🙌:
- The initial sync is now handled by a foreground service
- Render aliases and canonical alias change in the timeline
- Introduce developer mode in the settings (#745, #796)
- Improve devices list screen
- Add settings for rageshake sensibility
- Fix autocompletion issues and add support for rooms, groups, and emoji (#780)
- Show skip to bottom FAB while scrolling down (#752)
- Enable encryption on a room, SDK part (#212)
Other changes:
- Change the way RiotX identifies a session to allow the SDK to support several sessions with the same user (#800)
- Exclude play-services-oss-licenses library from F-Droid build (#814)
- Email domain can be limited on some homeservers, i18n of the displayed error (#754)
Bugfix 🐛:
- Fix crash when opening room creation screen from the room filtering screen
- Fix avatar image disappearing (#777)
- Fix read marker banner when permalink
- Fix joining upgraded rooms (#697)
- Fix matrix.org room directory not being browsable (#807)
- Hide non working settings (#751)
Changes in RiotX 0.11.0 (2019-12-19)
===================================================
Features ✨:
- Implement soft logout (#281)
Improvements 🙌:
- Handle navigation to room via room alias (#201)
- Open matrix.to link in RiotX (#57)
- Limit sticker size in the timeline
Other changes:
- Use same default room colors than Riot-Web
Bugfix 🐛:
- Scroll breadcrumbs to top when opened
- Render default room name when it starts with an emoji (#477)
- Do not display " (IRC)" in display names https://github.com/vector-im/riot-android/issues/444
- Fix rendering issue with HTML formatted body
- Disable click on Stickers (#703)
Build 🧱:
- Include diff-match-patch sources as dependency
Changes in RiotX 0.10.0 (2019-12-10)
===================================================
Features ✨:
- Breadcrumbs: switch from one room to another quickly (#571)
Improvements 🙌:
- Support entering a RiotWeb client URL instead of the homeserver URL during connection (#744)
Other changes:
- Add reason for all membership events (https://github.com/matrix-org/matrix-doc/pull/2367)
Bugfix 🐛:
- When automardown is ON, pills are sent as MD in body (#739)
- "ban" event are not rendered correctly (#716)
- Fix crash when rotating screen in Room timeline
Changes in RiotX 0.9.1 (2019-12-05)
===================================================
Bugfix 🐛:
- Fix an issue with DB transaction (#740)
Changes in RiotX 0.9.0 (2019-12-05)
===================================================
Features ✨:
- Account creation. It's now possible to create account on any homeserver with RiotX (#34)
- Iteration of the login flow (#613)
- [SDK] MSC2241 / verification in DMs (#707)
Improvements 🙌:
- Send mention Pills from composer
- Links in message preview in the bottom sheet are now active.
- Rework the read marker to make it more usable
Other changes:
- Fix a small grammatical error when an empty room list is shown.
Bugfix 🐛:
- Do not show long click help if only invitation are displayed
- Fix emoji filtering not working
- Fix issue of closing Realm in another thread (#725)
- Attempt to properly cancel the crypto module when user signs out (#724)
Changes in RiotX 0.8.0 (2019-11-19)
===================================================
@@ -145,6 +709,7 @@ Bugfix:
- Fix messages with empty `in_reply_to` not rendering (#447)
- Fix clear cache (#408) and Logout (#205)
- Fix `(edited)` link can be copied to clipboard (#402)
- KeyBackup / SSSS | Should get the key from SSSS instead of asking recovery Key (#1163)
Build:
- Split APK: generate one APK per arch, to reduce APK size of about 30%
@@ -188,7 +753,7 @@ Mode details here: https://medium.com/@RiotChat/introducing-the-riotx-beta-for-a
=======================================================
Changes in RiotX 0.0.0 (2019-XX-XX)
Changes in Element 1.X.X (2020-XX-XX)
===================================================
Features ✨:
@@ -197,15 +762,17 @@ Features ✨:
Improvements 🙌:
-
Other changes:
-
Bugfix 🐛:
-
Translations 🗣:
-
SDK API changes ⚠️:
-
Build 🧱:
-
Other changes:
-

View File

@@ -1,28 +1,47 @@
# Contributing code to Matrix
Please read https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.rst
Please read https://github.com/matrix-org/synapse/blob/master/CONTRIBUTING.md
Android support can be found in this [![Riot Android Matrix room #riot-android:matrix.org](https://img.shields.io/matrix/riot-android:matrix.org.svg?label=%23riot-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#riot-android:matrix.org) room.
Dedicated room for RiotX: [![RiotX Android Matrix room #riot-android:matrix.org](https://img.shields.io/matrix/riotx:matrix.org.svg?label=%23RiotX:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#riotx:matrix.org)
Android support can be found in this [![Element Android Matrix room #element-android:matrix.org](https://img.shields.io/matrix/element-android:matrix.org.svg?label=%23element-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#element-android:matrix.org) room.
# Specific rules for Matrix Android projects
## Android Studio settings
Please set the "hard wrap" setting of Android Studio to 160 chars, this is the setting we use internally to format the source code (Menu `Settings/Editor/Code Style` then `Hard wrap at`).
Please ensure that your using the project formatting rules (which are in the project at .idea/codeStyles/), and format the file before committing them.
### Template
An Android Studio template has been added to the project to help creating all files needed when adding a new screen to the application. Fragment, ViewModel, Activity, etc.
To install the template (to be done only once):
- Go to folder `./tools/template`.
- Mac OSX: Run the script `./configure.sh`.
Linux: Run `ANDROID_STUDIO=/path/to/android-studio ./configure`
- e.g. `ANDROID_STUDIO=/usr/local/android-studio ./configure`
- Restart Android Studio.
To create a new screen:
- First create a new package in your code.
- Then right click on the package, and select `New/New Vector/RiotX Feature`.
- Follow the Wizard, especially replace `Main` by something more relevant to your feature.
- Click on `Finish`.
- Remaining steps are described as TODO in the generated files, or will be pointed out by the compilator, or at runtime :)
Note that if the templates are modified, the only things to do is to restart Android Studio for the change to take effect.
## Compilation
For now, the Matrix SDK and the RiotX application are in the same project. So there is no specific thing to do, this project should compile without any special action.
For now, the Matrix SDK and the Element application are in the same project. So there is no specific thing to do, this project should compile without any special action.
## I want to help translating RiotX
## I want to help translating Element
If you want to fix an issue with an English string, please submit a PR.
If you want to fix an issue in other languages, or add a missing translation, or even add a new language, please use [Weblate](https://translate.riot.im/projects/riot-android/).
For the moment, Strings from Riot will be used, there is no dedicated project in Weblate for RiotX.
## I want to submit a PR to fix an issue
Please check if a corresponding issue exists. If yes, please let us know in a comment that you're working on it.
@@ -78,9 +97,11 @@ Make sure the following commands execute without any error:
### Tests
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.
Element is currently supported on Android Lollipop (API 21+): please test your change on an Android device (or Android emulator) running with API 21. 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.
You should consider adding Unit tests with your PR, and also integration tests (AndroidTest). Please refer to [this document](./docs/integration_tests.md) to install and run the integration test environment.
### Internationalisation
When adding new string resources, please only add new entries in file `value/strings.xml`. Translations will be added later by the community of translators with a specific tool named [Weblate](https://translate.riot.im/projects/riot-android/).
@@ -95,7 +116,7 @@ Please consider accessibility as an important point. As a minimum requirement, i
When adding or editing layouts, make sure the layout will render correctly if device uses a RTL (Right To Left) language.
You can check this in the layout editor preview by selecting any RTL language (ex: Arabic).
Also please check that the colors are ok for all the current themes of RiotX. Please use `?attr` instead of `@color` to reference colors in the layout. You can check this in the layout editor preview by selecting all the main themes (`AppTheme.Status`, `AppTheme.Dark`, etc.).
Also please check that the colors are ok for all the current themes of Element. Please use `?attr` instead of `@color` to reference colors in the layout. You can check this in the layout editor preview by selecting all the main themes (`AppTheme.Status`, `AppTheme.Dark`, etc.).
### Authors

View File

@@ -1,37 +1,32 @@
[![Buildkite](https://badge.buildkite.com/657d3db27364448d69d54f66c690f7788bc6aa80a7628e37f3.svg?branch=develop)](https://buildkite.com/matrix-dot-org/riotx-android/builds?branch=develop)
[![Weblate](https://translate.riot.im/widgets/riot-android/-/svg-badge.svg)](https://translate.riot.im/engage/riot-android/?utm_source=widget)
[![RiotX Android Matrix room #riot-android:matrix.org](https://img.shields.io/matrix/riotx:matrix.org.svg?label=%23RiotX:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#riotx:matrix.org)
[![Element Android Matrix room #element-android:matrix.org](https://img.shields.io/matrix/element-android:matrix.org.svg?label=%23element-android:matrix.org&logo=matrix&server_fqdn=matrix.org)](https://matrix.to/#/#element-android:matrix.org)
[![Quality Gate](https://sonarcloud.io/api/project_badges/measure?project=vector.android.riotx&metric=alert_status)](https://sonarcloud.io/dashboard?id=vector.android.riotx)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=vector.android.riotx&metric=vulnerabilities)](https://sonarcloud.io/dashboard?id=vector.android.riotx)
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=vector.android.riotx&metric=bugs)](https://sonarcloud.io/dashboard?id=vector.android.riotx)
# RiotX Android
# Element Android
RiotX is an Android Matrix Client currently in beta but in active development.
Element Android is an Android Matrix Client provided by [Element](https://element.io/).
It is a total rewrite of [Riot-Android](https://github.com/vector-im/riot-android) with a new user experience. RiotX will become the official replacement as soon as all features are implemented.
It is a total rewrite of [Riot-Android](https://github.com/vector-im/riot-android) with a new user experience.
[<img src="https://play.google.com/intl/en_us/badges/images/generic/en_badge_web_generic.png" alt="Get it on Google Play" height="60">](https://play.google.com/store/apps/details?id=im.vector.riotx)
[<img src="resources/img/google-play-badge.png" alt="Get it on Google Play" height="60">](https://play.google.com/store/apps/details?id=im.vector.app)
[<img src="resources/img/f-droid-badge.png" alt="Get it on F-Droid" height="60">](https://f-droid.org/app/im.vector.app)
Nightly build: [![Buildkite](https://badge.buildkite.com/657d3db27364448d69d54f66c690f7788bc6aa80a7628e37f3.svg?branch=develop)](https://buildkite.com/matrix-dot-org/riotx-android/builds?branch=develop)
# New Android SDK
RiotX is based on a new Android SDK fully written in Kotlin (like RiotX). In order to make the early development as fast as possible, RiotX and the new SDK currently share the same git repository. We will make separate repos once the API is stable enough.
Element is based on a new Android SDK fully written in Kotlin (like Element). In order to make the early development as fast as possible, Element and the new SDK currently share the same git repository. We will make separate repos once the SDK is stable enough.
# Roadmap
The current target is to release an application out of beta with the same level of features (and even more) as Riot.
The roadmap has 3 phases:
- [phase 0](https://github.com/vector-im/riotX-android/labels/phase0): Prototyping / Project setup
- [phase 1](https://github.com/vector-im/riotX-android/labels/phase1): Beta release to the Play Store
- [phase 2](https://github.com/vector-im/riotX-android/labels/phase2): Out of beta
The version 1.0.0 of Element still misses some features which was previously included in Riot-Android.
The team will work to add them on a regular basis.
## Contributing
Please refer to [CONTRIBUTING.md](https://github.com/vector-im/riotX-android/blob/develop/CONTRIBUTING.md) if you want to contribute on Matrix Android projects!
Come chat with the community in the dedicated Matrix [room](https://matrix.to/#/#riotx:matrix.org).
Come chat with the community in the dedicated Matrix [room](https://matrix.to/#/#element-android:matrix.org).

1
attachment-viewer/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

View File

@@ -0,0 +1,78 @@
/*
* Copyright (c) 2020 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.
*/
apply plugin: 'com.android.library'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
buildscript {
repositories {
maven {
url 'https://jitpack.io'
content {
// PhotoView
includeGroupByRegex 'com\\.github\\.chrisbanes'
}
}
jcenter()
}
}
android {
compileSdkVersion 29
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
dependencies {
implementation 'com.github.chrisbanes:PhotoView:2.0.0'
implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0'
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

View File

21
attachment-viewer/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="im.vector.riotx.attachmentviewer" />

View File

@@ -0,0 +1,30 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.view.View
import android.widget.ImageView
import android.widget.ProgressBar
class AnimatedImageViewHolder constructor(itemView: View) :
BaseViewHolder(itemView) {
val touchImageView: ImageView = itemView.findViewById(R.id.imageView)
val imageLoaderProgress: ProgressBar = itemView.findViewById(R.id.imageLoaderProgress)
internal val target = DefaultImageLoaderTarget(this, this.touchImageView)
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
sealed class AttachmentEvents {
data class VideoEvent(val isPlaying: Boolean, val progress: Int, val duration: Int) : AttachmentEvents()
}
interface AttachmentEventListener {
fun onEvent(event: AttachmentEvents)
}
sealed class AttachmentCommands {
object PauseVideo : AttachmentCommands()
object StartVideo : AttachmentCommands()
data class SeekTo(val percentProgress: Int) : AttachmentCommands()
}

View File

@@ -0,0 +1,45 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.content.Context
import android.view.View
sealed class AttachmentInfo(open val uid: String) {
data class Image(override val uid: String, val url: String, val data: Any?) : AttachmentInfo(uid)
data class AnimatedImage(override val uid: String, val url: String, val data: Any?) : AttachmentInfo(uid)
data class Video(override val uid: String, val url: String, val data: Any, val thumbnail: Image?) : AttachmentInfo(uid)
// data class Audio(override val uid: String, val url: String, val data: Any) : AttachmentInfo(uid)
// data class File(override val uid: String, val url: String, val data: Any) : AttachmentInfo(uid)
}
interface AttachmentSourceProvider {
fun getItemCount(): Int
fun getAttachmentInfoAt(position: Int): AttachmentInfo
fun loadImage(target: ImageLoaderTarget, info: AttachmentInfo.Image)
fun loadImage(target: ImageLoaderTarget, info: AttachmentInfo.AnimatedImage)
fun loadVideo(target: VideoLoaderTarget, info: AttachmentInfo.Video)
fun overlayViewAtPosition(context: Context, position: Int): View?
fun clear(id: String)
}

View File

@@ -0,0 +1,335 @@
/*
* Copyright (c) 2020 New Vector Ltd
* Copyright (C) 2018 stfalcon.com
*
* 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.riotx.attachmentviewer
import android.graphics.Color
import android.os.Bundle
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.ScaleGestureDetector
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GestureDetectorCompat
import androidx.core.view.ViewCompat
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.transition.TransitionManager
import androidx.viewpager2.widget.ViewPager2
import kotlinx.android.synthetic.main.activity_attachment_viewer.*
import java.lang.ref.WeakReference
import kotlin.math.abs
abstract class AttachmentViewerActivity : AppCompatActivity(), AttachmentEventListener {
lateinit var pager2: ViewPager2
lateinit var imageTransitionView: ImageView
lateinit var transitionImageContainer: ViewGroup
var topInset = 0
var bottomInset = 0
var systemUiVisibility = true
private var overlayView: View? = null
set(value) {
if (value == overlayView) return
overlayView?.let { rootContainer.removeView(it) }
rootContainer.addView(value)
value?.updatePadding(top = topInset, bottom = bottomInset)
field = value
}
private lateinit var swipeDismissHandler: SwipeToDismissHandler
private lateinit var directionDetector: SwipeDirectionDetector
private lateinit var scaleDetector: ScaleGestureDetector
private lateinit var gestureDetector: GestureDetectorCompat
var currentPosition = 0
private var swipeDirection: SwipeDirection? = null
private fun isScaled() = attachmentsAdapter.isScaled(currentPosition)
private var wasScaled: Boolean = false
private var isSwipeToDismissAllowed: Boolean = true
private lateinit var attachmentsAdapter: AttachmentsAdapter
private var isOverlayWasClicked = false
// private val shouldDismissToBottom: Boolean
// get() = e == null
// || !externalTransitionImageView.isRectVisible
// || !isAtStartPosition
private var isImagePagerIdle = true
fun setSourceProvider(sourceProvider: AttachmentSourceProvider) {
attachmentsAdapter.attachmentSourceProvider = sourceProvider
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// This is important for the dispatchTouchEvent, if not we must correct
// the touch coordinates
window.decorView.systemUiVisibility = (
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE)
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION)
setContentView(R.layout.activity_attachment_viewer)
attachmentPager.orientation = ViewPager2.ORIENTATION_HORIZONTAL
attachmentsAdapter = AttachmentsAdapter()
attachmentPager.adapter = attachmentsAdapter
imageTransitionView = transitionImageView
transitionImageContainer = findViewById(R.id.transitionImageContainer)
pager2 = attachmentPager
directionDetector = createSwipeDirectionDetector()
gestureDetector = createGestureDetector()
attachmentPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageScrollStateChanged(state: Int) {
isImagePagerIdle = state == ViewPager2.SCROLL_STATE_IDLE
}
override fun onPageSelected(position: Int) {
onSelectedPositionChanged(position)
}
})
swipeDismissHandler = createSwipeToDismissHandler()
rootContainer.setOnTouchListener(swipeDismissHandler)
rootContainer.viewTreeObserver.addOnGlobalLayoutListener { swipeDismissHandler.translationLimit = dismissContainer.height / 4 }
scaleDetector = createScaleGestureDetector()
ViewCompat.setOnApplyWindowInsetsListener(rootContainer) { _, insets ->
overlayView?.updatePadding(top = insets.systemWindowInsetTop, bottom = insets.systemWindowInsetBottom)
topInset = insets.systemWindowInsetTop
bottomInset = insets.systemWindowInsetBottom
insets
}
}
fun onSelectedPositionChanged(position: Int) {
attachmentsAdapter.recyclerView?.findViewHolderForAdapterPosition(currentPosition)?.let {
(it as? BaseViewHolder)?.onSelected(false)
}
attachmentsAdapter.recyclerView?.findViewHolderForAdapterPosition(position)?.let {
(it as? BaseViewHolder)?.onSelected(true)
if (it is VideoViewHolder) {
it.eventListener = WeakReference(this)
}
}
currentPosition = position
overlayView = attachmentsAdapter.attachmentSourceProvider?.overlayViewAtPosition(this@AttachmentViewerActivity, position)
}
override fun onPause() {
attachmentsAdapter.onPause(currentPosition)
super.onPause()
}
override fun onResume() {
super.onResume()
attachmentsAdapter.onResume(currentPosition)
}
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
// The zoomable view is configured to disallow interception when image is zoomed
// Check if the overlay is visible, and wants to handle the click
if (overlayView?.isVisible == true && overlayView?.dispatchTouchEvent(ev) == true) {
return true
}
// Log.v("ATTACHEMENTS", "================\ndispatchTouchEvent $ev")
handleUpDownEvent(ev)
// Log.v("ATTACHEMENTS", "scaleDetector is in progress ${scaleDetector.isInProgress}")
// Log.v("ATTACHEMENTS", "pointerCount ${ev.pointerCount}")
// Log.v("ATTACHEMENTS", "wasScaled $wasScaled")
if (swipeDirection == null && (scaleDetector.isInProgress || ev.pointerCount > 1 || wasScaled)) {
wasScaled = true
// Log.v("ATTACHEMENTS", "dispatch to pager")
return attachmentPager.dispatchTouchEvent(ev)
}
// Log.v("ATTACHEMENTS", "is current item scaled ${isScaled()}")
return (if (isScaled()) super.dispatchTouchEvent(ev) else handleTouchIfNotScaled(ev)).also {
// Log.v("ATTACHEMENTS", "\n================")
}
}
private fun handleUpDownEvent(event: MotionEvent) {
// Log.v("ATTACHEMENTS", "handleUpDownEvent $event")
if (event.action == MotionEvent.ACTION_UP) {
handleEventActionUp(event)
}
if (event.action == MotionEvent.ACTION_DOWN) {
handleEventActionDown(event)
}
scaleDetector.onTouchEvent(event)
gestureDetector.onTouchEvent(event)
}
private fun handleEventActionDown(event: MotionEvent) {
swipeDirection = null
wasScaled = false
attachmentPager.dispatchTouchEvent(event)
swipeDismissHandler.onTouch(rootContainer, event)
isOverlayWasClicked = dispatchOverlayTouch(event)
}
private fun handleEventActionUp(event: MotionEvent) {
// wasDoubleTapped = false
swipeDismissHandler.onTouch(rootContainer, event)
attachmentPager.dispatchTouchEvent(event)
isOverlayWasClicked = dispatchOverlayTouch(event)
}
private fun handleSingleTap(event: MotionEvent, isOverlayWasClicked: Boolean) {
// TODO if there is no overlay, we should at least toggle system bars?
if (overlayView != null && !isOverlayWasClicked) {
toggleOverlayViewVisibility()
super.dispatchTouchEvent(event)
}
}
private fun toggleOverlayViewVisibility() {
if (systemUiVisibility) {
// we hide
TransitionManager.beginDelayedTransition(rootContainer)
hideSystemUI()
overlayView?.isVisible = false
} else {
// we show
TransitionManager.beginDelayedTransition(rootContainer)
showSystemUI()
overlayView?.isVisible = true
}
}
private fun handleTouchIfNotScaled(event: MotionEvent): Boolean {
// Log.v("ATTACHEMENTS", "handleTouchIfNotScaled $event")
directionDetector.handleTouchEvent(event)
return when (swipeDirection) {
SwipeDirection.Up, SwipeDirection.Down -> {
if (isSwipeToDismissAllowed && !wasScaled && isImagePagerIdle) {
swipeDismissHandler.onTouch(rootContainer, event)
} else true
}
SwipeDirection.Left, SwipeDirection.Right -> {
attachmentPager.dispatchTouchEvent(event)
}
else -> true
}
}
private fun handleSwipeViewMove(translationY: Float, translationLimit: Int) {
val alpha = calculateTranslationAlpha(translationY, translationLimit)
backgroundView.alpha = alpha
dismissContainer.alpha = alpha
overlayView?.alpha = alpha
}
private fun dispatchOverlayTouch(event: MotionEvent): Boolean =
overlayView
?.let { it.isVisible && it.dispatchTouchEvent(event) }
?: false
private fun calculateTranslationAlpha(translationY: Float, translationLimit: Int): Float =
1.0f - 1.0f / translationLimit.toFloat() / 4f * abs(translationY)
private fun createSwipeToDismissHandler()
: SwipeToDismissHandler = SwipeToDismissHandler(
swipeView = dismissContainer,
shouldAnimateDismiss = { shouldAnimateDismiss() },
onDismiss = { animateClose() },
onSwipeViewMove = ::handleSwipeViewMove)
private fun createSwipeDirectionDetector() =
SwipeDirectionDetector(this) { swipeDirection = it }
private fun createScaleGestureDetector() =
ScaleGestureDetector(this, ScaleGestureDetector.SimpleOnScaleGestureListener())
private fun createGestureDetector() =
GestureDetectorCompat(this, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
if (isImagePagerIdle) {
handleSingleTap(e, isOverlayWasClicked)
}
return false
}
override fun onDoubleTap(e: MotionEvent?): Boolean {
return super.onDoubleTap(e)
}
})
override fun onEvent(event: AttachmentEvents) {
if (overlayView is AttachmentEventListener) {
(overlayView as? AttachmentEventListener)?.onEvent(event)
}
}
protected open fun shouldAnimateDismiss(): Boolean = true
protected open fun animateClose() {
window.statusBarColor = Color.TRANSPARENT
finish()
}
fun handle(commands: AttachmentCommands) {
(attachmentsAdapter.recyclerView?.findViewHolderForAdapterPosition(currentPosition) as? BaseViewHolder)
?.handleCommand(commands)
}
private fun hideSystemUI() {
systemUiVisibility = false
// Enables regular immersive mode.
// For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE.
// Or for "sticky immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE_STICKY
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
// Set the content to appear under the system bars so that the
// content doesn't resize when the system bars hide and show.
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
// Hide the nav bar and status bar
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN)
}
// Shows the system bars by removing all the flags
// except for the ones that make the content appear under the system bars.
private fun showSystemUI() {
systemUiVisibility = true
window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)
}
}

View File

@@ -0,0 +1,115 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
class AttachmentsAdapter : RecyclerView.Adapter<BaseViewHolder>() {
var attachmentSourceProvider: AttachmentSourceProvider? = null
set(value) {
field = value
notifyDataSetChanged()
}
var recyclerView: RecyclerView? = null
override fun onAttachedToRecyclerView(recyclerView: RecyclerView) {
this.recyclerView = recyclerView
}
override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) {
this.recyclerView = null
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val inflater = LayoutInflater.from(parent.context)
val itemView = inflater.inflate(viewType, parent, false)
return when (viewType) {
R.layout.item_image_attachment -> ZoomableImageViewHolder(itemView)
R.layout.item_animated_image_attachment -> AnimatedImageViewHolder(itemView)
R.layout.item_video_attachment -> VideoViewHolder(itemView)
else -> UnsupportedViewHolder(itemView)
}
}
override fun getItemViewType(position: Int): Int {
val info = attachmentSourceProvider!!.getAttachmentInfoAt(position)
return when (info) {
is AttachmentInfo.Image -> R.layout.item_image_attachment
is AttachmentInfo.Video -> R.layout.item_video_attachment
is AttachmentInfo.AnimatedImage -> R.layout.item_animated_image_attachment
// is AttachmentInfo.Audio -> TODO()
// is AttachmentInfo.File -> TODO()
}
}
override fun getItemCount(): Int {
return attachmentSourceProvider?.getItemCount() ?: 0
}
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
attachmentSourceProvider?.getAttachmentInfoAt(position)?.let {
holder.bind(it)
when (it) {
is AttachmentInfo.Image -> {
attachmentSourceProvider?.loadImage((holder as ZoomableImageViewHolder).target, it)
}
is AttachmentInfo.AnimatedImage -> {
attachmentSourceProvider?.loadImage((holder as AnimatedImageViewHolder).target, it)
}
is AttachmentInfo.Video -> {
attachmentSourceProvider?.loadVideo((holder as VideoViewHolder).target, it)
}
// else -> {
// // }
}
}
}
override fun onViewAttachedToWindow(holder: BaseViewHolder) {
holder.onAttached()
}
override fun onViewRecycled(holder: BaseViewHolder) {
holder.onRecycled()
}
override fun onViewDetachedFromWindow(holder: BaseViewHolder) {
holder.onDetached()
}
fun isScaled(position: Int): Boolean {
val holder = recyclerView?.findViewHolderForAdapterPosition(position)
if (holder is ZoomableImageViewHolder) {
return holder.touchImageView.attacher.scale > 1f
}
return false
}
fun onPause(position: Int) {
val holder = recyclerView?.findViewHolderForAdapterPosition(position) as? BaseViewHolder
holder?.entersBackground()
}
fun onResume(position: Int) {
val holder = recyclerView?.findViewHolderForAdapterPosition(position) as? BaseViewHolder
holder?.entersForeground()
}
}

View File

@@ -0,0 +1,45 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.view.View
import androidx.recyclerview.widget.RecyclerView
abstract class BaseViewHolder constructor(itemView: View) :
RecyclerView.ViewHolder(itemView) {
open fun onRecycled() {
boundResourceUid = null
}
open fun onAttached() {}
open fun onDetached() {}
open fun entersBackground() {}
open fun entersForeground() {}
open fun onSelected(selected: Boolean) {}
open fun handleCommand(commands: AttachmentCommands) {}
var boundResourceUid: String? = null
open fun bind(attachmentInfo: AttachmentInfo) {
boundResourceUid = attachmentInfo.uid
}
}
class UnsupportedViewHolder constructor(itemView: View) :
BaseViewHolder(itemView)

View File

@@ -0,0 +1,103 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.graphics.drawable.Animatable
import android.graphics.drawable.Drawable
import android.widget.ImageView
import android.widget.LinearLayout
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
interface ImageLoaderTarget {
fun contextView(): ImageView
fun onResourceLoading(uid: String, placeholder: Drawable?)
fun onLoadFailed(uid: String, errorDrawable: Drawable?)
fun onResourceCleared(uid: String, placeholder: Drawable?)
fun onResourceReady(uid: String, resource: Drawable)
}
internal class DefaultImageLoaderTarget(val holder: AnimatedImageViewHolder, private val contextView: ImageView)
: ImageLoaderTarget {
override fun contextView(): ImageView {
return contextView
}
override fun onResourceLoading(uid: String, placeholder: Drawable?) {
if (holder.boundResourceUid != uid) return
holder.imageLoaderProgress.isVisible = true
}
override fun onLoadFailed(uid: String, errorDrawable: Drawable?) {
if (holder.boundResourceUid != uid) return
holder.imageLoaderProgress.isVisible = false
}
override fun onResourceCleared(uid: String, placeholder: Drawable?) {
if (holder.boundResourceUid != uid) return
holder.touchImageView.setImageDrawable(placeholder)
}
override fun onResourceReady(uid: String, resource: Drawable) {
if (holder.boundResourceUid != uid) return
holder.imageLoaderProgress.isVisible = false
// Glide mess up the view size :/
holder.touchImageView.updateLayoutParams {
width = LinearLayout.LayoutParams.MATCH_PARENT
height = LinearLayout.LayoutParams.MATCH_PARENT
}
holder.touchImageView.setImageDrawable(resource)
if (resource is Animatable) {
resource.start()
}
}
internal class ZoomableImageTarget(val holder: ZoomableImageViewHolder, private val contextView: ImageView) : ImageLoaderTarget {
override fun contextView() = contextView
override fun onResourceLoading(uid: String, placeholder: Drawable?) {
if (holder.boundResourceUid != uid) return
holder.imageLoaderProgress.isVisible = true
}
override fun onLoadFailed(uid: String, errorDrawable: Drawable?) {
if (holder.boundResourceUid != uid) return
holder.imageLoaderProgress.isVisible = false
}
override fun onResourceCleared(uid: String, placeholder: Drawable?) {
if (holder.boundResourceUid != uid) return
holder.touchImageView.setImageDrawable(placeholder)
}
override fun onResourceReady(uid: String, resource: Drawable) {
if (holder.boundResourceUid != uid) return
holder.imageLoaderProgress.isVisible = false
// Glide mess up the view size :/
holder.touchImageView.updateLayoutParams {
width = LinearLayout.LayoutParams.MATCH_PARENT
height = LinearLayout.LayoutParams.MATCH_PARENT
}
holder.touchImageView.setImageDrawable(resource)
}
}
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright (c) 2020 New Vector Ltd
* Copyright (C) 2018 stfalcon.com
*
* 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.riotx.attachmentviewer
sealed class SwipeDirection {
object NotDetected : SwipeDirection()
object Up : SwipeDirection()
object Down : SwipeDirection()
object Left : SwipeDirection()
object Right : SwipeDirection()
companion object {
fun fromAngle(angle: Double): SwipeDirection {
return when (angle) {
in 0.0..45.0 -> Right
in 45.0..135.0 -> Up
in 135.0..225.0 -> Left
in 225.0..315.0 -> Down
in 315.0..360.0 -> Right
else -> NotDetected
}
}
}
}

View File

@@ -0,0 +1,91 @@
/*
* Copyright (c) 2020 New Vector Ltd
* Copyright (C) 2018 stfalcon.com
*
* 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.riotx.attachmentviewer
import android.content.Context
import android.view.MotionEvent
import kotlin.math.sqrt
class SwipeDirectionDetector(
context: Context,
private val onDirectionDetected: (SwipeDirection) -> Unit
) {
private val touchSlop: Int = android.view.ViewConfiguration.get(context).scaledTouchSlop
private var startX: Float = 0f
private var startY: Float = 0f
private var isDetected: Boolean = false
fun handleTouchEvent(event: MotionEvent) {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
startX = event.x
startY = event.y
}
MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_UP -> {
if (!isDetected) {
onDirectionDetected(SwipeDirection.NotDetected)
}
startY = 0.0f
startX = startY
isDetected = false
}
MotionEvent.ACTION_MOVE -> if (!isDetected && getEventDistance(event) > touchSlop) {
isDetected = true
onDirectionDetected(getDirection(startX, startY, event.x, event.y))
}
}
}
/**
* Given two points in the plane p1=(x1, x2) and p2=(y1, y1), this method
* returns the direction that an arrow pointing from p1 to p2 would have.
*
* @param x1 the x position of the first point
* @param y1 the y position of the first point
* @param x2 the x position of the second point
* @param y2 the y position of the second point
* @return the direction
*/
private fun getDirection(x1: Float, y1: Float, x2: Float, y2: Float): SwipeDirection {
val angle = getAngle(x1, y1, x2, y2)
return SwipeDirection.fromAngle(angle)
}
/**
* Finds the angle between two points in the plane (x1,y1) and (x2, y2)
* The angle is measured with 0/360 being the X-axis to the right, angles
* increase counter clockwise.
*
* @param x1 the x position of the first point
* @param y1 the y position of the first point
* @param x2 the x position of the second point
* @param y2 the y position of the second point
* @return the angle between two points
*/
private fun getAngle(x1: Float, y1: Float, x2: Float, y2: Float): Double {
val rad = Math.atan2((y1 - y2).toDouble(), (x2 - x1).toDouble()) + Math.PI
return (rad * 180 / Math.PI + 180) % 360
}
private fun getEventDistance(ev: MotionEvent): Float {
val dx = ev.getX(0) - startX
val dy = ev.getY(0) - startY
return sqrt((dx * dx + dy * dy).toDouble()).toFloat()
}
}

View File

@@ -0,0 +1,126 @@
/*
* Copyright (c) 2020 New Vector Ltd
* Copyright (C) 2018 stfalcon.com
*
* 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.riotx.attachmentviewer
import android.animation.Animator
import android.animation.AnimatorListenerAdapter
import android.annotation.SuppressLint
import android.graphics.Rect
import android.view.MotionEvent
import android.view.View
import android.view.ViewPropertyAnimator
import android.view.animation.AccelerateInterpolator
class SwipeToDismissHandler(
private val swipeView: View,
private val onDismiss: () -> Unit,
private val onSwipeViewMove: (translationY: Float, translationLimit: Int) -> Unit,
private val shouldAnimateDismiss: () -> Boolean
) : View.OnTouchListener {
companion object {
private const val ANIMATION_DURATION = 200L
}
var translationLimit: Int = swipeView.height / 4
private var isTracking = false
private var startY: Float = 0f
@SuppressLint("ClickableViewAccessibility")
override fun onTouch(v: View, event: MotionEvent): Boolean {
when (event.action) {
MotionEvent.ACTION_DOWN -> {
if (swipeView.hitRect.contains(event.x.toInt(), event.y.toInt())) {
isTracking = true
}
startY = event.y
return true
}
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
if (isTracking) {
isTracking = false
onTrackingEnd(v.height)
}
return true
}
MotionEvent.ACTION_MOVE -> {
if (isTracking) {
val translationY = event.y - startY
swipeView.translationY = translationY
onSwipeViewMove(translationY, translationLimit)
}
return true
}
else -> {
return false
}
}
}
internal fun initiateDismissToBottom() {
animateTranslation(swipeView.height.toFloat())
}
private fun onTrackingEnd(parentHeight: Int) {
val animateTo = when {
swipeView.translationY < -translationLimit -> -parentHeight.toFloat()
swipeView.translationY > translationLimit -> parentHeight.toFloat()
else -> 0f
}
if (animateTo != 0f && !shouldAnimateDismiss()) {
onDismiss()
} else {
animateTranslation(animateTo)
}
}
private fun animateTranslation(translationTo: Float) {
swipeView.animate()
.translationY(translationTo)
.setDuration(ANIMATION_DURATION)
.setInterpolator(AccelerateInterpolator())
.setUpdateListener { onSwipeViewMove(swipeView.translationY, translationLimit) }
.setAnimatorListener(onAnimationEnd = {
if (translationTo != 0f) {
onDismiss()
}
// remove the update listener, otherwise it will be saved on the next animation execution:
swipeView.animate().setUpdateListener(null)
})
.start()
}
}
internal fun ViewPropertyAnimator.setAnimatorListener(
onAnimationEnd: ((Animator?) -> Unit)? = null,
onAnimationStart: ((Animator?) -> Unit)? = null
) = this.setListener(
object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
onAnimationEnd?.invoke(animation)
}
override fun onAnimationStart(animation: Animator?) {
onAnimationStart?.invoke(animation)
}
})
internal val View?.hitRect: Rect
get() = Rect().also { this?.getHitRect(it) }

View File

@@ -0,0 +1,76 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.graphics.drawable.Drawable
import android.widget.ImageView
import androidx.core.view.isVisible
import java.io.File
interface VideoLoaderTarget {
fun contextView(): ImageView
fun onThumbnailResourceLoading(uid: String, placeholder: Drawable?)
fun onThumbnailLoadFailed(uid: String, errorDrawable: Drawable?)
fun onThumbnailResourceCleared(uid: String, placeholder: Drawable?)
fun onThumbnailResourceReady(uid: String, resource: Drawable)
fun onVideoFileLoading(uid: String)
fun onVideoFileLoadFailed(uid: String)
fun onVideoFileReady(uid: String, file: File)
}
internal class DefaultVideoLoaderTarget(val holder: VideoViewHolder, private val contextView: ImageView) : VideoLoaderTarget {
override fun contextView(): ImageView = contextView
override fun onThumbnailResourceLoading(uid: String, placeholder: Drawable?) {
}
override fun onThumbnailLoadFailed(uid: String, errorDrawable: Drawable?) {
}
override fun onThumbnailResourceCleared(uid: String, placeholder: Drawable?) {
}
override fun onThumbnailResourceReady(uid: String, resource: Drawable) {
if (holder.boundResourceUid != uid) return
holder.thumbnailImage.setImageDrawable(resource)
}
override fun onVideoFileLoading(uid: String) {
if (holder.boundResourceUid != uid) return
holder.thumbnailImage.isVisible = true
holder.loaderProgressBar.isVisible = true
holder.videoView.isVisible = false
}
override fun onVideoFileLoadFailed(uid: String) {
if (holder.boundResourceUid != uid) return
holder.videoFileLoadError()
}
override fun onVideoFileReady(uid: String, file: File) {
if (holder.boundResourceUid != uid) return
holder.thumbnailImage.isVisible = false
holder.loaderProgressBar.isVisible = false
holder.videoView.isVisible = true
holder.videoReady(file)
}
}

View File

@@ -0,0 +1,157 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.view.View
import android.widget.ImageView
import android.widget.ProgressBar
import android.widget.TextView
import android.widget.VideoView
import androidx.core.view.isVisible
import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import java.io.File
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit
// TODO, it would be probably better to use a unique media player
// for better customization and control
// But for now VideoView is enough, it released player when detached, we use a timer to update progress
class VideoViewHolder constructor(itemView: View) :
BaseViewHolder(itemView) {
private var isSelected = false
private var mVideoPath: String? = null
private var progressDisposable: Disposable? = null
private var progress: Int = 0
private var wasPaused = false
var eventListener: WeakReference<AttachmentEventListener>? = null
val thumbnailImage: ImageView = itemView.findViewById(R.id.videoThumbnailImage)
val videoView: VideoView = itemView.findViewById(R.id.videoView)
val loaderProgressBar: ProgressBar = itemView.findViewById(R.id.videoLoaderProgress)
val videoControlIcon: ImageView = itemView.findViewById(R.id.videoControlIcon)
val errorTextView: TextView = itemView.findViewById(R.id.videoMediaViewerErrorView)
internal val target = DefaultVideoLoaderTarget(this, thumbnailImage)
override fun onRecycled() {
super.onRecycled()
progressDisposable?.dispose()
progressDisposable = null
mVideoPath = null
}
fun videoReady(file: File) {
mVideoPath = file.path
if (isSelected) {
startPlaying()
}
}
fun videoFileLoadError() {
}
override fun entersBackground() {
if (videoView.isPlaying) {
progress = videoView.currentPosition
progressDisposable?.dispose()
progressDisposable = null
videoView.stopPlayback()
videoView.pause()
}
}
override fun entersForeground() {
onSelected(isSelected)
}
override fun onSelected(selected: Boolean) {
if (!selected) {
if (videoView.isPlaying) {
progress = videoView.currentPosition
videoView.stopPlayback()
} else {
progress = 0
}
progressDisposable?.dispose()
progressDisposable = null
} else {
if (mVideoPath != null) {
startPlaying()
}
}
isSelected = true
}
private fun startPlaying() {
thumbnailImage.isVisible = false
loaderProgressBar.isVisible = false
videoView.isVisible = true
videoView.setOnPreparedListener {
progressDisposable?.dispose()
progressDisposable = Observable.interval(100, TimeUnit.MILLISECONDS)
.timeInterval()
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
val duration = videoView.duration
val progress = videoView.currentPosition
val isPlaying = videoView.isPlaying
// Log.v("FOO", "isPlaying $isPlaying $progress/$duration")
eventListener?.get()?.onEvent(AttachmentEvents.VideoEvent(isPlaying, progress, duration))
}
}
videoView.setVideoPath(mVideoPath)
if (!wasPaused) {
videoView.start()
if (progress > 0) {
videoView.seekTo(progress)
}
}
}
override fun handleCommand(commands: AttachmentCommands) {
if (!isSelected) return
when (commands) {
AttachmentCommands.StartVideo -> {
wasPaused = false
videoView.start()
}
AttachmentCommands.PauseVideo -> {
wasPaused = true
videoView.pause()
}
is AttachmentCommands.SeekTo -> {
val duration = videoView.duration
if (duration > 0) {
val seekDuration = duration * (commands.percentProgress / 100f)
videoView.seekTo(seekDuration.toInt())
}
}
}
}
override fun bind(attachmentInfo: AttachmentInfo) {
super.bind(attachmentInfo)
progress = 0
wasPaused = false
}
}

View File

@@ -0,0 +1,42 @@
/*
* Copyright (c) 2020 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.riotx.attachmentviewer
import android.view.View
import android.widget.ProgressBar
import com.github.chrisbanes.photoview.PhotoView
class ZoomableImageViewHolder constructor(itemView: View) :
BaseViewHolder(itemView) {
val touchImageView: PhotoView = itemView.findViewById(R.id.touchImageView)
val imageLoaderProgress: ProgressBar = itemView.findViewById(R.id.imageLoaderProgress)
init {
touchImageView.setAllowParentInterceptOnEdge(false)
touchImageView.setOnScaleChangeListener { scaleFactor, _, _ ->
// Log.v("ATTACHEMENTS", "scaleFactor $scaleFactor")
// It's a bit annoying but when you pitch down the scaling
// is not exactly one :/
touchImageView.setAllowParentInterceptOnEdge(scaleFactor <= 1.0008f)
}
touchImageView.setScale(1.0f, true)
touchImageView.setAllowParentInterceptOnEdge(true)
}
internal val target = DefaultImageLoaderTarget.ZoomableImageTarget(this, touchImageView)
}

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rootContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AttachmentViewerActivity">
<View
android:id="@+id/backgroundView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:alpha="1"
android:background="@android:color/black" />
<FrameLayout
android:id="@+id/dismissContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/transitionImageContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="UselessParent"
tools:visibility="invisible">
<ImageView
android:id="@+id/transitionImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:ignore="ContentDescription" />
</FrameLayout>
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/attachmentPager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="horizontal"
android:visibility="visible" />
</FrameLayout>
</FrameLayout>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<ImageView
android:id="@+id/imageView"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ProgressBar
android:layout_centerInParent="true"
android:id="@+id/imageLoaderProgress"
style="?android:attr/progressBarStyle"
android:layout_width="40dp"
android:layout_height="40dp"
android:visibility="visible"
tools:visibility="gone" />
</RelativeLayout>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<com.github.chrisbanes.photoview.PhotoView
android:id="@+id/touchImageView"
android:visibility="visible"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<ProgressBar
android:layout_centerInParent="true"
android:id="@+id/imageLoaderProgress"
style="?android:attr/progressBarStyle"
android:layout_width="40dp"
android:layout_height="40dp"
android:visibility="visible"
tools:visibility="gone" />
</RelativeLayout>

View File

@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<ImageView
android:id="@+id/videoThumbnailImage"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:scaleType="centerInside" />
<VideoView
android:id="@+id/videoView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />
<ImageView
android:id="@+id/videoControlIcon"
android:layout_centerInParent="true"
android:visibility="gone"
tools:visibility="visible"
android:layout_width="44dp"
android:layout_height="44dp"
/>
<ProgressBar
android:layout_centerInParent="true"
android:id="@+id/videoLoaderProgress"
style="?android:attr/progressBarStyle"
android:layout_width="40dp"
android:layout_height="40dp"
android:visibility="invisible"
tools:visibility="visible" />
<TextView
android:id="@+id/videoMediaViewerErrorView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:layout_margin="16dp"
android:textSize="16sp"
android:visibility="gone"
tools:text="Error"
tools:visibility="visible" />
</RelativeLayout>

View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/design_default_color_primary">
<TextView
android:id="@+id/testPage"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1"
android:textSize="80sp"
android:textStyle="bold" />
</RelativeLayout>

View File

@@ -1,7 +1,7 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext.kotlin_version = '1.3.50'
ext.kotlin_version = '1.3.72'
repositories {
google()
jcenter()
@@ -10,12 +10,13 @@ buildscript {
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.1'
// Warning: 3.6.3 leads to infinite gradle builds. Stick to 3.5.3 for the moment
classpath 'com.android.tools.build:gradle:3.5.3'
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.7.1'
classpath 'com.google.android.gms:oss-licenses-plugin:0.9.5'
classpath 'com.google.android.gms:oss-licenses-plugin:0.10.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
@@ -34,6 +35,12 @@ allprojects {
includeGroupByRegex "com\\.github\\.jaiselrahman"
// And monarchy
includeGroupByRegex "com\\.github\\.Zhuinden"
// And ucrop
includeGroupByRegex "com\\.github\\.yalantis"
// JsonViewer
includeGroupByRegex 'com\\.github\\.BillCarsonFr'
// PhotoView
includeGroupByRegex 'com\\.github\\.chrisbanes'
}
}
maven {
@@ -45,18 +52,6 @@ allprojects {
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
google()
jcenter()
maven {
url 'https://repo.adobe.com/nexus/content/repositories/public/'
content {
includeGroupByRegex "diff_match_patch"
}
}
}
tasks.withType(JavaCompile).all {
options.compilerArgs += [
'-Adagger.gradle.incremental=enabled'
]
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
@@ -64,12 +59,6 @@ allprojects {
kotlinOptions.allWarningsAsErrors = true
}
afterEvaluate {
extensions.findByName("kapt")?.arguments {
arg("dagger.gradle.incremental", "enabled")
}
}
}
task clean(type: Delete) {

1
diff-match-patch/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

View File

@@ -0,0 +1,8 @@
apply plugin: 'java-library'
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
sourceCompatibility = "8"
targetCompatibility = "8"

File diff suppressed because it is too large Load Diff

92
docs/identity_server.md Normal file
View File

@@ -0,0 +1,92 @@
# Identity server
Issue: #607
PR: #1354
## Introduction
Identity Servers support contact discovery on Matrix by letting people look up Third Party Identifiers to see if the owner has publicly linked them with their Matrix ID.
## Implementation
The current implementation was Inspired by the code from Riot-Android.
Difference though (list not exhaustive):
- Only API v2 is supported (see https://matrix.org/docs/spec/identity_service/latest)
- Homeserver has to be up to date to support binding (Versions.isLoginAndRegistrationSupportedBySdk() has to return true)
- The SDK managed the session and client secret when binding ThreePid. Those data are not exposed to the client.
- The SDK supports incremental sendAttempt (this is not used by Element)
- The "Continue" button is now under the information, and not as the same place that the checkbox
- The app can cancel a binding. Current data are erased from DB.
- The API (IdentityService) is improved.
- A new DB to store data related to the identity server management.
Missing features (list not exhaustive):
- Invite by 3Pid (will be in a dedicated PR)
- Add email or phone to account (not P1, can be done on Element-Web)
- List email and phone of the account (could be done in a dedicated PR)
- Search contact (not P1)
- Logout from identity server when user sign out or deactivate his account.
## Related MSCs
The list can be found here: https://matrix.org/blog/2019/09/27/privacy-improvements-in-synapse-1-4-and-riot-1-4
## Steps and requirements
- Only one identity server by account can be set. The user's choice is stored in account data with key `m.identity_server`. But every clients will managed its own token to log in to the identity server
```json
{
"type": "m.identity_server",
"content": {
"base_url": "https://matrix.org"
}
}
```
- The accepted terms are stored in the account data:
```json
{
"type": "m.accepted_terms",
"content": {
"accepted": [
"https://vector.im/identity-server-privacy-notice-1"
]
}
}
```
- Default identity server URL, from Wellknown data is proposed to the user.
- Identity server can be set
- Identity server can be changed on another user's device, so when the change is detected (thanks to account data sync) Element should properly disconnect from a previous identity server (I think it was not the case in Riot-Android, where we keep the token forever)
- Registration to the identity server is managed with an openId token
- Terms of service can be accepted when configuring the identity server.
- Terms of service can be accepted after, if they change.
- Identity server can be modified
- Identity server can be disconnected with a warning dialog, with special content if there are current bound 3pid on this identity server.
- Email can be bound
- Email can be unbound
- Phone can be bound
- Phone can be unbound
- Look up can be performed, to get matrixIds from local contact book (phone and email): Android permission correctly handled (not done yet)
- Look up pepper can be updated if it is rotated on the identity server
- Invitation using 3PID can be done (See #548) (not done yet)
- Homeserver access-token will never be sent to an identity server
- When user sign-out: logout from the identity server if any.
- When user deactivate account: logout from the identity server if any.
## Screens
### Settings
Identity server settings can be accessed from the internal setting of the application, both from "Discovery" section and from identity detail section.
### Discovery screen
This screen displays the identity server configuration and the binding of the user's ThreePid (email and msisdn). This is the main screen of the feature.
### Set identity server screen
This screen is a form to set a new identity server URL
## Ref:
- https://matrix.org/blog/2019/09/27/privacy-improvements-in-synapse-1-4-and-riot-1-4 is a good summary of the role of an Identity server and the proper way to configure and use it in respect to the privacy and the consent of the user.
- API documentation: https://matrix.org/docs/spec/identity_service/latest
- vector.im TOS: https://vector.im/identity-server-privacy-notice

103
docs/integration_tests.md Normal file
View File

@@ -0,0 +1,103 @@
# Integration tests
Integration tests are useful to ensure that the code works well for any use cases.
They can also be used as sample on how to use the Matrix SDK.
In a ideal world, every API of the SDK should be covered by integration tests. For the moment, we have test mainly for the Crypto part, which is the tricky part. But it covers quite a lot of features: accounts creation, login to existing account, send encrypted messages, keys backup, verification, etc.
The Matrix SDK is able to open multiple sessions, for the same user, of for different users. This way we can test communication between several sessions on a single device.
## Pre requirements
Integration tests need a homeserver running on localhost.
The documentation describes what we do to have one, using [Synapse](https://github.com/matrix-org/synapse/), which is the Matrix reference homeserver.
## Install and run Synapse
Steps:
- Install virtualenv
```bash
python3 -m pip install virtualenv
```
- Clone Synapse repository
```bash
git clone -b develop https://github.com/matrix-org/synapse.git
```
or
```bash
git clone -b develop git@github.com:matrix-org/synapse.git
```
You should have the develop branch cloned by default.
- Run synapse, from the Synapse folder you just cloned
```bash
virtualenv -p python3 env
source env/bin/activate
pip install -e .
demo/start.sh --no-rate-limit
```
Alternatively, to install the latest Synapse release package (and not a cloned branch) you can run the following instead of `pip install -e .`:
```bash
pip install matrix-synapse
```
You should now have 3 running federated Synapse instances 🎉, at http://127.0.0.1:8080/, http://127.0.0.1:8081/ and http://127.0.0.1:8082/, which should display a "It Works! Synapse is running" message.
## Run the test
It's recommended to run tests using an Android Emulator and not a real device. First reason for that is that the tests will use http://10.0.2.2:8080 to connect to Synapse, which run locally on your machine.
You can run all the tests in the `androidTest` folders.
It can be done using this command:
```bash
./gradlew vector:connectedAndroidTest matrix-sdk-android:connectedAndroidTest
```
## Stop Synapse
To stop Synapse, you can run the following commands:
```bash
./demo/stop.sh
```
And you can deactivate the virtualenv:
```bash
deactivate
```
## Troubleshoot
You'll need python3 to be able to run synapse
### Android Emulator does cannot reach the homeserver
Try on the Emulator browser to open "http://10.0.2.2:8080". You should see the "Synapse is running" message.
### virtualenv command fails
You can try using
```bash
python3 -m venv env
```
or
```bash
python3 -m virtualenv env
```
instead of
```bash
virtualenv -p python3 env
```

View File

@@ -1,4 +1,4 @@
This document aims to describe how RiotX android displays notifications to the end user. It also clarifies notifications and background settings in the app.
This document aims to describe how Element android displays notifications to the end user. It also clarifies notifications and background settings in the app.
# Table of Contents
1. [Prerequisites Knowledge](#prerequisites-knowledge)
@@ -9,7 +9,7 @@ This document aims to describe how RiotX android displays notifications to the e
* [How does the Home Server knows when to notify a client?](#how-does-the-home-server-knows-when-to-notify-a-client)
* [Push vs privacy, and mitigation](#push-vs-privacy-and-mitigation)
* [Background processing limitations](#background-processing-limitations)
2. [RiotX Notification implementations](#riotx-notification-implementations)
2. [Element Notification implementations](#element-notification-implementations)
* [Requirements](#requirements)
* [Foreground sync mode (Gplay & F-Droid)](#foreground-sync-mode-gplay-f-droid)
* [Push (FCM) received in background](#push-fcm-received-in-background)
@@ -38,10 +38,10 @@ When the client receives the new information, it immediately sends another reque
This effectively emulates a server push feature.
The HTTP long Polling can be fine tuned in the **SDK** using two parameters:
* timout (Sync request timeout)
* timeout (Sync request timeout)
* delay (Delay between each sync)
**timeout** is a server paramter, defined by:
**timeout** is a server parameter, defined by:
```
The maximum time to wait, in milliseconds, before returning this request.`
If no events (or other data) become available before this time elapses, the server will return a response with empty fields.
@@ -50,7 +50,7 @@ By default, this is 0, so the server will return immediately even if the respons
**delay** is a client preference. When the server responds to a sync request, the client waits for `delay`before calling a new sync.
When the RiotX Android app is open (i.e in foreground state), the default timeout is 30 seconds, and delay is 0.
When the Element Android app is open (i.e in foreground state), the default timeout is 30 seconds, and delay is 0.
## How does a mobile app receives push notification
@@ -86,7 +86,7 @@ This need some disambiguation, because it is the source of common confusion:
In order to send a push to a mobile, App developers need to have a server that will use the FCM APIs, and these APIs requires authentication!
This server is called a **Push Gateway** in the matrix world
That means that RiotX Android, a matrix client created by New Vector, is using a **Push Gateway** with the needed credentials (FCM API secret Key) in order to send push to the New Vector client.
That means that Element Android, a matrix client created by New Vector, is using a **Push Gateway** with the needed credentials (FCM API secret Key) in order to send push to the New Vector client.
If you create your own matrix client, you will also need to deploy an instance of a **Push Gateway** with the credentials needed to use FCM for your app.
@@ -132,7 +132,7 @@ A Home Server can be configured with default rules (for Direct messages, group m
There are different kind of push rules, it can be per room (each new message on this room should be notified), it can also define a pattern that a message should match (when you are mentioned, or key word based).
Notifications have 2 'levels' (`highlighted = true/false sound = default/custom`). In RiotX these notifications level are reflected as Noisy/Silent.
Notifications have 2 'levels' (`highlighted = true/false sound = default/custom`). In Element these notifications level are reflected as Noisy/Silent.
**What about encrypted messages?**
@@ -158,7 +158,7 @@ In a nutshell, apps can't do much in background now.
If the devices is not plugged and stays IDLE for a certain amount of time, radio (mobile connectivity) and CPU can/will be turned off.
For an application like RiotX, where users can receive important information at anytime, the best option is to rely on a push system (Google's Firebase Message a.k.a FCM). FCM high priority push can wake up the device and whitelist an application to perform background task (for a limited but unspecified amount of time).
For an application like Element, where users can receive important information at anytime, the best option is to rely on a push system (Google's Firebase Message a.k.a FCM). FCM high priority push can wake up the device and whitelist an application to perform background task (for a limited but unspecified amount of time).
Notice that this is still evolving, and in future versions application that has been 'background restricted' by users won't be able to wake up even when a high priority push is received. Also high priority notifications could be rate limited (not defined anywhere)
@@ -167,41 +167,41 @@ The documentation on this subject is vague, and as per our experiments not alway
It is getting more and more complex to have reliable notifications when FCM is not used.
# RiotX Notification implementations
# Element Notification implementations
## Requirements
RiotX Android must work with and without FCM.
* The RiotX android app published on F-Droid do not rely on FCM (all related dependencies are not present)
* The RiotX android app published on google play rely on FCM, with a fallback mode when FCM registration has failed (e.g outdated or missing Google Play Services)
Element Android must work with and without FCM.
* The Element android app published on F-Droid do not rely on FCM (all related dependencies are not present)
* The Element android app published on google play rely on FCM, with a fallback mode when FCM registration has failed (e.g outdated or missing Google Play Services)
## Foreground sync mode (Gplay & F-Droid)
When in foreground, RiotX performs sync continuously with a timeout value set to 10 seconds (see HttpPooling).
When in foreground, Element performs sync continuously with a timeout value set to 10 seconds (see HttpPooling).
As this mode does not need to live beyond the scope of the application, and as per Google recommendation, RiotX uses the internal app resources (Thread and Timers) to perform the syncs.
As this mode does not need to live beyond the scope of the application, and as per Google recommendation, Element uses the internal app resources (Thread and Timers) to perform the syncs.
This mode is turned on when the app enters foreground, and off when enters background.
In background, and depending on wether push is available or not, RiotX will use different methods to perform the syncs (Workers / Alarms / Service)
In background, and depending on wether push is available or not, Element will use different methods to perform the syncs (Workers / Alarms / Service)
## Push (FCM) received in background
In order to enable Push, RiotX must first get a push token from the firebase SDK, then register a pusher with this token on the HomeServer.
In order to enable Push, Element must first get a push token from the firebase SDK, then register a pusher with this token on the HomeServer.
When a message should be notified to a user, the user's homeserver notifies the registered `push gateway` for RiotX, that is [sygnal](https://github.com/matrix-org/sygnal) _- The reference implementation for push gateways -_ hosted by matrix.org.
When a message should be notified to a user, the user's homeserver notifies the registered `push gateway` for Element, that is [sygnal](https://github.com/matrix-org/sygnal) _- The reference implementation for push gateways -_ hosted by matrix.org.
This sygnal instance is configured with the required FCM API authentication token, and will then use the FCM API in order to notify the user's device running riotX.
This sygnal instance is configured with the required FCM API authentication token, and will then use the FCM API in order to notify the user's device running Element.
```
Homeserver ----> Sygnal (configured for RiotX) ----> FCM ----> RiotX
Homeserver ----> Sygnal (configured for Element) ----> FCM ----> Element
```
The push gateway is configured to only send `(eventId,roomId)` in the push payload (for better [privacy](#push-vs-privacy-and-mitigation)).
RiotX needs then to synchronise with the user's HomeServer, in order to resolve the event and create a notification.
Element needs then to synchronise with the user's HomeServer, in order to resolve the event and create a notification.
As per [Google recommendation](https://android-developers.googleblog.com/2018/09/notifying-your-users-with-fcm.html), RiotX will then use the WorkManager API in order to trigger a background sync.
As per [Google recommendation](https://android-developers.googleblog.com/2018/09/notifying-your-users-with-fcm.html), Element will then use the WorkManager API in order to trigger a background sync.
**Google recommendations:**
> We recommend using FCM messages in combination with the WorkManager 1 or JobScheduler API
@@ -209,7 +209,7 @@ As per [Google recommendation](https://android-developers.googleblog.com/2018/09
> Avoid background services. One common pitfall is using a background service to fetch data in the FCM message handler, since background service will be stopped by the system per recent changes to Google Play Policy
```
Homeserver ----> Sygnal ----> FCM ----> RiotX
Homeserver ----> Sygnal ----> FCM ----> Element
(Sync) ----> Homeserver
<----
Display notification
@@ -217,24 +217,24 @@ Homeserver ----> Sygnal ----> FCM ----> RiotX
**Possible outcomes**
Upon reception of the FCM push, RiotX will perform a sync call to the Home Server, during this process it is possible that:
Upon reception of the FCM push, Element will perform a sync call to the Home Server, during this process it is possible that:
* Happy path, the sync is performed, the message resolved and displayed in the notification drawer
* The notified message is not in the sync. Can happen if a lot of things did happen since the push (`gappy sync`)
* The sync generates additional notifications (e.g an encrypted message where the user is mentioned detected locally)
* The sync takes too long and the process is killed before completion, or network is not reliable and the sync fails.
RiotX implements several strategies in these cases (TODO document)
Element implements several strategies in these cases (TODO document)
## FCM Fallback mode
It is possible that RiotX is not able to get a FCM push token.
It is possible that Element is not able to get a FCM push token.
Common errors (amoung several others) that can cause that:
* Google Play Services is outdated
* Google Play Service fails in someways with FCM servers (infamous `SERVICE_NOT_AVAILABLE`)
If RiotX is able to detect one of this cases, it will notifies it to the users and when possible help him fix it via a dedicated troubleshoot screen.
If Element is able to detect one of this cases, it will notifies it to the users and when possible help him fix it via a dedicated troubleshoot screen.
Meanwhile, in order to offer a minimal service, and as per Google's recommendation for background activities, RiotX will launch periodic background sync in order to stays in sync with servers.
Meanwhile, in order to offer a minimal service, and as per Google's recommendation for background activities, Element will launch periodic background sync in order to stays in sync with servers.
The fallback mode is impacted by all the battery life saving mechanism implemented by android. Meaning that if the app is not used for a certain amount of time (`App-Standby`), or the device stays still and unplugged (`Light Doze`) , the sync will become less frequent.
@@ -248,7 +248,7 @@ The fallback mode is supposed to be a temporary state waiting for the user to fi
## F-Droid background Mode
The F-Droid RiotX flavor has no dependencies to FCM, therefore cannot relies on Push.
The F-Droid Element flavor has no dependencies to FCM, therefore cannot relies on Push.
Also Google's recommended background processing method cannot be applied. This is because all of these methods are affected by IDLE modes, and will result on the user not being notified at all when the app is in a Doze mode (only in maintenance windows that could happens only after hours).
@@ -262,7 +262,7 @@ F-Droid version will schedule alarms that will then trigger a Broadcast Receiver
Depending on the system status (or device make), it is still possible that the app is not given enough time to launch the service, or that the radio is still turned off thus preventing the sync to success (that's why Alarms are not recommended for network related tasks).
That is why on RiotX F-Droid, the broadcast receiver will acquire a temporary WAKE_LOCK for several seconds (thus securing cpu/network), and launch the service in foreground. The service performs the sync.
That is why on Element F-Droid, the broadcast receiver will acquire a temporary WAKE_LOCK for several seconds (thus securing cpu/network), and launch the service in foreground. The service performs the sync.
Note that foreground services require to put a notification informing the user that the app is doing something even if not launched).

309
docs/signin.md Normal file
View File

@@ -0,0 +1,309 @@
# Sign in to a homeserver
This document describes the flow of signin to a homeserver, and also the flow when user want to reset his password. Examples come from the `matrix.org` homeserver.
## Sign in flows
### Get the flow
Client request the sign-in flows, once the homeserver is chosen by the user and its url is known (in the example it's `https://matrix.org`)
> curl -X GET 'https://matrix.org/_matrix/client/r0/login'
200
```json
{
"flows": [
{
"type": "m.login.password"
}
]
}
```
### Login with username
The user is able to connect using `m.login.password`
> curl -X POST --data $'{"identifier":{"type":"m.id.user","user":"alice"},"password":"weak_password","type":"m.login.password","initial_device_display_name":"Portable"}' 'https://matrix.org/_matrix/client/r0/login'
```json
{
"identifier": {
"type": "m.id.user",
"user": "alice"
},
"password": "weak_password",
"type": "m.login.password",
"initial_device_display_name": "Portable"
}
```
#### Incorrect password
403
```json
{
"errcode": "M_FORBIDDEN",
"error": "Invalid password"
}
```
#### Correct password:
We get credential (200)
```json
{
"user_id": "@alice:matrix.org",
"access_token": "MDAxOGxvY2F0aW9uIG1hdHREDACTEDb2l0MDgxNjptYXRyaXgub3JnCjAwMTZjaWQgdHlwZSA9IGFjY2VzcwowMDIxY2lr",
"home_server": "matrix.org",
"device_id": "GTVREDALBF",
"well_known": {
"m.homeserver": {
"base_url": "https:\/\/matrix.org\/"
}
}
}
```
### Login with email
If the user has associated an email with its account, he can signin using the email.
> curl -X POST --data $'{"identifier":{"type":"m.id.thirdparty","medium":"email","address":"alice@yopmail.com"},"password":"weak_password","type":"m.login.password","initial_device_display_name":"Portable"}' 'https://matrix.org/_matrix/client/r0/login'
```json
{
"identifier": {
"type": "m.id.thirdparty",
"medium": "email",
"address": "alice@yopmail.com"
},
"password": "weak_password",
"type": "m.login.password",
"initial_device_display_name": "Portable"
}
```
#### Unknown email
403
```json
{
"errcode": "M_FORBIDDEN",
"error": ""
}
```
#### Known email, wrong password
403
```json
{
"errcode": "M_FORBIDDEN",
"error": "Invalid password"
}
```
##### Known email, correct password
We get the credentials (200)
```json
{
"user_id": "@alice:matrix.org",
"access_token": "MDAxOGxvY2F0aW9uIG1hdHJpeC5vcmREDACTEDZXJfaWQgPSBAYmVub2l0MDgxNjptYXRyaXgub3Jnfrfdegfszsefddvf",
"home_server": "matrix.org",
"device_id": "WBSREDASND",
"well_known": {
"m.homeserver": {
"base_url": "https:\/\/matrix.org\/"
}
}
}
```
It's worth noting that the response from the homeserver contains the userId of Alice.
### Login with Msisdn
Not supported yet in Element
### Login with SSO
> curl -X GET 'https://homeserver.with.sso/_matrix/client/r0/login'
200
```json
{
"flows": [
{
"type": "m.login.sso"
},
{
"type": "m.login.token"
}
]
}
```
In this case, the user can click on "Sign in with SSO" and the native web browser, or a ChromeCustomTab if the device supports it, will be launched on the page
> https://homeserver.with.sso/_matrix/client/r0/login/sso/redirect?redirectUrl=element%3A%2F%element
The parameter `redirectUrl` is set to `element://element`.
ChromeCustomTabs are an intermediate way to display a WebPage, between a WebView and using the external browser. More info can be found [here](https://developer.chrome.com/multidevice/android/customtabs)
The browser will then take care of the SSO login, which may include creating a third party account, entering an email, settings a display name, or any other possibilities.
During the process, user may be asked to validate an email by clicking on a link it contains. The link has to be opened in the browser which initiates the authentication. This is why we cannot use WebView anymore.
Once the process is finished, the web page will call the `redirectUrl` with an extra parameter `loginToken`
> element://element?loginToken=MDAxOWxvY2F0aW9uIG1vemlsbGEub3JnCjAwMTNpZGVudGlmaWVy
This navigation is intercepted by Element by the `LoginActivity`, which will then ask the homeserver to convert this `loginToken` to an access token
> curl -X POST --data $'{"type":"m.login.token","token":"MDAxOWxvY2F0aW9uIG1vemlsbGEub3JnCjAwMTNpZGVudGlmaWVy"}' 'https://homeserver.with.sso/_matrix/client/r0/login'
```json
{
"type": "m.login.token",
"token": "MDAxOWxvY2F0aW9uIG1vemlsbGEub3JnCjAwMTNpZGVudGlmaWVy"
}
```
We get the credentials (200)
```json
{
"user_id": "@alice:homeserver.with.sso",
"access_token": "MDAxOWxvY2F0aW9uIG1vemlsbGEub3JnCjAwMTNpZGVudGlmaWVyIGtleQowMDEwY2lkIGdlbiA9IDEKMDAyY2NpZCB1c2",
"home_server": "homeserver.with.sso",
"device_id": "DETBTVAHCH",
"well_known": {
"m.homeserver": {
"base_url": "https:\/\/homeserver.with.sso\/"
},
"m.identity_server": {
"base_url": "https:\/\/vector.im"
}
}
}
```
## Reset password
Ref: `https://matrix.org/docs/spec/client_server/latest#post-matrix-client-r0-account-password-email-requesttoken`
When the user has forgotten his password, he can reset it by providing an email and a new password.
Here is the flow:
### Send email
User is asked to enter the email linked to his account and a new password.
We display a warning regarding e2e.
At the first step, we do not send the password, only the email and a client secret, generated by the application
> curl -X POST --data $'{"client_secret":"6c57f284-85e2-421b-8270-fb1795a120a7","send_attempt":0,"email":"user@domain.com"}' 'https://matrix.org/_matrix/client/r0/account/password/email/requestToken'
```json
{
"client_secret": "6c57f284-85e2-421b-8270-fb1795a120a7",
"send_attempt": 0,
"email": "user@domain.com"
}
```
#### When the email is not known
We get a 400
```json
{
"errcode": "M_THREEPID_NOT_FOUND",
"error": "Email not found"
}
```
#### When the email is known
We get a 200 with a `sid`
```json
{
"sid": "tQNbrREDACTEDldA"
}
```
Then the user is asked to click on the link in the email he just received, and to confirm when it's done.
During this step, the new password is sent to the homeserver.
If the user confirms before the link is clicked, we get an error:
> curl -X POST --data $'{"auth":{"type":"m.login.email.identity","threepid_creds":{"client_secret":"6c57f284-85e2-421b-8270-fb1795a120a7","sid":"tQNbrREDACTEDldA"}},"new_password":"weak_password"}' 'https://matrix.org/_matrix/client/r0/account/password'
```json
{
"auth": {
"type": "m.login.email.identity",
"threepid_creds": {
"client_secret": "6c57f284-85e2-421b-8270-fb1795a120a7",
"sid": "tQNbrREDACTEDldA"
}
},
"new_password": "weak_password"
}
```
401
```json
{
"errcode": "M_UNAUTHORIZED",
"error": ""
}
```
### User clicks on the link
The link has the form:
https://matrix.org/_matrix/client/unstable/password_reset/email/submit_token?token=fzZLBlcqhTKeaFQFSRbsQnQCkzbwtGAD&client_secret=6c57f284-85e2-421b-8270-fb1795a120a7&sid=tQNbrREDACTEDldA
It contains the client secret, a token and the sid
When the user click the link, if validate his ownership and the new password can now be ent by the application (on user demand):
> curl -X POST --data $'{"auth":{"type":"m.login.email.identity","threepid_creds":{"client_secret":"6c57f284-85e2-421b-8270-fb1795a120a7","sid":"tQNbrREDACTEDldA"}},"new_password":"weak_password"}' 'https://matrix.org/_matrix/client/r0/account/password'
```json
{
"auth": {
"type": "m.login.email.identity",
"threepid_creds": {
"client_secret": "6c57f284-85e2-421b-8270-fb1795a120a7",
"sid": "tQNbrREDACTEDldA"
}
},
"new_password": "weak_password"
}
```
200
```json
{}
```
The password has been changed, and all the existing token are invalidated. User can now login with the new password.

579
docs/signup.md Normal file
View File

@@ -0,0 +1,579 @@
# Sign up to a homeserver
This document describes the flow of registration to a homeserver. Examples come from the `matrix.org` homeserver.
*Ref*: https://matrix.org/docs/spec/client_server/latest#account-registration-and-management
## Sign up flows
### First step
Client request the sign-up flows, once the homeserver is chosen by the user and its url is known (in the example it's `https://matrix.org`)
> curl -X POST --data $'{}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
}
```
We get the flows with a 401, which also means that the registration is possible on this homeserver.
```json
{
"session": "vwehdKMtkRedactedAMwgCACZ",
"flows": [
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.dummy"
]
},
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.email.identity"
]
}
],
"params": {
"m.login.recaptcha": {
"public_key": "6LcgI54UAAAAAoREDACTEDoDdOocFpYVdjYBRe4zb"
},
"m.login.terms": {
"policies": {
"privacy_policy": {
"version": "1.0",
"en": {
"name": "Terms and Conditions",
"url": "https:\/\/matrix.org\/_matrix\/consent?v=1.0"
}
}
}
}
}
}
```
If the registration is not possible, we get a 403
```json
{
"errcode": "M_FORBIDDEN",
"error": "Registration is disabled"
}
```
### Step 1: entering user name and password
The app is displaying a form to enter username and password.
> curl -X POST --data $'{"initial_device_display_name":"Mobile device","username":"alice","password": "weak_password"}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
"initial_device_display_name": "Mobile device",
"username": "alice",
"password": "weak_password"
}
```
401. Note that the `session` value has changed (because we did not provide the previous value in the request body), but it's ok, we will use the new value for the next steps.
```json
{
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"flows": [
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.dummy"
]
},
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.email.identity"
]
}
],
"params": {
"m.login.recaptcha": {
"public_key": "6LcgI54UAAAAAoREDACTEDoDdOocFpYVdjYBRe4zb"
},
"m.login.terms": {
"policies": {
"privacy_policy": {
"version": "1.0",
"en": {
"name": "Terms and Conditions",
"url": "https:\/\/matrix.org\/_matrix\/consent?v=1.0"
}
}
}
}
}
}
```
#### If username already exists
We get a 400:
```json
{
"errcode": "M_USER_IN_USE",
"error": "User ID already taken."
}
```
### Step 2: entering email
User is proposed to enter an email. We skip this step.
> curl -X POST --data $'{"auth":{"session":"xptUYoREDACTEDogOWAGVnbJQ","type":"m.login.dummy"}}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
"auth": {
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"type": "m.login.dummy"
}
}
```
401
```json
{
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"flows": [
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.dummy"
]
},
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.email.identity"
]
}
],
"params": {
"m.login.recaptcha": {
"public_key": "6LcgI54UAAAAAoREDACTEDoDdOocFpYVdjYBRe4zb"
},
"m.login.terms": {
"policies": {
"privacy_policy": {
"version": "1.0",
"en": {
"name": "Terms and Conditions",
"url": "https:\/\/matrix.org\/_matrix\/consent?v=1.0"
}
}
}
}
},
"completed": [
"m.login.dummy"
]
}
```
### Step 2 bis: we enter an email
We request a token to the homeserver. The `client_secret` is generated by the application
> curl -X POST --data $'{"client_secret":"53e679ea-oRED-ACTED-92b8-3012c49c6cfa","email":"alice@yopmail.com","send_attempt":0}' 'https://matrix.org/_matrix/client/r0/register/email/requestToken'
```json
{
"client_secret": "53e679ea-oRED-ACTED-92b8-3012c49c6cfa",
"email": "alice@yopmail.com",
"send_attempt": 0
}
```
200
```json
{
"sid": "qlBCREDACTEDEtgxD"
}
```
And
> curl -X POST --data $'{"auth":{"threepid_creds":{"client_secret":"53e679ea-oRED-ACTED-92b8-3012c49c6cfa","sid":"qlBCREDACTEDEtgxD"},"session":"xptUYoREDACTEDogOWAGVnbJQ","type":"m.login.email.identity"}}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
"auth": {
"threepid_creds": {
"client_secret": "53e679ea-oRED-ACTED-92b8-3012c49c6cfa",
"sid": "qlBCREDACTEDEtgxD"
},
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"type": "m.login.email.identity"
}
}
```
We get 401 since the email is not validated yet:
```json
{
"errcode": "M_UNAUTHORIZED",
"error": ""
}
```
The app is now polling on
> curl -X POST --data $'{"auth":{"threepid_creds":{"client_secret":"53e679ea-oRED-ACTED-92b8-3012c49c6cfa","sid":"qlBCREDACTEDEtgxD"},"session":"xptUYoREDACTEDogOWAGVnbJQ","type":"m.login.email.identity"}}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
"auth": {
"threepid_creds": {
"client_secret": "53e679ea-oRED-ACTED-92b8-3012c49c6cfa",
"sid": "qlBCREDACTEDEtgxD"
},
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"type": "m.login.email.identity"
}
}
```
We click on the link received by email `https://matrix.org/_matrix/client/unstable/registration/email/submit_token?token=vtQjQIZfwdoREDACTEDozrmKYSWlCXsJ&client_secret=53e679ea-oRED-ACTED-92b8-3012c49c6cfa&sid=qlBCREDACTEDEtgxD` which contains:
- A `token` vtQjQIZfwdoREDACTEDozrmKYSWlCXsJ
- The `client_secret`: 53e679ea-oRED-ACTED-92b8-3012c49c6cfa
- A `sid`: qlBCREDACTEDEtgxD
Once the link is clicked, the registration request (polling) returns a 401 with the following content:
```json
{
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"flows": [
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.dummy"
]
},
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.email.identity"
]
}
],
"params": {
"m.login.recaptcha": {
"public_key": "6LcgI54UAAAAAoREDACTEDoDdOocFpYVdjYBRe4zb"
},
"m.login.terms": {
"policies": {
"privacy_policy": {
"version": "1.0",
"en": {
"name": "Terms and Conditions",
"url": "https:\/\/matrix.org\/_matrix\/consent?v=1.0"
}
}
}
}
},
"completed": [
"m.login.email.identity"
]
}
```
### Step 3: Accepting T&C
User is proposed to accept T&C and he accepts them
> curl -X POST --data $'{"auth":{"session":"xptUYoREDACTEDogOWAGVnbJQ","type":"m.login.terms"}}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
"auth": {
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"type": "m.login.terms"
}
}
```
401
```json
{
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"flows": [
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.dummy"
]
},
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.email.identity"
]
}
],
"params": {
"m.login.recaptcha": {
"public_key": "6LcgI54UAAAAAoREDACTEDoDdOocFpYVdjYBRe4zb"
},
"m.login.terms": {
"policies": {
"privacy_policy": {
"version": "1.0",
"en": {
"name": "Terms and Conditions",
"url": "https:\/\/matrix.org\/_matrix\/consent?v=1.0"
}
}
}
}
},
"completed": [
"m.login.dummy",
"m.login.terms"
]
}
```
### Step 4: Captcha
User is proposed to prove he is not a robot and he does it:
> curl -X POST --data $'{"auth":{"response":"03AOLTBLSiGS9GhFDpAMblJ2nlXOmHXqAYJ5OvHCPUjiVLBef3k9snOYI_BDC32-t4D2jv-tpvkaiEI_uloobFd9RUTPpJ7con2hMddbKjSCYqXqcUQFhzhbcX6kw8uBnh2sbwBe80_ihrHGXEoACXQkL0ki1Q0uEtOeW20YBRjbNABsZPpLNZhGIWC0QVXnQ4FouAtZrl3gOAiyM-oG3cgP6M9pcANIAC_7T2P2amAHbtsTlSR9CsazNyS-rtDR9b5MywdtnWN9Aw8fTJb8cXQk_j7nvugMxzofPjSOrPKcr8h5OqPlpUCyxxnFtag6cuaPSUwh43D2L0E-ZX7djzaY2Yh_U2n6HegFNPOQ22CJmfrKwDlodmAfMPvAXyq77n3HpoREDACTEDo3830RHF4BfkGXUaZjctgg-A1mvC17hmQmQpkG7IhDqyw0onU-0vF_-ehCjq_CcQEDpS_O3uiHJaG5xGf-0rhLm57v_wA3deugbsZuO4uTuxZZycN_mKxZ97jlDVBetl9hc_5REPbhcT1w3uzTCSx7Q","session":"xptUYoREDACTEDogOWAGVnbJQ","type":"m.login.recaptcha"}}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
"auth": {
"response": "03AOLTBLSiGS9GhFDpAMblJ2nlXOmHXqAYJ5OvHCPUjiVLBef3k9snOYI_BDC32-t4D2jv-tpvkaiEI_uloobFd9RUTPpJ7con2hMddbKjSCYqXqcUQFhzhbcX6kw8uBnh2sbwBe80_ihrHGXEoACXQkL0ki1Q0uEtOeW20YBRjbNABsZPpLNZhGIWC0QVXnQ4FouAtZrl3gOAiyM-oG3cgP6M9pcANIAC_7T2P2amAHbtsTlSR9CsazNyS-rtDR9b5MywdtnWN9Aw8fTJb8cXQk_j7nvugMxzofPjSOrPKcr8h5OqPlpUCyxxnFtag6cuaPSUwh43D2L0E-ZX7djzaY2Yh_U2n6HegFNPOQ22CJmfrKwDlodmAfMPvAXyq77n3HpoREDACTEDo3830RHF4BfkGXUaZjctgg-A1mvC17hmQmQpkG7IhDqyw0onU-0vF_-ehCjq_CcQEDpS_O3uiHJaG5xGf-0rhLm57v_wA3deugbsZuO4uTuxZZycN_mKxZ97jlDVBetl9hc_5REPbhcT1w3uzTCSx7Q",
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"type": "m.login.recaptcha"
}
}
```
200
```json
{
"user_id": "@alice:matrix.org",
"home_server": "matrix.org",
"access_token": "MDAxOGxvY2F0aW9uIG1hdHJpeC5vcmcKMoREDACTEDo50aWZpZXIga2V5CjAwMTBjaWQgZ2VuID0gMQowMDI5Y2lkIHVzZXJfaWQgPSBAYmVub2l0eHh4eDptYXRoREDACTEDoCjAwMTZjaWQgdHlwZSA9IGFjY2VzcwowMDIxY2lkIG5vbmNlID0gNHVSVm00aVFDaWlKdoREDACTEDoJmc2lnbmF0dXJlIOmHnTLRfxiPjhrWhS-dThUX-qAzZktfRThzH1YyAsxaCg",
"device_id": "FLBAREDAJZ"
}
```
The account is created!
### Step 5: MSISDN
Some homeservers may require the user to enter MSISDN.
On matrix.org, it's not required, and not even optional, but it's still possible for the app to add a MSISDN during the registration.
The user enter a phone number and select a country, the `client_secret` is generated by the application
> curl -X POST --data $'{"client_secret":"d3e285f6-972a-496c-9a22-7915a2db57c7","send_attempt":1,"country":"FR","phone_number":"+33611223344"}' 'https://matrix.org/_matrix/client/r0/register/msisdn/requestToken'
```json
{
"client_secret": "d3e285f6-972a-496c-9a22-7915a2db57c7",
"send_attempt": 1,
"country": "FR",
"phone_number": "+33611223344"
}
```
If the msisdn is already associated to another account, you will received an error:
```json
{
"errcode": "M_THREEPID_IN_USE",
"error": "Phone number is already in use"
}
```
If it is not the case, the homeserver send the SMS and returns some data, especially a `sid` and a `submit_url`:
```json
{
"msisdn": "33611223344",
"intl_fmt": "+336 11 22 33 44",
"success": true,
"sid": "1678881798",
"submit_url": "https:\/\/matrix.org\/_matrix\/client\/unstable\/add_threepid\/msisdn\/submit_token"
}
```
When you execute the register request, with the received `sid`, you get an error since the MSISDN is not validated yet:
> curl -X POST --data $'{"auth":{"type":"m.login.msisdn","session":"xptUYoREDACTEDogOWAGVnbJQ","threepid_creds":{"client_secret":"d3e285f6-972a-496c-9a22-7915a2db57c7","sid":"1678881798"}}}' 'https://matrix.org/_matrix/client/r0/register'
```json
"auth": {
"type": "m.login.msisdn",
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"threepid_creds": {
"client_secret": "d3e285f6-972a-496c-9a22-7915a2db57c7",
"sid": "1678881798"
}
}
}
```
There is an issue on Synapse, which return a 401, it sends too much data along with the classical MatrixError fields:
```json
{
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"flows": [
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.dummy"
]
},
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.email.identity"
]
}
],
"params": {
"m.login.recaptcha": {
"public_key": "6LcgI54UAAAAABGdGmruw6DdOocFpYVdjYBRe4zb"
},
"m.login.terms": {
"policies": {
"privacy_policy": {
"version": "1.0",
"en": {
"name": "Terms and Conditions",
"url": "https:\/\/matrix.org\/_matrix\/consent?v=1.0"
}
}
}
}
},
"completed": [],
"error": "",
"errcode": "M_UNAUTHORIZED"
}
```
The user receive the SMS, he can enter the SMS code in the app, which is sent using the "submit_url" received ie the response of the `requestToken` request:
> curl -X POST --data $'{"client_secret":"d3e285f6-972a-496c-9a22-7915a2db57c7","sid":"1678881798","token":"123456"}' 'https://matrix.org/_matrix/client/unstable/add_threepid/msisdn/submit_token'
```json
{
"client_secret": "d3e285f6-972a-496c-9a22-7915a2db57c7",
"sid": "1678881798",
"token": "123456"
}
```
If the code is not correct, we get a 200 with:
```json
{
"success": false
}
```
And if the code is correct we get a 200 with:
```json
{
"success": true
}
```
We can now execute the registration request, to the homeserver
> curl -X POST --data $'{"auth":{"type":"m.login.msisdn","session":"xptUYoREDACTEDogOWAGVnbJQ","threepid_creds":{"client_secret":"d3e285f6-972a-496c-9a22-7915a2db57c7","sid":"1678881798"}}}' 'https://matrix.org/_matrix/client/r0/register'
```json
{
"auth": {
"type": "m.login.msisdn",
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"threepid_creds": {
"client_secret": "d3e285f6-972a-496c-9a22-7915a2db57c7",
"sid": "1678881798"
}
}
}
```
Now the homeserver consider that the `m.login.msisdn` step is completed (401):
```json
{
"session": "xptUYoREDACTEDogOWAGVnbJQ",
"flows": [
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.dummy"
]
},
{
"stages": [
"m.login.recaptcha",
"m.login.terms",
"m.login.email.identity"
]
}
],
"params": {
"m.login.recaptcha": {
"public_key": "6LcgI54UAAAAABGdGmruw6DdOocFpYVdjYBRe4zb"
},
"m.login.terms": {
"policies": {
"privacy_policy": {
"version": "1.0",
"en": {
"name": "Terms and Conditions",
"url": "https:\/\/matrix.org\/_matrix\/consent?v=1.0"
}
}
}
}
},
"completed": [
"m.login.msisdn"
]
}
```

425
docs/voip_signaling.md Normal file
View File

@@ -0,0 +1,425 @@
Useful links:
- https://codelabs.developers.google.com/codelabs/webrtc-web/#0
- http://webrtc.github.io/webrtc-org/native-code/android/
╔════════════════════════════════════════════════╗
║ ║
║A] Placing a call offer ║
║ ║
╚════════════════════════════════════════════════╝
┌───────────────┐
│ Matrix │
├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌─────────────────┐ │ ┌───────────────────────────┐ ┌─────────────────┐
│ Caller │ │ Signaling Room │ │ │ Callee │
└─────────────────┘ │ ├───────────────────────────┤ └─────────────────┘
┌────┐ │ │ │
│ 3 │ │ │ ┌────────────────────┐ │
┌─────────────────┐──────┴────┴──────────────────────────┼─▶│ m.call.invite │ │ │ ┌─────────────────┐
│ │ │ │ │ mx event │ │ │ │
│ │ │ └────────────────────┘ │ │ │ │
│ │ │ │ │ │ │
│ Element │ │ │ │ │ Element │
┌──│ App │ │ │ │ │ App │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ └─────────────────┘ │ │ │ └─────────────────┘
┌────┤ ▲ │ │ │
│ 1 │ ├────┐ │ └───────────────────────────┘
└────┤ │ 2 │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
│ ┌──┴────┴─────────┐ ┌─────────────────┐
│ │ │ │ │
│ │ │ │ │
│ │ WebRtc │ │ WebRtc │
└─▶│ │ │ │
│ │ │ │
│ │ │ │
└─────────────────┘ └─────────────────┘
┌────┐
│ 1 │ The Caller app get access to system resources (camera, mic), eventually stun/turn servers, define some
└────┘ constrains (video quality, format) and pass it to WebRtc in order to create a Peer Call offer
┌────┐
│ 2 │ The WebRtc layer creates a call Offer (sdp) that needs to be sent to callee
└────┘
┌────┐ The app layer, takes the webrtc offer, encapsulate it in a matrix event adds a callId and send it to the other
│ 3 │ user via the room
└────┘
┌──────────────┐
│ mx event │
├──────────────┴────────┐
│ type: m.call.invite │
│ + callId │
│ │
│ ┌──────────────────┐ │
│ │ webrtc sdp │ │
│ └──────────────────┘ │
└───────────────────────┘
╔════════════════════════════════════════════════╗
║ ║
║B] Sending connection establishment info ║
║ ║
╚════════════════════════════════════════════════╝
┌───────────────┐
│ Matrix │
├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌─────────────────┐ │ ┌───────────────────────────┐ ┌─────────────────┐
│ Caller │ │ Signaling Room │ │ │ Callee │
└─────────────────┘ │ ├───────────────────────────┤ └─────────────────┘
│ ┌────────────────────┐ │ │
│ │ │ m.call.invite │ │
┌─────────────────┐ │ │ mx event │ │ │ ┌─────────────────┐
│ │ ┌────┐ │ │ └────────────────────┘ │ │ │
│ │ │ 3 │ │ ┌────────────────────┐ │ │ │ │
│ │──────┴────┴───────┼──────────────────┼─▶│ m.call.candidates │ │ │ │
│ Element │ │ │ mx event │ │ │ │ Element │
│ App │ │ │ └────────────────────┘ │ │ App │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
└─────────────────┘ │ │ │ └─────────────────┘
▲ │ │ │
├────┐ │ └───────────────────────────┘
│ 2 │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
┌───────┴────┴────┐ ┌─────────────────┐
│ │ │ │
│ │ │ │
│ WebRtc │ ┌───────────────┐ │ WebRtc │
│ │ │ Stun / Turn │ │ │
│ │ ├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │
│ │ │ │ │
└─────────────────┘ │ └─────────────────┘
▲ │
│ │
└──────────┬────┬───────────▶ │
┌───────────────┐ │ 1 │ │
│ │ └────┘ │
│ Network Stack │ │
│ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
│ │
└───────────────┘
┌────┐
│ 1 │ The WebRtc layer gathers information on how it can be reach by the other peer directly (Ice candidates)
└────┘
┌──────────────────────────────────────────────────────────────────┐
│candidate:1 1 tcp 1518149375 127.0.0.1 35990 typ host │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│candidate:2 1 UDP 2130706431 192.168.1.102 1816 typ host │
└──────────────────────────────────────────────────────────────────┘
┌────┐
│ 2 │ The WebRTC layer notifies the App layer when it finds new Ice Candidates
└────┘
┌────┐ The app layer, takes the ice candidates, encapsulate them in one or several matrix event adds the callId and
│ 3 │ send it to the other user via the room
└────┘
┌──────────────┐
│ mx event │
├──────────────┴────────────────────────┐
│ type: m.call.candidates │
│ │
│ +CallId │
│ │
│ ┌──────────────────┐ │
│ │ice candidate sdp │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ice candidate sdp │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ice candidate sdp │ │
│ └──────────────────┘ │
└───────────────────────────────────────┘
╔════════════════════════════════════════════════╗
║ ║
║C] Receiving a call offer ║
║ ║
╚════════════════════════════════════════════════╝
┌───────────────┐
│ Matrix │
├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
│ ┌─────────────────┐
│ │ Callee │
┌─────────────────┐ │ ┌───────────────────────────┐ └─────────────────┘
│ Caller │ │ Signaling Room │ │
└─────────────────┘ │ ├───────────────────────────┤
│ ┌────────────────────┐ │ │ ┌─────────────────┐
│ │ │ m.call.invite │───┼────────────────────────────┬────┬───▶│ │
┌─────────────────┐ │ │ mx event │ │ │ │ 1 │ │ │
│ │ │ │ └────────────────────┘ │ └────┘ │ │
│ │ │ ┌────────────────────┐ │ │ │ Element │
│ │ │ │ │ m.call.candidates │ │ │ App │
│ Element │ │ │ mx event │ │ │ │ │
│ App │ │ │ └────────────────────┘ │ │ │
│ │ │ ┌────────────────────┐◀──┼─────────────────┼───┬────┬───────────┤ │
│ │◀──────────────────┼──────────────────┼──│ m.call.answer │ │ │ 4 │ └──┬──────────────┘
│ │ │ │ mx event │ │ │ └────┘ ├────┐ ▲
└────┬────────────┘ │ │ └────────────────────┘ │ │ 2 │ ├────┐
│ │ │ │ ├────┘ │ 3 │
│ │ └───────────────────────────┘ ┌──▼─────────┴────┤
┌────▼────────────┐ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ │ │
│ │ │ │
│ │ │ WebRtc │
│ WebRtc │ │ ┌──┴─────────────────┐
│ │ │ │ caller offer │
┌──────────┴─────────┐ │ │ └──┬─────────────────┘
│ callee answer │ │ └─────────────────┘
└────────────────────┴───────┘
┌────┐
│ 1 │ Bob receives a call.invite event in a room, then creates a WebRTC peer connection object
└────┘
┌────┐
│ 2 │ The encapsulated call offer sdp from the mx event is transmitted to WebRTC
└────┘
┌────┐
│ 3 │ WebRTC then creates a call answer for the offer and send it back to app layer
└────┘
┌────┐ The app layer, takes the webrtc answer, encapsulate it in a matrix event adds a callId and send it to the
│ 3 │ other user via the room
└────┘
┌──────────────┐
│ mx event │
├──────────────┴────────┐
│ type: m.call.answer │
│ + callId │
│ │
│ ┌──────────────────┐ │
│ │ webrtc sdp │ │
│ └──────────────────┘ │
└───────────────────────┘
╔════════════════════════════════════════════════╗
║ ║
║D] Callee sends connection establishment info ║
║ ║
╚════════════════════════════════════════════════╝
┌───────────────┐
│ Matrix │
├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌─────────────────┐ │ ┌───────────────────────────┐ ┌─────────────────┐
│ Caller │ │ Signaling Room │ │ │ Callee │
└─────────────────┘ │ ├───────────────────────────┤ └─────────────────┘
│ ┌────────────────────┐ │ │
│ │ │ m.call.invite │ │
┌─────────────────┐ │ │ mx event │ │ │ ┌─────────────────┐
│ │ │ │ └────────────────────┘ │ │ │
│ │ │ ┌────────────────────┐ │ │ │ │
│ │ │ │ │ m.call.candidates │ │ │ │
│ Element │ │ │ mx event │ │ │ │ Element │
│ App │ │ │ └────────────────────┘ │ ┌────┐ │ App │
│ │ │ ┌────────────────────┐ │ │ │ 3 │ │ │
│ │◀──────────────────┼┐ │ │ m.call.answer │ │ ┌───────┴────┴────────│ │
│ │ │ │ │ mx event │ │ ││ │ │
└─────────────────┘ ││ │ └────────────────────┘ │ │ └─────────────────┘
│ │ │ ┌────────────────────┐ │ ││ ▲
│ │└─────────────────┼──│ m.call.candidates │ │ │ ├────┐
▼ │ │ mx event │◀──┼────────────────┘│ │ 2 │
┌─────────────────┐ │ │ └────────────────────┘ │ ┌────┴────┴───────┐
│ │ └───────────────────────────┘ │ │ │
│ │ │ │ │
│ WebRtc │ │ │ WebRtc │
│ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ┌───┴────────────────┐
│ │ │ │ caller offer │
┌────────┴───────────┐ │ │ └───┬────────────────┘
│ callee answer ├─────┘ ┌───────────────┐ └─────────────────┘
├────────────────────┤ │ Stun / Turn │ ▲
│ callee ice │ ├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ┌────┐ │
│ candidates │ │ │ 1 │ │
└────────────────────┘ │ ├────┴──┴───────┐
│ │ │
│ │ Network Stack │
│◀─────────────────────┤ │
│ │ │
│ └───────────────┘
─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘
┌────┐
│ 1 │ The WebRtc layer gathers information on how it can be reach by the other peer directly (Ice candidates)
└────┘
┌──────────────────────────────────────────────────────────────────┐
│candidate:1 1 tcp 1518149375 127.0.0.1 35990 typ host │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│candidate:2 1 UDP 2130706431 192.168.1.102 1816 typ host │
└──────────────────────────────────────────────────────────────────┘
┌────┐
│ 2 │ The WebRTC layer notifies the App layer when it finds new Ice Candidates
└────┘
┌────┐ The app layer, takes the ice candidates, encapsulate them in one or several matrix event adds the callId and
│ 3 │ send it to the other user via the room
└────┘
┌──────────────┐
│ mx event │
├──────────────┴────────────────────────┐
│ type: m.call.candidates │
│ │
│ +CallId │
│ │
│ ┌──────────────────┐ │
│ │ice candidate sdp │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ice candidate sdp │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ice candidate sdp │ │
│ └──────────────────┘ │
└───────────────────────────────────────┘
╔════════════════════════════════════════════════╗
║ ║
║D] Caller Callee connection ║
║ ║
╚════════════════════════════════════════════════╝
┌───────────────┐
┌─────────────────┐ │ Matrix │ ┌─────────────────┐
│ Caller │ ├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ Callee │
└─────────────────┘ │ └─────────────────┘
┌─────────────────┐ │ ┌─────────────────┐
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
│ Element │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ Element │
│ App │ │ App │
│ │ │ │
│ │ │ │
│ │ │ │
└─────────────────┘ └─────────────────┘
┌───────────────┐
│ Internet │
├───────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌─────────────────┐ │ ┌─────────────────┐
│ │ │ │ │
│ ├───────────────────────────────────────────────────────────────────────────────────┴─────────────────────┤ │
│ WebRtc │█████████████████████████████████████████████████████████████████████████████████████████████████████████│ WebRtc │
┌─────────────┴──────┐ ├────────────────────────────────────────┬──────────────────────────┬───────────────┬─────────────────────┤ ┌─────┴──────────────┐
│ callee answer │ │ │ │ Video / Audio Stream │ │ │ caller offer │
├────────────────────┤ │ └──────────────────────────┘ │ │ ├────────────────────┤
│ callee ice ├──────────┘ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ └───────────┤ caller ice │
│ candidates │ │ candidates │
└────────────────────┘ └────────────────────┘
┌─────────────────────────────────────────────────────┐
│ │░
│ If connection is impossible (firewall), and a turn │░
│server is available, connection could happen through │░
│ a relay │░
│ │░
└─────────────────────────────────────────────────────┘░
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
┌───────────────┐
│ Internet │
└─┬─────────────┴ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
┌─────────────────┐ │ ┌─────────────────┐
│ │ │ ┌─────────────────────────┐ │ │
│ ├───────────────────────────────────────┐│ │ │ │ │
│ WebRtc │███████████████████████████████████████││ │ │ WebRtc │
│ ├───────────────────────────────────────┘│ │ │ │ │
│ │ ┌────────┴─────────────────┐ │ Relay │┌─────────────────────────────────────┤ │
┌───────────────┴────┐ │ │ Video / Audio Stream │ │ ││█████████████████████████████████████│ ┌───────┴────────────┐
│ callee answer ├────────────┘ └────────┬─────────────────┘ │ │└─────────────────────────────────────┴─────────┤ caller offer │
├────────────────────┤ │ │ │ ├────────────────────┤
│ callee ice │ │ │ │ │ caller ice │
│ candidates │ └─────────────────────────┘ │ │ candidates │
└────────────────────┘ │ └────────────────────┘
└ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─

View File

@@ -8,7 +8,7 @@
# The setting is particularly useful for tweaking memory settings.
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536m
org.gradle.jvmargs=-Xmx2048m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects

View File

@@ -1,6 +1,6 @@
#Fri Sep 27 10:10:35 CEST 2019
#Thu Jul 02 12:33:07 CEST 2020
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip

View File

@@ -3,11 +3,11 @@ apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
android {
compileSdkVersion 28
compileSdkVersion 29
defaultConfig {
minSdkVersion 16
targetSdkVersion 28
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
@@ -39,7 +39,10 @@ dependencies {
implementation 'io.reactivex.rxjava2:rxkotlin:2.3.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
// Paging
implementation "androidx.paging:paging-runtime-ktx:2.1.0"
implementation "androidx.paging:paging-runtime-ktx:2.1.2"
// Logging
implementation 'com.jakewharton.timber:timber:4.7.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'

View File

@@ -20,6 +20,7 @@ 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,3 +61,11 @@ private class LiveDataObservable<T>(
fun <T> LiveData<T>.asObservable(): Observable<T> {
return LiveDataObservable(this).observeOn(Schedulers.computation())
}
internal fun <T> Observable<T>.startWithCallable(supplier: () -> T): Observable<T> {
val startObservable = Observable
.fromCallable(supplier)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
return startWith(startObservable)
}

View File

@@ -22,3 +22,9 @@ import io.reactivex.Observable
fun <T : Any> Observable<Optional<T>>.unwrap(): Observable<T> {
return filter { it.hasValue() }.map { it.get() }
}
fun <T : Any, U : Any> Observable<Optional<T>>.mapOptional(fn: (T) -> U?): Observable<Optional<U>> {
return map {
it.map(fn)
}
}

View File

@@ -0,0 +1,54 @@
/*
* 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.rx
import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.util.Cancelable
import io.reactivex.Completable
import io.reactivex.Single
fun <T> singleBuilder(builder: (callback: MatrixCallback<T>) -> Cancelable): Single<T> = Single.create {
val callback: MatrixCallback<T> = object : MatrixCallback<T> {
override fun onSuccess(data: T) {
it.onSuccess(data)
}
override fun onFailure(failure: Throwable) {
it.tryOnError(failure)
}
}
val cancelable = builder(callback)
it.setCancellable {
cancelable.cancel()
}
}
fun <T> completableBuilder(builder: (callback: MatrixCallback<T>) -> Cancelable): Completable = Completable.create {
val callback: MatrixCallback<T> = object : MatrixCallback<T> {
override fun onSuccess(data: T) {
it.onComplete()
}
override fun onFailure(failure: Throwable) {
it.tryOnError(failure)
}
}
val cancelable = builder(callback)
it.setCancellable {
cancelable.cancel()
}
}

View File

@@ -16,33 +16,67 @@
package im.vector.matrix.rx
import android.net.Uri
import im.vector.matrix.android.api.query.QueryStringValue
import im.vector.matrix.android.api.session.events.model.Event
import im.vector.matrix.android.api.session.identity.ThreePid
import im.vector.matrix.android.api.session.room.Room
import im.vector.matrix.android.api.session.room.members.RoomMemberQueryParams
import im.vector.matrix.android.api.session.room.model.EventAnnotationsSummary
import im.vector.matrix.android.api.session.room.model.ReadReceipt
import im.vector.matrix.android.api.session.room.model.RoomHistoryVisibility
import im.vector.matrix.android.api.session.room.model.RoomMemberSummary
import im.vector.matrix.android.api.session.room.model.RoomSummary
import im.vector.matrix.android.api.session.room.notification.RoomNotificationState
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 im.vector.matrix.android.api.util.toOptional
import io.reactivex.Completable
import io.reactivex.Observable
import io.reactivex.Single
class RxRoom(private val room: Room) {
fun liveRoomSummary(): Observable<Optional<RoomSummary>> {
return room.getRoomSummaryLive().asObservable()
return room.getRoomSummaryLive()
.asObservable()
.startWithCallable { room.roomSummary().toOptional() }
}
fun liveRoomMemberIds(): Observable<List<String>> {
return room.getRoomMemberIdsLive().asObservable()
fun liveRoomMembers(queryParams: RoomMemberQueryParams): Observable<List<RoomMemberSummary>> {
return room.getRoomMembersLive(queryParams).asObservable()
.startWithCallable {
room.getRoomMembers(queryParams)
}
}
fun liveAnnotationSummary(eventId: String): Observable<Optional<EventAnnotationsSummary>> {
return room.getEventSummaryLive(eventId).asObservable()
return room.getEventAnnotationsSummaryLive(eventId).asObservable()
.startWithCallable {
room.getEventAnnotationsSummary(eventId).toOptional()
}
}
fun liveTimelineEvent(eventId: String): Observable<Optional<TimelineEvent>> {
return room.getTimeLineEventLive(eventId).asObservable()
.startWithCallable {
room.getTimeLineEvent(eventId).toOptional()
}
}
fun liveStateEvent(eventType: String, stateKey: QueryStringValue): Observable<Optional<Event>> {
return room.getStateEventLive(eventType, stateKey).asObservable()
.startWithCallable {
room.getStateEvent(eventType, stateKey).toOptional()
}
}
fun liveStateEvents(eventTypes: Set<String>): Observable<List<Event>> {
return room.getStateEventsLive(eventTypes).asObservable()
.startWithCallable {
room.getStateEvents(eventTypes)
}
}
fun liveReadMarker(): Observable<Optional<String>> {
@@ -53,12 +87,13 @@ class RxRoom(private val room: Room) {
return room.getMyReadReceiptLive().asObservable()
}
fun loadRoomMembersIfNeeded(): Single<Unit> = Single.create {
room.loadRoomMembersIfNeeded(MatrixCallbackSingle(it)).toSingle(it)
fun loadRoomMembersIfNeeded(): Single<Unit> = singleBuilder {
room.loadRoomMembersIfNeeded(it)
}
fun joinRoom(viaServers: List<String> = emptyList()): Single<Unit> = Single.create {
room.join(viaServers, MatrixCallbackSingle(it)).toSingle(it)
fun joinRoom(reason: String? = null,
viaServers: List<String> = emptyList()): Single<Unit> = singleBuilder {
room.join(reason, viaServers, it)
}
fun liveEventReadReceipts(eventId: String): Observable<List<ReadReceipt>> {
@@ -72,6 +107,38 @@ class RxRoom(private val room: Room) {
fun liveNotificationState(): Observable<RoomNotificationState> {
return room.getLiveRoomNotificationState().asObservable()
}
fun invite(userId: String, reason: String? = null): Completable = completableBuilder<Unit> {
room.invite(userId, reason, it)
}
fun invite3pid(threePid: ThreePid): Completable = completableBuilder<Unit> {
room.invite3pid(threePid, it)
}
fun updateTopic(topic: String): Completable = completableBuilder<Unit> {
room.updateTopic(topic, it)
}
fun updateName(name: String): Completable = completableBuilder<Unit> {
room.updateName(name, it)
}
fun addRoomAlias(alias: String): Completable = completableBuilder<Unit> {
room.addRoomAlias(alias, it)
}
fun updateCanonicalAlias(alias: String): Completable = completableBuilder<Unit> {
room.updateCanonicalAlias(alias, it)
}
fun updateHistoryReadability(readability: RoomHistoryVisibility): Completable = completableBuilder<Unit> {
room.updateHistoryReadability(readability, it)
}
fun updateAvatar(avatarUri: Uri, fileName: String): Completable = completableBuilder<Unit> {
room.updateAvatar(avatarUri, fileName, it)
}
}
fun Room.rx(): RxRoom {

View File

@@ -17,63 +17,196 @@
package im.vector.matrix.rx
import androidx.paging.PagedList
import im.vector.matrix.android.api.extensions.orFalse
import im.vector.matrix.android.api.query.QueryStringValue
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.crypto.crosssigning.KEYBACKUP_SECRET_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.MASTER_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.MXCrossSigningInfo
import im.vector.matrix.android.api.session.crypto.crosssigning.SELF_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.crypto.crosssigning.USER_SIGNING_KEY_SSSS_NAME
import im.vector.matrix.android.api.session.group.GroupSummaryQueryParams
import im.vector.matrix.android.api.session.group.model.GroupSummary
import im.vector.matrix.android.api.session.identity.ThreePid
import im.vector.matrix.android.api.session.pushers.Pusher
import im.vector.matrix.android.api.session.room.RoomSummaryQueryParams
import im.vector.matrix.android.api.session.room.members.ChangeMembershipState
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.session.widgets.model.Widget
import im.vector.matrix.android.api.util.JsonDict
import im.vector.matrix.android.api.util.Optional
import im.vector.matrix.android.api.util.toOptional
import im.vector.matrix.android.internal.crypto.model.CryptoDeviceInfo
import im.vector.matrix.android.internal.crypto.model.rest.DeviceInfo
import im.vector.matrix.android.internal.crypto.store.PrivateKeysInfo
import im.vector.matrix.android.api.session.accountdata.UserAccountDataEvent
import io.reactivex.Observable
import io.reactivex.Single
import io.reactivex.functions.Function3
class RxSession(private val session: Session) {
fun liveRoomSummaries(): Observable<List<RoomSummary>> {
return session.liveRoomSummaries().asObservable()
fun liveRoomSummaries(queryParams: RoomSummaryQueryParams): Observable<List<RoomSummary>> {
return session.getRoomSummariesLive(queryParams).asObservable()
.startWithCallable {
session.getRoomSummaries(queryParams)
}
}
fun liveGroupSummaries(): Observable<List<GroupSummary>> {
return session.liveGroupSummaries().asObservable()
fun liveGroupSummaries(queryParams: GroupSummaryQueryParams): Observable<List<GroupSummary>> {
return session.getGroupSummariesLive(queryParams).asObservable()
.startWithCallable {
session.getGroupSummaries(queryParams)
}
}
fun liveBreadcrumbs(queryParams: RoomSummaryQueryParams): Observable<List<RoomSummary>> {
return session.getBreadcrumbsLive(queryParams).asObservable()
.startWithCallable {
session.getBreadcrumbs(queryParams)
}
}
fun liveMyDeviceInfo(): Observable<List<DeviceInfo>> {
return session.cryptoService().getLiveMyDevicesInfo().asObservable()
.startWithCallable {
session.cryptoService().getMyDevicesInfo()
}
}
fun liveSyncState(): Observable<SyncState> {
return session.syncState().asObservable()
return session.getSyncStateLive().asObservable()
}
fun livePushers(): Observable<List<Pusher>> {
return session.livePushers().asObservable()
return session.getPushersLive().asObservable()
}
fun liveUser(userId: String): Observable<Optional<User>> {
return session.liveUser(userId).asObservable().distinctUntilChanged()
return session.getUserLive(userId).asObservable()
.startWithCallable {
session.getUser(userId).toOptional()
}
}
fun liveUsers(): Observable<List<User>> {
return session.liveUsers().asObservable()
return session.getUsersLive().asObservable()
}
fun liveIgnoredUsers(): Observable<List<User>> {
return session.liveIgnoredUsers().asObservable()
return session.getIgnoredUsersLive().asObservable()
}
fun livePagedUsers(filter: String? = null): Observable<PagedList<User>> {
return session.livePagedUsers(filter).asObservable()
fun livePagedUsers(filter: String? = null, excludedUserIds: Set<String>? = null): Observable<PagedList<User>> {
return session.getPagedUsersLive(filter, excludedUserIds).asObservable()
}
fun createRoom(roomParams: CreateRoomParams): Single<String> = Single.create {
session.createRoom(roomParams, MatrixCallbackSingle(it)).toSingle(it)
fun liveThreePIds(refreshData: Boolean): Observable<List<ThreePid>> {
return session.getThreePidsLive(refreshData).asObservable()
.startWithCallable { session.getThreePids() }
}
fun createRoom(roomParams: CreateRoomParams): Single<String> = singleBuilder {
session.createRoom(roomParams, it)
}
fun searchUsersDirectory(search: String,
limit: Int,
excludedUserIds: Set<String>): Single<List<User>> = Single.create {
session.searchUsersDirectory(search, limit, excludedUserIds, MatrixCallbackSingle(it)).toSingle(it)
excludedUserIds: Set<String>): Single<List<User>> = singleBuilder {
session.searchUsersDirectory(search, limit, excludedUserIds, it)
}
fun joinRoom(roomId: String, viaServers: List<String> = emptyList()): Single<Unit> = Single.create {
session.joinRoom(roomId, viaServers, MatrixCallbackSingle(it)).toSingle(it)
fun joinRoom(roomIdOrAlias: String,
reason: String? = null,
viaServers: List<String> = emptyList()): Single<Unit> = singleBuilder {
session.joinRoom(roomIdOrAlias, reason, viaServers, it)
}
fun getRoomIdByAlias(roomAlias: String,
searchOnServer: Boolean): Single<Optional<String>> = singleBuilder {
session.getRoomIdByAlias(roomAlias, searchOnServer, it)
}
fun getProfileInfo(userId: String): Single<JsonDict> = singleBuilder {
session.getProfile(userId, it)
}
fun liveUserCryptoDevices(userId: String): Observable<List<CryptoDeviceInfo>> {
return session.cryptoService().getLiveCryptoDeviceInfo(userId).asObservable().startWithCallable {
session.cryptoService().getCryptoDeviceInfo(userId)
}
}
fun liveCrossSigningInfo(userId: String): Observable<Optional<MXCrossSigningInfo>> {
return session.cryptoService().crossSigningService().getLiveCrossSigningKeys(userId).asObservable()
.startWithCallable {
session.cryptoService().crossSigningService().getUserCrossSigningKeys(userId).toOptional()
}
}
fun liveCrossSigningPrivateKeys(): Observable<Optional<PrivateKeysInfo>> {
return session.cryptoService().crossSigningService().getLiveCrossSigningPrivateKeys().asObservable()
.startWithCallable {
session.cryptoService().crossSigningService().getCrossSigningPrivateKeys().toOptional()
}
}
fun liveAccountData(types: Set<String>): Observable<List<UserAccountDataEvent>> {
return session.getLiveAccountDataEvents(types).asObservable()
.startWithCallable {
session.getAccountDataEvents(types)
}
}
fun liveRoomWidgets(
roomId: String,
widgetId: QueryStringValue,
widgetTypes: Set<String>? = null,
excludedTypes: Set<String>? = null
): Observable<List<Widget>> {
return session.widgetService().getRoomWidgetsLive(roomId, widgetId, widgetTypes, excludedTypes).asObservable()
.startWithCallable {
session.widgetService().getRoomWidgets(roomId, widgetId, widgetTypes, excludedTypes)
}
}
fun liveRoomChangeMembershipState(): Observable<Map<String, ChangeMembershipState>> {
return session.getChangeMembershipsLive().asObservable()
}
fun liveSecretSynchronisationInfo(): Observable<SecretsSynchronisationInfo> {
return Observable.combineLatest<List<UserAccountDataEvent>, Optional<MXCrossSigningInfo>, Optional<PrivateKeysInfo>, SecretsSynchronisationInfo>(
liveAccountData(setOf(MASTER_KEY_SSSS_NAME, USER_SIGNING_KEY_SSSS_NAME, SELF_SIGNING_KEY_SSSS_NAME, KEYBACKUP_SECRET_SSSS_NAME)),
liveCrossSigningInfo(session.myUserId),
liveCrossSigningPrivateKeys(),
Function3 { _, crossSigningInfo, pInfo ->
// first check if 4S is already setup
val is4SSetup = session.sharedSecretStorageService.isRecoverySetup()
val isCrossSigningEnabled = crossSigningInfo.getOrNull() != null
val isCrossSigningTrusted = crossSigningInfo.getOrNull()?.isTrusted() == true
val allPrivateKeysKnown = pInfo.getOrNull()?.allKnown().orFalse()
val keysBackupService = session.cryptoService().keysBackupService()
val currentBackupVersion = keysBackupService.currentBackupVersion
val megolmBackupAvailable = currentBackupVersion != null
val savedBackupKey = keysBackupService.getKeyBackupRecoveryKeyInfo()
val megolmKeyKnown = savedBackupKey?.version == currentBackupVersion
SecretsSynchronisationInfo(
isBackupSetup = is4SSetup,
isCrossSigningEnabled = isCrossSigningEnabled,
isCrossSigningTrusted = isCrossSigningTrusted,
allPrivateKeysKnown = allPrivateKeysKnown,
megolmBackupAvailable = megolmBackupAvailable,
megolmSecretKnown = megolmKeyKnown,
isMegolmKeyIn4S = session.sharedSecretStorageService.isMegolmKeyInBackup()
)
}
)
.distinctUntilChanged()
}
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (c) 2020 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.rx
data class SecretsSynchronisationInfo(
val isBackupSetup: Boolean,
val isCrossSigningEnabled: Boolean,
val isCrossSigningTrusted: Boolean,
val allPrivateKeysKnown: Boolean,
val megolmBackupAvailable: Boolean,
val megolmSecretKnown: Boolean,
val isMegolmKeyIn4S: Boolean
)

View File

@@ -10,7 +10,7 @@ buildscript {
jcenter()
}
dependencies {
classpath "io.realm:realm-gradle-plugin:5.12.0"
classpath "io.realm:realm-gradle-plugin:6.1.0"
}
}
@@ -19,26 +19,38 @@ androidExtensions {
}
android {
compileSdkVersion 28
compileSdkVersion 29
testOptions.unitTests.includeAndroidResources = true
defaultConfig {
minSdkVersion 16
targetSdkVersion 28
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "0.0.1"
// Multidex is useful for tests
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
buildConfigField "String", "GIT_SDK_REVISION", "\"${gitRevision()}\""
resValue "string", "git_sdk_revision", "\"${gitRevision()}\""
resValue "string", "git_sdk_revision_unix_date", "\"${gitRevisionUnixDate()}\""
resValue "string", "git_sdk_revision_date", "\"${gitRevisionDate()}\""
defaultConfig {
consumerProguardFiles 'proguard-rules.pro'
}
}
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
buildTypes {
debug {
// Set to true to log privacy or sensible data, such as token
buildConfigField "boolean", "LOG_PRIVATE_DATA", project.property("vector.debugPrivateData")
@@ -49,9 +61,6 @@ android {
release {
buildConfigField "boolean", "LOG_PRIVATE_DATA", "false"
buildConfigField "okhttp3.logging.HttpLoggingInterceptor.Level", "OKHTTP_LOGGING_LEVEL", "okhttp3.logging.HttpLoggingInterceptor.Level.NONE"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
@@ -71,10 +80,19 @@ android {
kotlinOptions {
jvmTarget = "1.8"
}
sourceSets {
androidTest {
java.srcDirs += "src/sharedTest/java"
}
test {
java.srcDirs += "src/sharedTest/java"
}
}
}
static def gitRevision() {
def cmd = "git rev-parse --short HEAD"
def cmd = "git rev-parse --short=8 HEAD"
return cmd.execute().text.trim()
}
@@ -92,41 +110,45 @@ dependencies {
def arrow_version = "0.8.2"
def moshi_version = '1.8.0'
def lifecycle_version = '2.1.0'
def lifecycle_version = '2.2.0'
def arch_version = '2.1.0'
def coroutines_version = "1.3.2"
def markwon_version = '3.1.0'
def daggerVersion = '2.24'
def daggerVersion = '2.25.4'
def work_version = '2.3.3'
def retrofit_version = '2.6.2'
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"
implementation "androidx.recyclerview:recyclerview:1.1.0-beta05"
implementation "androidx.core:core-ktx:1.3.0"
implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
// Network
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-moshi:2.6.2'
implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version"
implementation "com.squareup.retrofit2:converter-scalars:$retrofit_version"
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'
implementation 'androidx.exifinterface:exifinterface:1.3.0-alpha01'
implementation 'id.zelory:compressor:3.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.3.0-alpha01"
implementation "androidx.work:work-runtime-ktx:$work_version"
// FP
implementation "io.arrow-kt:arrow-core:$arrow_version"
@@ -148,6 +170,13 @@ dependencies {
// Bus
implementation 'org.greenrobot:eventbus:3.1.1'
// Phone number https://github.com/google/libphonenumber
implementation 'com.googlecode.libphonenumber:libphonenumber:8.10.23'
// Web RTC
// TODO meant for development purposes only. See http://webrtc.github.io/webrtc-org/native-code/android/
implementation 'org.webrtc:google-webrtc:1.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'
@@ -159,7 +188,10 @@ dependencies {
testImplementation 'io.mockk:mockk:1.9.2.kotlin12'
testImplementation 'org.amshove.kluent:kluent-android:1.44'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
// Plant Timber tree for test
testImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1'
kaptAndroidTest "com.google.dagger:dagger-compiler:$daggerVersion"
androidTestImplementation 'androidx.test:core:1.2.0'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test:rules:1.2.0'
@@ -168,7 +200,10 @@ dependencies {
androidTestImplementation 'org.amshove.kluent:kluent-android:1.44'
// Note: version sticks to 1.9.2 due to https://github.com/mockk/mockk/issues/281
androidTestImplementation 'io.mockk:mockk-android:1.9.2.kotlin12'
androidTestImplementation "androidx.arch.core:core-testing:$lifecycle_version"
androidTestImplementation "androidx.arch.core:core-testing:$arch_version"
androidTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutines_version"
// Plant Timber tree for test
androidTestImplementation 'net.lachlanmckee:timber-junit-rule:1.0.1'
androidTestUtil 'androidx.test:orchestrator:1.2.0'
}

View File

@@ -19,3 +19,64 @@
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
### EVENT BUS ###
-keepattributes *Annotation*
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
### MOSHI ###
# JSR 305 annotations are for embedding nullability information.
-dontwarn javax.annotation.**
-keepclasseswithmembers class * {
@com.squareup.moshi.* <methods>;
}
-keep @com.squareup.moshi.JsonQualifier interface *
# Enum field names are used by the integrated EnumJsonAdapter.
# values() is synthesized by the Kotlin compiler and is used by EnumJsonAdapter indirectly
# Annotate enums with @JsonClass(generateAdapter = false) to use them with Moshi.
-keepclassmembers @com.squareup.moshi.JsonClass class * extends java.lang.Enum {
<fields>;
**[] values();
}
-keep class kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoaderImpl
-keepclassmembers class kotlin.Metadata {
public <methods>;
}
### OKHTTP for Android Studio ###
-keep class okhttp3.Headers { *; }
-keep interface okhttp3.Interceptor.* { *; }
### OLM JNI ###
-keep class org.matrix.olm.** { *; }
### Webrtc
-keep class org.webrtc.** { *; }
### Serializable persisted classes
# https://www.guardsquare.com/en/products/proguard/manual/examples#serializable
-keepnames class * implements java.io.Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}

View File

@@ -18,9 +18,15 @@ package im.vector.matrix.android
import android.content.Context
import androidx.test.core.app.ApplicationProvider
import im.vector.matrix.android.test.shared.createTimberTestRule
import org.junit.Rule
import java.io.File
interface InstrumentedTest {
@Rule
fun timberTestRule() = createTimberTestRule()
fun context(): Context {
return ApplicationProvider.getApplicationContext()
}

View File

@@ -18,5 +18,8 @@ package im.vector.matrix.android
import im.vector.matrix.android.internal.util.MatrixCoroutineDispatchers
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.asCoroutineDispatcher
import java.util.concurrent.Executors
internal val testCoroutineDispatchers = MatrixCoroutineDispatchers(Main, Main, Main, Main, Main)
internal val testCoroutineDispatchers = MatrixCoroutineDispatchers(Main, Main, Main, Main,
Executors.newSingleThreadExecutor().asCoroutineDispatcher())

View File

@@ -0,0 +1,61 @@
/*
* Copyright 2020 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.account
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.common.SessionTestParams
import im.vector.matrix.android.common.TestConstants
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.MethodSorters
@RunWith(JUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class AccountCreationTest : InstrumentedTest {
private val commonTestHelper = CommonTestHelper(context())
private val cryptoTestHelper = CryptoTestHelper(commonTestHelper)
@Test
fun createAccountTest() {
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = true))
commonTestHelper.signOutAndClose(session)
}
@Test
fun createAccountAndLoginAgainTest() {
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = true))
// Log again to the same account
val session2 = commonTestHelper.logIntoAccount(session.myUserId, SessionTestParams(withInitialSync = true))
commonTestHelper.signOutAndClose(session)
commonTestHelper.signOutAndClose(session2)
}
@Test
fun simpleE2eTest() {
val res = cryptoTestHelper.doE2ETestWithAliceInARoom()
res.cleanUp(commonTestHelper)
}
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright (c) 2020 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.account
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.failure.isInvalidPassword
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.SessionTestParams
import im.vector.matrix.android.common.TestConstants
import org.amshove.kluent.shouldBeTrue
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.MethodSorters
@RunWith(JUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class ChangePasswordTest : InstrumentedTest {
private val commonTestHelper = CommonTestHelper(context())
companion object {
private const val NEW_PASSWORD = "this is a new password"
}
@Test
fun changePasswordTest() {
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = false))
// Change password
commonTestHelper.doSync<Unit> {
session.changePassword(TestConstants.PASSWORD, NEW_PASSWORD, it)
}
// Try to login with the previous password, it will fail
val throwable = commonTestHelper.logAccountWithError(session.myUserId, TestConstants.PASSWORD)
throwable.isInvalidPassword().shouldBeTrue()
// Try to login with the new password, should work
val session2 = commonTestHelper.logIntoAccount(session.myUserId, NEW_PASSWORD, SessionTestParams(withInitialSync = false))
commonTestHelper.signOutAndClose(session)
commonTestHelper.signOutAndClose(session2)
}
}

View File

@@ -0,0 +1,88 @@
/*
* Copyright (c) 2020 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.account
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.auth.data.LoginFlowResult
import im.vector.matrix.android.api.auth.registration.RegistrationResult
import im.vector.matrix.android.api.failure.Failure
import im.vector.matrix.android.api.failure.MatrixError
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.SessionTestParams
import im.vector.matrix.android.common.TestConstants
import im.vector.matrix.android.common.TestMatrixCallback
import org.junit.Assert.assertTrue
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.junit.runners.MethodSorters
@RunWith(JUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class DeactivateAccountTest : InstrumentedTest {
private val commonTestHelper = CommonTestHelper(context())
@Test
fun deactivateAccountTest() {
val session = commonTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(withInitialSync = false))
// Deactivate the account
commonTestHelper.doSync<Unit> {
session.deactivateAccount(TestConstants.PASSWORD, false, it)
}
// Try to login on the previous account, it will fail (M_USER_DEACTIVATED)
val throwable = commonTestHelper.logAccountWithError(session.myUserId, TestConstants.PASSWORD)
// Test the error
assertTrue(throwable is Failure.ServerError
&& throwable.error.code == MatrixError.M_USER_DEACTIVATED
&& throwable.error.message == "This account has been deactivated")
// Try to create an account with the deactivate account user id, it will fail (M_USER_IN_USE)
val hs = commonTestHelper.createHomeServerConfig()
commonTestHelper.doSync<LoginFlowResult> {
commonTestHelper.matrix.authenticationService.getLoginFlow(hs, it)
}
var accountCreationError: Throwable? = null
commonTestHelper.waitWithLatch {
commonTestHelper.matrix.authenticationService
.getRegistrationWizard()
.createAccount(session.myUserId.substringAfter("@").substringBefore(":"),
TestConstants.PASSWORD,
null,
object : TestMatrixCallback<RegistrationResult>(it, false) {
override fun onFailure(failure: Throwable) {
accountCreationError = failure
super.onFailure(failure)
}
})
}
// Test the error
accountCreationError.let {
assertTrue(it is Failure.ServerError
&& it.error.code == MatrixError.M_USER_IN_USE)
}
// No need to close the session, it has been deactivated
}
}

View File

@@ -0,0 +1,98 @@
/*
* Copyright (c) 2020 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
import android.content.Context
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.work.Configuration
import androidx.work.WorkManager
import com.zhuinden.monarchy.Monarchy
import im.vector.matrix.android.BuildConfig
import im.vector.matrix.android.api.auth.AuthenticationService
import im.vector.matrix.android.common.DaggerTestMatrixComponent
import im.vector.matrix.android.internal.SessionManager
import im.vector.matrix.android.internal.crypto.attachments.ElementToDecrypt
import im.vector.matrix.android.internal.crypto.attachments.MXEncryptedAttachments
import im.vector.matrix.android.internal.network.UserAgentHolder
import im.vector.matrix.android.internal.util.BackgroundDetectionObserver
import org.matrix.olm.OlmManager
import java.io.InputStream
import java.util.concurrent.Executors
import java.util.concurrent.atomic.AtomicBoolean
import javax.inject.Inject
/**
* This is the main entry point to the matrix sdk.
* To get the singleton instance, use getInstance static method.
*/
class Matrix private constructor(context: Context, matrixConfiguration: MatrixConfiguration) {
@Inject internal lateinit var authenticationService: AuthenticationService
@Inject internal lateinit var userAgentHolder: UserAgentHolder
@Inject internal lateinit var backgroundDetectionObserver: BackgroundDetectionObserver
@Inject internal lateinit var olmManager: OlmManager
@Inject internal lateinit var sessionManager: SessionManager
init {
Monarchy.init(context)
DaggerTestMatrixComponent.factory().create(context, matrixConfiguration).inject(this)
if (context.applicationContext !is Configuration.Provider) {
WorkManager.initialize(context, Configuration.Builder().setExecutor(Executors.newCachedThreadPool()).build())
}
ProcessLifecycleOwner.get().lifecycle.addObserver(backgroundDetectionObserver)
}
fun getUserAgent() = userAgentHolder.userAgent
fun authenticationService(): AuthenticationService {
return authenticationService
}
companion object {
private lateinit var instance: Matrix
private val isInit = AtomicBoolean(false)
fun initialize(context: Context, matrixConfiguration: MatrixConfiguration) {
if (isInit.compareAndSet(false, true)) {
instance = Matrix(context.applicationContext, matrixConfiguration)
}
}
fun getInstance(context: Context): Matrix {
if (isInit.compareAndSet(false, true)) {
val appContext = context.applicationContext
if (appContext is MatrixConfiguration.Provider) {
val matrixConfiguration = (appContext as MatrixConfiguration.Provider).providesMatrixConfiguration()
instance = Matrix(appContext, matrixConfiguration)
} else {
throw IllegalStateException("Matrix is not initialized properly." +
" You should call Matrix.initialize or let your application implements MatrixConfiguration.Provider.")
}
}
return instance
}
fun getSdkVersion(): String {
return BuildConfig.VERSION_NAME + " (" + BuildConfig.GIT_SDK_REVISION + ")"
}
fun decryptStream(inputStream: InputStream?, elementToDecrypt: ElementToDecrypt): InputStream? {
return MXEncryptedAttachments.decryptAttachment(inputStream, elementToDecrypt)
}
}
}

View File

@@ -1,60 +0,0 @@
/*
* 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.auth
import androidx.test.annotation.UiThreadTest
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.rule.GrantPermissionRule
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.OkReplayRuleChainNoActivity
import im.vector.matrix.android.api.auth.Authenticator
import okreplay.*
import org.junit.ClassRule
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
internal class AuthenticatorTest : InstrumentedTest {
lateinit var authenticator: Authenticator
lateinit var okReplayInterceptor: OkReplayInterceptor
private val okReplayConfig = OkReplayConfig.Builder()
.tapeRoot(AndroidTapeRoot(
context(), javaClass))
.defaultMode(TapeMode.READ_WRITE) // or TapeMode.READ_ONLY
.sslEnabled(true)
.interceptor(okReplayInterceptor)
.build()
@get:Rule
val testRule = OkReplayRuleChainNoActivity(okReplayConfig).get()
@Test
@UiThreadTest
@OkReplay(tape = "auth", mode = TapeMode.READ_WRITE)
fun auth() {
}
companion object {
@ClassRule
@JvmField
val grantExternalStoragePermissionRule: GrantPermissionRule =
GrantPermissionRule.grant(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
}
}

View File

@@ -0,0 +1,383 @@
/*
* Copyright 2016 OpenMarket Ltd
* Copyright 2018 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.common
import android.content.Context
import android.net.Uri
import androidx.lifecycle.Observer
import im.vector.matrix.android.api.Matrix
import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.MatrixConfiguration
import im.vector.matrix.android.api.auth.data.HomeServerConnectionConfig
import im.vector.matrix.android.api.auth.data.LoginFlowResult
import im.vector.matrix.android.api.auth.registration.RegistrationResult
import im.vector.matrix.android.api.session.Session
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.Room
import im.vector.matrix.android.api.session.room.model.message.MessageContent
import im.vector.matrix.android.api.session.room.send.SendState
import im.vector.matrix.android.api.session.room.timeline.Timeline
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
import im.vector.matrix.android.api.session.room.timeline.TimelineSettings
import im.vector.matrix.android.api.session.sync.SyncState
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertTrue
import java.util.ArrayList
import java.util.UUID
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
/**
* This class exposes methods to be used in common cases
* Registration, login, Sync, Sending messages...
*/
class CommonTestHelper(context: Context) {
val matrix: Matrix
fun getTestInterceptor(session: Session): MockOkHttpInterceptor? = TestNetworkModule.interceptorForSession(session.sessionId) as? MockOkHttpInterceptor
init {
Matrix.initialize(context, MatrixConfiguration("TestFlavor"))
matrix = Matrix.getInstance(context)
}
fun createAccount(userNamePrefix: String, testParams: SessionTestParams): Session {
return createAccount(userNamePrefix, TestConstants.PASSWORD, testParams)
}
fun logIntoAccount(userId: String, testParams: SessionTestParams): Session {
return logIntoAccount(userId, TestConstants.PASSWORD, testParams)
}
/**
* Create a Home server configuration, with Http connection allowed for test
*/
fun createHomeServerConfig(): HomeServerConnectionConfig {
return HomeServerConnectionConfig.Builder()
.withHomeServerUri(Uri.parse(TestConstants.TESTS_HOME_SERVER_URL))
.build()
}
/**
* This methods init the event stream and check for initial sync
*
* @param session the session to sync
*/
fun syncSession(session: Session) {
val lock = CountDownLatch(1)
GlobalScope.launch(Dispatchers.Main) { session.open() }
session.startSync(true)
val syncLiveData = runBlocking(Dispatchers.Main) {
session.getSyncStateLive()
}
val syncObserver = object : Observer<SyncState> {
override fun onChanged(t: SyncState?) {
if (session.hasAlreadySynced()) {
lock.countDown()
syncLiveData.removeObserver(this)
}
}
}
GlobalScope.launch(Dispatchers.Main) { syncLiveData.observeForever(syncObserver) }
await(lock)
}
/**
* Sends text messages in a room
*
* @param room the room where to send the messages
* @param message the message to send
* @param nbOfMessages the number of time the message will be sent
*/
fun sendTextMessage(room: Room, message: String, nbOfMessages: Int): List<TimelineEvent> {
val timeline = room.createTimeline(null, TimelineSettings(10))
val sentEvents = ArrayList<TimelineEvent>(nbOfMessages)
val latch = CountDownLatch(1)
val timelineListener = object : Timeline.Listener {
override fun onTimelineFailure(throwable: Throwable) {
}
override fun onNewTimelineEvents(eventIds: List<String>) {
// noop
}
override fun onTimelineUpdated(snapshot: List<TimelineEvent>) {
val newMessages = snapshot
.filter { it.root.sendState == SendState.SYNCED }
.filter { it.root.getClearType() == EventType.MESSAGE }
.filter { it.root.getClearContent().toModel<MessageContent>()?.body?.startsWith(message) == true }
if (newMessages.size == nbOfMessages) {
sentEvents.addAll(newMessages)
// Remove listener now, if not at the next update sendEvents could change
timeline.removeListener(this)
latch.countDown()
}
}
}
timeline.start()
timeline.addListener(timelineListener)
for (i in 0 until nbOfMessages) {
room.sendTextMessage(message + " #" + (i + 1))
}
// Wait 3 second more per message
await(latch, timeout = TestConstants.timeOutMillis + 3_000L * nbOfMessages)
timeline.dispose()
// Check that all events has been created
assertEquals("Message number do not match $sentEvents", nbOfMessages.toLong(), sentEvents.size.toLong())
return sentEvents
}
// PRIVATE METHODS *****************************************************************************
/**
* Creates a unique account
*
* @param userNamePrefix the user name prefix
* @param password the password
* @param testParams test params about the session
* @return the session associated with the newly created account
*/
private fun createAccount(userNamePrefix: String,
password: String,
testParams: SessionTestParams): Session {
val session = createAccountAndSync(
userNamePrefix + "_" + System.currentTimeMillis() + UUID.randomUUID(),
password,
testParams
)
assertNotNull(session)
return session
}
/**
* Logs into an existing account
*
* @param userId the userId to log in
* @param password the password to log in
* @param testParams test params about the session
* @return the session associated with the existing account
*/
fun logIntoAccount(userId: String,
password: String,
testParams: SessionTestParams): Session {
val session = logAccountAndSync(userId, password, testParams)
assertNotNull(session)
return session
}
/**
* Create an account and a dedicated session
*
* @param userName the account username
* @param password the password
* @param sessionTestParams parameters for the test
*/
private fun createAccountAndSync(userName: String,
password: String,
sessionTestParams: SessionTestParams): Session {
val hs = createHomeServerConfig()
doSync<LoginFlowResult> {
matrix.authenticationService
.getLoginFlow(hs, it)
}
doSync<RegistrationResult> {
matrix.authenticationService
.getRegistrationWizard()
.createAccount(userName, password, null, it)
}
// Preform dummy step
val registrationResult = doSync<RegistrationResult> {
matrix.authenticationService
.getRegistrationWizard()
.dummy(it)
}
assertTrue(registrationResult is RegistrationResult.Success)
val session = (registrationResult as RegistrationResult.Success).session
if (sessionTestParams.withInitialSync) {
syncSession(session)
}
return session
}
/**
* Start an account login
*
* @param userName the account username
* @param password the password
* @param sessionTestParams session test params
*/
private fun logAccountAndSync(userName: String,
password: String,
sessionTestParams: SessionTestParams): Session {
val hs = createHomeServerConfig()
doSync<LoginFlowResult> {
matrix.authenticationService
.getLoginFlow(hs, it)
}
val session = doSync<Session> {
matrix.authenticationService
.getLoginWizard()
.login(userName, password, "myDevice", it)
}
if (sessionTestParams.withInitialSync) {
syncSession(session)
}
return session
}
/**
* Log into the account and expect an error
*
* @param userName the account username
* @param password the password
*/
fun logAccountWithError(userName: String,
password: String): Throwable {
val hs = createHomeServerConfig()
doSync<LoginFlowResult> {
matrix.authenticationService
.getLoginFlow(hs, it)
}
var requestFailure: Throwable? = null
waitWithLatch { latch ->
matrix.authenticationService
.getLoginWizard()
.login(userName, password, "myDevice", object : TestMatrixCallback<Session>(latch, onlySuccessful = false) {
override fun onFailure(failure: Throwable) {
requestFailure = failure
super.onFailure(failure)
}
})
}
assertNotNull(requestFailure)
return requestFailure!!
}
fun createEventListener(latch: CountDownLatch, predicate: (List<TimelineEvent>) -> Boolean): Timeline.Listener {
return object : Timeline.Listener {
override fun onTimelineFailure(throwable: Throwable) {
// noop
}
override fun onNewTimelineEvents(eventIds: List<String>) {
// noop
}
override fun onTimelineUpdated(snapshot: List<TimelineEvent>) {
if (predicate(snapshot)) {
latch.countDown()
}
}
}
}
/**
* Await for a latch and ensure the result is true
*
* @param latch
* @throws InterruptedException
*/
fun await(latch: CountDownLatch, timeout: Long? = TestConstants.timeOutMillis) {
assertTrue(latch.await(timeout ?: TestConstants.timeOutMillis, TimeUnit.MILLISECONDS))
}
fun retryPeriodicallyWithLatch(latch: CountDownLatch, condition: (() -> Boolean)) {
GlobalScope.launch {
while (true) {
delay(1000)
if (condition()) {
latch.countDown()
return@launch
}
}
}
}
fun waitWithLatch(timeout: Long? = TestConstants.timeOutMillis, block: (CountDownLatch) -> Unit) {
val latch = CountDownLatch(1)
block(latch)
await(latch, timeout)
}
// Transform a method with a MatrixCallback to a synchronous method
inline fun <reified T> doSync(block: (MatrixCallback<T>) -> Unit): T {
val lock = CountDownLatch(1)
var result: T? = null
val callback = object : TestMatrixCallback<T>(lock) {
override fun onSuccess(data: T) {
result = data
super.onSuccess(data)
}
}
block.invoke(callback)
await(lock)
assertNotNull(result)
return result!!
}
/**
* Clear all provided sessions
*/
fun Iterable<Session>.signOutAndClose() = forEach { signOutAndClose(it) }
fun signOutAndClose(session: Session) {
doSync<Unit> { session.signOut(true, it) }
session.close()
}
}
fun List<TimelineEvent>.checkSendOrder(baseTextMessage: String, numberOfMessages: Int, startIndex: Int): Boolean {
return drop(startIndex)
.take(numberOfMessages)
.foldRightIndexed(true) { index, timelineEvent, acc ->
val body = timelineEvent.root.content.toModel<MessageContent>()?.body
val currentMessageSuffix = numberOfMessages - index
acc && (body == null || body.startsWith(baseTextMessage) && body.endsWith("#$currentMessageSuffix"))
}
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright 2018 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.common
import im.vector.matrix.android.api.session.Session
data class CryptoTestData(val firstSession: Session,
val roomId: String,
val secondSession: Session? = null,
val thirdSession: Session? = null) {
fun cleanUp(testHelper: CommonTestHelper) {
testHelper.signOutAndClose(firstSession)
secondSession?.let { testHelper.signOutAndClose(it) }
thirdSession?.let { testHelper.signOutAndClose(it) }
}
}

View File

@@ -0,0 +1,424 @@
/*
* Copyright 2018 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.common
import android.os.SystemClock
import android.util.Log
import androidx.lifecycle.Observer
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.crypto.verification.IncomingSasVerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.OutgoingSasVerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.VerificationMethod
import im.vector.matrix.android.api.session.crypto.verification.VerificationTxState
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.toContent
import im.vector.matrix.android.api.session.room.Room
import im.vector.matrix.android.api.session.room.model.Membership
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.room.roomSummaryQueryParams
import im.vector.matrix.android.api.session.room.timeline.Timeline
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
import im.vector.matrix.android.api.session.room.timeline.TimelineSettings
import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM
import im.vector.matrix.android.internal.crypto.MXCRYPTO_ALGORITHM_MEGOLM_BACKUP
import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupAuthData
import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupCreationInfo
import im.vector.matrix.android.internal.crypto.model.rest.UserPasswordAuth
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import java.util.UUID
import java.util.concurrent.CountDownLatch
class CryptoTestHelper(private val mTestHelper: CommonTestHelper) {
private val messagesFromAlice: List<String> = listOf("0 - Hello I'm Alice!", "4 - Go!")
private val messagesFromBob: List<String> = listOf("1 - Hello I'm Bob!", "2 - Isn't life grand?", "3 - Let's go to the opera.")
private val defaultSessionParams = SessionTestParams(true)
/**
* @return alice session
*/
fun doE2ETestWithAliceInARoom(encryptedRoom: Boolean = true): CryptoTestData {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, defaultSessionParams)
val roomId = mTestHelper.doSync<String> {
aliceSession.createRoom(CreateRoomParams().apply { name = "MyRoom" }, it)
}
if (encryptedRoom) {
val room = aliceSession.getRoom(roomId)!!
mTestHelper.doSync<Unit> {
room.enableEncryption(callback = it)
}
}
return CryptoTestData(aliceSession, roomId)
}
/**
* @return alice and bob sessions
*/
fun doE2ETestWithAliceAndBobInARoom(encryptedRoom: Boolean = true): CryptoTestData {
val cryptoTestData = doE2ETestWithAliceInARoom(encryptedRoom)
val aliceSession = cryptoTestData.firstSession
val aliceRoomId = cryptoTestData.roomId
val aliceRoom = aliceSession.getRoom(aliceRoomId)!!
val bobSession = mTestHelper.createAccount(TestConstants.USER_BOB, defaultSessionParams)
val lock1 = CountDownLatch(1)
val bobRoomSummariesLive = runBlocking(Dispatchers.Main) {
bobSession.getRoomSummariesLive(roomSummaryQueryParams { })
}
val newRoomObserver = object : Observer<List<RoomSummary>> {
override fun onChanged(t: List<RoomSummary>?) {
if (t?.isNotEmpty() == true) {
lock1.countDown()
bobRoomSummariesLive.removeObserver(this)
}
}
}
GlobalScope.launch(Dispatchers.Main) {
bobRoomSummariesLive.observeForever(newRoomObserver)
}
mTestHelper.doSync<Unit> {
aliceRoom.invite(bobSession.myUserId, callback = it)
}
mTestHelper.await(lock1)
val lock = CountDownLatch(1)
val roomJoinedObserver = object : Observer<List<RoomSummary>> {
override fun onChanged(t: List<RoomSummary>?) {
if (bobSession.getRoom(aliceRoomId)
?.getRoomMember(aliceSession.myUserId)
?.membership == Membership.JOIN) {
lock.countDown()
bobRoomSummariesLive.removeObserver(this)
}
}
}
GlobalScope.launch(Dispatchers.Main) {
bobRoomSummariesLive.observeForever(roomJoinedObserver)
}
mTestHelper.doSync<Unit> { bobSession.joinRoom(aliceRoomId, callback = it) }
mTestHelper.await(lock)
// Ensure bob can send messages to the room
// val roomFromBobPOV = bobSession.getRoom(aliceRoomId)!!
// assertNotNull(roomFromBobPOV.powerLevels)
// assertTrue(roomFromBobPOV.powerLevels.maySendMessage(bobSession.myUserId))
return CryptoTestData(aliceSession, aliceRoomId, bobSession)
}
/**
* @return Alice, Bob and Sam session
*/
fun doE2ETestWithAliceAndBobAndSamInARoom(): CryptoTestData {
val cryptoTestData = doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val aliceRoomId = cryptoTestData.roomId
val room = aliceSession.getRoom(aliceRoomId)!!
val samSession = createSamAccountAndInviteToTheRoom(room)
// wait the initial sync
SystemClock.sleep(1000)
return CryptoTestData(aliceSession, aliceRoomId, cryptoTestData.secondSession, samSession)
}
/**
* Create Sam account and invite him in the room. He will accept the invitation
* @Return Sam session
*/
fun createSamAccountAndInviteToTheRoom(room: Room): Session {
val samSession = mTestHelper.createAccount(TestConstants.USER_SAM, defaultSessionParams)
mTestHelper.doSync<Unit> {
room.invite(samSession.myUserId, null, it)
}
mTestHelper.doSync<Unit> {
samSession.joinRoom(room.roomId, null, emptyList(), it)
}
return samSession
}
/**
* @return Alice and Bob sessions
*/
fun doE2ETestWithAliceAndBobInARoomWithEncryptedMessages(): CryptoTestData {
val cryptoTestData = doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val aliceRoomId = cryptoTestData.roomId
val bobSession = cryptoTestData.secondSession!!
bobSession.cryptoService().setWarnOnUnknownDevices(false)
aliceSession.cryptoService().setWarnOnUnknownDevices(false)
val roomFromBobPOV = bobSession.getRoom(aliceRoomId)!!
val roomFromAlicePOV = aliceSession.getRoom(aliceRoomId)!!
val lock = CountDownLatch(1)
val bobEventsListener = object : Timeline.Listener {
override fun onTimelineFailure(throwable: Throwable) {
// noop
}
override fun onNewTimelineEvents(eventIds: List<String>) {
// noop
}
override fun onTimelineUpdated(snapshot: List<TimelineEvent>) {
val messages = snapshot.filter { it.root.getClearType() == EventType.MESSAGE }
.groupBy { it.root.senderId!! }
// Alice has sent 2 messages and Bob has sent 3 messages
if (messages[aliceSession.myUserId]?.size == 2 && messages[bobSession.myUserId]?.size == 3) {
lock.countDown()
}
}
}
val bobTimeline = roomFromBobPOV.createTimeline(null, TimelineSettings(20))
bobTimeline.start()
bobTimeline.addListener(bobEventsListener)
// Alice sends a message
roomFromAlicePOV.sendTextMessage(messagesFromAlice[0])
// Bob send 3 messages
roomFromBobPOV.sendTextMessage(messagesFromBob[0])
roomFromBobPOV.sendTextMessage(messagesFromBob[1])
roomFromBobPOV.sendTextMessage(messagesFromBob[2])
// Alice sends a message
roomFromAlicePOV.sendTextMessage(messagesFromAlice[1])
mTestHelper.await(lock)
bobTimeline.removeListener(bobEventsListener)
bobTimeline.dispose()
return cryptoTestData
}
fun checkEncryptedEvent(event: Event, roomId: String, clearMessage: String, senderSession: Session) {
assertEquals(EventType.ENCRYPTED, event.type)
assertNotNull(event.content)
val eventWireContent = event.content.toContent()
assertNotNull(eventWireContent)
assertNull(eventWireContent["body"])
assertEquals(MXCRYPTO_ALGORITHM_MEGOLM, eventWireContent["algorithm"])
assertNotNull(eventWireContent["ciphertext"])
assertNotNull(eventWireContent["session_id"])
assertNotNull(eventWireContent["sender_key"])
assertEquals(senderSession.sessionParams.deviceId, eventWireContent["device_id"])
assertNotNull(event.eventId)
assertEquals(roomId, event.roomId)
assertEquals(EventType.MESSAGE, event.getClearType())
// TODO assertTrue(event.getAge() < 10000)
val eventContent = event.toContent()
assertNotNull(eventContent)
assertEquals(clearMessage, eventContent["body"])
assertEquals(senderSession.myUserId, event.senderId)
}
fun createFakeMegolmBackupAuthData(): MegolmBackupAuthData {
return MegolmBackupAuthData(
publicKey = "abcdefg",
signatures = mapOf("something" to mapOf("ed25519:something" to "hijklmnop"))
)
}
fun createFakeMegolmBackupCreationInfo(): MegolmBackupCreationInfo {
return MegolmBackupCreationInfo(
algorithm = MXCRYPTO_ALGORITHM_MEGOLM_BACKUP,
authData = createFakeMegolmBackupAuthData()
)
}
fun createDM(alice: Session, bob: Session): String {
val roomId = mTestHelper.doSync<String> {
alice.createRoom(
CreateRoomParams().apply {
invitedUserIds.add(bob.myUserId)
setDirectMessage()
enableEncryptionIfInvitedUsersSupportIt = true
},
it
)
}
mTestHelper.waitWithLatch { latch ->
val bobRoomSummariesLive = runBlocking(Dispatchers.Main) {
bob.getRoomSummariesLive(roomSummaryQueryParams { })
}
val newRoomObserver = object : Observer<List<RoomSummary>> {
override fun onChanged(t: List<RoomSummary>?) {
val indexOfFirst = t?.indexOfFirst { it.roomId == roomId } ?: -1
if (indexOfFirst != -1) {
latch.countDown()
bobRoomSummariesLive.removeObserver(this)
}
}
}
GlobalScope.launch(Dispatchers.Main) {
bobRoomSummariesLive.observeForever(newRoomObserver)
}
}
mTestHelper.waitWithLatch { latch ->
val bobRoomSummariesLive = runBlocking(Dispatchers.Main) {
bob.getRoomSummariesLive(roomSummaryQueryParams { })
}
val newRoomObserver = object : Observer<List<RoomSummary>> {
override fun onChanged(t: List<RoomSummary>?) {
if (bob.getRoom(roomId)
?.getRoomMember(bob.myUserId)
?.membership == Membership.JOIN) {
latch.countDown()
bobRoomSummariesLive.removeObserver(this)
}
}
}
GlobalScope.launch(Dispatchers.Main) {
bobRoomSummariesLive.observeForever(newRoomObserver)
}
mTestHelper.doSync<Unit> { bob.joinRoom(roomId, callback = it) }
}
return roomId
}
fun initializeCrossSigning(session: Session) {
mTestHelper.doSync<Unit> {
session.cryptoService().crossSigningService()
.initializeCrossSigning(UserPasswordAuth(
user = session.myUserId,
password = TestConstants.PASSWORD
), it)
}
}
fun verifySASCrossSign(alice: Session, bob: Session, roomId: String) {
assertTrue(alice.cryptoService().crossSigningService().canCrossSign())
assertTrue(bob.cryptoService().crossSigningService().canCrossSign())
val requestID = UUID.randomUUID().toString()
val aliceVerificationService = alice.cryptoService().verificationService()
val bobVerificationService = bob.cryptoService().verificationService()
aliceVerificationService.beginKeyVerificationInDMs(
VerificationMethod.SAS,
requestID,
roomId,
bob.myUserId,
bob.sessionParams.credentials.deviceId!!,
null)
// we should reach SHOW SAS on both
var alicePovTx: OutgoingSasVerificationTransaction? = null
var bobPovTx: IncomingSasVerificationTransaction? = null
// wait for alice to get the ready
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
bobPovTx = bobVerificationService.getExistingTransaction(alice.myUserId, requestID) as? IncomingSasVerificationTransaction
Log.v("TEST", "== bobPovTx is ${alicePovTx?.uxState}")
if (bobPovTx?.state == VerificationTxState.OnStarted) {
bobPovTx?.performAccept()
true
} else {
false
}
}
}
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
alicePovTx = aliceVerificationService.getExistingTransaction(bob.myUserId, requestID) as? OutgoingSasVerificationTransaction
Log.v("TEST", "== alicePovTx is ${alicePovTx?.uxState}")
alicePovTx?.state == VerificationTxState.ShortCodeReady
}
}
// wait for alice to get the ready
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
bobPovTx = bobVerificationService.getExistingTransaction(alice.myUserId, requestID) as? IncomingSasVerificationTransaction
Log.v("TEST", "== bobPovTx is ${alicePovTx?.uxState}")
if (bobPovTx?.state == VerificationTxState.OnStarted) {
bobPovTx?.performAccept()
}
bobPovTx?.state == VerificationTxState.ShortCodeReady
}
}
assertEquals("SAS code do not match", alicePovTx!!.getDecimalCodeRepresentation(), bobPovTx!!.getDecimalCodeRepresentation())
bobPovTx!!.userHasVerifiedShortCode()
alicePovTx!!.userHasVerifiedShortCode()
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
alice.cryptoService().crossSigningService().isUserTrusted(bob.myUserId)
}
}
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
alice.cryptoService().crossSigningService().isUserTrusted(bob.myUserId)
}
}
}
}

View File

@@ -0,0 +1,90 @@
/*
* 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.common
import im.vector.matrix.android.internal.session.TestInterceptor
import okhttp3.Interceptor
import okhttp3.Protocol
import okhttp3.Request
import okhttp3.Response
import okhttp3.ResponseBody.Companion.toResponseBody
import javax.net.ssl.HttpsURLConnection
/**
* Allows to intercept network requests for test purpose by
* - re-writing the response
* - changing the response code (200/404/etc..).
* - Test delays..
*
* Basic usage:
* <code>
* val mockInterceptor = MockOkHttpInterceptor()
* mockInterceptor.addRule(MockOkHttpInterceptor.SimpleRule(".well-known/matrix/client", 200, "{}"))
*
* RestHttpClientFactoryProvider.defaultProvider = RestClientHttpClientFactory(mockInterceptor)
* AutoDiscovery().findClientConfig("matrix.org", <callback>)
* </code>
*/
class MockOkHttpInterceptor : TestInterceptor {
private var rules: ArrayList<Rule> = ArrayList()
fun addRule(rule: Rule) {
rules.add(rule)
}
fun clearRules() {
rules.clear()
}
override var sessionId: String? = null
override fun intercept(chain: Interceptor.Chain): Response {
val originalRequest = chain.request()
rules.forEach { rule ->
if (originalRequest.url.toString().contains(rule.match)) {
rule.process(originalRequest)?.let {
return it
}
}
}
return chain.proceed(originalRequest)
}
abstract class Rule(val match: String) {
abstract fun process(originalRequest: Request): Response?
}
/**
* Simple rule that reply with the given body for any request that matches the match param
*/
class SimpleRule(match: String,
private val code: Int = HttpsURLConnection.HTTP_OK,
private val body: String = "{}") : Rule(match) {
override fun process(originalRequest: Request): Response? {
return Response.Builder()
.protocol(Protocol.HTTP_1_1)
.request(originalRequest)
.message("mocked answer")
.body(body.toResponseBody(null))
.code(code)
.build()
}
}
}

View File

@@ -0,0 +1,19 @@
/*
* Copyright 2018 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.common
data class SessionTestParams @JvmOverloads constructor(val withInitialSync: Boolean = false)

View File

@@ -0,0 +1,75 @@
/*
* Copyright 2018 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.common
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.fail
/**
* Compare two lists and their content
*/
fun assertListEquals(list1: List<Any>?, list2: List<Any>?) {
if (list1 == null) {
assertNull(list2)
} else {
assertNotNull(list2)
assertEquals("List sizes must match", list1.size, list2!!.size)
for (i in list1.indices) {
assertEquals("Elements at index $i are not equal", list1[i], list2[i])
}
}
}
/**
* Compare two maps and their content
*/
fun assertDictEquals(dict1: Map<String, Any>?, dict2: Map<String, Any>?) {
if (dict1 == null) {
assertNull(dict2)
} else {
assertNotNull(dict2)
assertEquals("Map sizes must match", dict1.size, dict2!!.size)
for (i in dict1.keys) {
assertEquals("Values for key $i are not equal", dict1[i], dict2[i])
}
}
}
/**
* Compare two byte arrays content.
* Note that if the arrays have not the same size, it also fails.
*/
fun assertByteArrayNotEqual(a1: ByteArray, a2: ByteArray) {
if (a1.size != a2.size) {
fail("Arrays have not the same size.")
}
for (index in a1.indices) {
if (a1[index] != a2[index]) {
// Difference found!
return
}
}
fail("Arrays are equals.")
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright 2018 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.common
import android.os.Debug
object TestConstants {
const val TESTS_HOME_SERVER_URL = "http://10.0.2.2:8080"
// Time out to use when waiting for server response. 20s
private const val AWAIT_TIME_OUT_MILLIS = 20_000
// Time out to use when waiting for server response, when the debugger is connected. 10 minutes
private const val AWAIT_TIME_OUT_WITH_DEBUGGER_MILLIS = 10 * 60_000
const val USER_ALICE = "Alice"
const val USER_BOB = "Bob"
const val USER_SAM = "Sam"
const val PASSWORD = "password"
val timeOutMillis: Long
get() = if (Debug.isDebuggerConnected()) {
// Wait more
AWAIT_TIME_OUT_WITH_DEBUGGER_MILLIS.toLong()
} else {
AWAIT_TIME_OUT_MILLIS.toLong()
}
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright 2018 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.common
import androidx.annotation.CallSuper
import im.vector.matrix.android.api.MatrixCallback
import org.junit.Assert.fail
import timber.log.Timber
import java.util.concurrent.CountDownLatch
/**
* Simple implementation of MatrixCallback, which count down the CountDownLatch on each API callback
* @param onlySuccessful true to fail if an error occurs. This is the default behavior
* @param <T>
*/
open class TestMatrixCallback<T>(private val countDownLatch: CountDownLatch,
private val onlySuccessful: Boolean = true) : MatrixCallback<T> {
@CallSuper
override fun onSuccess(data: T) {
countDownLatch.countDown()
}
@CallSuper
override fun onFailure(failure: Throwable) {
Timber.e(failure, "TestApiCallback")
if (onlySuccessful) {
fail("onFailure " + failure.localizedMessage)
}
countDownLatch.countDown()
}
}

View File

@@ -0,0 +1,38 @@
/*
* Copyright (c) 2020 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.common
import android.content.Context
import dagger.BindsInstance
import dagger.Component
import im.vector.matrix.android.api.MatrixConfiguration
import im.vector.matrix.android.internal.auth.AuthModule
import im.vector.matrix.android.internal.di.MatrixComponent
import im.vector.matrix.android.internal.di.MatrixModule
import im.vector.matrix.android.internal.di.MatrixScope
import im.vector.matrix.android.internal.di.NetworkModule
@Component(modules = [TestModule::class, MatrixModule::class, NetworkModule::class, AuthModule::class, TestNetworkModule::class])
@MatrixScope
internal interface TestMatrixComponent : MatrixComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context,
@BindsInstance matrixConfiguration: MatrixConfiguration): TestMatrixComponent
}
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (c) 2020 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.common
import dagger.Binds
import dagger.Module
import im.vector.matrix.android.internal.di.MatrixComponent
@Module
internal abstract class TestModule {
@Binds
abstract fun providesMatrixComponent(testMatrixComponent: TestMatrixComponent): MatrixComponent
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright (c) 2020 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.common
import dagger.Module
import dagger.Provides
import im.vector.matrix.android.internal.session.MockHttpInterceptor
import im.vector.matrix.android.internal.session.TestInterceptor
@Module
internal object TestNetworkModule {
val interceptors = ArrayList<TestInterceptor>()
fun interceptorForSession(sessionId: String): TestInterceptor? = interceptors.firstOrNull { it.sessionId == sessionId }
@Provides
@JvmStatic
@MockHttpInterceptor
fun providesTestInterceptor(): TestInterceptor? {
return MockOkHttpInterceptor().also {
interceptors.add(it)
}
}
}

View File

@@ -0,0 +1,148 @@
/*
* 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.internal.crypto
import android.os.MemoryFile
import android.util.Base64
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.internal.crypto.attachments.MXEncryptedAttachments
import im.vector.matrix.android.internal.crypto.model.rest.EncryptedFileInfo
import im.vector.matrix.android.internal.crypto.model.rest.EncryptedFileKey
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotEquals
import org.junit.Assert.assertNotNull
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import java.io.ByteArrayInputStream
import java.io.InputStream
/**
* Unit tests AttachmentEncryptionTest.
*/
@Suppress("SpellCheckingInspection")
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class AttachmentEncryptionTest {
private fun checkDecryption(input: String, encryptedFileInfo: EncryptedFileInfo): String {
val `in` = Base64.decode(input, Base64.DEFAULT)
val inputStream: InputStream
inputStream = if (`in`.isEmpty()) {
ByteArrayInputStream(`in`)
} else {
val memoryFile = MemoryFile("file" + System.currentTimeMillis(), `in`.size)
memoryFile.outputStream.write(`in`)
memoryFile.inputStream
}
val decryptedStream = MXEncryptedAttachments.decryptAttachment(inputStream, encryptedFileInfo)
assertNotNull(decryptedStream)
val buffer = ByteArray(100)
val len = decryptedStream!!.read(buffer)
decryptedStream.close()
return Base64.encodeToString(buffer, 0, len, Base64.DEFAULT).replace("\n".toRegex(), "").replace("=".toRegex(), "")
}
@Test
fun checkDecrypt1() {
val encryptedFileInfo = EncryptedFileInfo(
v = "v2",
hashes = mapOf("sha256" to "47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU"),
key = EncryptedFileKey(
alg = "A256CTR",
k = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
key_ops = listOf("encrypt", "decrypt"),
kty = "oct",
ext = true
),
iv = "AAAAAAAAAAAAAAAAAAAAAA",
url = "dummyUrl"
)
assertEquals("", checkDecryption("", encryptedFileInfo))
}
@Test
fun checkDecrypt2() {
val encryptedFileInfo = EncryptedFileInfo(
v = "v2",
hashes = mapOf("sha256" to "YzF08lARDdOCzJpzuSwsjTNlQc4pHxpdHcXiD/wpK6k"),
key = EncryptedFileKey(
alg = "A256CTR",
k = "__________________________________________8",
key_ops = listOf("encrypt", "decrypt"),
kty = "oct",
ext = true
),
iv = "//////////8AAAAAAAAAAA",
url = "dummyUrl"
)
assertEquals("SGVsbG8sIFdvcmxk", checkDecryption("5xJZTt5cQicm+9f4", encryptedFileInfo))
}
@Test
fun checkDecrypt3() {
val encryptedFileInfo = EncryptedFileInfo(
v = "v2",
hashes = mapOf("sha256" to "IOq7/dHHB+mfHfxlRY5XMeCWEwTPmlf4cJcgrkf6fVU"),
key = EncryptedFileKey(
alg = "A256CTR",
k = "__________________________________________8",
key_ops = listOf("encrypt", "decrypt"),
kty = "oct",
ext = true
),
iv = "//////////8AAAAAAAAAAA",
url = "dummyUrl"
)
assertEquals("YWxwaGFudW1lcmljYWxseWFscGhhbnVtZXJpY2FsbHlhbHBoYW51bWVyaWNhbGx5YWxwaGFudW1lcmljYWxseQ",
checkDecryption("zhtFStAeFx0s+9L/sSQO+WQMtldqYEHqTxMduJrCIpnkyer09kxJJuA4K+adQE4w+7jZe/vR9kIcqj9rOhDR8Q",
encryptedFileInfo))
}
@Test
fun checkDecrypt4() {
val encryptedFileInfo = EncryptedFileInfo(
v = "v2",
hashes = mapOf("sha256" to "LYG/orOViuFwovJpv2YMLSsmVKwLt7pY3f8SYM7KU5E"),
key = EncryptedFileKey(
alg = "A256CTR",
k = "__________________________________________8",
key_ops = listOf("encrypt", "decrypt"),
kty = "oct",
ext = true
),
iv = "/////////////////////w",
url = "dummyUrl"
)
assertNotEquals("YWxwaGFudW1lcmljYWxseWFscGhhbnVtZXJpY2FsbHlhbHBoYW51bWVyaWNhbGx5YWxwaGFudW1lcmljYWxseQ",
checkDecryption("tJVNBVJ/vl36UQt4Y5e5m84bRUrQHhcdLPvS/7EkDvlkDLZXamBB6k8THbiawiKZ5Mnq9PZMSSbgOCvmnUBOMA",
encryptedFileInfo))
}
}

View File

@@ -20,6 +20,8 @@ import im.vector.matrix.android.api.auth.data.Credentials
import im.vector.matrix.android.internal.crypto.store.IMXCryptoStore
import im.vector.matrix.android.internal.crypto.store.db.RealmCryptoStore
import im.vector.matrix.android.internal.crypto.store.db.RealmCryptoStoreModule
import im.vector.matrix.android.internal.crypto.store.db.mapper.CrossSigningKeysMapper
import im.vector.matrix.android.internal.di.MoshiProvider
import io.realm.RealmConfiguration
import kotlin.random.Random
@@ -31,6 +33,7 @@ internal class CryptoStoreHelper {
.name("test.realm")
.modules(RealmCryptoStoreModule())
.build(),
crossSigningKeysMapper = CrossSigningKeysMapper(MoshiProvider.providesMoshi()),
credentials = createCredential())
}

View File

@@ -16,37 +16,50 @@
package im.vector.matrix.android.internal.crypto
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.internal.crypto.model.OlmSessionWrapper
import im.vector.matrix.android.internal.crypto.store.IMXCryptoStore
import org.junit.Assert.*
import io.realm.Realm
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotEquals
import org.junit.Assert.assertNull
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.matrix.olm.OlmAccount
import org.matrix.olm.OlmManager
import org.matrix.olm.OlmSession
private const val DUMMY_DEVICE_KEY = "DeviceKey"
class CryptoStoreTest {
@RunWith(AndroidJUnit4::class)
class CryptoStoreTest : InstrumentedTest {
private val cryptoStoreHelper = CryptoStoreHelper()
@Test
fun test_metadata_realm_ok() {
val cryptoStore: IMXCryptoStore = cryptoStoreHelper.createStore()
assertFalse(cryptoStore.hasData())
cryptoStore.open()
assertEquals("deviceId_sample", cryptoStore.getDeviceId())
assertTrue(cryptoStore.hasData())
// Cleanup
cryptoStore.close()
cryptoStore.deleteStore()
@Before
fun setup() {
Realm.init(context())
}
// @Test
// fun test_metadata_realm_ok() {
// val cryptoStore: IMXCryptoStore = cryptoStoreHelper.createStore()
//
// assertFalse(cryptoStore.hasData())
//
// cryptoStore.open()
//
// assertEquals("deviceId_sample", cryptoStore.getDeviceId())
//
// assertTrue(cryptoStore.hasData())
//
// // Cleanup
// cryptoStore.close()
// cryptoStore.deleteStore()
// }
@Test
fun test_lastSessionUsed() {
// Ensure Olm is initialized

View File

@@ -0,0 +1,208 @@
/*
* Copyright 2018 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.internal.crypto
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Assert.fail
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
/**
* Unit tests ExportEncryptionTest.
*/
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class ExportEncryptionTest {
@Test
fun checkExportError1() {
val password = "password"
val input = "-----"
var failed = false
try {
MXMegolmExportEncryption.decryptMegolmKeyFile(input.toByteArray(charset("UTF-8")), password)
} catch (e: Exception) {
failed = true
}
assertTrue(failed)
}
@Test
fun checkExportError2() {
val password = "password"
val input = "-----BEGIN MEGOLM SESSION DATA-----\n" + "-----"
var failed = false
try {
MXMegolmExportEncryption.decryptMegolmKeyFile(input.toByteArray(charset("UTF-8")), password)
} catch (e: Exception) {
failed = true
}
assertTrue(failed)
}
@Test
fun checkExportError3() {
val password = "password"
val input = "-----BEGIN MEGOLM SESSION DATA-----\n" +
" AXNhbHRzYWx0c2FsdHNhbHSIiIiIiIiIiIiIiIiIiIiIAAAACmIRUW2OjZ3L2l6j9h0lHlV3M2dx\n" +
" cissyYBxjsfsAn\n" +
" -----END MEGOLM SESSION DATA-----"
var failed = false
try {
MXMegolmExportEncryption.decryptMegolmKeyFile(input.toByteArray(charset("UTF-8")), password)
} catch (e: Exception) {
failed = true
}
assertTrue(failed)
}
@Test
fun checkExportDecrypt1() {
val password = "password"
val input = "-----BEGIN MEGOLM SESSION DATA-----\nAXNhbHRzYWx0c2FsdHNhbHSIiIiIiIiIiIiIiIiIiIiIAAAACmIRUW2OjZ3L2l6j9h0lHlV3M2dx\n" + "cissyYBxjsfsAndErh065A8=\n-----END MEGOLM SESSION DATA-----"
val expectedString = "plain"
var decodedString: String? = null
try {
decodedString = MXMegolmExportEncryption.decryptMegolmKeyFile(input.toByteArray(charset("UTF-8")), password)
} catch (e: Exception) {
fail("## checkExportDecrypt1() failed : " + e.message)
}
assertEquals("## checkExportDecrypt1() : expectedString $expectedString -- decodedString $decodedString",
expectedString,
decodedString)
}
@Test
fun checkExportDecrypt2() {
val password = "betterpassword"
val input = "-----BEGIN MEGOLM SESSION DATA-----\nAW1vcmVzYWx0bW9yZXNhbHT//////////wAAAAAAAAAAAAAD6KyBpe1Niv5M5NPm4ZATsJo5nghk\n" + "KYu63a0YQ5DRhUWEKk7CcMkrKnAUiZny\n-----END MEGOLM SESSION DATA-----"
val expectedString = "Hello, World"
var decodedString: String? = null
try {
decodedString = MXMegolmExportEncryption.decryptMegolmKeyFile(input.toByteArray(charset("UTF-8")), password)
} catch (e: Exception) {
fail("## checkExportDecrypt2() failed : " + e.message)
}
assertEquals("## checkExportDecrypt2() : expectedString $expectedString -- decodedString $decodedString",
expectedString,
decodedString)
}
@Test
fun checkExportDecrypt3() {
val password = "SWORDFISH"
val input = "-----BEGIN MEGOLM SESSION DATA-----\nAXllc3NhbHR5Z29vZG5lc3P//////////wAAAAAAAAAAAAAD6OIW+Je7gwvjd4kYrb+49gKCfExw\n" + "MgJBMD4mrhLkmgAngwR1pHjbWXaoGybtiAYr0moQ93GrBQsCzPbvl82rZhaXO3iH5uHo/RCEpOqp\nPgg29363BGR+/Ripq/VCLKGNbw==\n-----END MEGOLM SESSION DATA-----"
val expectedString = "alphanumericallyalphanumericallyalphanumericallyalphanumerically"
var decodedString: String? = null
try {
decodedString = MXMegolmExportEncryption.decryptMegolmKeyFile(input.toByteArray(charset("UTF-8")), password)
} catch (e: Exception) {
fail("## checkExportDecrypt3() failed : " + e.message)
}
assertEquals("## checkExportDecrypt3() : expectedString $expectedString -- decodedString $decodedString",
expectedString,
decodedString)
}
@Test
fun checkExportEncrypt1() {
val password = "password"
val expectedString = "plain"
var decodedString: String? = null
try {
decodedString = MXMegolmExportEncryption
.decryptMegolmKeyFile(MXMegolmExportEncryption.encryptMegolmKeyFile(expectedString, password, 1000), password)
} catch (e: Exception) {
fail("## checkExportEncrypt1() failed : " + e.message)
}
assertEquals("## checkExportEncrypt1() : expectedString $expectedString -- decodedString $decodedString",
expectedString,
decodedString)
}
@Test
fun checkExportEncrypt2() {
val password = "betterpassword"
val expectedString = "Hello, World"
var decodedString: String? = null
try {
decodedString = MXMegolmExportEncryption
.decryptMegolmKeyFile(MXMegolmExportEncryption.encryptMegolmKeyFile(expectedString, password, 1000), password)
} catch (e: Exception) {
fail("## checkExportEncrypt2() failed : " + e.message)
}
assertEquals("## checkExportEncrypt2() : expectedString $expectedString -- decodedString $decodedString",
expectedString,
decodedString)
}
@Test
fun checkExportEncrypt3() {
val password = "SWORDFISH"
val expectedString = "alphanumericallyalphanumericallyalphanumericallyalphanumerically"
var decodedString: String? = null
try {
decodedString = MXMegolmExportEncryption
.decryptMegolmKeyFile(MXMegolmExportEncryption.encryptMegolmKeyFile(expectedString, password, 1000), password)
} catch (e: Exception) {
fail("## checkExportEncrypt3() failed : " + e.message)
}
assertEquals("## checkExportEncrypt3() : expectedString $expectedString -- decodedString $decodedString",
expectedString,
decodedString)
}
@Test
fun checkExportEncrypt4() {
val password = "passwordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpassword" + "passwordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpassword"
val expectedString = "alphanumericallyalphanumericallyalphanumericallyalphanumerically"
var decodedString: String? = null
try {
decodedString = MXMegolmExportEncryption
.decryptMegolmKeyFile(MXMegolmExportEncryption.encryptMegolmKeyFile(expectedString, password, 1000), password)
} catch (e: Exception) {
fail("## checkExportEncrypt4() failed : " + e.message)
}
assertEquals("## checkExportEncrypt4() : expectedString $expectedString -- decodedString $decodedString",
expectedString,
decodedString)
}
}

View File

@@ -0,0 +1,247 @@
/*
* Copyright (c) 2020 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.internal.crypto
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.extensions.tryThis
import im.vector.matrix.android.api.session.crypto.MXCryptoError
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.timeline.Timeline
import im.vector.matrix.android.api.session.room.timeline.TimelineEvent
import im.vector.matrix.android.api.session.room.timeline.TimelineSettings
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.common.TestConstants
import im.vector.matrix.android.internal.crypto.model.OlmSessionWrapper
import im.vector.matrix.android.internal.crypto.model.event.EncryptedEventContent
import im.vector.matrix.android.internal.crypto.model.rest.UserPasswordAuth
import im.vector.matrix.android.internal.crypto.store.db.deserializeFromRealm
import im.vector.matrix.android.internal.crypto.store.db.serializeForRealm
import org.amshove.kluent.shouldBe
import org.junit.Assert
import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import org.matrix.olm.OlmSession
import timber.log.Timber
import java.util.concurrent.CountDownLatch
/**
* Ref:
* - https://github.com/matrix-org/matrix-doc/pull/1719
* - https://matrix.org/docs/spec/client_server/latest#recovering-from-undecryptable-messages
* - https://github.com/matrix-org/matrix-js-sdk/pull/780
* - https://github.com/matrix-org/matrix-ios-sdk/pull/778
* - https://github.com/matrix-org/matrix-ios-sdk/pull/784
*/
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class UnwedgingTest : InstrumentedTest {
private lateinit var messagesReceivedByBob: List<TimelineEvent>
private val mTestHelper = CommonTestHelper(context())
private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)
@Before
fun init() {
messagesReceivedByBob = emptyList()
}
/**
* - Alice & Bob in a e2e room
* - Alice sends a 1st message with a 1st megolm session
* - Store the olm session between A&B devices
* - Alice sends a 2nd message with a 2nd megolm session
* - Simulate Alice using a backup of her OS and make her crypto state like after the first message
* - Alice sends a 3rd message with a 3rd megolm session but a wedged olm session
*
* What Bob must see:
* -> No issue with the 2 first messages
* -> The third event must fail to decrypt at first because Bob the olm session is wedged
* -> This is automatically fixed after SDKs restarted the olm session
*/
@Test
fun testUnwedging() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val aliceRoomId = cryptoTestData.roomId
val bobSession = cryptoTestData.secondSession!!
val aliceCryptoStore = (aliceSession.cryptoService() as DefaultCryptoService).cryptoStoreForTesting
// bobSession.cryptoService().setWarnOnUnknownDevices(false)
// aliceSession.cryptoService().setWarnOnUnknownDevices(false)
val roomFromBobPOV = bobSession.getRoom(aliceRoomId)!!
val roomFromAlicePOV = aliceSession.getRoom(aliceRoomId)!!
val bobTimeline = roomFromBobPOV.createTimeline(null, TimelineSettings(20))
bobTimeline.start()
val bobFinalLatch = CountDownLatch(1)
val bobHasThreeDecryptedEventsListener = object : Timeline.Listener {
override fun onTimelineFailure(throwable: Throwable) {
// noop
}
override fun onNewTimelineEvents(eventIds: List<String>) {
// noop
}
override fun onTimelineUpdated(snapshot: List<TimelineEvent>) {
val decryptedEventReceivedByBob = snapshot.filter { it.root.type == EventType.ENCRYPTED }
Timber.d("Bob can now decrypt ${decryptedEventReceivedByBob.size} messages")
if (decryptedEventReceivedByBob.size == 3) {
if (decryptedEventReceivedByBob[0].root.mCryptoError == MXCryptoError.ErrorType.UNKNOWN_INBOUND_SESSION_ID) {
bobFinalLatch.countDown()
}
}
}
}
bobTimeline.addListener(bobHasThreeDecryptedEventsListener)
var latch = CountDownLatch(1)
var bobEventsListener = createEventListener(latch, 1)
bobTimeline.addListener(bobEventsListener)
messagesReceivedByBob = emptyList()
// - Alice sends a 1st message with a 1st megolm session
roomFromAlicePOV.sendTextMessage("First message")
// Wait for the message to be received by Bob
mTestHelper.await(latch)
bobTimeline.removeListener(bobEventsListener)
messagesReceivedByBob.size shouldBe 1
val firstMessageSession = messagesReceivedByBob[0].root.content.toModel<EncryptedEventContent>()!!.sessionId!!
// - Store the olm session between A&B devices
// Let us pickle our session with bob here so we can later unpickle it
// and wedge our session.
val sessionIdsForBob = aliceCryptoStore.getDeviceSessionIds(bobSession.cryptoService().getMyDevice().identityKey()!!)
sessionIdsForBob!!.size shouldBe 1
val olmSession = aliceCryptoStore.getDeviceSession(sessionIdsForBob.first(), bobSession.cryptoService().getMyDevice().identityKey()!!)!!
val oldSession = serializeForRealm(olmSession.olmSession)
aliceSession.cryptoService().discardOutboundSession(roomFromAlicePOV.roomId)
Thread.sleep(6_000)
latch = CountDownLatch(1)
bobEventsListener = createEventListener(latch, 2)
bobTimeline.addListener(bobEventsListener)
messagesReceivedByBob = emptyList()
Timber.i("## CRYPTO | testUnwedging: Alice sends a 2nd message with a 2nd megolm session")
// - Alice sends a 2nd message with a 2nd megolm session
roomFromAlicePOV.sendTextMessage("Second message")
// Wait for the message to be received by Bob
mTestHelper.await(latch)
bobTimeline.removeListener(bobEventsListener)
messagesReceivedByBob.size shouldBe 2
// Session should have changed
val secondMessageSession = messagesReceivedByBob[0].root.content.toModel<EncryptedEventContent>()!!.sessionId!!
Assert.assertNotEquals(firstMessageSession, secondMessageSession)
// Let us wedge the session now. Set crypto state like after the first message
Timber.i("## CRYPTO | testUnwedging: wedge the session now. Set crypto state like after the first message")
aliceCryptoStore.storeSession(OlmSessionWrapper(deserializeFromRealm<OlmSession>(oldSession)!!), bobSession.cryptoService().getMyDevice().identityKey()!!)
Thread.sleep(6_000)
// Force new session, and key share
aliceSession.cryptoService().discardOutboundSession(roomFromAlicePOV.roomId)
// Wait for the message to be received by Bob
mTestHelper.waitWithLatch {
bobEventsListener = createEventListener(it, 3)
bobTimeline.addListener(bobEventsListener)
messagesReceivedByBob = emptyList()
Timber.i("## CRYPTO | testUnwedging: Alice sends a 3rd message with a 3rd megolm session but a wedged olm session")
// - Alice sends a 3rd message with a 3rd megolm session but a wedged olm session
roomFromAlicePOV.sendTextMessage("Third message")
// Bob should not be able to decrypt, because the session key could not be sent
}
bobTimeline.removeListener(bobEventsListener)
messagesReceivedByBob.size shouldBe 3
val thirdMessageSession = messagesReceivedByBob[0].root.content.toModel<EncryptedEventContent>()!!.sessionId!!
Timber.i("## CRYPTO | testUnwedging: third message session ID $thirdMessageSession")
Assert.assertNotEquals(secondMessageSession, thirdMessageSession)
Assert.assertEquals(EventType.ENCRYPTED, messagesReceivedByBob[0].root.getClearType())
Assert.assertEquals(EventType.MESSAGE, messagesReceivedByBob[1].root.getClearType())
Assert.assertEquals(EventType.MESSAGE, messagesReceivedByBob[2].root.getClearType())
// Bob Should not be able to decrypt last message, because session could not be sent as the olm channel was wedged
mTestHelper.await(bobFinalLatch)
bobTimeline.removeListener(bobHasThreeDecryptedEventsListener)
// It's a trick to force key request on fail to decrypt
mTestHelper.doSync<Unit> {
bobSession.cryptoService().crossSigningService()
.initializeCrossSigning(UserPasswordAuth(
user = bobSession.myUserId,
password = TestConstants.PASSWORD
), it)
}
// Wait until we received back the key
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
// we should get back the key and be able to decrypt
val result = tryThis {
bobSession.cryptoService().decryptEvent(messagesReceivedByBob[0].root, "")
}
Timber.i("## CRYPTO | testUnwedging: decrypt result ${result?.clearEvent}")
result != null
}
}
bobTimeline.dispose()
cryptoTestData.cleanUp(mTestHelper)
}
private fun createEventListener(latch: CountDownLatch, expectedNumberOfMessages: Int): Timeline.Listener {
return object : Timeline.Listener {
override fun onTimelineFailure(throwable: Throwable) {
// noop
}
override fun onNewTimelineEvents(eventIds: List<String>) {
// noop
}
override fun onTimelineUpdated(snapshot: List<TimelineEvent>) {
messagesReceivedByBob = snapshot.filter { it.root.type == EventType.ENCRYPTED }
if (messagesReceivedByBob.size == expectedNumberOfMessages) {
latch.countDown()
}
}
}
}
}

View File

@@ -0,0 +1,38 @@
/*
* Copyright (c) 2020 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.internal.crypto.crosssigning
import org.amshove.kluent.shouldBeNull
import org.amshove.kluent.shouldBeTrue
import org.junit.Test
@Suppress("SpellCheckingInspection")
class ExtensionsKtTest {
@Test
fun testComparingBase64StringWithOrWithoutPadding() {
// Without padding
"NMJyumnhMic".fromBase64().contentEquals("NMJyumnhMic".fromBase64()).shouldBeTrue()
// With padding
"NMJyumnhMic".fromBase64().contentEquals("NMJyumnhMic=".fromBase64()).shouldBeTrue()
}
@Test
fun testBadBase64() {
"===".fromBase64Safe().shouldBeNull()
}
}

View File

@@ -0,0 +1,161 @@
package im.vector.matrix.android.internal.crypto.crosssigning
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.common.SessionTestParams
import im.vector.matrix.android.common.TestConstants
import im.vector.matrix.android.internal.crypto.model.CryptoDeviceInfo
import im.vector.matrix.android.internal.crypto.model.MXUsersDevicesMap
import im.vector.matrix.android.internal.crypto.model.rest.UserPasswordAuth
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Assert.fail
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class XSigningTest : InstrumentedTest {
private val mTestHelper = CommonTestHelper(context())
private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)
@Test
fun test_InitializeAndStoreKeys() {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
mTestHelper.doSync<Unit> {
aliceSession.cryptoService().crossSigningService()
.initializeCrossSigning(UserPasswordAuth(
user = aliceSession.myUserId,
password = TestConstants.PASSWORD
), it)
}
val myCrossSigningKeys = aliceSession.cryptoService().crossSigningService().getMyCrossSigningKeys()
val masterPubKey = myCrossSigningKeys?.masterKey()
assertNotNull("Master key should be stored", masterPubKey?.unpaddedBase64PublicKey)
val selfSigningKey = myCrossSigningKeys?.selfSigningKey()
assertNotNull("SelfSigned key should be stored", selfSigningKey?.unpaddedBase64PublicKey)
val userKey = myCrossSigningKeys?.userKey()
assertNotNull("User key should be stored", userKey?.unpaddedBase64PublicKey)
assertTrue("Signing Keys should be trusted", myCrossSigningKeys?.isTrusted() == true)
assertTrue("Signing Keys should be trusted", aliceSession.cryptoService().crossSigningService().checkUserTrust(aliceSession.myUserId).isVerified())
mTestHelper.signOutAndClose(aliceSession)
}
@Test
fun test_CrossSigningCheckBobSeesTheKeys() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceAuthParams = UserPasswordAuth(
user = aliceSession.myUserId,
password = TestConstants.PASSWORD
)
val bobAuthParams = UserPasswordAuth(
user = bobSession!!.myUserId,
password = TestConstants.PASSWORD
)
mTestHelper.doSync<Unit> { aliceSession.cryptoService().crossSigningService().initializeCrossSigning(aliceAuthParams, it) }
mTestHelper.doSync<Unit> { bobSession.cryptoService().crossSigningService().initializeCrossSigning(bobAuthParams, it) }
// Check that alice can see bob keys
mTestHelper.doSync<MXUsersDevicesMap<CryptoDeviceInfo>> { aliceSession.cryptoService().downloadKeys(listOf(bobSession.myUserId), true, it) }
val bobKeysFromAlicePOV = aliceSession.cryptoService().crossSigningService().getUserCrossSigningKeys(bobSession.myUserId)
assertNotNull("Alice can see bob Master key", bobKeysFromAlicePOV!!.masterKey())
assertNull("Alice should not see bob User key", bobKeysFromAlicePOV.userKey())
assertNotNull("Alice can see bob SelfSigned key", bobKeysFromAlicePOV.selfSigningKey())
assertEquals("Bob keys from alice pov should match", bobKeysFromAlicePOV.masterKey()?.unpaddedBase64PublicKey, bobSession.cryptoService().crossSigningService().getMyCrossSigningKeys()?.masterKey()?.unpaddedBase64PublicKey)
assertEquals("Bob keys from alice pov should match", bobKeysFromAlicePOV.selfSigningKey()?.unpaddedBase64PublicKey, bobSession.cryptoService().crossSigningService().getMyCrossSigningKeys()?.selfSigningKey()?.unpaddedBase64PublicKey)
assertFalse("Bob keys from alice pov should not be trusted", bobKeysFromAlicePOV.isTrusted())
mTestHelper.signOutAndClose(aliceSession)
mTestHelper.signOutAndClose(bobSession)
}
@Test
fun test_CrossSigningTestAliceTrustBobNewDevice() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceAuthParams = UserPasswordAuth(
user = aliceSession.myUserId,
password = TestConstants.PASSWORD
)
val bobAuthParams = UserPasswordAuth(
user = bobSession!!.myUserId,
password = TestConstants.PASSWORD
)
mTestHelper.doSync<Unit> { aliceSession.cryptoService().crossSigningService().initializeCrossSigning(aliceAuthParams, it) }
mTestHelper.doSync<Unit> { bobSession.cryptoService().crossSigningService().initializeCrossSigning(bobAuthParams, it) }
// Check that alice can see bob keys
val bobUserId = bobSession.myUserId
mTestHelper.doSync<MXUsersDevicesMap<CryptoDeviceInfo>> { aliceSession.cryptoService().downloadKeys(listOf(bobUserId), true, it) }
val bobKeysFromAlicePOV = aliceSession.cryptoService().crossSigningService().getUserCrossSigningKeys(bobUserId)
assertTrue("Bob keys from alice pov should not be trusted", bobKeysFromAlicePOV?.isTrusted() == false)
mTestHelper.doSync<Unit> { aliceSession.cryptoService().crossSigningService().trustUser(bobUserId, it) }
// Now bobs logs in on a new device and verifies it
// We will want to test that in alice POV, this new device would be trusted by cross signing
val bobSession2 = mTestHelper.logIntoAccount(bobUserId, SessionTestParams(true))
val bobSecondDeviceId = bobSession2.sessionParams.deviceId!!
// Check that bob first session sees the new login
val data = mTestHelper.doSync<MXUsersDevicesMap<CryptoDeviceInfo>> {
bobSession.cryptoService().downloadKeys(listOf(bobUserId), true, it)
}
if (data.getUserDeviceIds(bobUserId)?.contains(bobSecondDeviceId) == false) {
fail("Bob should see the new device")
}
val bobSecondDevicePOVFirstDevice = bobSession.cryptoService().getDeviceInfo(bobUserId, bobSecondDeviceId)
assertNotNull("Bob Second device should be known and persisted from first", bobSecondDevicePOVFirstDevice)
// Manually mark it as trusted from first session
mTestHelper.doSync<Unit> {
bobSession.cryptoService().crossSigningService().trustDevice(bobSecondDeviceId, it)
}
// Now alice should cross trust bob's second device
val data2 = mTestHelper.doSync<MXUsersDevicesMap<CryptoDeviceInfo>> {
aliceSession.cryptoService().downloadKeys(listOf(bobUserId), true, it)
}
// check that the device is seen
if (data2.getUserDeviceIds(bobUserId)?.contains(bobSecondDeviceId) == false) {
fail("Alice should see the new device")
}
val result = aliceSession.cryptoService().crossSigningService().checkDeviceTrust(bobUserId, bobSecondDeviceId, null)
assertTrue("Bob second device should be trusted from alice POV", result.isCrossSignedVerified())
mTestHelper.signOutAndClose(aliceSession)
mTestHelper.signOutAndClose(bobSession)
mTestHelper.signOutAndClose(bobSession2)
}
}

View File

@@ -0,0 +1,299 @@
/*
* Copyright (c) 2020 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.internal.crypto.gossiping
import android.util.Log
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.session.crypto.verification.IncomingSasVerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.SasVerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.VerificationMethod
import im.vector.matrix.android.api.session.crypto.verification.VerificationService
import im.vector.matrix.android.api.session.crypto.verification.VerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.VerificationTxState
import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.api.session.room.model.RoomDirectoryVisibility
import im.vector.matrix.android.api.session.room.model.create.CreateRoomParams
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.common.SessionTestParams
import im.vector.matrix.android.common.TestConstants
import im.vector.matrix.android.internal.crypto.GossipingRequestState
import im.vector.matrix.android.internal.crypto.OutgoingGossipingRequestState
import im.vector.matrix.android.internal.crypto.crosssigning.DeviceTrustLevel
import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupCreationInfo
import im.vector.matrix.android.internal.crypto.keysbackup.model.rest.KeysVersion
import im.vector.matrix.android.internal.crypto.model.CryptoDeviceInfo
import im.vector.matrix.android.internal.crypto.model.MXUsersDevicesMap
import im.vector.matrix.android.internal.crypto.model.event.EncryptedEventContent
import im.vector.matrix.android.internal.crypto.model.rest.UserPasswordAuth
import junit.framework.TestCase.assertEquals
import junit.framework.TestCase.assertNotNull
import junit.framework.TestCase.assertTrue
import junit.framework.TestCase.fail
import org.junit.Assert
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import java.util.concurrent.CountDownLatch
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class KeyShareTests : InstrumentedTest {
private val mTestHelper = CommonTestHelper(context())
private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)
@Test
fun test_DoNotSelfShareIfNotTrusted() {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
// Create an encrypted room and add a message
val roomId = mTestHelper.doSync<String> {
aliceSession.createRoom(
CreateRoomParams().apply {
visibility = RoomDirectoryVisibility.PRIVATE
enableEncryption()
},
it
)
}
val room = aliceSession.getRoom(roomId)
assertNotNull(room)
Thread.sleep(4_000)
assertTrue(room?.isEncrypted() == true)
val sentEventId = mTestHelper.sendTextMessage(room!!, "My Message", 1).first().eventId
// Open a new sessionx
val aliceSession2 = mTestHelper.logIntoAccount(aliceSession.myUserId, SessionTestParams(true))
val roomSecondSessionPOV = aliceSession2.getRoom(roomId)
val receivedEvent = roomSecondSessionPOV?.getTimeLineEvent(sentEventId)
assertNotNull(receivedEvent)
assert(receivedEvent!!.isEncrypted())
try {
aliceSession2.cryptoService().decryptEvent(receivedEvent.root, "foo")
fail("should fail")
} catch (failure: Throwable) {
}
val outgoingRequestsBefore = aliceSession2.cryptoService().getOutgoingRoomKeyRequests()
// Try to request
aliceSession2.cryptoService().requestRoomKeyForEvent(receivedEvent.root)
val waitLatch = CountDownLatch(1)
val eventMegolmSessionId = receivedEvent.root.content.toModel<EncryptedEventContent>()?.sessionId
var outGoingRequestId: String? = null
mTestHelper.retryPeriodicallyWithLatch(waitLatch) {
aliceSession2.cryptoService().getOutgoingRoomKeyRequests()
.filter { req ->
// filter out request that was known before
!outgoingRequestsBefore.any { req.requestId == it.requestId }
}
.let {
val outgoing = it.firstOrNull { it.sessionId == eventMegolmSessionId }
outGoingRequestId = outgoing?.requestId
outgoing != null
}
}
mTestHelper.await(waitLatch)
Log.v("TEST", "=======> Outgoing requet Id is $outGoingRequestId")
val outgoingRequestAfter = aliceSession2.cryptoService().getOutgoingRoomKeyRequests()
// We should have a new request
Assert.assertTrue(outgoingRequestAfter.size > outgoingRequestsBefore.size)
Assert.assertNotNull(outgoingRequestAfter.first { it.sessionId == eventMegolmSessionId })
// The first session should see an incoming request
// the request should be refused, because the device is not trusted
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
// DEBUG LOGS
aliceSession.cryptoService().getIncomingRoomKeyRequests().let {
Log.v("TEST", "Incoming request Session 1 (looking for $outGoingRequestId)")
Log.v("TEST", "=========================")
it.forEach { keyRequest ->
Log.v("TEST", "[ts${keyRequest.localCreationTimestamp}] requestId ${keyRequest.requestId}, for sessionId ${keyRequest.requestBody?.sessionId} is ${keyRequest.state}")
}
Log.v("TEST", "=========================")
}
val incoming = aliceSession.cryptoService().getIncomingRoomKeyRequests().firstOrNull { it.requestId == outGoingRequestId }
incoming?.state == GossipingRequestState.REJECTED
}
}
try {
aliceSession2.cryptoService().decryptEvent(receivedEvent.root, "foo")
fail("should fail")
} catch (failure: Throwable) {
}
// Mark the device as trusted
aliceSession.cryptoService().setDeviceVerification(DeviceTrustLevel(crossSigningVerified = false, locallyVerified = true), aliceSession.myUserId,
aliceSession2.sessionParams.deviceId ?: "")
// Re request
aliceSession2.cryptoService().reRequestRoomKeyForEvent(receivedEvent.root)
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
aliceSession.cryptoService().getIncomingRoomKeyRequests().let {
Log.v("TEST", "Incoming request Session 1")
Log.v("TEST", "=========================")
it.forEach {
Log.v("TEST", "requestId ${it.requestId}, for sessionId ${it.requestBody?.sessionId} is ${it.state}")
}
Log.v("TEST", "=========================")
it.any { it.requestBody?.sessionId == eventMegolmSessionId && it.state == GossipingRequestState.ACCEPTED }
}
}
}
Thread.sleep(6_000)
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
aliceSession2.cryptoService().getOutgoingRoomKeyRequests().let {
it.any { it.requestBody?.sessionId == eventMegolmSessionId && it.state == OutgoingGossipingRequestState.CANCELLED }
}
}
}
try {
aliceSession2.cryptoService().decryptEvent(receivedEvent.root, "foo")
} catch (failure: Throwable) {
fail("should have been able to decrypt")
}
mTestHelper.signOutAndClose(aliceSession)
mTestHelper.signOutAndClose(aliceSession2)
}
@Test
fun test_ShareSSSSSecret() {
val aliceSession1 = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
mTestHelper.doSync<Unit> {
aliceSession1.cryptoService().crossSigningService()
.initializeCrossSigning(UserPasswordAuth(
user = aliceSession1.myUserId,
password = TestConstants.PASSWORD
), it)
}
// Also bootstrap keybackup on first session
val creationInfo = mTestHelper.doSync<MegolmBackupCreationInfo> {
aliceSession1.cryptoService().keysBackupService().prepareKeysBackupVersion(null, null, it)
}
val version = mTestHelper.doSync<KeysVersion> {
aliceSession1.cryptoService().keysBackupService().createKeysBackupVersion(creationInfo, it)
}
// Save it for gossiping
aliceSession1.cryptoService().keysBackupService().saveBackupRecoveryKey(creationInfo.recoveryKey, version = version.version)
val aliceSession2 = mTestHelper.logIntoAccount(aliceSession1.myUserId, SessionTestParams(true))
val aliceVerificationService1 = aliceSession1.cryptoService().verificationService()
val aliceVerificationService2 = aliceSession2.cryptoService().verificationService()
// force keys download
mTestHelper.doSync<MXUsersDevicesMap<CryptoDeviceInfo>> {
aliceSession1.cryptoService().downloadKeys(listOf(aliceSession1.myUserId), true, it)
}
mTestHelper.doSync<MXUsersDevicesMap<CryptoDeviceInfo>> {
aliceSession2.cryptoService().downloadKeys(listOf(aliceSession2.myUserId), true, it)
}
var session1ShortCode: String? = null
var session2ShortCode: String? = null
aliceVerificationService1.addListener(object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
Log.d("#TEST", "AA: tx incoming?:${tx.isIncoming} state ${tx.state}")
if (tx is SasVerificationTransaction) {
if (tx.state == VerificationTxState.OnStarted) {
(tx as IncomingSasVerificationTransaction).performAccept()
}
if (tx.state == VerificationTxState.ShortCodeReady) {
session1ShortCode = tx.getDecimalCodeRepresentation()
Thread.sleep(500)
tx.userHasVerifiedShortCode()
}
}
}
})
aliceVerificationService2.addListener(object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
Log.d("#TEST", "BB: tx incoming?:${tx.isIncoming} state ${tx.state}")
if (tx is SasVerificationTransaction) {
if (tx.state == VerificationTxState.ShortCodeReady) {
session2ShortCode = tx.getDecimalCodeRepresentation()
Thread.sleep(500)
tx.userHasVerifiedShortCode()
}
}
}
})
val txId = "m.testVerif12"
aliceVerificationService2.beginKeyVerification(VerificationMethod.SAS, aliceSession1.myUserId, aliceSession1.sessionParams.deviceId
?: "", txId)
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
aliceSession1.cryptoService().getDeviceInfo(aliceSession1.myUserId, aliceSession2.sessionParams.deviceId ?: "")?.isVerified == true
}
}
assertNotNull(session1ShortCode)
Log.d("#TEST", "session1ShortCode: $session1ShortCode")
assertNotNull(session2ShortCode)
Log.d("#TEST", "session2ShortCode: $session2ShortCode")
assertEquals(session1ShortCode, session2ShortCode)
// SSK and USK private keys should have been shared
mTestHelper.waitWithLatch(60_000) { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
Log.d("#TEST", "CAN XS :${aliceSession2.cryptoService().crossSigningService().getMyCrossSigningKeys()}")
aliceSession2.cryptoService().crossSigningService().canCrossSign()
}
}
// Test that key backup key has been shared to
mTestHelper.waitWithLatch(60_000) { latch ->
val keysBackupService = aliceSession2.cryptoService().keysBackupService()
mTestHelper.retryPeriodicallyWithLatch(latch) {
Log.d("#TEST", "Recovery :${keysBackupService.getKeyBackupRecoveryKeyInfo()?.recoveryKey}")
keysBackupService.getKeyBackupRecoveryKeyInfo()?.recoveryKey == creationInfo.recoveryKey
}
}
mTestHelper.signOutAndClose(aliceSession1)
mTestHelper.signOutAndClose(aliceSession2)
}
}

View File

@@ -0,0 +1,245 @@
/*
* Copyright (c) 2020 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.internal.crypto.gossiping
import android.util.Log
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.NoOpMatrixCallback
import im.vector.matrix.android.api.extensions.tryThis
import im.vector.matrix.android.api.session.crypto.MXCryptoError
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.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.common.MockOkHttpInterceptor
import im.vector.matrix.android.common.SessionTestParams
import im.vector.matrix.android.common.TestConstants
import im.vector.matrix.android.internal.crypto.model.event.EncryptedEventContent
import im.vector.matrix.android.internal.crypto.model.event.WithHeldCode
import org.junit.Assert
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class WithHeldTests : InstrumentedTest {
private val mTestHelper = CommonTestHelper(context())
private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)
@Test
fun test_WithHeldUnverifiedReason() {
// =============================
// ARRANGE
// =============================
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
val bobSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
// Initialize cross signing on both
mCryptoTestHelper.initializeCrossSigning(aliceSession)
mCryptoTestHelper.initializeCrossSigning(bobSession)
val roomId = mCryptoTestHelper.createDM(aliceSession, bobSession)
mCryptoTestHelper.verifySASCrossSign(aliceSession, bobSession, roomId)
val roomAlicePOV = aliceSession.getRoom(roomId)!!
val bobUnverifiedSession = mTestHelper.logIntoAccount(bobSession.myUserId, SessionTestParams(true))
// =============================
// ACT
// =============================
// Alice decide to not send to unverified sessions
aliceSession.cryptoService().setGlobalBlacklistUnverifiedDevices(true)
val timelineEvent = mTestHelper.sendTextMessage(roomAlicePOV, "Hello Bob", 1).first()
// await for bob unverified session to get the message
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
bobUnverifiedSession.getRoom(roomId)?.getTimeLineEvent(timelineEvent.eventId) != null
}
}
val eventBobPOV = bobUnverifiedSession.getRoom(roomId)?.getTimeLineEvent(timelineEvent.eventId)!!
// =============================
// ASSERT
// =============================
// Bob should not be able to decrypt because the keys is withheld
try {
// .. might need to wait a bit for stability?
bobUnverifiedSession.cryptoService().decryptEvent(eventBobPOV.root, "")
Assert.fail("This session should not be able to decrypt")
} catch (failure: Throwable) {
val type = (failure as MXCryptoError.Base).errorType
val technicalMessage = failure.technicalMessage
Assert.assertEquals("Error should be withheld", MXCryptoError.ErrorType.KEYS_WITHHELD, type)
Assert.assertEquals("Cause should be unverified", WithHeldCode.UNVERIFIED.value, technicalMessage)
}
// enable back sending to unverified
aliceSession.cryptoService().setGlobalBlacklistUnverifiedDevices(false)
val secondEvent = mTestHelper.sendTextMessage(roomAlicePOV, "Verify your device!!", 1).first()
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
val ev = bobUnverifiedSession.getRoom(roomId)?.getTimeLineEvent(secondEvent.eventId)
// wait until it's decrypted
ev?.root?.getClearType() == EventType.MESSAGE
}
}
// Previous message should still be undecryptable (partially withheld session)
try {
// .. might need to wait a bit for stability?
bobUnverifiedSession.cryptoService().decryptEvent(eventBobPOV.root, "")
Assert.fail("This session should not be able to decrypt")
} catch (failure: Throwable) {
val type = (failure as MXCryptoError.Base).errorType
val technicalMessage = failure.technicalMessage
Assert.assertEquals("Error should be withheld", MXCryptoError.ErrorType.KEYS_WITHHELD, type)
Assert.assertEquals("Cause should be unverified", WithHeldCode.UNVERIFIED.value, technicalMessage)
}
mTestHelper.signOutAndClose(aliceSession)
mTestHelper.signOutAndClose(bobSession)
mTestHelper.signOutAndClose(bobUnverifiedSession)
}
@Test
fun test_WithHeldNoOlm() {
val testData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = testData.firstSession
val bobSession = testData.secondSession!!
val aliceInterceptor = mTestHelper.getTestInterceptor(aliceSession)
// Simulate no OTK
aliceInterceptor!!.addRule(MockOkHttpInterceptor.SimpleRule(
"/keys/claim",
200,
"""
{ "one_time_keys" : {} }
"""
))
Log.d("#TEST", "Recovery :${aliceSession.sessionParams.credentials.accessToken}")
val roomAlicePov = aliceSession.getRoom(testData.roomId)!!
val eventId = mTestHelper.sendTextMessage(roomAlicePov, "first message", 1).first().eventId
// await for bob session to get the message
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
bobSession.getRoom(testData.roomId)?.getTimeLineEvent(eventId) != null
}
}
// Previous message should still be undecryptable (partially withheld session)
val eventBobPOV = bobSession.getRoom(testData.roomId)?.getTimeLineEvent(eventId)
try {
// .. might need to wait a bit for stability?
bobSession.cryptoService().decryptEvent(eventBobPOV!!.root, "")
Assert.fail("This session should not be able to decrypt")
} catch (failure: Throwable) {
val type = (failure as MXCryptoError.Base).errorType
val technicalMessage = failure.technicalMessage
Assert.assertEquals("Error should be withheld", MXCryptoError.ErrorType.KEYS_WITHHELD, type)
Assert.assertEquals("Cause should be unverified", WithHeldCode.NO_OLM.value, technicalMessage)
}
// Ensure that alice has marked the session to be shared with bob
val sessionId = eventBobPOV!!.root.content.toModel<EncryptedEventContent>()!!.sessionId!!
val chainIndex = aliceSession.cryptoService().getSharedWithInfo(testData.roomId, sessionId).getObject(bobSession.myUserId, bobSession.sessionParams.credentials.deviceId)
Assert.assertEquals("Alice should have marked bob's device for this session", 0, chainIndex)
// Add a new device for bob
aliceInterceptor.clearRules()
val bobSecondSession = mTestHelper.logIntoAccount(bobSession.myUserId, SessionTestParams(withInitialSync = true))
// send a second message
val secondMessageId = mTestHelper.sendTextMessage(roomAlicePov, "second message", 1).first().eventId
// Check that the
// await for bob SecondSession session to get the message
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
bobSecondSession.getRoom(testData.roomId)?.getTimeLineEvent(secondMessageId) != null
}
}
val chainIndex2 = aliceSession.cryptoService().getSharedWithInfo(testData.roomId, sessionId).getObject(bobSecondSession.myUserId, bobSecondSession.sessionParams.credentials.deviceId)
Assert.assertEquals("Alice should have marked bob's device for this session", 1, chainIndex2)
aliceInterceptor.clearRules()
testData.cleanUp(mTestHelper)
mTestHelper.signOutAndClose(bobSecondSession)
}
@Test
fun test_WithHeldKeyRequest() {
val testData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = testData.firstSession
val bobSession = testData.secondSession!!
val roomAlicePov = aliceSession.getRoom(testData.roomId)!!
val eventId = mTestHelper.sendTextMessage(roomAlicePov, "first message", 1).first().eventId
mTestHelper.signOutAndClose(bobSession)
// Create a new session for bob
val bobSecondSession = mTestHelper.logIntoAccount(bobSession.myUserId, SessionTestParams(true))
// initialize to force request keys if missing
mCryptoTestHelper.initializeCrossSigning(bobSecondSession)
// Trust bob second device from Alice POV
aliceSession.cryptoService().crossSigningService().trustDevice(bobSecondSession.sessionParams.deviceId!!, NoOpMatrixCallback())
bobSecondSession.cryptoService().crossSigningService().trustDevice(aliceSession.sessionParams.deviceId!!, NoOpMatrixCallback())
var sessionId: String? = null
// Check that the
// await for bob SecondSession session to get the message
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
val timeLineEvent = bobSecondSession.getRoom(testData.roomId)?.getTimeLineEvent(eventId)?.also {
// try to decrypt and force key request
tryThis { bobSecondSession.cryptoService().decryptEvent(it.root, "") }
}
sessionId = timeLineEvent?.root?.content?.toModel<EncryptedEventContent>()?.sessionId
timeLineEvent != null
}
}
// Check that bob second session requested the key
mTestHelper.waitWithLatch { latch ->
mTestHelper.retryPeriodicallyWithLatch(latch) {
val wc = bobSecondSession.cryptoService().getWithHeldMegolmSession(roomAlicePov.roomId, sessionId!!)
wc?.code == WithHeldCode.UNAUTHORISED
}
}
}
}

View File

@@ -0,0 +1,180 @@
/*
* 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.internal.crypto.keysbackup
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.listeners.ProgressListener
import im.vector.matrix.android.common.assertByteArrayNotEqual
import org.junit.Assert.assertArrayEquals
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import org.matrix.olm.OlmManager
import org.matrix.olm.OlmPkDecryption
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class KeysBackupPasswordTest : InstrumentedTest {
@Before
fun ensureLibLoaded() {
OlmManager()
}
/**
* Check KeysBackupPassword utilities
*/
@Test
fun passwordConverter_ok() {
val generatePrivateKeyResult = generatePrivateKeyWithPassword(PASSWORD, null)
assertEquals(32, generatePrivateKeyResult.salt.length)
assertEquals(500_000, generatePrivateKeyResult.iterations)
assertEquals(OlmPkDecryption.privateKeyLength(), generatePrivateKeyResult.privateKey.size)
// Reverse operation
val retrievedPrivateKey = retrievePrivateKeyWithPassword(PASSWORD,
generatePrivateKeyResult.salt,
generatePrivateKeyResult.iterations)
assertEquals(OlmPkDecryption.privateKeyLength(), retrievedPrivateKey.size)
assertArrayEquals(generatePrivateKeyResult.privateKey, retrievedPrivateKey)
}
/**
* Check generatePrivateKeyWithPassword progress listener behavior
*/
@Test
fun passwordConverter_progress_ok() {
val progressValues = ArrayList<Int>(101)
var lastTotal = 0
generatePrivateKeyWithPassword(PASSWORD, object : ProgressListener {
override fun onProgress(progress: Int, total: Int) {
if (!progressValues.contains(progress)) {
progressValues.add(progress)
}
lastTotal = total
}
})
assertEquals(100, lastTotal)
// Ensure all values are here
assertEquals(101, progressValues.size)
for (i in 0..100) {
assertTrue(progressValues[i] == i)
}
}
/**
* Check KeysBackupPassword utilities, with bad password
*/
@Test
fun passwordConverter_badPassword_ok() {
val generatePrivateKeyResult = generatePrivateKeyWithPassword(PASSWORD, null)
assertEquals(32, generatePrivateKeyResult.salt.length)
assertEquals(500_000, generatePrivateKeyResult.iterations)
assertEquals(OlmPkDecryption.privateKeyLength(), generatePrivateKeyResult.privateKey.size)
// Reverse operation, with bad password
val retrievedPrivateKey = retrievePrivateKeyWithPassword(BAD_PASSWORD,
generatePrivateKeyResult.salt,
generatePrivateKeyResult.iterations)
assertEquals(OlmPkDecryption.privateKeyLength(), retrievedPrivateKey.size)
assertByteArrayNotEqual(generatePrivateKeyResult.privateKey, retrievedPrivateKey)
}
/**
* Check KeysBackupPassword utilities, with bad password
*/
@Test
fun passwordConverter_badIteration_ok() {
val generatePrivateKeyResult = generatePrivateKeyWithPassword(PASSWORD, null)
assertEquals(32, generatePrivateKeyResult.salt.length)
assertEquals(500_000, generatePrivateKeyResult.iterations)
assertEquals(OlmPkDecryption.privateKeyLength(), generatePrivateKeyResult.privateKey.size)
// Reverse operation, with bad iteration
val retrievedPrivateKey = retrievePrivateKeyWithPassword(PASSWORD,
generatePrivateKeyResult.salt,
500_001)
assertEquals(OlmPkDecryption.privateKeyLength(), retrievedPrivateKey.size)
assertByteArrayNotEqual(generatePrivateKeyResult.privateKey, retrievedPrivateKey)
}
/**
* Check KeysBackupPassword utilities, with bad salt
*/
@Test
fun passwordConverter_badSalt_ok() {
val generatePrivateKeyResult = generatePrivateKeyWithPassword(PASSWORD, null)
assertEquals(32, generatePrivateKeyResult.salt.length)
assertEquals(500_000, generatePrivateKeyResult.iterations)
assertEquals(OlmPkDecryption.privateKeyLength(), generatePrivateKeyResult.privateKey.size)
// Reverse operation, with bad iteration
val retrievedPrivateKey = retrievePrivateKeyWithPassword(PASSWORD,
BAD_SALT,
generatePrivateKeyResult.iterations)
assertEquals(OlmPkDecryption.privateKeyLength(), retrievedPrivateKey.size)
assertByteArrayNotEqual(generatePrivateKeyResult.privateKey, retrievedPrivateKey)
}
/**
* Check [retrievePrivateKeyWithPassword] with data coming from another platform (RiotWeb).
*/
@Test
fun passwordConverter_crossPlatform_ok() {
val password = "This is a passphrase!"
val salt = "TO0lxhQ9aYgGfMsclVWPIAublg8h9Nlu"
val iteration = 500_000
val retrievedPrivateKey = retrievePrivateKeyWithPassword(password, salt, iteration)
assertEquals(OlmPkDecryption.privateKeyLength(), retrievedPrivateKey.size)
// Data from RiotWeb
val privateKeyBytes = byteArrayOf(
116.toByte(), 224.toByte(), 229.toByte(), 224.toByte(), 9.toByte(), 3.toByte(), 178.toByte(), 162.toByte(),
120.toByte(), 23.toByte(), 108.toByte(), 218.toByte(), 22.toByte(), 61.toByte(), 241.toByte(), 200.toByte(),
235.toByte(), 173.toByte(), 236.toByte(), 100.toByte(), 115.toByte(), 247.toByte(), 33.toByte(), 132.toByte(),
195.toByte(), 154.toByte(), 64.toByte(), 158.toByte(), 184.toByte(), 148.toByte(), 20.toByte(), 85.toByte())
assertArrayEquals(privateKeyBytes, retrievedPrivateKey)
}
companion object {
private const val PASSWORD = "password"
private const val BAD_PASSWORD = "passw0rd"
private const val BAD_SALT = "AA0lxhQ9aYgGfMsclVWPIAublg8h9Nlu"
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (c) 2020 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.internal.crypto.keysbackup
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestData
import im.vector.matrix.android.internal.crypto.model.OlmInboundGroupSessionWrapper2
/**
* Data class to store result of [KeysBackupTestHelper.createKeysBackupScenarioWithPassword]
*/
data class KeysBackupScenarioData(val cryptoTestData: CryptoTestData,
val aliceKeys: List<OlmInboundGroupSessionWrapper2>,
val prepareKeysBackupDataResult: PrepareKeysBackupDataResult,
val aliceSession2: Session) {
fun cleanUp(testHelper: CommonTestHelper) {
cryptoTestData.cleanUp(testHelper)
testHelper.signOutAndClose(aliceSession2)
}
}

View File

@@ -0,0 +1,24 @@
/*
* Copyright (c) 2020 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.internal.crypto.keysbackup
import im.vector.matrix.android.common.SessionTestParams
object KeysBackupTestConstants {
val defaultSessionParams = SessionTestParams(withInitialSync = false)
val defaultSessionParamsWithInitialSync = SessionTestParams(withInitialSync = true)
}

View File

@@ -0,0 +1,182 @@
/*
* Copyright (c) 2020 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.internal.crypto.keysbackup
import im.vector.matrix.android.api.listeners.ProgressListener
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupService
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupState
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupStateListener
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.common.assertDictEquals
import im.vector.matrix.android.common.assertListEquals
import im.vector.matrix.android.internal.crypto.MegolmSessionData
import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupCreationInfo
import im.vector.matrix.android.internal.crypto.keysbackup.model.rest.KeysVersion
import org.junit.Assert
import java.util.concurrent.CountDownLatch
class KeysBackupTestHelper(
private val mTestHelper: CommonTestHelper,
private val mCryptoTestHelper: CryptoTestHelper) {
/**
* Common initial condition
* - Do an e2e backup to the homeserver
* - Log Alice on a new device, and wait for its keysBackup object to be ready (in state NotTrusted)
*
* @param password optional password
*/
fun createKeysBackupScenarioWithPassword(password: String?): KeysBackupScenarioData {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoomWithEncryptedMessages()
val cryptoStore = (cryptoTestData.firstSession.cryptoService().keysBackupService() as DefaultKeysBackupService).store
val keysBackup = cryptoTestData.firstSession.cryptoService().keysBackupService()
val stateObserver = StateObserver(keysBackup)
val aliceKeys = cryptoStore.inboundGroupSessionsToBackup(100)
// - Do an e2e backup to the homeserver
val prepareKeysBackupDataResult = prepareAndCreateKeysBackupData(keysBackup, password)
var lastProgress = 0
var lastTotal = 0
mTestHelper.doSync<Unit> {
keysBackup.backupAllGroupSessions(object : ProgressListener {
override fun onProgress(progress: Int, total: Int) {
lastProgress = progress
lastTotal = total
}
}, it)
}
Assert.assertEquals(2, lastProgress)
Assert.assertEquals(2, lastTotal)
val aliceUserId = cryptoTestData.firstSession.myUserId
// - Log Alice on a new device
val aliceSession2 = mTestHelper.logIntoAccount(aliceUserId, KeysBackupTestConstants.defaultSessionParamsWithInitialSync)
// Test check: aliceSession2 has no keys at login
Assert.assertEquals(0, aliceSession2.cryptoService().inboundGroupSessionsCount(false))
// Wait for backup state to be NotTrusted
waitForKeysBackupToBeInState(aliceSession2, KeysBackupState.NotTrusted)
stateObserver.stopAndCheckStates(null)
return KeysBackupScenarioData(cryptoTestData,
aliceKeys,
prepareKeysBackupDataResult,
aliceSession2)
}
fun prepareAndCreateKeysBackupData(keysBackup: KeysBackupService,
password: String? = null): PrepareKeysBackupDataResult {
val stateObserver = StateObserver(keysBackup)
val megolmBackupCreationInfo = mTestHelper.doSync<MegolmBackupCreationInfo> {
keysBackup.prepareKeysBackupVersion(password, null, it)
}
Assert.assertNotNull(megolmBackupCreationInfo)
Assert.assertFalse(keysBackup.isEnabled)
// Create the version
val keysVersion = mTestHelper.doSync<KeysVersion> {
keysBackup.createKeysBackupVersion(megolmBackupCreationInfo, it)
}
Assert.assertNotNull(keysVersion.version)
// Backup must be enable now
Assert.assertTrue(keysBackup.isEnabled)
stateObserver.stopAndCheckStates(null)
return PrepareKeysBackupDataResult(megolmBackupCreationInfo, keysVersion.version!!)
}
/**
* As KeysBackup is doing asynchronous call to update its internal state, this method help to wait for the
* KeysBackup object to be in the specified state
*/
fun waitForKeysBackupToBeInState(session: Session, state: KeysBackupState) {
// If already in the wanted state, return
if (session.cryptoService().keysBackupService().state == state) {
return
}
// Else observe state changes
val latch = CountDownLatch(1)
session.cryptoService().keysBackupService().addListener(object : KeysBackupStateListener {
override fun onStateChange(newState: KeysBackupState) {
if (newState == state) {
session.cryptoService().keysBackupService().removeListener(this)
latch.countDown()
}
}
})
mTestHelper.await(latch)
}
fun assertKeysEquals(keys1: MegolmSessionData?, keys2: MegolmSessionData?) {
Assert.assertNotNull(keys1)
Assert.assertNotNull(keys2)
Assert.assertEquals(keys1?.algorithm, keys2?.algorithm)
Assert.assertEquals(keys1?.roomId, keys2?.roomId)
// No need to compare the shortcut
// assertEquals(keys1?.sender_claimed_ed25519_key, keys2?.sender_claimed_ed25519_key)
Assert.assertEquals(keys1?.senderKey, keys2?.senderKey)
Assert.assertEquals(keys1?.sessionId, keys2?.sessionId)
Assert.assertEquals(keys1?.sessionKey, keys2?.sessionKey)
assertListEquals(keys1?.forwardingCurve25519KeyChain, keys2?.forwardingCurve25519KeyChain)
assertDictEquals(keys1?.senderClaimedKeys, keys2?.senderClaimedKeys)
}
/**
* Common restore success check after [KeysBackupTestHelper.createKeysBackupScenarioWithPassword]:
* - Imported keys number must be correct
* - The new device must have the same count of megolm keys
* - Alice must have the same keys on both devices
*/
fun checkRestoreSuccess(testData: KeysBackupScenarioData,
total: Int,
imported: Int) {
// - Imported keys number must be correct
Assert.assertEquals(testData.aliceKeys.size, total)
Assert.assertEquals(total, imported)
// - The new device must have the same count of megolm keys
Assert.assertEquals(testData.aliceKeys.size, testData.aliceSession2.cryptoService().inboundGroupSessionsCount(false))
// - Alice must have the same keys on both devices
for (aliceKey1 in testData.aliceKeys) {
val aliceKey2 = (testData.aliceSession2.cryptoService().keysBackupService() as DefaultKeysBackupService).store
.getInboundGroupSession(aliceKey1.olmInboundGroupSession!!.sessionIdentifier(), aliceKey1.senderKey!!)
Assert.assertNotNull(aliceKey2)
assertKeysEquals(aliceKey1.exportKeys(), aliceKey2!!.exportKeys())
}
}
}

View File

@@ -0,0 +1,22 @@
/*
* Copyright (c) 2020 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.internal.crypto.keysbackup
import im.vector.matrix.android.internal.crypto.keysbackup.model.MegolmBackupCreationInfo
data class PrepareKeysBackupDataResult(val megolmBackupCreationInfo: MegolmBackupCreationInfo,
val version: String)

View File

@@ -0,0 +1,104 @@
/*
* 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.internal.crypto.keysbackup
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupService
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupState
import im.vector.matrix.android.api.session.crypto.keysbackup.KeysBackupStateListener
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import java.util.concurrent.CountDownLatch
/**
* This class observe the state change of a KeysBackup object and provide a method to check the several state change
* It checks all state transitions and detected forbidden transition
*/
internal class StateObserver(private val keysBackup: KeysBackupService,
private val latch: CountDownLatch? = null,
private val expectedStateChange: Int = -1) : KeysBackupStateListener {
private val allowedStateTransitions = listOf(
KeysBackupState.BackingUp to KeysBackupState.ReadyToBackUp,
KeysBackupState.BackingUp to KeysBackupState.WrongBackUpVersion,
KeysBackupState.CheckingBackUpOnHomeserver to KeysBackupState.Disabled,
KeysBackupState.CheckingBackUpOnHomeserver to KeysBackupState.NotTrusted,
KeysBackupState.CheckingBackUpOnHomeserver to KeysBackupState.ReadyToBackUp,
KeysBackupState.CheckingBackUpOnHomeserver to KeysBackupState.Unknown,
KeysBackupState.CheckingBackUpOnHomeserver to KeysBackupState.WrongBackUpVersion,
KeysBackupState.Disabled to KeysBackupState.Enabling,
KeysBackupState.Enabling to KeysBackupState.Disabled,
KeysBackupState.Enabling to KeysBackupState.ReadyToBackUp,
KeysBackupState.NotTrusted to KeysBackupState.CheckingBackUpOnHomeserver,
// This transition happens when we trust the device
KeysBackupState.NotTrusted to KeysBackupState.ReadyToBackUp,
KeysBackupState.ReadyToBackUp to KeysBackupState.WillBackUp,
KeysBackupState.Unknown to KeysBackupState.CheckingBackUpOnHomeserver,
KeysBackupState.WillBackUp to KeysBackupState.BackingUp,
KeysBackupState.WrongBackUpVersion to KeysBackupState.CheckingBackUpOnHomeserver,
// FIXME These transitions are observed during test, and I'm not sure they should occur. Don't have time to investigate now
KeysBackupState.ReadyToBackUp to KeysBackupState.BackingUp,
KeysBackupState.ReadyToBackUp to KeysBackupState.ReadyToBackUp,
KeysBackupState.WillBackUp to KeysBackupState.ReadyToBackUp,
KeysBackupState.WillBackUp to KeysBackupState.Unknown
)
private val stateList = ArrayList<KeysBackupState>()
private var lastTransitionError: String? = null
init {
keysBackup.addListener(this)
}
// TODO Make expectedStates mandatory to enforce test
fun stopAndCheckStates(expectedStates: List<KeysBackupState>?) {
keysBackup.removeListener(this)
expectedStates?.let {
assertEquals(it.size, stateList.size)
for (i in it.indices) {
assertEquals("The state $i is not correct. states: " + stateList.joinToString(separator = " "), it[i], stateList[i])
}
}
assertNull("states: " + stateList.joinToString(separator = " "), lastTransitionError)
}
override fun onStateChange(newState: KeysBackupState) {
stateList.add(newState)
// Check that state transition is valid
if (stateList.size >= 2
&& !allowedStateTransitions.contains(stateList[stateList.size - 2] to newState)) {
// Forbidden transition detected
lastTransitionError = "Forbidden transition detected from " + stateList[stateList.size - 2] + " to " + newState
}
if (expectedStateChange == stateList.size) {
latch?.countDown()
}
}
}

View File

@@ -0,0 +1,363 @@
/*
* Copyright (c) 2020 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.internal.crypto.ssss
import androidx.lifecycle.Observer
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.MatrixCallback
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.securestorage.EncryptedSecretContent
import im.vector.matrix.android.api.session.securestorage.KeySigner
import im.vector.matrix.android.api.session.securestorage.RawBytesKeySpec
import im.vector.matrix.android.api.session.securestorage.SecretStorageKeyContent
import im.vector.matrix.android.api.session.securestorage.SharedSecretStorageService
import im.vector.matrix.android.api.session.securestorage.SsssKeyCreationInfo
import im.vector.matrix.android.api.util.Optional
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.SessionTestParams
import im.vector.matrix.android.common.TestConstants
import im.vector.matrix.android.common.TestMatrixCallback
import im.vector.matrix.android.internal.crypto.SSSS_ALGORITHM_AES_HMAC_SHA2
import im.vector.matrix.android.internal.crypto.crosssigning.toBase64NoPadding
import im.vector.matrix.android.internal.crypto.secrets.DefaultSharedSecretStorageService
import im.vector.matrix.android.api.session.accountdata.UserAccountDataEvent
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.amshove.kluent.shouldBe
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import java.util.concurrent.CountDownLatch
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class QuadSTests : InstrumentedTest {
private val mTestHelper = CommonTestHelper(context())
private val emptyKeySigner = object : KeySigner {
override fun sign(canonicalJson: String): Map<String, Map<String, String>>? {
return null
}
}
@Test
fun test_Generate4SKey() {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
val quadS = aliceSession.sharedSecretStorageService
val TEST_KEY_ID = "my.test.Key"
mTestHelper.doSync<SsssKeyCreationInfo> {
quadS.generateKey(TEST_KEY_ID, null, "Test Key", emptyKeySigner, it)
}
// Assert Account data is updated
val accountDataLock = CountDownLatch(1)
var accountData: UserAccountDataEvent? = null
val liveAccountData = runBlocking(Dispatchers.Main) {
aliceSession.getLiveAccountDataEvent("${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID")
}
val accountDataObserver = Observer<Optional<UserAccountDataEvent>?> { t ->
if (t?.getOrNull()?.type == "${DefaultSharedSecretStorageService.KEY_ID_BASE}.$TEST_KEY_ID") {
accountData = t.getOrNull()
accountDataLock.countDown()
}
}
GlobalScope.launch(Dispatchers.Main) { liveAccountData.observeForever(accountDataObserver) }
mTestHelper.await(accountDataLock)
assertNotNull("Key should be stored in account data", accountData)
val parsed = SecretStorageKeyContent.fromJson(accountData!!.content)
assertNotNull("Key Content cannot be parsed", parsed)
assertEquals("Unexpected Algorithm", SSSS_ALGORITHM_AES_HMAC_SHA2, parsed!!.algorithm)
assertEquals("Unexpected key name", "Test Key", parsed.name)
assertNull("Key was not generated from passphrase", parsed.passphrase)
// Set as default key
quadS.setDefaultKey(TEST_KEY_ID, object : MatrixCallback<Unit> {})
var defaultKeyAccountData: UserAccountDataEvent? = null
val defaultDataLock = CountDownLatch(1)
val liveDefAccountData = runBlocking(Dispatchers.Main) {
aliceSession.getLiveAccountDataEvent(DefaultSharedSecretStorageService.DEFAULT_KEY_ID)
}
val accountDefDataObserver = Observer<Optional<UserAccountDataEvent>?> { t ->
if (t?.getOrNull()?.type == DefaultSharedSecretStorageService.DEFAULT_KEY_ID) {
defaultKeyAccountData = t.getOrNull()!!
defaultDataLock.countDown()
}
}
GlobalScope.launch(Dispatchers.Main) { liveDefAccountData.observeForever(accountDefDataObserver) }
mTestHelper.await(defaultDataLock)
assertNotNull(defaultKeyAccountData?.content)
assertEquals("Unexpected default key ${defaultKeyAccountData?.content}", TEST_KEY_ID, defaultKeyAccountData?.content?.get("key"))
mTestHelper.signOutAndClose(aliceSession)
}
@Test
fun test_StoreSecret() {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
val keyId = "My.Key"
val info = generatedSecret(aliceSession, keyId, true)
val keySpec = RawBytesKeySpec.fromRecoveryKey(info.recoveryKey)
// Store a secret
val clearSecret = "42".toByteArray().toBase64NoPadding()
mTestHelper.doSync<Unit> {
aliceSession.sharedSecretStorageService.storeSecret(
"secret.of.life",
clearSecret,
listOf(SharedSecretStorageService.KeyRef(null, keySpec)), // default key
it
)
}
val secretAccountData = assertAccountData(aliceSession, "secret.of.life")
val encryptedContent = secretAccountData.content["encrypted"] as? Map<*, *>
assertNotNull("Element should be encrypted", encryptedContent)
assertNotNull("Secret should be encrypted with default key", encryptedContent?.get(keyId))
val secret = EncryptedSecretContent.fromJson(encryptedContent?.get(keyId))
assertNotNull(secret?.ciphertext)
assertNotNull(secret?.mac)
assertNotNull(secret?.initializationVector)
// Try to decrypt??
val decryptedSecret = mTestHelper.doSync<String> {
aliceSession.sharedSecretStorageService.getSecret(
"secret.of.life",
null, // default key
keySpec!!,
it
)
}
assertEquals("Secret mismatch", clearSecret, decryptedSecret)
mTestHelper.signOutAndClose(aliceSession)
}
@Test
fun test_SetDefaultLocalEcho() {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
val quadS = aliceSession.sharedSecretStorageService
val TEST_KEY_ID = "my.test.Key"
mTestHelper.doSync<SsssKeyCreationInfo> {
quadS.generateKey(TEST_KEY_ID, null, "Test Key", emptyKeySigner, it)
}
// Test that we don't need to wait for an account data sync to access directly the keyid from DB
mTestHelper.doSync<Unit> {
quadS.setDefaultKey(TEST_KEY_ID, it)
}
mTestHelper.signOutAndClose(aliceSession)
}
@Test
fun test_StoreSecretWithMultipleKey() {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
val keyId1 = "Key.1"
val key1Info = generatedSecret(aliceSession, keyId1, true)
val keyId2 = "Key2"
val key2Info = generatedSecret(aliceSession, keyId2, true)
val mySecretText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
mTestHelper.doSync<Unit> {
aliceSession.sharedSecretStorageService.storeSecret(
"my.secret",
mySecretText.toByteArray().toBase64NoPadding(),
listOf(
SharedSecretStorageService.KeyRef(keyId1, RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey)),
SharedSecretStorageService.KeyRef(keyId2, RawBytesKeySpec.fromRecoveryKey(key2Info.recoveryKey))
),
it
)
}
val accountDataEvent = aliceSession.getAccountDataEvent("my.secret")
val encryptedContent = accountDataEvent?.content?.get("encrypted") as? Map<*, *>
assertEquals("Content should contains two encryptions", 2, encryptedContent?.keys?.size ?: 0)
assertNotNull(encryptedContent?.get(keyId1))
assertNotNull(encryptedContent?.get(keyId2))
// Assert that can decrypt with both keys
mTestHelper.doSync<String> {
aliceSession.sharedSecretStorageService.getSecret("my.secret",
keyId1,
RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey)!!,
it
)
}
mTestHelper.doSync<String> {
aliceSession.sharedSecretStorageService.getSecret("my.secret",
keyId2,
RawBytesKeySpec.fromRecoveryKey(key2Info.recoveryKey)!!,
it
)
}
mTestHelper.signOutAndClose(aliceSession)
}
@Test
fun test_GetSecretWithBadPassphrase() {
val aliceSession = mTestHelper.createAccount(TestConstants.USER_ALICE, SessionTestParams(true))
val keyId1 = "Key.1"
val passphrase = "The good pass phrase"
val key1Info = generatedSecretFromPassphrase(aliceSession, passphrase, keyId1, true)
val mySecretText = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
mTestHelper.doSync<Unit> {
aliceSession.sharedSecretStorageService.storeSecret(
"my.secret",
mySecretText.toByteArray().toBase64NoPadding(),
listOf(SharedSecretStorageService.KeyRef(keyId1, RawBytesKeySpec.fromRecoveryKey(key1Info.recoveryKey))),
it
)
}
val decryptCountDownLatch = CountDownLatch(1)
var error = false
aliceSession.sharedSecretStorageService.getSecret("my.secret",
keyId1,
RawBytesKeySpec.fromPassphrase(
"A bad passphrase",
key1Info.content?.passphrase?.salt ?: "",
key1Info.content?.passphrase?.iterations ?: 0,
null),
object : MatrixCallback<String> {
override fun onSuccess(data: String) {
decryptCountDownLatch.countDown()
}
override fun onFailure(failure: Throwable) {
error = true
decryptCountDownLatch.countDown()
}
}
)
mTestHelper.await(decryptCountDownLatch)
error shouldBe true
// Now try with correct key
mTestHelper.doSync<String> {
aliceSession.sharedSecretStorageService.getSecret("my.secret",
keyId1,
RawBytesKeySpec.fromPassphrase(
passphrase,
key1Info.content?.passphrase?.salt ?: "",
key1Info.content?.passphrase?.iterations ?: 0,
null),
it
)
}
mTestHelper.signOutAndClose(aliceSession)
}
private fun assertAccountData(session: Session, type: String): UserAccountDataEvent {
val accountDataLock = CountDownLatch(1)
var accountData: UserAccountDataEvent? = null
val liveAccountData = runBlocking(Dispatchers.Main) {
session.getLiveAccountDataEvent(type)
}
val accountDataObserver = Observer<Optional<UserAccountDataEvent>?> { t ->
if (t?.getOrNull()?.type == type) {
accountData = t.getOrNull()
accountDataLock.countDown()
}
}
GlobalScope.launch(Dispatchers.Main) { liveAccountData.observeForever(accountDataObserver) }
mTestHelper.await(accountDataLock)
assertNotNull("Account Data type:$type should be found", accountData)
return accountData!!
}
private fun generatedSecret(session: Session, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
val quadS = session.sharedSecretStorageService
val creationInfo = mTestHelper.doSync<SsssKeyCreationInfo> {
quadS.generateKey(keyId, null, keyId, emptyKeySigner, it)
}
assertAccountData(session, "${DefaultSharedSecretStorageService.KEY_ID_BASE}.$keyId")
if (asDefault) {
mTestHelper.doSync<Unit> {
quadS.setDefaultKey(keyId, it)
}
assertAccountData(session, DefaultSharedSecretStorageService.DEFAULT_KEY_ID)
}
return creationInfo
}
private fun generatedSecretFromPassphrase(session: Session, passphrase: String, keyId: String, asDefault: Boolean = true): SsssKeyCreationInfo {
val quadS = session.sharedSecretStorageService
val creationInfo = mTestHelper.doSync<SsssKeyCreationInfo> {
quadS.generateKeyWithPassphrase(
keyId,
keyId,
passphrase,
emptyKeySigner,
null,
it)
}
assertAccountData(session, "${DefaultSharedSecretStorageService.KEY_ID_BASE}.$keyId")
if (asDefault) {
val setDefaultLatch = CountDownLatch(1)
quadS.setDefaultKey(keyId, TestMatrixCallback(setDefaultLatch))
mTestHelper.await(setDefaultLatch)
assertAccountData(session, DefaultSharedSecretStorageService.DEFAULT_KEY_ID)
}
return creationInfo
}
}

View File

@@ -0,0 +1,629 @@
/*
* 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.internal.crypto.verification
import android.util.Log
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.session.Session
import im.vector.matrix.android.api.session.crypto.verification.CancelCode
import im.vector.matrix.android.api.session.crypto.verification.IncomingSasVerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.OutgoingSasVerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.SasMode
import im.vector.matrix.android.api.session.crypto.verification.SasVerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.VerificationMethod
import im.vector.matrix.android.api.session.crypto.verification.VerificationService
import im.vector.matrix.android.api.session.crypto.verification.VerificationTransaction
import im.vector.matrix.android.api.session.crypto.verification.VerificationTxState
import im.vector.matrix.android.api.session.events.model.Event
import im.vector.matrix.android.api.session.events.model.toModel
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.internal.crypto.model.CryptoDeviceInfo
import im.vector.matrix.android.internal.crypto.model.MXUsersDevicesMap
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationCancel
import im.vector.matrix.android.internal.crypto.model.rest.KeyVerificationStart
import im.vector.matrix.android.internal.crypto.model.rest.toValue
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Assert.fail
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import java.util.concurrent.CountDownLatch
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class SASTest : InstrumentedTest {
private val mTestHelper = CommonTestHelper(context())
private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)
@Test
fun test_aliceStartThenAliceCancel() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceVerificationService = aliceSession.cryptoService().verificationService()
val bobVerificationService = bobSession!!.cryptoService().verificationService()
val bobTxCreatedLatch = CountDownLatch(1)
val bobListener = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
bobTxCreatedLatch.countDown()
}
}
bobVerificationService.addListener(bobListener)
val txID = aliceVerificationService.beginKeyVerification(VerificationMethod.SAS,
bobSession.myUserId,
bobSession.cryptoService().getMyDevice().deviceId,
null)
assertNotNull("Alice should have a started transaction", txID)
val aliceKeyTx = aliceVerificationService.getExistingTransaction(bobSession.myUserId, txID!!)
assertNotNull("Alice should have a started transaction", aliceKeyTx)
mTestHelper.await(bobTxCreatedLatch)
bobVerificationService.removeListener(bobListener)
val bobKeyTx = bobVerificationService.getExistingTransaction(aliceSession.myUserId, txID)
assertNotNull("Bob should have started verif transaction", bobKeyTx)
assertTrue(bobKeyTx is SASDefaultVerificationTransaction)
assertNotNull("Bob should have starting a SAS transaction", bobKeyTx)
assertTrue(aliceKeyTx is SASDefaultVerificationTransaction)
assertEquals("Alice and Bob have same transaction id", aliceKeyTx!!.transactionId, bobKeyTx!!.transactionId)
val aliceSasTx = aliceKeyTx as SASDefaultVerificationTransaction?
val bobSasTx = bobKeyTx as SASDefaultVerificationTransaction?
assertEquals("Alice state should be started", VerificationTxState.Started, aliceSasTx!!.state)
assertEquals("Bob state should be started by alice", VerificationTxState.OnStarted, bobSasTx!!.state)
// Let's cancel from alice side
val cancelLatch = CountDownLatch(1)
val bobListener2 = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
if (tx.transactionId == txID) {
val immutableState = (tx as SASDefaultVerificationTransaction).state
if (immutableState is VerificationTxState.Cancelled && !immutableState.byMe) {
cancelLatch.countDown()
}
}
}
}
bobVerificationService.addListener(bobListener2)
aliceSasTx.cancel(CancelCode.User)
mTestHelper.await(cancelLatch)
assertTrue("Should be cancelled on alice side", aliceSasTx.state is VerificationTxState.Cancelled)
assertTrue("Should be cancelled on bob side", bobSasTx.state is VerificationTxState.Cancelled)
val aliceCancelState = aliceSasTx.state as VerificationTxState.Cancelled
val bobCancelState = bobSasTx.state as VerificationTxState.Cancelled
assertTrue("Should be cancelled by me on alice side", aliceCancelState.byMe)
assertFalse("Should be cancelled by other on bob side", bobCancelState.byMe)
assertEquals("Should be User cancelled on alice side", CancelCode.User, aliceCancelState.cancelCode)
assertEquals("Should be User cancelled on bob side", CancelCode.User, bobCancelState.cancelCode)
assertNull(bobVerificationService.getExistingTransaction(aliceSession.myUserId, txID))
assertNull(aliceVerificationService.getExistingTransaction(bobSession.myUserId, txID))
cryptoTestData.cleanUp(mTestHelper)
}
@Test
fun test_key_agreement_protocols_must_include_curve25519() {
fail("Not passing for the moment")
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val bobSession = cryptoTestData.secondSession!!
val protocols = listOf("meh_dont_know")
val tid = "00000000"
// Bob should receive a cancel
var cancelReason: CancelCode? = null
val cancelLatch = CountDownLatch(1)
val bobListener = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
if (tx.transactionId == tid && tx.state is VerificationTxState.Cancelled) {
cancelReason = (tx.state as VerificationTxState.Cancelled).cancelCode
cancelLatch.countDown()
}
}
}
bobSession.cryptoService().verificationService().addListener(bobListener)
// TODO bobSession!!.dataHandler.addListener(object : MXEventListener() {
// TODO override fun onToDeviceEvent(event: Event?) {
// TODO if (event!!.getType() == CryptoEvent.EVENT_TYPE_KEY_VERIFICATION_CANCEL) {
// TODO if (event.contentAsJsonObject?.get("transaction_id")?.asString == tid) {
// TODO canceledToDeviceEvent = event
// TODO cancelLatch.countDown()
// TODO }
// TODO }
// TODO }
// TODO })
val aliceSession = cryptoTestData.firstSession
val aliceUserID = aliceSession.myUserId
val aliceDevice = aliceSession.cryptoService().getMyDevice().deviceId
val aliceListener = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
if ((tx as IncomingSasVerificationTransaction).uxState === IncomingSasVerificationTransaction.UxState.SHOW_ACCEPT) {
(tx as IncomingSasVerificationTransaction).performAccept()
}
}
}
aliceSession.cryptoService().verificationService().addListener(aliceListener)
fakeBobStart(bobSession, aliceUserID, aliceDevice, tid, protocols = protocols)
mTestHelper.await(cancelLatch)
assertEquals("Request should be cancelled with m.unknown_method", CancelCode.UnknownMethod, cancelReason)
cryptoTestData.cleanUp(mTestHelper)
}
@Test
fun test_key_agreement_macs_Must_include_hmac_sha256() {
fail("Not passing for the moment")
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val bobSession = cryptoTestData.secondSession!!
val mac = listOf("shaBit")
val tid = "00000000"
// Bob should receive a cancel
var canceledToDeviceEvent: Event? = null
val cancelLatch = CountDownLatch(1)
// TODO bobSession!!.dataHandler.addListener(object : MXEventListener() {
// TODO override fun onToDeviceEvent(event: Event?) {
// TODO if (event!!.getType() == CryptoEvent.EVENT_TYPE_KEY_VERIFICATION_CANCEL) {
// TODO if (event.contentAsJsonObject?.get("transaction_id")?.asString == tid) {
// TODO canceledToDeviceEvent = event
// TODO cancelLatch.countDown()
// TODO }
// TODO }
// TODO }
// TODO })
val aliceSession = cryptoTestData.firstSession
val aliceUserID = aliceSession.myUserId
val aliceDevice = aliceSession.cryptoService().getMyDevice().deviceId
fakeBobStart(bobSession, aliceUserID, aliceDevice, tid, mac = mac)
mTestHelper.await(cancelLatch)
val cancelReq = canceledToDeviceEvent!!.content.toModel<KeyVerificationCancel>()!!
assertEquals("Request should be cancelled with m.unknown_method", CancelCode.UnknownMethod.value, cancelReq.code)
cryptoTestData.cleanUp(mTestHelper)
}
@Test
fun test_key_agreement_short_code_include_decimal() {
fail("Not passing for the moment")
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val bobSession = cryptoTestData.secondSession!!
val codes = listOf("bin", "foo", "bar")
val tid = "00000000"
// Bob should receive a cancel
var canceledToDeviceEvent: Event? = null
val cancelLatch = CountDownLatch(1)
// TODO bobSession!!.dataHandler.addListener(object : MXEventListener() {
// TODO override fun onToDeviceEvent(event: Event?) {
// TODO if (event!!.getType() == CryptoEvent.EVENT_TYPE_KEY_VERIFICATION_CANCEL) {
// TODO if (event.contentAsJsonObject?.get("transaction_id")?.asString == tid) {
// TODO canceledToDeviceEvent = event
// TODO cancelLatch.countDown()
// TODO }
// TODO }
// TODO }
// TODO })
val aliceSession = cryptoTestData.firstSession
val aliceUserID = aliceSession.myUserId
val aliceDevice = aliceSession.cryptoService().getMyDevice().deviceId
fakeBobStart(bobSession, aliceUserID, aliceDevice, tid, codes = codes)
mTestHelper.await(cancelLatch)
val cancelReq = canceledToDeviceEvent!!.content.toModel<KeyVerificationCancel>()!!
assertEquals("Request should be cancelled with m.unknown_method", CancelCode.UnknownMethod.value, cancelReq.code)
cryptoTestData.cleanUp(mTestHelper)
}
private fun fakeBobStart(bobSession: Session,
aliceUserID: String?,
aliceDevice: String?,
tid: String,
protocols: List<String> = SASDefaultVerificationTransaction.KNOWN_AGREEMENT_PROTOCOLS,
hashes: List<String> = SASDefaultVerificationTransaction.KNOWN_HASHES,
mac: List<String> = SASDefaultVerificationTransaction.KNOWN_MACS,
codes: List<String> = SASDefaultVerificationTransaction.KNOWN_SHORT_CODES) {
val startMessage = KeyVerificationStart(
fromDevice = bobSession.cryptoService().getMyDevice().deviceId,
method = VerificationMethod.SAS.toValue(),
transactionId = tid,
keyAgreementProtocols = protocols,
hashes = hashes,
messageAuthenticationCodes = mac,
shortAuthenticationStrings = codes
)
val contentMap = MXUsersDevicesMap<Any>()
contentMap.setObject(aliceUserID, aliceDevice, startMessage)
// TODO val sendLatch = CountDownLatch(1)
// TODO bobSession.cryptoRestClient.sendToDevice(
// TODO EventType.KEY_VERIFICATION_START,
// TODO contentMap,
// TODO tid,
// TODO TestMatrixCallback<Void>(sendLatch)
// TODO )
}
// any two devices may only have at most one key verification in flight at a time.
// If a device has two verifications in progress with the same device, then it should cancel both verifications.
@Test
fun test_aliceStartTwoRequests() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceVerificationService = aliceSession.cryptoService().verificationService()
val aliceCreatedLatch = CountDownLatch(2)
val aliceCancelledLatch = CountDownLatch(2)
val createdTx = mutableListOf<SASDefaultVerificationTransaction>()
val aliceListener = object : VerificationService.Listener {
override fun transactionCreated(tx: VerificationTransaction) {
createdTx.add(tx as SASDefaultVerificationTransaction)
aliceCreatedLatch.countDown()
}
override fun transactionUpdated(tx: VerificationTransaction) {
if ((tx as SASDefaultVerificationTransaction).state is VerificationTxState.Cancelled && !(tx.state as VerificationTxState.Cancelled).byMe) {
aliceCancelledLatch.countDown()
}
}
}
aliceVerificationService.addListener(aliceListener)
val bobUserId = bobSession!!.myUserId
val bobDeviceId = bobSession.cryptoService().getMyDevice().deviceId
aliceVerificationService.beginKeyVerification(VerificationMethod.SAS, bobUserId, bobDeviceId, null)
aliceVerificationService.beginKeyVerification(VerificationMethod.SAS, bobUserId, bobDeviceId, null)
mTestHelper.await(aliceCreatedLatch)
mTestHelper.await(aliceCancelledLatch)
cryptoTestData.cleanUp(mTestHelper)
}
/**
* Test that when alice starts a 'correct' request, bob agrees.
*/
@Test
fun test_aliceAndBobAgreement() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceVerificationService = aliceSession.cryptoService().verificationService()
val bobVerificationService = bobSession!!.cryptoService().verificationService()
var accepted: ValidVerificationInfoAccept? = null
var startReq: ValidVerificationInfoStart.SasVerificationInfoStart? = null
val aliceAcceptedLatch = CountDownLatch(1)
val aliceListener = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
Log.v("TEST", "== aliceTx state ${tx.state} => ${(tx as? OutgoingSasVerificationTransaction)?.uxState}")
if ((tx as SASDefaultVerificationTransaction).state === VerificationTxState.OnAccepted) {
val at = tx as SASDefaultVerificationTransaction
accepted = at.accepted
startReq = at.startReq
aliceAcceptedLatch.countDown()
}
}
}
aliceVerificationService.addListener(aliceListener)
val bobListener = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
Log.v("TEST", "== bobTx state ${tx.state} => ${(tx as? IncomingSasVerificationTransaction)?.uxState}")
if ((tx as IncomingSasVerificationTransaction).uxState === IncomingSasVerificationTransaction.UxState.SHOW_ACCEPT) {
bobVerificationService.removeListener(this)
val at = tx as IncomingSasVerificationTransaction
at.performAccept()
}
}
}
bobVerificationService.addListener(bobListener)
val bobUserId = bobSession.myUserId
val bobDeviceId = bobSession.cryptoService().getMyDevice().deviceId
aliceVerificationService.beginKeyVerification(VerificationMethod.SAS, bobUserId, bobDeviceId, null)
mTestHelper.await(aliceAcceptedLatch)
assertTrue("Should have receive a commitment", accepted!!.commitment?.trim()?.isEmpty() == false)
// check that agreement is valid
assertTrue("Agreed Protocol should be Valid", accepted != null)
assertTrue("Agreed Protocol should be known by alice", startReq!!.keyAgreementProtocols.contains(accepted!!.keyAgreementProtocol))
assertTrue("Hash should be known by alice", startReq!!.hashes.contains(accepted!!.hash))
assertTrue("Hash should be known by alice", startReq!!.messageAuthenticationCodes.contains(accepted!!.messageAuthenticationCode))
accepted!!.shortAuthenticationStrings.forEach {
assertTrue("all agreed Short Code should be known by alice", startReq!!.shortAuthenticationStrings.contains(it))
}
cryptoTestData.cleanUp(mTestHelper)
}
@Test
fun test_aliceAndBobSASCode() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceVerificationService = aliceSession.cryptoService().verificationService()
val bobVerificationService = bobSession!!.cryptoService().verificationService()
val aliceSASLatch = CountDownLatch(1)
val aliceListener = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
val uxState = (tx as OutgoingSasVerificationTransaction).uxState
when (uxState) {
OutgoingSasVerificationTransaction.UxState.SHOW_SAS -> {
aliceSASLatch.countDown()
}
else -> Unit
}
}
}
aliceVerificationService.addListener(aliceListener)
val bobSASLatch = CountDownLatch(1)
val bobListener = object : VerificationService.Listener {
override fun transactionUpdated(tx: VerificationTransaction) {
val uxState = (tx as IncomingSasVerificationTransaction).uxState
when (uxState) {
IncomingSasVerificationTransaction.UxState.SHOW_ACCEPT -> {
tx.performAccept()
}
else -> Unit
}
if (uxState === IncomingSasVerificationTransaction.UxState.SHOW_SAS) {
bobSASLatch.countDown()
}
}
}
bobVerificationService.addListener(bobListener)
val bobUserId = bobSession.myUserId
val bobDeviceId = bobSession.cryptoService().getMyDevice().deviceId
val verificationSAS = aliceVerificationService.beginKeyVerification(VerificationMethod.SAS, bobUserId, bobDeviceId, null)
mTestHelper.await(aliceSASLatch)
mTestHelper.await(bobSASLatch)
val aliceTx = aliceVerificationService.getExistingTransaction(bobUserId, verificationSAS!!) as SASDefaultVerificationTransaction
val bobTx = bobVerificationService.getExistingTransaction(aliceSession.myUserId, verificationSAS) as SASDefaultVerificationTransaction
assertEquals("Should have same SAS", aliceTx.getShortCodeRepresentation(SasMode.DECIMAL),
bobTx.getShortCodeRepresentation(SasMode.DECIMAL))
cryptoTestData.cleanUp(mTestHelper)
}
@Test
fun test_happyPath() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceVerificationService = aliceSession.cryptoService().verificationService()
val bobVerificationService = bobSession!!.cryptoService().verificationService()
val aliceSASLatch = CountDownLatch(1)
val aliceListener = object : VerificationService.Listener {
var matchOnce = true
override fun transactionUpdated(tx: VerificationTransaction) {
val uxState = (tx as OutgoingSasVerificationTransaction).uxState
Log.v("TEST", "== aliceState ${uxState.name}")
when (uxState) {
OutgoingSasVerificationTransaction.UxState.SHOW_SAS -> {
tx.userHasVerifiedShortCode()
}
OutgoingSasVerificationTransaction.UxState.VERIFIED -> {
if (matchOnce) {
matchOnce = false
aliceSASLatch.countDown()
}
}
else -> Unit
}
}
}
aliceVerificationService.addListener(aliceListener)
val bobSASLatch = CountDownLatch(1)
val bobListener = object : VerificationService.Listener {
var acceptOnce = true
var matchOnce = true
override fun transactionUpdated(tx: VerificationTransaction) {
val uxState = (tx as IncomingSasVerificationTransaction).uxState
Log.v("TEST", "== bobState ${uxState.name}")
when (uxState) {
IncomingSasVerificationTransaction.UxState.SHOW_ACCEPT -> {
if (acceptOnce) {
acceptOnce = false
tx.performAccept()
}
}
IncomingSasVerificationTransaction.UxState.SHOW_SAS -> {
if (matchOnce) {
matchOnce = false
tx.userHasVerifiedShortCode()
}
}
IncomingSasVerificationTransaction.UxState.VERIFIED -> {
bobSASLatch.countDown()
}
else -> Unit
}
}
}
bobVerificationService.addListener(bobListener)
val bobUserId = bobSession.myUserId
val bobDeviceId = bobSession.cryptoService().getMyDevice().deviceId
aliceVerificationService.beginKeyVerification(VerificationMethod.SAS, bobUserId, bobDeviceId, null)
mTestHelper.await(aliceSASLatch)
mTestHelper.await(bobSASLatch)
// Assert that devices are verified
val bobDeviceInfoFromAlicePOV: CryptoDeviceInfo? = aliceSession.cryptoService().getDeviceInfo(bobUserId, bobDeviceId)
val aliceDeviceInfoFromBobPOV: CryptoDeviceInfo? = bobSession.cryptoService().getDeviceInfo(aliceSession.myUserId, aliceSession.cryptoService().getMyDevice().deviceId)
// latch wait a bit again
Thread.sleep(1000)
assertTrue("alice device should be verified from bob point of view", aliceDeviceInfoFromBobPOV!!.isVerified)
assertTrue("bob device should be verified from alice point of view", bobDeviceInfoFromAlicePOV!!.isVerified)
cryptoTestData.cleanUp(mTestHelper)
}
@Test
fun test_ConcurrentStart() {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession
val aliceVerificationService = aliceSession.cryptoService().verificationService()
val bobVerificationService = bobSession!!.cryptoService().verificationService()
val req = aliceVerificationService.requestKeyVerificationInDMs(
listOf(VerificationMethod.SAS, VerificationMethod.QR_CODE_SCAN, VerificationMethod.QR_CODE_SHOW),
bobSession.myUserId,
cryptoTestData.roomId
)
var requestID : String? = null
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
val prAlicePOV = aliceVerificationService.getExistingVerificationRequest(bobSession.myUserId)?.firstOrNull()
requestID = prAlicePOV?.transactionId
Log.v("TEST", "== alicePOV is $prAlicePOV")
prAlicePOV?.transactionId != null && prAlicePOV.localId == req.localId
}
}
Log.v("TEST", "== requestID is $requestID")
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
val prBobPOV = bobVerificationService.getExistingVerificationRequest(aliceSession.myUserId)?.firstOrNull()
Log.v("TEST", "== prBobPOV is $prBobPOV")
prBobPOV?.transactionId == requestID
}
}
bobVerificationService.readyPendingVerification(
listOf(VerificationMethod.SAS, VerificationMethod.QR_CODE_SCAN, VerificationMethod.QR_CODE_SHOW),
aliceSession.myUserId,
requestID!!
)
// wait for alice to get the ready
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
val prAlicePOV = aliceVerificationService.getExistingVerificationRequest(bobSession.myUserId)?.firstOrNull()
Log.v("TEST", "== prAlicePOV is $prAlicePOV")
prAlicePOV?.transactionId == requestID && prAlicePOV?.isReady != null
}
}
// Start concurrent!
aliceVerificationService.beginKeyVerificationInDMs(
VerificationMethod.SAS,
requestID!!,
cryptoTestData.roomId,
bobSession.myUserId,
bobSession.sessionParams.deviceId!!,
null)
bobVerificationService.beginKeyVerificationInDMs(
VerificationMethod.SAS,
requestID!!,
cryptoTestData.roomId,
aliceSession.myUserId,
aliceSession.sessionParams.deviceId!!,
null)
// we should reach SHOW SAS on both
var alicePovTx: SasVerificationTransaction?
var bobPovTx: SasVerificationTransaction?
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
alicePovTx = aliceVerificationService.getExistingTransaction(bobSession.myUserId, requestID!!) as? SasVerificationTransaction
Log.v("TEST", "== alicePovTx is $alicePovTx")
alicePovTx?.state == VerificationTxState.ShortCodeReady
}
}
// wait for alice to get the ready
mTestHelper.waitWithLatch {
mTestHelper.retryPeriodicallyWithLatch(it) {
bobPovTx = bobVerificationService.getExistingTransaction(aliceSession.myUserId, requestID!!) as? SasVerificationTransaction
Log.v("TEST", "== bobPovTx is $bobPovTx")
bobPovTx?.state == VerificationTxState.ShortCodeReady
}
}
cryptoTestData.cleanUp(mTestHelper)
}
}

View File

@@ -0,0 +1,35 @@
/*
* Copyright (c) 2020 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.internal.crypto.verification.qrcode
fun hexToByteArray(hex: String): ByteArray {
// Remove all spaces
return hex.replace(" ", "")
.let {
if (it.length % 2 != 0) "0$it" else it
}
.let {
ByteArray(it.length / 2)
.apply {
for (i in this.indices) {
val index = i * 2
val v = it.substring(index, index + 2).toInt(16)
this[i] = v.toByte()
}
}
}
}

View File

@@ -0,0 +1,249 @@
/*
* Copyright (c) 2020 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.internal.crypto.verification.qrcode
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import org.amshove.kluent.shouldBeNull
import org.amshove.kluent.shouldEqual
import org.amshove.kluent.shouldEqualTo
import org.amshove.kluent.shouldNotBeNull
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class QrCodeTest : InstrumentedTest {
private val qrCode1 = QrCodeData.VerifyingAnotherUser(
transactionId = "MaTransaction",
userMasterCrossSigningPublicKey = "ktEwcUP6su1xh+GuE+CYkQ3H6W/DIl+ybHFdaEOrolU",
otherUserMasterCrossSigningPublicKey = "TXluZKTZLvSRWOTPlOqLq534bA+/K4zLFKSu9cGLQaU",
sharedSecret = "MTIzNDU2Nzg"
)
private val value1 = "MATRIX\u0002\u0000\u0000\u000DMaTransaction\u0092Ñ0qCú²íq\u0087á®\u0013à\u0098\u0091\u000DÇéoÃ\"_²lq]hC«¢UMynd¤Ù.ô\u0091XäÏ\u0094ê\u008B«\u009Døl\u000F¿+\u008CË\u0014¤®õÁ\u008BA¥12345678"
private val qrCode2 = QrCodeData.SelfVerifyingMasterKeyTrusted(
transactionId = "MaTransaction",
userMasterCrossSigningPublicKey = "ktEwcUP6su1xh+GuE+CYkQ3H6W/DIl+ybHFdaEOrolU",
otherDeviceKey = "TXluZKTZLvSRWOTPlOqLq534bA+/K4zLFKSu9cGLQaU",
sharedSecret = "MTIzNDU2Nzg"
)
private val value2 = "MATRIX\u0002\u0001\u0000\u000DMaTransaction\u0092Ñ0qCú²íq\u0087á®\u0013à\u0098\u0091\u000DÇéoÃ\"_²lq]hC«¢UMynd¤Ù.ô\u0091XäÏ\u0094ê\u008B«\u009Døl\u000F¿+\u008CË\u0014¤®õÁ\u008BA¥12345678"
private val qrCode3 = QrCodeData.SelfVerifyingMasterKeyNotTrusted(
transactionId = "MaTransaction",
deviceKey = "TXluZKTZLvSRWOTPlOqLq534bA+/K4zLFKSu9cGLQaU",
userMasterCrossSigningPublicKey = "ktEwcUP6su1xh+GuE+CYkQ3H6W/DIl+ybHFdaEOrolU",
sharedSecret = "MTIzNDU2Nzg"
)
private val value3 = "MATRIX\u0002\u0002\u0000\u000DMaTransactionMynd¤Ù.ô\u0091XäÏ\u0094ê\u008B«\u009Døl\u000F¿+\u008CË\u0014¤®õÁ\u008B\u0092Ñ0qCú²íq\u0087á®\u0013à\u0098\u0091\u000DÇéoÃ\"_²lq]hC«¢U12345678"
private val sharedSecretByteArray = "12345678".toByteArray(Charsets.ISO_8859_1)
private val tlx_byteArray = hexToByteArray("4d 79 6e 64 a4 d9 2e f4 91 58 e4 cf 94 ea 8b ab 9d f8 6c 0f bf 2b 8c cb 14 a4 ae f5 c1 8b 41 a5")
private val kte_byteArray = hexToByteArray("92 d1 30 71 43 fa b2 ed 71 87 e1 ae 13 e0 98 91 0d c7 e9 6f c3 22 5f b2 6c 71 5d 68 43 ab a2 55")
@Test
fun testEncoding1() {
qrCode1.toEncodedString() shouldEqual value1
}
@Test
fun testEncoding2() {
qrCode2.toEncodedString() shouldEqual value2
}
@Test
fun testEncoding3() {
qrCode3.toEncodedString() shouldEqual value3
}
@Test
fun testSymmetry1() {
qrCode1.toEncodedString().toQrCodeData() shouldEqual qrCode1
}
@Test
fun testSymmetry2() {
qrCode2.toEncodedString().toQrCodeData() shouldEqual qrCode2
}
@Test
fun testSymmetry3() {
qrCode3.toEncodedString().toQrCodeData() shouldEqual qrCode3
}
@Test
fun testCase1() {
val url = qrCode1.toEncodedString()
val byteArray = url.toByteArray(Charsets.ISO_8859_1)
checkHeader(byteArray)
// Mode
byteArray[7] shouldEqualTo 0
checkSizeAndTransaction(byteArray)
compareArray(byteArray.copyOfRange(23, 23 + 32), kte_byteArray)
compareArray(byteArray.copyOfRange(23 + 32, 23 + 64), tlx_byteArray)
compareArray(byteArray.copyOfRange(23 + 64, byteArray.size), sharedSecretByteArray)
}
@Test
fun testCase2() {
val url = qrCode2.toEncodedString()
val byteArray = url.toByteArray(Charsets.ISO_8859_1)
checkHeader(byteArray)
// Mode
byteArray[7] shouldEqualTo 1
checkSizeAndTransaction(byteArray)
compareArray(byteArray.copyOfRange(23, 23 + 32), kte_byteArray)
compareArray(byteArray.copyOfRange(23 + 32, 23 + 64), tlx_byteArray)
compareArray(byteArray.copyOfRange(23 + 64, byteArray.size), sharedSecretByteArray)
}
@Test
fun testCase3() {
val url = qrCode3.toEncodedString()
val byteArray = url.toByteArray(Charsets.ISO_8859_1)
checkHeader(byteArray)
// Mode
byteArray[7] shouldEqualTo 2
checkSizeAndTransaction(byteArray)
compareArray(byteArray.copyOfRange(23, 23 + 32), tlx_byteArray)
compareArray(byteArray.copyOfRange(23 + 32, 23 + 64), kte_byteArray)
compareArray(byteArray.copyOfRange(23 + 64, byteArray.size), sharedSecretByteArray)
}
@Test
fun testLongTransactionId() {
// Size on two bytes (2_000 = 0x07D0)
val longTransactionId = "PatternId_".repeat(200)
val qrCode = qrCode1.copy(transactionId = longTransactionId)
val result = qrCode.toEncodedString()
val expected = value1.replace("\u0000\u000DMaTransaction", "\u0007\u00D0$longTransactionId")
result shouldEqual expected
// Reverse operation
expected.toQrCodeData() shouldEqual qrCode
}
@Test
fun testAnyTransactionId() {
for (qty in 0 until 0x1FFF step 200) {
val longTransactionId = "a".repeat(qty)
val qrCode = qrCode1.copy(transactionId = longTransactionId)
// Symmetric operation
qrCode.toEncodedString().toQrCodeData() shouldEqual qrCode
}
}
// Error cases
@Test
fun testErrorHeader() {
value1.replace("MATRIX", "MOTRIX").toQrCodeData().shouldBeNull()
value1.replace("MATRIX", "MATRI").toQrCodeData().shouldBeNull()
value1.replace("MATRIX", "").toQrCodeData().shouldBeNull()
}
@Test
fun testErrorVersion() {
value1.replace("MATRIX\u0002", "MATRIX\u0000").toQrCodeData().shouldBeNull()
value1.replace("MATRIX\u0002", "MATRIX\u0001").toQrCodeData().shouldBeNull()
value1.replace("MATRIX\u0002", "MATRIX\u0003").toQrCodeData().shouldBeNull()
value1.replace("MATRIX\u0002", "MATRIX").toQrCodeData().shouldBeNull()
}
@Test
fun testErrorSecretTooShort() {
value1.replace("12345678", "1234567").toQrCodeData().shouldBeNull()
}
@Test
fun testErrorNoTransactionNoKeyNoSecret() {
// But keep transaction length
"MATRIX\u0002\u0000\u0000\u000D".toQrCodeData().shouldBeNull()
}
@Test
fun testErrorNoKeyNoSecret() {
"MATRIX\u0002\u0000\u0000\u000DMaTransaction".toQrCodeData().shouldBeNull()
}
@Test
fun testErrorTransactionLengthTooShort() {
// In this case, the secret will be longer, so this is not an error, but it will lead to keys mismatch
value1.replace("\u000DMaTransaction", "\u000CMaTransaction").toQrCodeData().shouldNotBeNull()
}
@Test
fun testErrorTransactionLengthTooBig() {
value1.replace("\u000DMaTransaction", "\u000EMaTransaction").toQrCodeData().shouldBeNull()
}
private fun compareArray(actual: ByteArray, expected: ByteArray) {
actual.size shouldEqual expected.size
for (i in actual.indices) {
actual[i] shouldEqualTo expected[i]
}
}
private fun checkHeader(byteArray: ByteArray) {
// MATRIX
byteArray[0] shouldEqualTo 'M'.toByte()
byteArray[1] shouldEqualTo 'A'.toByte()
byteArray[2] shouldEqualTo 'T'.toByte()
byteArray[3] shouldEqualTo 'R'.toByte()
byteArray[4] shouldEqualTo 'I'.toByte()
byteArray[5] shouldEqualTo 'X'.toByte()
// Version
byteArray[6] shouldEqualTo 2
}
private fun checkSizeAndTransaction(byteArray: ByteArray) {
// Size
byteArray[8] shouldEqualTo 0
byteArray[9] shouldEqualTo 13
// Transaction
byteArray.copyOfRange(10, 10 + "MaTransaction".length).toString(Charsets.ISO_8859_1) shouldEqual "MaTransaction"
}
}

View File

@@ -0,0 +1,46 @@
/*
* Copyright (c) 2020 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.internal.crypto.verification.qrcode
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import org.amshove.kluent.shouldBe
import org.amshove.kluent.shouldNotBeEqualTo
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class SharedSecretTest : InstrumentedTest {
@Test
fun testSharedSecretLengthCase() {
repeat(100) {
generateSharedSecretV2().length shouldBe 11
}
}
@Test
fun testSharedDiffCase() {
val sharedSecret1 = generateSharedSecretV2()
val sharedSecret2 = generateSharedSecretV2()
sharedSecret1 shouldNotBeEqualTo sharedSecret2
}
}

View File

@@ -0,0 +1,232 @@
/*
* Copyright (c) 2020 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.internal.crypto.verification.qrcode
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.api.session.crypto.verification.VerificationMethod
import im.vector.matrix.android.api.session.crypto.verification.VerificationService
import im.vector.matrix.android.common.CommonTestHelper
import im.vector.matrix.android.common.CryptoTestHelper
import im.vector.matrix.android.common.TestConstants
import im.vector.matrix.android.internal.crypto.model.rest.UserPasswordAuth
import im.vector.matrix.android.api.session.crypto.verification.PendingVerificationRequest
import org.amshove.kluent.shouldBe
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import java.util.concurrent.CountDownLatch
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class VerificationTest : InstrumentedTest {
private val mTestHelper = CommonTestHelper(context())
private val mCryptoTestHelper = CryptoTestHelper(mTestHelper)
data class ExpectedResult(
val sasIsSupported: Boolean = false,
val otherCanScanQrCode: Boolean = false,
val otherCanShowQrCode: Boolean = false
)
private val sas = listOf(
VerificationMethod.SAS
)
private val sasShow = listOf(
VerificationMethod.SAS,
VerificationMethod.QR_CODE_SHOW
)
private val sasScan = listOf(
VerificationMethod.SAS,
VerificationMethod.QR_CODE_SCAN
)
private val sasShowScan = listOf(
VerificationMethod.SAS,
VerificationMethod.QR_CODE_SHOW,
VerificationMethod.QR_CODE_SCAN
)
@Test
fun test_aliceAndBob_sas_sas() = doTest(
sas,
sas,
ExpectedResult(sasIsSupported = true),
ExpectedResult(sasIsSupported = true)
)
@Test
fun test_aliceAndBob_sas_show() = doTest(
sas,
sasShow,
ExpectedResult(sasIsSupported = true),
ExpectedResult(sasIsSupported = true)
)
@Test
fun test_aliceAndBob_show_sas() = doTest(
sasShow,
sas,
ExpectedResult(sasIsSupported = true),
ExpectedResult(sasIsSupported = true)
)
@Test
fun test_aliceAndBob_sas_scan() = doTest(
sas,
sasScan,
ExpectedResult(sasIsSupported = true),
ExpectedResult(sasIsSupported = true)
)
@Test
fun test_aliceAndBob_scan_sas() = doTest(
sasScan,
sas,
ExpectedResult(sasIsSupported = true),
ExpectedResult(sasIsSupported = true)
)
@Test
fun test_aliceAndBob_scan_scan() = doTest(
sasScan,
sasScan,
ExpectedResult(sasIsSupported = true),
ExpectedResult(sasIsSupported = true)
)
@Test
fun test_aliceAndBob_show_show() = doTest(
sasShow,
sasShow,
ExpectedResult(sasIsSupported = true),
ExpectedResult(sasIsSupported = true)
)
@Test
fun test_aliceAndBob_show_scan() = doTest(
sasShow,
sasScan,
ExpectedResult(sasIsSupported = true, otherCanScanQrCode = true),
ExpectedResult(sasIsSupported = true, otherCanShowQrCode = true)
)
@Test
fun test_aliceAndBob_scan_show() = doTest(
sasScan,
sasShow,
ExpectedResult(sasIsSupported = true, otherCanShowQrCode = true),
ExpectedResult(sasIsSupported = true, otherCanScanQrCode = true)
)
@Test
fun test_aliceAndBob_all_all() = doTest(
sasShowScan,
sasShowScan,
ExpectedResult(sasIsSupported = true, otherCanShowQrCode = true, otherCanScanQrCode = true),
ExpectedResult(sasIsSupported = true, otherCanShowQrCode = true, otherCanScanQrCode = true)
)
// TODO Add tests without SAS
private fun doTest(aliceSupportedMethods: List<VerificationMethod>,
bobSupportedMethods: List<VerificationMethod>,
expectedResultForAlice: ExpectedResult,
expectedResultForBob: ExpectedResult) {
val cryptoTestData = mCryptoTestHelper.doE2ETestWithAliceAndBobInARoom()
val aliceSession = cryptoTestData.firstSession
val bobSession = cryptoTestData.secondSession!!
mTestHelper.doSync<Unit> { callback ->
aliceSession.cryptoService().crossSigningService()
.initializeCrossSigning(UserPasswordAuth(
user = aliceSession.myUserId,
password = TestConstants.PASSWORD
), callback)
}
mTestHelper.doSync<Unit> { callback ->
bobSession.cryptoService().crossSigningService()
.initializeCrossSigning(UserPasswordAuth(
user = bobSession.myUserId,
password = TestConstants.PASSWORD
), callback)
}
val aliceVerificationService = aliceSession.cryptoService().verificationService()
val bobVerificationService = bobSession.cryptoService().verificationService()
var aliceReadyPendingVerificationRequest: PendingVerificationRequest? = null
var bobReadyPendingVerificationRequest: PendingVerificationRequest? = null
val latch = CountDownLatch(2)
val aliceListener = object : VerificationService.Listener {
override fun verificationRequestUpdated(pr: PendingVerificationRequest) {
// Step 4: Alice receive the ready request
if (pr.isReady) {
aliceReadyPendingVerificationRequest = pr
latch.countDown()
}
}
}
aliceVerificationService.addListener(aliceListener)
val bobListener = object : VerificationService.Listener {
override fun verificationRequestCreated(pr: PendingVerificationRequest) {
// Step 2: Bob accepts the verification request
bobVerificationService.readyPendingVerificationInDMs(
bobSupportedMethods,
aliceSession.myUserId,
cryptoTestData.roomId,
pr.transactionId!!
)
}
override fun verificationRequestUpdated(pr: PendingVerificationRequest) {
// Step 3: Bob is ready
if (pr.isReady) {
bobReadyPendingVerificationRequest = pr
latch.countDown()
}
}
}
bobVerificationService.addListener(bobListener)
val bobUserId = bobSession.myUserId
// Step 1: Alice starts a verification request
aliceVerificationService.requestKeyVerificationInDMs(aliceSupportedMethods, bobUserId, cryptoTestData.roomId)
mTestHelper.await(latch)
aliceReadyPendingVerificationRequest!!.let { pr ->
pr.isSasSupported() shouldBe expectedResultForAlice.sasIsSupported
pr.otherCanShowQrCode() shouldBe expectedResultForAlice.otherCanShowQrCode
pr.otherCanScanQrCode() shouldBe expectedResultForAlice.otherCanScanQrCode
}
bobReadyPendingVerificationRequest!!.let { pr ->
pr.isSasSupported() shouldBe expectedResultForBob.sasIsSupported
pr.otherCanShowQrCode() shouldBe expectedResultForBob.otherCanShowQrCode
pr.otherCanScanQrCode() shouldBe expectedResultForBob.otherCanScanQrCode
}
cryptoTestData.cleanUp(mTestHelper)
}
}

View File

@@ -0,0 +1,278 @@
/*
* Copyright (c) 2020 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.internal.session.room.send
import androidx.test.ext.junit.runners.AndroidJUnit4
import im.vector.matrix.android.InstrumentedTest
import org.commonmark.parser.Parser
import org.commonmark.renderer.html.HtmlRenderer
import org.commonmark.renderer.text.TextContentRenderer
import org.junit.Assert.assertEquals
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
/**
* It will not be possible to test all combinations. For the moment I add a few tests, then, depending on the problem discovered in the wild,
* we can add more tests to cover the edge cases.
* Some tests are suffixed with `_not_passing`, maybe one day we will fix them...
* Riot-Web should be used as a reference for expected results, but not always. Especially Riot-Web add lots of `\n` in the
* formatted body, which is quite useless.
* Also Riot-Web does not provide plain text body when formatted text is provided. The body contains what the user has entered.
* See https://matrix.org/docs/spec/client_server/latest#m-room-message-msgtypes
*/
@Suppress("SpellCheckingInspection")
@RunWith(AndroidJUnit4::class)
@FixMethodOrder(MethodSorters.JVM)
class MarkdownParserTest : InstrumentedTest {
/**
* Create the same parser than in the RoomModule
*/
private val markdownParser = MarkdownParser(
Parser.builder().build(),
HtmlRenderer.builder().build(),
TextContentRenderer.builder().build()
)
@Test
fun parseNoMarkdown() {
testIdentity("")
testIdentity("a")
testIdentity("1")
testIdentity("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et " +
"dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea com" +
"modo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pari" +
"atur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")
}
@Test
fun parseSpaces() {
testIdentity(" ")
testIdentity(" ")
testIdentity("\n")
}
@Test
fun parseNewLines() {
testIdentity("line1\nline2")
testIdentity("line1\nline2\nline3")
}
@Test
fun parseBold() {
testType(
name = "bold",
markdownPattern = "**",
htmlExpectedTag = "strong"
)
}
@Test
fun parseItalic() {
testType(
name = "italic",
markdownPattern = "*",
htmlExpectedTag = "em"
)
}
@Test
fun parseItalic2() {
// Riot-Web format
"_italic_".let { markdownParser.parse(it) }.expect("italic", "<em>italic</em>")
}
/**
* Note: the test is not passing, it does not work on Riot-Web neither
*/
@Test
fun parseStrike_not_passing() {
testType(
name = "strike",
markdownPattern = "~~",
htmlExpectedTag = "del"
)
}
@Test
fun parseCode() {
testType(
name = "code",
markdownPattern = "`",
htmlExpectedTag = "code",
plainTextPrefix = "\"",
plainTextSuffix = "\""
)
}
@Test
fun parseCode2() {
testType(
name = "code",
markdownPattern = "``",
htmlExpectedTag = "code",
plainTextPrefix = "\"",
plainTextSuffix = "\""
)
}
@Test
fun parseCode3() {
testType(
name = "code",
markdownPattern = "```",
htmlExpectedTag = "code",
plainTextPrefix = "\"",
plainTextSuffix = "\""
)
}
@Test
fun parseUnorderedList() {
"- item1".let { markdownParser.parse(it).expect(it, "<ul><li>item1</li></ul>") }
"- item1\n- item2".let { markdownParser.parse(it).expect(it, "<ul><li>item1</li><li>item2</li></ul>") }
}
@Test
fun parseOrderedList() {
"1. item1".let { markdownParser.parse(it).expect(it, "<ol><li>item1</li></ol>") }
"1. item1\n2. item2".let { markdownParser.parse(it).expect(it, "<ol><li>item1</li><li>item2</li></ol>") }
}
@Test
fun parseHorizontalLine() {
"---".let { markdownParser.parse(it) }.expect("***", "<hr />")
}
@Test
fun parseH2AndContent() {
"a\n---\nb".let { markdownParser.parse(it) }.expect("a\nb", "<h2>a</h2><p>b</p>")
}
@Test
fun parseQuote() {
"> quoted".let { markdownParser.parse(it) }.expect("«quoted»", "<blockquote><p>quoted</p></blockquote>")
}
@Test
fun parseQuote_not_passing() {
"> quoted\nline2".let { markdownParser.parse(it) }.expect("«quoted\nline2»", "<blockquote><p>quoted<br/>line2</p></blockquote>")
}
@Test
fun parseBoldItalic() {
"*italic* **bold**".let { markdownParser.parse(it) }.expect("italic bold", "<em>italic</em> <strong>bold</strong>")
"**bold** *italic*".let { markdownParser.parse(it) }.expect("bold italic", "<strong>bold</strong> <em>italic</em>")
}
@Test
fun parseHead() {
"# head1".let { markdownParser.parse(it) }.expect("head1", "<h1>head1</h1>")
"## head2".let { markdownParser.parse(it) }.expect("head2", "<h2>head2</h2>")
"### head3".let { markdownParser.parse(it) }.expect("head3", "<h3>head3</h3>")
"#### head4".let { markdownParser.parse(it) }.expect("head4", "<h4>head4</h4>")
"##### head5".let { markdownParser.parse(it) }.expect("head5", "<h5>head5</h5>")
"###### head6".let { markdownParser.parse(it) }.expect("head6", "<h6>head6</h6>")
}
@Test
fun parseHeads() {
"# head1\n# head2".let { markdownParser.parse(it) }.expect("head1\nhead2", "<h1>head1</h1><h1>head2</h1>")
}
@Test
fun parseBoldNewLines_not_passing() {
"**bold**\nline2".let { markdownParser.parse(it) }.expect("bold\nline2", "<strong>bold</strong><br />line2")
}
@Test
fun parseLinks() {
"[link](target)".let { markdownParser.parse(it) }.expect(""""link" (target)""", """<a href="target">link</a>""")
}
@Test
fun parseParagraph() {
"# head\ncontent".let { markdownParser.parse(it) }.expect("head\ncontent", "<h1>head</h1><p>content</p>")
}
private fun testIdentity(text: String) {
markdownParser.parse(text).expect(text, null)
}
private fun testType(name: String,
markdownPattern: String,
htmlExpectedTag: String,
plainTextPrefix: String = "",
plainTextSuffix: String = "") {
// Test simple case
"$markdownPattern$name$markdownPattern"
.let { markdownParser.parse(it) }
.expect(expectedText = "$plainTextPrefix$name$plainTextSuffix",
expectedFormattedText = "<$htmlExpectedTag>$name</$htmlExpectedTag>")
// Test twice the same tag
"$markdownPattern$name$markdownPattern and $markdownPattern$name bis$markdownPattern"
.let { markdownParser.parse(it) }
.expect(expectedText = "$plainTextPrefix$name$plainTextSuffix and $plainTextPrefix$name bis$plainTextSuffix",
expectedFormattedText = "<$htmlExpectedTag>$name</$htmlExpectedTag> and <$htmlExpectedTag>$name bis</$htmlExpectedTag>")
val textBefore = "a"
val textAfter = "b"
// With sticked text before
"$textBefore$markdownPattern$name$markdownPattern"
.let { markdownParser.parse(it) }
.expect(expectedText = "$textBefore$plainTextPrefix$name$plainTextSuffix",
expectedFormattedText = "$textBefore<$htmlExpectedTag>$name</$htmlExpectedTag>")
// With text before and space
"$textBefore $markdownPattern$name$markdownPattern"
.let { markdownParser.parse(it) }
.expect(expectedText = "$textBefore $plainTextPrefix$name$plainTextSuffix",
expectedFormattedText = "$textBefore <$htmlExpectedTag>$name</$htmlExpectedTag>")
// With sticked text after
"$markdownPattern$name$markdownPattern$textAfter"
.let { markdownParser.parse(it) }
.expect(expectedText = "$plainTextPrefix$name$plainTextSuffix$textAfter",
expectedFormattedText = "<$htmlExpectedTag>$name</$htmlExpectedTag>$textAfter")
// With space and text after
"$markdownPattern$name$markdownPattern $textAfter"
.let { markdownParser.parse(it) }
.expect(expectedText = "$plainTextPrefix$name$plainTextSuffix $textAfter",
expectedFormattedText = "<$htmlExpectedTag>$name</$htmlExpectedTag> $textAfter")
// With sticked text before and text after
"$textBefore$markdownPattern$name$markdownPattern$textAfter"
.let { markdownParser.parse(it) }
.expect(expectedText = "$textBefore$plainTextPrefix$name$plainTextSuffix$textAfter",
expectedFormattedText = "a<$htmlExpectedTag>$name</$htmlExpectedTag>$textAfter")
// With text before and after, with spaces
"$textBefore $markdownPattern$name$markdownPattern $textAfter"
.let { markdownParser.parse(it) }
.expect(expectedText = "$textBefore $plainTextPrefix$name$plainTextSuffix $textAfter",
expectedFormattedText = "$textBefore <$htmlExpectedTag>$name</$htmlExpectedTag> $textAfter")
}
private fun TextContent.expect(expectedText: String, expectedFormattedText: String?) {
assertEquals("TextContent are not identical", TextContent(expectedText, expectedFormattedText), this)
}
}

View File

@@ -19,16 +19,19 @@ package im.vector.matrix.android.session.room.timeline
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.zhuinden.monarchy.Monarchy
import im.vector.matrix.android.InstrumentedTest
import im.vector.matrix.android.internal.database.helper.*
import im.vector.matrix.android.api.session.events.model.Event
import im.vector.matrix.android.api.session.room.send.SendState
import im.vector.matrix.android.internal.database.helper.addTimelineEvent
import im.vector.matrix.android.internal.database.helper.merge
import im.vector.matrix.android.internal.database.mapper.toEntity
import im.vector.matrix.android.internal.database.model.ChunkEntity
import im.vector.matrix.android.internal.database.model.SessionRealmModule
import im.vector.matrix.android.internal.session.room.timeline.PaginationDirection
import im.vector.matrix.android.session.room.timeline.RoomDataHelper.createFakeListOfEvents
import im.vector.matrix.android.session.room.timeline.RoomDataHelper.createFakeMessageEvent
import im.vector.matrix.android.session.room.timeline.RoomDataHelper.createFakeRoomMemberEvent
import io.realm.Realm
import io.realm.RealmConfiguration
import io.realm.kotlin.createObject
import org.amshove.kluent.shouldBeFalse
import org.amshove.kluent.shouldBeTrue
import org.amshove.kluent.shouldEqual
import org.junit.Before
@@ -43,7 +46,11 @@ internal class ChunkEntityTest : InstrumentedTest {
@Before
fun setup() {
Realm.init(context())
val testConfig = RealmConfiguration.Builder().inMemory().name("test-realm").build()
val testConfig = RealmConfiguration.Builder()
.inMemory()
.name("test-realm")
.modules(SessionRealmModule())
.build()
monarchy = Monarchy.Builder().setRealmConfiguration(testConfig).build()
}
@@ -51,8 +58,11 @@ internal class ChunkEntityTest : InstrumentedTest {
fun add_shouldAdd_whenNotAlreadyIncluded() {
monarchy.runTransactionSync { realm ->
val chunk: ChunkEntity = realm.createObject()
val fakeEvent = createFakeMessageEvent()
chunk.add("roomId", fakeEvent, PaginationDirection.FORWARDS)
val fakeEvent = createFakeMessageEvent().toEntity(ROOM_ID, SendState.SYNCED, System.currentTimeMillis()).let {
realm.copyToRealmOrUpdate(it)
}
chunk.addTimelineEvent(ROOM_ID, fakeEvent, PaginationDirection.FORWARDS, emptyMap())
chunk.timelineEvents.size shouldEqual 1
}
}
@@ -61,65 +71,23 @@ internal class ChunkEntityTest : InstrumentedTest {
fun add_shouldNotAdd_whenAlreadyIncluded() {
monarchy.runTransactionSync { realm ->
val chunk: ChunkEntity = realm.createObject()
val fakeEvent = createFakeMessageEvent()
chunk.add("roomId", fakeEvent, PaginationDirection.FORWARDS)
chunk.add("roomId", fakeEvent, PaginationDirection.FORWARDS)
val fakeEvent = createFakeMessageEvent().toEntity(ROOM_ID, SendState.SYNCED, System.currentTimeMillis()).let {
realm.copyToRealmOrUpdate(it)
}
chunk.addTimelineEvent(ROOM_ID, fakeEvent, PaginationDirection.FORWARDS, emptyMap())
chunk.addTimelineEvent(ROOM_ID, fakeEvent, PaginationDirection.FORWARDS, emptyMap())
chunk.timelineEvents.size shouldEqual 1
}
}
@Test
fun add_shouldStateIndexIncremented_whenStateEventIsAddedForward() {
monarchy.runTransactionSync { realm ->
val chunk: ChunkEntity = realm.createObject()
val fakeEvent = createFakeRoomMemberEvent()
chunk.add("roomId", fakeEvent, PaginationDirection.FORWARDS)
chunk.lastStateIndex(PaginationDirection.FORWARDS) shouldEqual 1
}
}
@Test
fun add_shouldStateIndexNotIncremented_whenNoStateEventIsAdded() {
monarchy.runTransactionSync { realm ->
val chunk: ChunkEntity = realm.createObject()
val fakeEvent = createFakeMessageEvent()
chunk.add("roomId", fakeEvent, PaginationDirection.FORWARDS)
chunk.lastStateIndex(PaginationDirection.FORWARDS) shouldEqual 0
}
}
@Test
fun addAll_shouldStateIndexIncremented_whenStateEventsAreAddedForward() {
monarchy.runTransactionSync { realm ->
val chunk: ChunkEntity = realm.createObject()
val fakeEvents = createFakeListOfEvents(30)
val numberOfStateEvents = fakeEvents.filter { it.isStateEvent() }.size
chunk.addAll("roomId", fakeEvents, PaginationDirection.FORWARDS)
chunk.lastStateIndex(PaginationDirection.FORWARDS) shouldEqual numberOfStateEvents
}
}
@Test
fun addAll_shouldStateIndexDecremented_whenStateEventsAreAddedBackward() {
monarchy.runTransactionSync { realm ->
val chunk: ChunkEntity = realm.createObject()
val fakeEvents = createFakeListOfEvents(30)
val numberOfStateEvents = fakeEvents.filter { it.isStateEvent() }.size
val lastIsState = fakeEvents.last().isStateEvent()
val expectedStateIndex = if (lastIsState) -numberOfStateEvents + 1 else -numberOfStateEvents
chunk.addAll("roomId", fakeEvents, PaginationDirection.BACKWARDS)
chunk.lastStateIndex(PaginationDirection.BACKWARDS) shouldEqual expectedStateIndex
}
}
@Test
fun merge_shouldAddEvents_whenMergingBackward() {
monarchy.runTransactionSync { realm ->
val chunk1: ChunkEntity = realm.createObject()
val chunk2: ChunkEntity = realm.createObject()
chunk1.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk2.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk1.merge("roomId", chunk2, PaginationDirection.BACKWARDS)
chunk1.addAll(ROOM_ID, createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk2.addAll(ROOM_ID, createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk1.merge(ROOM_ID, chunk2, PaginationDirection.BACKWARDS)
chunk1.timelineEvents.size shouldEqual 60
}
}
@@ -133,38 +101,14 @@ internal class ChunkEntityTest : InstrumentedTest {
val eventsForChunk2 = eventsForChunk1 + createFakeListOfEvents(10)
chunk1.isLastForward = true
chunk2.isLastForward = false
chunk1.addAll("roomId", eventsForChunk1, PaginationDirection.FORWARDS)
chunk2.addAll("roomId", eventsForChunk2, PaginationDirection.BACKWARDS)
chunk1.merge("roomId", chunk2, PaginationDirection.BACKWARDS)
chunk1.addAll(ROOM_ID, eventsForChunk1, PaginationDirection.FORWARDS)
chunk2.addAll(ROOM_ID, eventsForChunk2, PaginationDirection.BACKWARDS)
chunk1.merge(ROOM_ID, chunk2, PaginationDirection.BACKWARDS)
chunk1.timelineEvents.size shouldEqual 40
chunk1.isLastForward.shouldBeTrue()
}
}
@Test
fun merge_shouldEventsBeLinked_whenMergingLinkedWithUnlinked() {
monarchy.runTransactionSync { realm ->
val chunk1: ChunkEntity = realm.createObject()
val chunk2: ChunkEntity = realm.createObject()
chunk1.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = true)
chunk2.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = false)
chunk1.merge("roomId", chunk2, PaginationDirection.BACKWARDS)
chunk1.isUnlinked().shouldBeFalse()
}
}
@Test
fun merge_shouldEventsBeUnlinked_whenMergingUnlinkedWithUnlinked() {
monarchy.runTransactionSync { realm ->
val chunk1: ChunkEntity = realm.createObject()
val chunk2: ChunkEntity = realm.createObject()
chunk1.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = true)
chunk2.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = true)
chunk1.merge("roomId", chunk2, PaginationDirection.BACKWARDS)
chunk1.isUnlinked().shouldBeTrue()
}
}
@Test
fun merge_shouldPrevTokenMerged_whenMergingForwards() {
monarchy.runTransactionSync { realm ->
@@ -172,9 +116,9 @@ internal class ChunkEntityTest : InstrumentedTest {
val chunk2: ChunkEntity = realm.createObject()
val prevToken = "prev_token"
chunk1.prevToken = prevToken
chunk1.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = true)
chunk2.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = true)
chunk1.merge("roomId", chunk2, PaginationDirection.FORWARDS)
chunk1.addAll(ROOM_ID, createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk2.addAll(ROOM_ID, createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk1.merge(ROOM_ID, chunk2, PaginationDirection.FORWARDS)
chunk1.prevToken shouldEqual prevToken
}
}
@@ -186,10 +130,25 @@ internal class ChunkEntityTest : InstrumentedTest {
val chunk2: ChunkEntity = realm.createObject()
val nextToken = "next_token"
chunk1.nextToken = nextToken
chunk1.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = true)
chunk2.addAll("roomId", createFakeListOfEvents(30), PaginationDirection.BACKWARDS, isUnlinked = true)
chunk1.merge("roomId", chunk2, PaginationDirection.BACKWARDS)
chunk1.addAll(ROOM_ID, createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk2.addAll(ROOM_ID, createFakeListOfEvents(30), PaginationDirection.BACKWARDS)
chunk1.merge(ROOM_ID, chunk2, PaginationDirection.BACKWARDS)
chunk1.nextToken shouldEqual nextToken
}
}
private fun ChunkEntity.addAll(roomId: String,
events: List<Event>,
direction: PaginationDirection) {
events.forEach { event ->
val fakeEvent = event.toEntity(roomId, SendState.SYNCED, System.currentTimeMillis()).let {
realm.copyToRealmOrUpdate(it)
}
addTimelineEvent(roomId, fakeEvent, direction, emptyMap())
}
}
companion object {
private const val ROOM_ID = "roomId"
}
}

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